Parcourir la source

同步所有地方的锁具idx——0-9;添加同时开/关多把锁;将DeviceBean的idx改成addr,防止歧义

Frankensteinly il y a 1 an
Parent
commit
f1869fd19c

+ 20 - 1
app/src/main/java/com/grkj/iscs/activity/ModbusActivity.kt

@@ -11,6 +11,7 @@ import com.grkj.iscs.presenter.ModBusPresenter
 import com.grkj.iscs.util.Executor
 import com.grkj.iscs.util.ToastUtils
 import com.grkj.iscs.util.log.LogUtil
+import java.util.stream.Collectors
 
 class ModbusActivity : BaseMvpActivity<IModbusView, ModBusPresenter, ActivityModbusBinding>() {
 
@@ -21,7 +22,7 @@ class ModbusActivity : BaseMvpActivity<IModbusView, ModBusPresenter, ActivityMod
 
         presenter?.initModbus()
 
-        Executor.delayOnIO({
+        Executor.delayOnMain({
             ModBusController.initDevicesStatus()
         }, 3000)
 
@@ -199,6 +200,24 @@ class ModbusActivity : BaseMvpActivity<IModbusView, ModBusPresenter, ActivityMod
             }
         }
 
+        mBinding?.closeAllLockBuckles?.setOnClickListener {
+            ModBusController.deviceList.filter { it.type == 0x01.toByte() }.forEach { deviceBean ->
+                val list = deviceBean.lockList.stream().map { it.idx }.collect(Collectors.toList())
+                ModBusController.controlLockBuckle(false, deviceBean.addr!!.toInt() - 1, list) {
+                    LogUtil.i("关所有锁卡扣 : ${it.toHexStrings()}")
+                }
+            }
+        }
+
+        mBinding?.openAllLockBuckles?.setOnClickListener {
+            ModBusController.deviceList.filter { it.type == 0x01.toByte() }.forEach { deviceBean ->
+                val list = deviceBean.lockList.stream().map { it.idx }.collect(Collectors.toList())
+                ModBusController.controlLockBuckle(true, deviceBean.addr!!.toInt() - 1, list) {
+                    LogUtil.i("开所有锁卡扣 : ${it.toHexStrings()}")
+                }
+            }
+        }
+
         mBinding?.exit?.setOnClickListener { finish() }
     }
 

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

