|
|
@ -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); |
|
|
|
} |