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.

206 lines
6.4 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. //
  2. // Created by zwsd
  3. //
  4. #pragma once
  5. #include <fstream>
  6. #include <iostream>
  7. #include <list>
  8. #include <map>
  9. #include <memory>
  10. #include <mutex>
  11. #include <set>
  12. #include <sstream>
  13. #include <string>
  14. #include <vector>
  15. #include "db/db_service.hpp"
  16. #include "disinfection_logs_manager.hpp"
  17. #include "iflytop/components/zcanreceiver/zcanhost.hpp"
  18. #include "iflytop/core/core.hpp"
  19. #include "service/device_io_control_service.hpp"
  20. #include "utils/dvalue_computer.hpp"
  21. #include "zservice_container/zservice_container.hpp"
  22. /**
  23. * @brief
  24. *
  25. * service: DisinfectionCtrlService
  26. *
  27. * :
  28. * :
  29. * :
  30. * :
  31. *
  32. */
  33. namespace iflytop {
  34. using namespace std;
  35. using namespace core;
  36. class DisinfectionCtrlService : public enable_shared_from_this<DisinfectionCtrlService> {
  37. ENABLE_LOGGER(DisinfectionCtrlService);
  38. public:
  39. typedef enum {
  40. kidle = 0,
  41. kpreheat = 1,
  42. kdisinfection = 2,
  43. kdisinfection_take_a_break = 3,
  44. kwait_for_h2o2_down = 4,
  45. kfinished = 5,
  46. } state_t;
  47. private:
  48. unique_ptr<Thread> m_disinfectionThread;
  49. shared_ptr<IF_DeviceIoContrlService> m_deviceIoControlService;
  50. shared_ptr<DBService> m_dbService;
  51. shared_ptr<DisinfectionLogsManager> m_disinfectionLogsManager;
  52. DValueComputer m_dvalueComputer;
  53. recursive_mutex lock_;
  54. int m_disinfectionWorkState = 0;
  55. int m_replenishingFluidsWorkState = 0;
  56. int m_drainingWorkState = 0;
  57. shared_ptr<ZCanHost> m_zcanHost;
  58. class DisinfectionContext {
  59. public:
  60. string m_disinfectionID;
  61. zsteady_tp m_starttp;
  62. string m_starttp_str;
  63. zsteady_tp m_lastComputeDvalueTp;
  64. zsteady_tp m_lastlogTp;
  65. string m_endtp_str;
  66. int m_remaintime = 0;
  67. float m_targetLoglevel = 0;
  68. float m_nowLoglevel = 0;
  69. float dvalue = 0;
  70. state_t m_state = kidle;
  71. // bool sprayLiquidFlag = false;
  72. int injection_pump_speed;
  73. bool injection_pump_speed_changed = false;
  74. int pre_heat_time_s = 0;
  75. int stoped_gs = 0;
  76. int continued_gs = 0;
  77. int stoped_satur = 0;
  78. int continued_satur = 0;
  79. int stoped_humi = 0;
  80. int continued_humi = 0;
  81. shared_ptr<DisinfectionLogger> csvlogger;
  82. /*******************************************************************************
  83. * *
  84. *******************************************************************************/
  85. int32_t h2o2[MAX_H2O2_SENSOR_NUM]; // ppm
  86. int32_t humid[MAX_H2O2_SENSOR_NUM]; // %RH
  87. int32_t temp[MAX_H2O2_SENSOR_NUM]; // °C
  88. int32_t saturation[MAX_H2O2_SENSOR_NUM]; // %RS
  89. int min_h2o2;
  90. int max_h2o2;
  91. int max_humid;
  92. int max_saturation;
  93. };
  94. public:
  95. DisinfectionContext m_context;
  96. public:
  97. DisinfectionCtrlService();
  98. public:
  99. void initialize();
  100. /**
  101. * @brief
  102. *
  103. * @param loglevel
  104. */
  105. void startDisinfection(int loglevel, //
  106. int injection_pump_speed, //
  107. int stoped_gs, //
  108. int continued_gs, //
  109. int stoped_satur, //
  110. int continued_satur, //
  111. int stoped_humi, //
  112. int continued_humi //
  113. );
  114. void changeDisinfectionParameter(int injection_pump_speed, //
  115. int stoped_gs, //
  116. int continued_gs, //
  117. int stoped_satur, //
  118. int continued_satur, //
  119. int stoped_humi, //
  120. int continued_humi //
  121. );
  122. void stopDisinfection();
  123. int getDisinfectionWorkState();
  124. int getReplenishingFluidsWorkState();
  125. int getDrainingWorkState();
  126. /*******************************************************************************
  127. * *
  128. *******************************************************************************/
  129. void startReplenishingFluids(int stopatg);
  130. void stopReplenishingFluids();
  131. /*******************************************************************************
  132. * *
  133. *******************************************************************************/
  134. void startDraining();
  135. void stopDraining();
  136. /*******************************************************************************
  137. * State *
  138. *******************************************************************************/
  139. bool isDisinfectionRunning();
  140. int32_t getEstimatedRemainingTimeS();
  141. string getDisinfectionID();
  142. bool isPreheatState();
  143. int32_t getPreHeatRaminTimeS();
  144. private:
  145. string createDisinfectionID();
  146. private:
  147. float getDisinfectionDValue(float ppm);
  148. void initContext(DisinfectionContext& context, //
  149. int loglevel, //
  150. float injection_pump_speed, //
  151. float stoped_gs, //
  152. float continued_gs, //
  153. float stoped_satur, //
  154. float continued_satur, //
  155. float stoped_humi, //
  156. float continued_humi //
  157. );
  158. void computeRemainTime(DisinfectionContext& context);
  159. float computeNowLogLevel(DisinfectionContext& context);
  160. void processPreheatState(DisinfectionContext& context);
  161. void processDisinfectionState(DisinfectionContext& context);
  162. void finishDisinfection(DisinfectionContext& context);
  163. void printfDisinfectionContextResult();
  164. void disinfectionLoop(bool& breakflag);
  165. private:
  166. shared_ptr<DisinfectionLogger> createCSVLogger(string log_file_name);
  167. void dumpDisinfectionLogsToCSV(DisinfectionContext& context);
  168. void log(DisinfectionContext& context);
  169. void updateH2O2SensorData(DisinfectionContext& context);
  170. };
  171. } // namespace iflytop