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.

344 lines
13 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "device_io_control_service.hpp"
  2. using namespace iflytop;
  3. using namespace std;
  4. #if 0
  5. ID ID
  6. - 3 PC2 0
  7. - 3 PC3 1
  8. - 3 PC4 2
  9. - 3 PC5 3
  10. - 3 PC6 4
  11. - 3 PC7 5
  12. #endif
  13. #define GPM_TO_SPEED(gpm) (gpm * 3.07)
  14. #define SPEED_TO_GPM(speed) (speed / 3.07)
  15. DeviceIoControlService::DeviceIoControlService() {}
  16. void DeviceIoControlService::initialize() { GET_TO_SERVICE(m_zcanHost); }
  17. void DeviceIoControlService::startScan() {
  18. m_workThread.reset(new Thread("DeviceIoControlService", [this]() {
  19. ThisThread thisThread;
  20. uint32_t i = 0;
  21. int readpressuresensor_id = 1;
  22. while (!thisThread.getExitFlag()) {
  23. /* code */
  24. thisThread.sleepForMs(1);
  25. i++;
  26. if (i % 1000 == 0) {
  27. int adcv = 0;
  28. if (m_zcanHost->readadc(0, adcv) == 0) {
  29. lock_guard<recursive_mutex> lock(lock_);
  30. m_adc_0 = adcv;
  31. }
  32. if (m_zcanHost->readadc(1, adcv) == 0) {
  33. lock_guard<recursive_mutex> lock(lock_);
  34. m_adc_1 = adcv;
  35. }
  36. if (m_zcanHost->readadc(2, adcv) == 0) {
  37. lock_guard<recursive_mutex> lock(lock_);
  38. m_adc_2 = adcv;
  39. }
  40. // m_zcanHost->readadc(1, m_adc_1);
  41. // m_zcanHost->readadc(2, m_adc_2);
  42. // m_zcanHost->readadc(3, m_adc_3);
  43. // m_zcanHost->readadc(4, m_adc_4);
  44. // m_zcanHost->readadc(5, m_adc_5);
  45. }
  46. if (i % 3000 == 0) {
  47. // m_hpp272_data_1
  48. ZCanHost::hpp272_data_t m_hpp272_data_1_cache;
  49. int suc = m_zcanHost->hpp272_read_c1000(1, m_hpp272_data_1_cache);
  50. if (suc == 0) {
  51. lock_guard<recursive_mutex> lock(lock_);
  52. m_hpp272_data_1 = m_hpp272_data_1_cache;
  53. }
  54. // hydrogen_peroxide_volume
  55. // water_vapor_saturation_pressure_h2o_h2o2
  56. // logger->info("---------hpp272_read_c1000---------");
  57. // logger->info("hydrogen_peroxide_volume :{}", m_hpp272_data_1.hydrogen_peroxide_volume);
  58. // logger->info("h2o_h2o2_rs :{}", m_hpp272_data_1.h2o_h2o2_rs);
  59. // logger->info("temperature1 :{}", m_hpp272_data_1.temperature1);
  60. // logger->info("relative_humidity :{}", m_hpp272_data_1.relative_humidity);
  61. // logger->info("absolute_hydrogen_peroxide :{}", m_hpp272_data_1.absolute_hydrogen_peroxide);
  62. // logger->info("h2o_h2o2dew_point_temperature :{}", m_hpp272_data_1.h2o_h2o2dew_point_temperature);
  63. // logger->info("reserved1 :{}", m_hpp272_data_1.reserved1);
  64. // logger->info("water_volume :{}", m_hpp272_data_1.water_volume);
  65. // logger->info("water_vapor_pressure :{}", m_hpp272_data_1.water_vapor_pressure);
  66. // logger->info("absolute_humidity :{}", m_hpp272_data_1.absolute_humidity);
  67. // logger->info("water_vapor_saturation_pressure_h2o:{}", m_hpp272_data_1.water_vapor_saturation_pressure_h2o);
  68. // logger->info("temperature2 :{}", m_hpp272_data_1.temperature2);
  69. // logger->info("h2o2_vapor_pressure :{}", m_hpp272_data_1.h2o2_vapor_pressure);
  70. // logger->info("water_vapor_saturation_pressure_h2o_h2o2:{}", m_hpp272_data_1.water_vapor_saturation_pressure_h2o_h2o2);
  71. // logger->info("");
  72. }
  73. if (i % 300 == 0) {
  74. if (readpressuresensor_id == 5) {
  75. readpressuresensor_id = 1;
  76. }
  77. ZCanHost::huacheng_pressure_sensor_read_c1005_t sdata;
  78. if (m_zcanHost->huacheng_pressure_sensor_read_c1005(readpressuresensor_id, sdata) == 0) {
  79. lock_guard<recursive_mutex> lock(lock_);
  80. m_pressure_sensor_data[readpressuresensor_id] = sdata;
  81. }
  82. readpressuresensor_id++;
  83. }
  84. if (i % 100 == 0) {
  85. // m_zcanHost->readio(1, m_waterImmersionSensor1);
  86. // m_zcanHost->readio(2, m_waterImmersionSensor2);
  87. }
  88. }
  89. }));
  90. }
  91. void DeviceIoControlService::airCompressor_setState(bool val) {
  92. logger->info("airCompressor_setState:{}", val);
  93. if (val) {
  94. m_zcanHost->writeio(0, 1);
  95. usleep(500 * 100);
  96. m_zcanHost->writeio(1, 1);
  97. } else {
  98. m_zcanHost->writeio(1, 0);
  99. usleep(500 * 100);
  100. m_zcanHost->writeio(0, 0);
  101. }
  102. }
  103. int DeviceIoControlService::airCompressor_getio1() { return m_zcanHost->read_writeio_state_cache(0); }
  104. int DeviceIoControlService::airCompressor_getio2() { return m_zcanHost->read_writeio_state_cache(1); }
  105. int DeviceIoControlService::airCompressor_getcurrentValue() { return m_adc_0 * 0.00167 - 1.25; }
  106. int DeviceIoControlService::airCompressor_getstate() { return m_zcanHost->read_writeio_state_cache(0) && m_zcanHost->read_writeio_state_cache(1); }
  107. int DeviceIoControlService::airBlower_setState(bool val) {
  108. logger->info("airBlower_setState:{}", val);
  109. if (val) {
  110. m_zcanHost->writeio(2, 1);
  111. usleep(500 * 100);
  112. m_zcanHost->writeio(3, 1);
  113. } else {
  114. m_zcanHost->writeio(3, 0);
  115. usleep(500 * 100);
  116. m_zcanHost->writeio(2, 0);
  117. }
  118. return 0;
  119. }
  120. int DeviceIoControlService::airBlower_getio1() { return m_zcanHost->read_writeio_state_cache(2); }
  121. int DeviceIoControlService::airBlower_getio2() { return m_zcanHost->read_writeio_state_cache(3); }
  122. int DeviceIoControlService::airBlower_getstate() { return m_zcanHost->read_writeio_state_cache(2) && m_zcanHost->read_writeio_state_cache(3); }
  123. int DeviceIoControlService::airBlower_getcurrentValue() { return m_adc_1 * 0.00167 - 1.25; }
  124. // heatingStrip
  125. void DeviceIoControlService::heartingPlate_setPower(bool val) {
  126. logger->info("heartingPlate_setPower:{}", val);
  127. if (val) {
  128. m_zcanHost->writeio(4, 1);
  129. usleep(500 * 100);
  130. m_zcanHost->writeio(5, 1);
  131. } else {
  132. m_zcanHost->writeio(5, 0);
  133. usleep(500 * 100);
  134. m_zcanHost->writeio(4, 0);
  135. }
  136. }
  137. int DeviceIoControlService::heatingStrip_getio1() { return m_zcanHost->read_writeio_state_cache(4); }
  138. int DeviceIoControlService::heatingStrip_getio2() { return m_zcanHost->read_writeio_state_cache(5); }
  139. int DeviceIoControlService::heatingStrip_getstate() { return m_zcanHost->read_writeio_state_cache(4) && m_zcanHost->read_writeio_state_cache(5); }
  140. int DeviceIoControlService::heatingStrip_getcurrentValue() { return m_adc_2 * 0.00336 - 2.5; }
  141. //
  142. int DeviceIoControlService::getChargingPump_PumpRPM() { return m_zcanHost->pumpctrl_c1004_get_speed_cache(1); }
  143. void DeviceIoControlService::drainingPump_open() {
  144. logger->info("drainingPump_open");
  145. m_zcanHost->pumpctrl_c1004(1, 100, -300, 1, 20);
  146. }
  147. void DeviceIoControlService::drainingPump_close() {
  148. logger->info("drainingPump_close");
  149. m_zcanHost->pumpctrl_c1004(1, 100, 0, 1, 20);
  150. }
  151. void DeviceIoControlService::replenishingFluidsPump_open() {
  152. logger->info("replenishingFluidsPump_open");
  153. m_zcanHost->pumpctrl_c1004(1, 100, 300, 1, 20);
  154. }
  155. void DeviceIoControlService::replenishingFluidsPump_close() {
  156. logger->info("replenishingFluidsPump_close");
  157. m_zcanHost->pumpctrl_c1004(1, 100, 0, 1, 20);
  158. }
  159. void DeviceIoControlService::replenishingFluidsPump_open_for_test(int gpm) {
  160. logger->info("replenishingFluidsPump_open_for_test {}", gpm);
  161. int speed = GPM_TO_SPEED(gpm);
  162. if (speed > 300) {
  163. speed = 300;
  164. } else if (speed < -300) {
  165. speed = -300;
  166. }
  167. m_zcanHost->pumpctrl_c1004(1, 100, speed, 1, 20);
  168. }
  169. void DeviceIoControlService::replenishingFluidsPump_close_for_test() {
  170. logger->info("replenishingFluidsPump_close_for_test");
  171. m_zcanHost->pumpctrl_c1004(1, 100, 0, 1, 20);
  172. }
  173. /*******************************************************************************
  174. * sprayLiquidPump *
  175. *******************************************************************************/
  176. void DeviceIoControlService::sprayLiquidPump_open(int gpm) {
  177. logger->info("sprayLiquidPump_open");
  178. int speed = GPM_TO_SPEED(gpm);
  179. if (speed > 300) {
  180. speed = 300;
  181. } else if (speed < 0) {
  182. speed = 0;
  183. }
  184. m_zcanHost->pumpctrl_c1004(2, 100, speed, 1, 15);
  185. }
  186. void DeviceIoControlService::sprayLiquidPump_close() {
  187. logger->info("sprayLiquidPump_close");
  188. m_zcanHost->pumpctrl_c1004(2, 100, 0, 1, 15);
  189. }
  190. void DeviceIoControlService::sprayLiquidPump_open_for_test(int gpm) {
  191. logger->info("sprayLiquidPump_open");
  192. int speed = GPM_TO_SPEED(gpm);
  193. if (speed > 300) {
  194. speed = 300;
  195. } else if (speed < -300) {
  196. speed = -300;
  197. }
  198. m_zcanHost->pumpctrl_c1004(2, 100, speed, 1, 15);
  199. }
  200. void DeviceIoControlService::sprayLiquidPump_close_for_test() {
  201. logger->info("sprayLiquidPump_close");
  202. m_zcanHost->pumpctrl_c1004(2, 100, 0, 1, 15);
  203. }
  204. int DeviceIoControlService::sprayLiquidPump_getRPM() { return m_zcanHost->pumpctrl_c1004_get_speed_cache(2); }
  205. int DeviceIoControlService::sprayLiquidPump_getGPM() { return SPEED_TO_GPM(sprayLiquidPump_getRPM()); }
  206. int DeviceIoControlService::sprayLiquidPump_getState() { //
  207. lock_guard<recursive_mutex> lock(lock_);
  208. return (sprayLiquidPump_getRPM() != 0);
  209. }
  210. /*******************************************************************************
  211. * SensorState *
  212. *******************************************************************************/
  213. int DeviceIoControlService::getDisinfectantVolume_g() {
  214. // kpa;
  215. lock_guard<recursive_mutex> lock(lock_);
  216. float kpa = m_pressure_sensor_data[1].value / 1000.0;
  217. int g = 2.11 * kpa * 1000;
  218. if (g < 450) { /*零点*/
  219. return 0;
  220. } else {
  221. g -= 450;
  222. }
  223. return g;
  224. }
  225. int DeviceIoControlService::getPressureSensorData(int index) {
  226. lock_guard<recursive_mutex> lock(lock_);
  227. return m_pressure_sensor_data[index].value;
  228. }
  229. int DeviceIoControlService::getWaterImmersionSensor1() {
  230. lock_guard<recursive_mutex> lock(lock_);
  231. return m_waterImmersionSensor1 ? 1 : 0;
  232. }
  233. int DeviceIoControlService::getWaterImmersionSensor2() {
  234. lock_guard<recursive_mutex> lock(lock_);
  235. return m_waterImmersionSensor2 ? 1 : 0;
  236. }
  237. DeviceIoControlService::h2o2sensor_data_t DeviceIoControlService::getH2O2SenSorData1() {
  238. lock_guard<recursive_mutex> lock(lock_);
  239. DeviceIoControlService::h2o2sensor_data_t data;
  240. // int16_t hydrogen_peroxide_volume; // ppm 0x0100 过氧化氢浓度
  241. // int16_t h2o_h2o2_rs; // %RS * 100 0x0101 过氧化氢相对饱和度
  242. // int16_t temperature1; // °C * 100 0x0102 温度
  243. // int16_t relative_humidity; // %RH * 100 0x0103 相对湿度
  244. data.h2o2 = m_hpp272_data_1.hydrogen_peroxide_volume;
  245. data.humid = m_hpp272_data_1.relative_humidity / 100;
  246. data.temp = m_hpp272_data_1.temperature1 / 100;
  247. data.saturation = m_hpp272_data_1.h2o_h2o2_rs / 100;
  248. return data;
  249. }
  250. bool DeviceIoControlService::getAllSensorData(DeviceIoControlService::all_h2o2sensor_data_t& data) {
  251. lock_guard<recursive_mutex> lock(lock_);
  252. data = {0};
  253. data.h2o2sensor_data[0] = getH2O2SenSorData1();
  254. data.h2o2sensor_status[0] = true;
  255. data.h2o2sensor_status[1] = false;
  256. data.h2o2sensor_status[2] = false;
  257. /**
  258. * @brief
  259. */
  260. data.min_h2o2 = -1;
  261. for (size_t i = 0; i < ZARRAYSIZE(data.h2o2sensor_data); i++) {
  262. if (data.h2o2sensor_status[i]) {
  263. if (data.min_h2o2 < 0) {
  264. data.min_h2o2 = data.h2o2sensor_data[i].h2o2;
  265. } else if (data.h2o2sensor_data[i].h2o2 < data.min_h2o2) {
  266. data.min_h2o2 = data.h2o2sensor_data[i].h2o2;
  267. }
  268. }
  269. }
  270. data.max_h2o2 = -1;
  271. for (size_t i = 0; i < ZARRAYSIZE(data.h2o2sensor_data); i++) {
  272. if (data.h2o2sensor_status[i]) {
  273. if (data.max_h2o2 < 0) {
  274. data.max_h2o2 = data.h2o2sensor_data[i].h2o2;
  275. } else if (data.h2o2sensor_data[i].h2o2 > data.max_h2o2) {
  276. data.max_h2o2 = data.h2o2sensor_data[i].h2o2;
  277. }
  278. }
  279. }
  280. /**
  281. * @brief
  282. */
  283. data.max_saturation = -1;
  284. for (size_t i = 0; i < ZARRAYSIZE(data.h2o2sensor_data); i++) {
  285. if (data.h2o2sensor_status[i]) {
  286. if (data.max_saturation < 0) {
  287. data.max_saturation = data.h2o2sensor_data[i].saturation;
  288. } else if (data.h2o2sensor_data[i].saturation > data.max_saturation) {
  289. data.max_saturation = data.h2o2sensor_data[i].saturation;
  290. }
  291. }
  292. }
  293. /**
  294. * @brief 湿
  295. */
  296. data.max_humid = -1;
  297. for (size_t i = 0; i < ZARRAYSIZE(data.h2o2sensor_data); i++) {
  298. if (data.h2o2sensor_status[i]) {
  299. if (data.max_humid < 0) {
  300. data.max_humid = data.h2o2sensor_data[i].humid;
  301. } else if (data.h2o2sensor_data[i].humid > data.max_humid) {
  302. data.max_humid = data.h2o2sensor_data[i].humid;
  303. }
  304. }
  305. }
  306. return true;
  307. }