#include "dmapp.hpp" #include "board/hal/zhal_initer.hpp" // #include "dmapp_controler/blower_controller.hpp" #include "dmapp_service/blower_ctrl_service.hpp" #include "dmapp_controler/air_compressor_controller.hpp" #include "dmapp_service/air_compressor_ctrl_service.hpp" using namespace iflytop; using namespace transmit_disfection_protocol; #define TAG "DMAPP" // // 参考 https://iflytop1.feishu.cn/wiki/GF8LwUjeJiNJ9DkcuEEcZLZMnTf?fromScene=spaceOverview 进行配置 // DisinfectionApp* DisinfectionApp::ins() { static DisinfectionApp instance; return &instance; } const char* DisinfectionApp::getName() { return "DisinfectionApp"; } void DisinfectionApp::initialize() { int btid = PublicBoard::ins()->getBoardTypeId(); // only support // large space disinfection machine, // small space disinfection machine, // pipe disinfection machine, // DT600B, ZASSERT(PORT::isLargeSpaceDM() || PORT::isSamllSpaceDM() || PORT::isPipeDM() || PORT::isDT600B() || PORT::isDrawBarDM()); /*********************************************************************************************************************** * 加热片 * ***********************************************************************************************************************/ if (PORT::isPowerCtrlBoard() // && (PORT::isLargeSpaceDM() || // PORT::isSamllSpaceDM() || // PORT::isPipeDM() || // PORT::isDT600B() || // PORT::isDrawBarDM())) { LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT(); heaterCtrler.initialize(PC7, &hadc1, ADC_CHANNEL_2, &hadc1, ADC_CHANNEL_9); } /*********************************************************************************************************************** * 风机 * ***********************************************************************************************************************/ if (BlowerCtrlService::isSupport()) { BlowerCtrlService::initialize(); // 初始化风机控制硬件 BlowerController::initialize(); // 解析相关协议 } /*********************************************************************************************************************** * 空压机 * ***********************************************************************************************************************/ if (AirCompressorCtrlService::isSupport()) { AirCompressorCtrlService::initialize(); // 初始化空压机控制硬件 AirCompressorController::initialize(); // 解析相关协议 } /*********************************************************************************************************************** * 气密性测试空压机 * ***********************************************************************************************************************/ // null // /*********************************************************************************************************************** * H2O2传感器 * ***********************************************************************************************************************/ if (PORT::isPowerCtrlBoard() && (PORT::isLargeSpaceDM() || PORT::isSamllSpaceDM() || PORT::isPipeDM() || PORT::isDT600B())) { LargeSpaceDmPowerCtrlBoardHal::HUART3_INIT(19200, UART_STOPBITS_2); LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT(); osDelay(3000); h2o2Sensor.initialize(&huart3, &hadc1, ADC_CHANNEL_3); } /*********************************************************************************************************************** * 水浸传感器 * ***********************************************************************************************************************/ if (PORT::isLiquidCtrlBoard() && (PORT::isLargeSpaceDM() || PORT::isSamllSpaceDM() || PORT::isPipeDM() || PORT::isDT600B())) { ZLOGI(TAG, "WaterSensor init"); evaporationBinWS.initAsInput(PC7, kxs_gpio_nopull, kxs_gpio_no_irq, false /*mirror*/); deviceBottomWS.initAsInput(PC8, kxs_gpio_nopull, kxs_gpio_no_irq, false /*mirror*/); REG_LAMADA_FN(kfn_device_bottom_water_sensor_read_state, [&](ProcessContext* cxt) { zcanbus_send_ack(cxt->packet, deviceBottomWS.read()); }); REG_LAMADA_FN(kfn_evaporation_tank_water_sensor_read_state, [&](ProcessContext* cxt) { zcanbus_send_ack(cxt->packet, evaporationBinWS.read()); }); } /*********************************************************************************************************************** * TMC电机初始化 * ***********************************************************************************************************************/ if (PORT::isLiquidCtrlBoard() && (PORT::isLargeSpaceDM() || PORT::isSamllSpaceDM() || PORT::isPipeDM() || PORT::isDT600B())) { // TMC电机初始化 ZLOGI(TAG, "TMCMotorGroup init"); LargeSpaceDMLiquidCtrlBoardHal::HSPI1_INIT(); tmcPowerGroup.initialize(PB2, {&hspi1, PA4 /*cs*/, PB12 /*en*/}, {&hspi1, PC4 /*cs*/, PB13 /*en*/}); } /*********************************************************************************************************************** * 三色指示灯 * ***********************************************************************************************************************/ if (PORT::isLiquidCtrlBoard() && (PORT::isLargeSpaceDM() || PORT::isSamllSpaceDM() || PORT::isPipeDM() || PORT::isDT600B())) { // 三色指示灯初始化 ZLOGI(TAG, "WarningLightDriver init"); wlDriver.initialize(PD8, PD7, PD9, PD10); } /*********************************************************************************************************************** * 压力传感器初始化 * ***********************************************************************************************************************/ if (PORT::isLiquidCtrlBoard() && (PORT::isLargeSpaceDM() || PORT::isSamllSpaceDM() || PORT::isPipeDM())) { ZLOGI(TAG, "PXXPSBus init"); osDelay(1500); // 等待传感器上电 LargeSpaceDMLiquidCtrlBoardHal::HUART3_INIT(9600, UART_STOPBITS_1); psBus.initialize(&huart3); } /*********************************************************************************************************************** * 比例阀初始化 * ***********************************************************************************************************************/ if (PORT::isLiquidCtrlBoard() && (PORT::isPipeDM())) { ZLOGI(TAG, "ProportionalValveCtrl init"); ZHALIniter::HUART2_INIT(PD5, PD6, 9600, UART_STOPBITS_1); proportionalValveCtrl.initialize(&huart2); } /*********************************************************************************************************************** * 气密性测试通道 * ***********************************************************************************************************************/ // kAirLeakTestMode_disinfection // kAirLeakTestMode_inflation // kAirLeakTestMode_leakTest if (PORT::isLiquidCtrlBoard() && (PORT::isPipeDM())) { static air_leak_test_mode_t airLeakTestMode = kAirLeakTestMode_disinfection; if (PORT::isPipeDM()) { static ZGPIO eValve0; static ZGPIO eValve1; static ZGPIO eValve2; eValve0.initAsOutput(PD14, kxs_gpio_nopull, true, false); eValve1.initAsOutput(PD15, kxs_gpio_nopull, true, false); eValve2.initAsOutput(PC6, kxs_gpio_nopull, true, false); // 空气通道电磁阀 REG_LAMADA_FN(kfn_air_leak_test_set_mode, [&](ProcessContext* cxt) { if (GET_PARAM(0) == kAirLeakTestMode_disinfection) { eValve2.write(0); // 内管路 eValve0.write(0); // 联通 eValve1.write(0); // 联通 } else if (GET_PARAM(0) == kAirLeakTestMode_inflation) { eValve2.write(1); // 联通空气 eValve0.write(0); // 联通 eValve1.write(0); // 联通 } else if (GET_PARAM(0) == kAirLeakTestMode_leakTest) { eValve2.write(0); // 内管路 eValve0.write(1); // 封闭 eValve1.write(1); // 封闭 } airLeakTestMode = (air_leak_test_mode_t)GET_PARAM(0); zcanbus_send_ack(cxt->packet, NULL, 0); }); REG_LAMADA_FN(kfn_air_leak_test_get_mode, [&](ProcessContext* cxt) { int32_t mode = airLeakTestMode; zcanbus_send_ack(cxt->packet, mode); }); } else if (PORT::isDrawBarDM()) { static ZGPIO eValve0; static ZGPIO eValve1; eValve0.initAsOutput(PD15, kxs_gpio_nopull, false, false); eValve1.initAsOutput(PC6, kxs_gpio_nopull, false, false); REG_LAMADA_FN(kfn_air_leak_test_set_mode, [&](ProcessContext* cxt) { if (GET_PARAM(0) == kAirLeakTestMode_disinfection) { eValve0.write(1); eValve1.write(1); } else if (GET_PARAM(0) == kAirLeakTestMode_inflation) { eValve0.write(0); eValve1.write(1); } else if (GET_PARAM(0) == kAirLeakTestMode_leakTest) { eValve0.write(1); eValve1.write(0); } airLeakTestMode = (air_leak_test_mode_t)GET_PARAM(0); zcanbus_send_ack(cxt->packet, NULL, 0); }); REG_LAMADA_FN(kfn_air_leak_test_get_mode, [&](ProcessContext* cxt) { int32_t mode = airLeakTestMode; zcanbus_send_ack(cxt->packet, mode); }); } } /** * @brief * 小空间低配版 和 拉杆箱 均不支持排液功能 */ if (PORT::isLiquidCtrlBoard() && (PORT::isLargeSpaceDM() || PORT::isSamllSpaceDM() || PORT::isPipeDM())) { static ZGPIO valve; valve.initAsOutput(PB3, kxs_gpio_nopull, true, false); REG_LAMADA_FN(kfn_set_add_fluid_channel_selector_valve, [&](ProcessContext* cxt) { if (GET_PARAM(0) == 0) { valve.write(0); } else { valve.write(1); } zcanbus_send_ack(cxt->packet, NULL, 0); }); } /** * @brief 液位状态 */ if (PORT::isLiquidCtrlBoard() && (PORT::isDT600B())) { // 初始化 static ZGPIO io0; static bool io0enable = false; static ZGPIO io1; static bool io1enable = false; static ZGPIO io2; static bool io2enable = false; if (PORT::isDT600B()) { io0.initAsInput(PD11, kxs_gpio_nopull, kxs_gpio_no_irq, true /*mirror*/); io0enable = true; } if (io0enable || io1enable || io2enable) { REG_LAMADA_FN(kfn_disinfectant_bucket_level_sensor_read_level, [&](ProcessContext* cxt) { int32_t liquid_level_state = 0; bool io0state = false; bool io1state = false; bool io2state = false; if (io0enable) io0state = io0.read(); if (io1enable) io1state = io1.read(); if (io2enable) io2state = io2.read(); if (io2state) { liquid_level_state = 3; // 液位最高 } else if (io1state) { liquid_level_state = 2; // 液位中等 } else if (io0state) { liquid_level_state = 1; // 液位最低 } else { liquid_level_state = 0; // 无液位 } zcanbus_send_ack(cxt->packet, liquid_level_state); }); } } } /*********************************************************************************************************************** * PROTOCOL_BIND * ***********************************************************************************************************************/