[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 (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
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user