25 changed files with 418 additions and 332 deletions
-
3appsrc/appbase/appbase.hpp
-
10appsrc/appbase/appbean/h2o2_sensor_data_snapshot.hpp
-
2appsrc/appbase/appbean/h2o2_sensor_type.cpp
-
10appsrc/appbase/appbean/h2o2_sensor_type.hpp
-
2appsrc/appconfig/basic/zappversion.hpp
-
8appsrc/baseservice/db/device_ext_setting_dao.cpp
-
12appsrc/baseservice/db/device_ext_setting_dao.hpp
-
6appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.cpp
-
6appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.hpp
-
2appsrc/service/app/disinfection_ctrl_service_ext.hpp
-
3appsrc/service/app_core.cpp
-
16appsrc/service/debug_page_test_service.cpp
-
2appsrc/service/debug_page_test_service.hpp
-
66appsrc/service/front_end_realtime_display_content_mgr.cpp
-
5appsrc/service/front_end_realtime_display_content_mgr.hpp
-
2appsrc/service/hardware/base/can_packet_dumper.hpp
-
169appsrc/service/hardware/base/h2o2_sensor_data_mgr.cpp
-
12appsrc/service/hardware/device_io_ctrl_service.cpp
-
11appsrc/service/hardware/device_io_ctrl_service.hpp
-
1appsrc/service/hardware/disinfectant_weight_update_service.hpp
-
194appsrc/service/hardware/h2o2_sensor_state_sync.cpp
-
47appsrc/service/hardware/h2o2_sensor_state_sync.hpp
-
2appsrc/service/hardware/sensor_state_sync_service.hpp
-
1appsrc/service/hardware/warning_light_controler.hpp
@ -0,0 +1,2 @@ |
|||||
|
#include "h2o2_sensor_type.hpp"
|
||||
|
H2O2SensorTypeZENUM_IMPL |
@ -0,0 +1,10 @@ |
|||||
|
#pragma once
|
||||
|
#include "iflytop/core/components/zenum_template/zenum_template.hpp"
|
||||
|
|
||||
|
#define H2O2SensorTypeZENUM_IMPL ZENUM_IMPL(H2O2SensorType, H2O2SensorTypeLIST)
|
||||
|
#define H2O2SensorTypeLIST(type, marco) /**/ \
|
||||
|
marco(type, Internal) /**/ \ |
||||
|
marco(type, WiredExtSensor) /**/ \ |
||||
|
marco(type, WirelessExtSensor) /**/ |
||||
|
|
||||
|
ZENUM_DECLAR(H2O2SensorType, H2O2SensorTypeLIST); |
@ -1,3 +1,3 @@ |
|||||
#pragma once
|
#pragma once
|
||||
#define VERSION "2.4.2"
|
|
||||
|
#define VERSION "2.4.3"
|
||||
#define PROJECT_NAME "TRANSMIT_DM"
|
#define PROJECT_NAME "TRANSMIT_DM"
|
@ -1,169 +0,0 @@ |
|||||
#include "h2o2_sensor_data_mgr.hpp"
|
|
||||
|
|
||||
#include "appbase/utils/h2o2_computer/zh2o2_computer.h"
|
|
||||
using namespace iflytop; |
|
||||
|
|
||||
bool H2O2SensorDataMgr::isDataExpired(uint8_t sensorId) { return isDataExpired(getSensorDataCache(sensorId)); } |
|
||||
|
|
||||
int H2O2SensorDataMgr::getMinH2O2() { return m_minH2O2; } |
|
||||
int H2O2SensorDataMgr::getMaxH2O2() { return m_maxH2O2; } |
|
||||
int H2O2SensorDataMgr::getMaxHumid() { return m_maxHumid; } |
|
||||
int H2O2SensorDataMgr::getMaxSaturation() { return m_maxSaturation; } |
|
||||
|
|
||||
shared_ptr<H2O2SensorDataCache> H2O2SensorDataMgr::getCacheData(uint8_t sensorId) { return getSensorDataCache(sensorId); } |
|
||||
|
|
||||
shared_ptr<H2O2SensorDataSnapshot> H2O2SensorDataMgr::takeSnapshot() { |
|
||||
lock_guard<recursive_mutex> lock(m_lock); |
|
||||
shared_ptr<H2O2SensorDataSnapshot> snapshot = make_shared<H2O2SensorDataSnapshot>(); |
|
||||
ZASSERT(PORT.getExtH2O2SensorNum() <= 2); |
|
||||
|
|
||||
vector<shared_ptr<H2O2SensorDataCache>> sensorDataList; |
|
||||
|
|
||||
if (PORT.getExtH2O2SensorNum() == 0) { |
|
||||
sensorDataList.push_back(getSensorDataCache(0)); |
|
||||
} else if (PORT.getExtH2O2SensorNum() == 1) { |
|
||||
sensorDataList.push_back(getSensorDataCache(0)); |
|
||||
sensorDataList.push_back(getSensorDataCache(1)); |
|
||||
} else if (PORT.getExtH2O2SensorNum() == 2) { |
|
||||
sensorDataList.push_back(getSensorDataCache(0)); |
|
||||
sensorDataList.push_back(getSensorDataCache(1)); |
|
||||
sensorDataList.push_back(getSensorDataCache(2)); |
|
||||
} |
|
||||
|
|
||||
for (auto& sensorData : sensorDataList) { |
|
||||
auto sdata = sensorData; |
|
||||
snapshot->isExpired.push_back(isDataExpired(sdata)); |
|
||||
if (isDataExpired(sdata)) { |
|
||||
snapshot->h2o2.push_back(0); |
|
||||
snapshot->rh.push_back(0); |
|
||||
snapshot->temp.push_back(0); |
|
||||
snapshot->rs.push_back(0); |
|
||||
} else { |
|
||||
snapshot->h2o2.push_back(sdata->h2o2); |
|
||||
snapshot->rh.push_back(sdata->rh); |
|
||||
snapshot->temp.push_back(sdata->temp); |
|
||||
snapshot->rs.push_back(sdata->rs); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
snapshot->maxH2O2 = m_maxH2O2; |
|
||||
snapshot->minH2O2 = m_minH2O2; |
|
||||
snapshot->maxHumid = m_maxHumid; |
|
||||
snapshot->maxSaturation = m_maxSaturation; |
|
||||
return snapshot; |
|
||||
} |
|
||||
|
|
||||
bool H2O2SensorDataMgr::isDataExpired(shared_ptr<H2O2SensorDataCache> data) { |
|
||||
if (zsys_haspassedms(data->updatetime) > 10 * 1000) return true; |
|
||||
if (data->updatetime == 0) return true; |
|
||||
|
|
||||
return false; |
|
||||
} |
|
||||
shared_ptr<H2O2SensorDataCache> H2O2SensorDataMgr::getSensorDataCache(uint8_t sensorId) { |
|
||||
lock_guard<recursive_mutex> lock(m_lock); |
|
||||
|
|
||||
for (auto& sensor_data : m_h2o2SensorDataList) { |
|
||||
if (sensor_data->sensorId == sensorId) { |
|
||||
return sensor_data; |
|
||||
} |
|
||||
} |
|
||||
auto sensor_data = make_shared<H2O2SensorDataCache>(); |
|
||||
sensor_data->sensorId = sensorId; |
|
||||
m_h2o2SensorDataList.push_back(sensor_data); |
|
||||
return sensor_data; |
|
||||
} |
|
||||
|
|
||||
void H2O2SensorDataMgr::convertH2o2Data(report_h2o2_data_t* from, H2O2ReportData* to) { |
|
||||
to->sensor_error = from->sensor_error; |
|
||||
to->h2o2 = from->h2o2; |
|
||||
to->rh = from->rh; |
|
||||
to->temp = from->temp; |
|
||||
to->rs = from->rs; |
|
||||
to->h2o2adc = from->h2o2adc; |
|
||||
to->df_ptemp = from->df_ptemp; |
|
||||
to->ah = from->ah; |
|
||||
to->mr = from->mr; |
|
||||
to->wet_bulb_temp = from->wet_bulb_temp; |
|
||||
to->enthalpy = from->enthalpy; |
|
||||
} |
|
||||
|
|
||||
void H2O2SensorDataMgr::updateH2o2SensorData(uint8_t sensorId, report_h2o2_data_t* _h2o2data) { |
|
||||
lock_guard<recursive_mutex> lock(m_lock); |
|
||||
H2O2ReportData h2o2data; |
|
||||
|
|
||||
convertH2o2Data(_h2o2data, &h2o2data); |
|
||||
|
|
||||
// 打印10次日志,以后的调试通过前端读取获取
|
|
||||
static int logcnt = 0; |
|
||||
logcnt++; |
|
||||
|
|
||||
if (logcnt < 10 || GET_SERVICE(DeviceStateService)->getDeviceState() == DeviceState::Disinfection) { |
|
||||
logger->info("update h2o2 : {} {}", sensorId, json(h2o2data).dump()); |
|
||||
} else { |
|
||||
logger->debug("update h2o2 : {} {}", sensorId, json(h2o2data).dump()); |
|
||||
} |
|
||||
|
|
||||
if (zsteady_clock().gets() > SENSOR_PREHEART_TIME_S) { |
|
||||
float h2o2 = h2o2data.h2o2; |
|
||||
float temp = h2o2data.temp / 10.0; |
|
||||
float rh = h2o2data.rh / 10.0; |
|
||||
float rs = 0; |
|
||||
if (h2o2data.rs == 0) { |
|
||||
rs = zh2o2_compute_rs(h2o2, zh2o2_t2k(temp), rh, AIR_PRESSURE); |
|
||||
} |
|
||||
if (h2o2 < 30) { |
|
||||
h2o2 = 0; |
|
||||
} |
|
||||
updateH2o2SensorData(sensorId, &h2o2data, h2o2, rh, temp, rs); |
|
||||
} else { |
|
||||
float h2o2 = 0; |
|
||||
float temp = h2o2data.temp / 10.0; |
|
||||
float rh = 0; |
|
||||
float rs = 0; |
|
||||
updateH2o2SensorData(sensorId, &h2o2data, h2o2, rh, temp, rs); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
void H2O2SensorDataMgr::updateH2o2SensorData(uint8_t sensorId, H2O2ReportData* reportdata, float h2o2, float rh, float temp, float rs) { |
|
||||
lock_guard<recursive_mutex> lock(m_lock); |
|
||||
|
|
||||
auto dataCache = getSensorDataCache(sensorId); |
|
||||
dataCache->h2o2 = h2o2; |
|
||||
dataCache->temp = temp; |
|
||||
dataCache->rh = rh; |
|
||||
dataCache->rs = rs; |
|
||||
dataCache->updatetime = zsys_get_ticket(); |
|
||||
dataCache->reportData = *reportdata; |
|
||||
statisticsSensorData(); |
|
||||
} |
|
||||
|
|
||||
void H2O2SensorDataMgr::statisticsSensorData() { |
|
||||
lock_guard<recursive_mutex> lock(m_lock); |
|
||||
|
|
||||
m_minH2O2 = -1; |
|
||||
m_maxH2O2 = 0; |
|
||||
m_maxHumid = 0; |
|
||||
m_maxSaturation = 0; |
|
||||
|
|
||||
for (auto& sensor_data : m_h2o2SensorDataList) { |
|
||||
if (isDataExpired(sensor_data)) { |
|
||||
continue; |
|
||||
} |
|
||||
|
|
||||
if (m_minH2O2 == -1) m_minH2O2 = sensor_data->h2o2; |
|
||||
|
|
||||
if (sensor_data->h2o2 < m_minH2O2) { |
|
||||
m_minH2O2 = sensor_data->h2o2; |
|
||||
} |
|
||||
if (sensor_data->h2o2 > m_maxH2O2) { |
|
||||
m_maxH2O2 = sensor_data->h2o2; |
|
||||
} |
|
||||
if (sensor_data->rh > m_maxHumid) { |
|
||||
m_maxHumid = sensor_data->rh; |
|
||||
} |
|
||||
if (sensor_data->rs > m_maxSaturation) { |
|
||||
m_maxSaturation = sensor_data->rs; |
|
||||
} |
|
||||
} |
|
||||
// logger->info("statisticsSensorData: minH2O2 = {}, maxH2O2 = {}, maxHumid = {}, maxSaturation = {}", m_minH2O2, m_maxH2O2, m_maxHumid, m_maxSaturation);
|
|
||||
} |
|
@ -0,0 +1,194 @@ |
|||||
|
#include "h2o2_sensor_state_sync.hpp"
|
||||
|
|
||||
|
#include "appbase/utils/h2o2_computer/zh2o2_computer.h"
|
||||
|
using namespace iflytop; |
||||
|
|
||||
|
void H2O2SensorStateSyncService::initialize() { |
||||
|
m_h2o2SensorStateUpdateThread.reset(new Thread("H2O2SensorStateUpdateThread", [this]() { |
||||
|
ThisThread thisThread; |
||||
|
while (!thisThread.getExitFlag()) { |
||||
|
thisThread.sleepForMs(10 * 1000); |
||||
|
updateH2o2SensorState(); |
||||
|
} |
||||
|
})); |
||||
|
|
||||
|
deviceIoControlService->signalOnReport.connect([this](H2O2SensorType type, int sensorid, report_h2o2_data_t* sensordata) { //
|
||||
|
updateH2o2SensorData(type, sensorid, sensordata); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
void H2O2SensorStateSyncService::updateH2o2SensorData(H2O2SensorType type, int sensorId, report_h2o2_data_t* sensordata) { |
||||
|
lock_guard<recursive_mutex> lock(m_lock); |
||||
|
|
||||
|
H2O2ReportData h2o2rRportData = toH2O2ReportData(sensordata); |
||||
|
shared_ptr<H2O2SensorDataCache> h2o2data = findDataCache(type, sensorId); |
||||
|
|
||||
|
// 打印10次日志,以后的调试通过前端读取获取
|
||||
|
static int logcnt = 0; |
||||
|
logcnt++; |
||||
|
|
||||
|
if (logcnt < 10 || GET_SERVICE(DeviceStateService)->getDeviceState() == DeviceState::Disinfection) { |
||||
|
logger->info("update h2o2 : {} {}", sensorId, json(h2o2rRportData).dump()); |
||||
|
} else { |
||||
|
logger->debug("update h2o2 : {} {}", sensorId, json(h2o2rRportData).dump()); |
||||
|
} |
||||
|
|
||||
|
float h2o2 = h2o2rRportData.h2o2; |
||||
|
float temp = h2o2rRportData.temp / 10.0; |
||||
|
float rh = h2o2rRportData.rh / 10.0; |
||||
|
float rs = 0; |
||||
|
if (h2o2rRportData.rs == 0) { |
||||
|
rs = zh2o2_compute_rs(h2o2, zh2o2_t2k(temp), rh, AIR_PRESSURE); |
||||
|
} else { |
||||
|
rs = h2o2rRportData.rs / 10.0; // rs is in %RS, convert to float
|
||||
|
} |
||||
|
if (h2o2 < DeviceExtSettingDAO::ins()->getH2O2Sensorh2o2MinVal()) { |
||||
|
h2o2 = 0; // 如果H2O2小于10ppm,则认为是无效数据
|
||||
|
} |
||||
|
|
||||
|
// 更新数据
|
||||
|
h2o2data->h2o2 = h2o2; |
||||
|
h2o2data->temp = temp; |
||||
|
h2o2data->rh = rh; |
||||
|
h2o2data->rs = rs; |
||||
|
h2o2data->reportData = h2o2rRportData; // 记录报告数据
|
||||
|
if (!h2o2data->isOnline) { |
||||
|
logger->info("H2O2 sensor {} is online, update time: {}", sensorId, zsys_get_ticket()); |
||||
|
h2o2data->isOnline = true; |
||||
|
h2o2data->onlineTime = zsys_get_ticket(); |
||||
|
} |
||||
|
h2o2data->updatetime = zsys_get_ticket(); |
||||
|
statisticsSensorData(); |
||||
|
} |
||||
|
|
||||
|
void H2O2SensorStateSyncService::updateH2o2SensorState() { //
|
||||
|
lock_guard<recursive_mutex> lock(m_lock); |
||||
|
int64_t now = zsys_get_ticket(); |
||||
|
for (auto& sensor_data : m_h2o2SensorDataList) { |
||||
|
if (sensor_data->isOnline) { |
||||
|
if (now - sensor_data->updatetime > 1000 * 60 * 1) { // 超过5分钟没有更新数据,则认为离线
|
||||
|
sensor_data->isOnline = false; |
||||
|
sensor_data->h2o2 = -1; |
||||
|
sensor_data->rh = -1; |
||||
|
sensor_data->temp = -1; |
||||
|
sensor_data->rs = -1; |
||||
|
sensor_data->preHeatWell = false; |
||||
|
sensor_data->updatetime = 0; |
||||
|
logger->warn("H2O2 sensor {} is offline, last update time: {}", sensor_data->sensorId, sensor_data->updatetime); |
||||
|
statisticsSensorData(); |
||||
|
} else { |
||||
|
if (!sensor_data->preHeatWell) { |
||||
|
// if (now - sensor_data->onlineTime >= 5 * 60 * 1000) {
|
||||
|
if (zsteady_clock().gets() > SENSOR_PREHEART_TIME_S) { |
||||
|
sensor_data->preHeatWell = true; // 如果在线时间超过5分钟,则认为预热完成
|
||||
|
logger->info("H2O2 sensor {} preheat well", sensor_data->sensorId); |
||||
|
statisticsSensorData(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
shared_ptr<H2O2SensorDataCache> H2O2SensorStateSyncService::getCacheDataCpy(H2O2SensorType type, uint8_t sensorId) { |
||||
|
lock_guard<recursive_mutex> lock(m_lock); |
||||
|
auto sensor_data = findDataCache(type, sensorId); |
||||
|
shared_ptr<H2O2SensorDataCache> sensor_data_cpy = make_shared<H2O2SensorDataCache>(); |
||||
|
*sensor_data_cpy = *sensor_data; // 深拷贝
|
||||
|
return sensor_data_cpy; |
||||
|
} |
||||
|
|
||||
|
shared_ptr<H2O2SensorDataSnapshot> H2O2SensorStateSyncService::takeSnapshot() { |
||||
|
lock_guard<recursive_mutex> lock(m_lock); |
||||
|
shared_ptr<H2O2SensorDataSnapshot> snapshot = make_shared<H2O2SensorDataSnapshot>(); |
||||
|
ZASSERT(PORT.getExtH2O2SensorNum() <= 2); |
||||
|
|
||||
|
vector<shared_ptr<H2O2SensorDataCache>> sensorDataList; |
||||
|
|
||||
|
if (PORT.getExtH2O2SensorNum() == 0) { |
||||
|
sensorDataList.push_back(findDataCache(H2O2SensorType::Internal, 1)); |
||||
|
} else if (PORT.getExtH2O2SensorNum() == 1) { |
||||
|
sensorDataList.push_back(findDataCache(H2O2SensorType::Internal, 1)); |
||||
|
sensorDataList.push_back(findDataCache(H2O2SensorType::WiredExtSensor, 1)); |
||||
|
} else if (PORT.getExtH2O2SensorNum() == 2) { |
||||
|
sensorDataList.push_back(findDataCache(H2O2SensorType::Internal, 1)); |
||||
|
sensorDataList.push_back(findDataCache(H2O2SensorType::WiredExtSensor, 2)); |
||||
|
sensorDataList.push_back(findDataCache(H2O2SensorType::WiredExtSensor, 3)); |
||||
|
} |
||||
|
|
||||
|
for (auto& sensorData : sensorDataList) { |
||||
|
auto sdata = sensorData; |
||||
|
snapshot->isExpired.push_back(!sdata->isOnline); |
||||
|
snapshot->h2o2.push_back(sdata->h2o2); |
||||
|
snapshot->rh.push_back(sdata->rh); |
||||
|
snapshot->temp.push_back(sdata->temp); |
||||
|
snapshot->rs.push_back(sdata->rs); |
||||
|
} |
||||
|
|
||||
|
snapshot->maxH2O2 = m_maxH2O2; |
||||
|
snapshot->minH2O2 = m_minH2O2; |
||||
|
snapshot->maxHumid = m_maxHumid; |
||||
|
snapshot->maxSaturation = m_maxSaturation; |
||||
|
return snapshot; |
||||
|
} |
||||
|
|
||||
|
void H2O2SensorStateSyncService::statisticsSensorData() { |
||||
|
lock_guard<recursive_mutex> lock(m_lock); |
||||
|
|
||||
|
m_minH2O2 = -1; |
||||
|
m_maxH2O2 = 0; |
||||
|
m_maxHumid = 0; |
||||
|
m_maxSaturation = 0; |
||||
|
|
||||
|
for (auto& sensor_data : m_h2o2SensorDataList) { |
||||
|
if (!sensor_data->isOnline) { |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
if (m_minH2O2 == -1) m_minH2O2 = sensor_data->h2o2; |
||||
|
|
||||
|
if (sensor_data->h2o2 < m_minH2O2) { |
||||
|
m_minH2O2 = sensor_data->h2o2; |
||||
|
} |
||||
|
if (sensor_data->h2o2 > m_maxH2O2) { |
||||
|
m_maxH2O2 = sensor_data->h2o2; |
||||
|
} |
||||
|
if (sensor_data->rh > m_maxHumid) { |
||||
|
m_maxHumid = sensor_data->rh; |
||||
|
} |
||||
|
if (sensor_data->rs > m_maxSaturation) { |
||||
|
m_maxSaturation = sensor_data->rs; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
H2O2ReportData H2O2SensorStateSyncService::toH2O2ReportData(report_h2o2_data_t* from) { |
||||
|
H2O2ReportData to; |
||||
|
to.sensor_error = from->sensor_error; |
||||
|
to.h2o2 = from->h2o2; |
||||
|
to.rh = from->rh; |
||||
|
to.temp = from->temp; |
||||
|
to.rs = from->rs; |
||||
|
to.h2o2adc = from->h2o2adc; |
||||
|
to.df_ptemp = from->df_ptemp; |
||||
|
to.ah = from->ah; |
||||
|
to.mr = from->mr; |
||||
|
to.wet_bulb_temp = from->wet_bulb_temp; |
||||
|
to.enthalpy = from->enthalpy; |
||||
|
return to; |
||||
|
} |
||||
|
|
||||
|
shared_ptr<H2O2SensorDataCache> H2O2SensorStateSyncService::findDataCache(H2O2SensorType type, uint8_t sensorId) { |
||||
|
lock_guard<recursive_mutex> lock(m_lock); |
||||
|
|
||||
|
for (auto& sensor_data : m_h2o2SensorDataList) { |
||||
|
if (sensor_data->sensorId == sensorId && sensor_data->type.eq(type.getId())) { |
||||
|
return sensor_data; |
||||
|
} |
||||
|
} |
||||
|
auto sensor_data = make_shared<H2O2SensorDataCache>(); |
||||
|
sensor_data->sensorId = sensorId; |
||||
|
sensor_data->type = type; |
||||
|
sensor_data->preHeatWell = false; |
||||
|
m_h2o2SensorDataList.push_back(sensor_data); |
||||
|
return sensor_data; |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue