Преглед изворни кода

1. 设备状态监听细分到具体状态

bjb пре 3 месеци
родитељ
комит
398eee9de8

+ 4 - 4
app/src/main/java/com/iscs/comm/CtrlActivity.kt

@@ -129,11 +129,11 @@ class CtrlActivity : ComponentActivity() {
                         override fun onDeviceChanged(device: Device) {
                             super.onDeviceChanged(device)
                             if (dev.frame.cmd == device.frame.cmd) {
-                                (device.deviceStatus as DeviceStatusKeySlot).slotList.find { it.ch == state.ch && it.isChanged }?.let {
+                                (device.deviceStatus as DeviceStatusKeySlot).slotList.find { it.ch == state.ch && it.isChanged() }?.let {
                                     isLock.value = it.isSlotLock
                                     isUsed.value = it.isUsed
                                     rfid.value = it.rfid
-                                    if (it.isChanged && rfid.value.isNotEmpty() && rfid.value != lastRFID) {
+                                    if (it.isChanged() && rfid.value.isNotEmpty() && rfid.value != lastRFID) {
                                         lastRFID = rfid.value
                                         // 硬件逻辑已经存在
                                         dev.ctrlSlotLockAndCharge(state.ch, true, true)
@@ -226,13 +226,13 @@ class CtrlActivity : ComponentActivity() {
                         override fun onDeviceChanged(device: Device) {
                             super.onDeviceChanged(device)
                             if (dev.frame.cmd == device.frame.cmd) {
-                                (device.deviceStatus as DeviceStatusLockSlot).slotList.find { it.ch == state.ch && it.isChanged }?.let {
+                                (device.deviceStatus as DeviceStatusLockSlot).slotList.find { it.ch == state.ch && it.isChanged() }?.let {
                                     isLock.value = it.isSlotLock
                                     isUsed.value = it.isUsed
                                     rfid.value = it.rfid
                                     // Log.d("xiaoming", "${state.ch} ${it.isChanged} ${rfid.value} ${lastRFID}")
                                     // 这里可以做一些其他逻辑,比如如果当前有锁存在,但是没上锁,这里可执行上锁操作
-                                    if (it.isChanged && rfid.value.isNotEmpty() && rfid.value != lastRFID) {
+                                    if (it.isChanged() && rfid.value.isNotEmpty() && rfid.value != lastRFID) {
                                         lastRFID = rfid.value
                                         // 硬件逻辑已存在
                                         // dev.ctrlSlotLock(state.ch, true).writeByFrame()

+ 15 - 1
app/src/main/java/com/iscs/comm/MainActivity.kt

@@ -1,6 +1,7 @@
 package com.iscs.comm
 
 import android.os.Bundle
+import android.util.Log
 import androidx.activity.ComponentActivity
 import androidx.activity.compose.setContent
 import androidx.activity.enableEdgeToEdge
@@ -26,6 +27,8 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import com.iscs.comm.entity.device.Device
+import com.iscs.comm.entity.device.DeviceKeySlot
+import com.iscs.comm.entity.device.status.DeviceStatusKeySlot
 import com.iscs.comm.enums.CommType
 import com.iscs.comm.enums.RunMode
 import com.iscs.comm.extension.BleFrameExt
@@ -72,14 +75,25 @@ class MainActivity : ComponentActivity() {
                 list.addAll(devices.sortedBy { it.frame.cmd })
             }
 
+            override fun onDeviceChanged(device: Device) {
+                super.onDeviceChanged(device)
+                if (device is DeviceKeySlot) {
+                    val slots = (device.deviceStatus as DeviceStatusKeySlot).slotList
+                    slots.forEach { slot ->
+                       if(slot.isChanged()) Log.d("xiaoming", "slot -> ${slot.ch} isUsed:${slot.isUsedChanged()} isRfid:${slot.isRfidChanged()}")
+                    }
+                }
+            }
+
         }
         LaunchedEffect("") {
             // 设置设备变化监听
             CommManager.addOnDeviceListener(listener)
             // SDK初始化
             CommManager.init(CommConfig().setCommType(CommType.CAN).setPort("can0").setBitrate(1000000))
+            Log.d("xiaoming", testJobJson)
             // 蓝牙钥匙功能测试
-            bleKeyTest("CC:BA:97:21:72:C6")
+            // bleKeyTest("CC:BA:97:21:72:C6")
 //            repeat(10) {
 //                ISCSLog.i("xiaoming", "------------ start ------------")
 //                bleKeyTest("CC:BA:97:21:71:E6")

+ 4 - 12
transport/src/main/java/com/iscs/comm/entity/device/DeviceKeySlot.kt

@@ -71,17 +71,11 @@ class DeviceKeySlot(frame: Frame) : Device(frame) {
      * 校验设备状态是否发生变化
      */
     override fun isDeviceStatusChanged(): Boolean {
-        var isChanged = false
-        (deviceStatus as DeviceStatusKeySlot).slotList.forEach { state ->
-            if (state.lastStatus != state.toString()) {
-                state.isChanged = true
-                state.lastStatus = state.toString()
-                if (!isChanged) isChanged = true
-            } else {
-                state.isChanged = false
-            }
+        for (slot in (deviceStatus as DeviceStatusKeySlot).slotList) {
+            // 只要有个槽位变化即认为状态变化
+            if (slot.isChanged()) return true
         }
-        return isChanged
+        return false
     }
 
     /**
@@ -95,8 +89,6 @@ class DeviceKeySlot(frame: Frame) : Device(frame) {
             done(CtrlResponse())
             return
         }
-        // 不控制的一项从本地缓存状态中获取写入
-        val status = (deviceStatus as DeviceStatusKeySlot).slotList.find { it.ch == ch }
         (frame.newFrame().apply { cmd = frame.cmd }
             .buildCtrlKeySlotLockAndCharge(ch, isLock, isLock))
             .writeWithResponse {

+ 5 - 10
transport/src/main/java/com/iscs/comm/entity/device/DeviceLockSlot.kt

@@ -4,6 +4,7 @@ import com.iscs.comm.CommManager.writeWithResponse
 import com.iscs.comm.entity.CtrlResponse
 import com.iscs.comm.entity.Frame
 import com.iscs.comm.entity.device.status.DeviceStatus
+import com.iscs.comm.entity.device.status.DeviceStatusKeySlot
 import com.iscs.comm.entity.device.status.DeviceStatusLockSlot
 import com.iscs.comm.enums.DeviceType
 import com.iscs.comm.extension.buildCheckDeviceCtrlStatus
@@ -61,17 +62,11 @@ class DeviceLockSlot(frame: Frame) : Device(frame) {
      * 校验设备状态是否发生变化
      */
     override fun isDeviceStatusChanged(): Boolean {
-        var isChanged = false
-        (deviceStatus as DeviceStatusLockSlot).slotList.forEach { state ->
-            if (state.lastStatus != state.toString()) {
-                state.isChanged = true
-                state.lastStatus = state.toString()
-                if (!isChanged) isChanged = true
-            } else {
-                state.isChanged = false
-            }
+        for (slot in (deviceStatus as DeviceStatusLockSlot).slotList) {
+            // 只要有个槽位变化即认为状态变化
+            if (slot.isChanged()) return true
         }
-        return isChanged
+        return false
     }
 
     /**

+ 5 - 5
transport/src/main/java/com/iscs/comm/entity/device/status/DeviceStatusKeySlot.kt

@@ -1,7 +1,7 @@
 package com.iscs.comm.entity.device.status
 
 import com.iscs.comm.entity.Frame
-import com.iscs.comm.entity.device.status.bean.SlotKeyBean
+import com.iscs.comm.entity.device.status.bean.SlotKey
 import com.iscs.comm.extension.byte2ToInt
 import com.iscs.comm.extension.byteListToHexString
 import com.iscs.comm.extension.toBinaryString
@@ -13,13 +13,11 @@ import java.util.concurrent.ConcurrentLinkedQueue
 class DeviceStatusKeySlot : DeviceStatus() {
 
     // 仓位状态列表
-    val slotList = ConcurrentLinkedQueue<SlotKeyBean>()
+    val slotList = ConcurrentLinkedQueue<SlotKey>()
 
     init {
         // 初始化构建锁底座
-        for (i in 0..1) slotList.add(SlotKeyBean().apply {
-            ch = i
-        })
+        for (i in 0..1) slotList.add(SlotKey().apply { ch = i })
     }
 
     /**
@@ -28,6 +26,8 @@ class DeviceStatusKeySlot : DeviceStatus() {
      * @param frame 设备状态帧
      */
     override fun updateInfo(frame: Frame) {
+        // 更新状态前将同步当前状态
+        slotList.forEach { slot -> slot.updateLastStatus() }
         if (frame.data.size >= 10) {
             // 获取指定位置数据
             val dataL = frame.data[9].toBinaryString()

+ 5 - 5
transport/src/main/java/com/iscs/comm/entity/device/status/DeviceStatusLockSlot.kt

@@ -1,9 +1,7 @@
 package com.iscs.comm.entity.device.status
 
-import android.util.Log
 import com.iscs.comm.entity.Frame
-import com.iscs.comm.entity.device.status.bean.SlotBean
-import com.iscs.comm.extension.byte2ToInt
+import com.iscs.comm.entity.device.status.bean.SlotLock
 import com.iscs.comm.extension.byteListToHexString
 import com.iscs.comm.extension.toBinaryString
 import java.util.concurrent.ConcurrentLinkedQueue
@@ -16,11 +14,11 @@ import java.util.concurrent.ConcurrentLinkedQueue
 class DeviceStatusLockSlot() : DeviceStatus() {
 
     // 仓位状态列表
-    val slotList = ConcurrentLinkedQueue<SlotBean>()
+    val slotList = ConcurrentLinkedQueue<SlotLock>()
 
     init {
         // 初始化构建锁底座
-        for (i in 0..4) slotList.add(SlotBean(i, true))
+        for (i in 0..4) slotList.add(SlotLock().apply { ch = i })
     }
 
     /**
@@ -29,6 +27,8 @@ class DeviceStatusLockSlot() : DeviceStatus() {
      * @param frame 设备状态帧
      */
     override fun updateInfo(frame: Frame) {
+        // 更新状态前将同步当前状态
+        slotList.forEach { slot -> slot.updateLastStatus() }
         if (frame.data.size >= 9) {
             // 获取指定位置数据
             val data = frame.data[9].toBinaryString()

+ 72 - 0
transport/src/main/java/com/iscs/comm/entity/device/status/bean/Slot.kt

@@ -0,0 +1,72 @@
+package com.iscs.comm.entity.device.status.bean
+
+/**
+ * 锁仓基础字段构造
+ *
+ * @param ch            当前仓位ID
+ * @param isUsed        仓位是否使用的 true 被用 false 未使用
+ * @param isSlotLock    仓位是否锁定
+ * @param isWorked      是否工作的
+ */
+open class Slot(
+    open var ch: Int = -1,
+    open var isUsed: Boolean = false,
+    open var isSlotLock: Boolean = false,
+    open var isWorked: Boolean = false,
+    open var rfid: String = ""
+) {
+
+    /**
+     * 上一次状态
+     */
+    internal var lastStatus: MutableMap<String, Any> =
+        mutableMapOf("isUsed" to isUsed, "isSlotLock" to isSlotLock, "isWorked" to isWorked, "rfid" to rfid)
+
+
+    /**
+     * 更新上一次状态
+     */
+    internal fun updateStatus() {
+        lastStatus = mutableMapOf("isUsed" to isUsed, "isSlotLock" to isSlotLock, "isWorked" to isWorked, "rfid" to rfid)
+    }
+
+    /**
+     * 是否状态发生变化
+     */
+    open fun isChanged(): Boolean {
+        return isUsedChanged() || isSlotLockChanged() || isWorkedChanged() || isRfidChanged()
+    }
+
+    /**
+     * 槽位状态是否变化
+     */
+    fun isUsedChanged(): Boolean {
+        return lastStatus["isUsed"] as Boolean != isUsed
+    }
+
+    /**
+     * 槽位卡扣是否锁住
+     */
+    fun isSlotLockChanged(): Boolean {
+        return lastStatus["isSlotLock"] as Boolean != isSlotLock
+    }
+
+    /**
+     * 槽位是否正常工作
+     */
+    fun isWorkedChanged(): Boolean {
+        return lastStatus["isWorked"] as Boolean != isWorked
+    }
+
+    /**
+     * rfid是否发生变化
+     */
+    fun isRfidChanged(): Boolean {
+        return lastStatus["rfid"] as String != rfid
+    }
+
+    override fun toString(): String {
+        return "SlotBean(ch: $ch, isUsed: $isUsed, isSlotLock: $isSlotLock, isWorked: $isWorked, rfid: $rfid)"
+    }
+
+}

+ 0 - 33
transport/src/main/java/com/iscs/comm/entity/device/status/bean/SlotBean.kt

@@ -1,33 +0,0 @@
-package com.iscs.comm.entity.device.status.bean
-
-/**
- * 锁仓基础字段构造
- *
- * @param ch            当前仓位ID
- * @param isUsed        仓位是否使用的 true 被用 false 未使用
- * @param isSlotLock    仓位是否锁定
- * @param isWorked      是否工作的
- */
-open class SlotBean(
-    open var ch: Int = -1,
-    open var isUsed: Boolean = false,
-    open var isSlotLock: Boolean = false,
-    open var isWorked: Boolean = false,
-    open var rfid: String = ""
-) {
-
-    /**
-     * 上一次状态
-     */
-    var lastStatus = toString()
-
-    /**
-     * 是否变化了
-     */
-    var isChanged = false
-
-    override fun toString(): String {
-        return "SlotBean(ch: $ch, isUsed: $isUsed, isSlotLock: $isSlotLock, isWorked: $isWorked, rfid: $rfid)"
-    }
-
-}

+ 35 - 0
transport/src/main/java/com/iscs/comm/entity/device/status/bean/SlotKey.kt

@@ -0,0 +1,35 @@
+package com.iscs.comm.entity.device.status.bean
+
+/**
+ * 钥匙底座状态基础类
+ */
+class SlotKey(var isCharging: Boolean = false) : Slot() {
+
+    init {
+        // 初始化上一次的状态
+        lastStatus = mutableMapOf("isUsed" to isUsed, "isSlotLock" to isSlotLock, "isWorked" to isWorked, "rfid" to rfid, "isCharging" to isCharging)
+    }
+
+    internal fun updateLastStatus() {
+        lastStatus = mutableMapOf("isUsed" to isUsed, "isSlotLock" to isSlotLock, "isWorked" to isWorked, "rfid" to rfid, "isCharging" to isCharging)
+    }
+
+    /**
+     * 是否状态发生变化
+     */
+    override fun isChanged(): Boolean {
+        return isUsedChanged() || isSlotLockChanged() || isWorkedChanged() || isRfidChanged() || isChargingChanged()
+    }
+
+    /**
+     * 是否充电发生变化
+     */
+    fun isChargingChanged(): Boolean {
+        return lastStatus["isCharging"] as Boolean != isCharging
+    }
+
+    override fun toString(): String {
+        return "SlotKeyBean(ch: $ch, isUsed: $isUsed, isSlotLock: $isSlotLock, isWorked: $isWorked, rfid: $rfid, isCharging: $isCharging)"
+    }
+
+}

+ 0 - 12
transport/src/main/java/com/iscs/comm/entity/device/status/bean/SlotKeyBean.kt

@@ -1,12 +0,0 @@
-package com.iscs.comm.entity.device.status.bean
-
-/**
- * 钥匙底座状态基础类
- */
-class SlotKeyBean(var isCharging: Boolean = false) : SlotBean() {
-
-    override fun toString(): String {
-        return "SlotKeyBean(ch: $ch, isUsed: $isUsed, isSlotLock: $isSlotLock, isWorked: $isWorked, rfid: $rfid, isCharging: $isCharging)"
-    }
-
-}

+ 15 - 0
transport/src/main/java/com/iscs/comm/entity/device/status/bean/SlotLock.kt

@@ -0,0 +1,15 @@
+package com.iscs.comm.entity.device.status.bean
+
+/**
+ * 挂锁底座状态基础类
+ */
+class SlotLock : Slot() {
+
+    /**
+     * 更新上一次的状态
+     */
+    internal fun updateLastStatus() {
+        updateStatus()
+    }
+
+}