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 7b5b4a0..fe39b05 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/App.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/App.kt @@ -2,7 +2,6 @@ package com.yinuo.safetywatcher.watcher import com.common.commonlib.CommonApplication import com.common.commonlib.db.DBUtils -import com.common.commonlib.db.dao.WarningDao import com.common.commonlib.db.entity.Warning import com.yinuo.safetywatcher.TestUtils import com.yinuo.safetywatcher.watcher.constant.CAMERA_DNS @@ -51,7 +50,7 @@ class App : CommonApplication() { val warningList = warningDao.queryWarningsNoEndTime() warningList?.apply { forEach { warning -> - warning.endTime = trySetEndTime(warningDao, warning) + warning.endTime = trySetEndTime(warning) } warningDao.updateAll(warningList) } @@ -80,8 +79,9 @@ class App : CommonApplication() { } } - private suspend fun trySetEndTime(warningDao: WarningDao, warning: Warning): Long { - val latest = warningDao.findLatestByName(warning.gasName) - return if (latest?.endTime!! > 0L) latest.endTime else System.currentTimeMillis() + private suspend fun trySetEndTime(warning: Warning): Long { + val gasDao = DBUtils.gasDao(); + val latest = gasDao.findLatestByName(warning.gasName) + return latest?.time ?: System.currentTimeMillis() } } \ No newline at end of file diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/port/ParseHelper.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/port/ParseHelper.kt index c542a5c..5aa293a 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/port/ParseHelper.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/port/ParseHelper.kt @@ -5,6 +5,7 @@ import android.os.Looper import com.common.commonlib.db.DBUtils import com.common.commonlib.db.entity.Gas import com.common.commonlib.db.entity.GasType +import com.common.commonlib.db.entity.Warning import com.common.commonlib.utils.MMKVUtils import com.common.serialport.utils.HexUtils import com.yinuo.library.vlc.TxtOverlay @@ -148,29 +149,60 @@ object ParseHelper { */ private fun insertGasData(gasType: String, value: Double, unit: String, rangHexLong: Long) { GlobalScope.launch { - // 设置水印数据 - setOverlayData() + // TODO 阈值范围 + val min = 0.0 + val max = 0.0 + + // 存储量程最大值 + MMKVUtils.put("range_${gasType}", "0$unit~$rangHexLong$unit") // 构造气体数据 val timeMillis = System.currentTimeMillis() - val gas = Gas(timeMillis, gasType, value, unit) - + val gas = Gas(timeMillis, gasType, value, unit, min, max) val gasDao = DBUtils.gasDao() gasDao.insert(gas) - // 存储范围最大值 - MMKVUtils.put("range_${gasType}", "0$unit~$rangHexLong$unit") - try { - // 上传实时气体数据 - tempGasData.add(gas) - if (tempGasData.size > GAS_CLOUD_UPLOAD_SIZE_ONCE) { - devicesApi.uploadGasData(tempGasData) - tempGasData.clear() + // TODO 告警处理 + val warningDao = DBUtils.warningDao() + val warning = warningDao.findLatestByName(gasType) + if (value < min || value > max) { + if (warning == null || warning.endTime > 0) { + warningDao.insert( + Warning( + gasType, + value, + unit, + System.currentTimeMillis(), + min, + max + ) + ) + } + } else { + warning?.let { + it.endTime = System.currentTimeMillis() + warningDao.update(it) } - } catch (e: Exception) { -// e.printStackTrace() - LogUtils.v("uploadGasData error, ${e.message}") } + + // 设置水印数据 + setOverlayData() + + // 实时数据上传后台 + uploadGasData(gas) + } + } + + private suspend fun uploadGasData(gas: Gas) { + try { + // 上传实时气体数据 + tempGasData.add(gas) + if (tempGasData.size > GAS_CLOUD_UPLOAD_SIZE_ONCE) { + devicesApi.uploadGasData(tempGasData) + tempGasData.clear() + } + } catch (e: Exception) { + LogUtils.v("uploadGasData error, ${e.message}") } } diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/HomeActivity.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/HomeActivity.kt index 3510c62..24a8da3 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/HomeActivity.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/HomeActivity.kt @@ -6,6 +6,7 @@ import android.os.Process import android.view.View import androidx.annotation.RequiresApi import androidx.lifecycle.lifecycleScope +import com.common.commonlib.db.DBUtils import com.common.commonlib.utils.NetworkHelper import com.yinuo.library.vlc.IFrameCallBack import com.yinuo.library.vlc.RtspSurfaceRender2 @@ -25,6 +26,7 @@ import com.yinuo.safetywatcher.watcher.utils.BatteryHelper import com.yinuo.safetywatcher.watcher.utils.SimHelper import com.yinuo.safetywatcher.watcher.utils.WifiHelper import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch class HomeActivity : NoOptionsActivity() { @@ -105,11 +107,13 @@ class HomeActivity : NoOptionsActivity() { //mHasSensorData = true mBinding.errorView.visibility = if (!AppData.hasCameraData()) View.VISIBLE else View.GONE - val errorRes = if (!AppData.hasCameraData() && !AppData.hasSensorData()) R.drawable.ic_nosingal else R.drawable.ic_icon + val errorRes = + if (!AppData.hasCameraData() && !AppData.hasSensorData()) R.drawable.ic_nosingal else R.drawable.ic_icon mBinding.errorView.setImageResource(errorRes) // tipView - mBinding.tipView.visibility = if (!AppData.hasCameraData() && AppData.hasSensorData()) View.VISIBLE else View.GONE + mBinding.tipView.visibility = + if (!AppData.hasCameraData() && AppData.hasSensorData()) View.VISIBLE else View.GONE mBinding.tipView.setImageBitmap(TxtOverlay.getOverlayBitmap()) } } @@ -148,12 +152,39 @@ class HomeActivity : NoOptionsActivity() { AppData.setSensorData(true) closeLoadingDialog() changeViewStatus() + setWarnView() watchSensor(DELAY_TIME_CHECK_SENSOR) } watchSensor(DELAY_TIME_CHECK_SENSOR) GasUtils.initPort() } + /** + * 设置告警视图展示 + */ + private fun setWarnView() { + GlobalScope.launch { + val warningDao = DBUtils.warningDao() + val warningList = warningDao.queryWarningsNoEndTime() + val builder = StringBuilder() + warningList?.forEachIndexed { index, it -> + builder.append(it.gasName).append("浓度异常,") + .append("当前值: ${it.gasValue} ${it.unit}") + if (index != warningList.size - 1) { + builder.append("\n") + } + } + launch(Dispatchers.Main) { + if (builder.toString().isNotEmpty()) { + mBinding.tvWarn.text = builder.toString() + mBinding.tvWarn.visibility = View.VISIBLE + } else { + mBinding.tvWarn.visibility = View.GONE + } + } + } + } + /** * 监视传感器 */ diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 6fe6725..99a54f8 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -155,8 +155,10 @@ + @Query("SELECT * FROM gas WHERE gas_name IS :name ORDER BY id DESC LIMIT 1") + suspend fun findLatestByName(name: String): Gas? + @Insert suspend fun insertAll(gases: List) diff --git a/library-vlc/src/main/java/com/yinuo/library/vlc/RtspHelper.java b/library-vlc/src/main/java/com/yinuo/library/vlc/RtspHelper.java index 6b024ca..7c247e5 100644 --- a/library-vlc/src/main/java/com/yinuo/library/vlc/RtspHelper.java +++ b/library-vlc/src/main/java/com/yinuo/library/vlc/RtspHelper.java @@ -52,7 +52,7 @@ public class RtspHelper { options.add("--audio-time-stretch"); // time stretching options.add("-vvv"); // verbosity options.add("--file-caching=2000"); - options.add("--rtsp-frame-buffer-size=81920"); + options.add("--rtsp-frame-buffer-size=163840"); options.add("--rtsp-tcp"); mVlc = new LibVLC(Objects.requireNonNull(CommonApplication.Companion.getContext()), options);