[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 (directionLight == 1 || directionLight == 2) {
if (!isVisualAngleChanged) { if (!isVisualAngleChanged) {
isVisualAngleChanged = true isVisualAngleChanged = true
CallerVisualAngleManager.changeVisualAngle(Turning) CallerVisualAngleManager.changeVisualAngle(Turning(true))
} }
} }
@@ -96,7 +96,7 @@ class TurnLightViewStatus @JvmOverloads constructor(
} else { //消失 } else { //消失
if (isVisualAngleChanged) { if (isVisualAngleChanged) {
isVisualAngleChanged = false isVisualAngleChanged = false
CallerVisualAngleManager.changeVisualAngle(Default()) CallerVisualAngleManager.changeVisualAngle(Turning(false))
} }
if (!isDisappare) { if (!isDisappare) {
isDisappare = true isDisappare = true

View File

@@ -10,11 +10,8 @@ import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.map.MapRoadInfo.StopLine 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.CallerMapRoadListenerManager.OnRoadListener
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.CrossRoad import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.*
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.utilcode.kotlin.lifeCycleOwner import com.mogo.eagle.core.utilcode.kotlin.lifeCycleOwner
import com.mogo.eagle.core.utilcode.kotlin.safeCancel import com.mogo.eagle.core.utilcode.kotlin.safeCancel
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
@@ -35,8 +32,6 @@ object CallerVisualAngleManager {
private const val TAG = "VisualAngle" private const val TAG = "VisualAngle"
private const val MaxDisplayThreshold = 30_000 //最大展示阈值
@Volatile @Volatile
private var hasCrossRoad = false private var hasCrossRoad = false
@@ -61,6 +56,7 @@ object CallerVisualAngleManager {
private interface IAttach { private interface IAttach {
val angle: VisualAngleMode val angle: VisualAngleMode
val priority: Int val priority: Int
val displayThreshold: Long //最大展示时长 > 0; 表示最长展示多长时间, -1 表示,一直展示,直到触发默认视角, 0: 默认视角专用值,
} }
private val listener = object : OnRoadListener { private val listener = object : OnRoadListener {
@@ -70,7 +66,7 @@ object CallerVisualAngleManager {
if (oldRoadId != roadId) { if (oldRoadId != roadId) {
if (hasCrossRoad) { if (hasCrossRoad) {
hasCrossRoad = false hasCrossRoad = false
changeVisualAngle(Default()) changeVisualAngle(CrossRoad(false))
} }
} }
this.roadId = roadId this.roadId = roadId
@@ -79,7 +75,7 @@ object CallerVisualAngleManager {
override fun onStopLineInfo(info: StopLine) { override fun onStopLineInfo(info: StopLine) {
if (!hasCrossRoad && info.distanceOfCarToStopLine <= 30.0) { if (!hasCrossRoad && info.distanceOfCarToStopLine <= 30.0) {
hasCrossRoad = true hasCrossRoad = true
changeVisualAngle(CrossRoad) changeVisualAngle(CrossRoad(true))
} }
} }
} }
@@ -116,7 +112,10 @@ object CallerVisualAngleManager {
override val angle: VisualAngleMode = VisualAngleMode.MODE_MEDIUM_SIGHT 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 { override fun toString(): String {
return "Default(delay=$delay, unit=$unit, angle=$angle, priority=$priority)" 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 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 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 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 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 isDisplay: 是否正在展示
* @param triggerTime: 触发时间 * @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 { override fun compareTo(other: Record): Int {
//大根堆
if (triggerTime != other.triggerTime) {
//时间越晚,越靠近堆顶
return if (triggerTime > other.triggerTime) -1 else 1
}
//如果时间一样,优先级越高,越靠近堆顶 //如果时间一样,优先级越高,越靠近堆顶
return other.target.priority - target.priority return other.target.priority - target.priority
} }
@@ -212,21 +204,50 @@ object CallerVisualAngleManager {
if (displayed == null) { if (displayed == null) {
CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 2 ---") CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 2 ---")
val top = getTop() //堆顶 val top = getTop() //堆顶
if (top != null && top.target.priority > scene.priority) { if (top != null) {
CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 3 ---") if (top.target.priority >= scene.priority) {
doChangeAngle(top) CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 3 ---")
heap += Record(scene, triggerTime = triggerTime) 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 { } else {
CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 4 ---") CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 4 ---")
doChangeAngle(Record(scene, triggerTime = triggerTime)) doChangeAngle(Record(scene, triggerTime = triggerTime))
} }
} else { } else {
if (scene.javaClass == displayed.target.javaClass) { if (scene.javaClass == displayed.target.javaClass) {
CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 5 ---") CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 5 ---")
defaultDelayJob?.safeCancel() defaultDelayJob?.safeCancel()
return@launch 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) { if (scene is Default) {
CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 6 ---") CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 6 ---")
defaultDelayJob?.safeCancel() defaultDelayJob?.safeCancel()
@@ -248,12 +269,8 @@ object CallerVisualAngleManager {
} else { } else {
CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 10 ---") CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 10 ---")
defaultDelayJob?.safeCancel() defaultDelayJob?.safeCancel()
val delta = triggerTime - displayed.triggerTime if (displayed.target.priority < scene.priority) {
if (delta >= MaxDisplayThreshold) {
CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 11 ---")
doChangeAngle(Record(scene, triggerTime = triggerTime)) doChangeAngle(Record(scene, triggerTime = triggerTime))
} else {
CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${scene} --- 12 ---")
} }
} }
} }
@@ -262,6 +279,7 @@ object CallerVisualAngleManager {
@OptIn(InternalCoroutinesApi::class) @OptIn(InternalCoroutinesApi::class)
private fun doChangeAngle(record: Record) { private fun doChangeAngle(record: Record) {
val angle = record.target.angle
CallerMapUIServiceManager.getMapUIController()?.also { CallerMapUIServiceManager.getMapUIController()?.also {
CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${record.target} --- 13 ---") CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${record.target} --- 13 ---")
if (record.target !is Default) { if (record.target !is Default) {
@@ -270,14 +288,8 @@ object CallerVisualAngleManager {
heap += record heap += record
} }
} }
val target = record.target CallerLogger.d("${M_DEVA}${TAG}", "触发场景:${record.target} --- 15 ---> angle: $angle")
if (target is LowSpeed) { it.changeMapVisualAngle(angle, null)
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)
}
} }
} }