diff --git a/app/src/main/java/com/yinuo/safetywatcher/TestUtils.kt b/app/src/main/java/com/yinuo/safetywatcher/TestUtils.kt index 108ab48..1b88011 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/TestUtils.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/TestUtils.kt @@ -35,9 +35,9 @@ object TestUtils { return@launch } val list = mutableListOf() - list.add(GasType("CO")) - list.add(GasType("CO2")) - list.add(GasType("O2")) + list.add(GasType("CO", "", false)) + list.add(GasType("CO2", "", false)) + list.add(GasType("O2", "", false)) typeDao.insertAll(list) // 构造气体数据 diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/App.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/App.kt index 59efbad..1a52f64 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/App.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/App.kt @@ -46,14 +46,22 @@ class App : CommonApplication() { async { val videoDao = DBUtils.videoDao() val videoList = videoDao.getAll() - videoList.apply { - forEach { video -> - if (!File(video.path).exists()) { - videoDao.delete(video) - } + videoList.onEach { video -> + if (!File(video.path).exists()) { + videoDao.delete(video) } } }.await() + + // 初始时,所以串口连接状态都应该是未连接 + async { + val gasTypeDao = DBUtils.gasTypeDao() + val all = gasTypeDao.getAll() + all.onEach { gasType -> + gasType.online = false + gasTypeDao.insert(gasType) + } + }.await() } } diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasUtils.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasUtils.kt index 6b82a94..525abb4 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasUtils.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasUtils.kt @@ -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) } } } \ No newline at end of file diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/SensorActivity.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/SensorActivity.kt index 7825362..3140efd 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/SensorActivity.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/SensorActivity.kt @@ -1,12 +1,15 @@ package com.yinuo.safetywatcher.watcher.ui import android.view.View +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager +import com.common.commonlib.db.DBUtils import com.yinuo.safetywatcher.R import com.yinuo.safetywatcher.databinding.ActivitySensorBinding -import com.yinuo.safetywatcher.watcher.ui.adapter.SensorAdapter import com.yinuo.safetywatcher.watcher.base.NoOptionsActivity -import com.yinuo.safetywatcher.watcher.bean.SensorData +import com.yinuo.safetywatcher.watcher.ui.adapter.SensorAdapter +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch class SensorActivity : NoOptionsActivity() { @@ -14,6 +17,10 @@ class SensorActivity : NoOptionsActivity() { ActivitySensorBinding.inflate(layoutInflater) } + private val mAdapter by lazy { + SensorAdapter() + } + override fun getTopBarTitle(): String? { return getString(R.string.sensor) } @@ -23,13 +30,19 @@ class SensorActivity : NoOptionsActivity() { } override fun initView() { - val adapter = SensorAdapter() - - val list = mutableListOf() - list.add(SensorData("传感器A")) - list.add(SensorData("传感器B")) - adapter.setData(list) mBingding.rvSensor.layoutManager = LinearLayoutManager(this@SensorActivity) - mBingding.rvSensor.adapter = adapter + mBingding.rvSensor.adapter = mAdapter + + queryData() + } + + private fun queryData() { + lifecycleScope.launch { + val gasTypeDao = DBUtils.gasTypeDao() + val gasTypes = gasTypeDao.getAll() + launch(Dispatchers.Main){ + mAdapter.setData(gasTypes) + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/adapter/SensorAdapter.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/adapter/SensorAdapter.kt index 89b810a..4858615 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/adapter/SensorAdapter.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/adapter/SensorAdapter.kt @@ -3,14 +3,14 @@ package com.yinuo.safetywatcher.watcher.ui.adapter import android.content.Intent import android.view.LayoutInflater import android.view.ViewGroup +import com.common.commonlib.db.entity.GasType import com.yinuo.safetywatcher.R import com.yinuo.safetywatcher.databinding.LayoutItemSensorBinding import com.yinuo.safetywatcher.watcher.base.BaseRvAdapter -import com.yinuo.safetywatcher.watcher.bean.SensorData import com.yinuo.safetywatcher.watcher.ui.SensorSettingActivity class SensorAdapter : - BaseRvAdapter() { + BaseRvAdapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SensorViewHolder { return SensorViewHolder( @@ -23,26 +23,26 @@ class SensorAdapter : } class SensorViewHolder(private val binding: LayoutItemSensorBinding) : - BaseViewHolder(binding) { + BaseViewHolder(binding) { - override fun bindView(data: SensorData) { + override fun bindView(data: GasType) { val context = binding.root.context binding.sensorSetting.setOnClickListener { context.startActivity(Intent(context, SensorSettingActivity::class.java)) } - binding.sensorName.text = data.name - val state = data.state + binding.sensorName.text = data.type + val state = data.online binding.sensorStatus.text = context.getText(getShowStatus(state)) binding.sensorStatus.setTextColor(context.getColor(getShowStatusColor(state))) } - private fun getShowStatusColor(state: Int): Int { - return if (state == 0) R.color.color_ok else R.color.color_error + private fun getShowStatusColor(state: Boolean): Int { + return if (state) R.color.color_ok else R.color.color_error } - private fun getShowStatus(state: Int): Int { - return if (state == 0) R.string.status_ok else R.string.status_error + private fun getShowStatus(state: Boolean): Int { + return if (state) R.string.status_ok else R.string.status_offline } } } diff --git a/app/src/main/res/layout/layout_item_sensor.xml b/app/src/main/res/layout/layout_item_sensor.xml index b90189f..ee44c17 100644 --- a/app/src/main/res/layout/layout_item_sensor.xml +++ b/app/src/main/res/layout/layout_item_sensor.xml @@ -8,7 +8,7 @@ - @Insert + @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insert(gas: GasType) @Insert diff --git a/library-common/src/main/java/com/common/commonlib/db/entity/GasType.kt b/library-common/src/main/java/com/common/commonlib/db/entity/GasType.kt index 378a2df..14af498 100644 --- a/library-common/src/main/java/com/common/commonlib/db/entity/GasType.kt +++ b/library-common/src/main/java/com/common/commonlib/db/entity/GasType.kt @@ -6,5 +6,7 @@ import androidx.room.PrimaryKey @Entity(tableName = "gas_type") data class GasType( - @PrimaryKey @ColumnInfo(name = "gas_type") var type: String + @PrimaryKey @ColumnInfo(name = "gas_type") var type: String, + @ColumnInfo(name = "port_path") var port: String, + @ColumnInfo(name = "online_flag") var online: Boolean )