| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- package com.grkj.iscs.modbus
- import android.content.Context
- import com.grkj.iscs.util.Executor
- import com.grkj.iscs.util.log.LogUtil
- import java.util.concurrent.Executors
- /**
- * ModBus 主控板控制器
- */
- object ModBusController {
- /**
- * 所有的设备列表
- */
- var deviceList: MutableList<DeviceBean> = mutableListOf()
- private const val LISTENER_TYPE_STATUS = 3
- // 主控板管理器
- private var modBusManager: ModBusManager? = null
- private var slaveCount: Int = 0
- private val threadPool = Executors.newScheduledThreadPool(4)
- private val listeners = ArrayList<StatusListener>()
- // 是否中断读取状态
- private var interruptReadStatus: ArrayList<Boolean> = ArrayList()
- var shouldStopUpgrade = false
- fun setSlaveCount(count: Int) {
- modBusManager?.slaveCount = count
- slaveCount = count
- }
- class StatusListener(
- val key: Any,
- val listener: (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)
- }
- // 间隔 1 秒读一遍桶的状态
- ?.repeatSendToAll(MBFrame.READ_STATUS, {
- interruptReadStatus
- }, { res ->
- // // Logger.d("ModbusController", "res: ${res.map { it.toHexString() }}")
- LogUtil.i("****************************************************************************")
- for (l in listeners) {
- if (l.type == LISTENER_TYPE_STATUS) {
- l.listener(res)
- }
- }
- // TODO 临时改成5s
- // }, 1000)
- }, 5000)
- ?.also {
- modBusManager = it
- Executor.runOnIO {
- // refreshAllowOpenDoorUnidentified(ctx, it)
- }
- }
- ?.start()
- }
- fun registerStatusListener(key: Any, listener: (Any) -> Unit) {
- listeners.add(StatusListener(key, listener, LISTENER_TYPE_STATUS))
- }
- fun unregisterListener(key: Any) {
- val it = listeners.iterator()
- while (it.hasNext()) {
- if (it.next().key == key) {
- it.remove()
- }
- }
- }
- fun stop() {
- modBusManager?.stop()
- }
- /*****************************************************************************************/
- fun checkStatus(byteArray: ByteArray): Any? {
- if (byteArray.isEmpty()) {
- return null
- }
- return deviceList.find { it.idx == byteArray[0] }?.parseStatus(byteArray)
- }
- /**
- * 读取设备类型
- */
- fun readDeviceType(done: ((res: List<ByteArray>) -> Unit)? = null) {
- modBusManager?.sendToAll(MBFrame.READ_DEVICE_TYPE) { res ->
- done?.invoke(res)
- }
- }
- /**
- * 读取卡扣状态
- */
- fun readBuckleStatus(index: Int?, doneSingle: ((res: ByteArray) -> Unit)? = null, doneAll: ((res: List<ByteArray>) -> Unit)? = null) {
- index?.let {
- modBusManager?.sendTo(it, MBFrame.READ_BUCKLE_STATUS) { res ->
- doneSingle?.invoke(res)
- }
- } ?: let {
- modBusManager?.sendToAll(MBFrame.READ_BUCKLE_STATUS) { res ->
- doneAll?.invoke(res)
- }
- }
- }
- fun openLockBuckle(slaveIdx: Int?, lockIdx: Int, done: ((res: ByteArray) -> Unit)? = null) {
- slaveIdx?.let {
- modBusManager?.generateLockBuckleCmd(true, lockIdx)?.let { cmd ->
- modBusManager?.sendTo(it, cmd) { res ->
- done?.invoke(res)
- }
- }
- }
- }
-
- fun closeLockBuckle(slaveIdx: Int?, lockIdx: Int, done: ((res: ByteArray) -> Unit)? = null) {
- slaveIdx?.let {
- modBusManager?.generateLockBuckleCmd(false, lockIdx)?.let { cmd ->
- modBusManager?.sendTo(it, cmd) { res ->
- done?.invoke(res)
- }
- }
- }
- }
- fun readLockRfid(slaveIdx: Int?, lockIdx: Int, done: ((res: ByteArray) -> Unit)? = null) {
- slaveIdx?.let {
- modBusManager?.generateLockRfidCmd(lockIdx)?.let { cmd ->
- modBusManager?.sendTo(it, cmd) { res ->
- done?.invoke(res)
- }
- }
- }
- }
- /**
- * 更新锁具RFID
- */
- fun updateLockRfid(slaveIdx: Int, lockIdx: Int, rfid: String) {
- deviceList.find { it.idx?.toInt() == slaveIdx }?.lockList?.find { it.idx == lockIdx }?.rfid = rfid
- }
- }
|