diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt index 27de31e663..bd958f8055 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -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开始支持 diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt index 16c19b6505..2ea8487af0 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt @@ -141,7 +141,7 @@ object DataManager { CallerMsgBoxListenerManager.invokeListener(MsgCategory.NOTICE, msg) } - MsgBoxType.FMINFO -> { + MsgBoxType.FSM_EVENT, MsgBoxType.FMINFO -> { synchronized(this) { fmInfoList.add(msg) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt index 6f9010aa76..4a559b86b4 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt @@ -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 + } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/adapter/MsgBoxTabAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/adapter/MsgBoxTabAdapter.kt index 36fab10ca1..5c62bac1ce 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/adapter/MsgBoxTabAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/adapter/MsgBoxTabAdapter.kt @@ -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() - 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() + 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) //后果 + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt index 2158333f0d..363830485b 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt @@ -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) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt index 68f858319e..15c66116b3 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt @@ -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) } + } } } //系统信息 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxToastView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxToastView.kt index f6443039d7..4a4e787d56 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxToastView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxToastView.kt @@ -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) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxToastAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxToastAdapter.kt index 34a3533978..75ce11d835 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxToastAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxToastAdapter.kt @@ -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 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_warning_fsm_event.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_warning_fsm_event.png new file mode 100644 index 0000000000..513ca5bf60 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_warning_fsm_event.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_msg_box_tab.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_msg_box_tab.xml index 04b422885f..101b19352c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_msg_box_tab.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_msg_box_tab.xml @@ -33,7 +33,7 @@ Notice - FM Info + Fault Info System Info Record Record Icon diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml index 22402495fc..a5e3a1c48d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml @@ -181,7 +181,7 @@ 通知 - FM信息 + 故障信息 系统信息 录包 录包图标 diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt index 9f95285af3..4afab84a7d 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt @@ -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" diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/FSMEventMsg.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/FSMEventMsg.kt new file mode 100644 index 0000000000..db040975ed --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/FSMEventMsg.kt @@ -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 \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgBoxType.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgBoxType.kt index 4bb3b849fd..9af9f1dc06 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgBoxType.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgBoxType.kt @@ -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 } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoFsm2024Listener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoFsm2024Listener.kt index 3da37890b7..b88c19252a 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoFsm2024Listener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoFsm2024Listener.kt @@ -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){} + } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFsm2024ListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFsm2024ListenerManager.kt index 530c7b8344..686abb2225 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFsm2024ListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFsm2024ListenerManager.kt @@ -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() { + 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() { } } + 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) + ) + ) + } + } + + } + + + } } \ No newline at end of file diff --git a/core/mogo-core-res/src/main/res/values-en/string.xml b/core/mogo-core-res/src/main/res/values-en/string.xml index 6c1690b402..d17f07f108 100644 --- a/core/mogo-core-res/src/main/res/values-en/string.xml +++ b/core/mogo-core-res/src/main/res/values-en/string.xml @@ -172,6 +172,9 @@ Upgrading to new version, expected 5 minutes Upgrade failed, please contact operations personnel Already the latest version + Unable to start autonomous driving + Abnormal exit from autonomous driving + Unknown cause of fault Failed to enter roaming mode, code:%s diff --git a/core/mogo-core-res/src/main/res/values/string.xml b/core/mogo-core-res/src/main/res/values/string.xml index 264be2de27..54899b4b42 100644 --- a/core/mogo-core-res/src/main/res/values/string.xml +++ b/core/mogo-core-res/src/main/res/values/string.xml @@ -172,6 +172,9 @@ 新版本升级中,预计5分钟升级完成 升级失败,请联系运维人员 已是最新版本 + 无法起自驾 + 异常退出自驾 + 未知故障原因 进入漫游模式失败, code:%s diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java index 519f77c5e1..c85e1a9202 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java @@ -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), diff --git a/libraries/mogo-adas-data/src/main/proto/fsm2024.proto b/libraries/mogo-adas-data/src/main/proto/fsm2024.proto index 1a4a708814..c6dc2cc774 100644 --- a/libraries/mogo-adas-data/src/main/proto/fsm2024.proto +++ b/libraries/mogo-adas-data/src/main/proto/fsm2024.proto @@ -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; } diff --git a/libraries/mogo-adas-data/src/main/proto/message_pad.proto b/libraries/mogo-adas-data/src/main/proto/message_pad.proto index e826d5f81c..0647a5f0b7 100644 --- a/libraries/mogo-adas-data/src/main/proto/message_pad.proto +++ b/libraries/mogo-adas-data/src/main/proto/message_pad.proto @@ -113,6 +113,7 @@ enum MessageType MsgTypeSetObuUploadReq = 0x10139;//关闭或打开域控上报自车数据到OBU MsgTypeObuUploadStatus = 0x1013A;//obu上报状态查询以结果(上下行) MsgTypePlanningStopLine = 0x1013B;//决策停止线(自动驾驶决策呈现使用) 定频,理论是10hz,实际会有不同 + MsgTypeFsmEvent = 0x1013C;//fsm event msg } message Header diff --git a/libraries/mogo-adas-data/src/main/res/values-en/strings.xml b/libraries/mogo-adas-data/src/main/res/values-en/strings.xml index c326933535..ff8c670118 100644 --- a/libraries/mogo-adas-data/src/main/res/values-en/strings.xml +++ b/libraries/mogo-adas-data/src/main/res/values-en/strings.xml @@ -93,6 +93,7 @@ Domain control OBU upload status query Domain control OBU upload status response Planning Stop Line + FSM Event Planning decision state Sweeper index data OBU warning event diff --git a/libraries/mogo-adas-data/src/main/res/values/strings.xml b/libraries/mogo-adas-data/src/main/res/values/strings.xml index 34f31740ef..22900a9408 100644 --- a/libraries/mogo-adas-data/src/main/res/values/strings.xml +++ b/libraries/mogo-adas-data/src/main/res/values/strings.xml @@ -93,6 +93,7 @@ 域控上报OBU开关状态查询 域控上报OBU开关状态响应 决策停止线 + FSM事件 Planning决策状态 清扫车指标数据 OBU预警事件 diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java index 423e3a28af..48d0baa23a 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java @@ -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开始支持 diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FSMEventMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FSMEventMessage.java new file mode 100644 index 0000000000..fa5a9f51f6 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FSMEventMessage.java @@ -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); + } +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java index ce0c62b736..c3f3a91024 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java @@ -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;