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.

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