Browse Source

update

master
zhaohe 1 year ago
parent
commit
a715a9a156
  1. 2
      .project
  2. 4
      .settings/language.settings.xml
  3. 3
      .vscode/settings.json
  4. 4
      Core/Src/usart.c
  5. 2
      README.md
  6. 2
      iflytop_canbus_protocol
  7. 10
      large_space_disinfection__power_control_board Debug.launch
  8. 0
      large_space_disinfection__power_control_board.cfg
  9. 9
      large_space_disinfection__power_control_board.ioc
  10. 0
      large_space_disinfection__power_control_board.launch
  11. 227
      usrc/base/hardware.cpp
  12. 2
      usrc/base/hardware.hpp
  13. 56
      usrc/project_configs.h
  14. 28
      usrc/protocol_impl/basic/fn_mgr.cpp
  15. 35
      usrc/protocol_impl/basic/fn_mgr.hpp
  16. 0
      usrc/protocol_impl/basic/report_flag_mgr.cpp
  17. 0
      usrc/protocol_impl/basic/report_flag_mgr.hpp
  18. 35
      usrc/protocol_impl/function_impl/afunction_impl.hpp
  19. 91
      usrc/protocol_impl/function_impl/basic_fn.cpp
  20. 43
      usrc/protocol_impl/function_impl/h2o2_fn_impl.cpp
  21. 29
      usrc/protocol_impl/function_impl/heater_fn_impl.cpp
  22. 243
      usrc/protocol_impl/protocol_impl_service.cpp
  23. 2
      zsdk

2
.project

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>dbdb_power_control_mini_board</name>
<name>large_space_disinfection__power_control_board</name>
<comment></comment>
<projects>
</projects>

4
.settings/language.settings.xml

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1573541530361677026" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="709724336485417758" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@ -16,7 +16,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1558051425230093555" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="725214441617001229" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

3
.vscode/settings.json

@ -112,7 +112,8 @@
"zaf_delay.h": "c",
"string.h": "c",
"zlog.h": "c",
"zbase.h": "c"
"zbase.h": "c",
"*.bak": "c"
},
"files.autoGuessEncoding": false
}

4
Core/Src/usart.c

@ -103,9 +103,9 @@ void MX_USART3_UART_Init(void)
/* USER CODE END USART3_Init 1 */
huart3.Instance = USART3;
huart3.Init.BaudRate = 9600;
huart3.Init.BaudRate = 19200;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.StopBits = UART_STOPBITS_2;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;

2
README.md

