|
|
//
// 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
|