diff --git a/README.md b/README.md index 5bd6eba..73a28b8 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,7 @@ ``` -ref:https://iflytop1.feishu.cn/docx/FPqjdaTtkoBeU9x4qbjcD6vxnUc +设计文档:https://iflytop1.feishu.cn/wiki/CQWNw4ZBXiStBkkQRo0czgnbnxc ``` ``` -主动上报 - 发生改变->上报(最小周期) - 单片机重启->触发上报 - 主机上线->上报 - 传感器异常->上报 - 触发上报指令下发->上报 - -websocket - -> 建立连接上报 - -> 发生改变上报(最小周期) - -> 触发上报指令下发->上报 - - -; 主机模式/监听模式 ``` \ No newline at end of file diff --git a/iflytop_canbus_protocol b/iflytop_canbus_protocol index c01f84e..0a220fc 160000 --- a/iflytop_canbus_protocol +++ b/iflytop_canbus_protocol @@ -1 +1 @@ -Subproject commit c01f84e2ad44f02f615ceec55762e9eda995c0a1 +Subproject commit 0a220fccdd10378ec311e17871edbc0acf089569 diff --git a/usrc/base/hardware.cpp b/usrc/base/hardware.cpp index 8b2128a..8e73944 100644 --- a/usrc/base/hardware.cpp +++ b/usrc/base/hardware.cpp @@ -33,5 +33,5 @@ void Hardware::init() { // m_motor[1].rotate(500000); ZLOGI(TAG, "chipv0: %x, chipv1: %x", chipv0, chipv1); - m_pressureSensorBus.init(&m_modbusBlockHost, nullptr, 1000, 1000); + m_pressureSensorBus.init(&m_modbusBlockHost); } diff --git a/usrc/protocol_impl/protocol_impl_service.cpp b/usrc/protocol_impl/protocol_impl_service.cpp index f9e250b..0290cb1 100644 --- a/usrc/protocol_impl/protocol_impl_service.cpp +++ b/usrc/protocol_impl/protocol_impl_service.cpp @@ -31,6 +31,9 @@ using namespace iflytop; static osTimerId HeartReportTimerId; static osThreadId PacketRxThreadId; +static osTimerId PressureSensorDataReportTimerId; // 压力传感器数值上报 +static uint32_t m_pressureSensorDataReportPeriodMs = 3000; + /*********************************************************************************************************************** * FUNCTION_IMPL * ***********************************************************************************************************************/ @@ -78,7 +81,7 @@ static void basic_func_impl(uint8_t from, uint8_t to, uint8_t* rawpacket, size_t static report_heatpacket_data_t heatpacket; heatpacket.boardType = deviceInfo_getBoardType(); heatpacket.heartIndex = GET_PARAM(packet->params, 0); - zcanbus_send_report(kreport_heatpacket_pong, (uint8_t*)&heatpacket, sizeof(heatpacket)); + zcanbus_send_report(kreport_heatpacket_pong, (uint8_t*)&heatpacket, sizeof(heatpacket), 30); } // 触发一次强制上报事件 if (packet->function_id == kcmd_force_report) { @@ -208,9 +211,39 @@ static void others_func_impl(uint8_t from, uint8_t to, uint8_t* rawpacket, size_ // 压力传感器数据上报 else if (packet->function_id == kcmd_read_pressure_data) { + CHECK_PARAM_LEN(paramNum, 1); + int32_t index = GET_PARAM(packet->params, 0); + + int16_t val = 0; + int32_t reportVal = 0; + bool suc = Hardware::ins().pressureSensorBus()->readData(index, &val); + + reportVal = val; + + if (suc) { + zcanbus_send_ack(packet, (uint8_t*)&reportVal, sizeof(reportVal)); + } else { + zcanbus_send_errorack(packet, kerr_subdevice_offline); + } + } // 压力传感器数据上报 else if (packet->function_id == kcmd_set_pressure_data_report_period_ms) { + CHECK_PARAM_LEN(paramNum, 1); + int32_t period = GET_PARAM(packet->params, 0); + + ZLOGI(TAG, "set pressure sensor data report period %d ms", period); + + if (period != 0) { + if (period < 200) period = 200; + osTimerStop(PressureSensorDataReportTimerId); + osTimerStart(PressureSensorDataReportTimerId, period); + m_pressureSensorDataReportPeriodMs = period; + } else { + osTimerStop(PressureSensorDataReportTimerId); + } + + zcanbus_send_ack(packet, NULL, 0); } } @@ -241,6 +274,30 @@ static void zcanbus_on_connected(bool connected) { ZLOGI(TAG, "disconnected from host"); } } + +static void onPressureSensorDataReportTimer(void const* argument) { + // 压力传感器数据上报 + static uint8_t reportcache[100]; + static report_pressure_data_t* report = (report_pressure_data_t*)reportcache; + + int sensorNum = 0; + + for (size_t i = 0; i < PXX_PRESSURE_SENSOR_NUM; i++) { + int16_t val = 0; + bool suc = Hardware::ins().pressureSensorBus()->readData(i, &val); + + if (suc) { + report->data[sensorNum].subid = i; + report->data[sensorNum].pressureVal = val; + sensorNum++; + } + } + + report->sensorDataNum = sensorNum; + zcanbus_send_report(kreport_pressure_data, (uint8_t*)report, // + sizeof(report_pressure_data_t) + sensorNum * sizeof(report->data[0]), 10); +} + /*********************************************************************************************************************** * EXT * ***********************************************************************************************************************/ @@ -253,9 +310,9 @@ void protocol_impl_service_init() { // zcanbus_reglistener(zcanbus_on_rx); zcanbus_reg_on_connected_listener(zcanbus_on_connected); - // osTimerDef(HeartReportTimer, onHeartReportTimer); - // HeartReportTimerId = osTimerCreate(osTimer(HeartReportTimer), osTimerPeriodic, NULL); - // osTimerStart(HeartReportTimerId, HEART_PACKET_PERIOD_MS); + osTimerDef(PressureSensorDataReportTimer, onPressureSensorDataReportTimer); + PressureSensorDataReportTimerId = osTimerCreate(osTimer(PressureSensorDataReportTimer), osTimerPeriodic, NULL); + osTimerStart(PressureSensorDataReportTimerId, m_pressureSensorDataReportPeriodMs); osThreadDef(PacketRxThread, onPacketRxThreadStart, osPriorityNormal, 0, 1024); PacketRxThreadId = osThreadCreate(osThread(PacketRxThread), NULL); diff --git a/zsdk b/zsdk index b8f10ea..2c74701 160000 --- a/zsdk +++ b/zsdk @@ -1 +1 @@ -Subproject commit b8f10eae25ded517701a56b1e609f6608ed04f7a +Subproject commit 2c74701b86a85d9a7658f2e64a34a3f9101a2306