From 8ab0f22bc5dfe1677195a0c1f95f4da2315d7639 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 16 May 2024 14:57:59 +0800 Subject: [PATCH] update --- service/bak | 43 ++++ service/disinfection_ctl_service.cpp | 339 +++++++++++++++---------------- service/disinfection_ctl_service.hpp | 99 ++------- service/disinfection_printer_service.cpp | 5 + service/disinfection_printer_service.hpp | 51 +++++ service/disinfection_state.hpp | 129 ++++++++++++ 6 files changed, 417 insertions(+), 249 deletions(-) create mode 100644 service/bak create mode 100644 service/disinfection_printer_service.cpp create mode 100644 service/disinfection_printer_service.hpp create mode 100644 service/disinfection_state.hpp diff --git a/service/bak b/service/bak new file mode 100644 index 0000000..7f22f5c --- /dev/null +++ b/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")); \ No newline at end of file diff --git a/service/disinfection_ctl_service.cpp b/service/disinfection_ctl_service.cpp index 5769ed4..eb9ad8f 100644 --- a/service/disinfection_ctl_service.cpp +++ b/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 DisinfectionCtrlService::createCSVLogger(string log_file_name) { shared_ptr _logger = m_disinfectionLogsManager->createNewLogger(log_file_name); _logger->write( @@ -212,12 +145,12 @@ shared_ptr 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 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 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 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 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 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 snapshot = make_shared(); + 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); +} diff --git a/service/disinfection_ctl_service.hpp b/service/disinfection_ctl_service.hpp index 9adcad5..9754b8f 100644 --- a/service/disinfection_ctl_service.hpp +++ b/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 { 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 m_disinfectionThread; - shared_ptr m_deviceIoControlService; - shared_ptr m_dbService; - shared_ptr m_disinfectionLogsManager; - - DValueComputer m_dvalueComputer; - recursive_mutex lock_; + unique_ptr m_disinfectionThread; + shared_ptr m_deviceIoControlService; + shared_ptr m_dbService; + shared_ptr m_disinfectionLogsManager; + DValueComputer m_dvalueComputer; + int m_disinfectionWorkState = 0; int m_replenishingFluidsWorkState = 0; - int m_drainingWorkState = 0; - - shared_ptr 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 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 task) {} \ No newline at end of file diff --git a/service/disinfection_printer_service.hpp b/service/disinfection_printer_service.hpp new file mode 100644 index 0000000..fd33f63 --- /dev/null +++ b/service/disinfection_printer_service.hpp @@ -0,0 +1,51 @@ +// +// Created by zwsd +// + +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 { + ENABLE_LOGGER(DisinfectionPrinterService); + + private: + recursive_mutex lock_; + + unique_ptr m_workThread; + list> tasks; + + public: + DisinfectionPrinterService() {} + + public: + void initialize(); + + void pushPrintTask(shared_ptr task); +}; +} // namespace iflytop \ No newline at end of file diff --git a/service/disinfection_state.hpp b/service/disinfection_state.hpp new file mode 100644 index 0000000..13d66fb --- /dev/null +++ b/service/disinfection_state.hpp @@ -0,0 +1,129 @@ +// +// Created by zwsd +// + +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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> 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 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> 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 \ No newline at end of file