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 19db18b10e..3ac8d78be8 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 @@ -8,25 +8,31 @@ import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager import com.mogo.commons.env.ProjectUtils +import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.deva.report.ReportEntity import com.mogo.eagle.core.data.enums.DataSourceType +import com.mogo.eagle.core.data.enums.EventTypeEnumNew 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.MsgBoxType import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.data.msgbox.MsgFmData +import com.mogo.eagle.core.data.takeover.TAKE_OVER_REQUEST import com.mogo.eagle.core.function.api.autopilot.IMoGoNodeStateListener import com.mogo.eagle.core.function.api.datacenter.IDataCenterBizListener import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerNodeStateListenerManager import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +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.CallerMsgBoxListenerManager +import com.mogo.eagle.core.function.call.setting.CallerTakeOverManager 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 @@ -149,41 +155,98 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( } else if (category == MsgCategory.FM_INFO) { CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) if (FunctionBuildConfig.isTakeoverRemind) { - //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 + +// //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 +// var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) +// fmInfoMsg.fmInfoList?.forEach { faultInfo -> +// if (faultInfo.faultActionCount > 0) { +// faultInfo.faultActionList.forEach { actionCode -> +// //获取建议操作级别,得到建议操作级别最高的操作 +// if (MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel) { +// curFaultLevel = +// MsgFmData.FaultAction.getFaultLevel(actionCode) +// } +// } +// } +// } +// //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 +// if (curFaultLevel == 0) { +// //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 +// if (CallerAutoPilotStatusListenerManager.getState() == 2 +// || CallerAutoPilotStatusListenerManager.getState() == 7 +// ) { +// // 6.6.0 ,因为 FSM 模块也会弹修改为只有没有 FSM 模块才弹 +// // 6.6.0 ,20240823 考虑到 FSM 初期消息不一定全,先不加限制,产品先观察功能后再考虑是否过滤 +// // if (hasNoneFSMNode()) { +// //语音提示 +// try { +// SoundPoolUtils.getSoundPool() +// .playSoundWithRedId(context, R.raw.weak_net_tips) +// } catch (e: Exception) { +// e.printStackTrace() +// } +// //展示消息 +// showData(msgBoxBean) +// //} +// } +// } + + /** + * 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 - var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) - fmInfoMsg.fmInfoList?.forEach { faultInfo -> - if (faultInfo.faultActionCount > 0) { - faultInfo.faultActionList.forEach { actionCode -> - //获取建议操作级别,得到建议操作级别最高的操作 - if (MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel) { - curFaultLevel = - MsgFmData.FaultAction.getFaultLevel(actionCode) - } - } - } - } - //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 - if (curFaultLevel == 0) { - //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 - if (CallerAutoPilotStatusListenerManager.getState() == 2 - || CallerAutoPilotStatusListenerManager.getState() == 7 - ) { - // 6.6.0 ,因为 FSM 模块也会弹修改为只有没有 FSM 模块才弹 - // 6.6.0 ,20240823 考虑到 FSM 初期消息不一定全,先不加限制,产品先观察功能后再考虑是否过滤 - // if (hasNoneFSMNode()) { - //语音提示 - try { - SoundPoolUtils.getSoundPool() - .playSoundWithRedId(context, R.raw.weak_net_tips) - } catch (e: Exception) { - e.printStackTrace() - } - //展示消息 + 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, + "识别车辆故障,建议立即接管安全停车,查看操作建议", + object : IMoGoWarningStatusListener { + override fun onShow() { + CallerTakeOverManager.invokeTakeOverEvent(true) + } + + override fun onDismiss() { + CallerTakeOverManager.invokeTakeOverEvent(false) + } + },expireTime =3000L, isFromObu = false + ) + //展示消息盒子消息 showData(msgBoxBean) - //} + } + //二级 + MsgFmData.LEVEL_TWO->{ + //语音提示 + AIAssist.getInstance(context).speakTTSVoice("识别车辆异常,建议尽快安全停车,查看操作建议") + //展示消息盒子消息 + 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/MsgBoxToastView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxToastView.kt index 733f4e46fc..e57ec8c058 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 @@ -8,23 +8,29 @@ import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager import com.mogo.commons.env.ProjectUtils +import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.deva.report.ReportEntity import com.mogo.eagle.core.data.enums.DataSourceType +import com.mogo.eagle.core.data.enums.EventTypeEnumNew 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.MsgBoxType import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.data.msgbox.MsgFmData +import com.mogo.eagle.core.data.takeover.TAKE_OVER_REQUEST import com.mogo.eagle.core.function.api.datacenter.IDataCenterBizListener import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerIpcConnectStateToastManager import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +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.CallerMsgBoxListenerManager +import com.mogo.eagle.core.function.call.setting.CallerTakeOverManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.MsgBoxToastAdapter import com.mogo.eagle.core.function.msgbox.MsgBoxConfig @@ -141,41 +147,96 @@ class MsgBoxToastView @JvmOverloads constructor( } else if (category == MsgCategory.FM_INFO) { CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) if (FunctionBuildConfig.isTakeoverRemind) { - //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 +// //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 +// var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) +// fmInfoMsg.fmInfoList?.forEach { faultInfo -> +// if (faultInfo.faultActionCount > 0) { +// faultInfo.faultActionList.forEach { actionCode -> +// //获取建议操作级别,得到建议操作级别最高的操作 +// if (MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel) { +// curFaultLevel = +// MsgFmData.FaultAction.getFaultLevel(actionCode) +// } +// } +// } +// } +// //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 +// if (curFaultLevel == 0) { +// //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 +// if (CallerAutoPilotStatusListenerManager.getState() == 2 +// || CallerAutoPilotStatusListenerManager.getState() == 7 +// ) { +// // 6.6.0 ,因为 FSM 模块也会弹修改为只有没有 FSM 模块才弹 +// // 6.6.0 ,20240823 考虑到 FSM 初期消息不一定全,先不加限制,产品先观察功能后再考虑是否过滤 +// // if (hasNoneFSMNode()) { +// //语音提示 +// try { +// SoundPoolUtils.getSoundPool() +// .playSoundWithRedId(context, R.raw.weak_net_tips) +// } catch (e: Exception) { +// e.printStackTrace() +// } +// //展示消息 +// showData(msgBoxBean) +// //} +// } +// } + + /** + * 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 - var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) - fmInfoMsg.fmInfoList?.forEach { faultInfo -> - if (faultInfo.faultActionCount > 0) { - faultInfo.faultActionList.forEach { actionCode -> - //获取建议操作级别,得到建议操作级别最高的操作 - if (MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel) { - curFaultLevel = - MsgFmData.FaultAction.getFaultLevel(actionCode) - } - } - } - } - //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 - if (curFaultLevel == 0) { - //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 - if (CallerAutoPilotStatusListenerManager.getState() == 2 - || CallerAutoPilotStatusListenerManager.getState() == 7 - ) { - // 6.6.0 ,因为 FSM 模块也会弹修改为只有没有 FSM 模块才弹 - // 6.6.0 ,20240823 考虑到 FSM 初期消息不一定全,先不加限制,产品先观察功能后再考虑是否过滤 - // if (hasNoneFSMNode()) { - //语音提示 - try { - SoundPoolUtils.getSoundPool() - .playSoundWithRedId(context, R.raw.weak_net_tips) - } catch (e: Exception) { - e.printStackTrace() - } - //展示消息 + 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, + "识别车辆故障,建议立即接管安全停车,查看操作建议", + object : IMoGoWarningStatusListener { + override fun onShow() { + CallerTakeOverManager.invokeTakeOverEvent(true) + } + + override fun onDismiss() { + CallerTakeOverManager.invokeTakeOverEvent(false) + } + },expireTime =3000L, isFromObu = false + ) + //展示消息盒子消息 showData(msgBoxBean) - //} + } + //二级 + MsgFmData.LEVEL_TWO->{ + //语音提示 + AIAssist.getInstance(context).speakTTSVoice("识别车辆异常,建议尽快安全停车,查看操作建议") + //展示消息盒子消息 + showData(msgBoxBean) + } + //三级 + MsgFmData.LEVEL_THREE->{ + //在消息盒子图标上,可查看到红点标记,无其他元素特殊提醒;点进消息盒子可查看到详细信息 } } + } } else { if (msgBoxBean.sourceType == DataSourceType.SUMMARY) { diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt index 2b168ef74a..ee1b9ce418 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt @@ -163,6 +163,10 @@ class MsgFmData{ companion object{ + const val LEVEL_ONE = 1 //降级策略:安全停车 交互:一级 + const val LEVEL_TWO = 2 //降级策略:降速行驶 交互:二级 + const val LEVEL_THREE = 3 //降级策略:无操作 交互:三级 + @JvmStatic fun getFmPolicyName(policyCode: String?): String{ return when(policyCode){ @@ -177,6 +181,30 @@ class MsgFmData{ else -> "暂无" } } + + /** + * 获取异常分级 + * 鹰眼8.2.0版本需求:定义三种不同提示强度的异常提示交互 + * 一级交互:TTS、图像、消息盒子 + * 二级交互:TTS、消息盒子 + * 三级交互:消息盒子 + */ + @JvmStatic + fun getFmPolicyLevel(policyCode: String?): Int{ + return when(policyCode){ + "FM_DP_NO_ACTION" -> LEVEL_THREE + "FM_DP_ONLY_WARNING" -> LEVEL_THREE + "FM_DP_SPEED_LIMIT1" -> LEVEL_TWO + "FM_DP_SPEED_LIMIT2" -> LEVEL_TWO + "FM_DP_SPEED_LIMIT3" -> LEVEL_TWO + "FM_DP_PNC_CHOOSE_STOP" -> LEVEL_ONE + "FM_DP_COMFORTABLE_STOP" -> LEVEL_ONE + "FM_DP_EMERGENCY_STOP" -> LEVEL_ONE + else -> LEVEL_THREE + } + } + + } } \ No newline at end of file