From 32ca3026d06a6a7bea02cf9ef268e831c814381d Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Mon, 5 Dec 2022 19:38:42 +0800 Subject: [PATCH] =?UTF-8?q?[2.13.0=20=E4=BC=98=E5=8C=96obu=E6=98=BE?= =?UTF-8?q?=E7=A4=BA]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../obu/mogo/MogoPrivateObuNewManager.kt | 171 ++++++------------ .../data/enums/EventTypeEnumTrafficLight.kt | 71 ++++++++ .../enums/EventTypeEnumWeaknessTraffic.kt | 4 +- .../icon_warning_v2x_motobike.png | Bin 0 -> 18424 bytes 4 files changed, 131 insertions(+), 115 deletions(-) create mode 100644 core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumTrafficLight.kt create mode 100644 core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_motobike.png diff --git a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt index 0a3be5cb96..058d3ec7ad 100644 --- a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt +++ b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt @@ -4,24 +4,19 @@ import android.content.Context import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig.isShowObuLimitSpeedView -import com.mogo.eagle.core.data.enums.EventTypeEnumNew -import com.mogo.eagle.core.data.enums.EventTypeEnumWeaknessTraffic -import com.mogo.eagle.core.data.enums.V2iEventTypeEnum -import com.mogo.eagle.core.data.enums.WarningDirectionEnum +import com.mogo.eagle.core.data.enums.* import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.V2XMsg 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.hmi.CallerHmiManager -import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showLimitingVelocity import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.Default import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.TooClose import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.call.obu.CallerObuListenerManager -import com.mogo.eagle.core.function.call.v2x.CallLimitingVelocityListenerManager.invokeOnLimitingVelocityChange import com.mogo.eagle.core.function.obu.mogo.MogoObuConst.TAG_MOGO_OBU import com.mogo.eagle.core.function.obu.mogo.utils.TrafficDataConvertUtilsNew import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -577,7 +572,7 @@ class MogoPrivateObuNewManager private constructor() { } /** - * 地图匹配 是OBU算法输出地图匹配结果,主车匹配道路哪条路或者哪条车道 TODO + * 地图匹配 是OBU算法输出地图匹配结果,主车匹配道路哪条路或者哪条车道 */ override fun onMogoObuMapMath(data: MogoObuMapMathData?) { super.onMogoObuMapMath(data) @@ -615,7 +610,7 @@ class MogoPrivateObuNewManager private constructor() { * 获取消息的方位 车辆相关 */ private fun getMessageDirection(targetClassification: Int): WarningDirectionEnum { - // CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "预警红边:预警方向->$targetClassification") +// CallerLogger.d("$M_OBU${TAG_MOGO_OBU}", "预警红边:预警方向->$targetClassification") return when (targetClassification) { MogoObuConstants.VEH_TARGET_POSITION.AHEAD_IN_LANE, MogoObuConstants.VEH_TARGET_POSITION.ONCOMING_IN_LANE -> WarningDirectionEnum.ALERT_WARNING_TOP //正前方 @@ -844,75 +839,68 @@ class MogoPrivateObuNewManager private constructor() { //这里需要根据真实数据确定 index 取值方式 val currentLight = lights[0] CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "$M_OBU${TAG_MOGO_OBU}", "currentLight = $currentLight ---currentLight.phase = ${currentLight.phaseId} ---appId = $appId" ) - // 闯红灯预警 + // 闯红灯预警,绿波通行和闯红灯是互斥的 when (appId) { 0x0 -> {//不可用 V2I_RLVW_VIOLATION_TYPE_UNAVAILABLE 无效 } 0x1 -> {//闯红灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_RED_LIGHT TODO 需要约束一个红灯周期只显示一次 - // CallerHmiManager.disableWarningV2X(appId.toString()) -// CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}","changeTrafficLightStatus 闯红灯 --------> ") - // ttsContent = EventTypeEnumNew.getWarningTts(appId.toString()) - // alertContent = EventTypeEnumNew.getWarningContent(appId.toString()) - // CallerHmiManager.warningV2X( - // appId.toString(), alertContent, ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - // appId.toString(), null, true, 5000L, MsgBoxType.OBU - // ) +// CallerHmiManager.disableWarningV2X(0x2.toString()) +// CallerLogger.d("$M_OBU${TAG_MOGO_OBU}","changeTrafficLightStatus 闯红灯 --------> ") +// ttsContent = EventTypeEnumTrafficLight.getWarningTts(appId.toString()) +// alertContent = EventTypeEnumTrafficLight.getWarningContent(appId.toString()) +// CallerHmiManager.warningV2X( +// appId.toString(), alertContent, ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 +// appId.toString(), null, true, 5000L) } - 0x2 -> {//绿波通行引导 V2I_RLVW_VIOLATION_TYPE_NO_VIOLATION TODO 需要约束一个绿灯周期只显示一次 - ttsContent = EventTypeEnumNew.getWarningTts(appId.toString()) - alertContent = EventTypeEnumNew.getWarningContent(appId.toString()) - CallerMsgBoxManager.saveMsgBox( - MsgBoxBean( - MsgBoxType.OBU, - V2XMsg( - appId.toString(), - alertContent, - ttsContent - ) - ) - ) - CallerHmiManager.warningV2X( - appId.toString(), alertContent, ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - appId.toString(), null, true, 3000L - ) - - // 拼接建议速度 - // CallerLogger.d( - // "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - // "绿波通行引导 --------> speed_min = ${currentLight.suggestMinSpeed} --speed_max = ${currentLight.suggestMaxSpeed}" - // ) - // val adviceSpeed = - // "${currentLight.suggestMinSpeed*3.6} - ${currentLight.suggestMaxSpeed*3.6}" - // val adviceSpeedTts = - // "${currentLight.suggestMinSpeed*3.6}到${currentLight.suggestMaxSpeed*3.6}" - // ttsContent = - // String.format( - // EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType), - // adviceSpeedTts - // ) - // alertContent = - // String.format( - // EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType), - // adviceSpeed - // ) - // val maxSpeed = currentLight.suggestMaxSpeed*3.6 - // if (maxSpeed > 0) { - // CallerHmiManager.warningV2X( - // EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType, - // alertContent, - // ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - // appId.toString(), - // null, - // true, - // 5000L, - // MsgBoxType.OBU - // ) - // } + 0x2 -> { //绿波通行引导 V2I_RLVW_VIOLATION_TYPE_NO_VIOLATION TODO 需要约束一个绿灯周期只显示一次 +// CallerHmiManager.disableWarningV2X(0x1.toString()) +// CallerLogger.d( +// "$M_OBU${TAG_MOGO_OBU}", +// "speed_min = ${currentLight.suggestMinSpeed} --speed_max = ${currentLight.suggestMaxSpeed}" +// ) +// val adviceSpeed = +// "${currentLight.suggestMinSpeed} - ${currentLight.suggestMaxSpeed}" +// val adviceSpeedTts = +// "${currentLight.suggestMinSpeed}到${currentLight.suggestMaxSpeed}" +// ttsContent = +// String.format( +// EventTypeEnumTrafficLight.getWarningTts(appId.toString()), +// adviceSpeedTts +// ) +// alertContent = +// String.format( +// EventTypeEnumTrafficLight.getWarningContent(appId.toString()), +// adviceSpeed +// ) +// +// val maxSpeed = currentLight.suggestMaxSpeed +// if (maxSpeed > 0) { +// CallerMsgBoxManager.saveMsgBox( +// MsgBoxBean( +// MsgBoxType.OBU, +// V2XMsg( +// EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType, +// alertContent, +// ttsContent +// ) +// ) +// ) +// +// CallerHmiManager.warningV2X( +// EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType, +// alertContent, +// ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 +// appId.toString(), +// null, +// true, +// 5000L +// ) +// } } } @@ -933,6 +921,7 @@ class MogoPrivateObuNewManager private constructor() { val red = currentLight.countDown.toInt() CallerHmiManager.changeCountdownRed(red) } + // 绿灯 4, 5, 6 -> { if (!isGreenLight) { @@ -943,52 +932,8 @@ class MogoPrivateObuNewManager private constructor() { CallerHmiManager.showWarningTrafficLight(3, 2) val green = currentLight.countDown.toInt() CallerHmiManager.changeCountdownGreen(green) - //防止数据出现问题的容错 - CallerHmiManager.changeCountdownRed(0) - CallerHmiManager.changeCountdownYellow(0) - // 拼接建议速度 - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "speed_min = ${currentLight.suggestMinSpeed} --speed_max = ${currentLight.suggestMaxSpeed}" - ) - val adviceSpeed = - "${currentLight.suggestMinSpeed} - ${currentLight.suggestMaxSpeed}" - val adviceSpeedTts = - "${currentLight.suggestMinSpeed}到${currentLight.suggestMaxSpeed}" - ttsContent = - String.format( - EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType), - adviceSpeedTts - ) - alertContent = - String.format( - EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType), - adviceSpeed - ) - - val maxSpeed = currentLight.suggestMaxSpeed - if (maxSpeed > 0) { - CallerMsgBoxManager.saveMsgBox( - MsgBoxBean( - MsgBoxType.OBU, - V2XMsg( - EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType, - alertContent, - ttsContent - ) - ) - ) - CallerHmiManager.warningV2X( - EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType, - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - appId.toString(), - null, - true, - 3000L - ) - } } + // 黄灯 7, 8 -> { CallerHmiManager.disableWarningV2X(appId.toString()) diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumTrafficLight.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumTrafficLight.kt new file mode 100644 index 0000000000..4b3af24b5d --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumTrafficLight.kt @@ -0,0 +1,71 @@ +package com.mogo.eagle.core.data.enums + +import com.mogo.eagle.core.data.R + + +/** + * 交通信号灯 + */ +enum class EventTypeEnumTrafficLight( + val poiType: String, val poiTypeStr: String = "", + val poiTypeStrVr: String = "", + val poiTypeSrcVr: Int = R.drawable.v2x_icon_live_logo, + val content: String = "", val tts: String = "" +) { + + TYPE_USECASE_ID_IVP_RED( + 0x1.toString(), + "闯红灯预警", + poiTypeSrcVr = R.drawable.icon_warning_v2x_traffic_lights_red, + content = "路口红灯,禁止通行", + tts = "路口红灯,禁止通行" + ), + TYPE_USECASE_ID_IVP_GREEN( + 0x2.toString(), + "绿波通行", + poiTypeSrcVr = R.drawable.icon_warning_v2x_traffic_lights_green, + content = "建议车速 %s KM/H", + tts = "建议车速 %s KM/H" + ), + + TYPE_ERROR( + 0.toString(), + "未知/错误/异常", + poiTypeSrcVr = R.drawable.icon_warning_v2x_abnormal_vehicle, + content = "", + tts = "" + ); + + + companion object { + @JvmStatic + fun getWarningIcon(poiType: String?): Int { + return when (poiType) { + TYPE_USECASE_ID_IVP_RED.poiType -> TYPE_USECASE_ID_IVP_RED.poiTypeSrcVr + TYPE_USECASE_ID_IVP_GREEN.poiType -> TYPE_USECASE_ID_IVP_GREEN.poiTypeSrcVr + + else -> TYPE_ERROR.poiTypeSrcVr + } + } + + @JvmStatic + fun getWarningContent(poiType: String?): String { + return when (poiType) { + TYPE_USECASE_ID_IVP_RED.poiType -> TYPE_USECASE_ID_IVP_RED.content + TYPE_USECASE_ID_IVP_GREEN.poiType -> TYPE_USECASE_ID_IVP_GREEN.content + + else -> TYPE_ERROR.content + } + } + + @JvmStatic + fun getWarningTts(poiType: String?): String { + return when (poiType) { + TYPE_USECASE_ID_IVP_RED.poiType -> TYPE_USECASE_ID_IVP_RED.tts + TYPE_USECASE_ID_IVP_GREEN.poiType -> TYPE_USECASE_ID_IVP_GREEN.tts + else -> TYPE_ERROR.tts + } + } + } + +} \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumWeaknessTraffic.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumWeaknessTraffic.kt index 177160dbb9..8ca4806dc1 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumWeaknessTraffic.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumWeaknessTraffic.kt @@ -20,10 +20,10 @@ enum class EventTypeEnumWeaknessTraffic( content = "注意机动车", tts = "注意机动车" ), - TYPE_USECASE_ID_VRUCW_NOT_MOTOR_VEHICLES( //TODO 图标需要换 + TYPE_USECASE_ID_VRUCW_NOT_MOTOR_VEHICLES( 2.toString(), "弱势交通参与者碰撞预警", - poiTypeSrcVr = R.drawable.icon_warning_v2x_motorcycle_collision, + poiTypeSrcVr = R.drawable.icon_warning_v2x_motobike, content = "注意非机动车", tts = "注意非机动车" ), diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_motobike.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_motobike.png new file mode 100644 index 0000000000000000000000000000000000000000..1ae7992c08dc741fc07bcf3f9114fb31f5ffbc51 GIT binary patch literal 18424 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 literal 0 HcmV?d00001