|
|
@ -1,15 +1,21 @@
|
|
|
|
package com.yinuo.safetywatcher.watcher.port
|
|
|
|
package com.yinuo.safetywatcher.watcher.port
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import android.os.Handler
|
|
|
|
|
|
|
|
import android.os.Looper
|
|
|
|
import kotlinx.coroutines.DelicateCoroutinesApi
|
|
|
|
import kotlinx.coroutines.DelicateCoroutinesApi
|
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
import kotlinx.coroutines.GlobalScope
|
|
|
|
import kotlinx.coroutines.GlobalScope
|
|
|
|
|
|
|
|
import kotlinx.coroutines.Runnable
|
|
|
|
import kotlinx.coroutines.delay
|
|
|
|
import kotlinx.coroutines.delay
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
|
|
|
|
|
|
|
|
object GasUtils {
|
|
|
|
object GasUtils {
|
|
|
|
private const val BAUD_RATE = 9600
|
|
|
|
private const val BAUD_RATE = 9600
|
|
|
|
private const val FULL_MSG_SIZE = 9
|
|
|
|
private const val FULL_MSG_SIZE = 9
|
|
|
|
|
|
|
|
private const val CHECK_TIME = 10000L
|
|
|
|
private val mPortFlags = booleanArrayOf(false, false, false, false)
|
|
|
|
private val mPortFlags = booleanArrayOf(false, false, false, false)
|
|
|
|
|
|
|
|
private val mPortRunnable = hashMapOf<Int, FlagRunnable>()
|
|
|
|
|
|
|
|
private val mHandler = Handler(Looper.getMainLooper())
|
|
|
|
|
|
|
|
|
|
|
|
fun initPort() {
|
|
|
|
fun initPort() {
|
|
|
|
openPorts()
|
|
|
|
openPorts()
|
|
|
@ -19,7 +25,7 @@ object GasUtils {
|
|
|
|
private fun openPorts() {
|
|
|
|
private fun openPorts() {
|
|
|
|
if (!mPortFlags[0]) {
|
|
|
|
if (!mPortFlags[0]) {
|
|
|
|
PlatformMultiPortUtils.openPort("/dev/tyyS0", BAUD_RATE) {
|
|
|
|
PlatformMultiPortUtils.openPort("/dev/tyyS0", BAUD_RATE) {
|
|
|
|
mPortFlags[0] = true
|
|
|
|
setFlag(0)
|
|
|
|
if (it.isNotEmpty() && it.size >= FULL_MSG_SIZE) {
|
|
|
|
if (it.isNotEmpty() && it.size >= FULL_MSG_SIZE) {
|
|
|
|
val checkSum = getCheckSum(it)
|
|
|
|
val checkSum = getCheckSum(it)
|
|
|
|
// 校验通过
|
|
|
|
// 校验通过
|
|
|
@ -42,12 +48,23 @@ object GasUtils {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun setFlag(index: Int) {
|
|
|
|
|
|
|
|
var flagRunnable = mPortRunnable[index]
|
|
|
|
|
|
|
|
if (flagRunnable == null) {
|
|
|
|
|
|
|
|
flagRunnable = FlagRunnable(index)
|
|
|
|
|
|
|
|
mPortRunnable[index] = flagRunnable
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
mHandler.removeCallbacks(flagRunnable)
|
|
|
|
|
|
|
|
mPortFlags[index] = true
|
|
|
|
|
|
|
|
mHandler.postDelayed(flagRunnable, CHECK_TIME)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 监控串口状态
|
|
|
|
// 监控串口状态
|
|
|
|
@OptIn(DelicateCoroutinesApi::class)
|
|
|
|
@OptIn(DelicateCoroutinesApi::class)
|
|
|
|
private fun watchPortFlag() {
|
|
|
|
private fun watchPortFlag() {
|
|
|
|
GlobalScope.launch(Dispatchers.Default) {
|
|
|
|
GlobalScope.launch(Dispatchers.Default) {
|
|
|
|
while (true) {
|
|
|
|
while (true) {
|
|
|
|
delay(30000)
|
|
|
|
delay(CHECK_TIME)
|
|
|
|
launch(Dispatchers.Main) {
|
|
|
|
launch(Dispatchers.Main) {
|
|
|
|
openPorts()
|
|
|
|
openPorts()
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -65,4 +82,10 @@ object GasUtils {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return (sum.inv() + 1).toByte()
|
|
|
|
return (sum.inv() + 1).toByte()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FlagRunnable(private val index: Int) : Runnable {
|
|
|
|
|
|
|
|
override fun run() {
|
|
|
|
|
|
|
|
mPortFlags[index] = false
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|