[3.4.0][视角] 视角切换逻辑优化

This commit is contained in:
renwj
2023-07-12 14:27:55 +08:00
parent 494a3e51db
commit ff9c7f438b
12 changed files with 61 additions and 162 deletions

View File

@@ -10,12 +10,10 @@ import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.data.config.*
import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.data.map.*
import com.mogo.eagle.core.data.map.MapRoadInfo.StopLine
import com.mogo.eagle.core.function.api.map.angle.*
import com.mogo.eagle.core.function.api.map.angle.Scene
import com.mogo.eagle.core.function.call.autopilot.*
import com.mogo.eagle.core.function.call.map.*
import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager.OnRoadListener
import com.mogo.eagle.core.utilcode.kotlin.*
import com.mogo.eagle.core.utilcode.mogo.*
import com.mogo.eagle.core.utilcode.mogo.logger.*
@@ -32,11 +30,8 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider {
private const val TAG = "VisualAngleChange"
}
private val triggerLocation = AtomicReference<MogoLocation>()
private val distanceOfCarToStopLine = AtomicReference(0.0)
private val travelled by lazy { AtomicReference(0.0) }
@Volatile
private var roadEventFlag: Boolean = false
/**
* 业务实体,不对外暴露
@@ -55,52 +50,6 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider {
PriorityQueue<Record>()
}
private val listener = object : OnRoadListener {
private val roadId = AtomicReference<String>()
private val triggerRoadId = AtomicReference<String>()
override fun onRoadIdInfo(roadId: String) {
this.roadId.set(roadId)
Log.d(TAG, "-- onRoadIdInfo --: prev: ${this.triggerRoadId.get()} -> curr: $roadId")
val loc = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02()
var triggerClose = false
val distance = distanceOfCarToStopLine.get() + 5
if (hasCrossRoad && distance > 0) {
val prev = triggerLocation.get()
if (prev != null) {
travelled.set(MapTools.distance(loc.longitude, loc.latitude, prev.longitude, prev.latitude) + travelled.get())
triggerLocation.set(loc)
}
val oldRoadId = triggerRoadId.get()
Log.d(TAG, "-- onRoadIdInfo --: travelled --: ${travelled.get()}")
if ((travelled.get() > distance) && oldRoadId != roadId) {
distanceOfCarToStopLine.set(0.0)
hasCrossRoad = false
triggerRoadId.set(null)
travelled.set(0.0)
triggerLocation.set(null)
Log.d(TAG, "-- onRoadIdInfo --: trigger close --")
triggerClose = true
}
}
if (triggerClose) {
changeAngle(CrossRoad(false))
}
}
override fun onStopLineInfo(info: StopLine) {
Log.d(TAG, "-- onStopLineInfo --: ${info.distanceOfCarToStopLine}")
if (!hasCrossRoad && info.distanceOfCarToStopLine <= 30.0) {
hasCrossRoad = true
triggerRoadId.set(this.roadId.get())
distanceOfCarToStopLine.set(info.distanceOfCarToStopLine)
triggerLocation.set(CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02())
changeAngle(CrossRoad(true))
}
}
}
override fun init(context: Context?) {
if (Thread.currentThread() != Looper.getMainLooper().thread) {
scope.launch {
@@ -120,13 +69,8 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider {
}
}
})
CallerMapRoadListenerManager.registerRoadListener("VisualAngleChange", listener)
}
@Volatile
private var hasCrossRoad = false
private var scope: CoroutineScope = acquireScope()
@Synchronized
get() {
@@ -161,12 +105,6 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider {
val displayed = getDisplayed()
if (displayed == null) {
Log.d(TAG, "--- 2 ---")
if (scene is Turning) {
if (!scene.open) {
changeAngle(Default())
return@launch
}
}
if (scene is CrossRoad) {
if (!scene.open) {
changeAngle(Default())
@@ -178,7 +116,7 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider {
val prev = displayed.target
Log.d(TAG, "--- 3 --- old: $prev -> cur: $scene")
val prevTriggerTime = displayed.triggerTime
if (scene !is Default && prev.priority > scene.priority && (prev is RoadEvent || prev is TooClose)) {
if (scene !is Default && prev.priority > scene.priority && (prev is RoadEvent)) {
val displayDuration = triggerTime - prevTriggerTime
Log.d(TAG, "--- 4 ---:场景[$prev], 已展示时长: duration: $displayDuration")
if (displayDuration < prev.displayThreshold) {
@@ -191,15 +129,6 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider {
return@launch
}
}
if (prev is Turning && scene is Turning) {
val isOpen = scene.open
if (!isOpen) {
Log.d(TAG, "--- 7 --- 场景[$scene], 收到关闭通知")
queue -= displayed
changeAngle(Default())
return@launch
}
}
if (prev is CrossRoad && scene is CrossRoad) {
val isOpen = scene.open
if (!isOpen) {
@@ -251,13 +180,6 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider {
displayed?.also {
queue -= it
}
if (target is Turning) {
if (!target.open) {
Log.d(TAG, "--- doRealVisualAngleChange --- 7 ---")
changeAngle(Default())
return
}
}
if (target is CrossRoad) {
if (!target.open) {
Log.d(TAG, "--- doRealVisualAngleChange --- 8 ---")
@@ -282,7 +204,21 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider {
queue += record
}
}
it.changeMapVisualAngle(angle, null)
if (record.target is Default && roadEventFlag) {
roadEventFlag = false
it.setLockMode(true)
}
if (record.target is RoadEvent) {
it.setLockMode(false)
roadEventFlag = true
it.animateTo(record.target.poi_lon, record.target.poi_lon, 0f, 1000, true)
scope.launch {
delay(500)
it.changeMapVisualAngle(angle, null)
}
} else {
it.changeMapVisualAngle(angle, null)
}
}
}

View File

@@ -94,15 +94,12 @@ class MapBizView(context: Context?, attrs: AttributeSet?) : MogoMapView(context,
lightSwitch?.let {
when (it.number) {
Chassis.LightSwitch.LIGHT_LEFT_VALUE -> { //左转灯
CallerVisualAngleManager.showTurning(true)
turn(1)
}
Chassis.LightSwitch.LIGHT_RIGHT_VALUE -> { //右转灯
CallerVisualAngleManager.showTurning(true)
turn(2)
}
Chassis.LightSwitch.LIGHT_NONE_VALUE -> {
CallerVisualAngleManager.showTurning(false)
turn(0)
}
}