Browse Source

update

master
zhaohe 1 year ago
parent
commit
9b8c115bac
  1. 3
      .gitmodules
  2. 2
      iflytop_canbus_protocol
  3. 1
      transmit_disinfection_protocol_v1
  4. 8
      usrc/base/device_info.cpp
  5. 163
      usrc/base/hardware.cpp
  6. 4
      usrc/base/hardware.hpp
  7. 9
      usrc/project_configs.h
  8. 28
      usrc/protocol_impl/basic/fn_mgr.cpp
  9. 23
      usrc/protocol_impl/basic/fn_mgr.hpp
  10. 0
      usrc/protocol_impl/basic/report_flag_mgr.cpp
  11. 1
      usrc/protocol_impl/basic/report_flag_mgr.hpp
  12. 14
      usrc/protocol_impl/function_impl/afunction_impl.hpp
  13. 22
      usrc/protocol_impl/function_impl/h2o2_fn_impl.cpp
  14. 251
      usrc/protocol_impl/protocol_impl_service.cpp
  15. 2
      zsdk

3
.gitmodules

@ -7,3 +7,6 @@
[submodule "iflytop_canbus_protocol"] [submodule "iflytop_canbus_protocol"]
path = iflytop_canbus_protocol path = iflytop_canbus_protocol
url = zwsd@192.168.1.3:p_transmit_disinfection_v2/disinfection_iflytop_can_protocol.git url = zwsd@192.168.1.3:p_transmit_disinfection_v2/disinfection_iflytop_can_protocol.git
[submodule "transmit_disinfection_protocol_v1"]
path = transmit_disinfection_protocol_v1
url = zwsd@192.168.1.3:p_transmit_disinfection/transmit_disinfection_protocol_v1.git

2
iflytop_canbus_protocol

@ -1 +1 @@
Subproject commit bd49987090f3666d4d68713f0ba4ca4d31cc3a5f
Subproject commit a2f3e075a7025f157f41abdf7f3133b1450a6313

1
transmit_disinfection_protocol_v1

@ -0,0 +1 @@
Subproject commit 67fd26a1a81f0afe4e653f2c40151571f846028e

8
usrc/base/device_info.cpp

@ -1,11 +1,11 @@
#include "device_info.hpp" #include "device_info.hpp"
#include "iflytop_canbus_protocol/iflytop_canbus_protocol.hpp"
#include "transmit_disinfection_protocol_v1/transmit_disinfection_protocol_v1.hpp"
uint16_t deviceInfo_init() { return 0; } uint16_t deviceInfo_init() { return 0; }
uint16_t deviceInfo_getBoardId() { return DEVICE_ID; } uint16_t deviceInfo_getBoardId() { return DEVICE_ID; }
uint16_t deviceInfo_getProjectId() { return kdraw_bar_disinfection_box; }
uint16_t deviceInfo_getBoardType() { return kBoardType_LiquidCtrl; }
uint16_t deviceInfo_getProtocolVersion() { return PROTOCOL_VERSION; }
uint16_t deviceInfo_getProjectId() { return 0; }
uint16_t deviceInfo_getBoardType() { return 0; }
uint16_t deviceInfo_getProtocolVersion() { return 0; }
uint16_t deviceInfo_getSoftwareVersion() { return SOFTWARE_VERSION; } uint16_t deviceInfo_getSoftwareVersion() { return SOFTWARE_VERSION; }
uint16_t deviceInfo_getHardwareVersion() { return HARDWARE_VERSION; } uint16_t deviceInfo_getHardwareVersion() { return HARDWARE_VERSION; }

163
usrc/base/hardware.cpp

