Browse Source

recode code

master
zhaohe 1 year ago
parent
commit
aa3b5118ce
  1. 11
      api/cmds/device_state_cmd_impl.cpp
  2. 2
      api/cmds/disinfection_cmd_impl.cpp
  3. 104
      service/disinfection_ctl_service.cpp
  4. 2
      service/disinfection_printer_service.hpp
  5. 50
      service/disinfection_state.hpp

11
api/cmds/device_state_cmd_impl.cpp

@ -54,7 +54,7 @@ void DeviceStateCmdImpl::getState(json& cmd, json& receipt) {
receipt["state"]["replenishingFluidsWorkState"] = m_disinfectionCtrlService->getReplenishingFluidsWorkState();
receipt["state"]["drainingWorkState"] = m_disinfectionCtrlService->getDrainingWorkState();
receipt["state"]["disinfectionWorkState"] = m_disinfectionCtrlService->getDisinfectionWorkState();
/**
* @brief
*/
@ -64,15 +64,14 @@ void DeviceStateCmdImpl::getState(json& cmd, json& receipt) {
receipt["state"]["disinfection_id"] = m_disinfectionCtrlService->getDisinfectionID();
// 消毒状态
receipt["state"]["disinfectionWorkState"] = m_disinfectionCtrlService->getDisinfectionWorkState();
receipt["state"]["disinfectionState"]["id"] = m_disinfectionCtrlService->getDisinfectionID();
receipt["state"]["disinfectionState"]["estimatedRemainingTimeS"] = m_disinfectionCtrlService->getEstimatedRemainingTimeS();
receipt["state"]["disinfectionState"]["workState"] = m_disinfectionCtrlService->getDisinfectionWorkState();
receipt["state"]["disinfectionState"]["preHeat"] = m_disinfectionCtrlService->isPreheatState();
receipt["state"]["disinfectionState"]["preHeatRaminTimeS"] = m_disinfectionCtrlService->getPreHeatRaminTimeS(); // 预热剩余时间
receipt["state"]["disinfectionState"]["nowlog"] = m_disinfectionCtrlService->m_context.m_nowLoglevel;
receipt["state"]["disinfectionState"]["targetlog"] = m_disinfectionCtrlService->m_context.m_targetLoglevel;
receipt["state"]["disinfectionState"]["dvalue"] = m_disinfectionCtrlService->m_context.dvalue;
receipt["state"]["disinfectionState"]["nowlog"] = m_disinfectionCtrlService->m_context.state_now_loglevel;
receipt["state"]["disinfectionState"]["targetlog"] = m_disinfectionCtrlService->m_context.cfg_targetLoglevel;
receipt["state"]["disinfectionState"]["dvalue"] = m_disinfectionCtrlService->m_context.state_dvalue;
/*******************************************************************************
* sensor *
@ -81,7 +80,7 @@ void DeviceStateCmdImpl::getState(json& cmd, json& receipt) {
/*******************************************************************************
* disinfectionConfig *
*******************************************************************************/
receipt["disinfectionConfig"]["loglevel"] = m_disinfectionCtrlService->m_context.m_targetLoglevel;
receipt["disinfectionConfig"]["loglevel"] = m_disinfectionCtrlService->m_context.cfg_targetLoglevel;
receipt["disinfectionConfig"]["injection_pump_speed"] = m_disinfectionCtrlService->m_context.injection_pump_speed;
receipt["disinfectionConfig"]["stoped_gs"] = m_disinfectionCtrlService->m_context.stoped_gs;
receipt["disinfectionConfig"]["continued_gs"] = m_disinfectionCtrlService->m_context.continued_gs;

2
api/cmds/disinfection_cmd_impl.cpp

@ -110,7 +110,7 @@ void DisinfectionCmdImpl::getDisinfectionConfig(json& cmd, json& receipt) {
/*******************************************************************************
* disinfectionConfig *
*******************************************************************************/
receipt["disinfectionConfig"]["loglevel"] = m_disinfectionCtrlService->m_context.m_targetLoglevel;
receipt["disinfectionConfig"]["loglevel"] = m_disinfectionCtrlService->m_context.cfg_targetLoglevel;
receipt["disinfectionConfig"]["injection_pump_speed"] = m_disinfectionCtrlService->m_context.injection_pump_speed;
receipt["disinfectionConfig"]["stoped_gs"] = m_disinfectionCtrlService->m_context.stoped_gs;
receipt["disinfectionConfig"]["continued_gs"] = m_disinfectionCtrlService->m_context.continued_gs;

104
service/disinfection_ctl_service.cpp

@ -102,30 +102,30 @@ float DisinfectionCtrlService::getDisinfectionDValue(float ppm) { //
return m_dvalueComputer.computeDValue(ppm);
}
float DisinfectionCtrlService::computeNowLogLevel(DisinfectionContext& context) {
float dvalue = context.dvalue;
float dvalue = context.state_dvalue;
if (dvalue > 0) {
/**
* @brief m_nowLoglevel
* @brief state_now_loglevel
*/
return context.m_nowLoglevel + DVALUE_COMPUTEPERIOD_TIME_S / (dvalue * 60);
return context.state_now_loglevel + DVALUE_COMPUTEPERIOD_TIME_S / (dvalue * 60);
}
return context.m_nowLoglevel;
return context.state_now_loglevel;
}
void DisinfectionCtrlService::computeRemainTime(DisinfectionContext& context) {
/**
* @brief Dvalue
*/
float dvalue = context.dvalue;
float dvalue = context.state_dvalue;
if (dvalue > 0) {
/**
* @brief m_nowLoglevel
* @brief state_now_loglevel
*/
if (context.m_targetLoglevel >= context.m_nowLoglevel) {
context.m_remaintime = (context.m_targetLoglevel - context.m_nowLoglevel) * (dvalue * 60);
if (context.cfg_targetLoglevel >= context.state_now_loglevel) {
context.state_remaintime = (context.cfg_targetLoglevel - context.state_now_loglevel) * (dvalue * 60);
} else {
context.m_remaintime = 0;
context.state_remaintime = 0;
}
} else {
//
@ -182,10 +182,10 @@ void DisinfectionCtrlService::dumpDisinfectionLogsToCSV(DisinfectionContext& con
auto ds = m_deviceIoControlService;
float dvalue = 0;
if (m_context.dvalue <= 0) {
if (m_context.state_dvalue <= 0) {
dvalue = 0;
} else {
dvalue = m_context.dvalue;
dvalue = m_context.state_dvalue;
}
int remaintime = getEstimatedRemainingTimeS();
@ -203,7 +203,7 @@ void DisinfectionCtrlService::dumpDisinfectionLogsToCSV(DisinfectionContext& con
h2o2str[0], tempstr[0], humidstr[0], satstr[0], //
h2o2str[1], tempstr[1], humidstr[1], satstr[1], //
h2o2str[2], tempstr[2], humidstr[2], satstr[2], //
(int32_t)dvalue, (int32_t)m_context.m_nowLoglevel, (int32_t)m_context.m_targetLoglevel, //
(int32_t)dvalue, (int32_t)m_context.state_now_loglevel, (int32_t)m_context.cfg_targetLoglevel, //
ds->heatingStrip_getstate(), ds->airBlower_getstate(), ds->airCompressor_getstate(), ds->sprayLiquidPump_getGPM(), //
m_deviceIoControlService->getDisinfectantVolume_g(), formattimeS(remaintime)));
#endif
@ -215,10 +215,10 @@ void DisinfectionCtrlService::log(DisinfectionContext& context) {
auto& cx = context;
auto ds = m_deviceIoControlService;
float dvalue = 0;
if (m_context.dvalue <= 0) {
if (m_context.state_dvalue <= 0) {
dvalue = 0;
} else {
dvalue = m_context.dvalue;
dvalue = m_context.state_dvalue;
}
int remaintime = getEstimatedRemainingTimeS();
@ -238,7 +238,7 @@ void DisinfectionCtrlService::log(DisinfectionContext& context) {
cx.h2o2[1], cx.temp[1], cx.humid[1], cx.saturation[1], //
cx.h2o2[2], cx.temp[2], cx.humid[2], cx.saturation[2], //
m_context.max_h2o2, m_context.min_h2o2, m_context.max_humid, m_context.max_saturation, //
(int32_t)dvalue, (int32_t)m_context.m_nowLoglevel, (int32_t)m_context.m_targetLoglevel, //
(int32_t)dvalue, (int32_t)m_context.state_now_loglevel, (int32_t)m_context.cfg_targetLoglevel, //
ds->heatingStrip_getstate(), ds->airBlower_getstate(), ds->airCompressor_getstate(), ds->sprayLiquidPump_getGPM(), //
m_deviceIoControlService->getDisinfectantVolume_g(), formattimeS(remaintime)));
#endif
@ -274,7 +274,7 @@ void DisinfectionCtrlService::initContext(DisinfectionContext& context,
context.pre_heat_time_s = 5;
}
logger->info("startDisinfection {} {}", m_context.m_targetLoglevel, m_context.m_disinfectionID);
logger->info("startDisinfection {} {}", m_context.cfg_targetLoglevel, m_context.m_disinfectionID);
logger->info(" stoped_gs {}", context.stoped_gs);
logger->info(" continued_gs {}", context.continued_gs);
logger->info(" stoped_satur {}", context.stoped_satur);
@ -284,13 +284,13 @@ void DisinfectionCtrlService::initContext(DisinfectionContext& context,
logger->info(" pre_heat_time_s {}", context.pre_heat_time_s);
logger->info("");
// m_remaintime = loglevel * 20 * 60; // 计算总的加热时间
context.m_remaintime = context.pre_heat_time_s + loglevel * 90 * 60; // 计算总的加热时间
m_disinfectionWorkState = 1;
context.m_targetLoglevel = loglevel;
context.m_nowLoglevel = 0;
// state_remaintime = loglevel * 20 * 60; // 计算总的加热时间
context.state_remaintime = context.pre_heat_time_s + loglevel * 90 * 60; // 计算总的加热时间
m_disinfectionWorkState = 1;
context.cfg_targetLoglevel = loglevel;
context.state_now_loglevel = 0;
// m_context.m_preheatFlag = true;
m_context.dvalue = 0;
m_context.state_dvalue = 0;
// m_context.stopedflag = false;
m_context.m_state = kstate_preheat;
@ -320,7 +320,7 @@ void DisinfectionCtrlService::initContext(DisinfectionContext& context,
}
void DisinfectionCtrlService::finishDisinfection(DisinfectionContext& context) {
context.m_remaintime = 0;
context.state_remaintime = 0;
logger->info("stop disinfection {}", context.m_disinfectionID);
// sprayLiquidPump_close();
@ -369,7 +369,7 @@ void DisinfectionCtrlService::processDisinfectionState(DisinfectionContext& cont
/**
* @brief 湿
*/
if (!m_context.isDisinfectionTakeBreak) {
if (!m_context.state_is_disinfection_take_break) {
/**
* @brief
*/
@ -391,7 +391,7 @@ void DisinfectionCtrlService::processDisinfectionState(DisinfectionContext& cont
m_deviceIoControlService->airCompressor_setState(false);
// m_context.sprayLiquidFlag = false;
m_context.isDisinfectionTakeBreak = true;
m_context.state_is_disinfection_take_break = true;
}
} else {
float nowSatur = m_context.max_saturation;
@ -405,18 +405,18 @@ void DisinfectionCtrlService::processDisinfectionState(DisinfectionContext& cont
m_deviceIoControlService->sprayLiquidPump_open(context.injection_pump_speed);
usleep(1000 * 1000);
m_deviceIoControlService->airCompressor_setState(true);
m_context.isDisinfectionTakeBreak = false;
m_context.state_is_disinfection_take_break = false;
}
}
}
void DisinfectionCtrlService::disinfectionLoop(bool& breakflag) {
// logger->info("disinfection running {} {}s preheatFlag:{}", m_context.m_disinfectionID, m_context.m_remaintime, m_context.m_preheatFlag);
// logger->info("disinfection running {} {}s preheatFlag:{}", m_context.m_disinfectionID, m_context.state_remaintime, m_context.m_preheatFlag);
ThisThread thisThread;
m_context.m_remaintime--;
m_context.state_remaintime--;
bool forcelog = false;
if (m_context.m_remaintime < 0) {
m_context.m_remaintime = 0;
if (m_context.state_remaintime < 0) {
m_context.state_remaintime = 0;
}
/**
@ -426,13 +426,13 @@ void DisinfectionCtrlService::disinfectionLoop(bool& breakflag) {
/**
* @brief D值
*/
m_context.dvalue = getDisinfectionDValue(m_context.min_h2o2);
m_context.state_dvalue = getDisinfectionDValue(m_context.min_h2o2);
if (zsteady_clock().elapsedTimeS(m_context.m_lastComputeDvalueTp) > DVALUE_COMPUTEPERIOD_TIME_S) {
m_context.m_lastComputeDvalueTp = zsteady_clock().now();
if (zsteady_clock().elapsedTimeS(m_context.state_last_compute_dvalue_tp) > DVALUE_COMPUTEPERIOD_TIME_S) {
m_context.state_last_compute_dvalue_tp = zsteady_clock().now();
//
if (m_context.m_state == kstate_disinfection) {
m_context.m_nowLoglevel = computeNowLogLevel(m_context);
m_context.state_now_loglevel = computeNowLogLevel(m_context);
computeRemainTime(m_context);
}
}
@ -448,9 +448,9 @@ void DisinfectionCtrlService::disinfectionLoop(bool& breakflag) {
*/
processDisinfectionState(m_context);
//
if (m_context.m_remaintime <= 0 && m_context.m_nowLoglevel > (m_context.m_targetLoglevel + 0.01)) {
m_context.m_remaintime = 0;
m_context.m_nowLoglevel = m_context.m_targetLoglevel + 0.01;
if (m_context.state_remaintime <= 0 && m_context.state_now_loglevel > (m_context.cfg_targetLoglevel + 0.01)) {
m_context.state_remaintime = 0;
m_context.state_now_loglevel = m_context.cfg_targetLoglevel + 0.01;
logger->info("disinfection finished {},but waitting for h2o2 to safe", m_context.m_disinfectionID);
m_deviceIoControlService->sprayLiquidPump_close();
usleep(1000 * 1000);
@ -492,8 +492,8 @@ void DisinfectionCtrlService::disinfectionLoop(bool& breakflag) {
log(m_context);
printfDisinfectionContextResult();
} else {
if (forcelog || zsteady_clock().elapsedTimeS(m_context.m_lastlogTp) > DVALUE_COMPUTEPERIOD_TIME_S) {
m_context.m_lastlogTp = zsteady_clock().now();
if (forcelog || zsteady_clock().elapsedTimeS(m_context.state_lastlog_tp) > DVALUE_COMPUTEPERIOD_TIME_S) {
m_context.state_lastlog_tp = zsteady_clock().now();
takeStateSnapshot(m_context);
dumpDisinfectionLogsToCSV(m_context);
log(m_context);
@ -567,8 +567,8 @@ int32_t DisinfectionCtrlService::getEstimatedRemainingTimeS() {
if (m_context.m_state == kstate_preheat) {
return getPreHeatRaminTimeS();
} else if (m_context.m_state == kstate_disinfection) {
if (m_context.dvalue > 0) {
return m_context.m_remaintime;
if (m_context.state_dvalue > 0) {
return m_context.state_remaintime;
} else {
return -1;
}
@ -599,17 +599,10 @@ bool DisinfectionCtrlService::isPreheatState() {
return m_context.m_state == kstate_preheat;
}
int DisinfectionCtrlService::getReplenishingFluidsWorkState() { return m_replenishingFluidsWorkState; }
int DisinfectionCtrlService::getDrainingWorkState() { return m_drainingWorkState; }
/*******************************************************************************
* // 加液 *
*******************************************************************************/
/**
* @brief
*
* @param stopatg
*/
int DisinfectionCtrlService::getReplenishingFluidsWorkState() { return m_replenishingFluidsWorkState; }
void DisinfectionCtrlService::startReplenishingFluids(int stopatg) {
lock_guard<recursive_mutex> lock(lock_);
if (m_disinfectionThread) {
@ -658,10 +651,7 @@ void DisinfectionCtrlService::startReplenishingFluids(int stopatg) {
m_replenishingFluidsWorkState = 1;
logger->info("startReplenishingFluids ");
}
/**
* @brief
*
*/
void DisinfectionCtrlService::stopReplenishingFluids() {
lock_guard<recursive_mutex> lock(lock_);
if (m_disinfectionThread) {
@ -677,10 +667,6 @@ void DisinfectionCtrlService::stopReplenishingFluids() {
/*******************************************************************************
* *
*******************************************************************************/
/**
* @brief
*
*/
void DisinfectionCtrlService::startDraining() {
lock_guard<recursive_mutex> lock(lock_);
if (m_disinfectionThread) {
@ -726,9 +712,6 @@ void DisinfectionCtrlService::startDraining() {
// drainingPump_open();
m_drainingWorkState = 1;
}
/**
* @brief
*/
void DisinfectionCtrlService::stopDraining() {
lock_guard<recursive_mutex> lock(lock_);
if (m_disinfectionThread) {
@ -740,6 +723,7 @@ void DisinfectionCtrlService::stopDraining() {
// drainingPump_close();
m_deviceIoControlService->drainingPump_close();
}
int DisinfectionCtrlService::getDrainingWorkState() { return m_drainingWorkState; }
void DisinfectionCtrlService::updateH2O2SensorData(DisinfectionContext& context) {
auto& cx = context;

2
service/disinfection_printer_service.hpp

@ -24,7 +24,7 @@
/**
* @brief
*
* service:
* service:
*/
namespace iflytop {

50
service/disinfection_state.hpp

@ -38,8 +38,8 @@ typedef enum {
kstate_idle = 0, // 空闲
kstate_preheat = 1, // 预热
kstate_disinfection = 2, // 消毒中-工作
kstate_degradation = 4, // 降解中
kstate_finished = 5, // 结束
kstate_degradation = 4, // 降解中
kstate_finished = 5, // 结束
} disinfection_state_t;
class StateSnapshot {
@ -74,30 +74,33 @@ class DisinfectionContext {
public:
string m_disinfectionID;
disinfection_state_t m_state = kstate_idle;
zsteady_tp m_lastComputeDvalueTp;
zsteady_tp m_lastlogTp;
zsteady_tp disinfection_start_steady_tp;
int m_remaintime = 0;
float m_targetLoglevel = 0;
float m_nowLoglevel = 0;
float dvalue = 0;
zsteady_tp disinfection_start_steady_tp;
/**
* @brief
*/
int pre_heat_time_s = 0; // 预热时间
int stoped_gs = 0; // 停止H2O2浓度
int continued_gs = 0; // 继续H2O2浓度
int stoped_satur = 0; // 停止饱和度
int continued_satur = 0; // 继续饱和度
int stoped_humi = 0; // 停止湿度
int continued_humi = 0; // 继续湿度
int injection_pump_speed;
bool injection_pump_speed_changed = false;
int pre_heat_time_s = 0;
int stoped_gs = 0;
int continued_gs = 0;
int stoped_satur = 0;
int continued_satur = 0;
int stoped_humi = 0;
int continued_humi = 0;
shared_ptr<DisinfectionLogger> csvlogger;
bool isDisinfectionTakeBreak; // 消毒工作中是否暂停工作
float cfg_targetLoglevel = 0;
/**
* @brief
*/
zsteady_tp state_last_compute_dvalue_tp; // 上次计算dvalue时间
zsteady_tp state_lastlog_tp; // 上次日志时间
int state_remaintime = 0;
float state_now_loglevel = 0;
float state_dvalue = 0;
bool state_is_disinfection_take_break; // 消毒工作中是否暂停工作
/*******************************************************************************
* *
*******************************************************************************/
@ -113,8 +116,9 @@ class DisinfectionContext {
int max_saturation;
/*******************************************************************************
* *
* *
*******************************************************************************/
shared_ptr<DisinfectionLogger> csvlogger; // 日志记录器
list<shared_ptr<StateSnapshot>> stateSnapshotList; // 状态快照I
int beforeDisinfectantVolume_g; // 消毒前消毒剂量

Loading…
Cancel
Save