@@ -5,13 +5,13 @@ import com.grkj.iscs.util.log.LogUtil
 /**
  * RS-485 设备信息 Bean
  *
- * @param idx 设备序号(地址)
+ * @param addr 设备地址
  * @param type 0x00:钥匙底座 0x01:锁具底座  0x02:电磁锁控制板
  * @param keyList 钥匙列表,钥匙底座才有
  * @param lockList 锁具列表,锁具底座才有
  */
 class DeviceBean(
-    var idx: Byte?,
+    var addr: Byte?,
     var type: Byte?,
     var keyList: MutableList<KeyBean>,
     var lockList: MutableList<LockBean>
@@ -66,7 +66,7 @@ class DeviceBean(
 
                     if (lockList.isEmpty()) {
                         for (i in 0 until tempList.size) {
-                            lockList.add(LockBean(i + 1, tempList[i], null))
+                            lockList.add(LockBean(i, tempList[i], null))
                         }
                     }
 
@@ -104,7 +104,7 @@ class DeviceBean(
     }
 
     override fun toString(): String {
-        return "DeviceBean(idx=$idx, type=$type, keyList=$keyList, lockList=$lockList)"
+        return "DeviceBean(addr=$addr, type=$type, keyList=$keyList, lockList=$lockList)"
     }
 
 
@@ -116,7 +116,7 @@ class DeviceBean(
     /**
      * 锁具
      *
-     * @param idx 锁具序号 1-10
+     * @param idx 锁具序号 0-9
      * @param rfid 锁具的RFID(仅有关闭锁扣的时候读取并保存,否则为null)
      */
     data class LockBean(var idx: Int, var hasLock: Boolean, var rfid: String?)

+ 27 - 16
app/src/main/java/com/grkj/iscs/modbus/ModBusController.kt

@@ -116,7 +116,7 @@ object ModBusController {
                 LogUtil.i("initDevicesStatus 设备(${bytes[0].toInt()})类型:$type")
             }
         }
-        Executor.delayOnIO({
+        Executor.delayOnMain({
             // TODO 待完善
             initLock()    // TODO 打开所有无锁的卡扣、读取所有锁的RFID
             initKey()     // TODO 打开所有无钥匙的卡扣、关闭所有钥匙灯光、读取所有钥匙的RFID
@@ -131,15 +131,14 @@ object ModBusController {
     private fun initLock() {
         LogUtil.i("initLock : $deviceList")
         deviceList.filter { it.type == 0x01.toByte() }.forEach { deviceBean ->
-            deviceBean.lockList.forEach { lockBean ->
-                if (lockBean.hasLock) {
-                    LogUtil.i("initLock rfid: ${deviceBean.idx!!.toInt() - 1} : ${lockBean.idx}")
-                    readLockRfid(deviceBean.idx!!.toInt() - 1, lockBean.idx)
-                } else {
-                    LogUtil.i("initLock buckle : ${deviceBean.idx!!.toInt() - 1} : ${lockBean.idx}")
-                    controlLockBuckle(false, deviceBean.idx!!.toInt() - 1, lockBean.idx)
-                }
+            val hasLockIdxList = deviceBean.lockList.filter { it.hasLock }.map { it.idx }
+            val noLockIdxList = deviceBean.lockList.filter { !it.hasLock }.map { it.idx } as MutableList<Int>
+
+            hasLockIdxList.forEach { idx ->
+                readLockRfid(deviceBean.addr!!.toInt() - 1, idx)
             }
+
+            controlLockBuckle(true, deviceBean.addr!!.toInt() - 1, noLockIdxList)
         }
     }
 
@@ -149,11 +148,11 @@ object ModBusController {
     private fun initKey() {
         LogUtil.i("initKey : $deviceList")
         deviceList.filter { it.type == 0x00.toByte() }.forEach { deviceBean ->
-            controlKeyLight(deviceBean.idx!!.toInt() - 1, 2, 2)
+            controlKeyLight(deviceBean.addr!!.toInt() - 1, 2, 2)
             deviceBean.keyList.forEach { key ->
                 if (key.hasKey) {
-                    LogUtil.i("initKey : ${deviceBean.idx!!.toInt() - 1} : ${key.isLeft}")
-                    readKeyRfid(deviceBean.idx!!.toInt() - 1, key.isLeft)
+                    LogUtil.i("initKey : ${deviceBean.addr!!.toInt() - 1} : ${key.isLeft}")
+                    readKeyRfid(deviceBean.addr!!.toInt() - 1, key.isLeft)
                 } else {
                     // TODO 关闭钥匙卡扣
                 }
@@ -168,7 +167,7 @@ object ModBusController {
         if (byteArray.isEmpty()) {
             return null
         }
-        val deviceBean = deviceList.find { it.idx == byteArray[0] }
+        val deviceBean = deviceList.find { it.addr == byteArray[0] }
         return deviceBean?.parseStatus(byteArray) ?: let {
             val temp = DeviceBean(byteArray[0], null, mutableListOf(), mutableListOf())
             deviceList.add(temp)
@@ -189,7 +188,7 @@ object ModBusController {
      * 更新设备类型
      */
     fun updateDeviceType(idx: Byte?, type: Byte?) {
-        deviceList.find { it.idx == idx }?.type = type
+        deviceList.find { it.addr == idx }?.type = type
     }
 
     /**
@@ -225,6 +224,18 @@ object ModBusController {
         }
     }
 
+    fun controlLockBuckle(isOpen: Boolean, slaveIdx: Int?, lockIdxList: MutableList<Int>, done: ((res: ByteArray) -> Unit)? = null)  {
+        slaveIdx?.let {
+            modBusManager?.generateLockBuckleCmd(isOpen, lockIdxList)?.let { cmdList ->
+                cmdList.forEach { cmd ->
+                    modBusManager?.sendTo(it, cmd) { res ->
+                        done?.invoke(res)
+                    }
+                }
+            }
+        }
+    }
+
     /**
      * 读取钥匙RFID
      */
@@ -255,7 +266,7 @@ object ModBusController {
      * 更新钥匙RFID
      */
     fun updateKeyRfid(slaveIdx: Int, isLeft: Boolean, rfid: String) {
-        deviceList.find { it.idx?.toInt() == slaveIdx }?.keyList?.find { it.isLeft == isLeft }?.rfid = rfid
+        deviceList.find { it.addr?.toInt() == slaveIdx }?.keyList?.find { it.isLeft == isLeft }?.rfid = rfid
     }
 
     /**
@@ -269,7 +280,7 @@ object ModBusController {
      * 更新锁具RFID
      */
     fun updateLockRfid(slaveIdx: Int, lockIdx: Int, rfid: String) {
-        deviceList.find { it.idx?.toInt() == slaveIdx }?.lockList?.find { it.idx == lockIdx }?.rfid = rfid
+        deviceList.find { it.addr?.toInt() == slaveIdx }?.lockList?.find { it.idx == lockIdx }?.rfid = rfid
     }
 
     /**

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

@@ -277,6 +277,35 @@ class ModBusManager(
         )
     }
 
+    fun generateLockBuckleCmd(isOpen: Boolean, lockIndexList: MutableList<Int>): MutableList<MBFrame> {
+        var str = ""
+        val rstList = mutableListOf<MBFrame>()
+        val smallIdxList = lockIndexList.filter { it in 0..7 }
+        val bigIdxList = lockIndexList.filter { it in 8..15 }
+        if (smallIdxList.isNotEmpty()) {
+            for (i in 7 downTo 0) {
+                str += if (smallIdxList.contains(i)) {
+                    "1"
+                } else {
+                    "0"
+                }
+            }
+            rstList.add(MBFrame(FRAME_TYPE_WRITE, byteArrayOf(0x00, 0x11, str.toInt(2).toByte(), if (isOpen) 0x00 else 0xFF.toByte())))
+        }
+        if (bigIdxList.isNotEmpty()) {
+            str = ""
+            for (i in 7 downTo 0) {
+                str += if (bigIdxList.contains(i)) {
+                    "1"
+                } else {
+                    "0"
+                }
+            }
+            rstList.add(MBFrame(FRAME_TYPE_WRITE, byteArrayOf(0x00, 0x12, str.toInt(2).toByte(), if (isOpen) 0x00 else 0xFF.toByte())))
+        }
+        return rstList
+    }
+
     /**
      * 生成读钥匙RFID指令
      */

+ 25 - 0
app/src/main/res/layout/activity_modbus.xml

@@ -185,4 +185,29 @@
             android:textSize="8sp"
             android:layout_margin="5dp"/>
     </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+        <Button
+            android:id="@+id/closeAllLockBuckles"
+            android:layout_width="100dp"
+            android:layout_height="40dp"
+            android:minWidth="0dp"
+            android:minHeight="0dp"
+            android:text="Close All Lock Buckles"
+            android:textSize="8sp"
+            android:layout_margin="5dp"/>
+
+        <Button
+            android:id="@+id/openAllLockBuckles"
+            android:layout_width="100dp"
+            android:layout_height="40dp"
+            android:minWidth="0dp"
+            android:minHeight="0dp"
+            android:text="Open All Lock Buckles"
+            android:textSize="8sp"
+            android:layout_margin="5dp"/>
+    </LinearLayout>
 </LinearLayout>