diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt index 0d3385ee23..178fe0c3dc 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt @@ -18,7 +18,10 @@ import com.mogo.eagle.core.utilcode.mogo.logger.* import com.mogo.eagle.core.utilcode.util.* import com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.airoad.* import com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.airoad.AiRoadMarker.Marker +import mogo.telematics.pad.MessagePad.Header import mogo.telematics.pad.MessagePad.TrackedObject +import mogo.v2x.MogoV2X +import mogo.v2x.MogoV2X.RSI_PB /** * V2N上车相关事件绘制 @@ -28,17 +31,19 @@ internal object V2NIdentifyDrawer { private const val TAG = "V2NIdentifyDataSubscriber" - private const val MSG_WHAT_DRAW_ALL = 0x1010 + private const val MSG_WHAT_DRAW_SHIGONE = 0x1010 // 道路施工 + private const val MSG_WHAT_DRAW_SHIGU = 0x1011 // 交通事故 + private const val MSG_WHAT_DRAW_YONGDU = 0x1012 // 交通拥堵 private val callback = Handler.Callback { msg -> - if (msg.what == MSG_WHAT_DRAW_ALL) { + if (msg.what == MSG_WHAT_DRAW_SHIGONE || msg.what == MSG_WHAT_DRAW_SHIGU) { val events = msg.obj as? List<*> if (events == null || events.isEmpty()) { return@Callback true } val car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() val filtered = events.filterIsInstance(TrackedObject::class.java).filter { itx -> - DrivingDirectionUtils.getDegreeOfCar2Poi(car.longitude, car.latitude, itx.longitude, itx.latitude, car.heading.toInt()) <= 90 + DrivingDirectionUtils.getDegreeOfCar2Poi(car.longitude, car.latitude, itx.longitude, itx.latitude, car.heading.toInt()) < 90 } if (filtered.isEmpty()) { return@Callback true @@ -75,6 +80,61 @@ internal object V2NIdentifyDrawer { CallerVisualAngleManager.changeAngle(RoadEvent) } + override fun onDismiss() { + super.onDismiss() + CallerVisualAngleManager.changeAngle(Default()) + } + }, ALERT_WARNING_TOP, 10000, false) + } + }.receive() + } + } else if (msg.what == MSG_WHAT_DRAW_YONGDU) { + val events = msg.obj as? List<*> + if (events == null || events.isEmpty()) { + return@Callback true + } + val car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + val filtered = events.filterIsInstance(MogoV2X.RTEData_PB::class.java).filter { itx -> + val eventLon = itx.eventPos?.offsetLL?.positionLatLon?.lon?.let { it * 1.0 / 10_000_000 } ?: 0.0 + val eventLat = itx.eventPos?.offsetLL?.positionLatLon?.lat?.let { it * 1.0 / 10_000_000 } ?: 0.0 + DrivingDirectionUtils.getDegreeOfCar2Poi(car.longitude, car.latitude, eventLon, eventLat, car.heading.toInt()) < 90 + } + if (filtered.isEmpty()) { + return@Callback true + } + filtered.forEach { itx -> + val id = itx.rteId.toString() + val lon = itx.eventPos?.offsetLL?.positionLatLon?.lon?.let { it * 1.0 / 10_000_000 } ?: 0.0 + val lat = itx.eventPos?.offsetLL?.positionLatLon?.lat?.let { it * 1.0 / 10_000_000 } ?: 0.0 + AiRoadMarker.aiMakers.getOrPut(id) { + AiRoadMarker().apply { + val poiType = getPoiType(itx.eventType).poiType + marker(Marker(id, poiType, lon, lat, car.heading, null, null, + V2XRoadEventEntity().also { e -> + e.poiType = poiType + e.location = MarkerLocation().also { l -> + val p = CoordinateTransform.WGS84ToGCJ02(lon, lat) + l.lon = p[0] + l.lat = p[1] + l.angle = car.heading + } + e.noveltyInfo = MarkerExploreWay().also { + it.poiType = poiType + it.location = e.location + it.polygon = emptyList() + } + }), true, isDrawRoadLine(poiType)) + + val distance = CoordinateUtils.calculateLineDistance(lon, lat, car.longitude, car.latitude) + val alertContent = getAlertContent(poiType, distance.toDouble()) + val ttsContent = getTtsContent(poiType, distance.toDouble()) + saveMsgBox(MsgBoxBean(V2X, V2XMsg(poiType, alertContent, ttsContent))) + CallerHmiManager.warningV2X(poiType, alertContent, ttsContent, object : IMoGoWarningStatusListener { + override fun onShow() { + super.onShow() + CallerVisualAngleManager.changeAngle(RoadEvent) + } + override fun onDismiss() { super.onDismiss() CallerVisualAngleManager.changeAngle(Default()) @@ -95,6 +155,9 @@ internal object V2NIdentifyDrawer { EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU.poiType -> { "前方${distance.toInt()}米交通事故" } + EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION.poiType -> { + "前方${distance.toInt()}米交通拥堵" + } else -> { throw AssertionError("error!!!") } @@ -109,6 +172,9 @@ internal object V2NIdentifyDrawer { EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU.poiType -> { "前方${distance.toInt()}米交通事故" } + EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION.poiType -> { + "前方${distance.toInt()}米交通拥堵" + } else -> { throw AssertionError("error!!!") } @@ -119,7 +185,7 @@ internal object V2NIdentifyDrawer { return EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType == poiType } - private fun getPoiType(type: Int): EventTypeEnumNew = if (type == 501 || type == 502) EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG else if (type == 13) EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU else throw AssertionError("error!!!") + private fun getPoiType(type: Int): EventTypeEnumNew = if (type == 501 || type == 502) EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG else if (type == 13) EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU else if (type == 102) EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION else throw AssertionError("error!!!") private val handler by lazy { val thread = HandlerThread("v2n_identify_drawer") @@ -131,17 +197,42 @@ internal object V2NIdentifyDrawer { override fun onAutopilotIdentifyDataUpdate(trafficData: List?) { super.onAutopilotIdentifyDataUpdate(trafficData) - val events = trafficData?.filter { it.type == 501 || it.type == 502 || it.type == 13 } + val shiGong = trafficData?.filter { it.type == 501 || it.type == 502 } Logger.d(TAG, "--- onAutopilotIdentifyDataUpdate -- : trafficData: ${ trafficData?.joinToString(",") }") - if (events != null && events.isNotEmpty()) { - draw(events) + if (shiGong != null && shiGong.isNotEmpty()) { + drawShiGong(shiGong) + } + val shiGu = trafficData?.filter { it.type == 13 } + if (shiGu != null && shiGu.isNotEmpty()) { + drawShiGu(shiGu) + } + } + + override fun onAutopilotV2nCongestionEvent(header: Header, rsi: RSI_PB) { + super.onAutopilotV2nCongestionEvent(header, rsi) + rsi.rsiFrame?.rtes?.rteDataList?.filter { + it.eventType == 102 + }?.takeIf { + it.isNotEmpty() + }?.also { + drawYongDu(it) } } } - private fun draw(events: List) { - handler.removeMessages(MSG_WHAT_DRAW_ALL) - handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_ALL, events)) + private fun drawShiGong(events: List) { + handler.removeMessages(MSG_WHAT_DRAW_SHIGONE) + handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_SHIGONE, events)) + } + + private fun drawShiGu(events: List) { + handler.removeMessages(MSG_WHAT_DRAW_SHIGU) + handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_SHIGU, events)) + } + + private fun drawYongDu(events: List) { + handler.removeMessages(MSG_WHAT_DRAW_YONGDU) + handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_YONGDU, events)) } fun init() { 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 68066f6bf9..657e8df8b2 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 @@ -53,6 +53,7 @@ import com.mogo.eagle.core.function.call.obu.CallerObuMapMathListenerManager import com.mogo.eagle.core.function.call.obu.CallerObuWarningRsiListenerManager import com.mogo.eagle.core.function.call.obu.CallerObuWarningRsmListenerManager import com.mogo.eagle.core.function.call.obu.CallerObuWarningSpatListenerManager +import com.mogo.eagle.core.function.call.v2x.* import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.support.obu.ObuScene @@ -640,7 +641,7 @@ class MoGoAdasListenerImpl : OnAdasListener { * @param rsi 数据 */ override fun onV2nCongestionEvent(header: MessagePad.Header, rsi: MogoV2X.RSI_PB) { - + CallerAutopilotIdentifyListenerManager.invokeAutopilotV2nCongestionEvent(header, rsi) } /** diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotIdentifyListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotIdentifyListener.kt index b9dad6c968..090300392f 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotIdentifyListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotIdentifyListener.kt @@ -1,6 +1,7 @@ package com.mogo.eagle.core.function.api.autopilot import mogo.telematics.pad.MessagePad +import mogo.v2x.* import perception.TrafficLightOuterClass /** @@ -35,4 +36,12 @@ interface IMoGoAutopilotIdentifyListener { */ fun onAutopilotPerceptionTrafficLight(trafficLights: TrafficLightOuterClass.TrafficLights?){} + + /** + * 交通拥堵事件上车数据回调 + * @param header 消息头信息 + * @param rsi 交通拥堵事件数据实体 + */ + fun onAutopilotV2nCongestionEvent(header: MessagePad.Header, rsi: MogoV2X.RSI_PB) {} + } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotIdentifyListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotIdentifyListenerManager.kt index f458436d49..8d57600352 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotIdentifyListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotIdentifyListenerManager.kt @@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.call.autopilot import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener import com.mogo.eagle.core.function.call.base.CallerBase import mogo.telematics.pad.MessagePad +import mogo.v2x.* import perception.TrafficLightOuterClass /** @@ -60,4 +61,14 @@ object CallerAutopilotIdentifyListenerManager : CallerBase