#pragma once #include "board/public_board.hpp" #include "board_base/board_base.hpp" /** * @brief * 大空间消毒机-功率控制板 */ namespace iflytop { using namespace transmit_disfection_protocol; #define TAG "LargeSpaceDmPowerCtrlBoard" class DisinfectionApp { public: HeaterController heaterCtrler; BlowerController blowerCtrler; AirCompressorController airComCtrler; H2O2SensorDriver h2o2Sensor; ZGPIO evaporationBinWS; // 蒸发仓水浸 ZGPIO deviceBottomWS; // 设备底部水浸 WarningLightDriver wlDriver; // 报警灯 TmcMotorGroup tmcPowerGroup; // TMC电机 PXXPSBus psBus; // PXX压力传感器总线 public: static DisinfectionApp* ins() { static DisinfectionApp instance; return &instance; } virtual const char* getName() { return "DisinfectionApp"; } void initialize() { initializeDevice(); regProtocol(); } void initializeDevice() { int btid = PublicBoard::ins()->getBoardTypeId(); // if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) { heaterCtrler.initialize(PC7, &hadc1, ADC_CHANNEL_2, &hadc1, ADC_CHANNEL_8); } if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) { blowerCtrler.initialize(PC5, &hadc1, ADC_CHANNEL_1); } if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) { airComCtrler.initialize(PC3, &hadc1, ADC_CHANNEL_0); } if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) { h2o2Sensor.initialize(&huart3, &hadc1, ADC_CHANNEL_10); } if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) { evaporationBinWS.initAsInput(PC7, kxs_gpio_nopull, kxs_gpio_no_irq, true /*mirror*/); deviceBottomWS.initAsInput(PC8, kxs_gpio_nopull, kxs_gpio_no_irq, true /*mirror*/); } if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) { // TMC电机初始化 LargeSpaceDMLiquidCtrlBoardHal::HSPI1_INIT(); tmcPowerGroup.initialize(PB2, {&hspi1, PC4 /*cs*/, PB13 /*en*/}, {&hspi1, PA4 /*cs*/, PB12 /*en*/}); } if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) { // 三色指示灯初始化 wlDriver.initialize(PD8, PD7, PD9, PD10); } if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) { // 压力传感器初始化 osDelay(1500); // 等待传感器上电 LargeSpaceDMLiquidCtrlBoardHal::HUART3_INIT(9600, UART_STOPBITS_1); psBus.initialize(&huart3); } } void regProtocol() { if (heaterCtrler.isInitialized()) { BIND_FN(HeaterController, &heaterCtrler, fn_heater_ctrl); BIND_FN(HeaterController, &heaterCtrler, fn_heater_ctrl_safe_valve); BIND_FN(HeaterController, &heaterCtrler, fn_heater_read_electric_current); BIND_FN(HeaterController, &heaterCtrler, fn_heater_read_temperature_data); } if (blowerCtrler.isInitialized()) { BIND_FN(BlowerController, &blowerCtrler, fn_blower_ctrl); BIND_FN(BlowerController, &blowerCtrler, fn_blower_ctrl_safe_valve); BIND_FN(BlowerController, &blowerCtrler, fn_blower_read_electric_current); } if (airComCtrler.isInitialized()) { BIND_FN(AirCompressorController, &airComCtrler, fn_air_compressor_ctrl); BIND_FN(AirCompressorController, &airComCtrler, fn_air_compressor_ctrl_safe_valve); BIND_FN(AirCompressorController, &airComCtrler, fn_air_compressor_read_electric_current); } if (h2o2Sensor.isInitialized()) { BIND_FN(H2O2SensorDriver, &h2o2Sensor, fn_h2o2_sensor_read_calibration_date); BIND_FN(H2O2SensorDriver, &h2o2Sensor, fn_h2o2_sensor_read_sub_ic_errorcode); BIND_FN(H2O2SensorDriver, &h2o2Sensor, fn_h2o2_sensor_read_sub_ic_reg); } if (wlDriver.isInitialized()) { BIND_FN(WarningLightDriver, wlDriver, fn_triple_warning_light_ctl); } if (tmcPowerGroup.isInitialized()) { BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_rotate); BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_stop); BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_ihold_irun_idelay); BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_acc); BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_ramp); BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_tzw); BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_set_subic_reg); BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_get_subic_reg); BIND_FN(TmcMotorGroup, tmcPowerGroup, fn_pump_ping); } if (psBus.isInitialized()) { BIND_FN(PXXPSBus, psBus, fn_psbus_read_data); BIND_FN(PXXPSBus, psBus, fn_psbus_scan); } if (evaporationBinWS.isInited()) { ProtocolProcesserMgr::ins()->regCmdProcesser( // CmdProcesser(kfn_evaporation_tank_water_sensor_read_state, // [this](ProcessContext* cxt) { int32_t val = evaporationBinWS.read(); zcanbus_send_ack(cxt->packet, (uint8_t*)&val, sizeof(val)); })); } if (deviceBottomWS.isInited()) { ProtocolProcesserMgr::ins()->regCmdProcesser( // CmdProcesser(kfn_device_bottom_water_sensor_read_state, // [this](ProcessContext* cxt) { int32_t val = deviceBottomWS.read(); zcanbus_send_ack(cxt->packet, (uint8_t*)&val, sizeof(val)); })); } } }; #undef TAG } // namespace iflytop