Bläddra i källkod

添加底座卡扣状态查询、判断;添加钥匙rfid查询、判断

Frankensteinly 1 år sedan
förälder
incheckning
eeea8e2f75

+ 56 - 8
app/src/main/java/com/grkj/iscs/activity/ModbusActivity.kt

@@ -28,16 +28,56 @@ class ModbusActivity : BaseMvpActivity<IModbusView, ModBusPresenter, ActivityMod
             }
         }
 
-        mBinding?.buckleStatus?.setOnClickListener {
-            ModBusController.readBuckleStatus(null, { res ->
-                LogUtil.i("单卡扣状态 : ${res.toHexStrings()}")
-            },
-            { res ->
-                LogUtil.i("多卡扣状态 : ${res.map { it.toHexStrings()}}")
-                res.forEach { bytes ->
+        mBinding?.keyBuckleStatus?.setOnClickListener {
+            // TODO slaveIdx暂时写死,调试用
+            ModBusController.readBuckleStatus(false, 1) { type, res ->
+                LogUtil.i("单slave卡扣状态 : $type - ${res.toHexStrings()}")
+                when (type) {
+                    0 -> {
+                        val isLeftLock = (res[4].toInt() shr 0) and 0x1 == 1
+                        val isRightLock = (res[4].toInt() shr 4) and 0x1 == 1
+                        println("钥匙底座卡扣状态 : $isLeftLock - $isRightLock")
+                    }
+                    1 -> {
+                        val tempList = mutableListOf<Boolean>()
+                        for (i in 0..7) {
+                            tempList.add((res[4].toInt() shr i) and 0x1 == 1)
+                        }
+                        println("锁具底座卡扣1-8状态 : $tempList")
+                    }
+                    2 -> {
+                        val lock9Status = (res[4].toInt() shr 0) and 0x1 == 1
+                        val lock10Status = (res[4].toInt() shr 1) and 0x1 == 1
+                        println("锁具底座卡扣9、10状态 : $lock9Status - $lock10Status")
+                    }
+                }
+            }
+        }
 
+        mBinding?.lockBuckleStatus?.setOnClickListener {
+            // TODO slaveIdx暂时写死,调试用
+            ModBusController.readBuckleStatus(true, 0) { type, res ->
+                LogUtil.i("单slave卡扣状态 : $type - ${res.toHexStrings()}")
+                when (type) {
+                    0 -> {
+                        val isLeftLock = (res[4].toInt() shr 0) and 0x1 == 1
+                        val isRightLock = (res[4].toInt() shr 4) and 0x1 == 1
+                        println("钥匙底座卡扣状态 : $isLeftLock - $isRightLock")
+                    }
+                    1 -> {
+                        val tempList = mutableListOf<Boolean>()
+                        for (i in 0..7) {
+                            tempList.add((res[4].toInt() shr i) and 0x1 == 1)
+                        }
+                        println("锁具底座卡扣1-8状态 : $tempList")
+                    }
+                    2 -> {
+                        val lock9Status = (res[4].toInt() shr 0) and 0x1 == 1
+                        val lock10Status = (res[4].toInt() shr 1) and 0x1 == 1
+                        println("锁具底座卡扣9、10状态 : $lock9Status - $lock10Status")
+                    }
                 }
-            })
+            }
         }
 
         mBinding?.deviceType?.setOnClickListener {
@@ -108,6 +148,14 @@ class ModbusActivity : BaseMvpActivity<IModbusView, ModBusPresenter, ActivityMod
             }
         }
 
+        mBinding?.keyRfid?.setOnClickListener {
+            // TODO 暂时写死,调试用
+            ModBusController.readKeyRfid(1, true) { res ->
+                val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
+                println("钥匙RFID : $rfid")
+            }
+        }
+
         mBinding?.exit?.setOnClickListener { finish() }
     }
 

+ 22 - 7
app/src/main/java/com/grkj/iscs/modbus/ModBusController.kt

