From 7b53e16843615cb2a219cd1bfb52848e8395b182 Mon Sep 17 00:00:00 2001 From: xiaowusky Date: Fri, 15 Sep 2023 14:52:29 +0800 Subject: [PATCH] =?UTF-8?q?desc:=E6=B0=94=E4=BD=93=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=E9=9C=80=E8=A6=81=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=8D=95=E4=BD=8D=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../safetywatcher/watcher/port/GasUtilss.kt | 71 +++++++++++++++++++ .../safetywatcher/watcher/port/ParseHelper.kt | 29 -------- .../watcher/ui/QueryDataActivity.kt | 28 ++++++-- .../watcher/ui/adapter/HistoryDataAdapter.kt | 4 +- 4 files changed, 97 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasUtilss.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasUtilss.kt index ba45b23..cef8b25 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasUtilss.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/port/GasUtilss.kt @@ -85,6 +85,7 @@ fun getGasHighThreshold(gasType: String): Float { const val UNIT_VOL = "%VOL" const val UNIT_PPM = "ppm" const val UNIT_MGM3 = "mg/m3" +const val UNIT_LEL = "%LEL" /** * 获取本地气体单位 @@ -168,6 +169,76 @@ fun ppm2mgm3(ppmValue: Double, molecular: Int): Double { return ppmValue * molecular / 22.4 } +fun mgm3ToPpm(mValue: Double, molecular: Int): Double { + return mValue * 22.4 / molecular +} + fun ch4Lel2ppm(lelValue: Double): Double { return lelValue * 10000 / 20.0 +} + +/** + * 传感器返回数据气体浓度 单位转换 + * 氧气O2单位固定不用转换 + * 其他三种气体可能需要转换 + */ +fun convertData( + gasType: String, + value: Double, + unit: String, + localGasUnit: String +): Double { + var retValue = value + if (CH4 == gasType) { + retValue = convertCH4(unit, value, localGasUnit) + } + // h2s 和 co均只有两种可能场景:ppm->mgm3 mgm3->ppm + else if (H2S == gasType) { + if (UNIT_MGM3 == localGasUnit) { + retValue = ppm2mgm3(retValue, MOLECULAR_H2S) + } else if (UNIT_PPM == localGasUnit) { + retValue = mgm3ToPpm(retValue, MOLECULAR_H2S) + } + } else if (CO == gasType) { + if (UNIT_MGM3 == localGasUnit) { + retValue = ppm2mgm3(retValue, MOLECULAR_CO) + } else if (UNIT_PPM == localGasUnit) { + retValue = mgm3ToPpm(retValue, MOLECULAR_CO) + } + } + return retValue +} + +/** + * ch4 有三种可能单位 lel ppm mg/m3, 其中lel不会作为localGasUnit + * 三种情况: + * 1.lel转ppm或者mgm3 + * 2.ppm转mgm3 + * 3.mgm3转ppm + */ +private fun convertCH4( + unit: String, + value: Double, + localGasUnit: String +): Double { + var ret = value + if (UNIT_LEL == unit) { + // to ppm + ret = ch4Lel2ppm(value) + // 目标是mg/mg3 + if (UNIT_MGM3 == localGasUnit) { + ret = ppm2mgm3(ret, MOLECULAR_CH4) + } + } else if (UNIT_PPM == unit) { + // 目标是mg/mg3 + if (UNIT_MGM3 == localGasUnit) { + ret = ppm2mgm3(ret, MOLECULAR_CH4) + } + } else if (UNIT_MGM3 == unit) { + // 目标是mg/mg3 + if (UNIT_PPM == localGasUnit) { + ret = mgm3ToPpm(ret, MOLECULAR_CH4) + } + } + return ret } \ 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 ed0dab0..e34918f 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 @@ -243,33 +243,4 @@ object ParseHelper { updateGasTypeDb(gasName, GasPortStatus.OUTLINE) } } - - /** - * 气体浓度 单位转换 - * 氧气O2单位固定不用转换 - * 其他三种气体可能需要转换 - */ - private fun convertData( - gasType: String, - value: Double, - unit: String, - localGasUnit: String - ): Double { - var retValue = value - if (CH4 == gasType) { - retValue = ch4Lel2ppm(value) - if (UNIT_MGM3 == localGasUnit) { - retValue = ppm2mgm3(retValue, MOLECULAR_CH4) - } - } else if (H2S == gasType) { - if (UNIT_MGM3 == localGasUnit) { - retValue = ppm2mgm3(retValue, MOLECULAR_H2S) - } - } else if (CO == gasType) { - if (UNIT_MGM3 == localGasUnit) { - retValue = ppm2mgm3(retValue, MOLECULAR_CO) - } - } - return retValue - } } \ No newline at end of file diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/QueryDataActivity.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/QueryDataActivity.kt index 8427e91..34caf37 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/QueryDataActivity.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/QueryDataActivity.kt @@ -14,6 +14,8 @@ import com.yinuo.safetywatcher.databinding.ActivityQueryDataBinding import com.yinuo.safetywatcher.watcher.base.BaseActivity import com.yinuo.safetywatcher.watcher.constant.DEFAULT_QUERY_TIME_INTERVAL import com.yinuo.safetywatcher.watcher.constant.TimeStep +import com.yinuo.safetywatcher.watcher.port.convertData +import com.yinuo.safetywatcher.watcher.port.getLocalGasUnit import com.yinuo.safetywatcher.watcher.ui.adapter.HistoryDataAdapter import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar import com.yinuo.safetywatcher.watcher.utils.ChartBridge @@ -136,7 +138,10 @@ class QueryDataActivity : BaseActivity() { } // 全量数据 val gasDao = DBUtils.gasDao() - val gasList = gasDao.getAllByTime(startTime, endTime) + var gasList = gasDao.getAllByTime(startTime, endTime) + gasList = gasList.map { + tryConvertData(it) + } // 多气体,分开创建list,存储之后。 再分步 val gasMap = gasList.groupBy { it.gasName @@ -151,7 +156,7 @@ class QueryDataActivity : BaseActivity() { var count = 0 list.forEachIndexed { index, gas -> if (startGas == null) { - startGas = gas + startGas = gas.copy() tempTime = gas.time - ((gas.time - startTime) % intervalMs) gasValue = 0.0 count = 0 @@ -163,7 +168,7 @@ class QueryDataActivity : BaseActivity() { newMapList.add(startGas!!) tempTime += intervalMs - startGas = gas + startGas = gas.copy() gasValue = gas.gasValue count = 1 } @@ -206,6 +211,16 @@ class QueryDataActivity : BaseActivity() { } } + private fun tryConvertData(it: Gas): Gas { + val localGasUnit = getLocalGasUnit(it.gasName) + val unit = it.unit + if (unit != localGasUnit) { + it.gasValue = convertData(it.gasName, it.gasValue, unit, localGasUnit) + it.unit = localGasUnit + } + return it + } + private fun doExportData() { val usbPath = StorageUtils.getStoragePath(this@QueryDataActivity) if (usbPath.isNullOrEmpty()) { @@ -214,7 +229,12 @@ class QueryDataActivity : BaseActivity() { } showLoadingDialog(R.string.export_data_tip, false) lifecycleScope.launch { - TestUtils.testExportExcel(this@QueryDataActivity, usbPath, mAdapter._data, loadingDialog) + TestUtils.testExportExcel( + this@QueryDataActivity, + usbPath, + mAdapter._data, + loadingDialog + ) launch(Dispatchers.Main) { showToast(getString(R.string.export_success)) } diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/adapter/HistoryDataAdapter.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/adapter/HistoryDataAdapter.kt index fb592b4..593412f 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/adapter/HistoryDataAdapter.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/adapter/HistoryDataAdapter.kt @@ -2,9 +2,9 @@ package com.yinuo.safetywatcher.watcher.ui.adapter import android.view.LayoutInflater import android.view.ViewGroup +import com.common.commonlib.db.entity.Gas import com.yinuo.safetywatcher.databinding.LayoutItemHistoryBinding import com.yinuo.safetywatcher.watcher.base.BaseRvAdapter -import com.common.commonlib.db.entity.Gas import com.yinuo.safetywatcher.watcher.utils.DateUtils class HistoryDataAdapter : @@ -14,7 +14,7 @@ class HistoryDataAdapter : BaseRvAdapter.BaseViewHolder(binding) { override fun bindView(data: Gas) { binding.tvTime.text = formatTime(data.time) - binding.tvSensor.text = data.gasName + binding.tvSensor.text = "${data.gasName} : ${data.gasValue} ${data.unit}" } private fun formatTime(time: Long): CharSequence? {