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.

154 lines
5.3 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 "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<DisinfectionCtrlService> {
ENABLE_LOGGER(DisinfectionCtrlService);
private:
recursive_mutex lock_;
unique_ptr<Thread> m_disinfectionThread;
shared_ptr<IF_DeviceIoContrlService> m_deviceIoControlService;
shared_ptr<DBService> m_dbService;
shared_ptr<DisinfectionLogsManager> m_disinfectionLogsManager;
shared_ptr<DisinfectionPrinterService> 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<DisinfectionLogger> 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