|
|
@@ -3,45 +3,59 @@ package com.grkj.iscs.modbus
|
|
|
import com.grkj.iscs.util.log.LogUtil
|
|
|
|
|
|
/**
|
|
|
- * RS-485 设备信息 Bean
|
|
|
+ * RS-485 设备底座 Bean
|
|
|
*
|
|
|
* @param addr 设备地址 0x01-0x16
|
|
|
* @param type 0x00:钥匙底座 0x01:锁具底座 0x02:电磁锁控制板 0x03:便携式底座
|
|
|
- * @param keyList 钥匙列表,钥匙底座才有
|
|
|
- * @param lockList 锁具列表,锁具底座才有
|
|
|
+ * @param deviceList 设备列表
|
|
|
*/
|
|
|
-class DeviceBean(
|
|
|
+class DockBean(
|
|
|
var addr: Byte,
|
|
|
var type: Byte?,
|
|
|
- var keyList: MutableList<KeyBean>,
|
|
|
- var lockList: MutableList<LockBean>
|
|
|
+ var deviceList: MutableList<DeviceBean>
|
|
|
) {
|
|
|
|
|
|
- fun parseStatus(byteArray: ByteArray): DeviceBean? {
|
|
|
+ companion object {
|
|
|
+ // 底座类型常量
|
|
|
+ // 钥匙底座
|
|
|
+ const val DOCK_TYPE_KEY = 0x00.toByte()
|
|
|
+ // 锁具底座
|
|
|
+ const val DOCK_TYPE_LOCK = 0x01.toByte()
|
|
|
+ // 电磁锁控制板
|
|
|
+ const val DOCK_TYPE_ELEC_LOCK_BOARD = 0x02.toByte()
|
|
|
+ // 便携式底座
|
|
|
+ const val DOCK_TYPE_PORTABLE = 0x03.toByte()
|
|
|
+
|
|
|
+ // 设备类型常量
|
|
|
+ const val DEVICE_TYPE_KEY = 0
|
|
|
+ const val DEVICE_TYPE_LOCK = 1
|
|
|
+ }
|
|
|
+
|
|
|
+ fun parseStatus(byteArray: ByteArray): DockBean? {
|
|
|
if (byteArray.isEmpty()) {
|
|
|
return null
|
|
|
}
|
|
|
type?.let {
|
|
|
// 因为都是一个寄存器返回的,所以一定能得到2个钥匙的状态或者10把锁具的状态
|
|
|
when (it) {
|
|
|
- 0x00.toByte() -> {
|
|
|
+ DOCK_TYPE_KEY -> {
|
|
|
// TODO 未验证
|
|
|
val leftHasKey = (byteArray[4].toInt() shr 0) and 0x1 == 1
|
|
|
val isLeftCharging = (byteArray[4].toInt() shr 1) and 0x1 == 1
|
|
|
val rightHasKey = (byteArray[3].toInt() shr 0) and 0x1 == 1
|
|
|
val isRightCharging = (byteArray[3].toInt() shr 1) and 0x1 == 1
|
|
|
LogUtil.i("钥匙刷新状态 : $leftHasKey - $isLeftCharging - $rightHasKey - $isRightCharging")
|
|
|
- if (keyList.isEmpty()) {
|
|
|
- keyList.add(KeyBean(true, leftHasKey, isLeftCharging, null, null))
|
|
|
- keyList.add(KeyBean(false, rightHasKey, isRightCharging, null, null))
|
|
|
+ if (getKeyList().isEmpty()) {
|
|
|
+ deviceList.add(KeyBean(0, leftHasKey, true, isLeftCharging, null, null))
|
|
|
+ deviceList.add(KeyBean(1, rightHasKey, false, isRightCharging, null, null))
|
|
|
return null
|
|
|
}
|
|
|
|
|
|
- val changeList = mutableListOf<KeyBean>()
|
|
|
- keyList.forEach { keyBean ->
|
|
|
+ val changeList = mutableListOf<DeviceBean>()
|
|
|
+ getKeyList().forEach { keyBean ->
|
|
|
if (keyBean.isLeft) {
|
|
|
- if (leftHasKey != keyBean.hasKey) {
|
|
|
- keyBean.hasKey = leftHasKey
|
|
|
+ if (leftHasKey != keyBean.isExist) {
|
|
|
+ keyBean.isExist = leftHasKey
|
|
|
keyBean.isCharging = isLeftCharging
|
|
|
changeList.add(keyBean)
|
|
|
// 拿走钥匙,移除钥匙信息
|
|
|
@@ -51,8 +65,8 @@ class DeviceBean(
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
- if (rightHasKey != keyBean.hasKey) {
|
|
|
- keyBean.hasKey = rightHasKey
|
|
|
+ if (rightHasKey != keyBean.isExist) {
|
|
|
+ keyBean.isExist = rightHasKey
|
|
|
keyBean.isCharging = isRightCharging
|
|
|
changeList.add(keyBean)
|
|
|
// 拿走钥匙,移除钥匙信息
|
|
|
@@ -64,9 +78,9 @@ class DeviceBean(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return DeviceBean(addr, type, changeList, mutableListOf())
|
|
|
+ return DockBean(addr, type, changeList)
|
|
|
}
|
|
|
- 0x01.toByte() -> {
|
|
|
+ DOCK_TYPE_LOCK -> {
|
|
|
val tempList = mutableListOf<Boolean>()
|
|
|
for (i in 0..7) {
|
|
|
tempList.add((byteArray[4].toInt() shr i) and 0x1 == 1)
|
|
|
@@ -74,32 +88,32 @@ class DeviceBean(
|
|
|
tempList.add((byteArray[3].toInt() shr 0) and 0x1 == 1)
|
|
|
tempList.add((byteArray[3].toInt() shr 1) and 0x1 == 1)
|
|
|
|
|
|
- if (lockList.isEmpty()) {
|
|
|
+ if (getLockList().isEmpty()) {
|
|
|
for (i in 0 until tempList.size) {
|
|
|
- lockList.add(LockBean(i, tempList[i], null))
|
|
|
+ deviceList.add(LockBean(i, tempList[i], null))
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- val changeList = mutableListOf<LockBean>()
|
|
|
- for (i in 0 until lockList.size) {
|
|
|
- if (lockList[i].hasLock != tempList[i]) {
|
|
|
- lockList[i].hasLock = tempList[i]
|
|
|
- changeList.add(lockList[i])
|
|
|
+ val changeList = mutableListOf<DeviceBean>()
|
|
|
+ for (i in 0 until getLockList().size) {
|
|
|
+ if (getLockList()[i].isExist != tempList[i]) {
|
|
|
+ getLockList()[i].isExist = tempList[i]
|
|
|
+ changeList.add(getLockList()[i])
|
|
|
// 拿走锁具,移除锁具信息
|
|
|
if (!tempList[i]) {
|
|
|
- lockList[i].rfid = null
|
|
|
+ getLockList()[i].rfid = null
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
LogUtil.i("锁具刷新状态 : $changeList")
|
|
|
- return DeviceBean(addr, type, mutableListOf(), changeList)
|
|
|
+ return DockBean(addr, type, changeList)
|
|
|
}
|
|
|
- 0x02.toByte() -> {
|
|
|
+ DOCK_TYPE_ELEC_LOCK_BOARD -> {
|
|
|
// TODO 临时占位
|
|
|
return null
|
|
|
}
|
|
|
- 0x03.toByte() -> {
|
|
|
+ DOCK_TYPE_PORTABLE -> {
|
|
|
// TODO 便携式底座更新
|
|
|
return null
|
|
|
}
|
|
|
@@ -108,6 +122,14 @@ class DeviceBean(
|
|
|
} ?: return null
|
|
|
}
|
|
|
|
|
|
+ fun getKeyList(): MutableList<KeyBean> {
|
|
|
+ return deviceList.filter { it.type == 0 } as MutableList<KeyBean>
|
|
|
+ }
|
|
|
+
|
|
|
+ fun getLockList() : MutableList<LockBean> {
|
|
|
+ return deviceList.filter { it.type == 1 } as MutableList<LockBean>
|
|
|
+ }
|
|
|
+
|
|
|
fun getBit(by: Byte): String {
|
|
|
val sb = StringBuffer()
|
|
|
sb.append((by.toInt() shr 7) and 0x1)
|
|
|
@@ -121,16 +143,40 @@ class DeviceBean(
|
|
|
return sb.toString()
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通用设备信息Bean
|
|
|
+ *
|
|
|
+ * @param type 0:钥匙 1:锁
|
|
|
+ * @param idx 锁具底座时:锁具序号 0-9 钥匙底座时:0-左 1-右 便携式底座:锁具0-2 钥匙8
|
|
|
+ * @param isExist true:有设备 false:无设备
|
|
|
+ */
|
|
|
+ open class DeviceBean(
|
|
|
+ var type: Int,
|
|
|
+ var idx: Int,
|
|
|
+ var isExist: Boolean
|
|
|
+ )
|
|
|
+
|
|
|
/**
|
|
|
* 钥匙
|
|
|
*/
|
|
|
- data class KeyBean(var isLeft: Boolean, var hasKey: Boolean, var isCharging: Boolean, var rfid: String?, var mac: String?)
|
|
|
+ class KeyBean(
|
|
|
+ idx: Int,
|
|
|
+ isExist: Boolean,
|
|
|
+ var isLeft: Boolean,
|
|
|
+ var isCharging: Boolean,
|
|
|
+ var rfid: String?,
|
|
|
+ var mac: String?
|
|
|
+ ) : DeviceBean(DEVICE_TYPE_KEY, idx, isExist)
|
|
|
|
|
|
/**
|
|
|
* 锁具
|
|
|
*
|
|
|
- * @param idx 锁具序号 0-9
|
|
|
* @param rfid 锁具的RFID(仅有关闭锁扣的时候读取并保存,否则为null)
|
|
|
*/
|
|
|
- data class LockBean(var idx: Int, var hasLock: Boolean, var rfid: String?)
|
|
|
+ class LockBean(
|
|
|
+ idx: Int,
|
|
|
+ isExist: Boolean,
|
|
|
+ var rfid: String?
|
|
|
+ ) : DeviceBean(DEVICE_TYPE_LOCK, idx, isExist)
|
|
|
}
|