|
|
|
@ -2,6 +2,8 @@ package com.yinuo.safetywatcher.watcher.port
|
|
|
|
|
|
|
|
|
|
import android.os.Handler
|
|
|
|
|
import android.os.Looper
|
|
|
|
|
import com.common.commonlib.db.DBUtils
|
|
|
|
|
import com.common.commonlib.db.entity.GasType
|
|
|
|
|
import kotlinx.coroutines.DelicateCoroutinesApi
|
|
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
|
import kotlinx.coroutines.GlobalScope
|
|
|
|
@ -25,7 +27,6 @@ object GasUtils {
|
|
|
|
|
private fun openPorts() {
|
|
|
|
|
if (!mPortFlags[0]) {
|
|
|
|
|
PlatformMultiPortUtils.openPort("/dev/tyyS0", BAUD_RATE) {
|
|
|
|
|
setFlag(0)
|
|
|
|
|
if (it.isNotEmpty() && it.size >= FULL_MSG_SIZE) {
|
|
|
|
|
val checkSum = getCheckSum(it)
|
|
|
|
|
// 校验通过
|
|
|
|
@ -33,6 +34,7 @@ object GasUtils {
|
|
|
|
|
val gasName = it[1]
|
|
|
|
|
val gasUnit = it[2]
|
|
|
|
|
val gasValue: Double = (it[4] * 256 + it[5]) / 100.00
|
|
|
|
|
setFlag(0, gasName, "/dev/tyyS0")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -48,14 +50,24 @@ object GasUtils {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun setFlag(index: Int) {
|
|
|
|
|
@OptIn(DelicateCoroutinesApi::class)
|
|
|
|
|
private fun updateGasTypeDb(gasName: Byte, port: String, online: Boolean) {
|
|
|
|
|
GlobalScope.launch {
|
|
|
|
|
val typeDao = DBUtils.gasTypeDao()
|
|
|
|
|
typeDao.insert(GasType(gasName.toString(), port, online))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun setFlag(index: Int, gasName: Byte, port: String) {
|
|
|
|
|
var flagRunnable = mPortRunnable[index]
|
|
|
|
|
if (flagRunnable == null) {
|
|
|
|
|
flagRunnable = FlagRunnable(index)
|
|
|
|
|
flagRunnable = FlagRunnable(index, gasName, port)
|
|
|
|
|
mPortRunnable[index] = flagRunnable
|
|
|
|
|
}
|
|
|
|
|
mHandler.removeCallbacks(flagRunnable)
|
|
|
|
|
mPortFlags[index] = true
|
|
|
|
|
updateGasTypeDb(gasName, port, true)
|
|
|
|
|
// 如果一段时间内没有收到消息,认为连接断开
|
|
|
|
|
mHandler.postDelayed(flagRunnable, CHECK_TIME)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -64,6 +76,7 @@ object GasUtils {
|
|
|
|
|
private fun watchPortFlag() {
|
|
|
|
|
GlobalScope.launch(Dispatchers.Default) {
|
|
|
|
|
while (true) {
|
|
|
|
|
// 延时一段时间后,尝试重新打开串口
|
|
|
|
|
delay(CHECK_TIME)
|
|
|
|
|
launch(Dispatchers.Main) {
|
|
|
|
|
openPorts()
|
|
|
|
@ -72,7 +85,7 @@ object GasUtils {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 计算校验值
|
|
|
|
|
private fun getCheckSum(bytes: ByteArray?): Byte {
|
|
|
|
|
var sum: Int = 0
|
|
|
|
|
bytes?.forEachIndexed { index, byte ->
|
|
|
|
@ -83,9 +96,15 @@ object GasUtils {
|
|
|
|
|
return (sum.inv() + 1).toByte()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class FlagRunnable(private val index: Int) : Runnable {
|
|
|
|
|
class FlagRunnable(
|
|
|
|
|
private val index: Int,
|
|
|
|
|
private val gasName: Byte,
|
|
|
|
|
private val port: String
|
|
|
|
|
) : Runnable {
|
|
|
|
|
override fun run() {
|
|
|
|
|
PlatformMultiPortUtils.release(port)
|
|
|
|
|
mPortFlags[index] = false
|
|
|
|
|
updateGasTypeDb(gasName, "", false)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|