desc:串口代码

main
xiaowusky 2 years ago
parent bdaa7da6ee
commit 81e21a21e6

@ -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
}
}
} }
Loading…
Cancel
Save