// // Created by zwsd // #pragma once #include #include #include #include #include #include #include #include #include #include #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 { 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; recursive_mutex lock_; 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; 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 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