[8.3.0] FSM Event消息 无法起自驾和异常推自驾消息添加到消息盒子中

This commit is contained in:
xinfengkun
2025-12-22 14:59:53 +08:00
parent ce9fa6cc03
commit 582499595e
27 changed files with 569 additions and 271 deletions

View File

@@ -17,6 +17,7 @@ import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_AD
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_CAR_LOC
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_COLD_START_STATE
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_FM_MSG
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_FSM_EVENT_MSG
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_FSM_MSG
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_GUARDIAN
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_MAP_PARAM
@@ -884,6 +885,16 @@ class MoGoAdasListenerImpl : OnAdasListener {
updateAutoPilotStatus(2, state, mode)
}
@ChainLog(
linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT,
linkCode = CHAIN_SOURCE_ADAS,
nodeAliasCode = CHAIN_CODE_ADAS_FSM_EVENT_MSG,
paramIndexes = [0, 1]
)
override fun onFSMEvent(header: MessagePad.Header, fsmEventMsg: Fsm2024.FsmEventMsg) {
CallerFsm2024ListenerManager.invokeFSMEvent(fsmEventMsg)
}
/**
* 定位状态
* 定位呈现状态透传 用于pad图标显示 1hz 所有车型MAP440开始支持

View File

@@ -141,7 +141,7 @@ object DataManager {
CallerMsgBoxListenerManager.invokeListener(MsgCategory.NOTICE, msg)
}
MsgBoxType.FMINFO -> {
MsgBoxType.FSM_EVENT, MsgBoxType.FMINFO -> {
synchronized(this) {
fmInfoList.add(msg)
}

View File

@@ -592,7 +592,9 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis
}
}else if(category == MsgCategory.FM_INFO){
//FM
BadCaseConfig.newFMInfoMsg = msgBoxList.bean as FMInfoMsg
if (msgBoxList.type== MsgBoxType.FMINFO) {
BadCaseConfig.newFMInfoMsg = msgBoxList.bean as FMInfoMsg
}
}
}

View File

@@ -50,6 +50,7 @@ class MsgBoxTabAdapter(private val activity: Activity) :
private val nde = 22 //NDE消息车龙
private val ota = 23 //OTA升级消息
private val cloud = 24 //云控基础平台
private val fsmEvent = 25
private val none = -1
@@ -165,6 +166,11 @@ class MsgBoxTabAdapter(private val activity: Activity) :
.inflate(R.layout.item_tab_cloud,parent,false)
return MsgBoxCloud(view)
}
fsmEvent -> {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_tab_fm,parent,false)
return FSMEventInfoHolder(view)
}
//V2X消息
else -> {
val view = LayoutInflater.from(parent.context)
@@ -202,170 +208,176 @@ class MsgBoxTabAdapter(private val activity: Activity) :
//FM信息
is FmInfoHolder -> {
data?.let {
val fmInfoMsg = it[position].bean as FMInfoMsg
//时间显示
holder.tvFmTime.text =
val temp = it[position]
if (temp.type == MsgBoxType.FMINFO) {
val fmInfoMsg = temp.bean as FMInfoMsg
//时间显示
holder.tvFmTime.text =
// "时间:${fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1) }}"
"${StringUtils.getString(R.string.module_core_time)}${fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1) }}"
//建议操作
if(fmInfoMsg.fmInfoList.isNullOrEmpty()){
//建议操作暂无
"${StringUtils.getString(R.string.module_core_time)}${fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1) }}"
//建议操作
if (fmInfoMsg.fmInfoList.isNullOrEmpty()) {
//建议操作暂无
// holder.tvFmAction.text = "建议操作:暂无"
holder.tvFmAction.text = StringUtils.getString(R.string.module_core_suggested_procedure_not_available)
//Title
// holder.tvFmTitle.text = "暂无建议操作"
holder.tvFmTitle.text = StringUtils.getString(R.string.module_core_not_available_suggested_procedure)
}else{
val receiveFaultLevel = ArrayList<Int>()
fmInfoMsg.fmInfoList!!.forEach { info ->
if(info.faultActionCount != 0){
info.faultActionList.forEach { action ->
//如果不包含此故障Level则进行添加
if(!receiveFaultLevel.contains(MsgFmData.FaultAction.getFaultLevel(action))){
receiveFaultLevel.add(MsgFmData.FaultAction.getFaultLevel(action))
}
}
}
}
//对faultLevel集合进行排序按照顺序输出建议操作
if(receiveFaultLevel.size > 0){
val faultActionStr: StringBuilder = StringBuilder()
// faultActionStr.append("建议操作:")
faultActionStr.append(StringUtils.getString(R.string.module_core_suggested_procedure))
receiveFaultLevel.sort()
// receiveFaultLevel.reverse()
//Title
holder.tvFmTitle.text = MsgFmData.FaultAction.getFaultTitle(receiveFaultLevel[0])
//不同级别的Icon显示
when(receiveFaultLevel[0]){
0->{
//重度预警样式
holder.ivFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_severe_warning))
}
1,2,3->{
//中度预警样式
holder.ivFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_moderate_warning))
}
4,5->{
//轻度预警样式
holder.ivFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_mild_warning))
}
}
receiveFaultLevel.forEach {level->
if(MsgFmData.FaultAction.getFaultAction(level).isNotBlank()){
faultActionStr.append(MsgFmData.FaultAction.getFaultAction(level))
}
if(MsgFmData.FaultAction.getFaultActionCode(level).isNotBlank()){
faultActionStr.append("(")
faultActionStr.append(MsgFmData.FaultAction.getFaultActionCode(level))
faultActionStr.append(")")
}
if(MsgFmData.FaultAction.getFaultAction(level).isNotBlank() || MsgFmData.FaultAction.getFaultActionCode(level).isNotBlank()){
faultActionStr.append(";")
}
}
if(faultActionStr.length > 5){
if(faultActionStr.endsWith(";")){
faultActionStr.deleteCharAt(faultActionStr.lastIndex)
}
holder.tvFmAction.text = faultActionStr.toString()
}else{
// holder.tvFmAction.text = "建议操作:暂无"
holder.tvFmAction.text = StringUtils.getString(R.string.module_core_suggested_procedure_not_available)
}
}else{
// holder.tvFmAction.text = "建议操作:暂无"
holder.tvFmAction.text = StringUtils.getString(R.string.module_core_suggested_procedure_not_available)
//轻度预警样式
holder.ivFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_mild_warning))
}
}
//故障策略
// holder.tvFmFault.text = "故障策略:${MsgFmData.getFmPolicyName(fmInfoMsg.policyCode)}(${fmInfoMsg.policyCode})"
holder.tvFmFault.text = "${StringUtils.getString(R.string.module_core_fault_handling_strategy)}${MsgFmData.getFmPolicyName(fmInfoMsg.policyCode)}(${fmInfoMsg.policyCode})"
//故障原因
if(fmInfoMsg.fmInfoList.isNullOrEmpty()){
// holder.tvFmReason.text = "故障原因:暂无"
holder.tvFmReason.text = StringUtils.getString(R.string.module_core_failure_cause_not_available)
}else{
val fmFaultReason = StringBuilder()
// fmFaultReason.append("故障原因:")
fmFaultReason.append(StringUtils.getString(R.string.module_core_failure_cause))
for((index,info) in fmInfoMsg.fmInfoList!!.withIndex()){
fmFaultReason.append(info.faultName)
if(info.faultId.isNotBlank()){
fmFaultReason.append("(")
fmFaultReason.append(info.faultId)
fmFaultReason.append(")")
}
if(index!=(fmInfoMsg.fmInfoList!!.size-1)){
fmFaultReason.append("/")
}
}
holder.tvFmReason.text = fmFaultReason.toString()
}
//故障后果
if(fmInfoMsg.fmInfoList.isNullOrEmpty()){
// holder.tvFmResult.text = "故障后果:暂无"
holder.tvFmResult.text = StringUtils.getString(R.string.module_core_consequences_failure_not_available)
}else{
val fmFaultResult = StringBuilder()
// fmFaultResult.append("故障后果:")
fmFaultResult.append(StringUtils.getString(R.string.module_core_consequences_failure))
fmInfoMsg.fmInfoList!!.forEach { info->
if(info.faultResultCount != 0){
info.faultResultList.forEach { result->
if(MsgFmData.FaultResult.getResultDefine(result).isNotBlank()){
fmFaultResult.append(MsgFmData.FaultResult.getResultDefine(result))
}
if(result.isNotBlank()){
fmFaultResult.append("(")
fmFaultResult.append(result)
fmFaultResult.append(")")
}
if(MsgFmData.FaultResult.getResultDefine(result).isNotBlank() || result.isNotBlank()){
fmFaultResult.append("/")
//Title
// holder.tvFmTitle.text = "暂无建议操作"
holder.tvFmTitle.text = StringUtils.getString(R.string.module_core_not_available_suggested_procedure)
} else {
val receiveFaultLevel = ArrayList<Int>()
fmInfoMsg.fmInfoList!!.forEach { info ->
if (info.faultActionCount != 0) {
info.faultActionList.forEach { action ->
//如果不包含此故障Level则进行添加
if (!receiveFaultLevel.contains(MsgFmData.FaultAction.getFaultLevel(action))) {
receiveFaultLevel.add(MsgFmData.FaultAction.getFaultLevel(action))
}
}
}
}
//对faultLevel集合进行排序按照顺序输出建议操作
if (receiveFaultLevel.size > 0) {
val faultActionStr: StringBuilder = StringBuilder()
// faultActionStr.append("建议操作:")
faultActionStr.append(StringUtils.getString(R.string.module_core_suggested_procedure))
receiveFaultLevel.sort()
// receiveFaultLevel.reverse()
//Title
holder.tvFmTitle.text = MsgFmData.FaultAction.getFaultTitle(receiveFaultLevel[0])
//不同级别的Icon显示
when (receiveFaultLevel[0]) {
0 -> {
//重度预警样式
holder.ivFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_severe_warning))
}
1, 2, 3 -> {
//中度预警样式
holder.ivFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_moderate_warning))
}
4, 5 -> {
//轻度预警样式
holder.ivFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_mild_warning))
}
}
receiveFaultLevel.forEach { level ->
if (MsgFmData.FaultAction.getFaultAction(level).isNotBlank()) {
faultActionStr.append(MsgFmData.FaultAction.getFaultAction(level))
}
if (MsgFmData.FaultAction.getFaultActionCode(level).isNotBlank()) {
faultActionStr.append("(")
faultActionStr.append(MsgFmData.FaultAction.getFaultActionCode(level))
faultActionStr.append(")")
}
if (MsgFmData.FaultAction.getFaultAction(level).isNotBlank() || MsgFmData.FaultAction.getFaultActionCode(level).isNotBlank()) {
faultActionStr.append(";")
}
}
if (faultActionStr.length > 5) {
if (faultActionStr.endsWith(";")) {
faultActionStr.deleteCharAt(faultActionStr.lastIndex)
}
holder.tvFmAction.text = faultActionStr.toString()
} else {
// holder.tvFmAction.text = "建议操作:暂无"
holder.tvFmAction.text = StringUtils.getString(R.string.module_core_suggested_procedure_not_available)
}
} else {
// holder.tvFmAction.text = "建议操作:暂无"
holder.tvFmAction.text = StringUtils.getString(R.string.module_core_suggested_procedure_not_available)
//轻度预警样式
holder.ivFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_mild_warning))
}
}
if(fmFaultResult.endsWith("/")){
holder.tvFmResult.text = fmFaultResult.deleteCharAt(fmFaultResult.lastIndex).toString()
}else{
// holder.tvFmResult.text = "故障后果:暂无"
//故障策略
// holder.tvFmFault.text = "故障策略:${MsgFmData.getFmPolicyName(fmInfoMsg.policyCode)}(${fmInfoMsg.policyCode})"
holder.tvFmFault.text =
"${StringUtils.getString(R.string.module_core_fault_handling_strategy)}${MsgFmData.getFmPolicyName(fmInfoMsg.policyCode)}(${fmInfoMsg.policyCode})"
//故障原因
if (fmInfoMsg.fmInfoList.isNullOrEmpty()) {
// holder.tvFmReason.text = "故障原因:暂无"
holder.tvFmReason.text = StringUtils.getString(R.string.module_core_failure_cause_not_available)
} else {
val fmFaultReason = StringBuilder()
// fmFaultReason.append("故障原因:")
fmFaultReason.append(StringUtils.getString(R.string.module_core_failure_cause))
for ((index, info) in fmInfoMsg.fmInfoList!!.withIndex()) {
fmFaultReason.append(info.faultName)
if (info.faultId.isNotBlank()) {
fmFaultReason.append("(")
fmFaultReason.append(info.faultId)
fmFaultReason.append(")")
}
if (index != (fmInfoMsg.fmInfoList!!.size - 1)) {
fmFaultReason.append("/")
}
}
holder.tvFmReason.text = fmFaultReason.toString()
}
//故障后果
if (fmInfoMsg.fmInfoList.isNullOrEmpty()) {
// holder.tvFmResult.text = "故障后果:暂无"
holder.tvFmResult.text = StringUtils.getString(R.string.module_core_consequences_failure_not_available)
} else {
val fmFaultResult = StringBuilder()
// fmFaultResult.append("故障后果:")
fmFaultResult.append(StringUtils.getString(R.string.module_core_consequences_failure))
fmInfoMsg.fmInfoList!!.forEach { info ->
if (info.faultResultCount != 0) {
info.faultResultList.forEach { result ->
if (MsgFmData.FaultResult.getResultDefine(result).isNotBlank()) {
fmFaultResult.append(MsgFmData.FaultResult.getResultDefine(result))
}
if (result.isNotBlank()) {
fmFaultResult.append("(")
fmFaultResult.append(result)
fmFaultResult.append(")")
}
if (MsgFmData.FaultResult.getResultDefine(result).isNotBlank() || result.isNotBlank()) {
fmFaultResult.append("/")
}
}
}
}
if (fmFaultResult.endsWith("/")) {
holder.tvFmResult.text = fmFaultResult.deleteCharAt(fmFaultResult.lastIndex).toString()
} else {
// holder.tvFmResult.text = "故障后果:暂无"
holder.tvFmResult.text = StringUtils.getString(R.string.module_core_consequences_failure_not_available)
}
}
}
//对布局进行展开折叠操作
if(fmInfoMsg.isShow){
//对布局进行展开折叠操作
if (fmInfoMsg.isShow) {
// holder.tvFmShowStatus.text = "收起"
holder.tvFmShowStatus.text = StringUtils.getString(R.string.module_core_pack_up)
holder.tvFmFault.visibility = View.VISIBLE
holder.tvFmReason.visibility = View.VISIBLE
holder.tvFmResult.visibility = View.VISIBLE
}else{
// holder.tvFmShowStatus.text = "展开"
holder.tvFmShowStatus.text = StringUtils.getString(R.string.module_core_unfold)
holder.tvFmFault.visibility = View.GONE
holder.tvFmReason.visibility = View.GONE
holder.tvFmResult.visibility = View.GONE
}
holder.tvFmShowStatus.setOnClickListener{
if(!fmInfoMsg.isShow){
fmInfoMsg.isShow = true
// holder.tvFmShowStatus.text = "收起"
holder.tvFmShowStatus.text = StringUtils.getString(R.string.module_core_pack_up)
holder.tvFmFault.visibility = View.VISIBLE
holder.tvFmReason.visibility = View.VISIBLE
holder.tvFmResult.visibility = View.VISIBLE
}else{
fmInfoMsg.isShow = false
// holder.tvFmShowStatus.text = "展开"
} else {
// holder.tvFmShowStatus.text = "展开"
holder.tvFmShowStatus.text = StringUtils.getString(R.string.module_core_unfold)
holder.tvFmFault.visibility = View.GONE
holder.tvFmReason.visibility = View.GONE
holder.tvFmResult.visibility = View.GONE
}
holder.tvFmShowStatus.setOnClickListener {
if (!fmInfoMsg.isShow) {
fmInfoMsg.isShow = true
// holder.tvFmShowStatus.text = "收起"
holder.tvFmShowStatus.text = StringUtils.getString(R.string.module_core_pack_up)
holder.tvFmFault.visibility = View.VISIBLE
holder.tvFmReason.visibility = View.VISIBLE
holder.tvFmResult.visibility = View.VISIBLE
} else {
fmInfoMsg.isShow = false
// holder.tvFmShowStatus.text = "展开"
holder.tvFmShowStatus.text = StringUtils.getString(R.string.module_core_unfold)
holder.tvFmFault.visibility = View.GONE
holder.tvFmReason.visibility = View.GONE
holder.tvFmResult.visibility = View.GONE
}
}
}
}
}
@@ -627,6 +639,47 @@ class MsgBoxTabAdapter(private val activity: Activity) :
holder.tvCloudTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat())
}
}
is FSMEventInfoHolder -> {
data?.let {
val temp = it[position]
if (temp.type == MsgBoxType.FSM_EVENT) {
holder.ivFmImage.setImageResource(R.drawable.icon_warning_fsm_event)
holder.tvFmReason.visibility = View.GONE
holder.tvFmResult.visibility = View.GONE
holder.tvFmFault.visibility = View.GONE
val fsmEventMsg = temp.bean as FSMEventMsg
//时间显示
holder.tvFmTime.text =
"${StringUtils.getString(R.string.module_core_time)}${fsmEventMsg.timestamp.let { it1 -> TimeUtils.millis2String(it1) }}"
holder.tvFmTitle.text = fsmEventMsg.title
holder.tvFmShowStatus.visibility = if (fsmEventMsg.content.contains('') || fsmEventMsg.content.contains(';')) View.VISIBLE else View.GONE
//对布局进行展开折叠操作
if (fsmEventMsg.isShow) {
// holder.tvFmShowStatus.text = "收起"
holder.tvFmShowStatus.text = StringUtils.getString(R.string.module_core_pack_up)
holder.tvFmAction.text = StringUtils.getString(R.string.module_core_failure_cause) + fsmEventMsg.content
} else {
// holder.tvFmShowStatus.text = "展开"
holder.tvFmShowStatus.text = StringUtils.getString(R.string.module_core_unfold)
holder.tvFmAction.text = StringUtils.getString(R.string.module_core_failure_cause) + fsmEventMsg.summaryContent
}
holder.tvFmShowStatus.setOnClickListener {
if (!fsmEventMsg.isShow) {
fsmEventMsg.isShow = true
// holder.tvFmShowStatus.text = "收起"
holder.tvFmShowStatus.text = StringUtils.getString(R.string.module_core_pack_up)
holder.tvFmAction.text = StringUtils.getString(R.string.module_core_failure_cause) + fsmEventMsg.content
} else {
fsmEventMsg.isShow = false
// holder.tvFmShowStatus.text = "展开"
holder.tvFmShowStatus.text = StringUtils.getString(R.string.module_core_unfold)
holder.tvFmAction.text = StringUtils.getString(R.string.module_core_failure_cause) + fsmEventMsg.summaryContent
}
}
}
}
}
}
}
@@ -677,6 +730,8 @@ class MsgBoxTabAdapter(private val activity: Activity) :
cloud
} else if(data!![position].type == MsgBoxType.V2X || data!![position].type == MsgBoxType.OBU){
v2x
}else if (data!![position].type == MsgBoxType.FSM_EVENT){
fsmEvent
} else {
none
}
@@ -805,5 +860,15 @@ class MsgBoxTabAdapter(private val activity: Activity) :
var tvCloudTime: TextView = itemView.findViewById(R.id.tvCloudTime)
var tvCloudContent: TextView = itemView.findViewById(R.id.tvCloudContent)
}
//FSM Evet
class FSMEventInfoHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
var ivFmImage: ImageView = itemView.findViewById(R.id.ivFmImage) //故障级别图标
var tvFmTitle: TextView = itemView.findViewById(R.id.tvFmTitle) //标题展示故障策略
var tvFmShowStatus: TextView = itemView.findViewById(R.id.tvFmShowStatus) //折叠状态
var tvFmTime: TextView = itemView.findViewById(R.id.tvFmTime) //发生时间
var tvFmAction: TextView = itemView.findViewById(R.id.tvFmAction) //建议操作
var tvFmFault: TextView = itemView.findViewById(R.id.tvFmFault) //故障策略
var tvFmReason: TextView = itemView.findViewById(R.id.tvFmReason) //故障原因
var tvFmResult: TextView = itemView.findViewById(R.id.tvFmResult) //后果
}
}

View File

@@ -154,8 +154,9 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor(
}
}
} else if (category == MsgCategory.FM_INFO) {
CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true)
if (FunctionBuildConfig.isTakeoverRemind) {
if (msgBoxBean.type == MsgBoxType.FMINFO) {
CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true)
if (FunctionBuildConfig.isTakeoverRemind) {
// //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音
// var curFaultLevel = 5 //默认级别遍历数组找出级别最高的level数越小级别越高
@@ -192,64 +193,63 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor(
// }
// }
/**
* 8.2.0需求:定义三种不同提示强度的异常提示交互
* 不判断驾驶状态,发生相应故障时立即有相应的提醒
* 若同一时间触发多个多种级别异常,则按照最高级别的异常交互元素做提醒,低级别的异常不做特殊提醒
* 若同一时间触发多个同一级别异常,则同一时刻只提醒一次,不互相打断
* 除此以外不做其他提示频率限制
*
* 一级:安全停车
* FM_DP_EMERGENCY_STOP就地紧急停车、FM_DP_COMFORTABLE_STOP立刻舒适停车、FM_DP_PNC_CHOOSE_STOP择机靠边停车
* 交互图像、TTS、消息盒子
*
* 二级:降速行驶
* FM_DP_SPEED_LIMIT3三级降速、FM_DP_SPEED_LIMIT2二级降速、FM_DP_SPEED_LIMIT1一级降速
* 交互TTS、消息盒子
*
* 三级:无操作
* FM_DP_ONLY_WARNING警示、FM_DP_NO_ACTION报告
* ps以上异常提醒受司机屏工具箱-运营面板-美化模式-接管提醒开关控制,默认开启有全量提示,关闭后无语音/图像提示,只有消息盒子红点展示
*/
val fmInfoMsg = msgBoxBean.bean as FMInfoMsg
when(MsgFmData.getFmPolicyLevel(fmInfoMsg.policyCode)){
//一级
MsgFmData.LEVEL_ONE->{
//接管图像提示、语音提示
CallerDevaToolsManager.takeOver(TAKE_OVER_REQUEST)
CallerHmiManager.warningV2X(
EventTypeEnumNew.TAKE_OVER_EVENT.poiType,
EventTypeEnumNew.TAKE_OVER_EVENT.content,
/**
* 8.2.0需求:定义三种不同提示强度的异常提示交互
* 不判断驾驶状态,发生相应故障时立即有相应的提醒
* 若同一时间触发多个多种级别异常,则按照最高级别的异常交互元素做提醒,低级别的异常不做特殊提醒
* 若同一时间触发多个同一级别异常,则同一时刻只提醒一次,不互相打断
* 除此以外不做其他提示频率限制
*
* 一级:安全停车
* FM_DP_EMERGENCY_STOP就地紧急停车、FM_DP_COMFORTABLE_STOP立刻舒适停车、FM_DP_PNC_CHOOSE_STOP择机靠边停车
* 交互图像、TTS、消息盒子
*
* 二级:降速行驶
* FM_DP_SPEED_LIMIT3三级降速、FM_DP_SPEED_LIMIT2二级降速、FM_DP_SPEED_LIMIT1一级降速
* 交互TTS、消息盒子
*
* 三级:无操作
* FM_DP_ONLY_WARNING警示、FM_DP_NO_ACTION报告
* ps以上异常提醒受司机屏工具箱-运营面板-美化模式-接管提醒开关控制,默认开启有全量提示,关闭后无语音/图像提示,只有消息盒子红点展示
*/
val fmInfoMsg = msgBoxBean.bean as FMInfoMsg
when (MsgFmData.getFmPolicyLevel(fmInfoMsg.policyCode)) {
//一级
MsgFmData.LEVEL_ONE -> {
//接管图像提示、语音提示
CallerDevaToolsManager.takeOver(TAKE_OVER_REQUEST)
CallerHmiManager.warningV2X(
EventTypeEnumNew.TAKE_OVER_EVENT.poiType,
EventTypeEnumNew.TAKE_OVER_EVENT.content,
// "识别车辆故障,建议安全停车并查看操作建议",
StringUtils.getString(R.string.module_core_warning_vehicle_fault_safe_park),
object : IMoGoWarningStatusListener {
override fun onShow() {
CallerTakeOverManager.invokeTakeOverEvent(true)
}
StringUtils.getString(R.string.module_core_warning_vehicle_fault_safe_park),
object : IMoGoWarningStatusListener {
override fun onShow() {
CallerTakeOverManager.invokeTakeOverEvent(true)
}
override fun onDismiss() {
CallerTakeOverManager.invokeTakeOverEvent(false)
}
},expireTime =3000L, isFromObu = false
)
//展示消息盒子消息
showData(msgBoxBean)
}
//二级
MsgFmData.LEVEL_TWO->{
//语音提示
override fun onDismiss() {
CallerTakeOverManager.invokeTakeOverEvent(false)
}
}, expireTime = 3000L, isFromObu = false
)
//展示消息盒子消息
showData(msgBoxBean)
}
//二级
MsgFmData.LEVEL_TWO -> {
//语音提示
// AIAssist.getInstance(context).speakTTSVoice("识别车辆异常,建议尽快安全停车,查看操作建议")
AIAssist.getInstance(context).speakTTSVoice(StringUtils.getString(R.string.module_core_warning_vehicle_abnormal_safe_park))
//展示消息盒子消息
showData(msgBoxBean)
}
//三级
MsgFmData.LEVEL_THREE->{
//在消息盒子图标上,可查看到红点标记,无其他元素特殊提醒;点进消息盒子可查看到详细信息
AIAssist.getInstance(context).speakTTSVoice(StringUtils.getString(R.string.module_core_warning_vehicle_abnormal_safe_park))
//展示消息盒子消息
showData(msgBoxBean)
}
//三级
MsgFmData.LEVEL_THREE -> {
//在消息盒子图标上,可查看到红点标记,无其他元素特殊提醒;点进消息盒子可查看到详细信息
}
}
}
}
} else {
if (msgBoxBean.sourceType == DataSourceType.SUMMARY) {

View File

@@ -9,6 +9,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.eagle.core.data.enums.DataSourceType
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.MsgCategory
import com.mogo.eagle.core.function.api.datacenter.IDataCenterBizListener
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener
@@ -249,9 +250,11 @@ class DriverMsgBoxListView @JvmOverloads constructor(
}
//FM信息
MsgCategory.FM_INFO -> {
fmList?.add(0,msgBoxList)
if(MsgBoxConfig.getUserRecord() == 1){
fmList?.let { driverMsgBoxListAdapter?.setData(it) }
if (msgBoxList.type == MsgBoxType.FMINFO) {
fmList?.add(0, msgBoxList)
if (MsgBoxConfig.getUserRecord() == 1) {
fmList?.let { driverMsgBoxListAdapter?.setData(it) }
}
}
}
//系统信息

View File

@@ -146,8 +146,9 @@ class MsgBoxToastView @JvmOverloads constructor(
}
}
} else if (category == MsgCategory.FM_INFO) {
CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true)
if (FunctionBuildConfig.isTakeoverRemind) {
if (msgBoxBean.type == MsgBoxType.FMINFO) {
CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true)
if (FunctionBuildConfig.isTakeoverRemind) {
// //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音
// var curFaultLevel = 5 //默认级别遍历数组找出级别最高的level数越小级别越高
// fmInfoMsg.fmInfoList?.forEach { faultInfo ->
@@ -183,63 +184,65 @@ class MsgBoxToastView @JvmOverloads constructor(
// }
// }
/**
* 8.2.0需求:定义三种不同提示强度的异常提示交互
* 不判断驾驶状态,发生相应故障时立即有相应的提醒
* 若同一时间触发多个多种级别异常,则按照最高级别的异常交互元素做提醒,低级别的异常不做特殊提醒
* 若同一时间触发多个同一级别异常,则同一时刻只提醒一次,不互相打断
* 除此以外不做其他提示频率限制
*
* 一级:安全停车
* FM_DP_EMERGENCY_STOP就地紧急停车、FM_DP_COMFORTABLE_STOP立刻舒适停车、FM_DP_PNC_CHOOSE_STOP择机靠边停车
* 交互图像、TTS、消息盒子
*
* 二级:降速行驶
* FM_DP_SPEED_LIMIT3三级降速、FM_DP_SPEED_LIMIT2二级降速、FM_DP_SPEED_LIMIT1一级降速
* 交互TTS、消息盒子
*
* 三级:无操作
* FM_DP_ONLY_WARNING警示、FM_DP_NO_ACTION报告
* ps以上异常提醒受司机屏工具箱-运营面板-美化模式-接管提醒开关控制,默认开启有全量提示,关闭后无语音/图像提示,只有消息盒子红点展示
*/
val fmInfoMsg = msgBoxBean.bean as FMInfoMsg
when(MsgFmData.getFmPolicyLevel(fmInfoMsg.policyCode)){
//一级
MsgFmData.LEVEL_ONE->{
//接管图像提示、语音提示
CallerDevaToolsManager.takeOver(TAKE_OVER_REQUEST)
CallerHmiManager.warningV2X(
EventTypeEnumNew.TAKE_OVER_EVENT.poiType,
EventTypeEnumNew.TAKE_OVER_EVENT.content,
/**
* 8.2.0需求:定义三种不同提示强度的异常提示交互
* 不判断驾驶状态,发生相应故障时立即有相应的提醒
* 若同一时间触发多个多种级别异常,则按照最高级别的异常交互元素做提醒,低级别的异常不做特殊提醒
* 若同一时间触发多个同一级别异常,则同一时刻只提醒一次,不互相打断
* 除此以外不做其他提示频率限制
*
* 一级:安全停车
* FM_DP_EMERGENCY_STOP就地紧急停车、FM_DP_COMFORTABLE_STOP立刻舒适停车、FM_DP_PNC_CHOOSE_STOP择机靠边停车
* 交互图像、TTS、消息盒子
*
* 二级:降速行驶
* FM_DP_SPEED_LIMIT3三级降速、FM_DP_SPEED_LIMIT2二级降速、FM_DP_SPEED_LIMIT1一级降速
* 交互TTS、消息盒子
*
* 三级:无操作
* FM_DP_ONLY_WARNING警示、FM_DP_NO_ACTION报告
* ps以上异常提醒受司机屏工具箱-运营面板-美化模式-接管提醒开关控制,默认开启有全量提示,关闭后无语音/图像提示,只有消息盒子红点展示
*/
val fmInfoMsg = msgBoxBean.bean as FMInfoMsg
when (MsgFmData.getFmPolicyLevel(fmInfoMsg.policyCode)) {
//一级
MsgFmData.LEVEL_ONE -> {
//接管图像提示、语音提示
CallerDevaToolsManager.takeOver(TAKE_OVER_REQUEST)
CallerHmiManager.warningV2X(
EventTypeEnumNew.TAKE_OVER_EVENT.poiType,
EventTypeEnumNew.TAKE_OVER_EVENT.content,
// "识别车辆故障,建议安全停车并查看操作建议",
StringUtils.getString(R.string.module_core_warning_vehicle_fault_safe_park),
object : IMoGoWarningStatusListener {
override fun onShow() {
CallerTakeOverManager.invokeTakeOverEvent(true)
}
StringUtils.getString(R.string.module_core_warning_vehicle_fault_safe_park),
object : IMoGoWarningStatusListener {
override fun onShow() {
CallerTakeOverManager.invokeTakeOverEvent(true)
}
override fun onDismiss() {
CallerTakeOverManager.invokeTakeOverEvent(false)
}
},expireTime =3000L, isFromObu = false
)
//展示消息盒子消息
showData(msgBoxBean)
}
//二级
MsgFmData.LEVEL_TWO->{
//语音提示
override fun onDismiss() {
CallerTakeOverManager.invokeTakeOverEvent(false)
}
}, expireTime = 3000L, isFromObu = false
)
//展示消息盒子消息
showData(msgBoxBean)
}
//二级
MsgFmData.LEVEL_TWO -> {
//语音提示
// AIAssist.getInstance(context).speakTTSVoice("识别车辆异常,建议尽快安全停车,查看操作建议")
AIAssist.getInstance(context).speakTTSVoice(StringUtils.getString(R.string.module_core_warning_vehicle_abnormal_safe_park))
//展示消息盒子消息
showData(msgBoxBean)
}
//三级
MsgFmData.LEVEL_THREE->{
//在消息盒子图标上,可查看到红点标记,无其他元素特殊提醒;点进消息盒子可查看到详细信息
AIAssist.getInstance(context).speakTTSVoice(StringUtils.getString(R.string.module_core_warning_vehicle_abnormal_safe_park))
//展示消息盒子消息
showData(msgBoxBean)
}
//三级
MsgFmData.LEVEL_THREE -> {
//在消息盒子图标上,可查看到红点标记,无其他元素特殊提醒;点进消息盒子可查看到详细信息
}
}
}
} else {
showData(msgBoxBean)
}
} else {
if (msgBoxBean.sourceType == DataSourceType.SUMMARY) {

View File

@@ -19,6 +19,7 @@ import com.mogo.eagle.core.data.enums.EventTypeEnumNew
import com.mogo.eagle.core.data.msgbox.AutopilotMsg
import com.mogo.eagle.core.data.msgbox.CloudControlMsg
import com.mogo.eagle.core.data.msgbox.FMInfoMsg
import com.mogo.eagle.core.data.msgbox.FSMEventMsg
import com.mogo.eagle.core.data.msgbox.FSMMsg
import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
@@ -331,7 +332,18 @@ class MsgBoxToastAdapter(private val activity: Activity) : RecyclerView.Adapter<
))
}
}
}else{
}else if(it[position].msgBoxBean.type == MsgBoxType.FSM_EVENT){
//FSM Event信息
//FSM消息
val fsmMsg = it[position].msgBoxBean.bean as FSMEventMsg
holder.tvV2XTitle.text = fsmMsg.title
holder.tvV2XContent.text = fsmMsg.summaryContent
holder.ivV2XImage.setImageDrawable(
ContextCompat.getDrawable(
activity,
R.drawable.icon_warning_fsm_event
))
} else{
//V2X消息
val msgBoxBean = it[position].msgBoxBean
val v2XMsg = msgBoxBean.bean as V2XMsg

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -33,7 +33,7 @@
<TextView
android:id="@+id/tvMsgFm"
android:layout_width="@dimen/dp_154"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_113"
android:text="@string/msg_box_title_fm"
android:textColor="#FFFFFFFF"
@@ -49,7 +49,7 @@
<TextView
android:id="@+id/tvMsgIpcReport"
android:layout_width="@dimen/dp_154"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_113"
android:text="@string/msg_box_title_report"
android:textColor="#FFFFFFFF"

View File

@@ -180,7 +180,7 @@
<!--消息盒子-->
<string name="msg_box_title_notice">Notice</string>
<string name="msg_box_title_fm">FM Info</string>
<string name="msg_box_title_fm">Fault Info</string>
<string name="msg_box_title_report">System Info</string>
<string name="msg_box_title_bad_case">Record</string>
<string name="bad_case_icon">Record Icon</string>

View File

@@ -181,7 +181,7 @@
<!--消息盒子-->
<string name="msg_box_title_notice">通知</string>
<string name="msg_box_title_fm">FM信息</string>
<string name="msg_box_title_fm">故障信息</string>
<string name="msg_box_title_report">系统信息</string>
<string name="msg_box_title_bad_case">录包</string>
<string name="bad_case_icon">录包图标</string>

View File

@@ -56,6 +56,7 @@ class ChainConstant {
const val CHAIN_CODE_ADAS_SEND = "CHAIN_CODE_ADAS_SEND"
const val CHAIN_CODE_ADAS_FM_MSG = "CHAIN_CODE_ADAS_FM_MSG"
const val CHAIN_CODE_ADAS_FSM_MSG = "CHAIN_CODE_ADAS_FSM_MSG"
const val CHAIN_CODE_ADAS_FSM_EVENT_MSG = "CHAIN_CODE_ADAS_FSM_EVENT_MSG"
const val CHAIN_CODE_ADAS_ARRIVE = "CHAIN_CODE_ADAS_ARRIVE"
const val CHAIN_CODE_ADAS_ARRIVE_QUERY = "CHAIN_CODE_ADAS_ARRIVE_QUERY"
const val CHAIN_CODE_ADAS_ROUTE = "CHAIN_CODE_ADAS_ROUTE"

View File

@@ -0,0 +1,14 @@
package com.mogo.eagle.core.data.msgbox
import java.io.Serializable
/**
* fsm event相关的消息
*/
data class FSMEventMsg(
val title: String,
val summaryContent: String,//内容概况
val content: String,
val timestamp: Long,
var isShow: Boolean = false
) : Serializable

View File

@@ -2,5 +2,5 @@ package com.mogo.eagle.core.data.msgbox
enum class MsgBoxType {
// 按功能划分为几大类运营、通知、V2X模块、OBU模块、工控机Report、录制、交通、FM、语音、SSM、工控机相关等
OPERATION, NOTICE, V2X, OBU, REPORT, RECORD, TRAFFIC, FMINFO, VOICE, SSMINFO, AUTOPILOT, FSM, NDE,OTA,CLOUD
OPERATION, NOTICE, V2X, OBU, REPORT, RECORD, TRAFFIC, FMINFO, VOICE, SSMINFO, AUTOPILOT, FSM, NDE, OTA, CLOUD, FSM_EVENT
}

View File

@@ -1,5 +1,6 @@
package com.mogo.eagle.core.function.api.autopilot
import fault_management.FmInfo
import fsm.Fsm2024
/**
@@ -15,4 +16,6 @@ interface IMoGoFsm2024Listener {
*/
fun onFSM2024State(fsmState: Fsm2024.FSMStateMsg)
// fun onFSMEvent(fsmEventMsg: Fsm2024.FsmEventMsg){}
}

View File

@@ -1,14 +1,40 @@
package com.mogo.eagle.core.function.call.autopilot
import android.os.Build
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.data.R
import com.mogo.eagle.core.data.msgbox.FSMEventMsg
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.function.api.autopilot.IMoGoFsm2024Listener
import com.mogo.eagle.core.function.call.base.CallerBase
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.utilcode.util.StringUtils
import fsm.Fsm2024
import mogo.telematics.pad.MessagePad
import java.util.Locale
/**
* 新版FSM状态
*/
object CallerFsm2024ListenerManager : CallerBase<IMoGoFsm2024Listener>() {
var fsmLocaleLanguage = "chs"
init {
val locale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// API 24+ 获取语言列表中的第一个
AbsMogoApplication.getApp().resources.configuration.locales[0]
} else {
// API 24 以下直接获取 locale 成员
@Suppress("DEPRECATION")
AbsMogoApplication.getApp().resources.configuration.locale
}
val language = locale.language // 例如: "zh"
if (language == Locale.CHINESE.language) {
fsmLocaleLanguage = "chs"
} else if (language == Locale.ENGLISH.language) {
fsmLocaleLanguage = "eng"
}
}
fun invokeFSM2024State(fsmState: Fsm2024.FSMStateMsg) {
M_LISTENERS.forEach {
@@ -17,5 +43,62 @@ object CallerFsm2024ListenerManager : CallerBase<IMoGoFsm2024Listener>() {
}
}
fun invokeFSMEvent(fsmEventMsg: Fsm2024.FsmEventMsg) {
// M_LISTENERS.forEach {
// val listener = it.value
// listener.onFSMEvent(fsmEventMsg)
// }
if (fsmEventMsg.hasFsmEventInt()) {
val fsmEvent = fsmEventMsg.fsmEventInt
if (fsmEvent.activeMode == Fsm2024.ActiveMode.PILOT_ACTIVE) {
if (fsmEvent.event == Fsm2024.Event.FAIL_TO_ENTER_ACTIVE || fsmEvent.event == Fsm2024.Event.ABNORMAL_EXIT_ACTIVE) {
val title =
StringUtils.getString(if (fsmEvent.event == Fsm2024.Event.FAIL_TO_ENTER_ACTIVE) R.string.module_mogo_core_fail_to_enter_active else R.string.module_mogo_core_abnormal_exit_active)
var content = StringUtils.getString(R.string.module_mogo_core_unknown_cause_fault)
var summaryContent = ""
if (fsmEvent.transitionReasonsMultiLangCount > 0) {
fsmEvent.transitionReasonsMultiLangList.forEach {
if (it.language == fsmLocaleLanguage) {
val tem = StringBuilder()
it.transitionReasonsList.forEach { msg ->
if (!msg.isNullOrEmpty()) {
if (summaryContent.isEmpty()) {
summaryContent = msg
}
tem.append(msg).append(if (fsmLocaleLanguage == "chs") "" else "; ")
}
}
if (tem.endsWith('') || tem.endsWith(' ')) {
val delLength = if (fsmLocaleLanguage == "chs") 1 else 2
if (tem.length >= delLength) {
tem.delete(tem.length - delLength, tem.length)
}
content = tem.toString();
}
return@forEach
}
}
}
if (summaryContent.isEmpty()) {
summaryContent = StringUtils.getString(R.string.module_mogo_core_unknown_cause_fault)
}
val time = if (fsmEvent.hasTime()) {
fsmEvent.time.sec * 1000L
} else {
System.currentTimeMillis()
}
CallerMsgBoxManager.saveMsgBoxNoTrace(
MsgBoxBean(
MsgBoxType.FSM_EVENT,
FSMEventMsg(title, summaryContent, content, time)
)
)
}
}
}
}
}

View File

@@ -172,6 +172,9 @@
<string name="module_mogo_core_function_hmi_ipc_upgrade_now">Upgrading to new version, expected 5 minutes</string>
<string name="module_mogo_core_function_hmi_ipc_upgrade_fail">Upgrade failed, please contact operations personnel</string>
<string name="module_mogo_core_function_hmi_ipc_last_version">Already the latest version</string>
<string name="module_mogo_core_fail_to_enter_active">Unable to start autonomous driving</string>
<string name="module_mogo_core_abnormal_exit_active">Abnormal exit from autonomous driving</string>
<string name="module_mogo_core_unknown_cause_fault">Unknown cause of fault</string>
<string name="module_mogo_core_function_map_roam_starting_fail">Failed to enter roaming mode, code:%s</string>

View File

@@ -172,6 +172,9 @@
<string name="module_mogo_core_function_hmi_ipc_upgrade_now">新版本升级中预计5分钟升级完成</string>
<string name="module_mogo_core_function_hmi_ipc_upgrade_fail">升级失败,请联系运维人员</string>
<string name="module_mogo_core_function_hmi_ipc_last_version">已是最新版本</string>
<string name="module_mogo_core_fail_to_enter_active">无法起自驾</string>
<string name="module_mogo_core_abnormal_exit_active">异常退出自驾</string>
<string name="module_mogo_core_unknown_cause_fault">未知故障原因</string>
<string name="module_mogo_core_function_map_roam_starting_fail">进入漫游模式失败, code:%s</string>

View File

@@ -118,6 +118,7 @@ public enum MessageType {
TYPE_SEND_OBU_UPLOAD_STATUS(MessagePad.MessageType.MsgTypeObuUploadStatus, R.string.adas_data_MsgTypeObuUploadStatus_SEND),
TYPE_RECEIVE_OBU_UPLOAD_STATUS(MessagePad.MessageType.MsgTypeObuUploadStatus, R.string.adas_data_MsgTypeObuUploadStatus_RECEIVE),
TYPE_RECEIVE_PLANNING_STOP_LINE(MessagePad.MessageType.MsgTypePlanningStopLine, R.string.adas_data_MsgTypePlanningStopLine),
TYPE_RECEIVE_FSM_EVENT(MessagePad.MessageType.MsgTypeFsmEvent, R.string.adas_data_MsgTypeFsmEvent),
//TODO 透传原始pb文件中不存在以下type。由于Java中无法强转,所以在mogo-adas-data/message_pad.proto中放开注释
TYPE_RECEIVE_PLANNING_DECISION_STATE(MessagePad.MessageType.MsgTypePlanningDecisionState, R.string.adas_data_MsgTypePlanningDecisionState),

View File

@@ -40,12 +40,18 @@ enum SessionResult{
REQUEST_FAILED= 3; //请求失败
}
enum ExitType{
enum ExitType{ //废弃
NO_EXIT =0;
NORMAL_EXIT= 1;
ABNORMAL_EXIT= 2;
}
enum OrderStatus {
OLDER_SSM_VERSION = 0;
NO_ORDER = 1;
HAS_ORDER = 2;
}
message Session{
optional ActiveMode session_active_mode = 1 ; //这次点击是要进入哪个模式
optional uint64 session_id= 2; //最新收到的请求的session id 暂时不区分 自驾平行驾驶、方向盘驾驶以及发送源头。没收到或者请求不带id时置为0
@@ -75,6 +81,9 @@ message FSMStateMsg {
required bool pilot_standby_flag = 11;
required bool parallel_standby_flag = 12;
required bool m1steer_standby_flag = 13;
optional OrderStatus order_status = 16;
optional bool place_order_standby_flag = 17;
optional string pilot_not_standby_reason= 21; //FSM 无法自驾无法就绪的原因。
optional string parallel_not_standby_reason= 22; //FSM 无法平行即使就绪原因
@@ -82,8 +91,8 @@ message FSMStateMsg {
repeated string repeated_pilot_not_standby_reason= 26; // repeated reason
repeated string repeated_parallel_not_standby_reason= 27;
repeated string repeated_m1steer_not_standby_reason= 28;
repeated string repeated_m1steer_not_standby_reason= 28;
optional Session session = 30; //包含某次点击的所有信息
optional uint64 fail_to_pilot_session_id= 36; //2.0起废弃
@@ -92,6 +101,43 @@ message FSMStateMsg {
optional string abnormal_state_trans_reason= 41; //2.0起废弃
optional ExitActive exit_active= 42; //存储最近一次离开Active状态的情况 (包括正常退出,掉自驾,接管,停车)
optional ExitActive exit_active= 42; //(废弃)存储最近一次离开Active状态的情况 (包括正常退出,掉自驾,接管,停车)
repeated string pilot_not_standby_reasons_eng= 50;
repeated string parallel_not_standby_reasons_eng= 51;
repeated string m1steer_not_standby_reasons_eng= 52;
repeated uint32 pilot_not_standby_reasons_int= 55;
repeated uint32 parallel_not_standby_reasons_int= 56;
repeated uint32 m1steer_not_standby_reasons_int= 57;
}
enum Event{
NO_EVENT =0; //不会出现出现则说明FSM有bug
SUCCEED_TO_ENTER_ACTIVE =1;//正常进入自驾/平行驾驶/M1方向盘驾驶/APP控车 等需要激活底盘线控的模式 (暂不会报出)
FAIL_TO_ENTER_ACTIVE =2; //进入失败
NORMAL_EXIT_ACTIVE= 3; //正常退出(包括到终点和接管)
ABNORMAL_EXIT_ACTIVE= 4; //异常退出
}
message TransReasons{
optional string language = 1; //chs, eng
repeated string transition_reasons = 2;
}
message FsmEventInt{ //此事件非系统事件而是一个FSM单次报出自驾状态变化关键信息的接口
optional ActiveMode active_mode = 1; //进入或退出的模式是自驾/平行驾驶/M1方向盘驾驶/APP控车
optional Event event= 2;
repeated uint32 transition_reasons = 3; //正常进入不会有原因。进入失败,正常退出,异常退出都会有原因
repeated string fm_faults = 4; //如果涉及故障,就存在这个字段里
optional common.Time time = 5; //时间发生的时间点
optional string broken_nodes = 6; //崩溃节点字符串
repeated TransReasons transition_reasons_multi_lang = 10;
}
message FsmEventMsg {
optional common.Header header = 1;
optional FsmEventInt fsm_event_int= 2;
}

View File

@@ -113,6 +113,7 @@ enum MessageType
MsgTypeSetObuUploadReq = 0x10139;//关闭或打开域控上报自车数据到OBU
MsgTypeObuUploadStatus = 0x1013A;//obu上报状态查询以结果(上下行)
MsgTypePlanningStopLine = 0x1013B;//决策停止线(自动驾驶决策呈现使用) 定频理论是10hz实际会有不同
MsgTypeFsmEvent = 0x1013C;//fsm event msg
}
message Header

View File

@@ -93,6 +93,7 @@
<string name="adas_data_MsgTypeObuUploadStatus_SEND">Domain control OBU upload status query</string>
<string name="adas_data_MsgTypeObuUploadStatus_RECEIVE">Domain control OBU upload status response</string>
<string name="adas_data_MsgTypePlanningStopLine">Planning Stop Line</string>
<string name="adas_data_MsgTypeFsmEvent">FSM Event</string>
<string name="adas_data_MsgTypePlanningDecisionState">Planning decision state</string>
<string name="adas_data_MsgTypeSweeperTaskIndexData">Sweeper index data</string>
<string name="adas_data_MsgTypeObuWarningData">OBU warning event</string>

View File

@@ -93,6 +93,7 @@
<string name="adas_data_MsgTypeObuUploadStatus_SEND">域控上报OBU开关状态查询</string>
<string name="adas_data_MsgTypeObuUploadStatus_RECEIVE">域控上报OBU开关状态响应</string>
<string name="adas_data_MsgTypePlanningStopLine">决策停止线</string>
<string name="adas_data_MsgTypeFsmEvent">FSM事件</string>
<string name="adas_data_MsgTypePlanningDecisionState">Planning决策状态</string>
<string name="adas_data_MsgTypeSweeperTaskIndexData">清扫车指标数据</string>
<string name="adas_data_MsgTypeObuWarningData">OBU预警事件</string>

View File

@@ -339,6 +339,14 @@ public interface OnAdasListener {
*/
void onFSM2024State(@NonNull MessagePad.Header header, @NonNull Fsm2024.FSMStateMsg fsmState, int autopilotState, int autopilotMode);
/**
* FSM事件
*
* @param header 头
* @param fsmEventMsg 数据
*/
void onFSMEvent(@NonNull MessagePad.Header header, @NonNull Fsm2024.FsmEventMsg fsmEventMsg);
/**
* 定位状态
* 定位呈现状态透传 用于pad图标显示 1hz 所有车型MAP440开始支持

View File

@@ -0,0 +1,30 @@
package com.zhidao.support.adas.high.msg;
import android.os.SystemClock;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.AdasChannel;
import com.zhidao.support.adas.high.OnAdasListener;
import com.zhidao.support.adas.high.common.CupidLogUtils;
import com.zhidao.support.adas.high.protocol.RawData;
import fsm.Fsm2024;
/**
* FSM事件
*/
public class FSMEventMessage extends MyAbstractMessageHandler {
@Override
public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
Fsm2024.FsmEventMsg fsmEventMsg = Fsm2024.FsmEventMsg.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
AdasChannel.calculateTimeConsumingOnDispatchRaw("FSM事件", raw.receiveTime);
long nowTime = 0;
if (CupidLogUtils.isEnableLog())
nowTime = SystemClock.elapsedRealtime();
if (adasListener != null) {
adasListener.onFSMEvent(raw.getHeader(), fsmEventMsg);
}
AdasChannel.calculateTimeConsumingBusiness("FSM事件", nowTime);
}
}

View File

@@ -64,6 +64,7 @@ public class MyMessageFactory implements IMyMessageFactory {
private IMsg vlmMessageImage;//视觉语言模型图像
private IMsg obuUploadStatusMessage;//域控上报OBU开关状态响应
private IMsg planningStopLineMessage;//决策停止线
private IMsg fSMEventMessage;//FSM事件
private final AutopilotReview autopilotReview;
private final TurnLightState lightLeft = new TurnLightState();
@@ -380,6 +381,12 @@ public class MyMessageFactory implements IMyMessageFactory {
planningStopLineMessage = new PlanningStopLineMessage();
}
return planningStopLineMessage;
} else if (messageType == MessageType.TYPE_RECEIVE_FSM_EVENT.typeCode) {
//决策停止线
if (fSMEventMessage == null) {
fSMEventMessage = new FSMEventMessage();
}
return fSMEventMessage;
} else {
//MessageType.TYPE_DEFAULT.typeCode
return null;