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.

241 lines
8.6 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 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 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 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 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. #include "hardware.hpp"
  2. #include "adc.h"
  3. #include "tim.h"
  4. #include "zsdk/zcanreceiver/zcanreceiver.hpp"
  5. #include "zsdk/zcanreceiver_old/zcanreceiver.hpp"
  6. #define TAG "HARD"
  7. using namespace iflytop;
  8. /***********************************************************************************************************************
  9. * EXT *
  10. ***********************************************************************************************************************/
  11. static osThreadId H2O2CaptureThreadId;
  12. static osThreadId AlarmLightThreadId;
  13. /***********************************************************************************************************************
  14. * FUNC *
  15. ***********************************************************************************************************************/
  16. static void c_onH2O2CaptureThread(void const* argument) { Hardware::ins().onH2O2CaptureThread(); }
  17. static void c_onAlarmLightThread(void const* argument) { Hardware::ins().onAlarmLightThread(); }
  18. int32_t Hardware::readSwitchGroup() {
  19. int32_t id = 0;
  20. id |= m_switch_group0.read() << 0;
  21. id |= m_switch_group1.read() << 1;
  22. id |= m_switch_group2.read() << 2;
  23. id |= m_switch_group3.read() << 3;
  24. id |= m_switch_group4.read() << 4;
  25. }
  26. void Hardware::setAlarmLight(bool r, bool g, bool y) {
  27. m_alarmLightR.write(r);
  28. m_alarmLightG.write(g);
  29. m_alarmLightY.write(y);
  30. }
  31. void Hardware::setAlarmLight(light_state_t state) { m_alarmLightState = state; }
  32. void Hardware::init() {
  33. m_alarmLightR.initAsOutput(PD7, kxs_gpio_pullup, true, false);
  34. m_alarmLightG.initAsOutput(PD9, kxs_gpio_pullup, true, false);
  35. m_alarmLightY.initAsOutput(PD8, kxs_gpio_pullup, true, false);
  36. m_switch_group0.initAsInput(PE0, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  37. m_switch_group1.initAsInput(PE1, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  38. m_switch_group2.initAsInput(PE3, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  39. m_switch_group3.initAsInput(PE6, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  40. m_switch_group4.initAsInput(PE8, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  41. id_from_machine.initAsInput(PE8, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  42. ZLOGI(TAG, "switch group:%d id_from_machine %d", readSwitchGroup(), id_from_machine.read());
  43. setAlarmLight(kdisconnected);
  44. /**
  45. * @brief HMP110
  46. */
  47. osDelay(2000); // 等待传感器上电
  48. #ifdef H2O2_SENSOR_TYPE_HMP110
  49. ZASSERT(huart2.Init.BaudRate == 19200);
  50. ZASSERT(huart2.Init.StopBits == UART_STOPBITS_2);
  51. m_H2o2Sensor_ModbusBlockHost.initialize(&huart2);
  52. m_H2o2Sensor_H2O2Adc.initialize(&hadc1, ADC_CHANNEL_10); //
  53. m_H2o2Sensor_HMP110.init(&m_H2o2Sensor_ModbusBlockHost);
  54. if (m_H2o2Sensor_HMP110.ping(1)) {
  55. m_h2o2sensor_detectId = 1;
  56. }
  57. if (m_H2o2Sensor_HMP110.ping(240)) {
  58. m_h2o2sensor_detectId = 240;
  59. }
  60. m_H2o2Sensor_HMP110.setid(m_h2o2sensor_detectId);
  61. ZLOGI(TAG, "H2O2 HMP110 Sensor detect id: %d", m_h2o2sensor_detectId);
  62. #endif
  63. #ifdef H2O2_SENSOR_TYPE_HPP272
  64. ZASSERT(huart3.Init.BaudRate == 19200);
  65. ZASSERT(huart3.Init.StopBits == UART_STOPBITS_2);
  66. m_H2o2Sensor_ModbusBlockHost.initialize(&huart3);
  67. m_H2o2Sensor_HPP272.init(&m_H2o2Sensor_ModbusBlockHost);
  68. if (m_H2o2Sensor_HPP272.ping(1)) {
  69. m_h2o2sensor_detectId = 1;
  70. }
  71. if (m_H2o2Sensor_HPP272.ping(240)) {
  72. m_h2o2sensor_detectId = 240;
  73. }
  74. m_H2o2Sensor_HPP272.setid(m_h2o2sensor_detectId);
  75. ZLOGI(TAG, "H2O2 HPP272 Sensor detect id: %d", m_h2o2sensor_detectId);
  76. #endif
  77. osThreadDef(H2O2CaptureThread, c_onH2O2CaptureThread, osPriorityNormal, 0, 1024);
  78. H2O2CaptureThreadId = osThreadCreate(osThread(H2O2CaptureThread), NULL);
  79. osThreadDef(AlarmLightThread, c_onAlarmLightThread, osPriorityNormal, 0, 1024);
  80. AlarmLightThreadId = osThreadCreate(osThread(AlarmLightThread), NULL);
  81. }
  82. /***********************************************************************************************************************
  83. * H2O2 *
  84. ***********************************************************************************************************************/
  85. bool Hardware::h2o2_sensor_is_online() {
  86. #ifdef H2O2_SENSOR_TYPE_HMP110
  87. if (m_h2o2sensor_detectId <= 0) return false;
  88. int32_t ecode = m_H2o2Sensor_HMP110.read_cache_errorcode();
  89. if (ecode == -1) return false;
  90. #endif
  91. #ifdef H2O2_SENSOR_TYPE_HPP272
  92. if (m_h2o2sensor_detectId <= 0) return false;
  93. int32_t ecode = m_H2o2Sensor_HPP272.read_cache_errorcode();
  94. if (ecode == -1) return false;
  95. #endif
  96. return true;
  97. }
  98. int32_t Hardware::h2o2_sensor_read_calibration_date(int32_t* year, int32_t* month, int32_t* day) { //
  99. *year = 1;
  100. *month = 2;
  101. *day = 3;
  102. return 0;
  103. }
  104. int32_t Hardware::h2o2_sensor_read_sub_ic_errorcode() { //
  105. #ifdef H2O2_SENSOR_TYPE_HPP272
  106. return m_H2o2Sensor_HPP272.read_cache_errorcode();
  107. #endif
  108. #ifdef H2O2_SENSOR_TYPE_HMP110
  109. return m_H2o2Sensor_HMP110.read_cache_errorcode();
  110. #endif
  111. }
  112. int32_t Hardware::h2o2_sensor_read_sub_ic_reg(int32_t add, uint16_t* val, size_t len) { //
  113. #ifdef H2O2_SENSOR_TYPE_HPP272
  114. if (m_H2o2Sensor_HPP272.read_reg(add, val, len)) {
  115. return 0;
  116. }
  117. #endif
  118. #ifdef H2O2_SENSOR_TYPE_HMP110
  119. if (m_H2o2Sensor_HMP110.read_reg(add, val, len)) {
  120. return 0;
  121. }
  122. #endif
  123. return -1; // TODO 添加错误码
  124. }
  125. int32_t Hardware::h2o2_sensor_data(report_h2o2_data_t* readdata) {
  126. #ifdef H2O2_SENSOR_TYPE_HMP110
  127. int32_t ecode = m_H2o2Sensor_HMP110.read_cache_errorcode();
  128. int32_t h2o2adcVal = m_H2o2Sensor_H2O2Adc.getCacheVal();
  129. HMP110::hmp110_sensordata_t sensordata;
  130. m_H2o2Sensor_HMP110.read_cache_sensor_data(&sensordata);
  131. // float mv = adcv / 4095.0 * 3.3 * 1000;
  132. // float ma = mv / 150.0;
  133. // float ppm = (ma - 4) / (20 - 4) * 2000;
  134. int32_t h2o2ma = (h2o2adcVal / 4095.0 * 3.3 * 1000) / 150.0;
  135. int32_t h2o2ppm = (h2o2ma - 4) / (20 - 4) * 2000;
  136. readdata->sensor_error = ecode != 0;
  137. readdata->h2o2 = h2o2ppm;
  138. readdata->humid = sensordata.rh;
  139. readdata->temp = sensordata.temp;
  140. readdata->saturation = 0;
  141. ZLOGI(TAG, "ecode: %d ppm:%d, rh:%d, temp:%d, df_ptemp:%d, ah:%d, mr:%d, wbt:%d, eh:%d", //
  142. ecode, //
  143. h2o2ppm, //
  144. sensordata.rh, //
  145. sensordata.temp, //
  146. sensordata.df_ptemp, //
  147. sensordata.ah, //
  148. sensordata.mr, //
  149. sensordata.wet_bulb_temp, //
  150. sensordata.enthalpy);
  151. return 0;
  152. #endif
  153. #ifdef H2O2_SENSOR_TYPE_HPP272
  154. int32_t ecode = m_H2o2Sensor_HPP272.read_cache_errorcode();
  155. HPP272::hpp272_data_t sensordata;
  156. m_H2o2Sensor_HPP272.read_cache_sensor_data(&sensordata);
  157. readdata->sensor_error = ecode != 0;
  158. readdata->h2o2 = sensordata.hydrogen_peroxide_volume / 10.0;
  159. readdata->humid = sensordata.relative_humidity / 10.0;
  160. readdata->temp = sensordata.temperature1 / 10.0;
  161. readdata->saturation = sensordata.h2o_h2o2_rs / 10.0;
  162. ZLOGI(TAG, "h2o2 %d, humid %d, temp %d, sat %d",
  163. sensordata.hydrogen_peroxide_volume / 10, //
  164. sensordata.relative_humidity / 10, //
  165. sensordata.temperature1 / 10, //
  166. sensordata.h2o_h2o2_rs / 10);
  167. return 0;
  168. #endif
  169. }
  170. void Hardware::onH2O2CaptureThread() {
  171. while (1) {
  172. osDelay(1000);
  173. #ifdef H2O2_SENSOR_TYPE_HMP110
  174. if (m_h2o2sensor_detectId > 0) {
  175. m_H2o2Sensor_H2O2Adc.updateAdcValToCache();
  176. m_H2o2Sensor_HMP110.updateSensorDataAndErrorcode();
  177. }
  178. #endif
  179. #ifdef H2O2_SENSOR_TYPE_HPP272
  180. if (m_h2o2sensor_detectId > 0) {
  181. m_H2o2Sensor_HPP272.updateSensorDataAndErrorcode();
  182. }
  183. #endif
  184. }
  185. }
  186. void Hardware::onAlarmLightThread() {
  187. while (1) {
  188. osDelay(500);
  189. if (m_alarmLightState == kdisconnected) {
  190. static bool state;
  191. setAlarmLight(false, state, false);
  192. state = !state;
  193. } else if (m_alarmLightState == kconnected) {
  194. setAlarmLight(true, true, false);
  195. } else if (m_alarmLightState == kerror) {
  196. setAlarmLight(true, false, false);
  197. }
  198. }
  199. }