diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxConfig.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxConfig.kt index 241ad69f8c..c5bd83db69 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxConfig.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxConfig.kt @@ -8,38 +8,36 @@ import com.mogo.eagle.core.utilcode.util.SPUtils * @description 消息盒子配置 * @since: 2022/12/1 */ -class MsgBoxConfig { +object MsgBoxConfig { - companion object{ - //当前用户的Tab选择记录 - private const val userRecord = "USER_RECORD" + //当前用户的Tab选择记录 + private const val userRecord = "USER_RECORD" - /** - * 获取当前用户Tab选择记录 - */ - fun getUserRecord(): Int{ - return SPUtils.getInstance().getInt(userRecord,0) - } - - /** - * 设置当前用户Tab选择记录 - */ - fun setUserRecord(record: Int){ - SPUtils.getInstance().put(userRecord,record) - } - - //通知消息缓存列表 - @JvmField - var noticeList: ArrayList = ArrayList() - //车辆系统信息缓存列表 - @JvmField - var systemInfoList: ArrayList = ArrayList() - //录包信息缓存列表 - @JvmField - var recordBagList: ArrayList = ArrayList() - //播放小智语音消息时的未播放消息缓存列表 - @JvmField - var unPlayList: ArrayList = ArrayList() + /** + * 获取当前用户Tab选择记录 + */ + fun getUserRecord(): Int{ + return SPUtils.getInstance().getInt(userRecord,0) } + /** + * 设置当前用户Tab选择记录 + */ + fun setUserRecord(record: Int){ + SPUtils.getInstance().put(userRecord,record) + } + + //通知消息缓存列表 + @JvmField + var noticeList: ArrayList = ArrayList() + //车辆系统信息缓存列表 + @JvmField + var systemInfoList: ArrayList = ArrayList() + //录包信息缓存列表 + @JvmField + var recordBagList: ArrayList = ArrayList() + //播放小智语音消息时的未播放消息缓存列表 + @JvmField + var unPlayList: ArrayList = ArrayList() + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgFmData.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgFmData.kt new file mode 100644 index 0000000000..055e8eeb3c --- /dev/null +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgFmData.kt @@ -0,0 +1,164 @@ +package com.mogo.eagle.core.function.msgbox + +import com.zhjt.mogo.adas.data.bean.MogoReport + +/** + * FM信息对照表 + */ +class MsgFmData{ + /** + * 当出现多个建议操作时,按照整车下电重启、请求人工驾驶接管、请求平行驾驶接管、系统重启、联系硬件工程师、联系运维工程师、联系软件工程师优先级递减的顺序,只展示最高优先级的内容 + */ + enum class FaultAction( + val faultType: String,//故障处理类别 + val faultAction: String,//故障处理行为定义 + val faultActionCode: String,//故障处理行为标识 + val faultActionDesc: String,//故障处理行为描述 + val faultLevel: Int//故障处理级别 + ){ + //请求平行驾驶接管 + FM_ACT_NEED_PARALLEL_DERVING_TAKEOVER("恢复策略","请求平行驾驶接管","FM_ACT_NEED_PARALLEL_DERVING_TAKEOVER","如planing出站时,规划失败",5), + //请求人工驾驶接管 + FM_ACT_NEED_MANNUAL_DERVING("恢复策略","请求人工驾驶接管","FM_ACT_NEED_MANNUAL_DERVING","如planing规划失败,且存在弱网判断",6), + //系统重启 + FM_ACT_NEED_RESTART_SYSTEM("恢复策略","系统重启","FM_ACT_NEED_RESTART_SYSTEM","如检测到出现多个节点奔溃",4), + //整车下电重启 + FM_ACT_MUST_VEHICLE_POWER_RESET("恢复策略","整车下电重启","FM_ACT_MUST_VEHICLE_POWER_RESET","如底盘无数据,需要下电重启",7), + //请联系硬件工程师 + FM_ACT_CONTACT_HARDWARE_ENGINEER("人工处理","请联系硬件工程师","FM_ACT_CONTACT_HARDWARE_ENGINEER","硬件接线,域控启动等故障",3), + //请联系运维工程师 + FM_ACT_CONTACT_OPERATIONS_ENGINEER("人工处理","请联系运维工程师","FM_ACT_CONTACT_OPERATIONS_ENGINEER","系统配置不对,网络等故障",2), + //请联系软件工程师 + FM_ACT_CONTACT_SOFTWARE_ENGINEER("人工处理","请联系软件工程师","FM_ACT_CONTACT_SOFTWARE_ENGINEER","节点挂掉,无法启动等故障",1); + + companion object{ + + //获取故障建议操作级别 + fun getFaultLevel(faultActionCode: String): Int{ + return when(faultActionCode){ + //请求平行驾驶接管 + FM_ACT_NEED_PARALLEL_DERVING_TAKEOVER.faultActionCode -> FM_ACT_NEED_PARALLEL_DERVING_TAKEOVER.faultLevel + //请求人工驾驶接管 + FM_ACT_NEED_MANNUAL_DERVING.faultActionCode -> FM_ACT_NEED_MANNUAL_DERVING.faultLevel + //系统重启 + FM_ACT_NEED_RESTART_SYSTEM.faultActionCode -> FM_ACT_NEED_RESTART_SYSTEM.faultLevel + //整车下电重启 + FM_ACT_MUST_VEHICLE_POWER_RESET.faultActionCode -> FM_ACT_MUST_VEHICLE_POWER_RESET.faultLevel + //请联系硬件工程师 + FM_ACT_CONTACT_HARDWARE_ENGINEER.faultActionCode -> FM_ACT_CONTACT_HARDWARE_ENGINEER.faultLevel + //请联系运维工程师 + FM_ACT_CONTACT_OPERATIONS_ENGINEER.faultActionCode ->FM_ACT_CONTACT_OPERATIONS_ENGINEER.faultLevel + //请联系软件工程师 + FM_ACT_CONTACT_SOFTWARE_ENGINEER.faultActionCode -> FM_ACT_CONTACT_SOFTWARE_ENGINEER.faultLevel + else -> 0 + } + } + + //获取故障建议操作 + fun getFaultAction(faultActionLevel: Int): String{ + return when(faultActionLevel){ + //请求平行驾驶接管 + FM_ACT_NEED_PARALLEL_DERVING_TAKEOVER.faultLevel -> FM_ACT_NEED_PARALLEL_DERVING_TAKEOVER.faultAction + //请求人工驾驶接管 + FM_ACT_NEED_MANNUAL_DERVING.faultLevel -> FM_ACT_NEED_MANNUAL_DERVING.faultAction + //系统重启 + FM_ACT_NEED_RESTART_SYSTEM.faultLevel -> FM_ACT_NEED_RESTART_SYSTEM.faultAction + //整车下电重启 + FM_ACT_MUST_VEHICLE_POWER_RESET.faultLevel -> FM_ACT_MUST_VEHICLE_POWER_RESET.faultAction + //请联系硬件工程师 + FM_ACT_CONTACT_HARDWARE_ENGINEER.faultLevel -> FM_ACT_CONTACT_HARDWARE_ENGINEER.faultAction + //请联系运维工程师 + FM_ACT_CONTACT_OPERATIONS_ENGINEER.faultLevel ->FM_ACT_CONTACT_OPERATIONS_ENGINEER.faultAction + //请联系软件工程师 + FM_ACT_CONTACT_SOFTWARE_ENGINEER.faultLevel -> FM_ACT_CONTACT_SOFTWARE_ENGINEER.faultAction + else -> "暂无" + } + } + + //获取故障建议操作Code值 + fun getFaultActionCode(faultActionLevel: Int): String{ + return when(faultActionLevel){ + //请求平行驾驶接管 + FM_ACT_NEED_PARALLEL_DERVING_TAKEOVER.faultLevel -> FM_ACT_NEED_PARALLEL_DERVING_TAKEOVER.faultActionCode + //请求人工驾驶接管 + FM_ACT_NEED_MANNUAL_DERVING.faultLevel -> FM_ACT_NEED_MANNUAL_DERVING.faultActionCode + //系统重启 + FM_ACT_NEED_RESTART_SYSTEM.faultLevel -> FM_ACT_NEED_RESTART_SYSTEM.faultActionCode + //整车下电重启 + FM_ACT_MUST_VEHICLE_POWER_RESET.faultLevel -> FM_ACT_MUST_VEHICLE_POWER_RESET.faultActionCode + //请联系硬件工程师 + FM_ACT_CONTACT_HARDWARE_ENGINEER.faultLevel -> FM_ACT_CONTACT_HARDWARE_ENGINEER.faultActionCode + //请联系运维工程师 + FM_ACT_CONTACT_OPERATIONS_ENGINEER.faultLevel ->FM_ACT_CONTACT_OPERATIONS_ENGINEER.faultActionCode + //请联系软件工程师 + FM_ACT_CONTACT_SOFTWARE_ENGINEER.faultLevel -> FM_ACT_CONTACT_SOFTWARE_ENGINEER.faultActionCode + else -> "" + } + } + + + } + + } + + enum class FaultResult( + val resultType: String,//影响类别 + val resultDefine: String,//故障影响定义 + val resultCode: String,//故障影响的标识 + val resultDesc: String//后果对应的处理描述 + ){ + //无法作业 + FM_RST_FUNCTION_LOST("功能影响","无法作业","FM_RST_FUNCTION_LOST","需要禁止作业,如扫盘故障,清扫车无法清扫作业"), + //无法开放运营 + FM_RST_FORBID_OPEN_WORK("功能影响","无法开放运营","FM_RST_FORBID_OPEN_WORK","需要禁止运营,如安全带故障,可以自驾,不能载人"), + //无法平行驾驶 + FM_RST_FORBID_PARALLEL_DERVING("驾驶影响","无法平行驾驶","FM_RST_FORBID_PARALLEL_DERVING","需要禁止平行驾驶"), + //无法自动驾驶 + FM_RST_FORBID_AUTOPILOT_DERVING("驾驶影响","无法自动驾驶","FM_RST_FORBID_AUTOPILOT_DERVING","需要禁止自驾"), + //无法手动驾驶 + FM_RST_FORBID_MANNUAL_DERVING("驾驶影响","无法手动驾驶","FM_RST_FORBID_MANNUAL_DERVING","需要禁止行车,如底盘存在故障,需要通知出来"), + //失控,无法策略停车 + FM_RST_OUT_OF_CONTROL("安全影响","失控,无法策略停车","FM_RST_OUT_OF_CONTROL","需要立即紧急通知到人,车辆失控,如驾驶中controller挂掉,发送102重启"); + + companion object{ + //获取结果原因描述 + fun getResultDefine(resultCode: String): String{ + return when(resultCode){ + //无法作业 + FM_RST_FUNCTION_LOST.resultCode -> FM_RST_FUNCTION_LOST.resultDefine + //无法开放运营 + FM_RST_FORBID_OPEN_WORK.resultCode -> FM_RST_FORBID_OPEN_WORK.resultDefine + //无法平行驾驶 + FM_RST_FORBID_PARALLEL_DERVING.resultCode -> FM_RST_FORBID_PARALLEL_DERVING.resultDefine + //无法自动驾驶 + FM_RST_FORBID_AUTOPILOT_DERVING.resultCode -> FM_RST_FORBID_AUTOPILOT_DERVING.resultDefine + //无法手动驾驶 + FM_RST_FORBID_MANNUAL_DERVING.resultCode -> FM_RST_FORBID_MANNUAL_DERVING.resultDefine + //失控,无法策略停车 + FM_RST_OUT_OF_CONTROL.resultCode -> FM_RST_OUT_OF_CONTROL.resultDefine + else -> "暂无" + } + } + } + + } + + companion object{ + + @JvmStatic + fun getFmPolicyName(policyCode: String?): String{ + return when(policyCode){ + "FM_DP_NO_ACTION" -> "报告" + "FM_DP_ONLY_WARNING" -> "警示" + "FM_DP_SPEED_LIMIT1" -> "一级降速" + "FM_DP_SPEED_LIMIT2" -> "二级降速" + "FM_DP_SPEED_LIMIT3" -> "三级降速" + "FM_DP_PNC_CHOOSE_STOP" -> "择机靠边停车" + "FM_DP_COMFORTABLE_STOP" -> "立刻舒适停车" + "FM_DP_EMERGENCY_STOP" -> "就地紧急停车" + else -> "暂无" + } + } + } + +} \ 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 388499ef71..ab023e3c79 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 @@ -9,6 +9,7 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.enums.DataSourceType +import com.mogo.eagle.core.data.msgbox.FMInfoMsg import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean import com.mogo.eagle.core.data.msgbox.MsgCategory @@ -21,6 +22,7 @@ import com.mogo.eagle.core.function.call.order.CallerOrderListenerManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.DriverMsgBoxBubbleAdapter import com.mogo.eagle.core.function.msgbox.MsgBoxConfig +import com.mogo.eagle.core.utilcode.util.SoundPoolUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import kotlinx.android.synthetic.main.layout_driver_msg_box_bubble.view.* @@ -98,7 +100,21 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( //todo 过滤MAP系统异常报警 } else if(category == MsgCategory.FM_INFO){ CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) - showData(msgBoxBean) + //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 + val fmInfoMsg = msgBoxBean.bean as FMInfoMsg + if(fmInfoMsg.policyCode == "FM_DP_PNC_CHOOSE_STOP" //择机靠边停车 + || fmInfoMsg.policyCode == "FM_DP_COMFORTABLE_STOP" //立刻舒适停车 + || fmInfoMsg.policyCode == "FM_DP_EMERGENCY_STOP" //就地紧急停车 + ){ + //语音提示 + try { + SoundPoolUtils.getSoundPool().playSoundWithRedId(context,R.raw.weak_net_tips) + }catch (e: Exception){ + e.printStackTrace() + } + //展示消息 + 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/DriverMsgBoxListView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt index 2106591153..ca4e1d1adb 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 @@ -46,7 +46,7 @@ class DriverMsgBoxListView @JvmOverloads constructor( } private val TAG = "DriverMsgBoxListView" private var noticeList: ArrayList ?= null //通知消息列表 - private var fmList: ArrayList ?= null //FM信息消息列表 + private var fmList: ArrayList ?= ArrayList() //FM信息消息列表 private var ipcReportList: ArrayList ?= null //车辆系统信息消息列表 private var badCaseList: ArrayList ?= null//录包消息列表 private var driverMsgBoxListAdapter: DriverMsgBoxListAdapter ?=null @@ -232,6 +232,7 @@ class DriverMsgBoxListView @JvmOverloads constructor( override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { UiThreadHandler.post({ when (category) { + //通知 MsgCategory.NOTICE -> { if(msgBoxList.sourceType == DataSourceType.SUMMARY){ //在一次订单中汇总消息只展示一次 @@ -249,18 +250,28 @@ class DriverMsgBoxListView @JvmOverloads constructor( } } } + //FM信息 + MsgCategory.FM_INFO -> { + fmList?.add(0,msgBoxList) + if(MsgBoxConfig.getUserRecord() == 1){ + fmList?.let { driverMsgBoxListAdapter?.setData(it) } + } + } + //系统信息 MsgCategory.SYS_INFO -> { ipcReportList?.add(0,msgBoxList) - if(MsgBoxConfig.getUserRecord() == 1){ + if(MsgBoxConfig.getUserRecord() == 2){ ipcReportList?.let { driverMsgBoxListAdapter?.setData(it) } } } + //录包 MsgCategory.RECORD_BAG -> { badCaseList?.add(0,msgBoxList) - if(MsgBoxConfig.getUserRecord() == 2){ + if(MsgBoxConfig.getUserRecord() == 3){ badCaseList?.let { driverMsgBoxListAdapter?.setData(it) } } } + else -> {} } },UiThreadHandler.MODE.QUEUE) } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt index 0a3f3c3b84..96f6000687 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt @@ -19,6 +19,8 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.msgbox.MsgBoxConfig +import com.mogo.eagle.core.function.msgbox.MsgFmData import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform import com.mogo.eagle.core.utilcode.util.TimeUtils @@ -138,6 +140,7 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A holder.tvOperationDoorContent.text = operationDoorMsg.content } } + //系统信息消息 is BubbleReportHolder -> { data?.let { val msgBoxBean = it[position].msgBoxBean @@ -154,6 +157,7 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A } } } + //云公告消息 is BubbleNoticeHolder -> { data?.let { val msgBoxBean = it[position].msgBoxBean.bean @@ -193,6 +197,7 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A } } } + //V2X消息 is BubbleV2XHolder -> { data?.let { val msgBoxBean = it[position].msgBoxBean @@ -211,6 +216,7 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A } } } + //汇总消息 is BubbleSummaryHolder -> { data?.let { val summaryMsg = it[position].msgBoxBean.bean as V2XMsg @@ -218,10 +224,35 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A holder.tvSummaryContent.text = summaryMsg.content } } + //FM信息 is BubbleFmHolder ->{ data?.let { val fmMsg = it[position].msgBoxBean.bean as FMInfoMsg - + holder.tvBubbleFmFault.text = MsgFmData.getFmPolicyName(fmMsg.policyCode) + if(fmMsg.policyTime == null){ + holder.tvBubbleFmTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + }else{ + holder.tvBubbleFmTime.text = TimeUtils.millis2String(fmMsg.policyTime!!,getHourMinFormat()) + } + if(fmMsg.fmInfoList?.size == 0){ + holder.tvBubbleFmFaultAction.text = "建议操作:暂无" + }else{ + var curFaultLevel = 0 //默认级别,遍历数组找出级别最高的(level数越小大,级别越高) + fmMsg.fmInfoList?.forEach { faultInfo -> + if(faultInfo.faultActionCount>0){ + faultInfo.faultActionList.forEach {actionCode -> + //获取建议操作级别,得到建议操作级别最高的操作 + if(MsgFmData.FaultAction.getFaultLevel(actionCode) > curFaultLevel){ + curFaultLevel = MsgFmData.FaultAction.getFaultLevel(actionCode) + } + } + } + } + val faultAction = MsgFmData.FaultAction.getFaultAction(curFaultLevel) + //当出现多个建议操作时,按照整车下电重启、请求人工驾驶接管、请求平行驾驶接管、系统重启、联系硬件工程师、 + // 联系运维工程师、联系软件工程师优先级递减的顺序,只展示最高优先级的内容 + holder.tvBubbleFmFaultAction.text = "${faultAction}(${MsgFmData.FaultAction.getFaultActionCode(curFaultLevel)})" + } } } } @@ -335,7 +366,9 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A //FM消息 class BubbleFmHolder(itemView: View): RecyclerView.ViewHolder(itemView){ - + var tvBubbleFmFault: TextView = itemView.findViewById(R.id.tvBubbleFmFault) + var tvBubbleFmFaultAction: TextView = itemView.findViewById(R.id.tvBubbleFmFaultAction) + var tvBubbleFmTime: TextView = itemView.findViewById(R.id.tvBubbleFmTime) } fun setChangeListener(listener: ChangeViewListener){ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt index 3154d33766..0fd316e508 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt @@ -18,6 +18,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.msgbox.MsgFmData import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform import com.mogo.eagle.core.utilcode.util.ResourceUtils.getDrawable @@ -138,7 +139,195 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : //FM信息 is FmInfoHolder -> { data?.let { - + val fmInfoMsg = it[position].bean as FMInfoMsg + //时间显示 + holder.tvFmTimeOpen.text = + "时间:${fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1) }}" + holder.tvFmTimeNormal.text = + "时间:${fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1) }}" + holder.tvFmTime.text = + fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1,getHourMinFormat()) } + //不同级别的Icon显示 + if(fmInfoMsg.policyCode == "FM_DP_ONLY_WARNING"){ + //警示 + holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal)) + holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_open)) + }else if(fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT1" + || fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT2" + || fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT3"){ + //降速行驶 + holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_normal)) + holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_open)) + }else if(fmInfoMsg.policyCode == "FM_DP_PNC_CHOOSE_STOP" + || fmInfoMsg.policyCode == "FM_DP_COMFORTABLE_STOP" + || fmInfoMsg.policyCode == "FM_DP_EMERGENCY_STOP"){ + //安全停车 + holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_normal)) + holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_open)) + } + //Title + holder.tvFmTitleNormal.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode) + holder.tvFmTitleOpen.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode) + //建议操作 + if(fmInfoMsg.fmInfoList.isNullOrEmpty()){ + //建议操作暂无 + holder.tvFmActionOpen.text = "建议操作:暂无" + holder.tvFmActionNormal.text = "建议操作:暂无" + }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("建议操作:") + receiveFaultLevel.sorted() + receiveFaultLevel.forEach {level-> + faultActionStr.append(MsgFmData.FaultAction.getFaultAction(level)) + faultActionStr.append("(") + faultActionStr.append(MsgFmData.FaultAction.getFaultActionCode(level)) + faultActionStr.append(")") + } + holder.tvFmActionOpen.text = faultActionStr.toString() + holder.tvFmActionNormal.text = faultActionStr.toString() + }else{ + holder.tvFmActionOpen.text = "建议操作:暂无" + holder.tvFmActionNormal.text = "建议操作:暂无" + } + } + //故障策略 + holder.tvFmFaultOpen.text = "故障策略:${MsgFmData.getFmPolicyName(fmInfoMsg.policyCode)}(${fmInfoMsg.policyCode})" + //故障原因 + if(fmInfoMsg.fmInfoList.isNullOrEmpty()){ + holder.tvFmReasonOpen.text = "故障原因:暂无" + }else{ + val fmFaultReason = StringBuilder() + fmFaultReason.append("故障原因:") + for((index,info) in fmInfoMsg.fmInfoList!!.withIndex()){ + fmFaultReason.append(info.faultName) + fmFaultReason.append("(") + fmFaultReason.append(info.faultId) + fmFaultReason.append(")") + if(index!=(fmInfoMsg.fmInfoList!!.size-1)){ + fmFaultReason.append("/") + } + } + holder.tvFmReasonOpen.text = fmFaultReason.toString() + } + //故障后果 + if(fmInfoMsg.fmInfoList.isNullOrEmpty()){ + holder.tvFmResultOpen.text = "故障后果:暂无" + }else{ + val fmFaultResult = StringBuilder() + fmFaultResult.append("故障后果:") + fmInfoMsg.fmInfoList!!.forEach { info-> + if(info.faultResultCount != 0){ + info.faultResultList.forEach { result-> + fmFaultResult.append(MsgFmData.FaultResult.getResultDefine(result)) + fmFaultResult.append("(") + fmFaultResult.append(result) + fmFaultResult.append(")") + fmFaultResult.append("/") + } + } + } + if(fmFaultResult.endsWith("/")){ + holder.tvFmResultOpen.text = fmFaultResult.deleteCharAt(fmFaultResult.lastIndex).toString() + }else{ + holder.tvFmResultOpen.text = "故障后果:暂无" + } + } + //对布局进行展开折叠操作 + if(fmInfoMsg.isShow){ + holder.tvFmStatusSelect.setCompoundDrawablesWithIntrinsicBounds( + getDrawable(R.drawable.icon_msg_close), + null, + null, + null + ) + holder.tvFmStatusSelect.text = "折叠" + holder.ivFmImageNormal.visibility = View.GONE + holder.tvFmTitleNormal.visibility = View.GONE + holder.tvFmTimeNormal.visibility = View.GONE + holder.tvFmActionNormal.visibility = View.GONE + holder.ivFmImageOpen.visibility = View.VISIBLE + holder.tvFmTitleOpen.visibility = View.VISIBLE + holder.tvFmTimeOpen.visibility = View.VISIBLE + holder.tvFmActionOpen.visibility = View.VISIBLE + holder.tvFmFaultOpen.visibility = View.VISIBLE + holder.tvFmReasonOpen.visibility = View.VISIBLE + holder.tvFmResultOpen.visibility = View.VISIBLE + }else{ + holder.tvFmStatusSelect.setCompoundDrawablesWithIntrinsicBounds( + getDrawable(R.drawable.icon_msg_open), + null, + null, + null + ) + holder.tvFmStatusSelect.text = "展开" + holder.ivFmImageNormal.visibility = View.VISIBLE + holder.tvFmTitleNormal.visibility = View.VISIBLE + holder.tvFmTimeNormal.visibility = View.VISIBLE + holder.tvFmActionNormal.visibility = View.VISIBLE + holder.ivFmImageOpen.visibility = View.GONE + holder.tvFmTitleOpen.visibility = View.GONE + holder.tvFmTimeOpen.visibility = View.GONE + holder.tvFmActionOpen.visibility = View.GONE + holder.tvFmFaultOpen.visibility = View.GONE + holder.tvFmReasonOpen.visibility = View.GONE + holder.tvFmResultOpen.visibility = View.GONE + } + holder.tvFmStatusSelect.setOnClickListener{ + if(!fmInfoMsg.isShow){ + fmInfoMsg.isShow = true + holder.tvFmStatusSelect.setCompoundDrawablesWithIntrinsicBounds( + getDrawable(R.drawable.icon_msg_close), + null, + null, + null + ) + holder.tvFmStatusSelect.text = "折叠" + holder.ivFmImageNormal.visibility = View.GONE + holder.tvFmTitleNormal.visibility = View.GONE + holder.tvFmTimeNormal.visibility = View.GONE + holder.tvFmActionNormal.visibility = View.GONE + holder.ivFmImageOpen.visibility = View.VISIBLE + holder.tvFmTitleOpen.visibility = View.VISIBLE + holder.tvFmTimeOpen.visibility = View.VISIBLE + holder.tvFmActionOpen.visibility = View.VISIBLE + holder.tvFmFaultOpen.visibility = View.VISIBLE + holder.tvFmReasonOpen.visibility = View.VISIBLE + holder.tvFmResultOpen.visibility = View.VISIBLE + }else{ + fmInfoMsg.isShow = false + holder.tvFmStatusSelect.setCompoundDrawablesWithIntrinsicBounds( + getDrawable(R.drawable.icon_msg_open), + null, + null, + null + ) + holder.tvFmStatusSelect.text = "展开" + holder.ivFmImageNormal.visibility = View.VISIBLE + holder.tvFmTitleNormal.visibility = View.VISIBLE + holder.tvFmTimeNormal.visibility = View.VISIBLE + holder.tvFmActionNormal.visibility = View.VISIBLE + holder.ivFmImageOpen.visibility = View.GONE + holder.tvFmTitleOpen.visibility = View.GONE + holder.tvFmTimeOpen.visibility = View.GONE + holder.tvFmActionOpen.visibility = View.GONE + holder.tvFmFaultOpen.visibility = View.GONE + holder.tvFmReasonOpen.visibility = View.GONE + holder.tvFmResultOpen.visibility = View.GONE + } + } } } //系统信息 @@ -468,7 +657,19 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : //FM信息 class FmInfoHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ - + var ivFmImageNormal: ImageView = itemView.findViewById(R.id.ivFmImageNormal) //故障级别图标 + var tvFmTitleNormal: TextView = itemView.findViewById(R.id.tvFmTitleNormal) //标题展示故障策略 + var tvFmTimeNormal: TextView = itemView.findViewById(R.id.tvFmTimeNormal) //时间 + var tvFmStatusSelect: TextView = itemView.findViewById(R.id.tvFmStatusSelect) //展开折叠按钮 + var tvFmActionNormal: TextView = itemView.findViewById(R.id.tvFmActionNormal) //建议操作 + var tvFmTime: TextView = itemView.findViewById(R.id.tvFmTime) //时间 + var ivFmImageOpen: ImageView = itemView.findViewById(R.id.ivFmImageOpen) //展开时图标 + var tvFmTitleOpen: TextView = itemView.findViewById(R.id.tvFmTitleOpen) //标题文案为故障策略 + var tvFmTimeOpen: TextView = itemView.findViewById(R.id.tvFmTimeOpen) //发生时间 + var tvFmActionOpen: TextView = itemView.findViewById(R.id.tvFmActionOpen) //建议操作 + var tvFmFaultOpen: TextView = itemView.findViewById(R.id.tvFmFaultOpen) //故障策略 + var tvFmReasonOpen: TextView = itemView.findViewById(R.id.tvFmReasonOpen) //故障原因 + var tvFmResultOpen: TextView = itemView.findViewById(R.id.tvFmResultOpen) //后果 } //车辆系统信息 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_reduce_normal.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_reduce_normal.png new file mode 100644 index 0000000000..9fa73fb549 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_reduce_normal.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_reduce_open.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_reduce_open.png new file mode 100644 index 0000000000..1e5a1df7c3 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_reduce_open.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_relieve_normal.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_relieve_normal.png new file mode 100644 index 0000000000..a43850983a Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_relieve_normal.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_relieve_open.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_relieve_open.png new file mode 100644 index 0000000000..0586198866 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_relieve_open.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_stop_normal.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_stop_normal.png new file mode 100644 index 0000000000..59bed6db0c Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_stop_normal.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_stop_open.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_stop_open.png new file mode 100644 index 0000000000..f283766bd6 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_stop_open.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_warning_normal.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_warning_normal.png new file mode 100644 index 0000000000..ad451d9890 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_warning_normal.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_warning_open.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_warning_open.png new file mode 100644 index 0000000000..a111e4e0db Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fm_warning_open.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fm.xml index f1d2d9d1dd..38b1ee322d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fm.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fm.xml @@ -1,17 +1,198 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml index 29e1165bfb..f7db385e5b 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml @@ -138,10 +138,11 @@ - + - \ No newline at end of file + + + + + + + + + + + \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/FMInfoMsg.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/FMInfoMsg.kt index 199b6848b7..eefaac14f4 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/FMInfoMsg.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/FMInfoMsg.kt @@ -8,7 +8,9 @@ import java.io.Serializable */ data class FMInfoMsg( var fmInfoList: List?, - var policyCode: String? + var policyCode: String?, + var policyTime: Long?, + var isShow: Boolean ) : Serializable /** diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFaultManagementStateListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFaultManagementStateListenerManager.kt index 42cf25a0c8..8c32cd2886 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFaultManagementStateListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFaultManagementStateListenerManager.kt @@ -32,6 +32,7 @@ object CallerFaultManagementStateListenerManager : CallerBase() + val policyTime = fmInfo.time if (fmFilterInfoMsg?.cacheFilterList != null) { if (fmFilterInfoMsg.cacheFilterList?.size == list.size) { //判断两个集合重复 true:return @@ -54,7 +55,7 @@ object CallerFaultManagementStateListenerManager : CallerBase