|
|
@@ -23,7 +23,9 @@ import java.util.stream.Collectors
|
|
|
* ModBus 主控板控制器
|
|
|
*/
|
|
|
object ModBusController {
|
|
|
-
|
|
|
+ /**
|
|
|
+ * 是否初始化完成
|
|
|
+ */
|
|
|
var isInitReady = false
|
|
|
|
|
|
/**
|
|
|
@@ -31,37 +33,45 @@ object ModBusController {
|
|
|
*/
|
|
|
var dockList: MutableList<DockBean> = mutableListOf()
|
|
|
|
|
|
+ /**
|
|
|
+ * 监听状态类型
|
|
|
+ */
|
|
|
private const val LISTENER_TYPE_STATUS = 3
|
|
|
|
|
|
// 主控板管理器
|
|
|
var modBusManager: ModBusManager? = null
|
|
|
- private var slaveCount: Int = 0
|
|
|
|
|
|
+ /**
|
|
|
+ * 监听器
|
|
|
+ */
|
|
|
private val listeners = ArrayList<StatusListener>()
|
|
|
|
|
|
// 是否中断读取状态
|
|
|
private var interruptReadStatus: ArrayList<Boolean> = ArrayList()
|
|
|
|
|
|
+ /**
|
|
|
+ * 重复时间
|
|
|
+ */
|
|
|
// TODO 临时改成5s
|
|
|
const val REPEAT_FREQUENCY = 800L
|
|
|
|
|
|
- class StatusListener(
|
|
|
- val key: Any,
|
|
|
- val listener: (MBFrame, Any) -> Unit,
|
|
|
- val type: Int
|
|
|
- )
|
|
|
-
|
|
|
+ /**
|
|
|
+ * 中断读取
|
|
|
+ */
|
|
|
fun interruptReadTrashBinStatus(interrupt: Boolean) {
|
|
|
interruptReadStatus.clear()
|
|
|
interruptReadStatus.add(interrupt)
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 启动通信引擎
|
|
|
+ */
|
|
|
@ExperimentalUnsignedTypes
|
|
|
fun start(ctx: Context) {
|
|
|
modBusManager?.stop()
|
|
|
PortManager.openCtrlBord(ctx)
|
|
|
?.let { pm ->
|
|
|
- return@let ModBusManager(slaveCount, pm, true)
|
|
|
+ return@let ModBusManager(pm, true)
|
|
|
}
|
|
|
// 间隔 1 秒读一遍桶的状态
|
|
|
?.repeatSendToAll(MBFrame.READ_STATUS, {
|
|
|
@@ -106,10 +116,16 @@ object ModBusController {
|
|
|
?.start()
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 注册监听器
|
|
|
+ */
|
|
|
fun registerStatusListener(key: Any, listener: (MBFrame, Any) -> Unit) {
|
|
|
listeners.add(StatusListener(key, listener, LISTENER_TYPE_STATUS))
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 取消注册监听器
|
|
|
+ */
|
|
|
fun unregisterListener(key: Any) {
|
|
|
val it = listeners.iterator()
|
|
|
while (it.hasNext()) {
|
|
|
@@ -119,10 +135,16 @@ object ModBusController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 停止引擎
|
|
|
+ */
|
|
|
fun stop() {
|
|
|
modBusManager?.stop()
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 引擎是否运行中
|
|
|
+ */
|
|
|
fun isRunning(): Boolean? {
|
|
|
return modBusManager?.isRunning()
|
|
|
}
|
|
|
@@ -266,7 +288,7 @@ object ModBusController {
|
|
|
if (byteArray.isEmpty()) {
|
|
|
return null
|
|
|
}
|
|
|
- val dockB = dockList.find { it.addr == byteArray[0] && it.type == DOCK_TYPE_KEY }
|
|
|
+ val dockB = dockList.find { it.addr == byteArray[0] && it.type == DOCK_TYPE_LOCK }
|
|
|
return dockB?.parseExtraLockStatus(byteArray)
|
|
|
}
|
|
|
|
|
|
@@ -316,7 +338,7 @@ object ModBusController {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 开/关锁具卡扣
|
|
|
+ * 开/关锁具卡扣 单
|
|
|
*/
|
|
|
fun controlLockBuckle(
|
|
|
isOpen: Boolean,
|
|
|
@@ -325,7 +347,7 @@ object ModBusController {
|
|
|
done: ((res: ByteArray) -> Unit)? = null
|
|
|
) {
|
|
|
slaveAddress?.let {
|
|
|
- modBusManager?.generateLockBuckleCmd(isOpen, lockIdx)?.let { cmd ->
|
|
|
+ ModBusCMDHelper.generateLockBuckleCmd(isOpen, lockIdx)?.let { cmd ->
|
|
|
modBusManager?.sendTo(it, cmd) { res ->
|
|
|
done?.invoke(res)
|
|
|
}
|
|
|
@@ -333,6 +355,9 @@ object ModBusController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 开/关锁具卡扣 多
|
|
|
+ */
|
|
|
fun controlLockBuckle(
|
|
|
isOpen: Boolean,
|
|
|
slaveAddress: Byte?,
|
|
|
@@ -340,7 +365,7 @@ object ModBusController {
|
|
|
done: ((res: ByteArray) -> Unit)? = null
|
|
|
) {
|
|
|
slaveAddress?.let {
|
|
|
- modBusManager?.generateLockBuckleCmd(isOpen, lockIdxList)?.let { cmdList ->
|
|
|
+ ModBusCMDHelper.generateLockBuckleCmd(isOpen, lockIdxList)?.let { cmdList ->
|
|
|
cmdList.forEach { cmd ->
|
|
|
modBusManager?.sendTo(it, cmd) { res ->
|
|
|
done?.invoke(res)
|
|
|
@@ -359,7 +384,7 @@ object ModBusController {
|
|
|
done: ((isLeft: Boolean, res: ByteArray) -> Unit)? = null
|
|
|
) {
|
|
|
slaveAddress?.let {
|
|
|
- modBusManager?.generateRfidCmd(idx)?.let { cmd ->
|
|
|
+ ModBusCMDHelper.generateRfidCmd(idx)?.let { cmd ->
|
|
|
modBusManager?.sendTo(it, cmd) {
|
|
|
done?.invoke(idx == 0, it)
|
|
|
}
|
|
|
@@ -372,7 +397,7 @@ object ModBusController {
|
|
|
*/
|
|
|
fun readLockRfid(slaveAddress: Byte?, lockIdx: Int, done: ((res: ByteArray) -> Unit)? = null) {
|
|
|
slaveAddress?.let {
|
|
|
- modBusManager?.generateRfidCmd(lockIdx)?.let { cmd ->
|
|
|
+ ModBusCMDHelper.generateRfidCmd(lockIdx)?.let { cmd ->
|
|
|
modBusManager?.sendTo(it, cmd) { res ->
|
|
|
done?.invoke(res)
|
|
|
}
|
|
|
@@ -385,7 +410,7 @@ object ModBusController {
|
|
|
*/
|
|
|
fun readPortalCaseCardRfid(slaveAddress: Byte?, done: ((res: ByteArray) -> Unit)? = null) {
|
|
|
slaveAddress?.let {
|
|
|
- modBusManager?.generateRfidCmd(8)?.let { cmd ->
|
|
|
+ ModBusCMDHelper.generateRfidCmd(8)?.let { cmd ->
|
|
|
modBusManager?.sendTo(it, cmd) { res ->
|
|
|
done?.invoke(res)
|
|
|
}
|
|
|
@@ -417,14 +442,6 @@ object ModBusController {
|
|
|
mac
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 通过RFID更新对应的Mac
|
|
|
- */
|
|
|
- fun updateKeyMacByRfid(rfid: String, mac: String) {
|
|
|
- dockList.find { it.type == DOCK_TYPE_KEY }?.getKeyList()?.find { it.rfid == rfid }?.mac =
|
|
|
- mac
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 更新锁具RFID
|
|
|
*/
|
|
|
@@ -441,49 +458,6 @@ object ModBusController {
|
|
|
?.find { it.idx == lockIdx }?.lockEnabled = lockEnabled
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 设备是否存在,加入deviceType防止有重复的但是不同类型的
|
|
|
- *
|
|
|
- * @param deviceType {@link [com.grkj.iscs.model.bo.DeviceTakeUpdateBO]<class>#[deviceType]}
|
|
|
- */
|
|
|
- fun isDeviceExist(rfid: String, deviceType: Int): Boolean {
|
|
|
- return when (deviceType) {
|
|
|
- DEVICE_TYPE_KEY -> {
|
|
|
- dockList.find { it.type == DOCK_TYPE_KEY || it.type == DOCK_TYPE_PORTABLE }
|
|
|
- ?.getKeyList()?.find { it.rfid == rfid } != null
|
|
|
- }
|
|
|
-
|
|
|
- DEVICE_TYPE_LOCK -> {
|
|
|
- dockList.find { it.type == DOCK_TYPE_LOCK || it.type == DOCK_TYPE_PORTABLE }
|
|
|
- ?.getLockList()?.find { it.rfid == rfid } != null
|
|
|
- }
|
|
|
-
|
|
|
- else -> {
|
|
|
- false
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 操作钥匙灯
|
|
|
- *
|
|
|
- * @param leftAction、rightAction 0:保持当前状态 1:点亮 2:熄灭 默认0
|
|
|
- */
|
|
|
- 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)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 控制钥匙卡扣
|
|
|
*/
|
|
|
@@ -508,7 +482,7 @@ object ModBusController {
|
|
|
done: ((res: ByteArray) -> Unit)? = null
|
|
|
) {
|
|
|
slaveAddress?.let {
|
|
|
- modBusManager?.generateKeyBuckleCmd(isOpen, if (isLeft) 0 else 1)?.let { cmd ->
|
|
|
+ ModBusCMDHelper.generateKeyBuckleCmd(isOpen, if (isLeft) 0 else 1)?.let { cmd ->
|
|
|
modBusManager?.sendTo(it, cmd) { res ->
|
|
|
done?.invoke(res)
|
|
|
}
|
|
|
@@ -532,19 +506,17 @@ object ModBusController {
|
|
|
.flatMap { it.getKeyList() }.find { it.mac == mac }
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 根据底座获取钥匙
|
|
|
+ */
|
|
|
fun getKeyByDock(dockAddr: Byte?, isLeft: Boolean): DockBean.KeyBean? {
|
|
|
dockAddr ?: return null
|
|
|
return dockList.find { it.addr == dockAddr }?.getKeyList()?.find { it.isLeft == isLeft }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 根据RFID找锁具
|
|
|
+ * 钥匙是否存在
|
|
|
*/
|
|
|
- fun getLockByRfid(rfid: String): DockBean.LockBean? {
|
|
|
- return dockList.filter { it.type == DOCK_TYPE_LOCK || it.type == DOCK_TYPE_PORTABLE }
|
|
|
- .flatMap { it.getLockList() }.find { it.rfid == rfid }
|
|
|
- }
|
|
|
-
|
|
|
fun isKeyExist(dockAddr: Byte?, isLeft: Boolean): Boolean {
|
|
|
dockAddr ?: return false
|
|
|
return dockList.find { it.addr == dockAddr }?.getKeyList()
|
|
|
@@ -569,6 +541,9 @@ object ModBusController {
|
|
|
?.find { it.idx == lockIdx }?.lockEnabled == true
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取挂锁是否存在
|
|
|
+ */
|
|
|
fun isLockExist(dockAddr: Byte?, lockIdx: Int): Boolean {
|
|
|
dockAddr ?: return false
|
|
|
return dockList.find { it.addr == dockAddr }?.getLockList()
|
|
|
@@ -645,13 +620,6 @@ object ModBusController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- fun getDockByLockNfc(nfc: String): DockBean? {
|
|
|
- return dockList.find {
|
|
|
- (it.type == DOCK_TYPE_LOCK || it.type == DOCK_TYPE_PORTABLE)
|
|
|
- && it.getLockList().any { it.rfid == nfc }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 根据类型获取底座列表
|
|
|
*/
|
|
|
@@ -659,12 +627,18 @@ object ModBusController {
|
|
|
return dockList.filter { it.type == type }
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 根据底座类型获取钥匙列表
|
|
|
+ */
|
|
|
fun getKeyByDockType(type: Byte): MutableList<DockBean.KeyBean>? {
|
|
|
return dockList.find { it.type == type }?.let {
|
|
|
it.getKeyList()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 全部锁扣的开关
|
|
|
+ */
|
|
|
fun controlAllLockBuckles(isOpen: Boolean) {
|
|
|
dockList.filter { it.type == DOCK_TYPE_LOCK || it.type == DOCK_TYPE_PORTABLE }
|
|
|
.forEach { dockBean ->
|
|
|
@@ -676,6 +650,9 @@ object ModBusController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 打印全部底座信息
|
|
|
+ */
|
|
|
fun printDockInfo() {
|
|
|
LogUtil.i("当前底座列表 : $dockList")
|
|
|
dockList.forEach { dockBean ->
|
|
|
@@ -704,6 +681,9 @@ object ModBusController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 更新设备类型
|
|
|
+ */
|
|
|
fun updateDeviceType() {
|
|
|
LogUtil.i("____________________________________")
|
|
|
readDeviceType { res ->
|