[3.4.0] add func of door state invoke

This commit is contained in:
zhongchao
2023-07-20 16:50:22 +08:00
parent 512cdd77b4
commit 73da6671bd
8 changed files with 147 additions and 11 deletions

View File

@@ -0,0 +1,108 @@
package com.mogo.eagle.core.function.call.autopilot
import chassis.Chassis
import chassis.VehicleStateOuterClass
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisDoorStateListener
import com.mogo.eagle.core.function.call.base.CallerBase
import java.util.*
import kotlin.properties.Delegates
/**
* 车门数据 回调监听
*/
object CallerChassisDoorStateListenerManager : CallerBase<IMoGoChassisDoorStateListener>() {
private val listCache = Collections.emptyList<VehicleStateOuterClass.DoorStateV2>()
private var frontLeft by Delegates.observable(0) { _, oldV, newV ->
if (oldV != newV) {
invokeSingleDoorState(Chassis.DoorNumber.FRONT_LEFT, newV)
}
}
private var frontRight by Delegates.observable(0) { _, oldV, newV ->
if (oldV != newV) {
invokeSingleDoorState(Chassis.DoorNumber.FRONT_RIGHT, newV)
}
}
private var backLeft by Delegates.observable(0) { _, oldV, newV ->
if (oldV != newV) {
invokeSingleDoorState(Chassis.DoorNumber.REAR_LEFT, newV)
}
}
private var backRight by Delegates.observable(0) { _, oldV, newV ->
if (oldV != newV) {
invokeSingleDoorState(Chassis.DoorNumber.REAR_RIGHT, newV)
}
}
private var middle by Delegates.observable(0) { _, oldV, newV ->
if (oldV != newV) {
invokeSingleDoorState(Chassis.DoorNumber.MIDDLE, newV)
}
}
override fun doSomeAfterAddListener(tag: String, listener: IMoGoChassisDoorStateListener) {
super.doSomeAfterAddListener(tag, listener)
if (listCache.size > 0) {
listener.onAutopilotDoorState(listCache)
}
}
/**
* 车门状态
*/
fun invokeAutopilotDoorState(doorList: MutableList<VehicleStateOuterClass.DoorStateV2>) {
listCache.addAll(doorList)
doorList.forEach {
when (it.number) {
Chassis.DoorNumber.FRONT_LEFT -> frontLeft = it.status
Chassis.DoorNumber.FRONT_RIGHT -> frontRight = it.status
Chassis.DoorNumber.REAR_LEFT -> backLeft = it.status
Chassis.DoorNumber.REAR_RIGHT -> backRight = it.status
Chassis.DoorNumber.MIDDLE -> middle = it.status
else -> {}
}
}
M_LISTENERS.forEach {
val listener = it.value
listener.onAutopilotDoorState(doorList)
}
}
@Synchronized
private fun invokeSingleDoorState(num: Chassis.DoorNumber, value: Int) {
M_LISTENERS.forEach {
val listener = it.value
listener.onAutopilotSingleDoorState(num, value == 1)
}
}
/**
* 返回所有门状态
*/
fun getDoorList(): List<VehicleStateOuterClass.DoorStateV2>? {
return if (listCache.size > 0) listCache else null
}
/**
* 获取某个门的状态
* @param num
* @return true:开门false:关门
*/
fun getIndexDoorState(num: Chassis.DoorNumber): Boolean {
return when (num) {
Chassis.DoorNumber.FRONT_LEFT -> frontLeft == 1
Chassis.DoorNumber.FRONT_RIGHT -> frontRight == 1
Chassis.DoorNumber.REAR_LEFT -> backLeft == 1
Chassis.DoorNumber.REAR_RIGHT -> backRight == 1
Chassis.DoorNumber.MIDDLE -> middle == 1
else -> {
false
}
}
}
}