Prechádzať zdrojové kódy

适配Modbus地址池,Modbus调试页输入框待适配

Frankensteinly 9 mesiacov pred
rodič
commit
c69b8bf1ce

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

@@ -86,8 +86,8 @@ object BusinessManager {
     /****************************************** ModBus ******************************************/
 
     fun connectDock(isNeedInit: Boolean = false) {
-        // 暂定100上限
-        ModBusController.setSlaveCount(100)
+        // 不再使用SlaveCount,改用地址池
+//        ModBusController.setSlaveCount(100)
         ModBusController.interruptReadTrashBinStatus(false)
         ModBusController.start(MyApplication.instance!!.applicationContext)
         ModBusController.unregisterListener(MyApplication.instance!!.applicationContext)
@@ -131,16 +131,16 @@ object BusinessManager {
                         dockBean.getKeyList().forEach { keyBean ->
                             if (keyBean.isExist) {
                                 // 放回钥匙,读取rfid
-                                ModBusController.readKeyRfid(dockBean.addr.toInt() - 1, if (keyBean.isLeft) 0 else 1) { isLeft, res ->
+                                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(dockBean.addr.toInt(), keyBean.isLeft, rfid)
+                                    ModBusController.updateKeyRfid(dockBean.addr, keyBean.isLeft, rfid)
                                     NetApi.getKeyInfo(rfid) {
                                         if (it != null && !it.macAddress.isNullOrEmpty()) {
-                                            ModBusController.updateKeyMac(dockBean.addr.toInt(), keyBean.isLeft, it.macAddress)
+                                            ModBusController.updateKeyMac(dockBean.addr, keyBean.isLeft, it.macAddress)
                                             // TODO 移动到HomePresenter里,根据业务进行处理
 //                                            showKeyReturnDialog(it.macAddress, isLeft, dockBean.addr.toInt())
 //                                            registerConnectListener(it.macAddress)
@@ -162,17 +162,17 @@ object BusinessManager {
                     DOCK_TYPE_LOCK -> {
                         dockBean.getLockList().forEach { lockBean ->
                             if (lockBean.isExist) {
-                                ModBusController.readLockRfid(dockBean.addr.toInt() - 1, lockBean.idx) { res ->
+                                ModBusController.readLockRfid(dockBean.addr, lockBean.idx) { res ->
                                     if (res.size < 11) {
                                         LogUtil.e("Lock rfid error")
                                         return@readLockRfid
                                     }
                                     val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
-                                    ModBusController.updateLockRfid(dockBean.addr.toInt(), lockBean.idx, rfid)
+                                    ModBusController.updateLockRfid(dockBean.addr, lockBean.idx, rfid)
                                     NetApi.getLockInfo(rfid) {
                                         if (it != null) {
                                             // TODO 考虑快速拿取
-                                            ModBusController.controlLockBuckle(false, dockBean.addr.toInt() - 1, lockBean.idx) { itRst ->
+                                            ModBusController.controlLockBuckle(false, dockBean.addr, lockBean.idx) { itRst ->
                                                 if (itRst.isNotEmpty()) {
                                                     // 上报锁具信息
                                                     NetApi.updateLockReturn(rfid, MyApplication.instance!!.serialNo()) {}
@@ -193,17 +193,17 @@ object BusinessManager {
                             if (deviceBean.isExist) {
                                 when (deviceBean.type) {
                                     DEVICE_TYPE_KEY -> {
-                                        ModBusController.readKeyRfid(dockBean.addr.toInt() - 1, deviceBean.idx) { isLeft, res ->
+                                        ModBusController.readKeyRfid(dockBean.addr, deviceBean.idx) { 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.toInt(), true, rfid)
+                                            ModBusController.updateKeyRfid(dockBean.addr, true, rfid)
                                             NetApi.getKeyInfo(rfid) {
                                                 if (it != null && !it.macAddress.isNullOrEmpty()) {
-                                                    ModBusController.updateKeyMac(dockBean.addr.toInt(), isLeft, it.macAddress)
-                                                    showKeyReturnDialog(it.macAddress, isLeft, dockBean.addr.toInt())
+                                                    ModBusController.updateKeyMac(dockBean.addr, isLeft, it.macAddress)
+                                                    showKeyReturnDialog(it.macAddress, isLeft, dockBean.addr)
                                                 } else {
                                                     ToastUtils.tip(R.string.get_key_info_fail)
                                                 }
@@ -213,18 +213,18 @@ object BusinessManager {
 //                                        ModBusController.controlKeyBuckle(false, isLeft = true, dockBean.addr.toInt() - 1)
                                     }
                                     DEVICE_TYPE_LOCK -> {
-                                        ModBusController.readLockRfid(dockBean.addr.toInt() - 1, deviceBean.idx) { res ->
+                                        ModBusController.readLockRfid(dockBean.addr, deviceBean.idx) { res ->
                                             if (res.size < 11) {
                                                 LogUtil.e("Lock rfid error")
                                                 return@readLockRfid
                                             }
                                             val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
-                                            ModBusController.updateLockRfid(dockBean.addr.toInt(), deviceBean.idx, rfid)
+                                            ModBusController.updateLockRfid(dockBean.addr, deviceBean.idx, rfid)
 
                                             NetApi.getLockInfo(rfid) {
                                                 if (it != null) {
                                                     // TODO 考虑快速拿取
-                                                    ModBusController.controlLockBuckle(false, dockBean.addr.toInt() - 1, deviceBean.idx) { itRst ->
+                                                    ModBusController.controlLockBuckle(false, dockBean.addr, deviceBean.idx) { itRst ->
                                                         if (itRst.isNotEmpty()) {
                                                             // 上报锁具信息
                                                             NetApi.updateLockReturn(rfid, MyApplication.instance!!.serialNo()) {}
@@ -235,7 +235,7 @@ object BusinessManager {
                                         }
                                     }
                                     DEVICE_TYPE_CARD -> {
-                                        ModBusController.readPortalCaseCardRfid(dockBean.addr.toInt() - 1) { res ->
+                                        ModBusController.readPortalCaseCardRfid(dockBean.addr) { res ->
                                             if (res.size < 11) {
                                                 LogUtil.e("Portal Case card rfid error")
                                                 return@readPortalCaseCardRfid
@@ -262,12 +262,12 @@ object BusinessManager {
     /**
      * 钥匙归还提示确认弹框
      */
-    private fun showKeyReturnDialog(mac: String, isLeft: Boolean, slaveIdx: Int) {
+    private fun showKeyReturnDialog(mac: String, isLeft: Boolean, slaveAddress: Byte) {
         val dlg = TipDialog(MyApplication.instance!!.applicationContext)
         dlg.setTip(MyApplication.instance!!.getString(R.string.key_return_tip))
         dlg.setType(TipDialog.TYPE_CONFIRM)
         dlg.setConfirmListener {
-            ModBusController.controlKeyBuckle(false, isLeft, slaveIdx)
+            ModBusController.controlKeyBuckle(false, isLeft, slaveAddress)
             getTicketStatusBusiness(mac, ActivityUtils.currentActivity() as BaseActivity<*>) { b, s, rst ->
                 (ActivityUtils.currentActivity() as BaseActivity<*>).handleLoading(b, s)
             }
@@ -853,7 +853,7 @@ object BusinessManager {
                 } else {
                     loadingCallBack?.invoke(false, null, true)
                     val dock = ModBusController.getDockByKeyMac(bleDevice.mac)
-                    ModBusController.controlKeyBuckle(true, keyBean.isLeft, dock?.addr!!.toInt() - 1)
+                    ModBusController.controlKeyBuckle(true, keyBean.isLeft, dock?.addr)
                 }
             }
             override fun onWriteFailure(exception: BleException?) {
@@ -889,7 +889,7 @@ object BusinessManager {
             val dock = ModBusController.getDockByKeyMac(bleDevice.mac)
             val keyBean = dock?.getKeyList()?.find { it.mac == bleDevice.mac }
             keyBean?.let {
-                ModBusController.controlKeyBuckle(false, keyBean.isLeft, dock.addr.toInt() - 1)
+                ModBusController.controlKeyBuckle(false, keyBean.isLeft, dock.addr)
             }
 
             // 上报隔离点状态

+ 36 - 35
app/src/main/java/com/grkj/iscs/modbus/ModBusController.kt

@@ -78,8 +78,9 @@ object ModBusController {
 //                // Logger.d("ModbusController", "res: ${res.map { it.toHexString() }}")
                 LogUtil.i("****************************************************************************")
                 // 过滤非空的数据,重置slaveCount
-                val onlineCount = res.filter { it.isNotEmpty() }.size
-                setSlaveCount(onlineCount)
+                // 不再使用slaveCount,改用地址池
+//                val onlineCount = res.filter { it.isNotEmpty() }.size
+//                setSlaveCount(onlineCount)
                 for (l in listeners) {
                     if (l.type == LISTENER_TYPE_STATUS) {
                         l.listener(res)
@@ -159,18 +160,18 @@ object ModBusController {
             val noLockIdxList = dockBean.getLockList().filter { !it.isExist }.map { it.idx } as MutableList<Int>
 
             hasLockIdxList.forEach { idx ->
-                readLockRfid(dockBean.addr.toInt() - 1, idx) { res ->
+                readLockRfid(dockBean.addr, idx) { res ->
                     if (res.size < 11) {
                         LogUtil.e("Lock rfid error")
                         return@readLockRfid
                     }
                     val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
                     LogUtil.i("初始化锁具 RFID : $rfid")
-                    updateLockRfid(dockBean.addr.toInt(), idx, rfid)
+                    updateLockRfid(dockBean.addr, idx, rfid)
                 }
             }
-            controlLockBuckle(false, dockBean.addr.toInt() - 1, hasLockIdxList)
-            controlLockBuckle(true, dockBean.addr.toInt() - 1, noLockIdxList)
+            controlLockBuckle(false, dockBean.addr, hasLockIdxList)
+            controlLockBuckle(true, dockBean.addr, noLockIdxList)
         }
     }
 
@@ -182,8 +183,8 @@ object ModBusController {
         dockList.filter { it.type == DOCK_TYPE_KEY || it.type == DOCK_TYPE_PORTABLE }.forEach { dockBean ->
             dockBean.getKeyList().forEach { key ->
                 if (key.isExist) {
-                    LogUtil.i("initKey : ${dockBean.addr.toInt() - 1} : ${key.isLeft}")
-                    readKeyRfid(dockBean.addr.toInt() - 1, if (key.isLeft) 0 else 1) { isLeft, res ->
+                    LogUtil.i("initKey : ${dockBean.addr} : ${key.isLeft}")
+                    readKeyRfid(dockBean.addr, if (key.isLeft) 0 else 1) { isLeft, res ->
                         if (res.size < 11) {
                             LogUtil.e("Key rfid error")
                             return@readKeyRfid
@@ -191,21 +192,21 @@ object ModBusController {
                         val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
                         LogUtil.i("初始化钥匙 RFID : $rfid")
                         // 更新rfid
-                        updateKeyRfid(dockBean.addr.toInt(), isLeft, rfid)
+                        updateKeyRfid(dockBean.addr, isLeft, rfid)
                         // 蓝牙准备操作
                         NetApi.getKeyInfo(rfid) {
                             if (it != null && !it.macAddress.isNullOrEmpty()) {
                                 // 更新mac
-                                updateKeyMac(dockBean.addr.toInt(), key.isLeft, it.macAddress)
+                                updateKeyMac(dockBean.addr, key.isLeft, it.macAddress)
                                 BusinessManager.registerConnectListener(it.macAddress)
                             } else {
                                 ToastUtils.tip(R.string.get_key_info_fail)
                             }
                         }
                     }
-                    controlKeyBuckle(false, key.isLeft, dockBean.addr.toInt() - 1)
+                    controlKeyBuckle(false, key.isLeft, dockBean.addr)
                 } else {
-                    controlKeyBuckle(true, key.isLeft, dockBean.addr.toInt() - 1)
+                    controlKeyBuckle(true, key.isLeft, dockBean.addr)
                 }
             }
         }
@@ -249,9 +250,9 @@ object ModBusController {
      * @param isLock true:读锁具底座 false:读钥匙底座
      * @param type 0:钥匙底座 1:锁具底座1-8 2:锁具底座9、10
      */
-    fun readBuckleStatus(isLock: Boolean, slaveIdx: Int?, doneSingle: ((type: Int, res: ByteArray) -> Unit)? = null) {
+    fun readBuckleStatus(isLock: Boolean, slaveAddress: Byte?, doneSingle: ((type: Int, res: ByteArray) -> Unit)? = null) {
         // TODO 电磁锁控制板可能不是,并且锁和钥匙的读取不一样
-        slaveIdx?.let {
+        slaveAddress?.let {
             modBusManager?.sendTo(it, MBFrame.READ_BUCKLE_STATUS) { res ->
                 doneSingle?.invoke(if (isLock) 1 else 0, res)
             }
@@ -266,8 +267,8 @@ object ModBusController {
     /**
      * 开/关锁具卡扣
      */
-    fun controlLockBuckle(isOpen: Boolean, slaveIdx: Int?, lockIdx: Int, done: ((res: ByteArray) -> Unit)? = null)  {
-        slaveIdx?.let {
+    fun controlLockBuckle(isOpen: Boolean, slaveAddress: Byte?, lockIdx: Int, done: ((res: ByteArray) -> Unit)? = null)  {
+        slaveAddress?.let {
             modBusManager?.generateLockBuckleCmd(isOpen, lockIdx)?.let { cmd ->
                 modBusManager?.sendTo(it, cmd) { res ->
                     done?.invoke(res)
@@ -276,8 +277,8 @@ object ModBusController {
         }
     }
 
-    fun controlLockBuckle(isOpen: Boolean, slaveIdx: Int?, lockIdxList: MutableList<Int>, done: ((res: ByteArray) -> Unit)? = null)  {
-        slaveIdx?.let {
+    fun controlLockBuckle(isOpen: Boolean, slaveAddress: Byte?, lockIdxList: MutableList<Int>, done: ((res: ByteArray) -> Unit)? = null)  {
+        slaveAddress?.let {
             modBusManager?.generateLockBuckleCmd(isOpen, lockIdxList)?.let { cmdList ->
                 cmdList.forEach { cmd ->
                     modBusManager?.sendTo(it, cmd) { res ->
@@ -291,8 +292,8 @@ object ModBusController {
     /**
      * 读取钥匙RFID
      */
-    fun readKeyRfid(slaveIdx: Int?, idx: Int, done: ((isLeft: Boolean, res: ByteArray) -> Unit)? = null) {
-        slaveIdx?.let {
+    fun readKeyRfid(slaveAddress: Byte?, idx: Int, done: ((isLeft: Boolean, res: ByteArray) -> Unit)? = null) {
+        slaveAddress?.let {
             modBusManager?.generateRfidCmd(idx)?.let { cmd ->
                 modBusManager?.sendTo(it, cmd) {
                     done?.invoke(idx == 0, it)
@@ -304,8 +305,8 @@ object ModBusController {
     /**
      * 读取锁具RFID
      */
-    fun readLockRfid(slaveIdx: Int?, lockIdx: Int, done: ((res: ByteArray) -> Unit)? = null) {
-        slaveIdx?.let {
+    fun readLockRfid(slaveAddress: Byte?, lockIdx: Int, done: ((res: ByteArray) -> Unit)? = null) {
+        slaveAddress?.let {
             modBusManager?.generateRfidCmd(lockIdx)?.let { cmd ->
                 modBusManager?.sendTo(it, cmd) { res ->
                     done?.invoke(res)
@@ -317,8 +318,8 @@ object ModBusController {
     /**
      * 读便携式底座卡RFID
      */
-    fun readPortalCaseCardRfid(slaveIdx: Int?, done: ((res: ByteArray) -> Unit)? = null) {
-        slaveIdx?.let {
+    fun readPortalCaseCardRfid(slaveAddress: Byte?, done: ((res: ByteArray) -> Unit)? = null) {
+        slaveAddress?.let {
             modBusManager?.generateRfidCmd(8)?.let { cmd ->
                 modBusManager?.sendTo(it, cmd) { res ->
                     done?.invoke(res)
@@ -330,15 +331,15 @@ object ModBusController {
     /**
      * 更新钥匙RFID
      */
-    fun updateKeyRfid(slaveIdx: Int, isLeft: Boolean, rfid: String) {
-        dockList.find { it.addr.toInt() == slaveIdx }?.getKeyList()?.find { it.isLeft == isLeft }?.rfid = rfid
+    fun updateKeyRfid(slaveAddress: Byte, isLeft: Boolean, rfid: String) {
+        dockList.find { it.addr == slaveAddress }?.getKeyList()?.find { it.isLeft == isLeft }?.rfid = rfid
     }
 
     /**
      * 更新钥匙MAC
      */
-    fun updateKeyMac(slaveIdx: Int, isLeft: Boolean, mac: String) {
-        dockList.find { it.addr.toInt() == slaveIdx }?.getKeyList()?.find { it.isLeft == isLeft }?.mac = mac
+    fun updateKeyMac(slaveAddress: Byte, isLeft: Boolean, mac: String) {
+        dockList.find { it.addr == slaveAddress }?.getKeyList()?.find { it.isLeft == isLeft }?.mac = mac
     }
 
     /**
@@ -351,8 +352,8 @@ object ModBusController {
     /**
      * 更新锁具RFID
      */
-    fun updateLockRfid(slaveIdx: Int, lockIdx: Int, rfid: String) {
-        dockList.find { it.addr.toInt() == slaveIdx }?.getLockList()?.find { it.idx == lockIdx }?.rfid = rfid
+    fun updateLockRfid(slaveAddress: Byte, lockIdx: Int, rfid: String) {
+        dockList.find { it.addr == slaveAddress }?.getLockList()?.find { it.idx == lockIdx }?.rfid = rfid
     }
 
     /**
@@ -360,8 +361,8 @@ object ModBusController {
      *
      * @param leftAction、rightAction 0:保持当前状态 1:点亮 2:熄灭 默认0
      */
-    fun controlKeyLight(slaveIdx: Int?, leftAction: Int = 0, rightAction: Int = 0, done: ((res: ByteArray) -> Unit)? = null) {
-        slaveIdx?.let {
+    fun controlKeyLight(slaveAddress: Byte?, leftAction: Int = 0, rightAction: Int = 0, done: ((res: ByteArray) -> Unit)? = null) {
+        slaveAddress?.let {
             modBusManager?.generateKeyLightCmd(leftAction, rightAction)?.let { cmd ->
                 modBusManager?.sendTo(it, cmd) {
                     done?.invoke(it)
@@ -376,8 +377,8 @@ object ModBusController {
      * @param isOpen true:开操作 false:关操作
      * @param isLeft true:左卡扣 false:右卡扣
      */
-    fun controlKeyBuckle(isOpen: Boolean, isLeft: Boolean, slaveIdx: Int?, done: ((res: ByteArray) -> Unit)? = null)  {
-        slaveIdx?.let {
+    fun controlKeyBuckle(isOpen: Boolean, isLeft: Boolean, slaveAddress: Byte?, done: ((res: ByteArray) -> Unit)? = null)  {
+        slaveAddress?.let {
             modBusManager?.generateKeyBuckleCmd(isOpen, if (isLeft) 0 else 1)?.let { cmd ->
                 modBusManager?.sendTo(it, cmd) { res ->
                     done?.invoke(res)
@@ -433,7 +434,7 @@ object ModBusController {
     fun controlAllLockBuckles(isOpen: Boolean) {
         dockList.filter { it.type == DOCK_TYPE_LOCK || it.type == DOCK_TYPE_PORTABLE }.forEach { dockBean ->
             val list = dockBean.getLockList().stream().map { it.idx }.collect(Collectors.toList())
-            controlLockBuckle(isOpen, dockBean.addr.toInt() - 1, list) {
+            controlLockBuckle(isOpen, dockBean.addr, list) {
                 LogUtil.i("${if (isOpen) "开启" else "关闭"}所有锁卡扣 : ${it.toHexStrings()}")
             }
         }

+ 52 - 11
app/src/main/java/com/grkj/iscs/modbus/ModBusManager.kt

@@ -1,17 +1,23 @@
 package com.grkj.iscs.modbus
 
+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
 import com.grkj.iscs.util.jvmSeconds
 import com.grkj.iscs.util.log.LogUtil
+import com.grkj.iscs.view.fragment.DockTestFragment
 import java.util.concurrent.LinkedBlockingQueue
 
 /**
  * modbus 最小发送间隔(150豪秒)
  */
 // TODO 超时的可能也是用的这个,看情况是否增加到500
-const val MODBUS_MIN_SEND_INTERVAL = 150_000_000
+//const val MODBUS_MIN_SEND_INTERVAL = 150_000_000
+const val MODBUS_MIN_SEND_INTERVAL = 500_000_000
 
 /**
  * 最大从机数量
@@ -63,6 +69,8 @@ class ModBusManager(
 
     private var thread: Thread? = null
 
+    private var mSlaveAddressList = mutableListOf<Byte>()
+
 
     init {
         portManager.listen { res ->
@@ -80,6 +88,16 @@ class ModBusManager(
                 }
             }
         }
+        // 初始化地址池
+        val dockConfigJson = SPUtils.getDockConfig(MyApplication.instance?.applicationContext!!)
+        if (!dockConfigJson.isNullOrEmpty()) {
+            val tempList: MutableList<DockTestFragment.DockTestBean> =
+                Gson().fromJson(
+                    dockConfigJson,
+                    object : TypeToken<MutableList<DockTestFragment.DockTestBean>>() {}.type
+                )
+            mSlaveAddressList.addAll(tempList.map { it.address })
+        }
     }
 
     /**
@@ -174,7 +192,8 @@ class ModBusManager(
      * @param done 所有从机都发送完成后的回调
      */
     fun sendToAll(frame: MBFrame, done: ((res: List<ByteArray>) -> Unit)? = null) {
-        if (slaveCount == 0) {
+//        if (slaveCount == 0) {
+        if (mSlaveAddressList.size == 0) {
             done?.let { it(listOf()) }
             return
         }
@@ -187,9 +206,10 @@ class ModBusManager(
         done: ((res: List<ByteArray>) -> Unit)?,
         resList: ArrayList<ByteArray>
     ) {
-        sendTo(index, frame) { res ->
+        sendTo(mSlaveAddressList[index], frame) { res ->
             resList.add(res)
-            if (index >= slaveCount - 1) {
+//            if (index >= slaveCount - 1) {
+            if (index >= mSlaveAddressList.size - 1) {
                 // 已经发送完
                 if (running) {
                     done?.let { it(resList) }
@@ -203,27 +223,32 @@ class ModBusManager(
 
     /**
      * 发送给序号为 index 的从机
-     * @param index 从机序号
+     * @param slaveAddress 从机地址
      * @param frame 发送报文
      * @param done 完成回调
      */
     fun sendTo(
-        index: Int,
+        slaveAddress: Byte,
         frame: MBFrame,
         allowRetransmission: Boolean = true,
         minSendIntervalNanoSeconds: Int = MODBUS_MIN_SEND_INTERVAL,
         done: ((res: ByteArray) -> Unit)? = null
     ) {
-        if (slaveCount <= 0) {
-            LogUtil.i("sendTo($index), slaveCount为0, 返回空数据")
+//        if (slaveCount <= 0) {
+        if (mSlaveAddressList.size <= 0) {
+            LogUtil.i("sendTo($slaveAddress), 地址池大小为0, 返回空数据")
             done?.invoke(byteArrayOf())
             return
         }
-        if (index < 0 || index >= slaveCount) {
-            throw IllegalArgumentException("index [${index}] out of bound [${slaveCount}]")
+//        if (index < 0 || index >= slaveCount) {
+//            throw IllegalArgumentException("index [${index}] out of bound [${slaveCount}]")
+//        }
+        if (mSlaveAddressList.none { it == slaveAddress }) {
+            throw IllegalArgumentException("slaveAddress [${slaveAddress}] is not configed")
         }
 
-        val task = FrameTask(frame.compile(index), done)
+//        val task = FrameTask(frame.compile(index), done)
+        val task = FrameTask(frame.compile(slaveAddress), done)
         task.allowRetransmission = allowRetransmission
         task.minSendInterval = minSendIntervalNanoSeconds
         pendings.add(task)
@@ -452,6 +477,22 @@ class MBFrame(
 //        return cmd + cmd.crc16()
     }
 
+    /**
+     * @param address 从机地址
+     */
+    fun compile(address: Byte): ByteArray {
+        val bytes = ByteArray(4 + data.size)
+        bytes[0] = address
+        bytes[1] = type
+        for (i in data.indices) {
+            bytes[2 + i] = data[i]
+        }
+        val crc16 = bytes.crc16(0, bytes.size - 2)
+        bytes[bytes.size - 2] = crc16[0]
+        bytes[bytes.size - 1] = crc16[1]
+        return bytes
+    }
+
     companion object {
         /**
          * 读取设备类型

+ 1 - 1
app/src/main/java/com/grkj/iscs/presentation/LockerActivity.kt

@@ -75,7 +75,7 @@ class LockerActivity : BaseActivity<ActivityLockerBinding>() {
 
             // 操作设备
             if (lockerStatus == 0) {
-                ModBusController.controlLockBuckle(true, dockList[0].addr.toInt() - 1, lockIdxList) { res ->
+                ModBusController.controlLockBuckle(true, dockList[0].addr, lockIdxList) { res ->
                     LogUtil.i("confirm开锁卡扣 : ${res.toHexStrings()}")
                 }
             }

+ 2 - 2
app/src/main/java/com/grkj/iscs/presentation/PresentationLoginActivity.kt

@@ -73,7 +73,7 @@ class PresentationLoginActivity : BaseActivity<ActivityPresentationLoginBinding>
                         if (deviceBean.isExist) {
                             when (deviceBean.type) {
                                 DEVICE_TYPE_CARD -> {
-                                    ModBusController.readPortalCaseCardRfid(dockBean.addr.toInt() - 1) { res ->
+                                    ModBusController.readPortalCaseCardRfid(dockBean.addr) { res ->
                                         if (res.size >= 11) {
                                             val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
                                             println("卡片RFID : $rfid")
@@ -119,7 +119,7 @@ class PresentationLoginActivity : BaseActivity<ActivityPresentationLoginBinding>
                                 }
                                 DEVICE_TYPE_LOCK -> {
                                     Executor.runOnMain {
-                                        ModBusController.readLockRfid(dockBean.addr.toInt() - 1, deviceBean.idx) { res ->
+                                        ModBusController.readLockRfid(dockBean.addr, deviceBean.idx) { res ->
                                             val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
                                             PresentationManager.updateLockReturnStatus(rfid)
                                         }

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

@@ -48,7 +48,7 @@ class ModbusActivity : BaseMvpActivity<IModbusView, ModBusPresenter, ActivityMod
                 ToastUtils.tip("请输入卡扣编号")
                 return@setOnClickListener
             }
-            ModBusController.controlLockBuckle(true, mBinding?.slaveIdx?.text.toString().toInt(), mBinding?.lockIdx?.text.toString().toInt()) { res ->
+            ModBusController.controlLockBuckle(true, mBinding?.slaveIdx?.text.toString().toByte(), mBinding?.lockIdx?.text.toString().toInt()) { res ->
                 LogUtil.i("开锁卡扣 : ${res.toHexStrings()}")
             }
         }
@@ -62,7 +62,7 @@ class ModbusActivity : BaseMvpActivity<IModbusView, ModBusPresenter, ActivityMod
                 ToastUtils.tip("请输入卡扣编号")
                 return@setOnClickListener
             }
-            ModBusController.controlLockBuckle(false, mBinding?.slaveIdx?.text.toString().toInt(), mBinding?.lockIdx?.text.toString().toInt()) { res ->
+            ModBusController.controlLockBuckle(false, mBinding?.slaveIdx?.text.toString().toByte(), mBinding?.lockIdx?.text.toString().toInt()) { res ->
                 LogUtil.i("关锁卡扣 : ${res.toHexStrings()}")
             }
         }
@@ -76,14 +76,14 @@ class ModbusActivity : BaseMvpActivity<IModbusView, ModBusPresenter, ActivityMod
                 ToastUtils.tip("请输入卡扣编号")
                 return@setOnClickListener
             }
-            ModBusController.readLockRfid(mBinding?.slaveIdx?.text.toString().toInt(), mBinding?.lockIdx?.text.toString().toInt()) { res ->
+            ModBusController.readLockRfid(mBinding?.slaveIdx?.text.toString().toByte(), mBinding?.lockIdx?.text.toString().toInt()) { res ->
                 if (res.size < 11) {
                     LogUtil.e("Lock rfid error")
                     return@readLockRfid
                 }
                 val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
                 println("锁具RFID : $rfid")
-                ModBusController.updateLockRfid(mBinding?.slaveIdx?.text.toString().toInt(), mBinding?.lockIdx?.text.toString().toInt(), rfid)
+                ModBusController.updateLockRfid(mBinding?.slaveIdx?.text.toString().toByte(), mBinding?.lockIdx?.text.toString().toInt(), rfid)
             }
         }
 
@@ -106,7 +106,7 @@ class ModbusActivity : BaseMvpActivity<IModbusView, ModBusPresenter, ActivityMod
                 ToastUtils.tip("请输入设备编号")
                 return@setOnClickListener
             }
-            ModBusController.controlKeyBuckle(isOpen = true, true, mBinding?.slaveIdx?.text.toString().toInt()) {
+            ModBusController.controlKeyBuckle(isOpen = true, true, mBinding?.slaveIdx?.text.toString().toByte()) {
                 LogUtil.i("开左钥匙卡扣 : ${it.toHexStrings()}")
                 println("____________________________________")
             }
@@ -118,7 +118,7 @@ class ModbusActivity : BaseMvpActivity<IModbusView, ModBusPresenter, ActivityMod
                 ToastUtils.tip("请输入设备编号")
                 return@setOnClickListener
             }
-            ModBusController.controlKeyBuckle(isOpen = false, true, mBinding?.slaveIdx?.text.toString().toInt()) {
+            ModBusController.controlKeyBuckle(isOpen = false, true, mBinding?.slaveIdx?.text.toString().toByte()) {
                 LogUtil.i("关左钥匙卡扣 : ${it.toHexStrings()}")
                 println("____________________________________")
             }
@@ -130,7 +130,7 @@ class ModbusActivity : BaseMvpActivity<IModbusView, ModBusPresenter, ActivityMod
                 ToastUtils.tip("请输入设备编号")
                 return@setOnClickListener
             }
-            ModBusController.controlKeyBuckle(isOpen = true, false, mBinding?.slaveIdx?.text.toString().toInt()) {
+            ModBusController.controlKeyBuckle(isOpen = true, false, mBinding?.slaveIdx?.text.toString().toByte()) {
                 LogUtil.i("开右钥匙卡扣 : ${it.toHexStrings()}")
                 println("____________________________________")
             }
@@ -142,7 +142,7 @@ class ModbusActivity : BaseMvpActivity<IModbusView, ModBusPresenter, ActivityMod
                 ToastUtils.tip("请输入设备编号")
                 return@setOnClickListener
             }
-            ModBusController.controlKeyBuckle(isOpen = false, false, mBinding?.slaveIdx?.text.toString().toInt()) {
+            ModBusController.controlKeyBuckle(isOpen = false, false, mBinding?.slaveIdx?.text.toString().toByte()) {
                 LogUtil.i("关右钥匙卡扣 : ${it.toHexStrings()}")
                 println("____________________________________")
             }

+ 8 - 8
app/src/main/java/com/grkj/iscs/view/fragment/DockTestFragment.kt

@@ -57,10 +57,10 @@ class DockTestFragment : BaseFragment<FragmentDockTestBinding>() {
                     override fun convert(holder: ViewHolder, deviceIndex: Int, position: Int) {
                         holder.setText(R.id.tv_name, getString(R.string.device_index, deviceIndex))
                         holder.setOnClickListener(R.id.tv_turn_on) {
-                            ModBusController.controlKeyBuckle(true, deviceIndex == 1, dock.address.toInt() - 1)
+                            ModBusController.controlKeyBuckle(true, deviceIndex == 1, dock.address)
                         }
                         holder.setOnClickListener(R.id.tv_turn_off) {
-                            ModBusController.controlKeyBuckle(false, deviceIndex == 1, dock.address.toInt() - 1)
+                            ModBusController.controlKeyBuckle(false, deviceIndex == 1, dock.address)
                         }
                     }
                 }
@@ -77,10 +77,10 @@ class DockTestFragment : BaseFragment<FragmentDockTestBinding>() {
                     override fun convert(holder: ViewHolder, deviceIndex: Int, position: Int) {
                         holder.setText(R.id.tv_name, getString(R.string.device_index, deviceIndex))
                         holder.setOnClickListener(R.id.tv_turn_on) {
-                            ModBusController.controlLockBuckle(true, dock.address.toInt() - 1, deviceIndex - 1)
+                            ModBusController.controlLockBuckle(true, dock.address, deviceIndex - 1)
                         }
                         holder.setOnClickListener(R.id.tv_turn_off) {
-                            ModBusController.controlLockBuckle(false, dock.address.toInt() - 1, deviceIndex - 1)
+                            ModBusController.controlLockBuckle(false, dock.address, deviceIndex - 1)
                         }
                     }
                 }
@@ -90,12 +90,12 @@ class DockTestFragment : BaseFragment<FragmentDockTestBinding>() {
         mBinding?.cbOpen?.setOnClickListener {
             mKeyDockList.forEach { dock ->
                 dock.deviceList?.forEach { deviceIndex ->
-                    ModBusController.controlKeyBuckle(true, deviceIndex == 1, dock.address.toInt() - 1)
+                    ModBusController.controlKeyBuckle(true, deviceIndex == 1, dock.address)
                 }
             }
             mLockDockList.forEach { dock ->
                 dock.deviceList?.forEach { deviceIndex ->
-                    ModBusController.controlLockBuckle(true, dock.address.toInt() - 1, deviceIndex - 1)
+                    ModBusController.controlLockBuckle(true, dock.address, deviceIndex - 1)
                 }
             }
         }
@@ -103,12 +103,12 @@ class DockTestFragment : BaseFragment<FragmentDockTestBinding>() {
         mBinding?.cbClose?.setOnClickListener {
             mKeyDockList.forEach { dock ->
                 dock.deviceList?.forEach { deviceIndex ->
-                    ModBusController.controlKeyBuckle(false, deviceIndex == 1, dock.address.toInt() - 1)
+                    ModBusController.controlKeyBuckle(false, deviceIndex == 1, dock.address)
                 }
             }
             mLockDockList.forEach { dock ->
                 dock.deviceList?.forEach { deviceIndex ->
-                    ModBusController.controlLockBuckle(false, dock.address.toInt() - 1, deviceIndex - 1)
+                    ModBusController.controlLockBuckle(false, dock.address, deviceIndex - 1)
                 }
             }
         }

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

@@ -41,7 +41,7 @@ class HomePresenter : BasePresenter<IHomeView>() {
         if (retryCount == 0) {
             return
         }
-        ModBusController.readKeyRfid(dockBean.addr.toInt() - 1, if (isLeft) 0 else 1) { isLeft, res ->
+        ModBusController.readKeyRfid(dockBean.addr, if (isLeft) 0 else 1) { isLeft, res ->
             if (res.size < 11) {
                 LogUtil.e("Key rfid error")
                 return@readKeyRfid

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

@@ -96,7 +96,7 @@ class JobProgressPresenter : BasePresenter<IJobProgressView>() {
                                 if (it == true) {
                                     lockMap.forEach { (addr, lockList) ->
                                         // 开锁卡扣
-                                        ModBusController.controlLockBuckle(true, addr.toInt() - 1, lockList.map { it.idx }.toMutableList())
+                                        ModBusController.controlLockBuckle(true, addr, lockList.map { it.idx }.toMutableList())
                                     }
                                 }
                                 // 更新锁具信息后再发,防止后台失败

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

@@ -66,7 +66,7 @@ class LoginPresenter : BasePresenter<ILoginView>() {
                 }
                 when (deviceBean.type) {
                     DEVICE_TYPE_CARD -> {
-                        ModBusController.readPortalCaseCardRfid(dockBean.addr.toInt() - 1) { res ->
+                        ModBusController.readPortalCaseCardRfid(dockBean.addr) { res ->
                             if (res.size >= 11) {
                                 val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
                                 println("卡片RFID : $rfid")

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

@@ -94,7 +94,7 @@ class TicketDetailPresenter : BasePresenter<ITicketDetailView>() {
                         if (it == true) {
                             lockMap.forEach { (addr, lockList) ->
                                 // 开锁卡扣
-                                ModBusController.controlLockBuckle(true, addr.toInt(), lockList.map { it.idx }.toMutableList())
+                                ModBusController.controlLockBuckle(true, addr, lockList.map { it.idx }.toMutableList())
                             }
                         }
                     }