Merge remote-tracking branch 'origin/dev_robotaxi-d_240705_6.5.0' into dev_robotaxi-d_240705_6.5.0

This commit is contained in:
yangyakun
2024-07-08 10:25:40 +08:00
24 changed files with 584 additions and 160 deletions

View File

@@ -149,6 +149,30 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--自动探查-->
<com.mogo.eagle.core.function.hmi.ui.notice.exploration.AutomaticExplorationView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="@dimen/dp_350"
android:layout_marginRight="@dimen/dp_50"
app:explorationUser="driver"
android:visibility="gone"
/>
<!--红绿灯提醒-->
<com.mogo.eagle.core.function.hmi.ui.notice.traffic.TrafficLightPromptView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="@dimen/dp_350"
android:layout_marginRight="@dimen/dp_50"
app:promptUser="driver"
android:visibility="gone"
/>
<!-- 地图marker点击触发路侧直播 -->
<com.mogo.eagle.core.function.hmi.ui.camera.RoadCrossLiveView
android:layout_width="@dimen/dp_800"
@@ -197,6 +221,17 @@
android:visibility="gone"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--融合红绿灯-->
<com.mogo.eagle.core.function.hmi.ui.widget.FusionTrafficLightView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="@dimen/hmi_traffic_light_layout_margin_top"
android:visibility="gone"
app:fusionLightUser="driver"
/>
<!--接管提示-->
<com.mogo.eagle.core.function.hmi.ui.vehicle.TakeOverView
@@ -373,6 +408,16 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<com.mogo.eagle.core.function.hmi.ui.v2n.RoadV2NEventWindowView
android:id="@+id/roadV2NEventWindowView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_32"
android:layout_marginBottom="@dimen/dp_30"
app:layout_constraintBottom_toTopOf="@+id/smallMapView"
app:layout_constraintRight_toRightOf="parent"
android:visibility="gone"/>
<com.mogo.och.common.module.wigets.LoadingMapStatusView
android:layout_width="match_parent"
android:layout_height="match_parent" />

View File

@@ -84,6 +84,18 @@
app:layout_constraintTop_toTopOf="parent"
app:traffic_light_user="traffic_light_taxi_p" />
<!--融合红绿灯-->
<com.mogo.eagle.core.function.hmi.ui.widget.FusionTrafficLightView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="@dimen/hmi_traffic_light_layout_margin_top"
android:visibility="gone"
app:fusionLightUser="passenger"
/>
<!--转向灯-->
<com.mogo.eagle.core.function.hmi.ui.vehicle.TurnLightViewStatus
android:layout_width="wrap_content"
@@ -189,6 +201,29 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--自动探查-->
<com.mogo.eagle.core.function.hmi.ui.notice.exploration.AutomaticExplorationView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_50"
android:layout_marginBottom="-80dp"
app:layout_constraintBottom_toTopOf="@id/aciv_xiaozhi_normal"
app:layout_constraintEnd_toEndOf="parent"
android:visibility="gone"
/>
<!--红绿灯提醒-->
<com.mogo.eagle.core.function.hmi.ui.notice.traffic.TrafficLightPromptView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_50"
android:layout_marginBottom="-80dp"
app:layout_constraintBottom_toTopOf="@id/aciv_xiaozhi_normal"
app:layout_constraintEnd_toEndOf="parent"
android:visibility="gone"
app:promptUser="passenger"
/>
<!-- 地图marker点击触发路侧直播 -->
<com.mogo.eagle.core.function.hmi.ui.camera.RoadCrossLiveView
android:layout_width="@dimen/dp_650"
@@ -198,6 +233,15 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.mogo.eagle.core.function.hmi.ui.v2n.RoadV2NEventWindowView
android:id="@+id/roadV2NEventWindowView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_15"
app:layout_constraintBottom_toTopOf="@+id/aciv_xiaozhi_normal"
app:layout_constraintRight_toRightOf="parent"
android:visibility="gone"/>
<!--气泡态消息盒子-->
<com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxBubbleView
android:id="@+id/pmbb_info"

View File

@@ -187,6 +187,42 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--融合红绿灯-->
<com.mogo.eagle.core.function.hmi.ui.widget.FusionTrafficLightView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="@dimen/hmi_traffic_light_layout_margin_top"
android:visibility="gone"
app:fusionLightUser="driver"
/>
<!--自动探查-->
<com.mogo.eagle.core.function.hmi.ui.notice.exploration.AutomaticExplorationView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="@dimen/dp_350"
android:layout_marginRight="@dimen/dp_50"
app:explorationUser="driver"
android:visibility="gone"
/>
<!--红绿灯提醒-->
<com.mogo.eagle.core.function.hmi.ui.notice.traffic.TrafficLightPromptView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="@dimen/dp_350"
android:layout_marginRight="@dimen/dp_50"
app:promptUser="driver"
android:visibility="gone"
/>
<!--接管提示-->
<com.mogo.eagle.core.function.hmi.ui.vehicle.TakeOverView
android:layout_width="@dimen/hmi_take_over_request_width"

View File

@@ -84,6 +84,43 @@
app:layout_constraintTop_toTopOf="parent"
app:traffic_light_user="traffic_light_taxi_p" />
<!--融合红绿灯-->
<com.mogo.eagle.core.function.hmi.ui.widget.FusionTrafficLightView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="@dimen/hmi_traffic_light_layout_margin_top"
android:visibility="gone"
app:fusionLightUser="passenger"
/>
<!--自动探查-->
<com.mogo.eagle.core.function.hmi.ui.notice.exploration.AutomaticExplorationView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_50"
android:layout_marginBottom="-80dp"
app:layout_constraintBottom_toTopOf="@id/aciv_xiaozhi_normal"
app:layout_constraintEnd_toEndOf="parent"
app:explorationUser="passenger"
android:visibility="gone"
/>
<!--红绿灯提醒-->
<com.mogo.eagle.core.function.hmi.ui.notice.traffic.TrafficLightPromptView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_50"
android:layout_marginBottom="-80dp"
app:layout_constraintBottom_toTopOf="@id/aciv_xiaozhi_normal"
app:layout_constraintEnd_toEndOf="parent"
android:visibility="gone"
app:promptUser="passenger"
/>
<!--转向灯-->
<com.mogo.eagle.core.function.hmi.ui.vehicle.TurnLightViewStatus
android:layout_width="wrap_content"

View File

