[v2.13.0][视角变换二期]代码提交
[v2.13.0][视角变换二期]代码提交2
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user