Эх сурвалжийг харах

refactor(钥匙电量检测和充电判断)
- 新增钥匙的电量检测和充电判断

周文健 5 сар өмнө
parent
commit
86b39ba6b7

+ 78 - 31
app/src/main/java/com/grkj/iscs/BusinessManager.kt

@@ -172,6 +172,11 @@ object BusinessManager {
                                         keyBean.isLeft,
                                         dock?.addr
                                     )
+                                    ModBusController.controlKeyCharge(
+                                        false,
+                                        keyBean.isLeft,
+                                        dock?.addr
+                                    )
                                     ModBusController.updateKeyReadyStatus(
                                         it.data.bleBean.bleDevice.mac,
                                         false,
@@ -314,6 +319,11 @@ object BusinessManager {
 
     /**
      * 硬件状态
+     * 1、检测到有钥匙
+     * 2、上锁
+     * 3、开启充电
+     * 4、蓝牙连接
+     * 5、蓝牙数据通讯
      */
     private fun deviceStatusHandle(res: Any) {
         LogUtil.i("硬件状态:${(res as List<ByteArray>).map { it.toHexStrings() }}")
@@ -339,38 +349,44 @@ object BusinessManager {
                 DOCK_TYPE_KEY -> {
                     dockBean.getKeyList().forEach { keyBean ->
                         if (keyBean.isExist) {
-//                            sendLoadingEventMsg(CommonUtils.getStr(R.string.ble_connecting))
-                            // 放回钥匙,读取rfid
-                            ModBusController.readKeyRfid(
-                                dockBean.addr,
-                                if (keyBean.isLeft) 0 else 1
-                            ) { isLeft, res ->
-                                if (res.size < 11) {
-                                    LogUtil.e("Key rfid error")
-                                    return@readKeyRfid
-                                }
-                                val rfid = res.copyOfRange(3, 11).toHexStrings(false)
-                                    .removeLeadingZeros()
-                                ModBusController.updateKeyRfid(
+                            // 放回钥匙,上锁
+                            ModBusController.controlKeyBuckle(
+                                false,
+                                keyBean.isLeft,
+                                dockBean.addr
+                            ) {
+                                // 放回钥匙,读取rfid
+                                ModBusController.readKeyRfid(
                                     dockBean.addr,
-                                    keyBean.isLeft,
-                                    rfid
-                                )
-                                NetApi.getKeyInfo(rfid) {
-                                    if (it != null && !it.macAddress.isNullOrEmpty()) {
-                                        ModBusController.updateKeyMac(
-                                            dockBean.addr,
-                                            keyBean.isLeft,
-                                            it.macAddress
-                                        )
-                                        ModBusController.updateKeyReadyStatus(
-                                            it.macAddress,
-                                            false,
-                                            5
-                                        )
-                                    } else {
-                                        LogUtil.e("Get key info fail : $rfid")
-                                        ToastUtils.tip(R.string.get_key_info_fail)
+                                    if (keyBean.isLeft) 0 else 1
+                                ) { isLeft, res ->
+                                    if (res.size < 11) {
+                                        LogUtil.e("Key rfid error")
+                                        return@readKeyRfid
+                                    }
+                                    val rfid = res.copyOfRange(3, 11).toHexStrings(false)
+                                        .removeLeadingZeros()
+                                    ModBusController.updateKeyRfid(
+                                        dockBean.addr,
+                                        keyBean.isLeft,
+                                        rfid
+                                    )
+                                    NetApi.getKeyInfo(rfid) {
+                                        if (it != null && !it.macAddress.isNullOrEmpty()) {
+                                            ModBusController.updateKeyMac(
+                                                dockBean.addr,
+                                                keyBean.isLeft,
+                                                it.macAddress
+                                            )
+                                            ModBusController.updateKeyReadyStatus(
+                                                it.macAddress,
+                                                false,
+                                                5
+                                            )
+                                        } else {
+                                            LogUtil.e("Get key info fail : $rfid")
+                                            ToastUtils.tip(R.string.get_key_info_fail)
+                                        }
                                     }
                                 }
                             }
@@ -1043,6 +1059,15 @@ object BusinessManager {
             byteArray.startsWith(BleConst.RSP_WORK_TICKET_RESULT) && byteArray[3] == 0x02.toByte() -> handleTicketStatus(
                 bleBean.bleDevice, byteArray, isNeedLoading
             )
+
+            byteArray.startsWith(BleConst.RSP_POWER_STATUS) -> {
+                val power = byteArray[4].toInt()
+                if (power < 50) {//如果电量小于50就打开仓位充电
+                    ModBusController.controlKeyCharge(true, bleBean.bleDevice.mac) {
+                        LogUtil.i("钥匙: ${bleBean.bleDevice.mac} 开始充电")
+                    }
+                }
+            }
         }
     }
 
@@ -1172,6 +1197,28 @@ object BusinessManager {
         })
     }
 
+    /**
+     * 获取电池电量
+     */
+    fun getBatteryPower(bleDevice: BleDevice) {
+        LogUtil.i("获取电池电量:${bleDevice.mac}")
+        BleCmdManager.getPower(bleDevice.mac, object : CustomBleWriteCallback() {
+            override fun onWriteSuccess(p0: Int, p1: Int, p2: ByteArray?) {
+                LogUtil.i("发送获取电池电量命令成功:${bleDevice.mac}")
+            }
+
+            override fun onWriteFailure(p0: BleException?) {
+                ThreadUtils.runOnIODelayed(500) {
+                    LogUtil.i("发送获取电池电量命令失败:${bleDevice.mac}")
+                    getBatteryPower(bleDevice)
+                }
+            }
+        })
+    }
+
+    /**
+     * 切换工作模式
+     */
     private fun switchWorkMode(bleDevice: BleDevice, isNeedLoading: Boolean = false) {
         LogUtil.i("switchWorkMode - ${bleDevice.mac}")
         BleCmdManager.switchMode(STATUS_WORK, bleDevice, object : CustomBleWriteCallback() {

+ 0 - 2
app/src/main/java/com/grkj/iscs/ble/BleConnectionManager.kt

@@ -398,8 +398,6 @@ object BleConnectionManager {
 
                     override fun onIndicateSuccess() {
                         LogUtil.i("onIndicateSuccess")
-//                    val testStr = "{\"cardNo\":\"80A8C0F4EA\",\"password\":\"12345678\",\"effectiveTime\":24,\"data\":[{\"taskCode\":\"202401020001\",\"taskId\":\"71b49baa49b343bc84d7e6b829ac1bdc\",\"codeId\":1,\"dataList\":[{\"dataId\":1,\"equipRfidNo\":\"049648B2E31690\",\"infoRfidNo\":\"04E3BCCA201290\",\"target\":1},{\"dataId\":2,\"equipRfidNo\":\"0405982414C563\",\"target\":0,\"prevId\":1}]},{\"taskCode\":\"202401020002\",\"taskId\":\"145b5a4cc38c41e19943f4c8b48d12b0\",\"codeId\":2,\"dataList\":[{\"dataId\":1,\"equipRfidNo\":\"045460F7F4F438\",\"infoRfidNo\":\"04BC6584C65009\",\"target\":1},{\"dataId\":2,\"equipRfidNo\":\"042B99E449E795\",\"target\":0,\"prevId\":1},{\"dataId\":3,\"equipRfidNo\":\"04A312EE848B62\",\"infoRfidNo\":\"04220E86831289\",\"target\":1,\"prevId\":2}]}],\"lockList\":[{\"lockId\":\"1\",\"rfid\":\"040E21443010E9\"},{\"lockId\":\"2\",\"rfid\":\"0457505E5861C2\"}]}"
-//                    sendTicket(testStr, it.bleDevice, loadingCallBack)
                         isIndicateSuccess = true
                         getToken(bleBean, isNeedLoading, prepareDoneCallBack)
                     }

+ 19 - 11
app/src/main/java/com/grkj/iscs/modbus/ModBusCMDHelper.kt

@@ -112,12 +112,30 @@ object ModBusCMDHelper {
             byteArrayOf(
                 0x00,
                 0x11,
-                if (index == 1) 0b00010000.toByte() else 0b0000001,
+                if (index == 1) 0b00010000.toByte() else 0b0000001.toByte(),
                 if (isOpen) 0x00 else 0xFF.toByte()
             )
         )
     }
 
+    /**
+     * 操作钥匙/便携式底座钥匙充电,一次只操作一个卡扣
+     *
+     * @param isOpen true:开操作 false:关操作
+     * @param index 0:左 1:右 便携式底座钥匙传0
+     */
+    fun generateKeyBuckleChargeCmd(isOpen: Boolean, index: Int): MBFrame {
+        return MBFrame(
+            FRAME_TYPE_WRITE,
+            byteArrayOf(
+                0x00,
+                0x11,
+                if (index == 1) 0b00100000.toByte() else 0b0000010.toByte(),
+                if (isOpen) 0xFF.toByte() else 0x00.toByte()
+            )
+        )
+    }
+
     /**
      * 生成RFID 读指令
      *
@@ -139,14 +157,4 @@ object ModBusCMDHelper {
             byteArrayOf(addr[0], addr[1], 0x00, 0x01)
         )
     }
-
-    /**
-     * 钥匙充电指令
-     */
-    fun generateKeyChargeCmd(addr: ByteArray): MBFrame {
-        return MBFrame(
-            FRAME_TYPE_WRITE,
-            byteArrayOf(addr[0], addr[1], 0x00, 0x01)
-        )
-    }
 }

+ 38 - 0
app/src/main/java/com/grkj/iscs/modbus/ModBusController.kt

@@ -231,6 +231,7 @@ object ModBusController {
                                                 BusinessManager.getCurrentStatus(
                                                     3, bleBean.bleDevice
                                                 )
+                                                BusinessManager.getBatteryPower(bleBean.bleDevice)
                                             }
                                         }
                                     }
@@ -242,6 +243,11 @@ object ModBusController {
                         controlKeyBuckle(false, key.isLeft, dockBean.addr)
                     } else {
                         controlKeyBuckle(true, key.isLeft, dockBean.addr)
+                        controlKeyCharge(
+                            false,
+                            key.isLeft,
+                            dockBean.addr
+                        )
                     }
                 }
             }
@@ -680,6 +686,38 @@ object ModBusController {
         }
     }
 
+    /**
+     * 控制钥匙充电
+     */
+    fun controlKeyCharge(isOpen: Boolean, mac: String, done: ((res: ByteArray) -> Unit)? = null) {
+        val dockBean = getDockByKeyMac(mac)
+        dockBean ?: return
+        val key = getKeyByMac(mac)
+        key ?: return
+        controlKeyCharge(isOpen, key.isLeft, dockBean.addr, done)
+    }
+
+    /**
+     * 开/关钥匙充电
+     *
+     * @param isOpen true:开操作 false:关操作
+     * @param isLeft true:左充电 false:右充电
+     */
+    fun controlKeyCharge(
+        isOpen: Boolean,
+        isLeft: Boolean,
+        slaveAddress: Byte?,
+        done: ((res: ByteArray) -> Unit)? = null
+    ) {
+        slaveAddress?.let {
+            ModBusCMDHelper.generateKeyBuckleChargeCmd(isOpen, if (isLeft) 0 else 1)?.let { cmd ->
+                modBusManager?.sendTo(it, cmd) { res ->
+                    done?.invoke(res)
+                }
+            }
+        }
+    }
+
     /**
      * 根据RFID找钥匙
      */

+ 1 - 0
app/src/main/java/com/grkj/iscs/view/presenter/HomePresenter.kt

@@ -39,6 +39,7 @@ class HomePresenter : BasePresenter<IHomeView>() {
                                                     4,
                                                     bleBean.bleDevice
                                                 )
+                                                BusinessManager.getBatteryPower(bleBean.bleDevice)
                                             }
                                         }
                                     }