[v2.13.0][视角变换二期]代码提交

[v2.13.0][视角变换二期]代码提交2
This commit is contained in:
renwj
2022-11-29 14:37:45 +08:00
parent 8a78db5bef
commit 819b9a3ede
2 changed files with 66 additions and 54 deletions

View File

@@ -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

View File

@@ -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<Record> {
private data class Record(val target: Scene, var isDisplay: Boolean = false, var triggerTime: Long): Comparable<Record> {
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)
}
}