Browse Source

update

master
zhaohe 1 year ago
parent
commit
8ab0f22bc5
  1. 43
      service/bak
  2. 339
      service/disinfection_ctl_service.cpp
  3. 99
      service/disinfection_ctl_service.hpp
  4. 5
      service/disinfection_printer_service.cpp
  5. 51
      service/disinfection_printer_service.hpp
  6. 129
      service/disinfection_state.hpp

43
service/bak

@ -0,0 +1,43 @@
/**
* @brief
* = = = = = = = = = = = = = = =
* 全思美特
* 操作人 XXXXX
* 开始时间 2021-03-10 10:00:00
* 结束时间 2021-03-10 10:00:00
* 总耗时 01:59
* 目标LOG 6
* 实际LOG 6
* = = = = = = = = = = = = = = =
*
*/
auto dio = m_deviceIoControlService;
auto ds = GET_SERVICE(DeviceStateService);
auto& cx = m_context;
int32_t disinfectant_usage = cx.beforeDisinfectantVolume_g - cx.afterDisinfectantVolume_g;
if (disinfectant_usage < 0) disinfectant_usage = 0;
// m_context.m_endtp_str = getTime();
int totaltime = zsystem_clock().elapsedTimeS(cx.disinfection_start_tp) / 60;
dio->printerPrintf(fmt::format("= = = = = = = = = = = = = = = \n"));
dio->printerPrintf(fmt::format(" 全思美特\n"));
dio->printerPrintf(fmt::format("操作人 {}\n", ds->getLoginUid()));
dio->printerPrintf(fmt::format("开始时间 {}\n", format_zsystem_tp(cx.disinfection_start_tp)));
dio->printerPrintf(fmt::format("结束时间 {}\n", format_zsystem_tp(cx.disinfection_complete_tp)));
dio->printerPrintf(fmt::format("总耗时 {}:{}\n", totaltime / 60, totaltime % 60));
dio->printerPrintf(fmt::format("消毒液使用 {}g\n", disinfectant_usage));
dio->printerPrintf(fmt::format("目标LOG {}\n", (int)m_context.m_targetLoglevel));
dio->printerPrintf(fmt::format("实际LOG {}\n", (int)m_context.m_nowLoglevel));
dio->printerPrintf(fmt::format("= = = = = = = = = = = = = = = \n"));
for (size_t i = 0; i < count; i++)
{
/* code */
}
dio->printerPrintf(fmt::format("\n"));
dio->printerPrintf(fmt::format("\n"));
dio->printerPrintf(fmt::format("\n"));

339
service/disinfection_ctl_service.cpp

