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.

191 lines
5.9 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. //
  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<DeviceIoControlService> 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. DeviceIoControlService::h2o2_sensor_statistics_result_t sensor_stat;
  67. int m_remaintime = 0;
  68. float m_targetLoglevel = 0;
  69. float m_nowLoglevel = 0;
  70. float dvalue = 0;
  71. state_t m_state = kidle;
  72. // bool sprayLiquidFlag = false;
  73. int injection_pump_speed;
  74. bool injection_pump_speed_changed = false;
  75. int pre_heat_time_s = 0;
  76. int stoped_gs = 0;
  77. int continued_gs = 0;
  78. int stoped_satur = 0;
  79. int continued_satur = 0;
  80. int stoped_humi = 0;
  81. int continued_humi = 0;
  82. shared_ptr<DisinfectionLogger> csvlogger;
  83. };
  84. public:
  85. DisinfectionContext m_context;
  86. public:
  87. DisinfectionCtrlService();
  88. public:
  89. void initialize();
  90. /**
  91. * @brief
  92. *
  93. * @param loglevel
  94. */
  95. void startDisinfection(int loglevel, //
  96. int injection_pump_speed, //
  97. int stoped_gs, //
  98. int continued_gs, //
  99. int stoped_satur, //
  100. int continued_satur, //
  101. int stoped_humi, //
  102. int continued_humi //
  103. );
  104. void changeDisinfectionParameter(int injection_pump_speed, //
  105. int stoped_gs, //
  106. int continued_gs, //
  107. int stoped_satur, //
  108. int continued_satur, //
  109. int stoped_humi, //
  110. int continued_humi //
  111. );
  112. void stopDisinfection();
  113. int getDisinfectionWorkState();
  114. int getReplenishingFluidsWorkState();
  115. int getDrainingWorkState();
  116. /*******************************************************************************
  117. * *
  118. *******************************************************************************/
  119. void startReplenishingFluids(int stopatg);
  120. void stopReplenishingFluids();
  121. /*******************************************************************************
  122. * *
  123. *******************************************************************************/
  124. void startDraining();
  125. void stopDraining();
  126. /*******************************************************************************
  127. * State *
  128. *******************************************************************************/
  129. bool isDisinfectionRunning();
  130. int32_t getEstimatedRemainingTimeS();
  131. string getDisinfectionID();
  132. bool isPreheatState();
  133. int32_t getPreHeatRaminTimeS();
  134. private:
  135. string createDisinfectionID();
  136. private:
  137. float getDisinfectionDValue(float ppm);
  138. void initContext(DisinfectionContext& context, //
  139. int loglevel, //
  140. float injection_pump_speed, //
  141. float stoped_gs, //
  142. float continued_gs, //
  143. float stoped_satur, //
  144. float continued_satur, //
  145. float stoped_humi, //
  146. float continued_humi //
  147. );
  148. void computeRemainTime(DisinfectionContext& context);
  149. float computeNowLogLevel(DisinfectionContext& context);
  150. void processPreheatState(DisinfectionContext& context);
  151. void processDisinfectionState(DisinfectionContext& context);
  152. void finishDisinfection(DisinfectionContext& context);
  153. void printfDisinfectionContextResult();
  154. void disinfectionLoop(bool& breakflag);
  155. private:
  156. shared_ptr<DisinfectionLogger> createCSVLogger(string log_file_name);
  157. void dumpDisinfectionLogsToCSV(DisinfectionContext& context);
  158. void log(DisinfectionContext& context);
  159. };
  160. } // namespace iflytop