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.

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