|
|
@@ -1,7 +1,6 @@
|
|
|
package com.grkj.iscs.modbus
|
|
|
|
|
|
import android.content.Context
|
|
|
-import com.grkj.iscs.extentions.toHexStrings
|
|
|
import com.grkj.iscs.util.Executor
|
|
|
import com.grkj.iscs.util.log.LogUtil
|
|
|
import java.util.*
|
|
|
@@ -13,11 +12,17 @@ import java.util.concurrent.Executors
|
|
|
*/
|
|
|
object ModBusController {
|
|
|
|
|
|
+ /**
|
|
|
+ * 所有的设备列表
|
|
|
+ */
|
|
|
+ var deviceList: MutableList<DeviceBean> = mutableListOf()
|
|
|
+
|
|
|
private const val LISTENER_TYPE_BOTTLE = 1
|
|
|
private const val LISTENER_TYPE_WEIGHT = 2
|
|
|
private const val LISTENER_TYPE_STATUS = 3
|
|
|
private const val LISTENER_TYPE_TEMPERA = 4
|
|
|
|
|
|
+
|
|
|
// 主控板管理器
|
|
|
private var modBusManager: ModBusManager? = null
|
|
|
private var slaveCount: Int = 0
|
|
|
@@ -38,7 +43,7 @@ object ModBusController {
|
|
|
|
|
|
class StatusListener(
|
|
|
val key: Any,
|
|
|
- val listener: (List<Int>) -> Unit,
|
|
|
+ val listener: (Any) -> Unit,
|
|
|
val type: Int
|
|
|
)
|
|
|
|
|
|
@@ -59,44 +64,47 @@ object ModBusController {
|
|
|
interruptReadTrashBinStatus
|
|
|
}, { res ->
|
|
|
// // Logger.d("ModbusController", "res: ${res.map { it.toHexString() }}")
|
|
|
- // 第 0 个字节是 从机地址,第 1 个字节是 功能码,第 2 个字节是 字节数
|
|
|
- // 瓶类计数
|
|
|
- val bottles = res.map { bytes ->
|
|
|
- if (bytes.size > 4) bytes[4].toUByte()
|
|
|
- .toInt() else MODBUS_SLAVE_STATUS__NO_CHANGE
|
|
|
- }
|
|
|
- // 桶的重量
|
|
|
- val weights = res.map { bytes ->
|
|
|
- if (bytes.size > 6) (bytes[5].toUByte() * 256u + bytes[6].toUByte()).toInt() else MODBUS_SLAVE_STATUS__NO_CHANGE
|
|
|
- }.map {
|
|
|
- if (it > 32767) 0 else it // 大于 32767 的表示负数,作 0 处理
|
|
|
- }
|
|
|
- // 其它状态
|
|
|
- val status = res.map { bytes ->
|
|
|
- if (bytes.size > 8) (bytes[7].toUByte() * 256u + bytes[8].toUByte()).toInt() else MODBUS_SLAVE_STATUS__NO_CHANGE
|
|
|
- }
|
|
|
+ LogUtil.i("****************************************************************************")
|
|
|
+// // 第 0 个字节是 从机地址,第 1 个字节是 功能码,第 2 个字节是 字节数
|
|
|
+// // 瓶类计数
|
|
|
+// val bottles = res.map { bytes ->
|
|
|
+// if (bytes.size > 4) bytes[4].toUByte()
|
|
|
+// .toInt() else MODBUS_SLAVE_STATUS__NO_CHANGE
|
|
|
+// }
|
|
|
+// // 桶的重量
|
|
|
+// val weights = res.map { bytes ->
|
|
|
+// if (bytes.size > 6) (bytes[5].toUByte() * 256u + bytes[6].toUByte()).toInt() else MODBUS_SLAVE_STATUS__NO_CHANGE
|
|
|
+// }.map {
|
|
|
+// if (it > 32767) 0 else it // 大于 32767 的表示负数,作 0 处理
|
|
|
+// }
|
|
|
+// // 其它状态
|
|
|
+// val status = res.map { bytes ->
|
|
|
+// if (bytes.size > 8) (bytes[7].toUByte() * 256u + bytes[8].toUByte()).toInt() else MODBUS_SLAVE_STATUS__NO_CHANGE
|
|
|
+// }
|
|
|
// 箱体温度
|
|
|
- val temperatures = res.map { bytes ->
|
|
|
- if (bytes.size > 10) {
|
|
|
-// // Logger.d("ModBus", "桶状态: ${bytes.toHexString()}")
|
|
|
- (bytes[9].toUByte() * 256u + bytes[10].toUByte()).toInt()
|
|
|
- } else MODBUS_SLAVE_STATUS__NO_CHANGE
|
|
|
- }
|
|
|
+// val temperatures = res.map { bytes ->
|
|
|
+// if (bytes.size > 10) {
|
|
|
+//// // Logger.d("ModBus", "桶状态: ${bytes.toHexString()}")
|
|
|
+// (bytes[9].toUByte() * 256u + bytes[10].toUByte()).toInt()
|
|
|
+// } else MODBUS_SLAVE_STATUS__NO_CHANGE
|
|
|
+// }
|
|
|
for (l in listeners) {
|
|
|
- if (l.type == LISTENER_TYPE_BOTTLE) {
|
|
|
- l.listener(bottles)
|
|
|
- }
|
|
|
- if (l.type == LISTENER_TYPE_WEIGHT) {
|
|
|
- l.listener(weights)
|
|
|
- }
|
|
|
+// if (l.type == LISTENER_TYPE_BOTTLE) {
|
|
|
+// l.listener(bottles)
|
|
|
+// }
|
|
|
+// if (l.type == LISTENER_TYPE_WEIGHT) {
|
|
|
+// l.listener(weights)
|
|
|
+// }
|
|
|
if (l.type == LISTENER_TYPE_STATUS) {
|
|
|
- l.listener(status)
|
|
|
- }
|
|
|
- if (l.type == LISTENER_TYPE_TEMPERA) {
|
|
|
- l.listener(temperatures)
|
|
|
+ l.listener(res)
|
|
|
}
|
|
|
+// if (l.type == LISTENER_TYPE_TEMPERA) {
|
|
|
+// l.listener(temperatures)
|
|
|
+// }
|
|
|
}
|
|
|
- }, 1000)
|
|
|
+ // TODO 临时改成5s
|
|
|
+// }, 1000)
|
|
|
+ }, 5000)
|
|
|
?.also {
|
|
|
modBusManager = it
|
|
|
Executor.runOnIO {
|
|
|
@@ -109,17 +117,17 @@ object ModBusController {
|
|
|
/**
|
|
|
* 回调的重量单位:0.01kg、10g
|
|
|
*/
|
|
|
- fun registerWeightListener(key: Any, listener: (List<Int>) -> Unit) {
|
|
|
- listeners.add(StatusListener(key, listener, LISTENER_TYPE_WEIGHT))
|
|
|
- }
|
|
|
+// fun registerWeightListener(key: Any, listener: (List<Int>) -> Unit) {
|
|
|
+// listeners.add(StatusListener(key, listener, LISTENER_TYPE_WEIGHT))
|
|
|
+// }
|
|
|
|
|
|
- fun registerStatusListener(key: Any, listener: (List<Int>) -> Unit) {
|
|
|
+ fun registerStatusListener(key: Any, listener: (Any) -> Unit) {
|
|
|
listeners.add(StatusListener(key, listener, LISTENER_TYPE_STATUS))
|
|
|
}
|
|
|
|
|
|
- fun registerTemperaListener(key: Any, listener: (List<Int>) -> Unit) {
|
|
|
- listeners.add(StatusListener(key, listener, LISTENER_TYPE_TEMPERA))
|
|
|
- }
|
|
|
+// fun registerTemperaListener(key: Any, listener: (List<Int>) -> Unit) {
|
|
|
+// listeners.add(StatusListener(key, listener, LISTENER_TYPE_TEMPERA))
|
|
|
+// }
|
|
|
|
|
|
fun unregisterListener(key: Any) {
|
|
|
val it = listeners.iterator()
|
|
|
@@ -169,4 +177,54 @@ object ModBusController {
|
|
|
modBusManager?.stop()
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /*****************************************************************************************/
|
|
|
+
|
|
|
+ fun checkStatus(byteArray: ByteArray): Boolean? {
|
|
|
+ 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(index: Int?, done: ((res: ByteArray) -> Unit)? = null) {
|
|
|
+ index?.let {
|
|
|
+ modBusManager?.sendTo(it, MBFrame.WRITE_LOCK_BUCKLE_OPEN) { res ->
|
|
|
+ done?.invoke(res)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ fun closeLockBuckle(index: Int?, done: ((res: ByteArray) -> Unit)? = null) {
|
|
|
+ index?.let {
|
|
|
+ modBusManager?.sendTo(it, MBFrame.WRITE_LOCK_BUCKLE_CLOSE) { res ->
|
|
|
+ done?.invoke(res)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|