// // 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 "disinfection_state.hpp" #include "iflytop/components/zcanreceiver/zcanhost.hpp" #include "iflytop/core/core.hpp" #include "service/device_io_control_service.hpp" #include "service/disinfection_printer_service.hpp" #include "utils/dvalue_computer.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); private: recursive_mutex lock_; unique_ptr m_disinfectionThread; shared_ptr m_deviceIoControlService; shared_ptr m_dbService; shared_ptr m_disinfectionLogsManager; shared_ptr m_disinfectionPrinterService; DValueComputer m_dvalueComputer; int m_disinfectionWorkState = 0; int m_replenishingFluidsWorkState = 0; int m_drainingWorkState = 0; // 消毒工作状态,0:未工作,1:工作中 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 finishDisinfection(DisinfectionContext& context); void disinfectionLoop(bool& breakflag); void processState_Preheat(DisinfectionContext& context); void processState_Disinfection(DisinfectionContext& context, bool& updatedval); void processState_Degradation(DisinfectionContext& context); private: shared_ptr createCSVLogger(string log_file_name); void dumpDisinfectionLogsToCSV(DisinfectionContext& context); void pushDisinfectionPrinterTask(DisinfectionContext& context); void log(DisinfectionContext& context); void takeStateSnapshot(DisinfectionContext& context); void updateH2O2SensorData(DisinfectionContext& context); }; } // namespace iflytop