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

187 lines
7.6 KiB

#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);
}