@ -14,30 +14,6 @@
using namespace iflytop;
using namespace std;
/**
* @brief
*
* :
*
*
* 1s
*
* 1s
*
* 1s
*
*
*
* 1s
*
* 1s
*
*
*/
// #define PRE_HEAT_TIME (2)
// #define PRE_HEAT_TIME (5 * 60)
#define DVALUE_COMPUTEPERIOD_TIME_S (10.0)
#define MAX_VOLUME (5000)
@ -57,8 +33,26 @@ static string formattimeS(int sec) {
static string getTime() {
struct tm tm = {0};
time_t t = time(nullptr);
struct tm* tmp = localtime_r(&t, &tm);
time_t t = time(nullptr);
localtime_r(&t, &tm);
return fmt::format("{:0>4}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2}", tm.tm_year + 1900, //
tm.tm_mon + 1, //
tm.tm_mday, //
tm.tm_hour, //
tm.tm_min, tm.tm_sec);
}
static bool zfeq(float a, float b, float eps = 0.01) {
if (fabs(a - b) < eps) {
return true;
}
return false;
}
static string format_zsystem_tp(zsystem_tp tp) {
time_t time = system_clock().to_time_t(tp);
struct tm tm = {0};
localtime_r(&time, &tm);
return fmt::format("{:0>4}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2}", tm.tm_year + 1900, //
tm.tm_mon + 1, //
tm.tm_mday, //
@ -68,7 +62,6 @@ static string getTime() {
DisinfectionCtrlService::DisinfectionCtrlService() {}
void DisinfectionCtrlService::initialize() {
GET_TO_SERVICE(m_zcanHost);
GET_TO_SERVICE(m_deviceIoControlService);
GET_TO_SERVICE(m_dbService);
GET_TO_SERVICE(m_disinfectionLogsManager);
@ -104,12 +97,7 @@ string DisinfectionCtrlService::createDisinfectionID() {
tm.tm_hour, //
tm.tm_min, tm.tm_sec);
}
static bool zfeq(float a, float b, float eps = 0.01) {
if (fabs(a - b) < eps) {
return true;
}
return false;
}
float DisinfectionCtrlService::getDisinfectionDValue(float ppm) { //
return m_dvalueComputer.computeDValue(ppm);
}
@ -146,61 +134,6 @@ void DisinfectionCtrlService::computeRemainTime(DisinfectionContext& context) {
logger->info("computeRemainTime minh2o2 {} dvalue {}", context.min_h2o2, dvalue);
}
void DisinfectionCtrlService::initContext(DisinfectionContext& context, //
int loglevel, //
float injection_pump_speed, //
float stoped_gs, //
float continued_gs, //
float stoped_satur, //
float continued_satur, //
float stoped_humi, //
float continued_humi //
) {
context.m_disinfectionID = createDisinfectionID();
context.pre_heat_time_s = m_dbService->getSettingVal("pre_heat_time_s");
context.stoped_gs = stoped_gs;
context.continued_gs = continued_gs;
context.stoped_satur = stoped_satur;
context.continued_satur = continued_satur;
context.stoped_humi = stoped_humi;
context.continued_humi = continued_humi;
context.injection_pump_speed = injection_pump_speed;
context.injection_pump_speed_changed = true;
if (g_in_test) {
logger->warn("in test mode, pre_heat_time_s = 5");
context.pre_heat_time_s = 5;
}
logger->info("startDisinfection {} {}", m_context.m_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);
logger->info(" continued_satur {}", context.continued_satur);
logger->info(" stoped_humi {}", context.stoped_humi);
logger->info(" continued_humi {}", context.continued_humi);
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;
// m_context.m_preheatFlag = true;
m_context.dvalue = 0;
// m_context.stopedflag = false;
m_context.m_state = kpreheat;
m_context.m_starttp = zsteady_clock().now();
m_context.m_starttp_str = getTime();
m_zcanHost->warning_light_ctrl_c1002(1, 0, 0, 1, 0);
m_deviceIoControlService->heartingPlate_setPower(true);
context.csvlogger = createCSVLogger(context.m_disinfectionID);
}
shared_ptr<DisinfectionLogger> DisinfectionCtrlService::createCSVLogger(string log_file_name) {
shared_ptr<DisinfectionLogger> _logger = m_disinfectionLogsManager->createNewLogger(log_file_name);
_logger->write(
@ -212,12 +145,12 @@ shared_ptr<DisinfectionLogger> DisinfectionCtrlService::createCSVLogger(string l
"{},{},{},{},"
"{},{}"
"\n",
ZIconv::noChange("时间"), //
ZIconv::noChange("仓内-气化过氧化氢浓度"), ZIconv::noChange("仓内-温度"), ZIconv::noChange("仓内-相对湿度"), ZIconv::noChange("仓内-相对饱和度"), //
ZIconv::noChange("时间"), //
ZIconv::noChange("仓内-气化过氧化氢浓度"), ZIconv::noChange("仓内-温度"), ZIconv::noChange("仓内-相对湿度"), ZIconv::noChange("仓内-相对饱和度"), //
ZIconv::noChange("环境1-气化过氧化氢浓度"), ZIconv::noChange("环境1-温度"), ZIconv::noChange("环境1-相对湿度"), ZIconv::noChange("环境1-相对饱和度"), //
ZIconv::noChange("环境2-气化过氧化氢浓度"), ZIconv::noChange("环境2-温度"), ZIconv::noChange("环境2-相对湿度"), ZIconv::noChange("环境2-相对饱和度"), //
ZIconv::noChange("D值"), ZIconv::noChange("当前LOG"), ZIconv::noChange("目标LOG"), //
ZIconv::noChange("加热器电源"), ZIconv::noChange("风机电源"), ZIconv::noChange("空压机电源"), ZIconv::noChange("喷液泵(g/min)"), //
ZIconv::noChange("D值"), ZIconv::noChange("当前LOG"), ZIconv::noChange("目标LOG"), //
ZIconv::noChange("加热器电源"), ZIconv::noChange("风机电源"), ZIconv::noChange("空压机电源"), ZIconv::noChange("喷液泵(g/min)"), //
ZIconv::noChange("消毒剩余剂量(g)"), ZIconv::noChange("剩余时间(s)")));
return _logger;
}
@ -311,6 +244,81 @@ void DisinfectionCtrlService::log(DisinfectionContext& context) {
#endif
}
/*******************************************************************************
* WORK *
*******************************************************************************/
void DisinfectionCtrlService::initContext(DisinfectionContext& context, //
int loglevel, //
float injection_pump_speed, //
float stoped_gs, //
float continued_gs, //
float stoped_satur, //
float continued_satur, //
float stoped_humi, //
float continued_humi //
) {
context.m_disinfectionID = createDisinfectionID();
context.pre_heat_time_s = m_dbService->getSettingVal("pre_heat_time_s");
context.stoped_gs = stoped_gs;
context.continued_gs = continued_gs;
context.stoped_satur = stoped_satur;
context.continued_satur = continued_satur;
context.stoped_humi = stoped_humi;
context.continued_humi = continued_humi;
context.injection_pump_speed = injection_pump_speed;
context.injection_pump_speed_changed = true;
if (g_in_test) {
logger->warn("in test mode, pre_heat_time_s = 5");
context.pre_heat_time_s = 5;
}
logger->info("startDisinfection {} {}", m_context.m_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);
logger->info(" continued_satur {}", context.continued_satur);
logger->info(" stoped_humi {}", context.stoped_humi);
logger->info(" continued_humi {}", context.continued_humi);
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;
// m_context.m_preheatFlag = true;
m_context.dvalue = 0;
// m_context.stopedflag = false;
m_context.m_state = kstate_preheat;
m_context.disinfection_start_tp = zsystem_clock().now();
m_context.disinfection_start_steady_tp = zsteady_clock().now();
for (int i = 0; i < MAX_H2O2_SENSOR_NUM; i++) {
m_context.h2o2[i] = 0;
m_context.humid[i] = 0;
m_context.temp[i] = 0;
m_context.saturation[i] = 0;
}
m_context.min_h2o2 = 0;
m_context.max_h2o2 = 0;
m_context.max_humid = 0;
m_context.max_saturation = 0;
m_context.stateSnapshotList.clear();
m_context.afterDisinfectantVolume_g = 0;
m_context.beforeDisinfectantVolume_g = m_deviceIoControlService->getDisinfectantVolume_g();
m_deviceIoControlService->warningLightCtrl(0, 0, 1, 0);
m_deviceIoControlService->heartingPlate_setPower(true);
context.csvlogger = createCSVLogger(context.m_disinfectionID);
m_context.stoped_by_usr = false;
}
void DisinfectionCtrlService::finishDisinfection(DisinfectionContext& context) {
context.m_remaintime = 0;
logger->info("stop disinfection {}", context.m_disinfectionID);
@ -327,22 +335,23 @@ void DisinfectionCtrlService::finishDisinfection(DisinfectionContext& context) {
// heartingPlate_setPower(false);
m_deviceIoControlService->heartingPlate_setPower(false);
m_disinfectionWorkState = 3;
m_zcanHost->warning_light_ctrl_c1002(1, 0, 0, 0, 0);
m_deviceIoControlService->warningLightCtrl(0, 1, 0, 0);
context.csvlogger = nullptr;
}
void DisinfectionCtrlService::processPreheatState(DisinfectionContext& context) {
int hasstarttime = zsteady_clock().elapsedTimeS(context.m_starttp);
int hasstarttime = zsteady_clock().elapsedTimeS(context.disinfection_start_steady_tp);
// logger->info("preheat {}", context.m_disinfectionID);
if ((context.m_state == kpreheat && hasstarttime > m_context.pre_heat_time_s)) {
if ((context.m_state == kstate_preheat && hasstarttime > m_context.pre_heat_time_s)) {
logger->info("preheat finished {}", context.m_disinfectionID);
m_deviceIoControlService->airBlower_setState(true);
usleep(1000 * 1000);
m_deviceIoControlService->airCompressor_setState(true);
usleep(1000 * 1000);
m_deviceIoControlService->sprayLiquidPump_open(context.injection_pump_speed);
context.m_state = kdisinfection;
context.m_state = kstate_disinfection;
} else {
logger->info("{}: preheat {}", context.m_disinfectionID, m_context.pre_heat_time_s - hasstarttime);
}
@ -353,8 +362,6 @@ void DisinfectionCtrlService::processPreheatState(DisinfectionContext& context)
*
*/
void DisinfectionCtrlService::processDisinfectionState(DisinfectionContext& context) {
ZCHECK(context.m_state == kdisinfection || context.m_state == kdisinfection_take_a_break, "state error");
/**
* @brief
*/
@ -362,7 +369,7 @@ void DisinfectionCtrlService::processDisinfectionState(DisinfectionContext& cont
/**
* @brief 湿
*/
if (m_context.m_state == kdisinfection) {
if (!m_context.isDisinfectionTakeBreak) {
/**
* @brief
*/
@ -384,7 +391,7 @@ void DisinfectionCtrlService::processDisinfectionState(DisinfectionContext& cont
m_deviceIoControlService->airCompressor_setState(false);
// m_context.sprayLiquidFlag = false;
m_context.m_state = kdisinfection_take_a_break;
m_context.isDisinfectionTakeBreak = true;
}
} else {
float nowSatur = m_context.max_saturation;
@ -398,13 +405,14 @@ void DisinfectionCtrlService::processDisinfectionState(DisinfectionContext& cont
m_deviceIoControlService->sprayLiquidPump_open(context.injection_pump_speed);
usleep(1000 * 1000);
m_deviceIoControlService->airCompressor_setState(true);
m_context.m_state = kdisinfection;
m_context.isDisinfectionTakeBreak = false;
}
}
}
void DisinfectionCtrlService::disinfectionLoop(bool& breakflag) {
// logger->info("disinfection running {} {}s preheatFlag:{}", m_context.m_disinfectionID, m_context.m_remaintime, m_context.m_preheatFlag);
ThisThread thisThread;
m_context.m_remaintime--;
bool forcelog = false;
if (m_context.m_remaintime < 0) {
@ -423,18 +431,18 @@ void DisinfectionCtrlService::disinfectionLoop(bool& breakflag) {
if (zsteady_clock().elapsedTimeS(m_context.m_lastComputeDvalueTp) > DVALUE_COMPUTEPERIOD_TIME_S) {
m_context.m_lastComputeDvalueTp = zsteady_clock().now();
//
if (m_context.m_state == kdisinfection || m_context.m_state == kdisinfection_take_a_break) {
if (m_context.m_state == kstate_disinfection) {
m_context.m_nowLoglevel = computeNowLogLevel(m_context);
computeRemainTime(m_context);
}
}
if (m_context.m_state == kpreheat) {
if (m_context.m_state == kstate_preheat) {
/**
* @brief
*/
processPreheatState(m_context);
} else if (m_context.m_state == kdisinfection || m_context.m_state == kdisinfection_take_a_break) {
} else if (m_context.m_state == kstate_disinfection) {
/**
* @brief
*/
@ -449,11 +457,11 @@ void DisinfectionCtrlService::disinfectionLoop(bool& breakflag) {
m_deviceIoControlService->airCompressor_setState(false);
usleep(1000 * 1000);
m_deviceIoControlService->heartingPlate_setPower(false);
m_context.m_state = kwait_for_h2o2_down;
m_context.m_state = kstate_degradation;
forcelog = true;
}
} else if (m_context.m_state == kwait_for_h2o2_down) {
} else if (m_context.m_state == kstate_degradation) {
/**
* @brief h2o2浓度下降
*/
@ -461,17 +469,35 @@ void DisinfectionCtrlService::disinfectionLoop(bool& breakflag) {
if (m_context.min_h2o2 < 1) {
logger->info("h2o2 concentration to safe value");
breakflag = true;
forcelog = true;
m_context.m_state = kfinished;
m_context.m_state = kstate_finished;
}
} else {
ZCHECK(false, "state error");
}
if (forcelog || zsteady_clock().elapsedTimeS(m_context.m_lastlogTp) > DVALUE_COMPUTEPERIOD_TIME_S) {
m_context.m_lastlogTp = zsteady_clock().now();
if (m_context.m_state != kstate_finished && thisThread.getExitFlag()) {
breakflag = true;
}
if (breakflag) {
m_context.disinfection_complete_tp = zsystem_clock().now();
m_context.afterDisinfectantVolume_g = m_deviceIoControlService->getDisinfectantVolume_g();
if (m_context.m_state != kstate_finished) {
m_context.m_state = kstate_finished;
m_context.stoped_by_usr = true;
}
m_disinfectionWorkState = 0;
finishDisinfection(m_context);
takeStateSnapshot(m_context);
dumpDisinfectionLogsToCSV(m_context);
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();
takeStateSnapshot(m_context);
dumpDisinfectionLogsToCSV(m_context);
log(m_context);
}
}
}
@ -483,8 +509,6 @@ void DisinfectionCtrlService::changeDisinfectionParameter(int injection_pump_spe
int stoped_humi, //
int continued_humi) {
lock_guard<recursive_mutex> lock(lock_);
// logger->info("changeInjectionPumpSpeed {}=>{}", m_context.injection_pump_speed, speed);
// m_context.injection_pump_speed = speed;
m_context.injection_pump_speed = injection_pump_speed;
m_context.stoped_gs = stoped_gs;
m_context.continued_gs = continued_gs;
@ -494,7 +518,8 @@ void DisinfectionCtrlService::changeDisinfectionParameter(int injection_pump_spe
m_context.continued_humi = continued_humi;
m_context.injection_pump_speed_changed = true;
logger->info("changeDisinfectionParameter {} {} {} {} {} {} {}", injection_pump_speed, stoped_gs, continued_gs, stoped_satur, continued_satur, stoped_humi, continued_humi);
logger->info("changeDisinfectionParameter {} {} {} {} {} {} {}", //
injection_pump_speed, stoped_gs, continued_gs, stoped_satur, continued_satur, stoped_humi, continued_humi);
}
void DisinfectionCtrlService::startDisinfection(int loglevel, //
@ -508,19 +533,12 @@ void DisinfectionCtrlService::startDisinfection(int loglevel, //
) {
lock_guard<recursive_mutex> lock(lock_);
/**
* @TODO
* 湿湿
*/
if (m_disinfectionThread) stopDisinfection();
if (m_disinfectionThread) {
stopDisinfection();
}
initContext(m_context, loglevel, injection_pump_speed, stoped_gs, continued_gs, stoped_satur, continued_satur, stoped_humi, continued_humi);
m_disinfectionThread.reset(new Thread("m_disinfectionThread", [this]() {
ThisThread thisThread;
while (!thisThread.getExitFlag()) {
while (true) {
thisThread.sleepForMs(1000);
bool breakflag = false;
disinfectionLoop(breakflag);
@ -528,49 +546,11 @@ void DisinfectionCtrlService::startDisinfection(int loglevel, //
break;
}
}
printfDisinfectionContextResult();
//
finishDisinfection(m_context);
}));
//
}
void DisinfectionCtrlService::printfDisinfectionContextResult() {
/**
* @brief
* = = = = = = = = = = = = = = =
*
* XXXXX
* 2021-03-10 10:00:00
* 2021-03-10 10:00:00
* 01:59
* LOG 6
* LOG 6
* = = = = = = = = = = = = = = =
*
*/
auto dio = m_deviceIoControlService;
auto ds = GET_SERVICE(DeviceStateService);
m_context.m_endtp_str = getTime();
int totaltime = zsteady_clock().elapsedTimeS(m_context.m_starttp) / 60;
dio->printerPrintf(fmt::format("= = = = = = = = = = = = = = = \n"));
dio->printerPrintf(fmt::format(" 全思美特\n"));
dio->printerPrintf(fmt::format("操作人 {}\n", ds->getLoginUid()));
dio->printerPrintf(fmt::format("开始时间 {}\n", m_context.m_starttp_str));
dio->printerPrintf(fmt::format("结束时间 {}\n", m_context.m_endtp_str));
dio->printerPrintf(fmt::format("总耗时 {}:{}\n", totaltime / 60, totaltime % 60));
dio->printerPrintf(fmt::format("目标LOG {}\n", (int)m_context.m_targetLoglevel));
dio->printerPrintf(fmt::format("实际LOG {}\n", (int)m_context.m_nowLoglevel));
dio->printerPrintf(fmt::format("= = = = = = = = = = = = = = = \n"));
dio->printerPrintf(fmt::format("\n"));
dio->printerPrintf(fmt::format("\n"));
dio->printerPrintf(fmt::format("\n"));
// getTime
// dio->printerPrintf(fmt::format("开始时间 {}\n", zsteady_clock().formatTime(m_context.m_starttp)));
}
void DisinfectionCtrlService::printfDisinfectionContextResult() {}
int DisinfectionCtrlService::getDisinfectionWorkState() { return m_context.m_state; }
@ -580,15 +560,13 @@ void DisinfectionCtrlService::stopDisinfection() {
m_disinfectionThread->join();
m_disinfectionThread = nullptr;
}
m_context.m_state = kfinished;
m_disinfectionWorkState = 0;
}
int32_t DisinfectionCtrlService::getEstimatedRemainingTimeS() {
lock_guard<recursive_mutex> lock(lock_);
if (m_context.m_state == kpreheat) {
if (m_context.m_state == kstate_preheat) {
return getPreHeatRaminTimeS();
} else if (m_context.m_state == kdisinfection || m_context.m_state == kdisinfection_take_a_break) {
} else if (m_context.m_state == kstate_disinfection) {
if (m_context.dvalue > 0) {
return m_context.m_remaintime;
} else {
@ -601,8 +579,8 @@ int32_t DisinfectionCtrlService::getEstimatedRemainingTimeS() {
int32_t DisinfectionCtrlService::getPreHeatRaminTimeS() {
lock_guard<recursive_mutex> lock(lock_);
int32_t remaintime = 0;
if (m_context.m_state == kpreheat) {
remaintime = m_context.pre_heat_time_s - zsteady_clock().elapsedTimeS(m_context.m_starttp);
if (m_context.m_state == kstate_preheat) {
remaintime = m_context.pre_heat_time_s - zsteady_clock().elapsedTimeS(m_context.disinfection_start_steady_tp);
if (remaintime < 0) {
remaintime = 0;
}
@ -618,7 +596,7 @@ string DisinfectionCtrlService::getDisinfectionID() {
}
bool DisinfectionCtrlService::isPreheatState() {
lock_guard<recursive_mutex> lock(lock_);
return m_context.m_state == kpreheat;
return m_context.m_state == kstate_preheat;
}
int DisinfectionCtrlService::getReplenishingFluidsWorkState() { return m_replenishingFluidsWorkState; }
@ -809,3 +787,24 @@ void DisinfectionCtrlService::updateH2O2SensorData(DisinfectionContext& context)
if (cx.max_humid < 0) cx.max_humid = 0;
if (cx.max_saturation < 0) cx.max_saturation = 0;
}
void DisinfectionCtrlService::takeStateSnapshot(DisinfectionContext& context) {
auto& cx = context;
shared_ptr<StateSnapshot> snapshot = make_shared<StateSnapshot>();
snapshot->time = zsystem_clock().now();
for (size_t i = 0; i < MAX_H2O2_SENSOR_NUM; i++) {
snapshot->h2o2[i] = cx.h2o2[i];
snapshot->humid[i] = cx.humid[i];
snapshot->temp[i] = cx.temp[i];
snapshot->saturation[i] = cx.saturation[i];
}
snapshot->min_h2o2 = cx.min_h2o2;
snapshot->max_h2o2 = cx.max_h2o2;
snapshot->max_humid = cx.max_humid;
snapshot->max_saturation = cx.max_saturation;
snapshot->state = cx.m_state;
cx.stateSnapshotList.push_back(snapshot);
}

99
service/disinfection_ctl_service.hpp

@ -16,6 +16,7 @@
#include "db/db_service.hpp"
#include "disinfection_logs_manager.hpp"
#include "disinfection_state.hpp"
#include "iflytop/components/zcanreceiver/zcanhost.hpp"
#include "iflytop/core/core.hpp"
#include "service/device_io_control_service.hpp"
@ -39,79 +40,18 @@ using namespace core;
class DisinfectionCtrlService : public enable_shared_from_this<DisinfectionCtrlService> {
ENABLE_LOGGER(DisinfectionCtrlService);
public:
typedef enum {
kidle = 0,
kpreheat = 1,
kdisinfection = 2,
kdisinfection_take_a_break = 3,
kwait_for_h2o2_down = 4,
kfinished = 5,
} state_t;
private:
unique_ptr<Thread> m_disinfectionThread;
shared_ptr<IF_DeviceIoContrlService> m_deviceIoControlService;
shared_ptr<DBService> m_dbService;
shared_ptr<DisinfectionLogsManager> m_disinfectionLogsManager;
DValueComputer m_dvalueComputer;
recursive_mutex lock_;
unique_ptr<Thread> m_disinfectionThread;
shared_ptr<IF_DeviceIoContrlService> m_deviceIoControlService;
shared_ptr<DBService> m_dbService;
shared_ptr<DisinfectionLogsManager> m_disinfectionLogsManager;
DValueComputer m_dvalueComputer;
int m_disinfectionWorkState = 0;
int m_replenishingFluidsWorkState = 0;
int m_drainingWorkState = 0;
shared_ptr<ZCanHost> m_zcanHost;
class DisinfectionContext {
public:
string m_disinfectionID;
zsteady_tp m_starttp;
string m_starttp_str;
zsteady_tp m_lastComputeDvalueTp;
zsteady_tp m_lastlogTp;
string m_endtp_str;
int m_remaintime = 0;
float m_targetLoglevel = 0;
float m_nowLoglevel = 0;
float dvalue = 0;
state_t m_state = kidle;
// bool sprayLiquidFlag = false;
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;
/*******************************************************************************
* *
*******************************************************************************/
int32_t h2o2[MAX_H2O2_SENSOR_NUM]; // ppm
int32_t humid[MAX_H2O2_SENSOR_NUM]; // %RH
int32_t temp[MAX_H2O2_SENSOR_NUM]; // °C
int32_t saturation[MAX_H2O2_SENSOR_NUM]; // %RS
int min_h2o2;
int max_h2o2;
int max_humid;
int max_saturation;
};
int m_drainingWorkState = 0; //消毒工作状态,0:未工作,1:工作中
public:
DisinfectionContext m_context;
@ -176,16 +116,17 @@ class DisinfectionCtrlService : public enable_shared_from_this<DisinfectionCtrlS
private:
float getDisinfectionDValue(float ppm);
void initContext(DisinfectionContext& context, //
int loglevel, //
float injection_pump_speed, //
float stoped_gs, //
float continued_gs, //
float stoped_satur, //
float continued_satur, //
float stoped_humi, //
float continued_humi //
);
void initContext(DisinfectionContext& context, //
int loglevel, //
float injection_pump_speed, //
float stoped_gs, //
float continued_gs, //
float stoped_satur, //
float continued_satur, //
float stoped_humi, //
float continued_humi //
);
void computeRemainTime(DisinfectionContext& context);
float computeNowLogLevel(DisinfectionContext& context);
void processPreheatState(DisinfectionContext& context);
@ -201,7 +142,7 @@ class DisinfectionCtrlService : public enable_shared_from_this<DisinfectionCtrlS
void dumpDisinfectionLogsToCSV(DisinfectionContext& context);
void log(DisinfectionContext& context);
void takeStateSnapshot(DisinfectionContext& context);
void updateH2O2SensorData(DisinfectionContext& context);
};
} // namespace iflytop

5
service/disinfection_printer_service.cpp

@ -0,0 +1,5 @@
#include "disinfection_printer_service.hpp"
using namespace iflytop;
void DisinfectionPrinterService::initialize() {}
void DisinfectionPrinterService::pushPrintTask(shared_ptr<DisinfectionPrinterTask> task) {}

51
service/disinfection_printer_service.hpp

@ -0,0 +1,51 @@
//
// Created by zwsd
//
#pragma once
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <memory>
#include <mutex>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include "disinfection_logs_manager.hpp"
#include "disinfection_state.hpp"
#include "iflytop/components/zcanreceiver/zcanhost.hpp"
#include "iflytop/core/core.hpp"
#include "service/device_io_control_service.hpp"
#include "utils/dvalue_computer.hpp"
#include "zservice_container/zservice_container.hpp"
/**
* @brief
*
* service:
*/
namespace iflytop {
using namespace std;
using namespace core;
class DisinfectionPrinterService : public enable_shared_from_this<DisinfectionPrinterService> {
ENABLE_LOGGER(DisinfectionPrinterService);
private:
recursive_mutex lock_;
unique_ptr<Thread> m_workThread;
list<shared_ptr<DisinfectionPrinterTask>> tasks;
public:
DisinfectionPrinterService() {}
public:
void initialize();
void pushPrintTask(shared_ptr<DisinfectionPrinterTask> task);
};
} // namespace iflytop

129
service/disinfection_state.hpp

@ -0,0 +1,129 @@
//
// Created by zwsd
//
#pragma once
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <memory>
#include <mutex>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include "configs/project_setting.hpp"
#include "iflytop/core/components/timeutils.hpp"
/**
* @brief
*
* service: DisinfectionCtrlService
*
* :
* :
* :
* :
*
*/
namespace iflytop {
using namespace std;
using namespace core;
class DisinfectionLogger;
typedef enum {
kstate_idle = 0, // 空闲
kstate_preheat = 1, // 预热
kstate_disinfection = 2, // 消毒中-工作
kstate_degradation = 4, // 降解中
kstate_finished = 5, // 结束
} disinfection_state_t;
class StateSnapshot {
public:
disinfection_state_t state;
zsystem_tp time;
int32_t h2o2[MAX_H2O2_SENSOR_NUM]; // ppm
int32_t humid[MAX_H2O2_SENSOR_NUM]; // %RH
int32_t temp[MAX_H2O2_SENSOR_NUM]; // °C
int32_t saturation[MAX_H2O2_SENSOR_NUM]; // %RS
int min_h2o2;
int max_h2o2;
int max_humid;
int max_saturation;
};
class DisinfectionPrinterTask {
public:
list<shared_ptr<StateSnapshot>> stateSnapshotList; // 状态快照I
int disinfectantUsage; // 消毒剂使用量
zsystem_tp start_tp;
zsystem_tp complete_tp;
bool stoped_by_usr = false;
};
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;
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; // 消毒工作中是否暂停工作
/*******************************************************************************
* *
*******************************************************************************/
int32_t h2o2[MAX_H2O2_SENSOR_NUM]; // ppm
int32_t humid[MAX_H2O2_SENSOR_NUM]; // %RH
int32_t temp[MAX_H2O2_SENSOR_NUM]; // °C
int32_t saturation[MAX_H2O2_SENSOR_NUM]; // %RS
int min_h2o2;
int max_h2o2;
int max_humid;
int max_saturation;
/*******************************************************************************
* *
*******************************************************************************/
list<shared_ptr<StateSnapshot>> stateSnapshotList; // 状态快照I
int beforeDisinfectantVolume_g; // 消毒前消毒剂量
int afterDisinfectantVolume_g; // 消毒后消毒剂量
zsystem_tp disinfection_start_tp;
zsystem_tp disinfection_complete_tp;
bool stoped_by_usr = false;
};
} // namespace iflytop
Loading…
Cancel
Save