desc:报警值,气体水印

main
xiaowusky 1 year ago
parent aa1e65d5fb
commit 2b5df75eb5

@ -33,34 +33,34 @@ const val MIN_SUFFIX = "min"
const val MAX_SUFFIX = "max" const val MAX_SUFFIX = "max"
// 各个气体报警高低默认值,默认单位 // 各个气体报警高低默认值,默认单位
const val CO_MIN_MGM3 = 20f const val CO_MIN_PPM = 35f
const val CO_MAX_MGM3 = 40f const val CO_MAX_PPM = 200f
const val O2_MIN = 19.5f const val O2_MIN = 19.5f
const val O2_MAX = 23.5f const val O2_MAX = 23.5f
const val CH4_MIN_LEL = 25f const val CH4_MIN_LEL = 25f
const val CH4_MAX_LEL = 50f const val CH4_MAX_LEL = 50f
const val H2S_MIN_MGM3 = 10f const val H2S_MIN_PPM = 10f
const val H2S_MAX_MGM3 = 20f const val H2S_MAX_PPM = 15f
const val H2_MIN_LEL = 25f const val H2_MIN_LEL = 25f
const val H2_MAX_LEL = 50f const val H2_MAX_LEL = 50f
const val NH3_MIN_MGM3 = 20f const val NH3_MIN_PPM = 25f
const val NH3_MAX_MGM3 = 40f const val NH3_MAX_PPM = 50f
const val S02_MIN_MGM3 = 5f const val S02_MIN_PPM = 2f
const val S02_MAX_MGM3 = 10f const val S02_MAX_PPM = 5f
const val CL2_MIN_MGM3 = 1f const val CL2_MIN_PPM = 0.5f
const val CL2_MAX_MGM3 = 2f const val CL2_MAX_PPM = 1f
const val NO2_MIN_MGM3 = 5f const val NO2_MIN_PPM = 2f
const val NO2_MAX_MGM3 = 10f const val NO2_MAX_PPM = 5f
const val NO_MIN_PPM = 10f const val NO_MIN_PPM = 13f
const val NO_MAX_PPM = 20f const val NO_MAX_PPM = 25f
const val HF_MIN_PPM = 2.2f const val HF_MIN_PPM = 2f
const val HF_MAX_PPM = 4.4f const val HF_MAX_PPM = 6f
const val C02_MIN_PPM = 1000f const val C02_MIN_PPM = 5000f
const val C02_MAX_PPM = 2000f const val C02_MAX_PPM = 30000f
//?? TODO VOCS 这个值现在不对 //?? TODO VOCS 这个值现在不对
const val VOCS_MIN_PPM = 0.6f const val VOCS_MIN_PPM = 2f
const val VOCS_MAX_PPM = 1.2f const val VOCS_MAX_PPM = 6f
// 单位 // 单位
const val UNIT_VOL = "%VOL" const val UNIT_VOL = "%VOL"
@ -70,23 +70,23 @@ const val UNIT_LEL = "%LEL"
// 气体默认阈值表 // 气体默认阈值表
val default_threshold_map_ppm = hashMapOf<String, Float>( val default_threshold_map_ppm = hashMapOf<String, Float>(
Pair("${CO}_$MIN_SUFFIX", mgm3ToPpm(CO_MIN_MGM3, MOLECULAR_CO)), Pair("${CO}_$MIN_SUFFIX", CO_MIN_PPM),
Pair("${CO}_$MAX_SUFFIX", mgm3ToPpm(CO_MAX_MGM3, MOLECULAR_CO)), Pair("${CO}_$MAX_SUFFIX", CO_MAX_PPM),
// Pair("${CH4}_$MIN_SUFFIX", lel2ppm(CH4_MIN_LEL, CH4_LEL2PPMFACTOR)), // Pair("${CH4}_$MIN_SUFFIX", lel2ppm(CH4_MIN_LEL, CH4_LEL2PPMFACTOR)),
// Pair("${CH4}_$MAX_SUFFIX", lel2ppm(CH4_MAX_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}_$MIN_SUFFIX", H2S_MIN_PPM),
Pair("${H2S}_$MAX_SUFFIX", mgm3ToPpm(H2S_MAX_MGM3, MOLECULAR_H2S)), Pair("${H2S}_$MAX_SUFFIX", H2S_MAX_PPM),
// Pair("${H2}_$MIN_SUFFIX", lel2ppm(H2_MIN_LEL, H2_LEL2PPMFACTOR)), // Pair("${H2}_$MIN_SUFFIX", lel2ppm(H2_MIN_LEL, H2_LEL2PPMFACTOR)),
// Pair("${H2}_$MAX_SUFFIX", lel2ppm(H2_MAX_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}_$MIN_SUFFIX", NH3_MIN_PPM),
Pair("${NH3}_$MAX_SUFFIX", mgm3ToPpm(NH3_MAX_MGM3, MOLECULAR_NH3)), Pair("${NH3}_$MAX_SUFFIX", NH3_MAX_PPM),
Pair("${S02}_$MIN_SUFFIX", mgm3ToPpm(S02_MIN_MGM3, MOLECULAR_S02)), Pair("${S02}_$MIN_SUFFIX", S02_MIN_PPM),
Pair("${S02}_$MAX_SUFFIX", mgm3ToPpm(S02_MAX_MGM3, MOLECULAR_S02)), Pair("${S02}_$MAX_SUFFIX", S02_MAX_PPM),
Pair("${CL2}_$MIN_SUFFIX", mgm3ToPpm(CL2_MIN_MGM3, MOLECULAR_CL2)), Pair("${CL2}_$MIN_SUFFIX", CL2_MIN_PPM),
Pair("${CL2}_$MAX_SUFFIX", mgm3ToPpm(CL2_MAX_MGM3, MOLECULAR_CL2)), Pair("${CL2}_$MAX_SUFFIX", CL2_MAX_PPM),
Pair("${NO2}_$MIN_SUFFIX", mgm3ToPpm(NO2_MIN_MGM3, MOLECULAR_NO2)), Pair("${NO2}_$MIN_SUFFIX", NO2_MIN_PPM),
Pair("${NO2}_$MAX_SUFFIX", mgm3ToPpm(NO2_MAX_MGM3, MOLECULAR_NO2)), Pair("${NO2}_$MAX_SUFFIX", NO2_MAX_PPM),
Pair("${NO}_$MIN_SUFFIX", NO_MIN_PPM), Pair("${NO}_$MIN_SUFFIX", NO_MIN_PPM),
Pair("${NO}_$MAX_SUFFIX", NO_MAX_PPM), Pair("${NO}_$MAX_SUFFIX", NO_MAX_PPM),
Pair("${HF}_$MIN_SUFFIX", HF_MIN_PPM), Pair("${HF}_$MIN_SUFFIX", HF_MIN_PPM),
@ -97,22 +97,22 @@ val default_threshold_map_ppm = hashMapOf<String, Float>(
// 气体默认阈值表 // 气体默认阈值表
val default_threshold_map_mgm3 = hashMapOf<String, Float>( val default_threshold_map_mgm3 = hashMapOf<String, Float>(
Pair("${CO}_$MIN_SUFFIX", CO_MIN_MGM3), Pair("${CO}_$MIN_SUFFIX", ppm2mgm3(CO_MIN_PPM, MOLECULAR_CO)),
Pair("${CO}_$MAX_SUFFIX", CO_MAX_MGM3), 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}_$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("${CH4}_$MAX_SUFFIX", ppm2mgm3(lel2ppm(CH4_MAX_LEL, CH4_LEL2PPMFACTOR), MOLECULAR_CH4)),
Pair("${H2S}_$MIN_SUFFIX", H2S_MIN_MGM3), Pair("${H2S}_$MIN_SUFFIX", ppm2mgm3(H2S_MIN_PPM, MOLECULAR_H2S)),
Pair("${H2S}_$MAX_SUFFIX", H2S_MAX_MGM3), 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}_$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("${H2}_$MAX_SUFFIX", ppm2mgm3(lel2ppm(H2_MAX_LEL, H2_LEL2PPMFACTOR), MOLECULAR_H2)),
Pair("${NH3}_$MIN_SUFFIX", NH3_MIN_MGM3), Pair("${NH3}_$MIN_SUFFIX", ppm2mgm3(NH3_MIN_PPM, MOLECULAR_NH3)),
Pair("${NH3}_$MAX_SUFFIX", NH3_MAX_MGM3), Pair("${NH3}_$MAX_SUFFIX", ppm2mgm3(NH3_MAX_PPM, MOLECULAR_NH3)),
Pair("${S02}_$MIN_SUFFIX", S02_MIN_MGM3), Pair("${S02}_$MIN_SUFFIX", ppm2mgm3(S02_MIN_PPM, MOLECULAR_S02)),
Pair("${S02}_$MAX_SUFFIX", S02_MAX_MGM3), Pair("${S02}_$MAX_SUFFIX", ppm2mgm3(S02_MAX_PPM, MOLECULAR_S02)),
Pair("${CL2}_$MIN_SUFFIX", CL2_MIN_MGM3), Pair("${CL2}_$MIN_SUFFIX", ppm2mgm3(CL2_MIN_PPM, MOLECULAR_CL2)),
Pair("${CL2}_$MAX_SUFFIX", CL2_MAX_MGM3), Pair("${CL2}_$MAX_SUFFIX", ppm2mgm3(CL2_MAX_PPM, MOLECULAR_CL2)),
Pair("${NO2}_$MIN_SUFFIX", NO2_MIN_MGM3), Pair("${NO2}_$MIN_SUFFIX", ppm2mgm3(NO2_MIN_PPM, MOLECULAR_NO2)),
Pair("${NO2}_$MAX_SUFFIX", NO2_MAX_MGM3), Pair("${NO2}_$MAX_SUFFIX", ppm2mgm3(NO2_MAX_PPM, MOLECULAR_NO2)),
Pair("${NO}_$MIN_SUFFIX", ppm2mgm3(NO_MIN_PPM, MOLECULAR_NO)), Pair("${NO}_$MIN_SUFFIX", ppm2mgm3(NO_MIN_PPM, MOLECULAR_NO)),
Pair("${NO}_$MAX_SUFFIX", ppm2mgm3(NO_MAX_PPM, MOLECULAR_NO)), Pair("${NO}_$MAX_SUFFIX", ppm2mgm3(NO_MAX_PPM, MOLECULAR_NO)),
Pair("${HF}_$MIN_SUFFIX", ppm2mgm3(HF_MIN_PPM, MOLECULAR_HF)), Pair("${HF}_$MIN_SUFFIX", ppm2mgm3(HF_MIN_PPM, MOLECULAR_HF)),

@ -11,7 +11,7 @@ object GasPortUtils {
private const val PORT_PATH = "/dev/ttyS6" private const val PORT_PATH = "/dev/ttyS6"
const val FULL_MSG_SIZE = 25 const val FULL_MSG_SIZE = 25
const val CHECK_TIME = 10000L 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 mInitFlag = false
private var readGasMsgThread: Thread? = null; private var readGasMsgThread: Thread? = null;

@ -22,6 +22,7 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.easydarwin.TxtOverlay import org.easydarwin.TxtOverlay
import kotlin.math.pow import kotlin.math.pow
import kotlin.random.Random
object ParseHelper { object ParseHelper {
@ -114,6 +115,8 @@ object ParseHelper {
value = type.rangMax.toFloat() value = type.rangMax.toFloat()
} }
value = correctValueByOtherGas(type, value)
//根据单位进行数值转换 //根据单位进行数值转换
val localGasUnit = getLocalGasUnit(type.desc) val localGasUnit = getLocalGasUnit(type.desc)
if (localGasUnit != unit) { if (localGasUnit != unit) {
@ -125,23 +128,8 @@ object ParseHelper {
insertGasData(type, value, localGasUnit, overRange) insertGasData(type, value, localGasUnit, overRange)
} }
private val overlayBuilder: StringBuilder = java.lang.StringBuilder()
private fun setOverlayData() { private fun setOverlayData() {
if (gasMap.size < 4) { TxtOverlay.startShow(gasMap)
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()
} }
/** /**
@ -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
}
} }

@ -10,9 +10,7 @@ import org.easydarwin.push.Pusher
object PushHelper { object PushHelper {
private val mPusher: EasyPusher by lazy { private var mPusher: EasyPusher? = null
EasyPusher()
}
private val mApplicationContext = CommonApplication.getContext() private val mApplicationContext = CommonApplication.getContext()
@ -69,8 +67,9 @@ object PushHelper {
} }
fun stop() { fun stop() {
mPusher.stop() mPusher?.stop()
mInitialized = false mInitialized = false
mPusher = null
} }
fun pushData(h264: ByteArray, length: Int, timeStamp: Long) { fun pushData(h264: ByteArray, length: Int, timeStamp: Long) {
@ -82,7 +81,7 @@ object PushHelper {
LogUtils.e("PushHelper error, please init first!!") LogUtils.e("PushHelper error, please init first!!")
return return
} }
mPusher.push(h264, 0, length, timeStamp, 1) mPusher?.push(h264, 0, length, timeStamp, 1)
} }
private fun initHelper(hevc: Boolean) { private fun initHelper(hevc: Boolean) {
@ -90,8 +89,11 @@ object PushHelper {
LogUtils.e("PushHelper error, please setPushUrl first!!") LogUtils.e("PushHelper error, please setPushUrl first!!")
return return
} }
mPusher.initPush(mApplicationContext, callback) if (mPusher == null){
mPusher.setMediaInfo( 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, if (hevc) Pusher.Codec.EASY_SDK_VIDEO_CODEC_H265 else Pusher.Codec.EASY_SDK_VIDEO_CODEC_H264,
24, 24,
Pusher.Codec.EASY_SDK_AUDIO_CODEC_AAC, Pusher.Codec.EASY_SDK_AUDIO_CODEC_AAC,
@ -99,7 +101,7 @@ object PushHelper {
8000, 8000,
16 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 mInitialized = true
} }
} }

@ -3,6 +3,11 @@ package org.easydarwin
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Color import android.graphics.Color
import android.text.TextUtils 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 org.easydarwin.util.YUVUtils
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -19,12 +24,6 @@ object TxtOverlay {
// 待展示的提示文字 // 待展示的提示文字
private var mToDoShowTip = "" private var mToDoShowTip = ""
// 外部调用,设置待显示水印文字
fun setShowTip(string: String) {
mToDoShowTip = string
buildOverlayBitmap()
}
// 上一次展示的时间 // 上一次展示的时间
private var lastTipUpdateTime: Long = 0 private var lastTipUpdateTime: Long = 0
@ -39,20 +38,20 @@ object TxtOverlay {
// 时间格式化字符串 // 时间格式化字符串
private val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") private val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
private fun buildOverlayBitmap() { private fun buildOverlayBitmap(currentTimeMillis: Long) {
if (TextUtils.isEmpty(mToDoShowTip)) { if (TextUtils.isEmpty(mToDoShowTip)) {
return return
} }
val currentTimeMillis = System.currentTimeMillis()
// 限制获取bitmap的频率保证性能 // 限制获取bitmap的频率保证性能
if (TextUtils.isEmpty(mLastShowTip) || mToDoShowTip != mLastShowTip || currentTimeMillis - lastTipUpdateTime > 1000) { if (TextUtils.isEmpty(mLastShowTip) || mToDoShowTip != mLastShowTip || currentTimeMillis - lastTipUpdateTime > 1000) {
// 记录更新时间和上一次的文字 // 记录更新时间和上一次的文字
lastTipUpdateTime = currentTimeMillis lastTipUpdateTime = currentTimeMillis
mLastShowTip = mToDoShowTip mLastShowTip = mToDoShowTip
val timeFormat = dateFormat.format(lastTipUpdateTime)
// 文字转bitmap // 文字转bitmap
YUVUtils.generateBitmap( YUVUtils.generateBitmap(
bmp, bmp,
dateFormat.format(lastTipUpdateTime) + "@" + mToDoShowTip, "$timeFormat@$mToDoShowTip",
42, 42,
Color.WHITE Color.WHITE
) )
@ -78,4 +77,32 @@ object TxtOverlay {
fun setTipChangeListener(onChange: () -> Unit) { fun setTipChangeListener(onChange: () -> Unit) {
mTipChangeListener = onChange mTipChangeListener = onChange
} }
private val overlayBuilder: StringBuilder = java.lang.StringBuilder()
private var looping = false
// 外部调用,设置待显示水印文字
fun startShow(gasMap: HashMap<String, Gas>) {
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)
}
}
}
}
} }
Loading…
Cancel
Save