From 2a18c9d6aac6da1d6caa8e19401503008430c018 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Fri, 9 Aug 2024 15:45:19 +0800 Subject: [PATCH] update --- app_protocols/transmit_disfection_protocol | 2 +- usrc/board/large_space_dm_liquid_ctrl_board.hpp | 9 +-- usrc/board/large_space_dm_power_ctrl_board.hpp | 9 ++- usrc/board/pipe_dm_liquid_ctrl_board.hpp | 21 +++++-- usrc/board/pipe_dm_power_ctrl_board.hpp | 18 ++++-- usrc/board_base/app_share/blower_controller.hpp | 52 ++++++++++++++---- .../app_share/proportional_valve_ctrl.hpp | 45 +++++++++++++++ .../large_space_dm_liquid_ctrl_board_hal.cpp | 34 ++++++++++++ .../large_space_dm_liquid_ctrl_board_hal.hpp | 2 + usrc/board_base/board_base.hpp | 3 +- .../pipe_dm_liquid_ctrl_board_pp.hpp | 64 ++++++++++++++++++++++ .../pipe_dm_power_ctrl_board_pp.hpp | 50 +++++++++++++++++ zsdk | 2 +- 13 files changed, 280 insertions(+), 31 deletions(-) create mode 100644 usrc/board_base/app_share/proportional_valve_ctrl.hpp create mode 100644 usrc/protocol_processer_impl/pipe_dm_liquid_ctrl_board_pp.hpp create mode 100644 usrc/protocol_processer_impl/pipe_dm_power_ctrl_board_pp.hpp diff --git a/app_protocols/transmit_disfection_protocol b/app_protocols/transmit_disfection_protocol index a08705a..8b73b00 160000 --- a/app_protocols/transmit_disfection_protocol +++ b/app_protocols/transmit_disfection_protocol @@ -1 +1 @@ -Subproject commit a08705a05778e93df1922ffb42d889231ff09bf3 +Subproject commit 8b73b00eacba449c5d71f7d9f0dab9abc54c6aaa diff --git a/usrc/board/large_space_dm_liquid_ctrl_board.hpp b/usrc/board/large_space_dm_liquid_ctrl_board.hpp index c31129c..c960dc2 100644 --- a/usrc/board/large_space_dm_liquid_ctrl_board.hpp +++ b/usrc/board/large_space_dm_liquid_ctrl_board.hpp @@ -1,5 +1,9 @@ #pragma once #include "board_base/board_base.hpp" +/** + * @brief + * 大空间消毒机-电流控制板 + */ namespace iflytop { class LargeSpaceDmLiquidCtrlBoard { public: @@ -27,15 +31,12 @@ class LargeSpaceDmLiquidCtrlBoard { osDelay(1500); // 等待传感器上电 LargeSpaceDMLiquidCtrlBoardHal::HUART3_INIT(9600, UART_STOPBITS_1); psBus.initialize(&huart3); - } static void onTimeCb(void* handler) { LargeSpaceDmLiquidCtrlBoard* p = (LargeSpaceDmLiquidCtrlBoard*)handler; p->onTimeCb(); } - void onTimeCb() { - - } + void onTimeCb() {} }; } // namespace iflytop \ No newline at end of file diff --git a/usrc/board/large_space_dm_power_ctrl_board.hpp b/usrc/board/large_space_dm_power_ctrl_board.hpp index 14b8813..012286f 100644 --- a/usrc/board/large_space_dm_power_ctrl_board.hpp +++ b/usrc/board/large_space_dm_power_ctrl_board.hpp @@ -1,7 +1,10 @@ #pragma once #include "board_base/board_base.hpp" -// +/** + * @brief + * 大空间消毒机-功率控制板 + */ namespace iflytop { #define H2O2_SENSOR_TYPE_HMP110 @@ -22,12 +25,12 @@ class LargeSpaceDmPowerCtrlBoard { } void initialize() { LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT(); - LargeSpaceDmPowerCtrlBoardHal::HUART2_INIT(19200, UART_STOPBITS_2); + LargeSpaceDmPowerCtrlBoardHal::HUART3_INIT(19200, UART_STOPBITS_2); heaterCtrler.initialize(PC7, &hadc1, ADC_CHANNEL_2, &hadc1, ADC_CHANNEL_8); blowerCtrler.initialize(PC5, &hadc1, ADC_CHANNEL_1); airComCtrler.initialize(PC3, &hadc1, ADC_CHANNEL_0); - h2o2Sensor.initialize(&huart2, &hadc1, ADC_CHANNEL_10); + h2o2Sensor.initialize(&huart3, &hadc1, ADC_CHANNEL_10); AppPeriodTaskMgr::ins()->regTask("AirComAdc", LargeSpaceDmLiquidCtrlBoard::onTimeCb, this, 1000); } diff --git a/usrc/board/pipe_dm_liquid_ctrl_board.hpp b/usrc/board/pipe_dm_liquid_ctrl_board.hpp index 9348e46..905bc06 100644 --- a/usrc/board/pipe_dm_liquid_ctrl_board.hpp +++ b/usrc/board/pipe_dm_liquid_ctrl_board.hpp @@ -1,13 +1,21 @@ #pragma once #include "board_base/board_base.hpp" +/** + * @brief + * 管道式-液路控制板 + * + * 相比于大空间消毒机,不同的点: + * 1.增加比例阀控制 + */ namespace iflytop { class PipeDMLiquidCtrlBoard { public: - ZGPIO evaporationBinWS; // 蒸发仓水浸 - ZGPIO deviceBottomWS; // 设备底部水浸 - WarningLightDriver wlDriver; // 报警灯 - TmcMotorGroup tmcPowerGroup; // TMC电机 - PXXPSBus psBus; // PXX压力传感器总线 + ZGPIO evaporationBinWS; // 蒸发仓水浸 + ZGPIO deviceBottomWS; // 设备底部水浸 + WarningLightDriver wlDriver; // 报警灯 + TmcMotorGroup tmcPowerGroup; // TMC电机 + PXXPSBus psBus; // PXX压力传感器总线 + ProportionalValveCtrl proportionalValveCtrl; public: static PipeDMLiquidCtrlBoard* ins() { @@ -27,6 +35,9 @@ class PipeDMLiquidCtrlBoard { osDelay(1500); // 等待传感器上电 LargeSpaceDMLiquidCtrlBoardHal::HUART3_INIT(9600, UART_STOPBITS_1); psBus.initialize(&huart3); + // + LargeSpaceDMLiquidCtrlBoardHal::HUART2_INIT(9600); + proportionalValveCtrl.initialize(&huart2); } }; } // namespace iflytop \ No newline at end of file diff --git a/usrc/board/pipe_dm_power_ctrl_board.hpp b/usrc/board/pipe_dm_power_ctrl_board.hpp index 475d20f..1f19477 100644 --- a/usrc/board/pipe_dm_power_ctrl_board.hpp +++ b/usrc/board/pipe_dm_power_ctrl_board.hpp @@ -1,8 +1,13 @@ #pragma once #include "board_base/board_base.hpp" - -// - +/** + * @brief + * 管道式-功率控制板 + * + * 相比于大空间消毒机,不同的点: + * 1. 风机改成鼓风机(可控风速) + * + */ namespace iflytop { #define H2O2_SENSOR_TYPE_HMP110 using namespace transmit_disfection_protocol; @@ -21,12 +26,13 @@ class PipeDMPowerCtrlBoard { } void initialize() { LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT(); - LargeSpaceDmPowerCtrlBoardHal::HUART2_INIT(19200, UART_STOPBITS_2); + LargeSpaceDmPowerCtrlBoardHal::HUART2_INIT(9600, UART_STOPBITS_1); + LargeSpaceDmPowerCtrlBoardHal::HUART3_INIT(19200, UART_STOPBITS_2); heaterCtrler.initialize(PC7, &hadc1, ADC_CHANNEL_2, &hadc1, ADC_CHANNEL_8); - blowerCtrler.initialize(PC5, &hadc1, ADC_CHANNEL_1); + blowerCtrler.initializeAsHighPowerUartBlower(&huart2); airComCtrler.initialize(PC3, &hadc1, ADC_CHANNEL_0); - h2o2Sensor.initialize(&huart2, &hadc1, ADC_CHANNEL_10); + h2o2Sensor.initialize(&huart3, &hadc1, ADC_CHANNEL_10); } }; } // namespace iflytop \ No newline at end of file diff --git a/usrc/board_base/app_share/blower_controller.hpp b/usrc/board_base/app_share/blower_controller.hpp index 0b16f99..5b156ad 100644 --- a/usrc/board_base/app_share/blower_controller.hpp +++ b/usrc/board_base/app_share/blower_controller.hpp @@ -4,23 +4,55 @@ namespace iflytop { using namespace transmit_disfection_protocol; +typedef enum { + kIOBlower, + kHighPowerUartBlower, + kMiniPwmBlower, +} BlowerType_t; + class BlowerController { - ZGPIO m_Blowser_ctrlGpio; - ZADC m_Blowser_electricCurrentAdc; + BlowerType_t m_blowerType = kIOBlower; + + // kIOBlower + ZGPIO m_ctrlGpio; + ZADC m_iadc; + + // kHighPowerUartBlower + ModbusBlockHost m_modbusblock; public: void initialize(Pin_t ctrlGpio, ADC_HandleTypeDef* iadc, uint32_t ich) { - m_Blowser_ctrlGpio.initAsOutput(ctrlGpio, kxs_gpio_nopull, true, false); - m_Blowser_electricCurrentAdc.initialize("BlowserCurrentAdc", iadc, ich); + m_ctrlGpio.initAsOutput(ctrlGpio, kxs_gpio_nopull, true, false); + m_iadc.initialize("Blower-iadc", iadc, ich); + m_blowerType = kIOBlower; } - // FN - void blower_ctrl(int32_t val) { m_Blowser_ctrlGpio.write(val); } + void initializeAsHighPowerUartBlower(UART_HandleTypeDef* huart) { + m_modbusblock.initialize(huart); + m_blowerType = kHighPowerUartBlower; + } + + /*********************************************************************************************************************** + * FN * + ***********************************************************************************************************************/ + void blower_ctrl(int32_t val) { + if (m_blowerType == kIOBlower) { + m_ctrlGpio.write(val); + } else if (m_blowerType == kHighPowerUartBlower) { + if (val > 0) { + m_modbusblock.writeReg06(1, 0x2000, 1, 100); + } else { + m_modbusblock.writeReg06(1, 0x2000, 6, 100); + } + } + } void blower_ctrl_safe_valve(int32_t val) {} - int32_t blower_read_electric_current() { return blowserAdcToCurrent(m_Blowser_electricCurrentAdc.getCacheVal()); } - int32_t blower_read_iadc() { return m_Blowser_electricCurrentAdc.getCacheVal(); } + int32_t blower_read_electric_current() { return blowserAdcToCurrent(m_iadc.getCacheVal()); } + int32_t blower_read_iadc() { return m_iadc.getCacheVal(); } - // PP + /*********************************************************************************************************************** + * PP * + ***********************************************************************************************************************/ void fn_blower_ctrl(ProcessContext* cxt) { // blower_ctrl(GET_PARAM(0)); zcanbus_send_ack(cxt->packet, NULL, 0); @@ -34,6 +66,6 @@ class BlowerController { zcanbus_send_ack(cxt->packet, (uint8_t*)val, sizeof(val)); } - void periodTask() { m_Blowser_electricCurrentAdc.updateAdcValToCache(); } + void periodTask() { m_iadc.updateAdcValToCache(); } }; } // namespace iflytop \ No newline at end of file diff --git a/usrc/board_base/app_share/proportional_valve_ctrl.hpp b/usrc/board_base/app_share/proportional_valve_ctrl.hpp new file mode 100644 index 0000000..93ee3f9 --- /dev/null +++ b/usrc/board_base/app_share/proportional_valve_ctrl.hpp @@ -0,0 +1,45 @@ +#pragma once +#include "base/appdep.hpp" +#include "zsdk/preportional_valve/preportional_valve_ctrl.hpp" +namespace iflytop { +using namespace transmit_disfection_protocol; + +class ProportionalValveCtrl { + PreportionalValveCtrl valve; + + public: + void initialize(UART_HandleTypeDef* huart) { valve.initialize(huart); } + + + void fn_proportional_set_valve(ProcessContext* cxt) { + int32_t err = valve.setValvePos(GET_PARAM(0), GET_PARAM(1)); + if (err) { + zcanbus_send_errorack(cxt->packet, err); + } else { + zcanbus_send_ack(cxt->packet, NULL, 0); + } + } + + void fn_proportional_read_pos(ProcessContext* cxt) { + int32_t pos = 0; + int32_t err = valve.getValvePos(GET_PARAM(0), &pos); + if (err) { + zcanbus_send_errorack(cxt->packet, err); + } else { + zcanbus_send_ack(cxt->packet, (uint8_t*)&pos, sizeof(pos)); + } + } + + void fn_proportional_is_busy(ProcessContext* cxt) { + int32_t busy = 0; + int32_t err = valve.isBusy(GET_PARAM(0), &busy); + if (err) { + zcanbus_send_errorack(cxt->packet, err); + } else { + zcanbus_send_ack(cxt->packet, (uint8_t*)&busy, sizeof(busy)); + } + } + + private: +}; +} // namespace iflytop \ No newline at end of file diff --git a/usrc/board_base/baseboard/large_space_dm_liquid_ctrl_board_hal.cpp b/usrc/board_base/baseboard/large_space_dm_liquid_ctrl_board_hal.cpp index 66121fe..480504d 100644 --- a/usrc/board_base/baseboard/large_space_dm_liquid_ctrl_board_hal.cpp +++ b/usrc/board_base/baseboard/large_space_dm_liquid_ctrl_board_hal.cpp @@ -117,4 +117,38 @@ void LargeSpaceDMLiquidCtrlBoardHal::HUART3_INIT(int baudrate, uint32_t StopBits HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn); } +void LargeSpaceDMLiquidCtrlBoardHal::HUART2_INIT(int baudrate, uint32_t StopBits) { + __HAL_RCC_USART2_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + huart2.Instance = USART2; + huart2.Init.BaudRate = baudrate; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = StopBits; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart2) != HAL_OK) { + Error_Handler(); + } + + UART_HandleTypeDef* uartHandle = &huart3; + /**USART2 GPIO Configuration + PD5 ------> USART2_TX + PD6 ------> USART2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* USART2 interrupt Init */ + HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USART2_IRQn); +} diff --git a/usrc/board_base/baseboard/large_space_dm_liquid_ctrl_board_hal.hpp b/usrc/board_base/baseboard/large_space_dm_liquid_ctrl_board_hal.hpp index a69cc14..db78e55 100644 --- a/usrc/board_base/baseboard/large_space_dm_liquid_ctrl_board_hal.hpp +++ b/usrc/board_base/baseboard/large_space_dm_liquid_ctrl_board_hal.hpp @@ -1,6 +1,7 @@ #pragma once #include #include + #include "base/appdep.hpp" namespace iflytop { @@ -14,6 +15,7 @@ class LargeSpaceDMLiquidCtrlBoardHal { * @param StopBits UART_STOPBITS_1 UART_STOPBITS_2 */ static void HUART3_INIT(int baudrate, uint32_t StopBits); + static void HUART2_INIT(int baudrate, uint32_t StopBits = UART_STOPBITS_1); private: }; diff --git a/usrc/board_base/board_base.hpp b/usrc/board_base/board_base.hpp index 3dcd13f..7c242d5 100644 --- a/usrc/board_base/board_base.hpp +++ b/usrc/board_base/board_base.hpp @@ -4,9 +4,10 @@ #include "app_share/blower_controller.hpp" #include "app_share/h2o2_sensor_driver.hpp" #include "app_share/heater_controller.hpp" +#include "app_share/proportional_valve_ctrl.hpp" +#include "app_share/pxxpsbus.hpp" #include "app_share/tmc_motor_group.hpp" #include "app_share/warning_light_driver.hpp" -#include "app_share/pxxpsbus.hpp" // #include "baseboard/large_space_dm_liquid_ctrl_board_hal.hpp" #include "baseboard/large_space_dm_power_ctrl_board.hpp" diff --git a/usrc/protocol_processer_impl/pipe_dm_liquid_ctrl_board_pp.hpp b/usrc/protocol_processer_impl/pipe_dm_liquid_ctrl_board_pp.hpp new file mode 100644 index 0000000..a54f75d --- /dev/null +++ b/usrc/protocol_processer_impl/pipe_dm_liquid_ctrl_board_pp.hpp @@ -0,0 +1,64 @@ +#pragma once +#include "board/pipe_dm_liquid_ctrl_board.hpp" +namespace iflytop { + +using namespace std; +using namespace zscanprotocol; +using namespace transmit_disfection_protocol; + +// ------------------------------------------------------ +#define TAG "LiquidCtrl" +#define ThisClass PipeDMLiquidCtrlBoardPP +#define DEVICE PipeDMLiquidCtrlBoard::ins() + +// ------------------------------------------------------ + +class PipeDMLiquidCtrlBoardPP : public IProtocolProcesser { + public: + static PipeDMLiquidCtrlBoardPP* ins() { + static PipeDMLiquidCtrlBoardPP ins; + return &ins; + } + virtual const char* getName() override { return "LiquidCtrlBoardCmdProcesser"; }; + + virtual void initialize() override { + REG_FN(fn_evaporation_tank_water_sensor_read_state); + REG_FN(fn_device_bottom_water_sensor_read_state); + // + BIND_FN(WarningLightDriver, &DEVICE->wlDriver, fn_triple_warning_light_ctl); + + BIND_FN(TmcMotorGroup, &DEVICE->tmcPowerGroup, fn_pump_rotate); + BIND_FN(TmcMotorGroup, &DEVICE->tmcPowerGroup, fn_pump_stop); + BIND_FN(TmcMotorGroup, &DEVICE->tmcPowerGroup, fn_pump_set_ihold_irun_idelay); + BIND_FN(TmcMotorGroup, &DEVICE->tmcPowerGroup, fn_pump_set_acc); + BIND_FN(TmcMotorGroup, &DEVICE->tmcPowerGroup, fn_pump_set_ramp); + BIND_FN(TmcMotorGroup, &DEVICE->tmcPowerGroup, fn_pump_set_tzw); + BIND_FN(TmcMotorGroup, &DEVICE->tmcPowerGroup, fn_pump_set_subic_reg); + BIND_FN(TmcMotorGroup, &DEVICE->tmcPowerGroup, fn_pump_get_subic_reg); + BIND_FN(TmcMotorGroup, &DEVICE->tmcPowerGroup, fn_pump_ping); + + BIND_FN(PXXPSBus, &DEVICE->psBus, fn_psbus_read_data); + BIND_FN(PXXPSBus, &DEVICE->psBus, fn_psbus_scan); + + // kfnProportionalValveCtrl + BIND_FN(ProportionalValveCtrl, &DEVICE->proportionalValveCtrl, fn_proportional_set_valve); + BIND_FN(ProportionalValveCtrl, &DEVICE->proportionalValveCtrl, fn_proportional_read_pos); + BIND_FN(ProportionalValveCtrl, &DEVICE->proportionalValveCtrl, fn_proportional_is_busy); + } + + private: + void fn_evaporation_tank_water_sensor_read_state(ProcessContext* cxt) { + int32_t val = DEVICE->evaporationBinWS.read(); + zcanbus_send_ack(cxt->packet, (uint8_t*)&val, sizeof(val)); + } + void fn_device_bottom_water_sensor_read_state(ProcessContext* cxt) { + int32_t val = DEVICE->deviceBottomWS.read(); + zcanbus_send_ack(cxt->packet, (uint8_t*)&val, sizeof(val)); + } +}; + +#undef ThisClass +#undef DEVICE +#undef TAG + +} // namespace iflytop diff --git a/usrc/protocol_processer_impl/pipe_dm_power_ctrl_board_pp.hpp b/usrc/protocol_processer_impl/pipe_dm_power_ctrl_board_pp.hpp new file mode 100644 index 0000000..dd53ca9 --- /dev/null +++ b/usrc/protocol_processer_impl/pipe_dm_power_ctrl_board_pp.hpp @@ -0,0 +1,50 @@ +#pragma once +// +#include "board/pipe_dm_power_ctrl_board.hpp" + +namespace iflytop { +using namespace std; +using namespace zscanprotocol; +using namespace transmit_disfection_protocol; + +// /----------------------------- +#define TAG "PipeDMPowerCtrlBoardPP" +#define ThisClass PipeDMPowerCtrlBoardPP +#define DEVICE PipeDMPowerCtrlBoard::ins() +// /----------------------------- + +class PipeDMPowerCtrlBoardPP : public IProtocolProcesser { + public: + static PipeDMPowerCtrlBoardPP* ins() { + static PipeDMPowerCtrlBoardPP ins; + return &ins; + } + + virtual void initialize() override { + BIND_FN(HeaterController, &DEVICE->heaterCtrler, fn_heater_ctrl); + BIND_FN(HeaterController, &DEVICE->heaterCtrler, fn_heater_ctrl_safe_valve); + BIND_FN(HeaterController, &DEVICE->heaterCtrler, fn_heater_read_electric_current); + BIND_FN(HeaterController, &DEVICE->heaterCtrler, fn_heater_read_temperature_data); + + BIND_FN(BlowerController, &DEVICE->blowerCtrler, fn_blower_ctrl); + BIND_FN(BlowerController, &DEVICE->blowerCtrler, fn_blower_ctrl_safe_valve); + BIND_FN(BlowerController, &DEVICE->blowerCtrler, fn_blower_read_electric_current); + + BIND_FN(AirCompressorController, &DEVICE->airComCtrler, fn_air_compressor_ctrl); + BIND_FN(AirCompressorController, &DEVICE->airComCtrler, fn_air_compressor_ctrl_safe_valve); + BIND_FN(AirCompressorController, &DEVICE->airComCtrler, fn_air_compressor_read_electric_current); + + BIND_FN(H2O2SensorDriver, &DEVICE->h2o2Sensor, fn_h2o2_sensor_read_calibration_date); + BIND_FN(H2O2SensorDriver, &DEVICE->h2o2Sensor, fn_h2o2_sensor_read_sub_ic_errorcode); + BIND_FN(H2O2SensorDriver, &DEVICE->h2o2Sensor, fn_h2o2_sensor_read_sub_ic_reg); + } + virtual const char* getName() override { return "PipeDMPowerCtrlBoardPP"; }; + + private: +}; + +#undef ThisClass +#undef DEVICE +#undef TAG + +} // namespace iflytop diff --git a/zsdk b/zsdk index 5ac7e46..45dd762 160000 --- a/zsdk +++ b/zsdk @@ -1 +1 @@ -Subproject commit 5ac7e463529851914a95ecb77f17c7901fd01df6 +Subproject commit 45dd7621fe18ad66544d4b74c7cad454d6e3bb05