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

149 lines
5.9 KiB

1 year ago
  1. #pragma once
  2. #include "board/public_board.hpp"
  3. #include "board_base/board_base.hpp"
  4. /**
  5. * @brief
  6. * -
  7. */
  8. namespace iflytop {
  9. using namespace transmit_disfection_protocol;
  10. #define TAG "LargeSpaceDmPowerCtrlBoard"
  11. class DisinfectionApp {
  12. public:
  13. HeaterController heaterCtrler;
  14. BlowerController blowerCtrler;
  15. AirCompressorController airComCtrler;
  16. H2O2SensorDriver h2o2Sensor;
  17. ZGPIO evaporationBinWS; // 蒸发仓水浸
  18. ZGPIO deviceBottomWS; // 设备底部水浸
  19. WarningLightDriver wlDriver; // 报警灯
  20. TmcMotorGroup tmcPowerGroup; // TMC电机
  21. PXXPSBus psBus; // PXX压力传感器总线
  22. public:
  23. static DisinfectionApp* ins() {
  24. static DisinfectionApp instance;
  25. return &instance;
  26. }
  27. virtual const char* getName() { return "DisinfectionApp"; }
  28. void initialize() {
  29. initializeDevice();
  30. regProtocol();
  31. }
  32. void initializeDevice() {
  33. int btid = PublicBoard::ins()->getBoardTypeId();
  34. //
  35. if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) {
  36. heaterCtrler.initialize(PC7, &hadc1, ADC_CHANNEL_2, &hadc1, ADC_CHANNEL_8);
  37. }
  38. if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) {
  39. blowerCtrler.initialize(PC5, &hadc1, ADC_CHANNEL_1);
  40. }
  41. if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) {
  42. airComCtrler.initialize(PC3, &hadc1, ADC_CHANNEL_0);
  43. }
  44. if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) {
  45. h2o2Sensor.initialize(&huart3, &hadc1, ADC_CHANNEL_10);
  46. }
  47. if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) {
  48. evaporationBinWS.initAsInput(PC7, kxs_gpio_nopull, kxs_gpio_no_irq, true /*mirror*/);
  49. deviceBottomWS.initAsInput(PC8, kxs_gpio_nopull, kxs_gpio_no_irq, true /*mirror*/);
  50. }
  51. if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) {
  52. // TMC电机初始化
  53. LargeSpaceDMLiquidCtrlBoardHal::HSPI1_INIT();
  54. tmcPowerGroup.initialize(PB2, {&hspi1, PC4 /*cs*/, PB13 /*en*/}, {&hspi1, PA4 /*cs*/, PB12 /*en*/});
  55. }
  56. if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) {
  57. // 三色指示灯初始化
  58. wlDriver.initialize(PD8, PD7, PD9, PD10);
  59. }
  60. if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) {
  61. // 压力传感器初始化
  62. osDelay(1500); // 等待传感器上电
  63. LargeSpaceDMLiquidCtrlBoardHal::HUART3_INIT(9600, UART_STOPBITS_1);
  64. psBus.initialize(&huart3);
  65. }
  66. }
  67. void regProtocol() {
  68. if (heaterCtrler.isInitialized()) {
  69. BIND_FN(HeaterController, &heaterCtrler, fn_heater_ctrl);
  70. BIND_FN(HeaterController, &heaterCtrler, fn_heater_ctrl_safe_valve);
  71. BIND_FN(HeaterController, &heaterCtrler, fn_heater_read_electric_current);
  72. BIND_FN(HeaterController, &heaterCtrler, fn_heater_read_temperature_data);
  73. }
  74. if (blowerCtrler.isInitialized()) {
  75. BIND_FN(BlowerController, &blowerCtrler, fn_blower_ctrl);
  76. BIND_FN(BlowerController, &blowerCtrler, fn_blower_ctrl_safe_valve);
  77. BIND_FN(BlowerController, &blowerCtrler, fn_blower_read_electric_current);
  78. }
  79. if (airComCtrler.isInitialized()) {
  80. BIND_FN(AirCompressorController, &airComCtrler, fn_air_compressor_ctrl);
  81. BIND_FN(AirCompressorController, &airComCtrler, fn_air_compressor_ctrl_safe_valve);
  82. BIND_FN(AirCompressorController, &airComCtrler, fn_air_compressor_read_electric_current);
  83. }
  84. if (h2o2Sensor.isInitialized()) {
  85. BIND_FN(H2O2SensorDriver, &h2o2Sensor, fn_h2o2_sensor_read_calibration_date);
  86. BIND_FN(H2O2SensorDriver, &h2o2Sensor, fn_h2o2_sensor_read_sub_ic_errorcode);
  87. BIND_FN(H2O2SensorDriver, &h2o2Sensor, fn_h2o2_sensor_read_sub_ic_reg);
  88. }
  89. if (wlDriver.isInitialized()) {
  90. BIND_FN(WarningLightDriver, wlDriver, fn_triple_warning_light_ctl);
  91. }
  92. if (tmcPowerGroup.isInitialized()) {
  93. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_rotate);
  94. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_stop);
  95. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_ihold_irun_idelay);
  96. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_acc);
  97. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_ramp);
  98. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_tzw);
  99. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_subic_reg);
  100. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_get_subic_reg);
  101. BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_ping);
  102. }
  103. if (psBus.isInitialized()) {
  104. BIND_FN(PXXPSBus, psBus, fn_psbus_read_data);
  105. BIND_FN(PXXPSBus, psBus, fn_psbus_scan);
  106. }
  107. if (evaporationBinWS.isInited()) {
  108. ProtocolProcesserMgr::ins()->regCmdProcesser( //
  109. CmdProcesser(kfn_evaporation_tank_water_sensor_read_state, //
  110. [this](ProcessContext* cxt) {
  111. int32_t val = evaporationBinWS.read();
  112. zcanbus_send_ack(cxt->packet, (uint8_t*)&val, sizeof(val));
  113. }));
  114. }
  115. if (deviceBottomWS.isInited()) {
  116. ProtocolProcesserMgr::ins()->regCmdProcesser( //
  117. CmdProcesser(kfn_device_bottom_water_sensor_read_state, //
  118. [this](ProcessContext* cxt) {
  119. int32_t val = deviceBottomWS.read();
  120. zcanbus_send_ack(cxt->packet, (uint8_t*)&val, sizeof(val));
  121. }));
  122. }
  123. }
  124. };
  125. #undef TAG
  126. } // namespace iflytop