#include "dmapp.hpp" /** * @brief * * * 小空间和大空间硬件一样 * * 管道式-液路控制板 * 相比于大空间消毒机,不同的点: * 1.增加比例阀控制 * 2.空压机通道控制 * 管道式-功率板 * 相比于大空间消毒机,不同的点: * 1. 风机改成鼓风机(可控风速) * * 拉杆箱- * */ using namespace iflytop; using namespace transmit_disfection_protocol; #define TAG "LargeSpaceDmPowerCtrlBoard" DisinfectionApp* DisinfectionApp::ins() { static DisinfectionApp instance; return &instance; } const char* DisinfectionApp::getName() { return "DisinfectionApp"; } void DisinfectionApp::initialize() { int btid = PublicBoard::ins()->getBoardTypeId(); // if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) { LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT(); heaterCtrler.initialize(PC7, &hadc1, ADC_CHANNEL_2, &hadc1, ADC_CHANNEL_8); bindHeaterCtrler(); } if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) { LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT(); blowerCtrler.initialize(PC5, &hadc1, ADC_CHANNEL_1); bindBlowerCtrler(); } else if (isBoardType(kPipeDMPowerCtrlBoard)) { LargeSpaceDmPowerCtrlBoardHal::HUART2_INIT(9600, UART_STOPBITS_1); blowerCtrler.initializeAsHighPowerUartBlower(&huart2); bindBlowerCtrler(); } if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) { LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT(); airComCtrler.initialize(PC3, &hadc1, ADC_CHANNEL_0); bindAirComCtrler(); } if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) { LargeSpaceDmPowerCtrlBoardHal::HUART3_INIT(19200, UART_STOPBITS_2); LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT(); h2o2Sensor.initialize(&huart3, &hadc1, ADC_CHANNEL_10); bindH2o2Sensor(); } 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*/); bindDeviceBottomWS(); bindEvaporationBinWS(); } if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) { // TMC电机初始化 LargeSpaceDMLiquidCtrlBoardHal::HSPI1_INIT(); tmcPowerGroup.initialize(PB2, {&hspi1, PC4 /*cs*/, PB13 /*en*/}, {&hspi1, PA4 /*cs*/, PB12 /*en*/}); bindTmcPowerGroup(); } if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) { // 三色指示灯初始化 wlDriver.initialize(PD8, PD7, PD9, PD10); bindWlDriver(); } if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) { // 压力传感器初始化 osDelay(1500); // 等待传感器上电 LargeSpaceDMLiquidCtrlBoardHal::HUART3_INIT(9600, UART_STOPBITS_1); psBus.initialize(&huart3); bindPsBus(); } // 比例阀初始化 if (isBoardType(kPipeDMLiquidCtrlBoard)) { LargeSpaceDMLiquidCtrlBoardHal::HUART2_INIT(9600); proportionalValveCtrl.initialize(&huart2); bindProportionalValveCtrl(); } // 气密性测试通道 if (isBoardType(kPipeDMLiquidCtrlBoard)) { static ZGPIO airTightnessTestChGpio; static ZGPIO eValve; airTightnessTestChGpio.initAsOutput(PD15, kxs_gpio_nopull, true, false); eValve.initAsOutput(PD14, kxs_gpio_nopull, false, true); REG_LAMADA_FN(kfn_air_tightness_test_close_ch, [&](ProcessContext* cxt) { airTightnessTestChGpio.write(1); // 内管路,气密性测试 eValve.write(0); // 电磁阀闭合 zcanbus_send_ack(cxt->packet, NULL, 0); }); REG_LAMADA_FN(kfn_air_tightness_test_recover_ch, [&](ProcessContext* cxt) { airTightnessTestChGpio.write(0); // 连接空气 eValve.write(1); // 电磁阀打开 zcanbus_send_ack(cxt->packet, NULL, 0); }); } } /*********************************************************************************************************************** * PROTOCOL_BIND * ***********************************************************************************************************************/ void DisinfectionApp::bindHeaterCtrler() { 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); } void DisinfectionApp::bindBlowerCtrler() { 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); } void DisinfectionApp::bindAirComCtrler() { 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); } void DisinfectionApp::bindH2o2Sensor() { 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); } void DisinfectionApp::bindWlDriver() { BIND_FN(WarningLightDriver, wlDriver, fn_triple_warning_light_ctl); } void DisinfectionApp::bindTmcPowerGroup() { 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); } void DisinfectionApp::bindPsBus() { BIND_FN(PXXPSBus, psBus, fn_psbus_read_data); BIND_FN(PXXPSBus, psBus, fn_psbus_scan); } void DisinfectionApp::bindEvaporationBinWS() { 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)); })); } void DisinfectionApp::bindDeviceBottomWS() { 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)); })); } void DisinfectionApp::bindProportionalValveCtrl() { BIND_FN(ProportionalValveCtrl, &proportionalValveCtrl, fn_proportional_set_valve); BIND_FN(ProportionalValveCtrl, &proportionalValveCtrl, fn_proportional_read_pos); BIND_FN(ProportionalValveCtrl, &proportionalValveCtrl, fn_proportional_is_busy); }