@@ -115,15 +115,20 @@ object ModBusController {
 
     /**
      * 读取卡扣状态
+     *
+     * @param isLock true:读锁具底座 false:读钥匙底座
+     * @param type 0:钥匙底座 1:锁具底座1-8 2:锁具底座9、10
      */
-    fun readBuckleStatus(index: Int?, doneSingle: ((res: ByteArray) -> Unit)? = null, doneAll: ((res: List<ByteArray>) -> Unit)? = null) {
-        index?.let {
+    fun readBuckleStatus(isLock: Boolean, slaveIdx: Int?, doneSingle: ((type: Int, res: ByteArray) -> Unit)? = null) {
+        // TODO 电磁锁控制板可能不是,并且锁和钥匙的读取不一样
+        slaveIdx?.let {
             modBusManager?.sendTo(it, MBFrame.READ_BUCKLE_STATUS) { res ->
-                doneSingle?.invoke(res)
+                doneSingle?.invoke(if (isLock) 1 else 0, res)
             }
-        } ?: let {
-            modBusManager?.sendToAll(MBFrame.READ_BUCKLE_STATUS) { res ->
-                doneAll?.invoke(res)
+            if (isLock) {
+                modBusManager?.sendTo(it, MBFrame.READ_LOCK_BUCKLE_EXTRA_STATUS) { res ->
+                    doneSingle?.invoke(2, res)
+                }
             }
         }
     }
@@ -137,7 +142,7 @@ object ModBusController {
             }
         }
     }
-    
+
     fun closeLockBuckle(slaveIdx: Int?, lockIdx: Int, done: ((res: ByteArray) -> Unit)? = null)  {
         slaveIdx?.let {
             modBusManager?.generateLockBuckleCmd(false, lockIdx)?.let { cmd ->
@@ -148,6 +153,16 @@ object ModBusController {
         }
     }
 
+    fun readKeyRfid(slaveIdx: Int?, isLeft: Boolean, done: ((res: ByteArray) -> Unit)? = null) {
+        slaveIdx?.let {
+            modBusManager?.generateKeyRfidCmd(isLeft)?.let { cmd ->
+                modBusManager?.sendTo(it, cmd) {
+                    done?.invoke(it)
+                }
+            }
+        }
+    }
+
     fun readLockRfid(slaveIdx: Int?, lockIdx: Int, done: ((res: ByteArray) -> Unit)? = null) {
         slaveIdx?.let {
             modBusManager?.generateLockRfidCmd(lockIdx)?.let { cmd ->

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

@@ -266,7 +266,7 @@ class ModBusManager(
             }
         }
 
-        // TODO 第三位是 是否响应,第四位是关哪个
+        // 第三位是 是否响应,第四位是操作哪个,操作默认全是0或者1,使用第三位响应来进行操作
         return MBFrame(FRAME_TYPE_WRITE,
             byteArrayOf(0x00,
                 if (lockIndex in 0..7) 0x11 else 0x12,
@@ -274,9 +274,12 @@ class ModBusManager(
                 if (isOpen) 0x00 else 0xFF.toByte()))
     }
 
-//    fun generateKeyRfidCmd(): MBFrame {
-//
-//    }
+    fun generateKeyRfidCmd(isLeft: Boolean): MBFrame {
+        return MBFrame(
+            FRAME_TYPE_READ,
+            byteArrayOf(0x00, if (isLeft) 0x20 else 0x24, 0x00, 0x04)
+        )
+    }
 
     /**
      * 生成锁具 RFID 读指令
@@ -520,11 +523,19 @@ class MBFrame(
         )
 
         /**
-         * 读卡扣状态
+         * 读卡扣状态(钥匙、锁的0-7)
          */
         val READ_BUCKLE_STATUS = MBFrame(
             FRAME_TYPE_READ,
             byteArrayOf(0x00, 0x11, 0x00, 0x01)
         )
+
+        /**
+         * 读卡扣状态(锁的9、10)
+         */
+        val READ_LOCK_BUCKLE_EXTRA_STATUS = MBFrame(
+            FRAME_TYPE_READ,
+            byteArrayOf(0x00, 0x12, 0x00, 0x01)
+        )
     }
 }

+ 22 - 2
app/src/main/res/layout/activity_modbus.xml

@@ -25,12 +25,32 @@
             android:layout_margin="5dp"/>
 
         <Button
-            android:id="@+id/buckleStatus"
+            android:id="@+id/keyBuckleStatus"
             android:layout_width="100dp"
             android:layout_height="40dp"
             android:minWidth="0dp"
             android:minHeight="0dp"
-            android:text="Buckle Status"
+            android:text="Key Buckle Status"
+            android:textSize="8sp"
+            android:layout_margin="5dp"/>
+
+        <Button
+            android:id="@+id/lockBuckleStatus"
+            android:layout_width="100dp"
+            android:layout_height="40dp"
+            android:minWidth="0dp"
+            android:minHeight="0dp"
+            android:text="Lock Buckle Status"
+            android:textSize="8sp"
+            android:layout_margin="5dp"/>
+
+        <Button
+            android:id="@+id/keyRfid"
+            android:layout_width="100dp"
+            android:layout_height="40dp"
+            android:minWidth="0dp"
+            android:minHeight="0dp"
+            android:text="Key Rfid"
             android:textSize="8sp"
             android:layout_margin="5dp"/>