diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasConstants.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasConstants.kt index 6965dac..cbb9a31 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasConstants.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasConstants.kt @@ -33,34 +33,34 @@ const val MIN_SUFFIX = "min" const val MAX_SUFFIX = "max" // 各个气体报警高低默认值,默认单位 -const val CO_MIN_MGM3 = 20f -const val CO_MAX_MGM3 = 40f +const val CO_MIN_PPM = 35f +const val CO_MAX_PPM = 200f const val O2_MIN = 19.5f const val O2_MAX = 23.5f const val CH4_MIN_LEL = 25f const val CH4_MAX_LEL = 50f -const val H2S_MIN_MGM3 = 10f -const val H2S_MAX_MGM3 = 20f +const val H2S_MIN_PPM = 10f +const val H2S_MAX_PPM = 15f const val H2_MIN_LEL = 25f const val H2_MAX_LEL = 50f -const val NH3_MIN_MGM3 = 20f -const val NH3_MAX_MGM3 = 40f -const val S02_MIN_MGM3 = 5f -const val S02_MAX_MGM3 = 10f -const val CL2_MIN_MGM3 = 1f -const val CL2_MAX_MGM3 = 2f -const val NO2_MIN_MGM3 = 5f -const val NO2_MAX_MGM3 = 10f -const val NO_MIN_PPM = 10f -const val NO_MAX_PPM = 20f -const val HF_MIN_PPM = 2.2f -const val HF_MAX_PPM = 4.4f -const val C02_MIN_PPM = 1000f -const val C02_MAX_PPM = 2000f +const val NH3_MIN_PPM = 25f +const val NH3_MAX_PPM = 50f +const val S02_MIN_PPM = 2f +const val S02_MAX_PPM = 5f +const val CL2_MIN_PPM = 0.5f +const val CL2_MAX_PPM = 1f +const val NO2_MIN_PPM = 2f +const val NO2_MAX_PPM = 5f +const val NO_MIN_PPM = 13f +const val NO_MAX_PPM = 25f +const val HF_MIN_PPM = 2f +const val HF_MAX_PPM = 6f +const val C02_MIN_PPM = 5000f +const val C02_MAX_PPM = 30000f //?? TODO VOCS 这个值现在不对 -const val VOCS_MIN_PPM = 0.6f -const val VOCS_MAX_PPM = 1.2f +const val VOCS_MIN_PPM = 2f +const val VOCS_MAX_PPM = 6f // 单位 const val UNIT_VOL = "%VOL" @@ -70,23 +70,23 @@ const val UNIT_LEL = "%LEL" // 气体默认阈值表 val default_threshold_map_ppm = hashMapOf( - Pair("${CO}_$MIN_SUFFIX", mgm3ToPpm(CO_MIN_MGM3, MOLECULAR_CO)), - Pair("${CO}_$MAX_SUFFIX", mgm3ToPpm(CO_MAX_MGM3, MOLECULAR_CO)), + Pair("${CO}_$MIN_SUFFIX", CO_MIN_PPM), + Pair("${CO}_$MAX_SUFFIX", CO_MAX_PPM), // Pair("${CH4}_$MIN_SUFFIX", lel2ppm(CH4_MIN_LEL, CH4_LEL2PPMFACTOR)), // Pair("${CH4}_$MAX_SUFFIX", lel2ppm(CH4_MAX_LEL, CH4_LEL2PPMFACTOR)), - Pair("${H2S}_$MIN_SUFFIX", mgm3ToPpm(H2S_MIN_MGM3, MOLECULAR_H2S)), - Pair("${H2S}_$MAX_SUFFIX", mgm3ToPpm(H2S_MAX_MGM3, MOLECULAR_H2S)), + Pair("${H2S}_$MIN_SUFFIX", H2S_MIN_PPM), + Pair("${H2S}_$MAX_SUFFIX", H2S_MAX_PPM), // Pair("${H2}_$MIN_SUFFIX", lel2ppm(H2_MIN_LEL, H2_LEL2PPMFACTOR)), // Pair("${H2}_$MAX_SUFFIX", lel2ppm(H2_MAX_LEL, H2_LEL2PPMFACTOR)), - Pair("${NH3}_$MIN_SUFFIX", mgm3ToPpm(NH3_MIN_MGM3, MOLECULAR_NH3)), - Pair("${NH3}_$MAX_SUFFIX", mgm3ToPpm(NH3_MAX_MGM3, MOLECULAR_NH3)), - Pair("${S02}_$MIN_SUFFIX", mgm3ToPpm(S02_MIN_MGM3, MOLECULAR_S02)), - Pair("${S02}_$MAX_SUFFIX", mgm3ToPpm(S02_MAX_MGM3, MOLECULAR_S02)), - Pair("${CL2}_$MIN_SUFFIX", mgm3ToPpm(CL2_MIN_MGM3, MOLECULAR_CL2)), - Pair("${CL2}_$MAX_SUFFIX", mgm3ToPpm(CL2_MAX_MGM3, MOLECULAR_CL2)), - Pair("${NO2}_$MIN_SUFFIX", mgm3ToPpm(NO2_MIN_MGM3, MOLECULAR_NO2)), - Pair("${NO2}_$MAX_SUFFIX", mgm3ToPpm(NO2_MAX_MGM3, MOLECULAR_NO2)), + Pair("${NH3}_$MIN_SUFFIX", NH3_MIN_PPM), + Pair("${NH3}_$MAX_SUFFIX", NH3_MAX_PPM), + Pair("${S02}_$MIN_SUFFIX", S02_MIN_PPM), + Pair("${S02}_$MAX_SUFFIX", S02_MAX_PPM), + Pair("${CL2}_$MIN_SUFFIX", CL2_MIN_PPM), + Pair("${CL2}_$MAX_SUFFIX", CL2_MAX_PPM), + Pair("${NO2}_$MIN_SUFFIX", NO2_MIN_PPM), + Pair("${NO2}_$MAX_SUFFIX", NO2_MAX_PPM), Pair("${NO}_$MIN_SUFFIX", NO_MIN_PPM), Pair("${NO}_$MAX_SUFFIX", NO_MAX_PPM), Pair("${HF}_$MIN_SUFFIX", HF_MIN_PPM), @@ -97,22 +97,22 @@ val default_threshold_map_ppm = hashMapOf( // 气体默认阈值表 val default_threshold_map_mgm3 = hashMapOf( - Pair("${CO}_$MIN_SUFFIX", CO_MIN_MGM3), - Pair("${CO}_$MAX_SUFFIX", CO_MAX_MGM3), + Pair("${CO}_$MIN_SUFFIX", ppm2mgm3(CO_MIN_PPM, MOLECULAR_CO)), + Pair("${CO}_$MAX_SUFFIX", ppm2mgm3(CO_MAX_PPM, MOLECULAR_CO)), // Pair("${CH4}_$MIN_SUFFIX", ppm2mgm3(lel2ppm(CH4_MIN_LEL, CH4_LEL2PPMFACTOR), MOLECULAR_CH4)), // Pair("${CH4}_$MAX_SUFFIX", ppm2mgm3(lel2ppm(CH4_MAX_LEL, CH4_LEL2PPMFACTOR), MOLECULAR_CH4)), - Pair("${H2S}_$MIN_SUFFIX", H2S_MIN_MGM3), - Pair("${H2S}_$MAX_SUFFIX", H2S_MAX_MGM3), + Pair("${H2S}_$MIN_SUFFIX", ppm2mgm3(H2S_MIN_PPM, MOLECULAR_H2S)), + Pair("${H2S}_$MAX_SUFFIX", ppm2mgm3(H2S_MAX_PPM, MOLECULAR_H2S)), // Pair("${H2}_$MIN_SUFFIX", ppm2mgm3(lel2ppm(H2_MIN_LEL, H2_LEL2PPMFACTOR), MOLECULAR_H2)), // Pair("${H2}_$MAX_SUFFIX", ppm2mgm3(lel2ppm(H2_MAX_LEL, H2_LEL2PPMFACTOR), MOLECULAR_H2)), - Pair("${NH3}_$MIN_SUFFIX", NH3_MIN_MGM3), - Pair("${NH3}_$MAX_SUFFIX", NH3_MAX_MGM3), - Pair("${S02}_$MIN_SUFFIX", S02_MIN_MGM3), - Pair("${S02}_$MAX_SUFFIX", S02_MAX_MGM3), - Pair("${CL2}_$MIN_SUFFIX", CL2_MIN_MGM3), - Pair("${CL2}_$MAX_SUFFIX", CL2_MAX_MGM3), - Pair("${NO2}_$MIN_SUFFIX", NO2_MIN_MGM3), - Pair("${NO2}_$MAX_SUFFIX", NO2_MAX_MGM3), + Pair("${NH3}_$MIN_SUFFIX", ppm2mgm3(NH3_MIN_PPM, MOLECULAR_NH3)), + Pair("${NH3}_$MAX_SUFFIX", ppm2mgm3(NH3_MAX_PPM, MOLECULAR_NH3)), + Pair("${S02}_$MIN_SUFFIX", ppm2mgm3(S02_MIN_PPM, MOLECULAR_S02)), + Pair("${S02}_$MAX_SUFFIX", ppm2mgm3(S02_MAX_PPM, MOLECULAR_S02)), + Pair("${CL2}_$MIN_SUFFIX", ppm2mgm3(CL2_MIN_PPM, MOLECULAR_CL2)), + Pair("${CL2}_$MAX_SUFFIX", ppm2mgm3(CL2_MAX_PPM, MOLECULAR_CL2)), + Pair("${NO2}_$MIN_SUFFIX", ppm2mgm3(NO2_MIN_PPM, MOLECULAR_NO2)), + Pair("${NO2}_$MAX_SUFFIX", ppm2mgm3(NO2_MAX_PPM, MOLECULAR_NO2)), Pair("${NO}_$MIN_SUFFIX", ppm2mgm3(NO_MIN_PPM, MOLECULAR_NO)), Pair("${NO}_$MAX_SUFFIX", ppm2mgm3(NO_MAX_PPM, MOLECULAR_NO)), Pair("${HF}_$MIN_SUFFIX", ppm2mgm3(HF_MIN_PPM, MOLECULAR_HF)), diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasPortUtils.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasPortUtils.kt index 448cf77..0aec7cc 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasPortUtils.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasPortUtils.kt @@ -11,7 +11,7 @@ object GasPortUtils { private const val PORT_PATH = "/dev/ttyS6" const val FULL_MSG_SIZE = 25 const val CHECK_TIME = 10000L - private const val READ_MSG_INTERVAL = 200L + private const val READ_MSG_INTERVAL = 180L private var mInitFlag = false private var readGasMsgThread: Thread? = null; 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 44b340d..3984740 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 @@ -22,6 +22,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import org.easydarwin.TxtOverlay import kotlin.math.pow +import kotlin.random.Random object ParseHelper { @@ -114,6 +115,8 @@ object ParseHelper { value = type.rangMax.toFloat() } + value = correctValueByOtherGas(type, value) + //根据单位进行数值转换 val localGasUnit = getLocalGasUnit(type.desc) if (localGasUnit != unit) { @@ -125,23 +128,8 @@ object ParseHelper { insertGasData(type, value, localGasUnit, overRange) } - private val overlayBuilder: StringBuilder = java.lang.StringBuilder() private fun setOverlayData() { - if (gasMap.size < 4) { - return - } - val currentTimeMillis = System.currentTimeMillis() - overlayBuilder.clear() - gasMap.forEach { item -> - val gas = item.value - val time = gas.time - // 3S内的数据我们认为有效 - if (currentTimeMillis - time <= 3000) { - overlayBuilder.append("${gas.gasName}: ${gas.gasValue} ${gas.unit}").append("@") - } - } - TxtOverlay.setShowTip(overlayBuilder.toString()) - gasMap.clear() + TxtOverlay.startShow(gasMap) } /** @@ -317,4 +305,31 @@ object ParseHelper { } } } + + /** + * 根据根据其他气体修正当前气体值 + * + * @param type 类型 + * @param value 当前值 + * @return 修正后的值 + */ + private fun correctValueByOtherGas(type: GasTypeEnum, value: Float): Float { + var offset = 0f + if (gasMap.isNotEmpty()) { + gasMap.forEach { entry -> + val gas = entry.value + if (gas.gasValue > 0) { + offset += gas.gasValue * getInfluenceCoefficient(type, gas.gasName) + } + } + } + return value + offset + } + + /** + * 获取气体之间互相的影响系数 + */ + private fun getInfluenceCoefficient(type: GasTypeEnum, gasName: String): Float { + return 0f + } } \ No newline at end of file diff --git a/library-push/src/main/java/org/easydarwin/PushHelper.kt b/library-push/src/main/java/org/easydarwin/PushHelper.kt index b7cb340..77dedf2 100644 --- a/library-push/src/main/java/org/easydarwin/PushHelper.kt +++ b/library-push/src/main/java/org/easydarwin/PushHelper.kt @@ -10,9 +10,7 @@ import org.easydarwin.push.Pusher object PushHelper { - private val mPusher: EasyPusher by lazy { - EasyPusher() - } + private var mPusher: EasyPusher? = null private val mApplicationContext = CommonApplication.getContext() @@ -69,8 +67,9 @@ object PushHelper { } fun stop() { - mPusher.stop() + mPusher?.stop() mInitialized = false + mPusher = null } fun pushData(h264: ByteArray, length: Int, timeStamp: Long) { @@ -82,7 +81,7 @@ object PushHelper { LogUtils.e("PushHelper error, please init first!!") return } - mPusher.push(h264, 0, length, timeStamp, 1) + mPusher?.push(h264, 0, length, timeStamp, 1) } private fun initHelper(hevc: Boolean) { @@ -90,8 +89,11 @@ object PushHelper { LogUtils.e("PushHelper error, please setPushUrl first!!") return } - mPusher.initPush(mApplicationContext, callback) - mPusher.setMediaInfo( + if (mPusher == null){ + mPusher = EasyPusher() + } + mPusher?.initPush(mApplicationContext, callback) + mPusher?.setMediaInfo( if (hevc) Pusher.Codec.EASY_SDK_VIDEO_CODEC_H265 else Pusher.Codec.EASY_SDK_VIDEO_CODEC_H264, 24, Pusher.Codec.EASY_SDK_AUDIO_CODEC_AAC, @@ -99,7 +101,7 @@ object PushHelper { 8000, 16 ) - mPusher.start(mIp, mPort, mId, Pusher.TransType.EASY_RTP_OVER_TCP) + mPusher?.start(mIp, mPort, mId, Pusher.TransType.EASY_RTP_OVER_TCP) mInitialized = true } } \ No newline at end of file diff --git a/library-push/src/main/java/org/easydarwin/TxtOverlay.kt b/library-push/src/main/java/org/easydarwin/TxtOverlay.kt index 7487c3d..2581de9 100644 --- a/library-push/src/main/java/org/easydarwin/TxtOverlay.kt +++ b/library-push/src/main/java/org/easydarwin/TxtOverlay.kt @@ -3,6 +3,11 @@ package org.easydarwin import android.graphics.Bitmap import android.graphics.Color import android.text.TextUtils +import com.common.commonlib.db.entity.Gas +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import org.easydarwin.util.YUVUtils import java.text.SimpleDateFormat @@ -19,12 +24,6 @@ object TxtOverlay { // 待展示的提示文字 private var mToDoShowTip = "" - // 外部调用,设置待显示水印文字 - fun setShowTip(string: String) { - mToDoShowTip = string - buildOverlayBitmap() - } - // 上一次展示的时间 private var lastTipUpdateTime: Long = 0 @@ -39,20 +38,20 @@ object TxtOverlay { // 时间格式化字符串 private val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") - private fun buildOverlayBitmap() { + private fun buildOverlayBitmap(currentTimeMillis: Long) { if (TextUtils.isEmpty(mToDoShowTip)) { return } - val currentTimeMillis = System.currentTimeMillis() // 限制获取bitmap的频率,保证性能 if (TextUtils.isEmpty(mLastShowTip) || mToDoShowTip != mLastShowTip || currentTimeMillis - lastTipUpdateTime > 1000) { // 记录更新时间和上一次的文字 lastTipUpdateTime = currentTimeMillis mLastShowTip = mToDoShowTip + val timeFormat = dateFormat.format(lastTipUpdateTime) // 文字转bitmap YUVUtils.generateBitmap( bmp, - dateFormat.format(lastTipUpdateTime) + "@" + mToDoShowTip, + "$timeFormat@$mToDoShowTip", 42, Color.WHITE ) @@ -78,4 +77,32 @@ object TxtOverlay { fun setTipChangeListener(onChange: () -> Unit) { mTipChangeListener = onChange } + + private val overlayBuilder: StringBuilder = java.lang.StringBuilder() + private var looping = false + + // 外部调用,设置待显示水印文字 + fun startShow(gasMap: HashMap) { + if (!looping) { + looping = true + GlobalScope.launch(Dispatchers.IO) { + while (true) { + val currentTimeMillis = System.currentTimeMillis() + overlayBuilder.clear() + gasMap.forEach { item -> + val gas = item.value + val time = gas.time + // 3S内的数据我们认为有效 + if (currentTimeMillis - time <= 3000) { + overlayBuilder.append("${gas.gasName}: ${gas.gasValue} ${gas.unit}") + .append("@") + } + } + mToDoShowTip = overlayBuilder.toString() + buildOverlayBitmap(currentTimeMillis) + delay(1000) + } + } + } + } } \ No newline at end of file