@ -27,10 +27,19 @@ static ZADC m_Heater_electricCurrentAdc;
static ZADC m_Heater_temperatureAdc; static ZADC m_Heater_temperatureAdc;
// H2O2过氧化氢 // 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
ModbusBlockHost m_H2o2Sensor_ModbusBlockHost; //
ZADC m_H2o2Sensor_H2O2Adc; // H2O2传感器控制
HMP110 m_H2o2Sensor_HMP110; // H2O2传感器
int32_t m_h2o2sensor_detectId = -1;
#endif
#ifdef H2O2_SENSOR_TYPE_HPP272
ModbusBlockHost m_H2o2Sensor_ModbusBlockHost; //
HPP272 m_H2o2Sensor_HPP272; // H2O2传感器
int32_t m_h2o2sensor_detectId = -1;
#endif
static void onAdcCaptureThreadId(void const* argument) { static void onAdcCaptureThreadId(void const* argument) {
while (1) { while (1) {
@ -43,14 +52,19 @@ static void onAdcCaptureThreadId(void const* argument) {
static void onH2O2CaptureThreadId(void const* argument) { static void onH2O2CaptureThreadId(void const* argument) {
while (1) { while (1) {
osDelay(1000); osDelay(1000);
if (m_hmp100_detectId > 0) {
#ifdef H2O2_SENSOR_TYPE_HMP110
if (m_h2o2sensor_detectId > 0) {
m_H2o2Sensor_H2O2Adc.updateAdcValToCache(); m_H2o2Sensor_H2O2Adc.updateAdcValToCache();
m_H2o2Sensor_HMP110.updateSensorDataAndErrorcode(); m_H2o2Sensor_HMP110.updateSensorDataAndErrorcode();
}
#endif
// float mv = adcv / 4095.0 * 3.3 * 1000;
// float ma = mv / 150.0;
// float ppm = (ma - 4) / (20 - 4) * 2000;
#ifdef H2O2_SENSOR_TYPE_HPP272
if (m_h2o2sensor_detectId > 0) {
m_H2o2Sensor_HPP272.updateSensorDataAndErrorcode();
} }
#endif
} }
} }
@ -65,23 +79,45 @@ void Hardware::init() {
// m_Heater_electricCurrentAdc.initialize(&hadc1, ADC_CHANNEL_0); //暂时注释掉,板子少了一个ADC,该ADC用于H2O2浓度 // m_Heater_electricCurrentAdc.initialize(&hadc1, ADC_CHANNEL_0); //暂时注释掉,板子少了一个ADC,该ADC用于H2O2浓度
m_Heater_temperatureAdc.initialize(&hadc1, ADC_CHANNEL_1); // PA0 m_Heater_temperatureAdc.initialize(&hadc1, ADC_CHANNEL_1); // PA0
osDelay(2000); // 等待传感器上电
#ifdef H2O2_SENSOR_TYPE_HMP110
ZASSERT(huart2.Init.BaudRate == 19200); 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);
ZASSERT(huart2.Init.StopBits == UART_STOPBITS_2);
m_H2o2Sensor_ModbusBlockHost.initialize(&huart2);
m_H2o2Sensor_H2O2Adc.initialize(&hadc1, ADC_CHANNEL_10); //
m_H2o2Sensor_HMP110.init(&m_H2o2Sensor_ModbusBlockHost);
/**
* @brief HMP110
*/
osDelay(2000); // 等待传感器上电
if (m_H2o2Sensor_HMP110.ping(1)) { if (m_H2o2Sensor_HMP110.ping(1)) {
m_hmp100_detectId = 1;
m_h2o2sensor_detectId = 1;
} }
if (m_H2o2Sensor_HMP110.ping(240)) { 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); osThreadDef(AdcCaptureThread, onAdcCaptureThreadId, osPriorityNormal, 0, 1024);
AdcCaptureThreadId = osThreadCreate(osThread(AdcCaptureThread), NULL); AdcCaptureThreadId = osThreadCreate(osThread(AdcCaptureThread), NULL);
@ -136,19 +172,51 @@ int32_t Hardware::heater_read_temperature_data() {
} }
bool Hardware::h2o2_sensor_is_online() { 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(); 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; 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) { //
*year = 1;
*month = 2;
*day = 3;
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
if (m_H2o2Sensor_HPP272.read_reg(add, val, len)) {
return 0;
}
#endif
#ifdef H2O2_SENSOR_TYPE_HMP110
if (m_H2o2Sensor_HMP110.read_reg(add, val, len)) {
return 0;
}
#endif
return -1; // TODO 添加错误码
}
int32_t Hardware::h2o2_sensor_data(report_h2o2_data_t* readdata) { 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 ecode = m_H2o2Sensor_HMP110.read_cache_errorcode();
int32_t h2o2adcVal = m_H2o2Sensor_H2O2Adc.getCacheVal(); int32_t h2o2adcVal = m_H2o2Sensor_H2O2Adc.getCacheVal();
HMP110::hmp110_sensordata_t sensordata; HMP110::hmp110_sensordata_t sensordata;
@ -160,22 +228,43 @@ int32_t Hardware::h2o2_sensor_data(report_h2o2_data_t* readdata) {
int32_t h2o2ma = (h2o2adcVal / 4095.0 * 3.3 * 1000) / 150.0; int32_t h2o2ma = (h2o2adcVal / 4095.0 * 3.3 * 1000) / 150.0;
int32_t h2o2ppm = (h2o2ma - 4) / (20 - 4) * 2000; int32_t h2o2ppm = (h2o2ma - 4) / (20 - 4) * 2000;
readdata->subid = 0;
readdata->sensor_error = ecode != 0; readdata->sensor_error = ecode != 0;
readdata->h2o2 = h2o2ppm; readdata->h2o2 = h2o2ppm;
readdata->humid = sensordata.rh; readdata->humid = sensordata.rh;
readdata->temp = sensordata.temp; readdata->temp = sensordata.temp;
readdata->saturation = 0; readdata->saturation = 0;
ZLOGI(TAG, "ppm:%d, rh:%d, temp:%d, df_ptemp:%d, ah:%d, mr:%d, wbt:%d, eh:%d", //
h2o2ppm, //
sensordata.rh, //
sensordata.temp, //
sensordata.df_ptemp, //
sensordata.ah, //
sensordata.mr, //
sensordata.wet_bulb_temp, //
ZLOGI(TAG, "ecode: %d ppm:%d, rh:%d, temp:%d, df_ptemp:%d, ah:%d, mr:%d, wbt:%d, eh:%d", //
ecode, //
h2o2ppm, //
sensordata.rh, //
sensordata.temp, //
sensordata.df_ptemp, //
sensordata.ah, //
sensordata.mr, //
sensordata.wet_bulb_temp, //
sensordata.enthalpy); sensordata.enthalpy);
return 0; 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->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
} }

4
usrc/base/hardware.hpp

@ -1,3 +1,4 @@
#pragma once
#include <stddef.h> #include <stddef.h>
#include <stdio.h> #include <stdio.h>
@ -11,7 +12,6 @@
#include "zsdk/zadc.hpp" #include "zsdk/zadc.hpp"
#include "zsdk/zsdk.hpp" #include "zsdk/zsdk.hpp"
void hardware_init();
namespace iflytop { namespace iflytop {
class Hardware { class Hardware {
@ -35,7 +35,7 @@ class Hardware {
int32_t h2o2_sensor_read_calibration_date(int32_t* year, int32_t* month, int32_t* day); int32_t h2o2_sensor_read_calibration_date(int32_t* year, int32_t* month, int32_t* day);
int32_t h2o2_sensor_read_sub_ic_errorcode(); int32_t h2o2_sensor_read_sub_ic_errorcode();
int32_t h2o2_sensor_read_sub_ic_reg(int32_t add, uint16_t* val, size_t len); int32_t h2o2_sensor_read_sub_ic_reg(int32_t add, uint16_t* val, size_t len);
int32_t h2o2_sensor_data(report_h2o2_data_t* sensorData);
int32_t h2o2_sensor_data(report_h2o2_data_t* readdata);
}; };
} // namespace iflytop } // namespace iflytop

9
usrc/project_configs.h

@ -1,5 +1,5 @@
#pragma once #pragma once
#include "iflytop_canbus_protocol/iflytop_canbus_protocol.hpp"
#include "transmit_disinfection_protocol_v1/transmit_disinfection_protocol_v1.hpp"
/*********************************************************************************************************************** /***********************************************************************************************************************
* PROJECT_CONFIG * * PROJECT_CONFIG *
@ -13,7 +13,7 @@
#define HARDWARE_VERSION 1 #define HARDWARE_VERSION 1
#define PROJECT "dbdb_power_control_mini_board" #define PROJECT "dbdb_power_control_mini_board"
#define SN_HEADER "SN" #define SN_HEADER "SN"
#define DEVICE_ID (kFixBoardId_PowerControlMiniBoard)
#define DEVICE_ID (3)
#define DEBUG_UART huart1 // 调试串口 #define DEBUG_UART huart1 // 调试串口
#define DEBUG_LIGHT_GPIO PE8 // 调试指示灯 #define DEBUG_LIGHT_GPIO PE8 // 调试指示灯
@ -34,4 +34,7 @@
#define SDK_IRQ_PREEMPTPRIORITY_DEFAULT 5 // IO中断默认中断等级 #define SDK_IRQ_PREEMPTPRIORITY_DEFAULT 5 // IO中断默认中断等级
#define SDK_CFG__CFG_FLASH_ADDR 0x080C0000 // #define SDK_CFG__CFG_FLASH_ADDR 0x080C0000 //
#define SDK_CFG__SN_FLASH_ADDR 0x080E0000 // #define SDK_CFG__SN_FLASH_ADDR 0x080E0000 //
#define SDK_MAX_TASK 10
#define SDK_MAX_TASK 10
#define ENABLE_OLD_CAN_PROTOCOL
#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, (uint8_t*)rawpacket, len);
return true;
}
}
return false;
}

23
usrc/protocol_impl/basic/fn_mgr.hpp

@ -0,0 +1,23 @@
#include <stddef.h>
#include <stdio.h>
#include "base/config_service.hpp"
#include "zsdk/zsdk.hpp"
/***********************************************************************************************************************
* MARCO *
***********************************************************************************************************************/
#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, uint8_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

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

@ -1,3 +1,4 @@
#pragma once
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <stdio.h> #include <stdio.h>

14
usrc/protocol_impl/function_impl/afunction_impl.hpp

@ -0,0 +1,14 @@
#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"
#include "zsdk/zcanreceiver_old/zcanreceiver.hpp"
void h2o2_fn_impl_init();

22
usrc/protocol_impl/function_impl/h2o2_fn_impl.cpp

@ -0,0 +1,22 @@
#include "afunction_impl.hpp"
#include "base/device_info.hpp"
using namespace iflytop;
#define TAG "PROTO-H2O2"
static osTimerId PacketReportTimerId;
using namespace iflytop;
using namespace zcr;
static void onPacketReportTimer(void const* argument) {
static report_h2o2_data_t data;
memset(&data, 0, sizeof(data));
Hardware::ins().h2o2_sensor_data(&data);
data.sensorid = deviceInfo_getBoardId();
ZCanReceiver::ins()->sendReport(kreport_h2o2_sensor_data, 0, (uint8_t*)&data, sizeof(data));
}
void h2o2_fn_impl_init() {
osTimerDef(PacketReportTimer, onPacketReportTimer);
PacketReportTimerId = osTimerCreate(osTimer(PacketReportTimer), osTimerPeriodic, NULL);
osTimerStart(PacketReportTimerId, 5000);
}

251
usrc/protocol_impl/protocol_impl_service.cpp

@ -2,30 +2,12 @@
#include "base/device_info.hpp" #include "base/device_info.hpp"
#include "base/hardware.hpp" #include "base/hardware.hpp"
#include "report_flag_mgr.hpp"
#include "function_impl/afunction_impl.hpp"
#include "zsdk/modbus/modbus_block_host.hpp" #include "zsdk/modbus/modbus_block_host.hpp"
#include "zsdk/zcanreceiver/zcanreceiver.hpp"
#include "zsdk/zcanreceiver_old/zcanreceiver.hpp"
#include "basic/report_flag_mgr.hpp"
#define TAG "PROTO" #define TAG "PROTO"
using namespace iflytop; 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 * * VAR_LIST *
@ -33,208 +15,70 @@ using namespace iflytop;
static osTimerId PacketReportTimerId; static osTimerId PacketReportTimerId;
static osThreadId PacketRxThreadId; static osThreadId PacketRxThreadId;
static osThreadId DeviceStateMonitorThreadId;
static osTimerId PressureSensorDataReportTimerId; // 压力传感器数值上报 static osTimerId PressureSensorDataReportTimerId; // 压力传感器数值上报
static uint32_t m_pressureSensorDataReportPeriodMs = 3000; static uint32_t m_pressureSensorDataReportPeriodMs = 3000;
static osTimerId MotorMonitorTimerId; // 压力传感器数值上报
static uint8_t m_dflag;
/*********************************************************************************************************************** /***********************************************************************************************************************
* FUNCTION_IMPL *
* SCHEDULER *
***********************************************************************************************************************/ ***********************************************************************************************************************/
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;
static void onPacketRxThreadStart(void const* argument) {
while (true) {
ZCanReceiver::ins()->loop();
osDelay(1);
} }
// 触发一次强制上报事件
if (packet->function_id == kcmd_force_report) {
ForceReportFlagMgr::ins()->trigger();
if (from != 0xff) zcanbus_send_ack(packet, NULL, 0);
return true;
}
static void onDeviceStateMonitorThreadStart(void const* argument) {
while (true) {
osDelay(1000);
} }
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;
static uint8_t txdatabuf[1024] = {0};
static void zcanbus_on_rx(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len) { //
auto* cmdheader = (transmit_disinfection_protocol_header_t*)packet;
if (cmdheader->cmdid == kcmd_dbdb_heater_ctrl) {
int32_t val = *(int32_t*)(cmdheader->data);
Hardware::ins().heater_ctrl(val);
ZCanReceiver::ins()->sendAck(cmdheader, NULL, 0);
} }
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 (cmdheader->cmdid == kcmd_dbdb_heater_ctrl_safe_valve) {
int32_t val = *(int32_t*)(cmdheader->data);
Hardware::ins().heater_ctrl_safe_valve(val);
ZCanReceiver::ins()->sendAck(cmdheader, NULL, 0);
} }
else if (packet->function_id == kcmd_heater_read_electric_current) {
else if (cmdheader->cmdid == kcmd_dbdb_heater_read_electric_current) {
int32_t current = Hardware::ins().heater_read_electric_current(); int32_t current = Hardware::ins().heater_read_electric_current();
zcanbus_send_ack(packet, (uint8_t*)&current, sizeof(current));
return true;
ZCanReceiver::ins()->sendAck(cmdheader, (uint8_t*)&current, sizeof(current));
} }
else if (packet->function_id == kcmd_heater_read_temperature_data) {
else if (cmdheader->cmdid == kcmd_dbdb_heater_read_temperature_data) {
int32_t temp = Hardware::ins().heater_read_temperature_data(); int32_t temp = Hardware::ins().heater_read_temperature_data();
zcanbus_send_ack(packet, (uint8_t*)&temp, sizeof(temp));
return true;
ZCanReceiver::ins()->sendAck(cmdheader, (uint8_t*)&temp, sizeof(temp));
} }
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;
#if 1
// MINI鼓风机 // 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;
if (cmdheader->cmdid == kcmd_dbdb_mini_pwm_blower_ctrl) {
int32_t val = *(int32_t*)(cmdheader->data);
Hardware::ins().mini_pwm_blower_ctrl(val);
ZCanReceiver::ins()->sendAck(cmdheader, NULL, 0);
} }
else if (packet->function_id == kcmd_mini_pwm_blower_read_fbcount) {
else if (cmdheader->cmdid == kcmd_dbdb_mini_pwm_blower_read_fbcount) {
int32_t fbcount = Hardware::ins().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;
ZCanReceiver::ins()->sendAck(cmdheader, (uint8_t*)&fbcount, sizeof(fbcount));
} }
#endif
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 {
zcanbus_send_errorack(packet, kerr_function_not_support);
}
ZLOGI(TAG, "process end");
}
static void zcanbus_on_connected(bool connected) {
if (connected) {
ZLOGI(TAG, "connected to host");
} else {
ZLOGI(TAG, "disconnected from host");
}
// if (cmdheader->cmdid == kcmd_ping && cmdheader->data[0] == DEVICE_ID) {
// ZCanReceiver::ins()->sendAck(cmdheader, NULL, 0);
// }
} }
/*********************************************************************************************************************** /***********************************************************************************************************************
@ -244,17 +88,16 @@ static void zcanbus_on_connected(bool connected) {
void protocol_impl_service_init() { // void protocol_impl_service_init() { //
Hardware::ins().init(); Hardware::ins().init();
ForceReportFlagMgr::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);
ZCanReceiver::CFG* cfg = ZCanReceiver::ins()->createCFG(deviceInfo_getBoardId());
ZCanReceiver::ins()->init(cfg);
ZCanReceiver::ins()->registerListener(zcanbus_on_rx);
osTimerDef(PacketReportTimer, onPacketReportTimer);
PacketReportTimerId = osTimerCreate(osTimer(PacketReportTimer), osTimerPeriodic, NULL);
osTimerStart(PacketReportTimerId, 5000);
{ h2o2_fn_impl_init(); }
osThreadDef(PacketRxThread, onPacketRxThreadStart, osPriorityNormal, 0, 1024); osThreadDef(PacketRxThread, onPacketRxThreadStart, osPriorityNormal, 0, 1024);
PacketRxThreadId = osThreadCreate(osThread(PacketRxThread), NULL); PacketRxThreadId = osThreadCreate(osThread(PacketRxThread), NULL);
osThreadDef(DeviceStateMonitorThread, onDeviceStateMonitorThreadStart, osPriorityNormal, 0, 1024);
DeviceStateMonitorThreadId = osThreadCreate(osThread(DeviceStateMonitorThread), NULL);
} }

2
zsdk

@ -1 +1 @@
Subproject commit d2e04bf8ba4c394816866555f3cda296bd664b16
Subproject commit 2d0aea4bda82668626ba11d42658eb2f36f48119
Loading…
Cancel
Save