desc:传感器相关

main
xiaowusky 2 years ago
parent 81e21a21e6
commit 36c2ae491d

@ -35,9 +35,9 @@ object TestUtils {
return@launch
}
val list = mutableListOf<GasType>()
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)
// 构造气体数据

@ -46,12 +46,20 @@ class App : CommonApplication() {
async {
val videoDao = DBUtils.videoDao()
val videoList = videoDao.getAll()
videoList.apply {
forEach { 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()
}

@ -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)
}
}
}

@ -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<SensorData>()
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)
}
}
}
}

@ -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<SensorData, LayoutItemSensorBinding, SensorAdapter.SensorViewHolder>() {
BaseRvAdapter<GasType, LayoutItemSensorBinding, SensorAdapter.SensorViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SensorViewHolder {
return SensorViewHolder(
@ -23,26 +23,26 @@ class SensorAdapter :
}
class SensorViewHolder(private val binding: LayoutItemSensorBinding) :
BaseViewHolder<SensorData, LayoutItemSensorBinding>(binding) {
BaseViewHolder<GasType, LayoutItemSensorBinding>(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
}
}
}

@ -8,7 +8,7 @@
<TextView
android:id="@+id/sensor_name"
android:layout_width="wrap_content"
android:layout_width="@dimen/_300dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/_172dp"
android:text="传感器"

@ -3,6 +3,7 @@ package com.common.commonlib.db.dao
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import com.common.commonlib.db.entity.GasType
@ -11,7 +12,7 @@ interface GasTypeDao {
@Query("SELECT * FROM gas_type")
suspend fun getAll(): List<GasType>
@Insert
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(gas: GasType)
@Insert

@ -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
)

Loading…
Cancel
Save