You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
5.7 KiB
182 lines
5.7 KiB
//
|
|
// 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 "db/db_service.hpp"
|
|
#include "disinfection_logs_manager.hpp"
|
|
#include "iflytop/components/zcanreceiver/zcanhost.hpp"
|
|
#include "iflytop/core/core.hpp"
|
|
#include "service/device_io_control_service.hpp"
|
|
#include "zservice_container/zservice_container.hpp"
|
|
/**
|
|
* @brief
|
|
*
|
|
* service: DisinfectionCtrlService
|
|
*
|
|
* 监听事件:
|
|
* 依赖状态:
|
|
* 依赖服务:
|
|
* 作用:
|
|
*
|
|
*/
|
|
|
|
namespace iflytop {
|
|
using namespace std;
|
|
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<DeviceIoControlService> m_deviceIoControlService;
|
|
shared_ptr<DBService> m_dbService;
|
|
shared_ptr<DisinfectionLogsManager> m_disinfectionLogsManager;
|
|
|
|
recursive_mutex lock_;
|
|
|
|
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;
|
|
zsteady_tp m_lastComputeDvalueTp;
|
|
zsteady_tp m_lastlogTp;
|
|
|
|
DeviceIoControlService::all_h2o2sensor_data_t h2o2data;
|
|
|
|
// bool m_preheatFlag = false;
|
|
// bool stopedflag = false; // 消毒停止标志,但继续等待h2o2浓度下降
|
|
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;
|
|
};
|
|
public:
|
|
DisinfectionContext m_context;
|
|
|
|
public:
|
|
DisinfectionCtrlService();
|
|
|
|
public:
|
|
void initialize();
|
|
/**
|
|
* @brief 开始消毒
|
|
*
|
|
* @param loglevel 消毒等级
|
|
*/
|
|
|
|
void startDisinfection(int loglevel, //
|
|
int injection_pump_speed, //
|
|
int stoped_gs, //
|
|
int continued_gs, //
|
|
int stoped_satur, //
|
|
int continued_satur, //
|
|
int stoped_humi, //
|
|
int continued_humi //
|
|
);
|
|
void changeDisinfectionParameter(int injection_pump_speed, //
|
|
int stoped_gs, //
|
|
int continued_gs, //
|
|
int stoped_satur, //
|
|
int continued_satur, //
|
|
int stoped_humi, //
|
|
int continued_humi //
|
|
);
|
|
|
|
void stopDisinfection();
|
|
|
|
int getDisinfectionWorkState();
|
|
int getReplenishingFluidsWorkState();
|
|
int getDrainingWorkState();
|
|
|
|
/*******************************************************************************
|
|
* 加液 *
|
|
*******************************************************************************/
|
|
void startReplenishingFluids(int stopatg);
|
|
void stopReplenishingFluids();
|
|
/*******************************************************************************
|
|
* 排液 *
|
|
*******************************************************************************/
|
|
void startDraining();
|
|
void stopDraining();
|
|
/*******************************************************************************
|
|
* State *
|
|
*******************************************************************************/
|
|
bool isDisinfectionRunning();
|
|
int32_t getEstimatedRemainingTimeS();
|
|
string getDisinfectionID();
|
|
bool isPreheatState();
|
|
int32_t getPreHeatRaminTimeS();
|
|
|
|
private:
|
|
string createDisinfectionID();
|
|
|
|
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 computeRemainTime(DisinfectionContext& context);
|
|
float computeNowLogLevel(DisinfectionContext& context);
|
|
void processPreheatState(DisinfectionContext& context);
|
|
void processDisinfectionState(DisinfectionContext& context);
|
|
void dumpDisinfectionLogs(DisinfectionContext& context);
|
|
void dumpDisinfectionLogsToCSV(DisinfectionContext& context);
|
|
void finishDisinfection(DisinfectionContext& context);
|
|
|
|
void disinfectionLoop(bool& breakflag);
|
|
};
|
|
} // namespace iflytop
|