@ -6,4 +6,6 @@
V2:
完成需求
large_space_disinfection__power_control_board
```

2
iflytop_canbus_protocol

@ -1 +1 @@
Subproject commit bd49987090f3666d4d68713f0ba4ca4d31cc3a5f
Subproject commit 955c39e8b8aa1480b0846a1ae26aaa6ba4e38ce0

10
dbdb_power_control_mini_board Debug.launch → large_space_disinfection__power_control_board Debug.launch

@ -12,7 +12,7 @@
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.ip_address_local" value="localhost"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.limit_swo_clock.enabled" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.limit_swo_clock.value" value=""/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.loadList" value="{&quot;fItems&quot;:[{&quot;fIsFromMainTab&quot;:true,&quot;fPath&quot;:&quot;Debug/dbdb_power_control_mini_board.elf&quot;,&quot;fProjectName&quot;:&quot;dbdb_power_control_mini_board&quot;,&quot;fPerformBuild&quot;:true,&quot;fDownload&quot;:true,&quot;fLoadSymbols&quot;:true}]}"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.loadList" value="{&quot;fItems&quot;:[{&quot;fIsFromMainTab&quot;:true,&quot;fPath&quot;:&quot;Debug/large_space_disinfection__power_control_board.elf&quot;,&quot;fProjectName&quot;:&quot;large_space_disinfection__power_control_board&quot;,&quot;fPerformBuild&quot;:true,&quot;fDownload&quot;:true,&quot;fLoadSymbols&quot;:true}]}"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.override_start_address_mode" value="default"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.remoteCommand" value="target remote"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.startServer" value="true"/>
@ -32,7 +32,7 @@
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_shared_stlink" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.frequency" value="0"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.halt_all_on_reset" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.log_file" value="D:\workspace\p_lusterinc\dbdb_power_control_mini_board\Debug\st-link_gdbserver_log.txt"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.log_file" value="D:\workspace\p_lusterinc\large_space_disinfection__power_control_board\Debug\st-link_gdbserver_log.txt"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.low_power_debug" value="disable"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.max_halt_delay" value="2"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.reset_strategy" value="system_reset"/>
@ -67,13 +67,13 @@
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="remote"/>
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug/dbdb_power_control_mini_board.elf"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="dbdb_power_control_mini_board"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug/large_space_disinfection__power_control_board.elf"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="large_space_disinfection__power_control_board"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1853947771"/>
<booleanAttribute key="org.eclipse.debug.core.ATTR_FORCE_SYSTEM_CONSOLE_ENCODING" value="false"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/dbdb_power_control_mini_board"/>
<listEntry value="/large_space_disinfection__power_control_board"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>

0
dbdb_power_control_mini_board.cfg → large_space_disinfection__power_control_board.cfg

9
dbdb_power_control_mini_board.ioc → large_space_disinfection__power_control_board.ioc

@ -263,8 +263,8 @@ ProjectManager.MultiThreaded=true
ProjectManager.NoMain=false
ProjectManager.PreviousToolchain=STM32CubeIDE
ProjectManager.ProjectBuild=false
ProjectManager.ProjectFileName=dbdb_power_control_mini_board.ioc
ProjectManager.ProjectName=dbdb_power_control_mini_board
ProjectManager.ProjectFileName=large_space_disinfection__power_control_board.ioc
ProjectManager.ProjectName=large_space_disinfection__power_control_board
ProjectManager.ProjectStructure=
ProjectManager.RegisterCallBack=
ProjectManager.StackSize=0x2000
@ -356,8 +356,9 @@ USART1.VirtualMode=VM_ASYNC
USART2.BaudRate=19200
USART2.IPParameters=VirtualMode,BaudRate
USART2.VirtualMode=VM_ASYNC
USART3.BaudRate=9600
USART3.IPParameters=VirtualMode,BaudRate
USART3.BaudRate=19200
USART3.IPParameters=VirtualMode,BaudRate,StopBits
USART3.StopBits=STOPBITS_2
USART3.VirtualMode=VM_ASYNC
VP_CRC_VS_CRC.Mode=CRC_Activate
VP_CRC_VS_CRC.Signal=CRC_VS_CRC

0
dbdb_power_control_mini_board.launch → large_space_disinfection__power_control_board.launch

227
usrc/base/hardware.cpp

@ -3,6 +3,7 @@
#include "adc.h"
#include "tim.h"
#include "zsdk/hmp110/hmp110.hpp"
#include "zsdk/hpp272/hpp272.hpp"
#include "zsdk/zcanreceiver/zcanreceiver.hpp"
#define TAG "HARD"
using namespace iflytop;
@ -14,74 +15,130 @@ using namespace iflytop;
static osThreadId H2O2CaptureThreadId;
static osThreadId AdcCaptureThreadId;
// MINI_PWM 鼓风机
static TIM_HandleTypeDef* m_miniPwmBlower_htim;
static uint32_t m_miniPwmBlower_channle;
static ZGPIO m_miniPwmBlower_enGpio;
static ZGPIO m_miniPwmBlower_fbGpio;
// 加热片控制
static ZGPIO m_Heater_ctrlGpio;
static ZGPIO m_Heater_safeCtrlGpio;
static ZADC m_Heater_electricCurrentAdc;
static ZADC m_Heater_temperatureAdc;
ZGPIO m_Heater_ctrlGpio;
ZGPIO m_Heater_safeCtrlGpio;
ZADC m_Heater_electricCurrentAdc;
ZADC m_Heater_temperatureAdc;
// 鼓风机
ZGPIO m_Blowser_ctrlGpio;
ZGPIO m_Blowser_safeCtrlGpio;
ZADC m_Blowser_electricCurrentAdc;
// 空压机
ZGPIO m_AirCompressor_ctrlGpio;
ZGPIO m_AirCompressor_safeCtrlGpio;
ZADC m_AirCompressor_electricCurrentAdc;
// H2O2过氧化氢
static ModbusBlockHost m_H2o2Sensor_TempSensorModbusBlockHost; //
static ZADC m_H2o2Sensor_H2O2Adc; // H2O2传感器控制
static HMP110 m_H2o2Sensor_HMP110; // H2O2传感器
static int32_t m_hmp100_detectId = -1;
#ifdef H2O2_SENSOR_TYPE_HMP110
static ModbusBlockHost m_H2o2Sensor_ModbusBlockHost; //
static ZADC m_H2o2Sensor_H2O2Adc; // H2O2传感器控制
static HMP110 m_H2o2Sensor_HMP110; // H2O2传感器
static int32_t m_h2o2sensor_detectId = -1;
#endif
#ifdef H2O2_SENSOR_TYPE_HPP272
static ModbusBlockHost m_H2o2Sensor_ModbusBlockHost; //
static HPP272 m_H2o2Sensor_HPP272; // H2O2传感器
static int32_t m_h2o2sensor_detectId = -1;
#endif
/***********************************************************************************************************************
* FUNC *
***********************************************************************************************************************/
static void onAdcCaptureThreadId(void const* argument) {
while (1) {
osDelay(30);
m_Heater_electricCurrentAdc.updateAdcValToCache();
m_Heater_temperatureAdc.updateAdcValToCache();
// m_Heater_electricCurrentAdc.updateAdcValToCache();
// m_Heater_temperatureAdc.updateAdcValToCache();
// m_Blowser_electricCurrentAdc.updateAdcValToCache();
// m_AirCompressor_electricCurrentAdc.updateAdcValToCache();
}
}
static void onH2O2CaptureThreadId(void const* argument) {
while (1) {
osDelay(1000);
if (m_hmp100_detectId > 0) {
#ifdef H2O2_SENSOR_TYPE_HMP110
if (m_h2o2sensor_detectId > 0) {
m_H2o2Sensor_H2O2Adc.updateAdcValToCache();
m_H2o2Sensor_HMP110.updateSensorDataAndErrorcode();
// float mv = adcv / 4095.0 * 3.3 * 1000;
// float ma = mv / 150.0;
// float ppm = (ma - 4) / (20 - 4) * 2000;
}
#endif
}
}
void Hardware::init() {
m_miniPwmBlower_htim = &htim3;
m_miniPwmBlower_channle = TIM_CHANNEL_3;
m_miniPwmBlower_enGpio.initAsOutput(PC10, kxs_gpio_nopull, true, false);
m_miniPwmBlower_fbGpio.initAsInput(PC9, kxs_gpio_nopull, kxs_gpio_rising_irq, false);
/***********************************************************************************************************************
* *
***********************************************************************************************************************/
m_Heater_ctrlGpio.initAsOutput(HEATER_CTRL_GPIO, kxs_gpio_nopull, true, false);
m_Heater_safeCtrlGpio.initAsOutput(HEATER_SAFE_CTRL_GPIO, kxs_gpio_nopull, true, false);
m_Heater_electricCurrentAdc.initialize(&hadc1, HEATER_ELECTRIC_CURRENT_ADC_CH);
m_Heater_temperatureAdc.initialize(&hadc1, HEATER_TEMPERATURE_ADC_CH);
/***********************************************************************************************************************
* *
***********************************************************************************************************************/
m_Heater_ctrlGpio.initAsOutput(PC6, kxs_gpio_nopull, true, false);
m_Heater_safeCtrlGpio.initAsOutput(PC7, kxs_gpio_nopull, true, false);
// m_Heater_electricCurrentAdc.initialize(&hadc1, ADC_CHANNEL_0); //暂时注释掉,板子少了一个ADC,该ADC用于H2O2浓度
m_Heater_temperatureAdc.initialize(&hadc1, ADC_CHANNEL_1); // PA0
m_Blowser_ctrlGpio.initAsOutput(BLOWER_CTRL_GPIO, kxs_gpio_nopull, true, false);
m_Blowser_safeCtrlGpio.initAsOutput(BLOWER_SAFE_CTRL_GPIO, kxs_gpio_nopull, true, false);
m_Blowser_electricCurrentAdc.initialize(&hadc1, BLOWER_ELECTRIC_CURRENT_ADC_CH);
ZASSERT(huart2.Init.BaudRate == 19200);
m_H2o2Sensor_TempSensorModbusBlockHost.initialize(&huart2);
m_H2o2Sensor_H2O2Adc.initialize(&hadc1, ADC_CHANNEL_0); // PA0
m_H2o2Sensor_HMP110.init(&m_H2o2Sensor_TempSensorModbusBlockHost);
/***********************************************************************************************************************
* *
***********************************************************************************************************************/
m_AirCompressor_ctrlGpio.initAsOutput(AIRCOMPRESSOR_CTRL_GPIO, kxs_gpio_nopull, true, false);
m_AirCompressor_safeCtrlGpio.initAsOutput(AIRCOMPRESSOR_SAFE_CTRL_GPIO, kxs_gpio_nopull, true, false);
m_AirCompressor_electricCurrentAdc.initialize(&hadc1, AIRCOMPRESSOR_ELECTRIC_CURRENT_ADC_CH);
/***********************************************************************************************************************
* H2O2传感器 *
***********************************************************************************************************************/
/**
* @brief HMP110
*/
osDelay(2000); // 等待传感器上电
#ifdef H2O2_SENSOR_TYPE_HMP110
ZASSERT(huart2.Init.BaudRate == 19200);
m_H2o2Sensor_ModbusBlockHost.initialize(&huart2);
m_H2o2Sensor_H2O2Adc.initialize(&hadc1, ADC_CHANNEL_0); // PA0
m_H2o2Sensor_HMP110.init(&m_H2o2Sensor_ModbusBlockHost);
if (m_H2o2Sensor_HMP110.ping(1)) {
m_hmp100_detectId = 1;
m_h2o2sensor_detectId = 1;
}
if (m_H2o2Sensor_HMP110.ping(240)) {
m_hmp100_detectId = 240;
m_h2o2sensor_detectId = 240;
}
m_H2o2Sensor_HMP110.setid(m_hmp100_detectId);
ZLOGI(TAG, "H2O2 Sensor detect id: %d", m_hmp100_detectId);
m_H2o2Sensor_HMP110.setid(m_h2o2sensor_detectId);
ZLOGI(TAG, "H2O2 HMP110 Sensor detect id: %d", m_h2o2sensor_detectId);
#endif
#ifdef H2O2_SENSOR_TYPE_HPP272
ZASSERT(huart3.Init.BaudRate == 19200);
ZASSERT(huart3.Init.StopBits == UART_STOPBITS_2);
m_H2o2Sensor_ModbusBlockHost.initialize(&huart3);
m_H2o2Sensor_HPP272.init(&m_H2o2Sensor_ModbusBlockHost);
if (m_H2o2Sensor_HPP272.ping(1)) {
m_h2o2sensor_detectId = 1;
}
if (m_H2o2Sensor_HPP272.ping(240)) {
m_h2o2sensor_detectId = 240;
}
m_H2o2Sensor_HPP272.setid(m_h2o2sensor_detectId);
ZLOGI(TAG, "H2O2 HPP272 Sensor detect id: %d", m_h2o2sensor_detectId);
#endif
osThreadDef(AdcCaptureThread, onAdcCaptureThreadId, osPriorityNormal, 0, 1024);
AdcCaptureThreadId = osThreadCreate(osThread(AdcCaptureThread), NULL);
@ -93,62 +150,62 @@ void Hardware::init() {
/***********************************************************************************************************************
* FUMP_IMPL *
***********************************************************************************************************************/
void Hardware::mini_pwm_blower_ctrl(int32_t duty) {
duty = 100 - duty;
if (duty < 0) duty = 0;
if (duty > 100) duty = 100;
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = duty / 100.0 * __HAL_TIM_GET_AUTORELOAD(m_miniPwmBlower_htim);
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
HAL_TIM_PWM_ConfigChannel(m_miniPwmBlower_htim, &sConfigOC, m_miniPwmBlower_channle);
HAL_TIM_PWM_Stop(m_miniPwmBlower_htim, m_miniPwmBlower_channle);
HAL_TIM_PWM_Start(m_miniPwmBlower_htim, m_miniPwmBlower_channle);
m_miniPwmBlower_enGpio.write(duty != 0);
}
int32_t Hardware::mini_pwm_blower_read_fbcount() { //
return 0;
}
void Hardware::heater_ctrl(int32_t val) { m_Heater_ctrlGpio.write(val); }
void Hardware::heater_ctrl_safe_valve(int32_t val) { m_Heater_safeCtrlGpio.write(val); }
int32_t Hardware::heater_read_electric_current() {
// float mv = adcv / 4095.0 * 3.3 * 1000;
// float ma = mv / 150.0;
int32_t adcv = m_Heater_electricCurrentAdc.getCacheVal();
int32_t ma = (adcv / 4095.0 * 3.3 * 1000) / 150.0;
return ma;
}
int32_t Hardware::heater_read_temperature_data() {
// float mv = adcv / 4095.0 * 3.3 * 1000;
// float ma = mv / 150.0;
// float ppm = (ma - 4) / (20 - 4) * 2000;
int32_t adcv = m_Heater_temperatureAdc.getCacheVal();
int32_t ma = (adcv / 4095.0 * 3.3 * 1000) / 150.0;
int32_t temp = (ma - 4) / (20 - 4) * (3000 - 0) + 0;
return temp; // C*10
}
/***********************************************************************************************************************
* H2O2 *
***********************************************************************************************************************/
bool Hardware::h2o2_sensor_is_online() {
if (m_hmp100_detectId <= 0) {
return false;
}
#ifdef H2O2_SENSOR_TYPE_HMP110
if (m_h2o2sensor_detectId <= 0) return false;
int32_t ecode = m_H2o2Sensor_HMP110.read_cache_errorcode();
if (ecode == -1) {
return false;
}
if (ecode == -1) return false;
#endif
#ifdef H2O2_SENSOR_TYPE_HPP272
if (m_h2o2sensor_detectId <= 0) return false;
int32_t ecode = m_H2o2Sensor_HPP272.read_cache_errorcode();
if (ecode == -1) return false;
#endif
return true;
}
int32_t Hardware::h2o2_sensor_read_calibration_date(int32_t* year, int32_t* month, int32_t* day) { return 0; }
int32_t Hardware::h2o2_sensor_read_sub_ic_errorcode() { return m_H2o2Sensor_HMP110.read_cache_errorcode(); }
int32_t Hardware::h2o2_sensor_read_sub_ic_reg(int32_t add, uint16_t* val, size_t len) { return m_H2o2Sensor_HMP110.read_reg(add, val, len); }
int32_t Hardware::h2o2_sensor_read_calibration_date(int32_t* year, int32_t* month, int32_t* day) { //
return 0;
}
int32_t Hardware::h2o2_sensor_read_sub_ic_errorcode() { //
#ifdef H2O2_SENSOR_TYPE_HPP272
return m_H2o2Sensor_HPP272.read_cache_errorcode();
#endif
#ifdef H2O2_SENSOR_TYPE_HMP110
return m_H2o2Sensor_HMP110.read_cache_errorcode();
#endif
}
int32_t Hardware::h2o2_sensor_read_sub_ic_reg(int32_t add, uint16_t* val, size_t len) { //
#ifdef H2O2_SENSOR_TYPE_HPP272
return m_H2o2Sensor_HPP272.read_reg(add, val, len);
#endif
#ifdef H2O2_SENSOR_TYPE_HMP110
return m_H2o2Sensor_HMP110.read_reg(add, val, len);
#endif
}
int32_t Hardware::h2o2_sensor_data(report_h2o2_data_t* readdata) {
#ifdef H2O2_SENSOR_TYPE_HMP110
int32_t ecode = m_H2o2Sensor_HMP110.read_cache_errorcode();
int32_t h2o2adcVal = m_H2o2Sensor_H2O2Adc.getCacheVal();
HMP110::hmp110_sensordata_t sensordata;
@ -178,4 +235,26 @@ int32_t Hardware::h2o2_sensor_data(report_h2o2_data_t* readdata) {
sensordata.enthalpy);
return 0;
#endif
#ifdef H2O2_SENSOR_TYPE_HPP272
int32_t ecode = m_H2o2Sensor_HPP272.read_cache_errorcode();
HPP272::hpp272_data_t sensordata;
m_H2o2Sensor_HPP272.read_cache_sensor_data(&sensordata);
readdata->subid = 0;
readdata->sensor_error = ecode != 0;
readdata->h2o2 = sensordata.hydrogen_peroxide_volume / 10.0;
readdata->humid = sensordata.relative_humidity / 10.0;
readdata->temp = sensordata.temperature1 / 10.0;
readdata->saturation = sensordata.h2o_h2o2_rs / 10.0;
ZLOGI(TAG, "h2o2 %d, humid %d, temp %d, sat %d",
sensordata.hydrogen_peroxide_volume / 10, //
sensordata.relative_humidity / 10, //
sensordata.temperature1 / 10, //
sensordata.h2o_h2o2_rs / 10);
return 0;
#endif
}

2
usrc/base/hardware.hpp

@ -15,6 +15,8 @@ void hardware_init();
namespace iflytop {
class Hardware {
public:
static Hardware& ins() {
static Hardware ins;

56
usrc/project_configs.h

@ -2,6 +2,15 @@
#include "iflytop_canbus_protocol/iflytop_canbus_protocol.hpp"
/***********************************************************************************************************************
* SDK_CONFIG *
***********************************************************************************************************************/
#define SDK_DELAY_US_TIMER htim6 // 微秒延迟定时器,注意该延时定时器需要按照以下文档进行配置 http://192.168.1.3:3000/zwikipedia/iflytop_wikipedia/src/branch/master/doc/stm32cubemx_us_timer.md
#define SDK_IRQ_PREEMPTPRIORITY_DEFAULT 5 // IO中断默认中断等级
#define SDK_CFG__CFG_FLASH_ADDR 0x080C0000 //
#define SDK_CFG__SN_FLASH_ADDR 0x080E0000 //
#define SDK_MAX_TASK 10
/***********************************************************************************************************************
* PROJECT_CONFIG *
***********************************************************************************************************************/
@ -9,29 +18,28 @@
* @brief
*
*/
#define SOFTWARE_VERSION 2
#define HARDWARE_VERSION 1
#define PROJECT "dbdb_power_control_mini_board"
#define SN_HEADER "SN"
#define DEVICE_ID (kFixBoardId_PowerControlMiniBoard)
#define DEBUG_UART huart1 // 调试串口
#define DEBUG_LIGHT_GPIO PE8 // 调试指示灯
#define SOFTWARE_VERSION 1 // 软件版本
#define HARDWARE_VERSION 1 // 硬件版本
#define PROJECT "large_space_disinfection__power_control_board" // 工程名称
#define SN_HEADER "SN" // SN号前缀
#define DEVICE_ID (kFixBoardId_PowerControl) // 设备ID
#define PROJECT_ID klarge_space_disinfection_machine // 项目ID
#define BOARD_TYPE kBoardType_PowerControl // 板子类型
#define DEBUG_UART huart1 // 调试串口
#define DEBUG_LIGHT_GPIO PE8 // 调试指示灯
/**
* @brief
*/
#define MOTOR_SPI hspi1
#define MOTOR_CH(n) (n)
#define MOTOR2_CSN PA4 //
#define MOTOR2_ENN PE11
#define MOTOR1_CSN PC4 //
#define MOTOR1_ENN PE12
#define HEATER_CTRL_GPIO PC6
#define HEATER_SAFE_CTRL_GPIO PC7
#define HEATER_ELECTRIC_CURRENT_ADC_CH ADC_CHANNEL_0
#define HEATER_TEMPERATURE_ADC_CH ADC_CHANNEL_8
/***********************************************************************************************************************
* SDK_CONFIG *
***********************************************************************************************************************/
#define SDK_DELAY_US_TIMER htim6 // 微秒延迟定时器,注意该延时定时器需要按照以下文档进行配置 http://192.168.1.3:3000/zwikipedia/iflytop_wikipedia/src/branch/master/doc/stm32cubemx_us_timer.md
#define SDK_IRQ_PREEMPTPRIORITY_DEFAULT 5 // IO中断默认中断等级
#define SDK_CFG__CFG_FLASH_ADDR 0x080C0000 //
#define SDK_CFG__SN_FLASH_ADDR 0x080E0000 //
#define SDK_MAX_TASK 10
#define BLOWER_CTRL_GPIO PC4
#define BLOWER_SAFE_CTRL_GPIO PC5
#define BLOWER_ELECTRIC_CURRENT_ADC_CH ADC_CHANNEL_1
#define AIRCOMPRESSOR_CTRL_GPIO PC2
#define AIRCOMPRESSOR_SAFE_CTRL_GPIO PC3
#define AIRCOMPRESSOR_ELECTRIC_CURRENT_ADC_CH ADC_CHANNEL_2
#define H2O2_SENSOR_TYPE_HPP272
// #define H2O2_SENSOR_TYPE_HMP110

28
usrc/protocol_impl/basic/fn_mgr.cpp

@ -0,0 +1,28 @@
#include "fn_mgr.hpp"
typedef struct {
uint16_t function_id;
protocol_impl_func_t fn;
} fn_map_t;
fn_map_t fn_map[256];
int fn_map_size = 0;
void fn_map_reg(uint16_t function_id, protocol_impl_func_t fn) {
if (fn_map_size >= 256) {
printf("fn_map is full\n");
return;
}
fn_map[fn_map_size].function_id = function_id;
fn_map[fn_map_size].fn = fn;
fn_map_size++;
}
bool fn_map_process(uint16_t function_id, uint8_t from, uint8_t to, uint8_t* rawpacket, size_t len) {
for (int i = 0; i < fn_map_size; i++) {
if (fn_map[i].function_id == function_id) {
fn_map[i].fn(from, to, (zcanbus_packet_t*)rawpacket, len);
return true;
}
}
return false;
}

35
usrc/protocol_impl/basic/fn_mgr.hpp

@ -0,0 +1,35 @@
#include <stddef.h>
#include <stdio.h>
#include "base/config_service.hpp"
#include "zsdk/zsdk.hpp"
/***********************************************************************************************************************
* MARCO *
***********************************************************************************************************************/
#define CHECK_PARAM_LEN(_paramNum, expectNum) \
if (_paramNum != expectNum) { \
zcanbus_send_errorack(packet, kerr_invalid_param_num); \
return; \
}
#define CHECK_MOTOR_INDEX(_subindex) \
if (_subindex > Hardware::ins().motorNum()) { \
zcanbus_send_errorack(packet, kerr_invalid_param); \
return; \
}
#define GET_PARAM(buff, off) ((((int32_t*)(buff))[off]))
#define PARAM_LEN() ((len - sizeof(zcanbus_packet_t)) / 4)
#define ZCLEAR_BIT(val, bit) (val &= ~(1 << bit))
#define ZSET_BIT(val, bit) (val |= (1 << bit))
/***********************************************************************************************************************
* FUNC *
***********************************************************************************************************************/
typedef void(*protocol_impl_func_t)(uint8_t from, uint8_t to, zcanbus_packet_t* rawpacket, size_t len);
void fn_map_reg(uint16_t function_id, protocol_impl_func_t funtion);
bool fn_map_process(uint16_t function_id, uint8_t from, uint8_t to, uint8_t* rawpacket, size_t len);

0
usrc/protocol_impl/report_flag_mgr.cpp → usrc/protocol_impl/basic/report_flag_mgr.cpp

0
usrc/protocol_impl/report_flag_mgr.hpp → usrc/protocol_impl/basic/report_flag_mgr.hpp

35
usrc/protocol_impl/function_impl/afunction_impl.hpp

@ -0,0 +1,35 @@
#pragma once
#include <stddef.h>
#include <stdio.h>
#include "../basic/fn_mgr.hpp"
#include "../basic/report_flag_mgr.hpp"
//
#include "base/device_info.hpp"
#include "base/hardware.hpp"
#include "zsdk/modbus/modbus_block_host.hpp"
#include "zsdk/zcanreceiver/zcanreceiver.hpp"
/***********************************************************************************************************************
* basic_fn *
***********************************************************************************************************************/
void fn_cmd_read_board_info(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len);
void fn_cmd_read_sysinfo(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len);
void fn_cmd_read_taskinfo(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len);
void fn_cmd_heart_ping(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len);
void fn_cmd_clear_reset_flag(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len);
void basic_fn_init();
void fn_cmd_heater_ctrl(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len);
void fn_cmd_heater_ctrl_safe_valve(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len);
void fn_cmd_heater_read_electric_current(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len);
void fn_cmd_heater_read_temperature_data(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len);
void heater_fn_impl_init();
void fn_cmd_h2o2_sensor_read_calibration_date(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len);
void fn_cmd_h2o2_sensor_read_sub_ic_errorcode(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len);
void fn_cmd_h2o2_sensor_read_sub_ic_reg(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len);
void h2o2_fn_impl_init();

91
usrc/protocol_impl/function_impl/basic_fn.cpp

@ -0,0 +1,91 @@
#include "afunction_impl.hpp"
using namespace iflytop;
static uint8_t m_boardflag; // 0: 重启标志
/**
* @brief
*
* @param from
* @param to
* @param packet
* @param len
*/
void fn_cmd_read_board_info(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len) {
static ack_read_board_info_data_t ack;
ack.boardType = deviceInfo_getBoardType();
ack.projectId = deviceInfo_getProjectId();
ack.protcol_version = deviceInfo_getProtocolVersion();
ack.software_version = deviceInfo_getSoftwareVersion();
ack.hardware_version = deviceInfo_getHardwareVersion();
zcanbus_send_ack(packet, (uint8_t*)&ack, sizeof(ack));
}
/**
* @brief
*
* @param from
* @param to
* @param packet
* @param len
*/
void fn_cmd_read_sysinfo(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len) {
static ack_sysinfo_t ack;
ack.free_heap_size = SysMgr::ins()->osGetMinimumEverFreeHeapSize();
ack.total_heap_size = SysMgr::ins()->osGetTotalHeapSize();
ack.taskNum = SysMgr::ins()->getTaskNum();
ack.sysHasRun = SysMgr::ins()->osGetSysRunTime() / 1000;
zcanbus_send_ack(packet, (uint8_t*)&ack, sizeof(ack));
}
/**
* @brief 线
*
* @param from
* @param to
* @param packet
* @param len
*/
void fn_cmd_read_taskinfo(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len) {
static ask_taskinfo_t ack;
int32_t taskoff = GET_PARAM(packet->params, 0);
osThreadId taskId = SysMgr::ins()->osGetId(taskoff);
SysMgr::ins()->osTaskName(taskId, (char*)ack.taskName, sizeof(ack.taskName));
SysMgr::ins()->osTaskStackRemainingSize(taskId, &ack.stackRemindSize);
SysMgr::ins()->osTaskPriority(taskId, &ack.priority);
SysMgr::ins()->osTaskGetState(taskId, (char*)&ack.state);
zcanbus_send_ack(packet, (uint8_t*)&ack, sizeof(ack));
}
/**
* @brief PING
*
* @param from
* @param to
* @param packet
* @param len
*/
void fn_cmd_heart_ping(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len) {
static report_heatpacket_data_t heatpacket;
heatpacket.boardType = deviceInfo_getBoardType();
heatpacket.heartIndex = GET_PARAM(packet->params, 0);
heatpacket.flag = m_boardflag;
zcanbus_send_report(kreport_heatpacket_pong, (uint8_t*)&heatpacket, sizeof(heatpacket), 30);
}
/**
* @brief
*
* @param from
* @param to
* @param packet
* @param len
*/
void fn_cmd_clear_reset_flag(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len) {
ZCLEAR_BIT(m_boardflag, 0);
zcanbus_send_ack(packet, NULL, 0);
}
void basic_fn_init() {
m_boardflag = 0x00;
ZSET_BIT(m_boardflag, 0);
}

43
usrc/protocol_impl/function_impl/h2o2_fn_impl.cpp

@ -0,0 +1,43 @@
#include "afunction_impl.hpp"
using namespace iflytop;
#define TAG "PROTO-H2O2"
static osTimerId PacketReportTimerId;
static void onPacketReportTimer(void const* argument) {
static report_h2o2_data_t data;
memset(&data, 0, sizeof(data));
Hardware::ins().h2o2_sensor_data(&data);
zcanbus_send_report(kreport_h2o2_sensor_data, (uint8_t*)&data, sizeof(data), 30);
}
void fn_cmd_h2o2_sensor_read_calibration_date(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len) {
CHECK_PARAM_LEN(PARAM_LEN(), 1);
int32_t subic = GET_PARAM(packet->params, 0);
int32_t data[3];
Hardware::ins().h2o2_sensor_read_calibration_date(&data[0], &data[1], &data[2]);
zcanbus_send_ack(packet, (uint8_t*)&data, sizeof(data));
}
void fn_cmd_h2o2_sensor_read_sub_ic_errorcode(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len) {
int32_t ecode = Hardware::ins().h2o2_sensor_read_sub_ic_errorcode();
zcanbus_send_ack(packet, (uint8_t*)&ecode, sizeof(ecode));
}
void fn_cmd_h2o2_sensor_read_sub_ic_reg(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len) {
CHECK_PARAM_LEN(PARAM_LEN(), 3);
int32_t subic = GET_PARAM(packet->params, 0);
int32_t addr = GET_PARAM(packet->params, 1);
int32_t regNum = GET_PARAM(packet->params, 2);
if (regNum > 10) regNum = 10; // 最多读10个寄存器
static uint16_t data[10];
memset(data, 0, sizeof(data));
Hardware::ins().h2o2_sensor_read_sub_ic_reg(addr, data, regNum);
zcanbus_send_ack(packet, (uint8_t*)&data, regNum * 2);
}
void h2o2_fn_impl_init() {
osTimerDef(PacketReportTimer, onPacketReportTimer);
PacketReportTimerId = osTimerCreate(osTimer(PacketReportTimer), osTimerPeriodic, NULL);
osTimerStart(PacketReportTimerId, 5000);
}

29
usrc/protocol_impl/function_impl/heater_fn_impl.cpp

@ -0,0 +1,29 @@
#include "afunction_impl.hpp"
using namespace iflytop;
#define TAG "PROTO-HEATER"
void fn_cmd_heater_ctrl(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len) {
CHECK_PARAM_LEN(PARAM_LEN(), 1);
Hardware::ins().heater_ctrl(GET_PARAM(packet->params, 0));
zcanbus_send_ack(packet, NULL, 0);
}
void fn_cmd_heater_ctrl_safe_valve(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len) {
CHECK_PARAM_LEN(PARAM_LEN(), 1);
Hardware::ins().heater_ctrl_safe_valve(GET_PARAM(packet->params, 0));
zcanbus_send_ack(packet, NULL, 0);
}
void fn_cmd_heater_read_electric_current(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len) {
int32_t current = Hardware::ins().heater_read_electric_current();
zcanbus_send_ack(packet, (uint8_t*)&current, sizeof(current));
}
void fn_cmd_heater_read_temperature_data(uint8_t from, uint8_t to, zcanbus_packet_t* packet, size_t len) {
int32_t temp = Hardware::ins().heater_read_temperature_data();
zcanbus_send_ack(packet, (uint8_t*)&temp, sizeof(temp));
}
void heater_fn_impl_init() {}

243
usrc/protocol_impl/protocol_impl_service.cpp

@ -1,231 +1,30 @@
#include "protocol_impl_service.hpp"
#include "base/device_info.hpp"
#include "base/hardware.hpp"
#include "report_flag_mgr.hpp"
#include "zsdk/modbus/modbus_block_host.hpp"
#include "zsdk/zcanreceiver/zcanreceiver.hpp"
#include "function_impl/afunction_impl.hpp"
#define TAG "PROTO"
using namespace iflytop;
/***********************************************************************************************************************
* FUNCTION_LIST *
***********************************************************************************************************************/
#define CHECK_PARAM_LEN(_paramNum, expectNum) \
if (_paramNum != expectNum) { \
zcanbus_send_errorack(packet, kerr_invalid_param_num); \
return true; \
}
#define CHECK_MOTOR_INDEX(_subindex) \
if (_subindex > Hardware::ins().motorNum()) { \
zcanbus_send_errorack(packet, kerr_invalid_param); \
return true; \
}
#define GET_PARAM(buff, off) ((((int32_t*)(buff))[off]))
#define ZCLEAR_BIT(val, bit) (val &= ~(1 << bit))
#define ZSET_BIT(val, bit) (val |= (1 << bit))
/***********************************************************************************************************************
* VAR_LIST *
***********************************************************************************************************************/
static osTimerId PacketReportTimerId;
static osThreadId PacketRxThreadId;
static osTimerId PressureSensorDataReportTimerId; // 压力传感器数值上报
static uint32_t m_pressureSensorDataReportPeriodMs = 3000;
static osTimerId MotorMonitorTimerId; // 压力传感器数值上报
static uint8_t m_dflag;
/***********************************************************************************************************************
* FUNCTION_IMPL *
***********************************************************************************************************************/
static bool basic_func_impl(uint8_t from, uint8_t to, uint8_t* rawpacket, size_t len) {
zcanbus_packet_t* packet = (zcanbus_packet_t*)rawpacket;
int32_t paramLen = (len - sizeof(zcanbus_packet_t)) / 4;
// 读板子信息
if (packet->function_id == kcmd_read_board_info) {
static ack_read_board_info_data_t ack;
ack.boardType = deviceInfo_getBoardType();
ack.projectId = deviceInfo_getProjectId();
ack.protcol_version = deviceInfo_getProtocolVersion();
ack.software_version = deviceInfo_getSoftwareVersion();
ack.hardware_version = deviceInfo_getHardwareVersion();
zcanbus_send_ack(packet, (uint8_t*)&ack, sizeof(ack));
return true;
}
// 读系统信息
else if (packet->function_id == kcmd_read_sysinfo) {
static ack_sysinfo_t ack;
ack.free_heap_size = SysMgr::ins()->osGetMinimumEverFreeHeapSize();
ack.total_heap_size = SysMgr::ins()->osGetTotalHeapSize();
ack.taskNum = SysMgr::ins()->getTaskNum();
ack.sysHasRun = SysMgr::ins()->osGetSysRunTime() / 1000;
zcanbus_send_ack(packet, (uint8_t*)&ack, sizeof(ack));
return true;
}
// 读任务信息
else if (packet->function_id == kcmd_read_taskinfo) {
static ask_taskinfo_t ack;
int32_t taskoff = GET_PARAM(packet->params, 0);
osThreadId taskId = SysMgr::ins()->osGetId(taskoff);
SysMgr::ins()->osTaskName(taskId, (char*)ack.taskName, sizeof(ack.taskName));
SysMgr::ins()->osTaskStackRemainingSize(taskId, &ack.stackRemindSize);
SysMgr::ins()->osTaskPriority(taskId, &ack.priority);
SysMgr::ins()->osTaskGetState(taskId, (char*)&ack.state);
zcanbus_send_ack(packet, (uint8_t*)&ack, sizeof(ack));
return true;
}
// 心跳 ping pong
else if (packet->function_id == kcmd_heart_ping) {
static report_heatpacket_data_t heatpacket;
heatpacket.boardType = deviceInfo_getBoardType();
heatpacket.heartIndex = GET_PARAM(packet->params, 0);
heatpacket.flag = m_dflag;
zcanbus_send_report(kreport_heatpacket_pong, (uint8_t*)&heatpacket, sizeof(heatpacket), 30);
return true;
}
else if (packet->function_id == kcmd_clear_reset_flag) {
ZCLEAR_BIT(m_dflag, 0);
zcanbus_send_ack(packet, NULL, 0);
return true;
}
// 触发一次强制上报事件
if (packet->function_id == kcmd_force_report) {
ForceReportFlagMgr::ins()->trigger();
if (from != 0xff) zcanbus_send_ack(packet, NULL, 0);
return true;
}
return false;
}
static bool heater_func_impl(uint8_t from, uint8_t to, uint8_t* rawpacket, size_t len) {
zcanbus_packet_t* packet = (zcanbus_packet_t*)rawpacket;
int32_t paramNum = (len - sizeof(zcanbus_packet_t)) / 4;
// 加热棒
if (packet->function_id == kcmd_heater_ctrl) {
CHECK_PARAM_LEN(paramNum, 1);
Hardware::ins().heater_ctrl(GET_PARAM(packet->params, 0));
zcanbus_send_ack(packet, NULL, 0);
return true;
}
else if (packet->function_id == kcmd_heater_ctrl_safe_valve) {
CHECK_PARAM_LEN(paramNum, 1);
Hardware::ins().heater_ctrl_safe_valve(GET_PARAM(packet->params, 0));
zcanbus_send_ack(packet, NULL, 0);
return true;
}
else if (packet->function_id == kcmd_heater_read_electric_current) {
int32_t current = Hardware::ins().heater_read_electric_current();
zcanbus_send_ack(packet, (uint8_t*)&current, sizeof(current));
return true;
}
else if (packet->function_id == kcmd_heater_read_temperature_data) {
int32_t temp = Hardware::ins().heater_read_temperature_data();
zcanbus_send_ack(packet, (uint8_t*)&temp, sizeof(temp));
return true;
}
return false;
}
static bool h2o2_func_impl(uint8_t from, uint8_t to, uint8_t* rawpacket, size_t len) {
zcanbus_packet_t* packet = (zcanbus_packet_t*)rawpacket;
int32_t paramNum = (len - sizeof(zcanbus_packet_t)) / 4;
// H2O2
if (packet->function_id == kcmd_h2o2_sensor_read_calibration_date) {
CHECK_PARAM_LEN(paramNum, 1);
int32_t subic = GET_PARAM(packet->params, 0);
int32_t data[3];
Hardware::ins().h2o2_sensor_read_calibration_date(&data[0], &data[1], &data[2]);
zcanbus_send_ack(packet, (uint8_t*)&data, sizeof(data));
return true;
} else if (packet->function_id == kcmd_h2o2_sensor_read_sub_ic_errorcode) {
int32_t ecode = Hardware::ins().h2o2_sensor_read_sub_ic_errorcode();
zcanbus_send_ack(packet, (uint8_t*)&ecode, sizeof(ecode));
return true;
} else if (packet->function_id == kcmd_h2o2_sensor_read_sub_ic_reg) {
CHECK_PARAM_LEN(paramNum, 3);
int32_t subic = GET_PARAM(packet->params, 0);
int32_t addr = GET_PARAM(packet->params, 1);
int32_t regNum = GET_PARAM(packet->params, 2);
if (regNum > 10) regNum = 10; // 最多读10个寄存器
static uint16_t data[10];
memset(data, 0, sizeof(data));
Hardware::ins().h2o2_sensor_read_sub_ic_reg(addr, data, regNum);
zcanbus_send_ack(packet, (uint8_t*)&data, regNum * 2);
return true;
}
return false;
}
static bool others_func_impl(uint8_t from, uint8_t to, uint8_t* rawpacket, size_t len) {
zcanbus_packet_t* packet = (zcanbus_packet_t*)rawpacket;
int32_t paramNum = (len - sizeof(zcanbus_packet_t)) / 4;
// MINI鼓风机
if (packet->function_id == kcmd_mini_pwm_blower_ctrl) {
CHECK_PARAM_LEN(paramNum, 1);
Hardware::ins().mini_pwm_blower_ctrl(GET_PARAM(packet->params, 0));
zcanbus_send_ack(packet, NULL, 0);
return true;
}
else if (packet->function_id == kcmd_mini_pwm_blower_read_fbcount) {
int32_t fbcount = Hardware::ins().mini_pwm_blower_read_fbcount();
zcanbus_send_ack(packet, (uint8_t*)&fbcount, sizeof(fbcount));
return true;
}
return false;
}
/***********************************************************************************************************************
* SCHEDULER *
***********************************************************************************************************************/
static void onPacketRxThreadStart(void const* argument) {
while (true) {
zcanbus_schedule();
osDelay(1);
}
}
static void onPacketReportTimer(void const* argument) {
static report_h2o2_data_t data;
memset(&data, 0, sizeof(data));
Hardware::ins().h2o2_sensor_data(&data);
zcanbus_send_report(kreport_h2o2_sensor_data, (uint8_t*)&data, sizeof(data), 30);
}
static void zcanbus_on_rx(uint8_t from, uint8_t to, uint8_t* rawpacket, size_t len) { //
zcanbus_packet_t* packet = (zcanbus_packet_t*)rawpacket;
ZLOGI(TAG, "process packet from %d to %d, function_id %d, len %d", from, to, packet->function_id, len);
if (basic_func_impl(from, to, rawpacket, len)) {
} else if (heater_func_impl(from, to, rawpacket, len)) {
} else if (h2o2_func_impl(from, to, rawpacket, len)) {
} else if (others_func_impl(from, to, rawpacket, len)) {
} else {
bool processed = fn_map_process(packet->function_id, from, to, rawpacket, len);
if (!processed) {
zcanbus_send_errorack(packet, kerr_function_not_support);
}
ZLOGI(TAG, "process end");
}
@ -237,23 +36,37 @@ static void zcanbus_on_connected(bool connected) {
}
}
/***********************************************************************************************************************
* EXT *
***********************************************************************************************************************/
void protocol_impl_service_init() { //
Hardware::ins().init();
ForceReportFlagMgr::ins()->init();
m_dflag = 0x00;
ZSET_BIT(m_dflag, 0);
zcanbus_init(deviceInfo_getBoardId());
zcanbus_reglistener(zcanbus_on_rx);
zcanbus_reg_on_connected_listener(zcanbus_on_connected);
osTimerDef(PacketReportTimer, onPacketReportTimer);
PacketReportTimerId = osTimerCreate(osTimer(PacketReportTimer), osTimerPeriodic, NULL);
osTimerStart(PacketReportTimerId, 5000);
{
basic_fn_init();
fn_map_reg(kcmd_read_board_info, fn_cmd_read_board_info);
fn_map_reg(kcmd_read_sysinfo, fn_cmd_read_sysinfo);
fn_map_reg(kcmd_read_taskinfo, fn_cmd_read_taskinfo);
fn_map_reg(kcmd_heart_ping, fn_cmd_heart_ping);
fn_map_reg(kcmd_clear_reset_flag, fn_cmd_clear_reset_flag);
}
{
h2o2_fn_impl_init();
fn_map_reg(kcmd_h2o2_sensor_read_calibration_date, fn_cmd_h2o2_sensor_read_calibration_date);
fn_map_reg(kcmd_h2o2_sensor_read_sub_ic_errorcode, fn_cmd_h2o2_sensor_read_sub_ic_errorcode);
fn_map_reg(kcmd_h2o2_sensor_read_sub_ic_reg, fn_cmd_h2o2_sensor_read_sub_ic_reg);
}
{
heater_fn_impl_init();
fn_map_reg(kcmd_heater_ctrl, fn_cmd_heater_ctrl);
fn_map_reg(kcmd_heater_ctrl_safe_valve, fn_cmd_heater_ctrl_safe_valve);
fn_map_reg(kcmd_heater_read_electric_current, fn_cmd_heater_read_electric_current);
fn_map_reg(kcmd_heater_read_temperature_data, fn_cmd_heater_read_temperature_data);
}
osThreadDef(PacketRxThread, onPacketRxThreadStart, osPriorityNormal, 0, 1024);
PacketRxThreadId = osThreadCreate(osThread(PacketRxThread), NULL);

2
zsdk

@ -1 +1 @@
Subproject commit d2e04bf8ba4c394816866555f3cda296bd664b16
Subproject commit 59955298ef676c401438a09236f699520d114f86
Loading…
Cancel
Save