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 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<String, Float>(
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<String, Float>(
// 气体默认阈值表
val default_threshold_map_mgm3 = hashMapOf<String, Float>(
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)),

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

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

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

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