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
|
|||
#define VERSION "2.4.2"
|
|||
#define VERSION "2.4.3"
|
|||
#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