From 819b9a3edefdfeb094669c44ca97a835380b8ef8 Mon Sep 17 00:00:00 2001 From: renwj Date: Tue, 29 Nov 2022 14:37:45 +0800 Subject: [PATCH] =?UTF-8?q?[v2.13.0][=E8=A7=86=E8=A7=92=E5=8F=98=E6=8D=A2?= =?UTF-8?q?=E4=BA=8C=E6=9C=9F]=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [v2.13.0][视角变换二期]代码提交2 --- .../hmi/ui/turnlight/TurnLightViewStatus.kt | 4 +- .../call/map/CallerVisualAngleManager.kt | 116 ++++++++++-------- 2 files changed, 66 insertions(+), 54 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/TurnLightViewStatus.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/TurnLightViewStatus.kt index 50f2e8a817..a507b08ac2 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/TurnLightViewStatus.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/TurnLightViewStatus.kt @@ -62,7 +62,7 @@ class TurnLightViewStatus @JvmOverloads constructor( if (directionLight == 1 || directionLight == 2) { if (!isVisualAngleChanged) { isVisualAngleChanged = true - CallerVisualAngleManager.changeVisualAngle(Turning) + CallerVisualAngleManager.changeVisualAngle(Turning(true)) } } @@ -96,7 +96,7 @@ class TurnLightViewStatus @JvmOverloads constructor( } else { //消失 if (isVisualAngleChanged) { isVisualAngleChanged = false - CallerVisualAngleManager.changeVisualAngle(Default()) + CallerVisualAngleManager.changeVisualAngle(Turning(false)) } if (!isDisappare) { isDisappare = true diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt index 82107fcf74..d6709a65ff 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt @@ -10,11 +10,8 @@ import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleOwner import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.map.MapRoadInfo.StopLine -import com.mogo.eagle.core.data.map.MogoLatLng import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager.OnRoadListener -import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.CrossRoad -import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.Default -import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.LowSpeed +import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.* import com.mogo.eagle.core.utilcode.kotlin.lifeCycleOwner import com.mogo.eagle.core.utilcode.kotlin.safeCancel import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils @@ -35,8 +32,6 @@ object CallerVisualAngleManager { private const val TAG = "VisualAngle" - private const val MaxDisplayThreshold = 30_000 //最大展示阈值 - @Volatile private var hasCrossRoad = false @@ -61,6 +56,7 @@ object CallerVisualAngleManager { private interface IAttach { val angle: VisualAngleMode val priority: Int + val displayThreshold: Long //最大展示时长 > 0; 表示最长展示多长时间, -1 表示,一直展示,直到触发默认视角, 0: 默认视角专用值, } private val listener = object : OnRoadListener { @@ -70,7 +66,7 @@ object CallerVisualAngleManager { if (oldRoadId != roadId) { if (hasCrossRoad) { hasCrossRoad = false - changeVisualAngle(Default()) + changeVisualAngle(CrossRoad(false)) } } this.roadId = roadId @@ -79,7 +75,7 @@ object CallerVisualAngleManager { override fun onStopLineInfo(info: StopLine) { if (!hasCrossRoad && info.distanceOfCarToStopLine <= 30.0) { hasCrossRoad = true - changeVisualAngle(CrossRoad) + changeVisualAngle(CrossRoad(true)) } } } @@ -116,7 +112,10 @@ object CallerVisualAngleManager { override val angle: VisualAngleMode = VisualAngleMode.MODE_MEDIUM_SIGHT - override val priority: Int = 0 + override val priority: Int = 1 + + override val displayThreshold: Long + get() = 0 override fun toString(): String { return "Default(delay=$delay, unit=$unit, angle=$angle, priority=$priority)" @@ -126,11 +125,14 @@ object CallerVisualAngleManager { /** * 变道-接收到转向灯信息号 */ - object Turning: Scene() { + class Turning(var open: Boolean = false): Scene() { override val angle: VisualAngleMode = VisualAngleMode.MAP_STYLE_VR_ANGLE_TOP - override val priority: Int = 0 + override val priority: Int = 3 + + override val displayThreshold: Long + get() = -1 } /** @@ -140,7 +142,10 @@ object CallerVisualAngleManager { override val angle: VisualAngleMode = VisualAngleMode.MAP_STYLE_VR_ANGLE_300 - override val priority: Int = 0 + override val priority: Int = 2 + + override val displayThreshold: Long + get() = SECONDS.toMillis(8) } /** @@ -150,29 +155,21 @@ object CallerVisualAngleManager { override val angle: VisualAngleMode = VisualAngleMode.MODE_LONG_SIGHT - override val priority: Int = 0 + override val priority: Int = 5 + + override val displayThreshold: Long + get() = SECONDS.toMillis(8) } - /** - * 车量低速行驶 - */ - class LowSpeed(val lat: Double, val lon: Double): Scene() { - - override val angle: VisualAngleMode = VisualAngleMode.MODE_CLOSE_SIGHT - - override val priority: Int = 0 - - override fun toString(): String { - return "LowSpeed(lat=$lat, lon=$lon, angle=$angle, priority=$priority)" - } - } /** * 十字路口 */ - object CrossRoad: Scene() { + class CrossRoad(var open: Boolean = false): Scene() { override val angle: VisualAngleMode = VisualAngleMode.MAP_STYLE_VR_ANGLE_CROSS - override val priority: Int = 0 + override val priority: Int = 4 + override val displayThreshold: Long + get() = -1 } } @@ -183,13 +180,8 @@ object CallerVisualAngleManager { * @param isDisplay: 是否正在展示 * @param triggerTime: 触发时间 */ - private data class Record(val target: Scene, var isDisplay: Boolean = false, val triggerTime: Long): Comparable { + private data class Record(val target: Scene, var isDisplay: Boolean = false, var triggerTime: Long): Comparable { override fun compareTo(other: Record): Int { - //大根堆 - if (triggerTime != other.triggerTime) { - //时间越晚,越靠近堆顶 - return if (triggerTime > other.triggerTime) -1 else 1 - } //如果时间一样,优先级越高,越靠近堆顶 return other.target.priority - target.priority } @@ -212,21 +204,50 @@ object CallerVisualAngleManager { if (displayed == null) { CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 2 ---") val top = getTop() //堆顶 - if (top != null && top.target.priority > scene.priority) { - CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 3 ---") - doChangeAngle(top) - heap += Record(scene, triggerTime = triggerTime) + if (top != null) { + if (top.target.priority >= scene.priority) { + CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 3 ---") + top.triggerTime = triggerTime + doChangeAngle(top) + synchronized(heap){ + heap += Record(scene, triggerTime = -1) + } + } else { + CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 4 ---") + doChangeAngle(Record(scene, triggerTime = triggerTime)) + } } else { CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 4 ---") doChangeAngle(Record(scene, triggerTime = triggerTime)) } } else { - if (scene.javaClass == displayed.target.javaClass) { CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 5 ---") defaultDelayJob?.safeCancel() return@launch } + val prev = displayed.target + val prevTriggerTime = displayed.triggerTime + if (scene is Turning) { + val isOpen = scene.open + if (!isOpen) { + changeVisualAngle(Default()) + return@launch + } + } + if (scene is CrossRoad) { + val isOpen = scene.open + if (!isOpen) { + changeVisualAngle(Default()) + return@launch + } + } + if (prev.priority >= scene.priority && (prev is RoadEvent || prev is TooClose)) { + val displayDuration = triggerTime - prevTriggerTime + if (displayDuration < prev.displayThreshold) { + return@launch + } + } if (scene is Default) { CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 6 ---") defaultDelayJob?.safeCancel() @@ -248,12 +269,8 @@ object CallerVisualAngleManager { } else { CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 10 ---") defaultDelayJob?.safeCancel() - val delta = triggerTime - displayed.triggerTime - if (delta >= MaxDisplayThreshold) { - CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 11 ---") + if (displayed.target.priority < scene.priority) { doChangeAngle(Record(scene, triggerTime = triggerTime)) - } else { - CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 12 ---") } } } @@ -262,6 +279,7 @@ object CallerVisualAngleManager { @OptIn(InternalCoroutinesApi::class) private fun doChangeAngle(record: Record) { + val angle = record.target.angle CallerMapUIServiceManager.getMapUIController()?.also { CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${record.target} --- 13 ---") if (record.target !is Default) { @@ -270,14 +288,8 @@ object CallerVisualAngleManager { heap += record } } - val target = record.target - if (target is LowSpeed) { - CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${record.target} --- 14 ---") - it.changeMapVisualAngle(record.target.angle, MogoLatLng(target.lat, target.lon)) - } else { - CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${record.target} --- 15 ---") - it.changeMapVisualAngle(record.target.angle, null) - } + CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${record.target} --- 15 ---> angle: $angle") + it.changeMapVisualAngle(angle, null) } }