|
|
#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 * ***********************************************************************************************************************/
|