diff --git a/.gitmodules b/.gitmodules index 4ce6195..fb32e78 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "iflytop_canbus_protocol"] path = iflytop_canbus_protocol 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 diff --git a/iflytop_canbus_protocol b/iflytop_canbus_protocol index bd49987..a2f3e07 160000 --- a/iflytop_canbus_protocol +++ b/iflytop_canbus_protocol @@ -1 +1 @@ -Subproject commit bd49987090f3666d4d68713f0ba4ca4d31cc3a5f +Subproject commit a2f3e075a7025f157f41abdf7f3133b1450a6313 diff --git a/transmit_disinfection_protocol_v1 b/transmit_disinfection_protocol_v1 new file mode 160000 index 0000000..67fd26a --- /dev/null +++ b/transmit_disinfection_protocol_v1 @@ -0,0 +1 @@ +Subproject commit 67fd26a1a81f0afe4e653f2c40151571f846028e diff --git a/usrc/base/device_info.cpp b/usrc/base/device_info.cpp index fb66dae..b3a897f 100644 --- a/usrc/base/device_info.cpp +++ b/usrc/base/device_info.cpp @@ -1,11 +1,11 @@ #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_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_getHardwareVersion() { return HARDWARE_VERSION; } diff --git a/usrc/base/hardware.cpp b/usrc/base/hardware.cpp index e6f7310..a8f298d 100644 --- a/usrc/base/hardware.cpp +++ b/usrc/base/hardware.cpp @@ -27,10 +27,19 @@ static ZADC m_Heater_electricCurrentAdc; static ZADC m_Heater_temperatureAdc; // 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) { while (1) { @@ -43,14 +52,19 @@ static void onAdcCaptureThreadId(void const* argument) { 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(); + } +#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_temperatureAdc.initialize(&hadc1, ADC_CHANNEL_1); // PA0 + osDelay(2000); // 等待传感器上电 + +#ifdef H2O2_SENSOR_TYPE_HMP110 + 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)) { - 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); @@ -136,19 +172,51 @@ int32_t Hardware::heater_read_temperature_data() { } 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) { // + *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) { +#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; @@ -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 h2o2ppm = (h2o2ma - 4) / (20 - 4) * 2000; - readdata->subid = 0; readdata->sensor_error = ecode != 0; readdata->h2o2 = h2o2ppm; readdata->humid = sensordata.rh; readdata->temp = sensordata.temp; 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); 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 } \ No newline at end of file diff --git a/usrc/base/hardware.hpp b/usrc/base/hardware.hpp index b69591f..9152e15 100644 --- a/usrc/base/hardware.hpp +++ b/usrc/base/hardware.hpp @@ -1,3 +1,4 @@ +#pragma once #include #include @@ -11,7 +12,6 @@ #include "zsdk/zadc.hpp" #include "zsdk/zsdk.hpp" -void hardware_init(); namespace iflytop { 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_sub_ic_errorcode(); 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 diff --git a/usrc/project_configs.h b/usrc/project_configs.h index 1fe6536..53d136c 100644 --- a/usrc/project_configs.h +++ b/usrc/project_configs.h @@ -1,5 +1,5 @@ #pragma once -#include "iflytop_canbus_protocol/iflytop_canbus_protocol.hpp" +#include "transmit_disinfection_protocol_v1/transmit_disinfection_protocol_v1.hpp" /*********************************************************************************************************************** * PROJECT_CONFIG * @@ -13,7 +13,7 @@ #define HARDWARE_VERSION 1 #define PROJECT "dbdb_power_control_mini_board" #define SN_HEADER "SN" -#define DEVICE_ID (kFixBoardId_PowerControlMiniBoard) +#define DEVICE_ID (3) #define DEBUG_UART huart1 // 调试串口 #define DEBUG_LIGHT_GPIO PE8 // 调试指示灯 @@ -34,4 +34,7 @@ #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 \ No newline at end of file +#define SDK_MAX_TASK 10 + +#define ENABLE_OLD_CAN_PROTOCOL +#define H2O2_SENSOR_TYPE_HMP110 diff --git a/usrc/protocol_impl/basic/fn_mgr.cpp b/usrc/protocol_impl/basic/fn_mgr.cpp new file mode 100644 index 0000000..ba35989 --- /dev/null +++ b/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; +} \ No newline at end of file diff --git a/usrc/protocol_impl/basic/fn_mgr.hpp b/usrc/protocol_impl/basic/fn_mgr.hpp new file mode 100644 index 0000000..ffc1710 --- /dev/null +++ b/usrc/protocol_impl/basic/fn_mgr.hpp @@ -0,0 +1,23 @@ +#include +#include + +#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); + diff --git a/usrc/protocol_impl/report_flag_mgr.cpp b/usrc/protocol_impl/basic/report_flag_mgr.cpp similarity index 100% rename from usrc/protocol_impl/report_flag_mgr.cpp rename to usrc/protocol_impl/basic/report_flag_mgr.cpp diff --git a/usrc/protocol_impl/report_flag_mgr.hpp b/usrc/protocol_impl/basic/report_flag_mgr.hpp similarity index 97% rename from usrc/protocol_impl/report_flag_mgr.hpp rename to usrc/protocol_impl/basic/report_flag_mgr.hpp index 275416b..81da452 100644 --- a/usrc/protocol_impl/report_flag_mgr.hpp +++ b/usrc/protocol_impl/basic/report_flag_mgr.hpp @@ -1,3 +1,4 @@ +#pragma once #include #include #include diff --git a/usrc/protocol_impl/function_impl/afunction_impl.hpp b/usrc/protocol_impl/function_impl/afunction_impl.hpp new file mode 100644 index 0000000..9600eec --- /dev/null +++ b/usrc/protocol_impl/function_impl/afunction_impl.hpp @@ -0,0 +1,14 @@ +#pragma once +#include +#include + +#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(); diff --git a/usrc/protocol_impl/function_impl/h2o2_fn_impl.cpp b/usrc/protocol_impl/function_impl/h2o2_fn_impl.cpp new file mode 100644 index 0000000..56fe3cb --- /dev/null +++ b/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); +} diff --git a/usrc/protocol_impl/protocol_impl_service.cpp b/usrc/protocol_impl/protocol_impl_service.cpp index c7b0e0f..df14b1e 100644 --- a/usrc/protocol_impl/protocol_impl_service.cpp +++ b/usrc/protocol_impl/protocol_impl_service.cpp @@ -2,30 +2,12 @@ #include "base/device_info.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/zcanreceiver/zcanreceiver.hpp" +#include "zsdk/zcanreceiver_old/zcanreceiver.hpp" +#include "basic/report_flag_mgr.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 * @@ -33,208 +15,70 @@ using namespace iflytop; static osTimerId PacketReportTimerId; static osThreadId PacketRxThreadId; +static osThreadId DeviceStateMonitorThreadId; static osTimerId PressureSensorDataReportTimerId; // 压力传感器数值上报 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(); - zcanbus_send_ack(packet, (uint8_t*)¤t, sizeof(current)); - return true; + ZCanReceiver::ins()->sendAck(cmdheader, (uint8_t*)¤t, 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(); - 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鼓风机 - 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(); - 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() { // 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); + 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); PacketRxThreadId = osThreadCreate(osThread(PacketRxThread), NULL); + + osThreadDef(DeviceStateMonitorThread, onDeviceStateMonitorThreadStart, osPriorityNormal, 0, 1024); + DeviceStateMonitorThreadId = osThreadCreate(osThread(DeviceStateMonitorThread), NULL); } diff --git a/zsdk b/zsdk index d2e04bf..2d0aea4 160000 --- a/zsdk +++ b/zsdk @@ -1 +1 @@ -Subproject commit d2e04bf8ba4c394816866555f3cda296bd664b16 +Subproject commit 2d0aea4bda82668626ba11d42658eb2f36f48119