@@ -11,6 +11,7 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.enums.CommunicationType
import com.mogo.eagle.core.data.enums.DataSourceType
import com.mogo.eagle.core.data.enums.EventTypeEnumNew
import com.mogo.eagle.core.data.enums.TrafficTypeEnum
import com.mogo.eagle.core.data.enums.WarningDirectionEnum.ALERT_WARNING_TOP
import com.mogo.eagle.core.data.map.entity.MarkerExploreWay
import com.mogo.eagle.core.data.map.entity.MarkerLocation
@@ -31,6 +32,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerV2XListenerManager.V2NC
import com.mogo.eagle.core.function.call.autopilot.CallerV2nNioEventListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.hmi.CallerRoadV2NEventWindowListenerManager
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.msgbox.CallerMsgBoxManager.saveMsgBox
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
@@ -42,6 +44,8 @@ import com.mogo.eagle.core.utilcode.util.CoordinateUtils
import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.eagle.function.biz.v2x.V2XBizTrace
import com.mogo.eagle.function.biz.v2x.v2n.consts.V2XConst
import com.mogo.eagle.function.biz.v2x.v2n.remove.MarkerWrapper
import com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.airoad.AiRoadMarker
import com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.airoad.AiRoadMarker.Marker
import com.mogo.eagle.function.biz.v2x.v2n.utils.EventDismissBean
@@ -51,6 +55,8 @@ import com.mogo.eagle.function.biz.v2x.v2n.utils.V2NUtils
import com.mogo.eagle.function.biz.v2x.v2n.utils.V2XEventAnalyticsManager
import com.mogo.map.MapDataWrapper
import com.mogo.map.entities.Lane
import com.mogo.map.overlay.core.Level.MAP_MARKER
import com.mogo.map.overlay.point.Point
import mogo.telematics.pad.MessagePad
import mogo.telematics.pad.MessagePad.Header
import mogo.telematics.pad.MessagePad.TrackedObject
@@ -58,6 +64,7 @@ import mogo.telematics.pad.MessagePad.V2nCrossSpeed
import mogo.v2x.MogoV2X
import mogo.v2x.MogoV2X.RSI_PB
import mogo.v2x.MogoV2X.RTEData_PB
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.TimeUnit.SECONDS
import kotlin.math.abs
@@ -73,6 +80,13 @@ internal object V2NIdentifyDrawer: IEventDismissListener {
private const val MSG_WHAT_DRAW_YONGDU = 0x1012 // 交通拥堵
private const val MSG_WHAT_DRAW_OTHER_RETROGRADE_VEHICLE = 0x1013 // 他车倒车/逆行
private const val MSG_WHAT_DRAW_GREEN_WAVE = 0x1014 // 绿波通行
private const val MSG_WHAT_DRAW_PEOPLE_CROSS = 0x1015 // 行人横穿
private val builder_people_cross by lazy {
Point.Options.Builder(V2XConst.V2X_MARKER_OWNER, MAP_MARKER).isUseGps(true).anchorColor("#D65D5AFF").set3DMode(true).icon3DRes(TrafficTypeEnum.TYPE_TRAFFIC_ID_PEOPLE.traffic3DIconId)
}
private val markers by lazy { ConcurrentHashMap<String, MarkerWrapper>() }
private val callback = Handler.Callback { msg ->
if (msg.what == MSG_WHAT_DRAW_SHIGONE || msg.what == MSG_WHAT_DRAW_SHIGU) {
@@ -313,45 +327,49 @@ internal object V2NIdentifyDrawer: IEventDismissListener {
V2XBizTrace.onAck(TAG, mapOf("other_retrograde_vehicle" to "event == null"), true)
return@Callback true
}
val eventLocation = when (event.gnssType) {
0 -> CoordinateTransform.GCJ02ToWGS84(event.longitude, event.latitude)
else -> arrayOf(event.longitude, event.latitude)
}
val carLocation = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84()
val distance = CoordinateUtils.calculateLineDistance(carLocation.longitude, carLocation.latitude, eventLocation[0], eventLocation[1])
if (distance > 150) {
Logger.i(TAG, "other_retrograde_vehicle --> distance > 150")
V2XBizTrace.onAck(TAG, mapOf("other_retrograde_vehicle" to "distance > 150"), true)
return@Callback true
}
val isDriver = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
val newEventId = "other_retrograde_vehicle_${event.eventId}_${event.timestamp}_${event.longitude}_${event.latitude}"
val cameraIp = if(TextUtils.isEmpty(event.exts)) ""
else (GsonUtils.fromJson(event.exts, Map::class.java)["cameraIp"])?:""
// 弹事件框
CallerRoadV2NEventWindowListenerManager.showLiveVideo(
newEventId,
event.timestamp,
EventTypeEnumNew.getUpdateIconRes(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType),
String.format(EventTypeEnumNew.getAlarmContent(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType), distance.toInt()),
isDriver,
cameraIp.toString(),
event.longitude,
event.latitude)
// 高精地图绘制-添加
//TODO
EventDismissManager.addEvent(
TAG,
EventDismissBean(
AiRoadMarker.aiMakers.getOrPut(event.eventId) {
AiRoadMarker()
}.apply {
val eventLocation = when (event.gnssType) {
0 -> CoordinateTransform.GCJ02ToWGS84(event.longitude, event.latitude)
else -> arrayOf(event.longitude, event.latitude)
}
val carLocation = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84()
val distance = CoordinateUtils.calculateLineDistance(carLocation.longitude, carLocation.latitude, eventLocation[0], eventLocation[1])
if (distance > 150) {
Logger.i(TAG, "other_retrograde_vehicle --> distance > 150")
V2XBizTrace.onAck(TAG, mapOf("other_retrograde_vehicle" to "distance > 150"), true)
return@Callback true
}
val isDriver = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
val newEventId = "other_retrograde_vehicle_${event.eventId}_${event.timestamp}_${event.longitude}_${event.latitude}"
val cameraIp = if(TextUtils.isEmpty(event.exts)) ""
else (GsonUtils.fromJson(event.exts, Map::class.java)["cameraIp"])?:""
// 弹事件框
CallerRoadV2NEventWindowListenerManager.showLiveVideo(
newEventId,
event.timestamp,
EventTypeEnumNew.getUpdateIconRes(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType),
String.format(EventTypeEnumNew.getAlarmContent(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType), distance.toInt()),
isDriver,
cameraIp.toString(),
event.longitude,
event.latitude,
150,
20,
-1,
event.targetIdsList.joinToString(separator = ",")
)
)
event.latitude)
}.also {
it.marker(Marker(event.eventId, EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType, event.longitude, event.latitude, 0.0), drawMarker = true, false, isHighFrequency = true)
}
// EventDismissManager.addEvent(
// TAG,
// EventDismissBean(
// newEventId,
// event.longitude,
// event.latitude,
// 150,
// 20,
// -1,
// event.targetIdsList.joinToString(separator = ",")
// )
// )
} else if (msg.what == MSG_WHAT_DRAW_GREEN_WAVE) {
val data = msg.obj as? V2nCrossSpeed ?: return@Callback true
val destX = data.lng
@@ -385,6 +403,35 @@ internal object V2NIdentifyDrawer: IEventDismissListener {
}
}
}
} else if (msg.what == MSG_WHAT_DRAW_PEOPLE_CROSS) {
val data = msg.obj as? MessagePad.Event ?: return@Callback true
AiRoadMarker.aiMakers.getOrPut(data.eventId) {
AiRoadMarker()
}.apply {
val isDriver = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
val carLocation = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84()
val distance = CoordinateUtils.calculateLineDistance(carLocation.longitude, carLocation.latitude, data.longitude, data.latitude)
if (distance > 150) {
Logger.i(TAG, "people cross --> distance > 150")
V2XBizTrace.onAck(TAG, mapOf("people cross" to "distance > 150"), true)
return@Callback true
}
val cameraIp = if(TextUtils.isEmpty(data.exts)) ""
else (GsonUtils.fromJson(data.exts, Map::class.java)["cameraIp"])?:""
// 弹事件框
CallerRoadV2NEventWindowListenerManager.showLiveVideo(
data.eventId,
data.timestamp,
EventTypeEnumNew.getUpdateIconRes(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType),
String.format(EventTypeEnumNew.getAlarmContent(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType), distance.toInt()),
isDriver,
cameraIp.toString(),
data.longitude,
data.latitude)
}.also {
it.marker(Marker(data.eventId, EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType, data.longitude, data.latitude, 0.0), drawMarker = true, false, isHighFrequency = true)
}.receive()
}
true
}
@@ -558,11 +605,10 @@ internal object V2NIdentifyDrawer: IEventDismissListener {
private fun drawOtherRetrogradeVehicle(event: MessagePad.Event) {
Logger.i("V2NIdentifyDrawer", "---drawOtherRetrogradeVehicle --- :${event.toString()}, [${FunctionBuildConfig.v2nMainSwitch}, ${FunctionBuildConfig.isNewV2NData}]")
// if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) {
//
// }
handler.removeMessages(MSG_WHAT_DRAW_OTHER_RETROGRADE_VEHICLE)
handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_OTHER_RETROGRADE_VEHICLE, event))
if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) {
handler.removeMessages(MSG_WHAT_DRAW_OTHER_RETROGRADE_VEHICLE)
handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_OTHER_RETROGRADE_VEHICLE, event))
}
}
private fun drawGreenWave(crossSpeed: V2nCrossSpeed) {
@@ -573,6 +619,14 @@ internal object V2NIdentifyDrawer: IEventDismissListener {
}
}
private fun drawPeopleCross(event: MessagePad.Event) {
Log.d("V2NIdentifyDrawer", "---drawPeopleCross---: $event, [${FunctionBuildConfig.v2nMainSwitch}, ${FunctionBuildConfig.isNewV2NData}]")
if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) {
handler.removeMessages(MSG_WHAT_DRAW_PEOPLE_CROSS)
handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_PEOPLE_CROSS, event))
}
}
private val nioEventListener = object : IMoGoV2nNioEventListener {
override fun onV2nNioCongestionEvent(congestion: MessagePad.V2nCongestion) {
super.onV2nNioCongestionEvent(congestion)
@@ -582,7 +636,7 @@ internal object V2NIdentifyDrawer: IEventDismissListener {
override fun onV2nNioCrossoverEvent(event: MessagePad.Event) {
super.onV2nNioCrossoverEvent(event)
V2XBizTrace.onAck(event,"onV2nNioCrossoverEvent", true)
//TODO renwj
drawPeopleCross(event)
}
override fun onV2nNioGreenWavePassageEvent(crossSpeed: V2nCrossSpeed) {
@@ -613,19 +667,17 @@ internal object V2NIdentifyDrawer: IEventDismissListener {
override fun onEventDismissByDistance(event: EventDismissBean) {
Logger.i(TAG, "onEventDismissByDistance --> ${event.toString()}")
if (event.eventId.startsWith("other_retrograde_vehicle")) {
V2XBizTrace.onAck(TAG, mapOf("other_retrograde_vehicle" to "onEventDismissByDistance"), true)
val targetIds = event.exts.split(",")
//TODO 高精地图绘制 移除
}
// if (event.eventId.startsWith("other_retrograde_vehicle")) {
// V2XBizTrace.onAck(TAG, mapOf("other_retrograde_vehicle" to "onEventDismissByDistance"), true)
// val targetIds = event.exts.split(",")
// }
}
override fun onEventDismissByExpired(event: EventDismissBean) {
Logger.i(TAG, "onEventDismissByExpired --> ${event.toString()}")
if (event.eventId.startsWith("other_retrograde_vehicle")) {
V2XBizTrace.onAck(TAG, mapOf("other_retrograde_vehicle" to "onEventDismissByExpired"), true)
val targetIds = event.exts.split(",")
//TODO 高精地图绘制 移除
}
// if (event.eventId.startsWith("other_retrograde_vehicle")) {
// V2XBizTrace.onAck(TAG, mapOf("other_retrograde_vehicle" to "onEventDismissByExpired"), true)
// val targetIds = event.exts.split(",")
// }
}
}

View File

@@ -19,7 +19,7 @@ import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicReference
data class MarkerWrapper(val id: String, val lon: Double, val lat: Double, val coordinateType: Int, var markers: ArrayList<Point>? = null, var lines: ArrayList<Polyline>? = null, var elapsedDistance: Int = 500, var elapsedDuration: Long = -1, var onRemoved:((id: String) -> Unit)? = null) {
data class MarkerWrapper(val id: String, var lon: Double, var lat: Double, val coordinateType: Int, var markers: ArrayList<Point>? = null, var lines: ArrayList<Polyline>? = null, var elapsedDistance: Int = 500, var elapsedDuration: Long = -1, var onRemoved:((id: String) -> Unit)? = null) {
fun addLine(line: Polyline) {
var ll = this.lines
@@ -215,4 +215,8 @@ object MarkerRemoveManager {
handler.postDelayed(checkTask, 1000)
}
}
fun peekMarker(id: String): MarkerWrapper? {
return showedMarkers.find { it.id == id }
}
}

View File

@@ -21,11 +21,15 @@ import com.mogo.eagle.function.biz.v2x.v2n.remove.MarkerRemoveManager
import com.mogo.eagle.function.biz.v2x.v2n.remove.MarkerWrapper
import com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.road.V2XAiRoadEventMarker
import com.mogo.map.MogoData.Companion.mogoMapData
import com.mogo.map.overlay.core.Level
import com.mogo.map.overlay.core.Level.MAP_MARKER
import com.mogo.map.overlay.core.Level.ROAD_CENTER_LINE
import com.mogo.map.overlay.line.Polyline
import com.mogo.map.overlay.point.Point
import com.zhidaoauto.map.data.road.CenterLine
import java.util.*
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.CopyOnWriteArraySet
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicInteger
import java.util.concurrent.atomic.AtomicReference
@@ -42,10 +46,19 @@ class AiRoadMarker {
private const val TAG = "AiRoadMarker"
private val COLOR_START = Color.parseColor("#002ABAD9")
private val COLOR_END = Color.parseColor("#66FF7A30")
private val builders by lazy { ConcurrentHashMap<String, Point.Options.Builder>() }
private val markerIds by lazy { CopyOnWriteArraySet<String>() }
internal fun getOrPutPointOptionBuilder(id: String, owner: String, level: Level): Point.Options.Builder {
return builders.getOrPut(id) { Point.Options.Builder(owner, level) }
}
}
private val marker by lazy { AtomicReference<Marker>() }
private val overlayManager by lazy {
CallerMapUIServiceManager.getOverlayManager()
}
@@ -84,68 +97,98 @@ class AiRoadMarker {
.setWidth(50f).setUseGps(true)
}
fun marker(marker: Marker, drawMarker: Boolean, drawRoadLine: Boolean = false) {
v2nDrawHandler.post {
val location = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84()
this.marker.set(marker)
var elapsedDistance = 500
if (marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType) {
elapsedDistance = 10
}
var elapsedDuration = -1L
if (marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType) {
elapsedDuration = TimeUnit.SECONDS.toMillis(3)
}
val wrapper = MarkerWrapper(marker.id, marker.poi_lon, marker.poi_lat, 1, elapsedDistance = elapsedDistance, elapsedDuration = elapsedDuration)
if (drawMarker) {
marker.entity?.apply { roadMarker.drawMarkers(this, wrapper) }
}
if (drawRoadLine) {
//施工中心点前方的自车行驶方向上300米距离
var l1: CenterLine? = null
var l2: CenterLine? = null
mogoMapData.get()?.getCenterLineRangeInfo(
marker.poi_lon,
marker.poi_lat,
location.heading.toFloat(),
300f, call = { result ->
//施工中心点后方的自车行驶方向上300米距离
result?.let {
V2XBizTrace.onAck("$TAG -marker-3-l1:", it)
l1 = result
}
countDown.incrementAndGet()
realMark(marker, wrapper, l1, l2, location.heading)
})
mogoMapData.get()?.getCenterLineRangeInfo(
marker.poi_lon,
marker.poi_lat,
location.heading.toFloat(),
-200f, call = { result ->
result?.let {
V2XBizTrace.onAck("$TAG -marker-3-l2:", it)
l2 = result
}
countDown.incrementAndGet()
realMark(marker, wrapper, l1, l2, location.heading)
})
fun marker(marker: Marker, drawMarker: Boolean, drawRoadLine: Boolean = false, isHighFrequency:Boolean = false) {
val markerId = marker.id
if (isHighFrequency && drawMarker) {
val builder = getOrPutPointOptionBuilder(markerId, V2XConst.V2X_MARKER_OWNER, MAP_MARKER)
builder
.set3DMode(true)
.isUseGps(true)
.icon3DRes(EventTypeEnumNew.getMarker3DRes(marker.poiType))
.anchorColor("#D65D5AFF")
.longitude(marker.poi_lon)
.latitude(marker.poi_lat)
CallerMapUIServiceManager.getOverlayManager()?.showOrUpdatePoint(builder.build())?.let { p ->
if (!markerIds.contains(markerId)) {
markerIds.add(markerId)
val wrapper = MarkerWrapper(markerId, marker.poi_lon, marker.poi_lat, 1, elapsedDistance = 10)
wrapper.onRemoved = {
builders.remove(markerId)
markerIds.remove(p.id)
}
wrapper.addPoint(p)
MarkerRemoveManager.addMarker(wrapper)
} else {
MarkerRemoveManager.peekMarker(markerId)?.also {
it.lon = marker.poi_lon
it.lat = marker.poi_lat
}
}
}
} else {
v2nDrawHandler.post {
val location = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84()
this.marker.set(marker)
var elapsedDistance = 500
if (marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType) {
elapsedDistance = 10
}
var elapsedDuration = -1L
if (marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType) {
elapsedDuration = TimeUnit.SECONDS.toMillis(3)
}
val wrapper = MarkerWrapper(markerId, marker.poi_lon, marker.poi_lat, 1, elapsedDistance = elapsedDistance, elapsedDuration = elapsedDuration)
if (drawMarker) {
marker.entity?.apply { roadMarker.drawMarkers(this, wrapper) }
}
if (drawRoadLine) {
//施工中心点前方的自车行驶方向上300米距离
var l1: CenterLine? = null
var l2: CenterLine? = null
mogoMapData.get()?.getCenterLineRangeInfo(
marker.poi_lon,
marker.poi_lat,
location.heading.toFloat(),
300f, call = { result ->
//施工中心点后方的自车行驶方向上300米距离
result?.let {
V2XBizTrace.onAck("$TAG -marker-3-l1:", it)
l1 = result
}
countDown.incrementAndGet()
realMark(marker, wrapper, l1, l2, location.heading)
})
mogoMapData.get()?.getCenterLineRangeInfo(
marker.poi_lon,
marker.poi_lat,
location.heading.toFloat(),
-200f, call = { result ->
result?.let {
V2XBizTrace.onAck("$TAG -marker-3-l2:", it)
l2 = result
}
countDown.incrementAndGet()
realMark(marker, wrapper, l1, l2, location.heading)
})
}
if (marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType) {
val builder = Polyline.Options.Builder(V2XConst.V2X_MARKER_OWNER, ROAD_CENTER_LINE)
builder.colors(listOf(Color.parseColor("#996DFED0"), Color.parseColor("#CC6DFED0"), Color.parseColor("#C76DFED0"), Color.parseColor("#006DFED0")))
.setWidth(5f)
.setUseGps(true)
.points(listOf(MogoLatLng(location.latitude, location.longitude), MogoLatLng(marker.poi_lat, marker.poi_lon)))
.setIsGradient(true)
.isShowArrow(true)
CallerMapUIServiceManager.getOverlayManager()?.showOrUpdateLine(builder.build())?.also { wrapper.addLine(it) }
if (marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType) {
val builder = Polyline.Options.Builder(V2XConst.V2X_MARKER_OWNER, ROAD_CENTER_LINE)
builder.colors(listOf(Color.parseColor("#996DFED0"), Color.parseColor("#CC6DFED0"), Color.parseColor("#C76DFED0"), Color.parseColor("#006DFED0")))
.setWidth(50f)
.setUseGps(true)
.points(listOf(MogoLatLng(location.latitude, location.longitude), MogoLatLng(marker.poi_lat, marker.poi_lon)))
.setIsGradient(true)
.isShowArrow(true)
CallerMapUIServiceManager.getOverlayManager()?.showOrUpdateLine(builder.build())?.also { wrapper.addLine(it) }
}
wrapper.onRemoved = { id ->
aiMakers.remove(id)
}
MarkerRemoveManager.addMarker(wrapper)
}
wrapper.onRemoved = { id ->
aiMakers.remove(id)
}
MarkerRemoveManager.addMarker(wrapper)
}
}
@Synchronized

View File

@@ -49,7 +49,7 @@ public class V2XRoadEventMarker implements IV2XMarker<V2XRoadEventEntity> {
MarkerLocation location = noveltyInfo.getLocation();
AiRoadMarker.Marker m = new AiRoadMarker.Marker(noveltyInfo.getInfoId(), noveltyInfo.getPoiType(), gpsLocation.second, gpsLocation.first, location.getAngle(), polygons, null, entity);
AiRoadMarker aiMarker = new AiRoadMarker();
aiMarker.marker(m, true, isDrawRoadLine(m.getPoiType()));
aiMarker.marker(m, true, isDrawRoadLine(m.getPoiType()), false);
AiRoadMarker.aiMakers.put(noveltyInfo.getInfoId(), aiMarker);
}
} else {

View File

@@ -4,6 +4,7 @@ import android.content.Context
import android.os.CountDownTimer
import android.os.Handler
import android.util.Log
import com.mogo.commons.voice.AIAssist
import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightResult
import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightStatus
import com.mogo.eagle.core.data.biz.trafficlight.currentRoadTrafficLight
@@ -172,6 +173,26 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight
onTrafficLightPrompt(convert(light.state),light.duration,convert(light.nextState),light.nextDuration,
convert(light.nextTwoState),light.nextTwoDuration)
}
/**
* 司机端提示:
* 车辆等红灯,在红/黄灯剩余5s且下一灯态为绿灯时提示“红灯即将变绿”并在变为绿灯时有提示起步的动效
* 车辆行驶中若判断当前绿灯自车无法通过在绿灯剩余5s且下一灯态为红/黄灯时,提示“蘑菇提醒您及时减速,避免路口急刹”
* 车辆行驶中若判断当前绿灯自车基于当前速度需提速10%以上才可通过时,提示“蘑菇提醒您及时减速,避免路口急刹”
* 车辆行驶中若判断当前红灯自车基于当前速度需降低60%以上才可通过时,提示“蘑菇提醒您及时减速,避免路口急刹”
*/
if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){
if((light.state == FusionTrafficLightOuterClass.FusionLightState.STATE_YELLOW_FUSION || light.state ==FusionTrafficLightOuterClass.FusionLightState.STATE_RED_FUSION)
&& light.duration < 5 && light.nextState == FusionTrafficLightOuterClass.FusionLightState.STATE_GREEN_FUSION){
//语音播放
AIAssist.getInstance(mContext).speakTTSVoice("红灯即将变绿")
}
//TODO 需要知道当前车速和当前位置距离路口的距离
// if(light.state == FusionTrafficLightOuterClass.FusionLightState.STATE_GREEN_FUSION && light.duration < 5){
//
// }
}
}
}
}
@@ -280,7 +301,6 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight
if (filterTelematicUnion(sourceType)) {
return
}
Log.i("xuxinchao","hide msg="+msg+" sourceType="+sourceType)
CallerTrafficLightListenerManager.disableTrafficLight()
}

View File

@@ -419,7 +419,17 @@ class MoGoHmiProvider : IMoGoHmiProvider {
.width(WindowManager.LayoutParams.WRAP_CONTENT)
.height(WindowManager.LayoutParams.WRAP_CONTENT)
.attachToActivity(activity)
.draggable(true)
.gravityInActivity(Gravity.CENTER)
.also {
if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
it.offsetX(960)
it.offsetY(445)
} else {
it.offsetX(980)
it.offsetY(-324)
}
}
.onDismissed {
greenWave.set(null)
}

View File

@@ -91,6 +91,7 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor(
MsgCategory.RECORD_BAG -> {
MsgBoxConfig.recordBagList.add(msgBoxBean)
}
else -> {}
}
if(isShowData){
if(category == MsgCategory.RECORD_BAG){
@@ -159,6 +160,10 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor(
isShowSummary = false
}
}else{
if(msgBoxBean.type == MsgBoxType.V2X){
//鹰眼650需求不再展示气泡态V2X消息
return@post
}
showData(msgBoxBean)
CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true)
}

View File

@@ -70,8 +70,7 @@ class PassengerMsgBoxBubbleView @JvmOverloads constructor(
override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) {
UiThreadHandler.post({
if(category == MsgCategory.NOTICE){
if(msgBoxList.type == MsgBoxType.NOTICE || msgBoxList.type == MsgBoxType.V2X
|| msgBoxList.type == MsgBoxType.OBU){
if(msgBoxList.type == MsgBoxType.NOTICE || msgBoxList.type == MsgBoxType.OBU){
if(isCacheMsg){
//将消息缓存到未播放列表等待小智语音播放完成后取出播放
MsgBoxConfig.unPlayList.add(msgBoxList)

View File

@@ -23,9 +23,15 @@ import com.mogo.eagle.core.function.hmi.R
class AutomaticExplorationAdapter(val context: Context,val user: Int): RecyclerView.Adapter<AutomaticExplorationAdapter.ExplorationHolder>() {
private var data: List<AutoExplorationEntity> ?= null
private var completeListener: CompleteListener ?= null
fun setData(data: List<AutoExplorationEntity>){
this.data = data
notifyDataSetChanged()
}
fun setListener(listener: CompleteListener){
completeListener = listener
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExplorationHolder {
@@ -44,15 +50,17 @@ class AutomaticExplorationAdapter(val context: Context,val user: Int): RecyclerV
override fun onBindViewHolder(holder: ExplorationHolder, position: Int) {
data?.let {
holder.tvExplorationContent.text = it[position].explorationContent
val entity = it[position]
holder.tvExplorationContent.text = entity.explorationContent
val rotationAnim = ObjectAnimator.ofFloat(holder.ivExplorationLoading, "rotation", 0f, 360f)
rotationAnim.repeatCount = it[position].explorationDuration.toInt()/1000
rotationAnim.repeatCount = entity.explorationDuration.toInt()/1000
rotationAnim.repeatMode = ValueAnimator.RESTART
rotationAnim.duration = 1000
rotationAnim.interpolator = LinearInterpolator()
rotationAnim.addListener(object: AnimatorListenerAdapter(){
override fun onAnimationEnd(animation: Animator) {
super.onAnimationEnd(animation)
completeListener?.onComplete(entity)
if(user == 0){
holder.ivExplorationLoading.setImageDrawable(
ContextCompat.getDrawable(
@@ -77,4 +85,8 @@ class AutomaticExplorationAdapter(val context: Context,val user: Int): RecyclerV
var tvExplorationContent: TextView = itemView.findViewById(R.id.tvExplorationContent)
}
interface CompleteListener{
fun onComplete(entity: AutoExplorationEntity)
}
}

View File

@@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.hmi.ui.notice.exploration
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import android.content.Context
import android.os.CountDownTimer
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
@@ -13,7 +14,12 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.mogo.commons.voice.AIAssist
import com.mogo.eagle.core.data.autopilot.AutopilotSummaryInfo
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.MsgCategory
import com.mogo.eagle.core.data.notice.AutoExplorationEntity
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.util.ThreadUtils
@@ -26,7 +32,7 @@ class AutomaticExplorationView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener {
private var user = 0
private var ivClose: ImageView ?= null //关闭按钮
@@ -34,10 +40,12 @@ class AutomaticExplorationView @JvmOverloads constructor(
private var rvExplorationList: RecyclerView ?= null
private var automaticExplorationAdapter: AutomaticExplorationAdapter ?= null
private var rotationAnim: ObjectAnimator ?= null
private var showViewTimer: CountDownTimer ?= null //展示自动探查倒计时
companion object {
private const val TAG = "AutomaticExplorationView"
private const val EXPLORATION_SHOW_TIME = 10000L //自动探查弹窗展示时间
private const val EXPLORATION_HIDE_TIME = 5000L //探查完毕后5秒关闭弹窗
private const val EXPLORATION_SHOW_TIME = 300000L //距离用户在触发上一次事件播报的时间5分钟后自动触发常规道路情况检测
}
init {
@@ -54,20 +62,14 @@ class AutomaticExplorationView @JvmOverloads constructor(
LayoutInflater.from(context).inflate(R.layout.view_automatic_exploration_p, this, true)
}
initEvent()
initData()
CallerMsgBoxListenerManager.addListener(TAG,this)
}
fun showAutoExploration(){
//倒计时
//语音播放
AIAssist.getInstance(context).speakTTSVoice("道路畅通一切正常蘑菇行车助手将持续守候您的出行")
//隐藏自动探查视图
private fun showAutoExploration(){
ThreadUtils.runOnUiThread {
this@AutomaticExplorationView.visibility = View.GONE
this@AutomaticExplorationView.visibility = View.VISIBLE
initData()
}
}
private fun initEvent(){
@@ -78,34 +80,74 @@ class AutomaticExplorationView @JvmOverloads constructor(
rotationAnim?.cancel()
this.visibility = View.GONE
}
//启动扫描
ivScan?.let {
rotationAnim = ObjectAnimator.ofFloat(it, "rotation", 0f, 360f)
rotationAnim?.repeatCount = ValueAnimator.INFINITE
rotationAnim?.repeatMode = ValueAnimator.RESTART
rotationAnim?.duration = 2000
rotationAnim?.interpolator = LinearInterpolator()
rotationAnim?.start()
}
rvExplorationList = findViewById(R.id.rvExplorationList)
val linearLayoutManager = LinearLayoutManager(context)
linearLayoutManager.orientation = LinearLayoutManager.VERTICAL
automaticExplorationAdapter = AutomaticExplorationAdapter(context,user)
rvExplorationList?.adapter = automaticExplorationAdapter
rvExplorationList?.layoutManager = linearLayoutManager
startShowTimer()
}
private fun startShowTimer(){
ThreadUtils.runOnUiThread {
showViewTimer = object: CountDownTimer(EXPLORATION_SHOW_TIME,EXPLORATION_SHOW_TIME){
override fun onTick(millisUntilFinished: Long) {
}
override fun onFinish() {
showAutoExploration()
}
}
showViewTimer?.start()
}
}
private fun initData() {
val dataList = ArrayList<AutoExplorationEntity>()
dataList.add(AutoExplorationEntity("当前道路事件分析",2000L))
dataList.add(AutoExplorationEntity("前方车辆",2000L))
dataList.add(AutoExplorationEntity("两侧车辆",3000L))
dataList.add(AutoExplorationEntity("后方车辆",3000L))
dataList.add(AutoExplorationEntity("前方路口车辆流速分析",4000L))
dataList.add(AutoExplorationEntity("前方路口行人/非机动车分析",4000L))
dataList.add(AutoExplorationEntity("路侧视频分析",5000L))
automaticExplorationAdapter?.setData(dataList)
val dataList = ArrayList<AutoExplorationEntity>(7)
dataList.add(AutoExplorationEntity("当前道路事件分析",2000L,false))
dataList.add(AutoExplorationEntity("前方车辆",2000L,false))
dataList.add(AutoExplorationEntity("两侧车辆",2600L,false))
dataList.add(AutoExplorationEntity("后方车辆",3000L,false))
dataList.add(AutoExplorationEntity("前方路口车辆流速分析",4000L,false))
dataList.add(AutoExplorationEntity("前方路口行人/非机动车分析",4300L,false))
dataList.add(AutoExplorationEntity("路侧视频分析",5000L,false))
automaticExplorationAdapter?.setListener(object: AutomaticExplorationAdapter.CompleteListener{
override fun onComplete(entity: AutoExplorationEntity) {
var allComplete = true //所有探查项目都探查完毕
dataList.forEach {
if(it.explorationContent == entity.explorationContent){
it.explorationComplete = true
}
if(!it.explorationComplete){
allComplete = false
}
}
if(allComplete){
//语音播放
AIAssist.getInstance(context).speakTTSVoice("道路畅通一切正常蘑菇行车助手将持续守候您的出行")
//5秒后关闭弹窗
val hideViewTimer =object: CountDownTimer(EXPLORATION_HIDE_TIME,EXPLORATION_HIDE_TIME){
override fun onTick(millisUntilFinished: Long) {
}
override fun onFinish() {
//隐藏自动探查视图
ThreadUtils.runOnUiThread {
this@AutomaticExplorationView.visibility = View.GONE
}
//重新开始下一轮展示倒计时
startShowTimer()
}
}
hideViewTimer.start()
}
}
})
automaticExplorationAdapter?.setData(dataList)
//每出现一次自动探查,增加相应的服务次数
//车辆服务次数
AutopilotSummaryInfo.vehicleServiceNum += 31
@@ -117,10 +159,33 @@ class AutomaticExplorationView @JvmOverloads constructor(
AutopilotSummaryInfo.vulnerableTipNum += 4
//消除安全风险隐患次数
AutopilotSummaryInfo.dangerNum += 24
//启动扫描
ivScan?.let {
rotationAnim = ObjectAnimator.ofFloat(it, "rotation", 0f, 360f)
rotationAnim?.repeatCount = ValueAnimator.INFINITE
rotationAnim?.repeatMode = ValueAnimator.RESTART
rotationAnim?.duration = 2000
rotationAnim?.interpolator = LinearInterpolator()
rotationAnim?.start()
}
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerMsgBoxListenerManager.removeListener(TAG)
}
/**
* 距离用户在触发上一次事件播报的时间5分钟后自动触发常规道路情况检测
*/
override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) {
if(category == MsgCategory.NOTICE){
if(msgBoxList.type == MsgBoxType.V2X){
//重置倒计时时长
showViewTimer?.cancel()
startShowTimer()
}
}
}
}

View File

@@ -7,6 +7,7 @@ import android.view.View
import android.widget.ImageView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import com.mogo.eagle.core.data.autopilot.AutopilotSummaryInfo
import com.mogo.eagle.core.data.enums.DataSourceType
import com.mogo.eagle.core.data.enums.TrafficLightEnum
import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTrafficLightListener
@@ -101,6 +102,8 @@ class FusionTrafficLightView @JvmOverloads constructor(
//如果当前红绿灯视图为隐藏状态则设置为显示状态
if(this@FusionTrafficLightView.visibility == View.GONE){
this@FusionTrafficLightView.visibility = View.VISIBLE
AutopilotSummaryInfo.intersectionServicesNum++
AutopilotSummaryInfo.lightServicesNum++
//首次展示,需要将当前、下一、下二灯态的时间占比绘制出来,只绘制一次
val proportionList = ArrayList<Int>(3)
proportionList.add(0)

View File

@@ -10,6 +10,8 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isPassenger
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isTaxi
import com.mogo.map.overlay.core.Level
import com.mogo.map.overlay.point.Point
import com.zhidaoauto.map.sdk.open.renders.marker.Marker
import com.zhidaoauto.map.sdk.open.renders.marker.MarkerOptions
import mogo.telematics.pad.MessagePad.*
object TrackerSourceFilterHelper {
@@ -112,7 +114,7 @@ object TrackerSourceFilterHelper {
.setDisplayAnim(true)
.setAnimScale(getAnimScale(data.type))
.build()
CallerMapUIServiceManager.getOverlayManager()?.showOrUpdatePoint(opt)
CallerMapUIServiceManager.getOverlayManager()?.updateAnimPoint(opt)
//消息埋点
CallerFuncBizListenerManager.invokeAttrZombieAnalyticsEvent()
}

View File

@@ -526,6 +526,13 @@ enum class EventTypeEnumNew(
content = "保持当前车速即可通过路口,好丝滑!",
tts = "保持当前车速即可通过路口,好丝滑!"
),
TYPE_SOCKET_ROAD_PEOPLE_CROSS(
"100064",
"行人横穿",
poiTypeSrcVr = View.NO_ID,
content = "前方%s米有行人/非机动车横穿,蘑菇提醒您提前减速,注意观察,小心通过",
tts = "前方%s米有行人/非机动车横穿,蘑菇提醒您提前减速,注意观察,小心通过"
),
TYPE_ERROR(
0.toString(),
"未知/错误/异常",
@@ -822,6 +829,8 @@ enum class EventTypeEnumNew(
}
}
TYPE_SOCKET_ROAD_CONGESTION.poiType -> R.raw.v2x_yongdu
TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType -> if (FunctionBuildConfig.skinMode != 0) TrafficTypeEnum.TYPE_TRAFFIC_ID_PEOPLE.traffic3DIconId else TrafficTypeEnum.TYPE_TRAFFIC_ID_PEOPLE.traffic3DNightIconId
TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType -> if (FunctionBuildConfig.skinMode != 0) TrafficTypeEnum.TYPE_TRAFFIC_ID_TA_CHE.traffic3DIconId else TrafficTypeEnum.TYPE_TRAFFIC_ID_TA_CHE.traffic3DNightIconId
else -> 0
}
}
@@ -1194,6 +1203,8 @@ enum class EventTypeEnumNew(
TYPE_SOCKET_ROAD_CONGESTION.poiType -> R.drawable.v2x_icon_yongdu_vr
// 他车逆行/倒车
TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType -> if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) R.drawable.icon_v2x_other_retrograde_vehicle_passenger else R.drawable.icon_v2x_other_retrograde_vehicle_driver
// 行人/非机动车横穿
TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType -> if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) R.drawable.icon_xingren_hengchuan_passenger else R.drawable.icon_xingren_hengchuan_driver
// 通过公交站
TYPE_USECASE_ROAD_BUS_STATION.poiType -> if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) R.drawable.icon_v2x_bus_station_passenger else R.drawable.icon_v2x_bus_station_driver
//拥堵

View File

@@ -3,4 +3,4 @@ package com.mogo.eagle.core.data.notice
/**
* 自动探查
*/
data class AutoExplorationEntity(var explorationContent: String,var explorationDuration: Long)
data class AutoExplorationEntity(var explorationContent: String,var explorationDuration: Long,var explorationComplete: Boolean)

View File

@@ -15,11 +15,14 @@ import android.widget.PopupWindow
import androidx.annotation.LayoutRes
import androidx.core.view.doOnAttach
import com.mogo.eagle.core.utilcode.kotlin.lifeCycleScope
import com.mogo.eagle.core.utilcode.util.*
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import java.util.concurrent.atomic.AtomicBoolean
class MoGoPopWindow private constructor(builder: Builder){
companion object {
private const val TAG = "MoGoPopWindow"
}
private val content: View = builder.content ?: throw AssertionError("要填充的View不能为空")
@@ -109,9 +112,19 @@ class MoGoPopWindow private constructor(builder: Builder){
val params = content.rootView.layoutParams as WindowManager.LayoutParams
val oldX = params.x
val oldY = params.y
val newX = oldX + dx
val newY = oldY + dy
Logger.d(TAG, "oldX: $oldX, oldY: $oldY, dx: $dx, dy:$dy")
var newX = oldX + dx
var newY = oldY + dy
if (outer.contains(rawX.toInt(), rawY.toInt())) {
val width = activity.resources.displayMetrics.widthPixels
val height = activity.resources.displayMetrics.heightPixels
// if (newX < 0) {
// newX += newX
// }
// if (newY < 0) {
// newY += height
// }
Logger.d(TAG, "screen_width: $width, screen_height: $height, newX: $newX, newY: $newY, rawX: ${rawX.toInt()}, rawY: ${rawY.toInt()}, width: ${content.width}, height: ${content.height}")
pop.update(newX, newY, content.width, content.height)
}
oldRawX = rawX
@@ -252,7 +265,7 @@ class MoGoPopWindow private constructor(builder: Builder){
}
fun offsetX(x: Int) = apply {
this.offsetY = x
this.offsetX = x
}
fun offsetY(y: Int) = apply {

View File

@@ -33,6 +33,8 @@ interface IMogoMap {
fun addPoint(options: Point.Options): IMapPointOverlay?
fun addAnimPoint(options: Point.Options)
fun addLine(options: Polyline.Options): IMapPolylineOverlay?
/**

View File

@@ -75,4 +75,6 @@ interface IMoGoOverlayManager {
fun hideAllPointsExceptIds(vararg ids: String)
fun hideAllPointsExceptOwners(vararg owners: String)
fun updateAnimPoint(options: Point.Options, mapTag:String = DEFAULT)
}

View File

@@ -11,8 +11,10 @@ import com.mogo.map.overlay.wrapper.line.AMapPolylineWrapper
import com.mogo.map.overlay.wrapper.point.AMapPointWrapper
import com.mogo.map.uicontroller.IMogoMapUIController
import com.mogo.map.utils.ObjectUtils
import com.zhidaoauto.map.data.point.LonLatPoint
import com.zhidaoauto.map.sdk.open.renders.marker.BatchMarkerOptions
import com.zhidaoauto.map.sdk.open.renders.marker.Marker
import com.zhidaoauto.map.sdk.open.renders.marker.MarkerOptions
import com.zhidaoauto.map.sdk.open.renders.marker.MarkerSimpleData
import com.zhidaoauto.map.sdk.open.renders.marker.OnMarkClickListener
import com.zhidaoauto.map.sdk.open.view.MapAutoView
@@ -66,6 +68,20 @@ class AMapWrapper(map: MapAutoViewHelper?, mapView: MapAutoView, controller: IMo
return AMapPointWrapper(options.id, delegate, mMapView)
}
override fun addAnimPoint(options: Point.Options) {
if (!checkAMap()) {
return
}
val markerOptions = MarkerOptions(options.id, mMapView.getMapController()).setGps(true)
.position(LonLatPoint(options.longitude, options.latitude, options.rotate.toDouble()))
val marker = Marker(markerOptions,mMapView.getMapController(),
mMapView.getMapController()?.getMarkerCall()
)
marker.setDisplayAnimEnable(true)
marker.setAnimResource(options.animRes)
marker.setAnimScale(options.animScale)
}
override fun addLine(options: Polyline.Options): IMapPolylineOverlay? {
if (!checkAMap()) {
return null

View File

@@ -5,6 +5,7 @@ import android.view.View
import com.mogo.eagle.core.data.map.*
import com.mogo.eagle.core.function.call.autopilot.*
import com.mogo.eagle.core.utilcode.util.*
import com.mogo.map.MogoMap
import com.mogo.map.overlay.point.Point.Options
import com.mogo.map.MogoMap.Companion.mapInstance
import com.mogo.map.overlay.core.*
@@ -49,13 +50,15 @@ internal class MoGoOverlayManagerImpl: IMoGoOverlayManager {
key.delegate = point
it.setToTop()
if (options.moveToCenter) {
val wgs84 = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84()
val cj02 = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02()
moveToCenter(
mapTag,
options.id,
options.longitude,
options.latitude,
if (options.isGps) CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().longitude else CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude,
if (options.isGps) CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().latitude else CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude
if (options.isGps) wgs84.longitude else cj02.longitude,
if (options.isGps) wgs84.latitude else cj02.latitude
)
}
}
@@ -452,4 +455,8 @@ internal class MoGoOverlayManagerImpl: IMoGoOverlayManager {
it.value.setVisible(false)
}
}
override fun updateAnimPoint(options: Options, mapTag:String) {
mapInstance.getMogoMap(mapTag)?.addAnimPoint(options)
}
}

View File

@@ -3,7 +3,6 @@ package com.mogo.map.utils;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
@@ -65,9 +64,6 @@ public class ObjectUtils {
.controlAngle(opt.isControlAngle())
.rotateAngle(opt.getRotate())
.setFlat(opt.isFlat())
// .setAnimResource()
// .setDisplayAnimEnable()
// .setAnimScale()
.visible(opt.isVisible())
.infoWindowEnable(opt.isInfoWindowEnable())
.scale(opt.getScale())