diff --git a/app_protocols/transmit_disfection_protocol b/app_protocols/transmit_disfection_protocol index 38ea8db..bbda34d 160000 --- a/app_protocols/transmit_disfection_protocol +++ b/app_protocols/transmit_disfection_protocol @@ -1 +1 @@ -Subproject commit 38ea8db7c4b148c6f21b03b1099a82258ed8cd3f +Subproject commit bbda34d9edff33e1da63790fe4320fedd2595e30 diff --git a/usrc/app/dmapp.cpp b/usrc/app/dmapp.cpp index 091e7f1..78ff815 100644 --- a/usrc/app/dmapp.cpp +++ b/usrc/app/dmapp.cpp @@ -157,7 +157,7 @@ void DisinfectionApp::initialize() { eValve.write(0); // 电磁阀闭合 zcanbus_send_ack(cxt->packet, NULL, 0); }); - REG_LAMADA_FN(kfn_air_tightness_test_recover_ch, [&](ProcessContext* cxt) { + REG_LAMADA_FN(kfn_air_tightness_test_open_ch, [&](ProcessContext* cxt) { airTightnessTestChGpio.write(0); // 连接空气 eValve.write(1); // 电磁阀打开 zcanbus_send_ack(cxt->packet, NULL, 0); diff --git a/usrc/app/ext_ch_selector_app.cpp b/usrc/app/ext_ch_selector_app.cpp new file mode 100644 index 0000000..533508e --- /dev/null +++ b/usrc/app/ext_ch_selector_app.cpp @@ -0,0 +1,23 @@ +#include "ext_ch_selector_app.hpp" + +using namespace iflytop; +using namespace transmit_disfection_protocol; +#define TAG "ExtChSelector" +ExtChSelector* ExtChSelector::ins() { + static ExtChSelector instance; + return &instance; +} +void ExtChSelector::initialize() { + ctrl0.initAsOutput(PinNull, kxs_gpio_nopull, false, false); + ctrl1.initAsOutput(PinNull, kxs_gpio_nopull, false, false); + ctrl2.initAsOutput(PinNull, kxs_gpio_nopull, false, false); + + REG_LAMADA_FN(kfn_ext_ch_selector_set_ch, [&](ProcessContext* cxt) { + int ch = GET_PARAM(0); + ZLOGI(TAG, "ext_ch_selector_set_ch : %d", ch); + if (ch == kext_ch_disinfection) { + } else if (ch == kext_ch_degradation) { + } else if (ch == kext_ch_dehumidification) { + } + }); +} \ No newline at end of file diff --git a/usrc/app/ext_ch_selector_app.hpp b/usrc/app/ext_ch_selector_app.hpp new file mode 100644 index 0000000..380f48b --- /dev/null +++ b/usrc/app/ext_ch_selector_app.hpp @@ -0,0 +1,37 @@ +#pragma once +#include "board/public_board.hpp" +#include "board_base/board_base.hpp" + +/** + * @brief + * + * + * 小空间和大空间硬件一样 + * + * 管道式-液路控制板 + * 相比于大空间消毒机,不同的点: + * 1.增加比例阀控制 + * 2.空压机通道控制 + * 管道式-功率板 + * 相比于大空间消毒机,不同的点: + * 1. 风机改成鼓风机(可控风速) + * + * 拉杆箱- + * + */ + +namespace iflytop { +using namespace transmit_disfection_protocol; + +class ExtChSelector { + public: + ZGPIO ctrl0; + ZGPIO ctrl1; + ZGPIO ctrl2; + + public: + static ExtChSelector* ins(); + + void initialize(); +}; +} // namespace iflytop \ No newline at end of file diff --git a/usrc/app/exth2o2_sensor.cpp b/usrc/app/exth2o2_sensor.cpp new file mode 100644 index 0000000..3746a39 --- /dev/null +++ b/usrc/app/exth2o2_sensor.cpp @@ -0,0 +1,69 @@ +#include "exth2o2_sensor.hpp" + +using namespace iflytop; +using namespace transmit_disfection_protocol; +#define TAG "ExtH2O2Sensor" + +static osThreadId H2O2SensorMonitorThreadId; +static osThreadId AlarmLightThreadId; + +static void c_onAlarmLightThread(void const* argument) { ExtH2O2Sensor::ins()->onAlarmLightThread(); } +static void c_onH2O2MonitorThread(void const* argument) { ExtH2O2Sensor::ins()->onH2O2MonitorThread(); } + +ExtH2O2Sensor* ExtH2O2Sensor::ins() { + static ExtH2O2Sensor instance; + return &instance; +} +void ExtH2O2Sensor::initialize() { + LargeSpaceDmPowerCtrlBoardHal::HUART3_INIT(19200, UART_STOPBITS_2); + H2O2ExtBoard::HADC1_INIT(); + + h2o2Sensor.initialize(&huart2, &hadc1, ADC_CHANNEL_10); + + m_alarmLightR.initAsOutput(PD7, kxs_gpio_pullup, true, false); + m_alarmLightG.initAsOutput(PD9, kxs_gpio_pullup, true, false); + m_alarmLightY.initAsOutput(PD8, kxs_gpio_pullup, true, false); + id_from_machine.initAsInput(PE8, kxs_gpio_nopull, kxs_gpio_no_irq, false); + + 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); + + osThreadDef(H2O2SensorMonitor, c_onH2O2MonitorThread, osPriorityNormal, 0, 1024); + H2O2SensorMonitorThreadId = osThreadCreate(osThread(H2O2SensorMonitor), NULL); + + osThreadDef(AlarmLightThread, c_onAlarmLightThread, osPriorityNormal, 0, 1024); + AlarmLightThreadId = osThreadCreate(osThread(AlarmLightThread), NULL); +} +void ExtH2O2Sensor::setAlarmLight(light_state_t state) { m_alarmLightState = state; } + +void ExtH2O2Sensor::setAlarmLight(bool r, bool g, bool y) { + m_alarmLightR.write(r); + m_alarmLightG.write(g); + m_alarmLightY.write(y); +} +void ExtH2O2Sensor::onAlarmLightThread() { + while (1) { + osDelay(500); + if (m_alarmLightState == kdisconnected) { + static bool state; + setAlarmLight(false, state, false); + state = !state; + } else if (m_alarmLightState == kconnected) { + setAlarmLight(false, true, false); + } else if (m_alarmLightState == kerror) { + setAlarmLight(true, false, false); + } + } +} + +void ExtH2O2Sensor::onH2O2MonitorThread() { + while (1) { + if (h2o2Sensor.h2o2_sensor_read_sub_ic_errorcode() != 0) { + ZLOGI(TAG, "H2O2 sensor sub ic error"); + setAlarmLight(kerror); + } else { + setAlarmLight(kconnected); + } + } +} diff --git a/usrc/app/exth2o2_sensor.hpp b/usrc/app/exth2o2_sensor.hpp new file mode 100644 index 0000000..8ce7cda --- /dev/null +++ b/usrc/app/exth2o2_sensor.hpp @@ -0,0 +1,45 @@ +#pragma once +#include "board/public_board.hpp" +#include "board_base/board_base.hpp" + +/** + * @brief + * + * + */ + +namespace iflytop { +using namespace transmit_disfection_protocol; + +class ExtH2O2Sensor { + public: + typedef enum { + kdisconnected, + kconnected, + kerror, + } light_state_t; + + public: + H2O2SensorDriver h2o2Sensor; + + ZGPIO m_alarmLightR; + ZGPIO m_alarmLightG; + ZGPIO m_alarmLightY; + + ZGPIO id_from_machine; // 消毒机上的开关 + light_state_t m_alarmLightState = kdisconnected; + + public: + static ExtH2O2Sensor* ins(); + + void initialize(); + + private: + void setAlarmLight(bool r, bool g, bool y); + void setAlarmLight(light_state_t state); + + public: + void onAlarmLightThread(); + void onH2O2MonitorThread(); +}; +} // namespace iflytop \ No newline at end of file diff --git a/usrc/app_main.cpp b/usrc/app_main.cpp index d64f720..4c952f5 100644 --- a/usrc/app_main.cpp +++ b/usrc/app_main.cpp @@ -3,6 +3,8 @@ // #include "app/dmapp.hpp" +#include "app/ext_ch_selector_app.hpp" +#include "app/exth2o2_sensor.hpp" #include "base/appdep.hpp" // #include "board/public_board.hpp" @@ -103,8 +105,12 @@ void umain() { case kDrawBarDMPowerCtrlBoard: DisinfectionApp::ins()->initialize(); break; - case kDrawBarDMExtBallValveCtrl: + case kDrawBarDMExtChSelector: + ExtChSelector::ins()->initialize(); + break; case kH2O2SensorBoard: + ExtH2O2Sensor::ins()->initialize(); + break; default: gInitErrorFlag = true; break; diff --git a/usrc/board/public_board.cpp b/usrc/board/public_board.cpp index a5771d1..2df44a5 100644 --- a/usrc/board/public_board.cpp +++ b/usrc/board/public_board.cpp @@ -87,21 +87,23 @@ void PublicBoard::canInit() { } void PublicBoard::initialize() { + // if (getDeviceIdFromFlash() <= 0) { + // BID0.initAsInput(PE1, kxs_gpio_pullup, kxs_gpio_no_irq, false); + // BID1.initAsInput(PE2, kxs_gpio_pullup, kxs_gpio_no_irq, false); + // BID2.initAsInput(PE3, kxs_gpio_pullup, kxs_gpio_no_irq, false); + // BID3.initAsInput(PE4, kxs_gpio_pullup, kxs_gpio_no_irq, false); + // BID4.initAsInput(PE5, kxs_gpio_pullup, kxs_gpio_no_irq, false); + // BID5.initAsInput(PE6, kxs_gpio_pullup, kxs_gpio_no_irq, false); + // BID6.initAsInput(PE7, kxs_gpio_pullup, kxs_gpio_no_irq, false); + // BID7.initAsInput(PE8, kxs_gpio_pullup, kxs_gpio_no_irq, false); + // } + debugUartInit(); canInit(); - - if (getDeviceIdFromFlash() <= 0) { - BID0.initAsInput(PE1, kxs_gpio_pullup, kxs_gpio_no_irq, false); - BID1.initAsInput(PE2, kxs_gpio_pullup, kxs_gpio_no_irq, false); - BID2.initAsInput(PE3, kxs_gpio_pullup, kxs_gpio_no_irq, false); - BID3.initAsInput(PE4, kxs_gpio_pullup, kxs_gpio_no_irq, false); - BID4.initAsInput(PE5, kxs_gpio_pullup, kxs_gpio_no_irq, false); - BID5.initAsInput(PE6, kxs_gpio_pullup, kxs_gpio_no_irq, false); - BID6.initAsInput(PE7, kxs_gpio_pullup, kxs_gpio_no_irq, false); - BID7.initAsInput(PE8, kxs_gpio_pullup, kxs_gpio_no_irq, false); + if (getDeviceIdFromFlash() == kH2O2SensorBoard) { + } else { + m_debugled.initAsOutput(H2O2_SENSOR_BOARD_DEBUG_LIGHT_GPIO, kxs_gpio_nopull, false, false); } - - m_debugled.initAsOutput(DEBUG_LIGHT_GPIO, kxs_gpio_nopull, false, false); } void PublicBoard::setDebugLightState(bool state) { m_debugled.write(state); } @@ -112,16 +114,17 @@ int PublicBoard::getBoardTypeId() { if (getDeviceIdFromFlash() > 0) { return getDeviceIdFromFlash(); } else { - int32_t id = 0; - id += BID0.read() ? 1 : 0; - id += BID1.read() ? 2 : 0; - id += BID2.read() ? 4 : 0; - id += BID3.read() ? 8 : 0; - id += BID4.read() ? 16 : 0; - id += BID5.read() ? 32 : 0; - id += BID6.read() ? 64 : 0; - id += BID7.read() ? 128 : 0; - return id; + return 0; + // int32_t id = 0; + // id += BID0.read() ? 1 : 0; + // id += BID1.read() ? 2 : 0; + // id += BID2.read() ? 4 : 0; + // id += BID3.read() ? 8 : 0; + // id += BID4.read() ? 16 : 0; + // id += BID5.read() ? 32 : 0; + // id += BID6.read() ? 64 : 0; + // id += BID7.read() ? 128 : 0; + // return id; } } int PublicBoard::getBoardId() { return IdMgr::ins().getBoardId(getBoardTypeId()); } diff --git a/usrc/board_base/app_share/blower_controller.hpp b/usrc/board_base/app_share/blower_controller.hpp index dda8e08..11474c9 100644 --- a/usrc/board_base/app_share/blower_controller.hpp +++ b/usrc/board_base/app_share/blower_controller.hpp @@ -20,13 +20,13 @@ class BlowerController { ModbusBlockHost m_modbusblock; // kMiniPwmBlower - static TIM_HandleTypeDef* m_miniPwmBlower_htim; - static uint32_t m_miniPwmBlower_channle; - static ZGPIO m_miniPwmBlower_enGpio; - static ZGPIO m_miniPwmBlower_fbGpio; + TIM_HandleTypeDef* m_miniPwmBlower_htim; + uint32_t m_miniPwmBlower_channle; + ZGPIO m_miniPwmBlower_enGpio; + ZGPIO m_miniPwmBlower_fbGpio; ZADC m_iadc; - bool m_iadcIsInit = fasle; + bool m_iadcIsInit = false; bool m_isInitialized = false; @@ -133,4 +133,4 @@ class BlowerController { m_miniPwmBlower_enGpio.write(duty != 0); } }; -} // namespace iflytop \ No newline at end of file +} // namespace iflytop diff --git a/usrc/board_base/baseboard/h2o2_ext_board.cpp b/usrc/board_base/baseboard/h2o2_ext_board.cpp new file mode 100644 index 0000000..5dfbd9b --- /dev/null +++ b/usrc/board_base/baseboard/h2o2_ext_board.cpp @@ -0,0 +1,53 @@ +#include "h2o2_ext_board.hpp" + +#include "base/appdep.hpp" + +using namespace iflytop; + +void H2O2ExtBoard::HADC1_INIT() { + static bool inited = false; + if (inited) return; + inited = true; + + __HAL_RCC_ADC1_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + + ADC_ChannelConfTypeDef sConfig = {0}; + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; + hadc1.Init.Resolution = ADC_RESOLUTION_12B; + hadc1.Init.ScanConvMode = DISABLE; + hadc1.Init.ContinuousConvMode = DISABLE; + hadc1.Init.DiscontinuousConvMode = DISABLE; + hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; + hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hadc1.Init.NbrOfConversion = 1; + hadc1.Init.DMAContinuousRequests = DISABLE; + hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + if (HAL_ADC_Init(&hadc1) != HAL_OK) { + Error_Handler(); + } + + /**ADC1 GPIO Configuration + PC0 ------> ADC1_IN10 + PC1 ------> ADC1_IN11 + */ + GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* ADC1 interrupt Init */ + HAL_NVIC_SetPriority(ADC_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(ADC_IRQn); + + sConfig.Channel = ADC_CHANNEL_0; + sConfig.Rank = 1; + sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { + Error_Handler(); + } +} diff --git a/usrc/board_base/baseboard/h2o2_ext_board.hpp b/usrc/board_base/baseboard/h2o2_ext_board.hpp new file mode 100644 index 0000000..6c3f679 --- /dev/null +++ b/usrc/board_base/baseboard/h2o2_ext_board.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "base/appdep.hpp" + + +namespace iflytop { +class H2O2ExtBoard { + public: + static void HADC1_INIT(); +}; +} // namespace iflytop \ No newline at end of file diff --git a/usrc/board_base/board_base.hpp b/usrc/board_base/board_base.hpp index 7164c57..22970f2 100644 --- a/usrc/board_base/board_base.hpp +++ b/usrc/board_base/board_base.hpp @@ -11,4 +11,5 @@ // #include "baseboard/large_space_dm_liquid_ctrl_board_hal.hpp" #include "baseboard/large_space_dm_power_ctrl_board.hpp" -#include "baseboard/dbdm_power_ctrl_board.hpp" \ No newline at end of file +#include "baseboard/dbdm_power_ctrl_board.hpp" +#include "board_base/baseboard/h2o2_ext_board.hpp" \ No newline at end of file diff --git a/usrc/project_configs.h b/usrc/project_configs.h index b165578..9ebe3a3 100644 --- a/usrc/project_configs.h +++ b/usrc/project_configs.h @@ -15,12 +15,13 @@ * @brief 基础配置 * */ -#define SOFTWARE_VERSION 1 // 软件版本 -#define HARDWARE_VERSION 1 // 硬件版本 -#define PROJECT "transmit_disinfection_micro" // 工程名称 -#define SN_HEADER "SN" // SN号前缀 -#define DEBUG_UART huart1 // 调试串口 -#define DEBUG_LIGHT_GPIO PE0 // 调试指示灯 +#define SOFTWARE_VERSION 1 // 软件版本 +#define HARDWARE_VERSION 1 // 硬件版本 +#define PROJECT "transmit_disinfection_micro" // 工程名称 +#define SN_HEADER "SN" // SN号前缀 +#define DEBUG_UART huart1 // 调试串口 +#define DEBUG_LIGHT_GPIO PE0 // 调试指示灯 +#define H2O2_SENSOR_BOARD_DEBUG_LIGHT_GPIO PE2 // 过氧化氢板-调试指示灯 #define BOARD_TYPE_ID_FLASH_ADD 0x080E0000 #define SDK_CFG__SN_FLASH_ADDR 0x080E0004 //