ModBusController.kt 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package com.grkj.iscs.modbus
  2. import android.content.Context
  3. import com.grkj.iscs.util.Executor
  4. import com.grkj.iscs.util.log.LogUtil
  5. import java.util.concurrent.Executors
  6. /**
  7. * ModBus 主控板控制器
  8. */
  9. object ModBusController {
  10. /**
  11. * 所有的设备列表
  12. */
  13. var deviceList: MutableList<DeviceBean> = mutableListOf()
  14. private const val LISTENER_TYPE_STATUS = 3
  15. // 主控板管理器
  16. private var modBusManager: ModBusManager? = null
  17. private var slaveCount: Int = 0
  18. private val threadPool = Executors.newScheduledThreadPool(4)
  19. private val listeners = ArrayList<StatusListener>()
  20. // 是否中断读取状态
  21. private var interruptReadStatus: ArrayList<Boolean> = ArrayList()
  22. var shouldStopUpgrade = false
  23. fun setSlaveCount(count: Int) {
  24. modBusManager?.slaveCount = count
  25. slaveCount = count
  26. }
  27. class StatusListener(
  28. val key: Any,
  29. val listener: (Any) -> Unit,
  30. val type: Int
  31. )
  32. fun interruptReadTrashBinStatus(interrupt: Boolean) {
  33. interruptReadStatus.clear()
  34. interruptReadStatus.add(interrupt)
  35. }
  36. @ExperimentalUnsignedTypes
  37. fun start(ctx: Context) {
  38. modBusManager?.stop()
  39. PortManager.openCtrlBord(ctx)
  40. ?.let { pm ->
  41. return@let ModBusManager(slaveCount, pm, true)
  42. }
  43. // 间隔 1 秒读一遍桶的状态
  44. ?.repeatSendToAll(MBFrame.READ_STATUS, {
  45. interruptReadStatus
  46. }, { res ->
  47. // // Logger.d("ModbusController", "res: ${res.map { it.toHexString() }}")
  48. LogUtil.i("****************************************************************************")
  49. for (l in listeners) {
  50. if (l.type == LISTENER_TYPE_STATUS) {
  51. l.listener(res)
  52. }
  53. }
  54. // TODO 临时改成5s
  55. // }, 1000)
  56. }, 5000)
  57. ?.also {
  58. modBusManager = it
  59. Executor.runOnIO {
  60. // refreshAllowOpenDoorUnidentified(ctx, it)
  61. }
  62. }
  63. ?.start()
  64. }
  65. fun registerStatusListener(key: Any, listener: (Any) -> Unit) {
  66. listeners.add(StatusListener(key, listener, LISTENER_TYPE_STATUS))
  67. }
  68. fun unregisterListener(key: Any) {
  69. val it = listeners.iterator()
  70. while (it.hasNext()) {
  71. if (it.next().key == key) {
  72. it.remove()
  73. }
  74. }
  75. }
  76. fun stop() {
  77. modBusManager?.stop()
  78. }
  79. /*****************************************************************************************/
  80. fun checkStatus(byteArray: ByteArray): Any? {
  81. if (byteArray.isEmpty()) {
  82. return null
  83. }
  84. return deviceList.find { it.idx == byteArray[0] }?.parseStatus(byteArray)
  85. }
  86. /**
  87. * 读取设备类型
  88. */
  89. fun readDeviceType(done: ((res: List<ByteArray>) -> Unit)? = null) {
  90. modBusManager?.sendToAll(MBFrame.READ_DEVICE_TYPE) { res ->
  91. done?.invoke(res)
  92. }
  93. }
  94. /**
  95. * 读取卡扣状态
  96. */
  97. fun readBuckleStatus(index: Int?, doneSingle: ((res: ByteArray) -> Unit)? = null, doneAll: ((res: List<ByteArray>) -> Unit)? = null) {
  98. index?.let {
  99. modBusManager?.sendTo(it, MBFrame.READ_BUCKLE_STATUS) { res ->
  100. doneSingle?.invoke(res)
  101. }
  102. } ?: let {
  103. modBusManager?.sendToAll(MBFrame.READ_BUCKLE_STATUS) { res ->
  104. doneAll?.invoke(res)
  105. }
  106. }
  107. }
  108. fun openLockBuckle(slaveIdx: Int?, lockIdx: Int, done: ((res: ByteArray) -> Unit)? = null) {
  109. slaveIdx?.let {
  110. modBusManager?.generateLockBuckleCmd(true, lockIdx)?.let { cmd ->
  111. modBusManager?.sendTo(it, cmd) { res ->
  112. done?.invoke(res)
  113. }
  114. }
  115. }
  116. }
  117. fun closeLockBuckle(slaveIdx: Int?, lockIdx: Int, done: ((res: ByteArray) -> Unit)? = null) {
  118. slaveIdx?.let {
  119. modBusManager?.generateLockBuckleCmd(false, lockIdx)?.let { cmd ->
  120. modBusManager?.sendTo(it, cmd) { res ->
  121. done?.invoke(res)
  122. }
  123. }
  124. }
  125. }
  126. fun readLockRfid(slaveIdx: Int?, lockIdx: Int, done: ((res: ByteArray) -> Unit)? = null) {
  127. slaveIdx?.let {
  128. modBusManager?.generateLockRfidCmd(lockIdx)?.let { cmd ->
  129. modBusManager?.sendTo(it, cmd) { res ->
  130. done?.invoke(res)
  131. }
  132. }
  133. }
  134. }
  135. /**
  136. * 更新锁具RFID
  137. */
  138. fun updateLockRfid(slaveIdx: Int, lockIdx: Int, rfid: String) {
  139. deviceList.find { it.idx?.toInt() == slaveIdx }?.lockList?.find { it.idx == lockIdx }?.rfid = rfid
  140. }
  141. }