全司美特-单片机程序
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.

237 lines
9.7 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. #include "dmapp.hpp"
  2. /**
  3. * @brief
  4. *
  5. *
  6. *
  7. *
  8. *
  9. * -----
  10. *
  11. * :
  12. * 1.
  13. * 2.
  14. *
  15. * :
  16. * 1. ()
  17. *
  18. * ------
  19. *
  20. *
  21. *
  22. *
  23. */
  24. using namespace iflytop;
  25. using namespace transmit_disfection_protocol;
  26. #define TAG "LargeSpaceDmPowerCtrlBoard"
  27. DisinfectionApp* DisinfectionApp::ins() {
  28. static DisinfectionApp instance;
  29. return &instance;
  30. }
  31. const char* DisinfectionApp::getName() { return "DisinfectionApp"; }
  32. void DisinfectionApp::initialize() {
  33. int btid = PublicBoard::ins()->getBoardTypeId();
  34. //
  35. // 加热片
  36. if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard)) {
  37. LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT();
  38. heaterCtrler.initialize(PC7, &hadc1, ADC_CHANNEL_2, &hadc1, ADC_CHANNEL_8);
  39. bindHeaterCtrler();
  40. } else if (isBoardType(kDrawBarDMPowerCtrlBoard)) {
  41. LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT();
  42. heaterCtrler.initialize(PC7, NULL, 0, &hadc1, ADC_CHANNEL_1);
  43. bindHeaterCtrler();
  44. }
  45. // 风机
  46. if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard)) {
  47. LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT();
  48. blowerCtrler.initialize(PC5, &hadc1, ADC_CHANNEL_1);
  49. bindBlowerCtrler();
  50. } else if (isBoardType(kPipeDMPowerCtrlBoard)) {
  51. LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT();
  52. LargeSpaceDmPowerCtrlBoardHal::HUART2_INIT(9600, UART_STOPBITS_1);
  53. blowerCtrler.initializeAsHighPowerUartBlower(&huart2, &hadc1, ADC_CHANNEL_1);
  54. bindBlowerCtrler();
  55. } else if (isBoardType(kDrawBarDMPowerCtrlBoard)) {
  56. DBDMPowerCtrlBoard::HTIM3_INIT();
  57. blowerCtrler.initializeAsMiniPwmBlower(&htim3, TIM_CHANNEL_3, PC6 /*en*/, PC9 /*fb*/);
  58. bindBlowerCtrler();
  59. }
  60. // 空压机
  61. if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard)) {
  62. LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT();
  63. airComCtrler.initialize(PC3, &hadc1, ADC_CHANNEL_0);
  64. bindAirComCtrler();
  65. } else if (isBoardType(kDrawBarDMLiquidCtrlBoard)) {
  66. airComCtrler.initialize(PD14, NULL, 0);
  67. }
  68. // 气密性测试空压机
  69. // kfn_air_tightness_test_ac_ctrl
  70. if (isBoardType(kPipeDMPowerCtrlBoard)) {
  71. REG_LAMADA_FN(kfn_air_tightness_test_ac_ctrl, [&](ProcessContext* cxt) {
  72. airComCtrler.air_compressor_ctrl(GET_PARAM(0));
  73. airComCtrler.air_compressor_ctrl_safe_valve(GET_PARAM(0));
  74. zcanbus_send_ack(cxt->packet, NULL, 0);
  75. });
  76. } else if (isBoardType(kDrawBarDMLiquidCtrlBoard)) {
  77. static ZGPIO airCompressorCtrlGpio;
  78. airCompressorCtrlGpio.initAsOutput(PD15, kxs_gpio_nopull, true, false);
  79. REG_LAMADA_FN(kfn_air_tightness_test_ac_ctrl, [&](ProcessContext* cxt) {
  80. airCompressorCtrlGpio.write(GET_PARAM(0));
  81. zcanbus_send_ack(cxt->packet, NULL, 0);
  82. });
  83. }
  84. // H2O2传感器
  85. if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) {
  86. LargeSpaceDmPowerCtrlBoardHal::HUART3_INIT(19200, UART_STOPBITS_2);
  87. LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT();
  88. h2o2Sensor.initialize(&huart3, &hadc1, ADC_CHANNEL_10);
  89. bindH2o2Sensor();
  90. }
  91. // 水浸传感器
  92. if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard)) {
  93. evaporationBinWS.initAsInput(PC7, kxs_gpio_nopull, kxs_gpio_no_irq, true /*mirror*/);
  94. deviceBottomWS.initAsInput(PC8, kxs_gpio_nopull, kxs_gpio_no_irq, true /*mirror*/);
  95. bindDeviceBottomWS();
  96. bindEvaporationBinWS();
  97. }
  98. // TMC驱动
  99. // kfn_pump_rotate = 100, // cmd: index rpm ack:none
  100. // kfn_pump_stop = 101, // cmd: index rpm ack:none
  101. // kfn_pump_set_ihold_irun_idelay = 102, // cmd: index irun,ihold,idelay ack:none
  102. // kfn_pump_set_acc = 104, // cmd: index acc ack:none , delete
  103. // kfn_pump_ping = 105, // cmd: index, ack:none
  104. // kfn_pump_set_ramp = 106, // cmd: index,vs,a1,amx,v1 ack:none
  105. // kfn_pump_set_tzw = 107, // cmd: index,timeZeroWait ack:none
  106. // kfn_pump_set_subic_reg = 110, // cmd: index,val ack:none
  107. // kfn_pump_get_subic_reg = 111, // cmd: index, ack:val
  108. if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) {
  109. // TMC电机初始化
  110. LargeSpaceDMLiquidCtrlBoardHal::HSPI1_INIT();
  111. tmcPowerGroup.initialize(PB2, {&hspi1, PC4 /*cs*/, PB13 /*en*/}, {&hspi1, PA4 /*cs*/, PB12 /*en*/});
  112. bindTmcPowerGroup();
  113. }
  114. // 三色指示灯
  115. if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard)) {
  116. // 三色指示灯初始化
  117. wlDriver.initialize(PD8, PD7, PD9, PD10);
  118. bindWlDriver();
  119. }
  120. // 压力传感器初始化
  121. if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) {
  122. osDelay(1500); // 等待传感器上电
  123. LargeSpaceDMLiquidCtrlBoardHal::HUART3_INIT(9600, UART_STOPBITS_1);
  124. psBus.initialize(&huart3);
  125. bindPsBus();
  126. }
  127. // 比例阀初始化
  128. if (isBoardType(kPipeDMLiquidCtrlBoard)) {
  129. LargeSpaceDMLiquidCtrlBoardHal::HUART2_INIT(9600);
  130. proportionalValveCtrl.initialize(&huart2);
  131. bindProportionalValveCtrl();
  132. }
  133. // 气密性测试通道
  134. if (isBoardType(kPipeDMLiquidCtrlBoard)) {
  135. static ZGPIO airTightnessTestChGpio;
  136. static ZGPIO eValve;
  137. airTightnessTestChGpio.initAsOutput(PD15, kxs_gpio_nopull, true, false);
  138. eValve.initAsOutput(PD14, kxs_gpio_nopull, false, true);
  139. REG_LAMADA_FN(kfn_air_tightness_test_close_ch, [&](ProcessContext* cxt) {
  140. airTightnessTestChGpio.write(1); // 内管路,气密性测试
  141. eValve.write(0); // 电磁阀闭合
  142. zcanbus_send_ack(cxt->packet, NULL, 0);
  143. });
  144. REG_LAMADA_FN(kfn_air_tightness_test_recover_ch, [&](ProcessContext* cxt) {
  145. airTightnessTestChGpio.write(0); // 连接空气
  146. eValve.write(1); // 电磁阀打开
  147. zcanbus_send_ack(cxt->packet, NULL, 0);
  148. });
  149. }
  150. }
  151. /***********************************************************************************************************************
  152. * PROTOCOL_BIND *
  153. ***********************************************************************************************************************/
  154. void DisinfectionApp::bindHeaterCtrler() {
  155. BIND_FN(HeaterController, &heaterCtrler, fn_heater_ctrl);
  156. BIND_FN(HeaterController, &heaterCtrler, fn_heater_ctrl_safe_valve);
  157. BIND_FN(HeaterController, &heaterCtrler, fn_heater_read_electric_current);
  158. BIND_FN(HeaterController, &heaterCtrler, fn_heater_read_temperature_data);
  159. }
  160. void DisinfectionApp::bindBlowerCtrler() {
  161. BIND_FN(BlowerController, &blowerCtrler, fn_blower_ctrl);
  162. BIND_FN(BlowerController, &blowerCtrler, fn_blower_ctrl_safe_valve);
  163. BIND_FN(BlowerController, &blowerCtrler, fn_blower_read_electric_current);
  164. BIND_FN(BlowerController, &blowerCtrler, fn_blower_is_error);
  165. }
  166. void DisinfectionApp::bindAirComCtrler() {
  167. BIND_FN(AirCompressorController, &airComCtrler, fn_air_compressor_ctrl);
  168. BIND_FN(AirCompressorController, &airComCtrler, fn_air_compressor_ctrl_safe_valve);
  169. BIND_FN(AirCompressorController, &airComCtrler, fn_air_compressor_read_electric_current);
  170. }
  171. void DisinfectionApp::bindH2o2Sensor() {
  172. BIND_FN(H2O2SensorDriver, &h2o2Sensor, fn_h2o2_sensor_read_calibration_date);
  173. BIND_FN(H2O2SensorDriver, &h2o2Sensor, fn_h2o2_sensor_read_sub_ic_errorcode);
  174. BIND_FN(H2O2SensorDriver, &h2o2Sensor, fn_h2o2_sensor_read_sub_ic_reg);
  175. }
  176. void DisinfectionApp::bindWlDriver() { BIND_FN(WarningLightDriver, wlDriver, fn_triple_warning_light_ctl); }
  177. void DisinfectionApp::bindTmcPowerGroup() {
  178. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_rotate);
  179. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_stop);
  180. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_ihold_irun_idelay);
  181. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_acc);
  182. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_ramp);
  183. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_tzw);
  184. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_subic_reg);
  185. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_get_subic_reg);
  186. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_ping);
  187. }
  188. void DisinfectionApp::bindPsBus() {
  189. BIND_FN(PXXPSBus, psBus, fn_psbus_read_data);
  190. BIND_FN(PXXPSBus, psBus, fn_psbus_scan);
  191. }
  192. void DisinfectionApp::bindEvaporationBinWS() {
  193. ProtocolProcesserMgr::ins()->regCmdProcesser( //
  194. CmdProcesser(kfn_evaporation_tank_water_sensor_read_state, //
  195. [this](ProcessContext* cxt) {
  196. int32_t val = evaporationBinWS.read();
  197. zcanbus_send_ack(cxt->packet, (uint8_t*)&val, sizeof(val));
  198. }));
  199. }
  200. void DisinfectionApp::bindDeviceBottomWS() {
  201. ProtocolProcesserMgr::ins()->regCmdProcesser( //
  202. CmdProcesser(kfn_device_bottom_water_sensor_read_state, //
  203. [this](ProcessContext* cxt) {
  204. int32_t val = deviceBottomWS.read();
  205. zcanbus_send_ack(cxt->packet, (uint8_t*)&val, sizeof(val));
  206. }));
  207. }
  208. void DisinfectionApp::bindProportionalValveCtrl() {
  209. BIND_FN(ProportionalValveCtrl, &proportionalValveCtrl, fn_proportional_set_valve);
  210. BIND_FN(ProportionalValveCtrl, &proportionalValveCtrl, fn_proportional_read_pos);
  211. BIND_FN(ProportionalValveCtrl, &proportionalValveCtrl, fn_proportional_is_busy);
  212. }