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

refactor(修改):
- 新增是否新设备的字段和更新判断
- 开关量新增模拟数据的

周文健 5 сар өмнө
parent
commit
9d9b098b69

+ 19 - 0
app/src/main/java/com/grkj/iscs/BusinessManager.kt

@@ -225,6 +225,9 @@ object BusinessManager {
 
         if (isNeedInit) {
             ModBusController.initDevicesStatus()
+            ModBusController.updateAllBuckleStatus {
+                //todo 上传开关信息
+            }
         }
     }
 
@@ -413,6 +416,11 @@ object BusinessManager {
                                             rfid
                                         )
                                         NetApi.getKeyInfo(rfid) {
+                                            ModBusController.updateKeyNewHardware(
+                                                dockBean.addr,
+                                                true,
+                                                it == null
+                                            )
                                             if (it != null && !it.macAddress.isNullOrEmpty()) {
                                                 ModBusController.updateKeyMac(
                                                     dockBean.addr,
@@ -446,6 +454,11 @@ object BusinessManager {
                                         )
 
                                         NetApi.getLockInfo(rfid) {
+                                            ModBusController.updateLockNewHardware(
+                                                dockBean.addr,
+                                                deviceBean.idx,
+                                                it == null
+                                            )
                                             if (it != null) {
                                                 // TODO 考虑快速拿取
                                                 ModBusController.controlLockBuckle(
@@ -625,6 +638,12 @@ object BusinessManager {
         callBack.invoke(key, lockMap)
     }
 
+    /**
+     * 获取开关量数据
+     */
+    fun getSwitchData(): MutableList<DockBean.SwitchBean> {
+        return ModBusController.getSwitchData()
+    }
 
     /****************************************** 蓝牙 ******************************************/
     /******************************************蓝牙通用准备******************************************/

+ 9 - 3
app/src/main/java/com/grkj/iscs/modbus/DockBean.kt

@@ -307,7 +307,7 @@ class DockBean(
                 DOCK_TYPE_COLLECT -> {
                     for (i in 0..7) {
                         if ((byteArray[4].toInt() shr i) and 0x1 == 1) {
-                            val switchBoardAddr = (0x20 + i).toByte()
+                            val switchBoardAddr = byteArrayOf(0x00, (0x20 + i).toByte())
                             ModBusController.readSwitchStatus(addr, switchBoardAddr) { res ->
                                 val switchStatus: MutableList<Boolean> = mutableListOf()
                                 for (switchIdx in 0..7) {
@@ -317,11 +317,16 @@ class DockBean(
                                     switchStatus.add((res[3].toInt() shr switchIdx) and 0x1 == 1)
                                 }
                                 for (idx in 0 until switchStatus.size) {
-                                    if (getSwitchList().isEmpty()) {
+                                    deviceList.filterIsInstance<SwitchBean>()
+                                        .find { it.switchBoardAddr == switchBoardAddr[1] && it.idx == idx }
+                                        ?.let {
+                                            it.enabled =
+                                                switchStatus[idx]
+                                        } ?: run {
                                         deviceList.add(
                                             SwitchBean(
                                                 idx,
-                                                switchBoardAddr,
+                                                switchBoardAddr[1],
                                                 switchStatus[idx]
                                             )
                                         )
@@ -428,6 +433,7 @@ class DockBean(
         var idx: Int,
         var isExist: Boolean,
         var lockEnabled: Boolean = false,
+        var newHardware: Boolean = false
     ) {
         override fun toString(): String {
             return "DeviceBean(type=$type, idx=$idx, isExist=$isExist)"

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

@@ -133,10 +133,10 @@ object ModBusCMDHelper {
     /**
      * 生成读取开关采集板的指令
      */
-    fun generateSwitchBoardStatusCmd(addr: Byte): MBFrame {
+    fun generateSwitchBoardStatusCmd(addr: ByteArray): MBFrame {
         return MBFrame(
             FRAME_TYPE_READ,
-            byteArrayOf(0x00, addr, 0x00, 0x01)
+            byteArrayOf(addr[0], addr[1], 0x00, 0x01)
         )
     }
 }

+ 57 - 8
app/src/main/java/com/grkj/iscs/modbus/ModBusController.kt

@@ -5,6 +5,7 @@ import com.clj.fastble.BleManager
 import com.grkj.iscs.BusinessManager
 import com.grkj.iscs.BusinessManager.CAN_RETURN
 import com.grkj.iscs.R
+import com.grkj.iscs.extentions.crc16
 import com.grkj.iscs.extentions.removeLeadingZeros
 import com.grkj.iscs.extentions.toHexStrings
 import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_CARD
@@ -23,6 +24,7 @@ import com.grkj.iscs.util.ToastUtils
 import com.grkj.iscs.util.log.LogUtil
 import java.util.concurrent.atomic.AtomicInteger
 import java.util.stream.Collectors
+import kotlin.random.Random
 
 
 /**
@@ -186,6 +188,9 @@ object ModBusController {
                         val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
                         LogUtil.i("初始化锁具 RFID : $rfid")
                         updateLockRfid(dockBean.addr, idx, rfid)
+                        NetApi.getLockInfo(rfid) {
+                            updateLockNewHardware(dockBean.addr, idx, it == null)
+                        }
                     }
                 }
                 controlLockBuckle(false, dockBean.addr, hasLockIdxList)
@@ -216,6 +221,7 @@ object ModBusController {
                             // 蓝牙准备操作
                             NetApi.getKeyInfo(rfid) {
                                 LogUtil.i("getKeyInfo : $rfid - ${it?.macAddress}")
+                                updateKeyNewHardware(dockBean.addr, isLeft, it == null)
                                 if (it != null && !it.macAddress.isNullOrEmpty()) {
                                     // 更新mac
                                     updateKeyMac(dockBean.addr, key.isLeft, it.macAddress)
@@ -412,7 +418,7 @@ object ModBusController {
     /**
      * 获取第1-8的锁仓数据和左右钥匙数据
      */
-    fun updateLockStatus(byteArray: ByteArray): DockBean? {
+    private fun updateLockStatus(byteArray: ByteArray): DockBean? {
         if (byteArray.isEmpty()) {
             return null
         }
@@ -423,7 +429,7 @@ object ModBusController {
     /**
      * 获取额外的9,10锁仓数据
      */
-    fun updateExtraLockStatus(byteArray: ByteArray): DockBean? {
+    private fun updateExtraLockStatus(byteArray: ByteArray): DockBean? {
         if (byteArray.isEmpty()) {
             return null
         }
@@ -568,7 +574,7 @@ object ModBusController {
     /**
      * 更新钥匙锁仓状态
      */
-    fun updateKeyLockStatus(slaveAddress: Byte, isLeft: Boolean, lockEnabled: Boolean) {
+    private fun updateKeyLockStatus(slaveAddress: Byte, isLeft: Boolean, lockEnabled: Boolean) {
         dockList.find { it.addr == slaveAddress }?.getKeyList()
             ?.find { it.isLeft == isLeft }?.lockEnabled = lockEnabled
     }
@@ -581,6 +587,14 @@ object ModBusController {
             mac
     }
 
+    /**
+     * 更新钥匙时候为新设备
+     */
+    fun updateKeyNewHardware(slaveAddress: Byte, isLeft: Boolean, newHardware: Boolean) {
+        dockList.find { it.addr == slaveAddress }?.getKeyList()
+            ?.find { it.isLeft == isLeft }?.newHardware = newHardware
+    }
+
     /**
      * 更新锁具RFID
      */
@@ -589,6 +603,14 @@ object ModBusController {
             rfid
     }
 
+    /**
+     * 更新锁是不是新设备,就是后台没有数据的
+     */
+    fun updateLockNewHardware(slaveAddress: Byte, lockIdx: Int, newHardware: Boolean) {
+        dockList.find { it.addr == slaveAddress }?.getLockList()
+            ?.find { it.idx == lockIdx }?.newHardware = newHardware
+    }
+
     /**
      * 更新锁仓状态
      */
@@ -920,17 +942,44 @@ object ModBusController {
         return map
     }
 
+    /**
+     * 获取开关量数据
+     */
+    fun getSwitchData(): MutableList<DockBean.SwitchBean> {
+        return dockList.filter { it.type == DOCK_TYPE_COLLECT }.map { it.getSwitchList() }.flatten()
+            .toMutableList()
+    }
+
     /**
      * 读取开关采集板数据
      */
     fun readSwitchStatus(
-        slaveAddress: Byte?, idx: Byte, done: ((res: ByteArray) -> Unit)? = null
+        slaveAddress: Byte?, addr: ByteArray, done: ((res: ByteArray) -> Unit)? = null
     ) {
         slaveAddress?.let {
-            ModBusCMDHelper.generateSwitchBoardStatusCmd(idx)?.let { cmd ->
-                modBusManager?.sendTo(it, cmd) { res ->
-                    done?.invoke(res)
-                }
+            ModBusCMDHelper.generateSwitchBoardStatusCmd(addr)?.let { cmd ->
+                //todo 模拟数据
+                val switchData = Random.nextBytes(2)
+                val switchDataFrame = ByteArray(5)
+                switchDataFrame[0] = slaveAddress
+                switchDataFrame[1] = FRAME_TYPE_READ
+                switchDataFrame[2] = 0x02
+                switchDataFrame[3] = switchData[0]
+                switchDataFrame[4] = switchData[1]
+                val switchDataFrameCRC = switchDataFrame.crc16(0, 4)
+                switchDataFrame[5] = switchDataFrameCRC[0]
+                switchDataFrame[6] = switchDataFrameCRC[1]
+                done?.invoke(
+                    byteArrayOf(
+                        slaveAddress,
+                        FRAME_TYPE_READ,
+                        switchData[0],
+                        switchData[1],
+                    ).crc16()
+                )
+//                modBusManager?.sendTo(it, cmd) { res ->
+//                    done?.invoke(res)
+//                }
             }
         }
     }

+ 16 - 0
app/src/main/java/com/grkj/iscs/modbus/ModBusManager.kt

@@ -4,6 +4,7 @@ import android.util.Log
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
 import com.grkj.iscs.MyApplication
+import com.grkj.iscs.extentions.crc16
 import com.grkj.iscs.extentions.toHexStrings
 import com.grkj.iscs.util.Executor
 import com.grkj.iscs.util.SPUtils
@@ -11,6 +12,7 @@ import com.grkj.iscs.util.log.LogUtil
 import com.grkj.iscs.view.fragment.DockTestFragment
 import kotlinx.coroutines.*
 import kotlinx.coroutines.channels.Channel
+import kotlin.random.Random
 
 /**
  * ModBus 协议管理器(协程版)
@@ -168,6 +170,20 @@ class ModBusManager(
         sendTo(mSlaveAddressList[index], frame) { res ->
             results.add(res)
             if (index == mSlaveAddressList.lastIndex) {
+                //todo 模拟开关级联板的数量
+                if (frame.type == FRAME_TYPE_READ && frame.data[0] == 0x00.toByte() && frame.data[0] == 0x11.toByte()) {
+                    val switchBoardSizeData = Random.nextBytes(1)
+                    val switchBoardSizeDataFrame = ByteArray(6)
+                    switchBoardSizeDataFrame[0] = 0xA1.toByte()
+                    switchBoardSizeDataFrame[1] = FRAME_TYPE_READ
+                    switchBoardSizeDataFrame[2] = 0x02
+                    switchBoardSizeDataFrame[3] = 0x00
+                    switchBoardSizeDataFrame[4] = switchBoardSizeData[0]
+                    val switchBoardSizeDataCRC = switchBoardSizeDataFrame.crc16(0, 3)
+                    switchBoardSizeDataFrame[4] = switchBoardSizeDataCRC[0]
+                    switchBoardSizeDataFrame[5] = switchBoardSizeDataCRC[1]
+                    results.add(switchBoardSizeDataFrame)
+                }
                 if (running) done?.invoke(results)
             } else sendUp(index + 1, frame, done, results)
         }