[8.2.0]异常分级提示

This commit is contained in:
xuxinchao
2025-07-29 16:43:48 +08:00
parent 8c8e37d867
commit 3c191c3770
3 changed files with 214 additions and 62 deletions

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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
}
}
}
}