From 974fc1c0c609a9129d6c522954eae323ed8167a1 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sun, 11 Aug 2024 00:12:27 +0800 Subject: [PATCH] update --- app_protocols/transmit_disfection_protocol | 2 +- usrc/module/pxxpsbus.hpp | 61 ++++++++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/app_protocols/transmit_disfection_protocol b/app_protocols/transmit_disfection_protocol index 058ea4c..88c57e4 160000 --- a/app_protocols/transmit_disfection_protocol +++ b/app_protocols/transmit_disfection_protocol @@ -1 +1 @@ -Subproject commit 058ea4cf80c30868271212b80b97a86539339ea1 +Subproject commit 88c57e4c89fbde1ec1c00efbe508753e6432b349 diff --git a/usrc/module/pxxpsbus.hpp b/usrc/module/pxxpsbus.hpp index ecafa78..4eea34a 100644 --- a/usrc/module/pxxpsbus.hpp +++ b/usrc/module/pxxpsbus.hpp @@ -7,13 +7,20 @@ using namespace transmit_disfection_protocol; class PXXPSBus { PXXPressureSensorBus psbus; bool m_isInitialized = false; + osTimerId reportTimerId; // 压力传感器数值上报 public: void initialize(UART_HandleTypeDef* huart) { psbus.init(huart); m_isInitialized = true; + + osTimerDef(reportTimer, onTimer); + reportTimerId = osTimerCreate(osTimer(reportTimer), osTimerPeriodic, this); + BIND_FN(PXXPSBus, this, fn_psbus_read_data); BIND_FN(PXXPSBus, this, fn_psbus_scan); + BIND_FN(PXXPSBus, this, fn_psbus_start_report); + BIND_FN(PXXPSBus, this, fn_psbus_stop_report); } bool isInitialized() { return m_isInitialized; } @@ -38,12 +45,58 @@ class PXXPSBus { auto* sensors = psbus.sensors; int numSensor = psbus.sensorNum; - ack_psbus_scan_t result = {0}; - result.numOnlineId = numSensor; - for (int i = 0; i < numSensor; i++) { - result.onlineId[i] = sensors[i].id; + static ack_psbus_scan_t result; + memset(&result, 0, sizeof(result)); + static_assert(ZARRAY_SIZE(result.sensor) == ZARRAY_SIZE(psbus.sensors)); + result.numOnlineId = numSensor; + for (int i = 0; i < PXX_PRESSURE_SENSOR_NUM; i++) { + if (sensors[i].online) { + result.sensor[0].ptype = sensors[i].type; + result.sensor[0].subid = sensors[i].id; + result.sensor[0].isOnline = 1; + result.sensor[0].precision = sensors[i].p100_sensor_info.precision; + result.sensor[0].zero = sensors[i].p100_sensor_info.zero_point; + result.sensor[0].full = sensors[i].p100_sensor_info.range_full_point; + } } zcanbus_send_ack(cxt->packet, (uint8_t*)&result, sizeof(result)); } + + void fn_psbus_start_report(ProcessContext* cxt) { + int period = GET_PARAM(0); + if (period < 100) period = 100; + osTimerStop(reportTimerId); + osTimerStart(reportTimerId, period); + zcanbus_send_ack(cxt->packet, nullptr, 0); + } + + void fn_psbus_stop_report(ProcessContext* cxt) { + osTimerStop(reportTimerId); + zcanbus_send_ack(cxt->packet, nullptr, 0); + } + + public: + static void onTimer(const void* tid) { + PXXPSBus* bus = (PXXPSBus*)pvTimerGetTimerID((TimerHandle_t)tid); + bus->onTimer(); + } + void onTimer() { + int16_t val = 0; + + static uint8_t report_buf[100]; + report_pressure_data_t* reportData = (report_pressure_data_t*)report_buf; + + reportData->sensorDataNum = 0; + for (int i = 0; i < psbus.sensorNum; i++) { + if (psbus.sensors[i].online) { + psbus.readData(i, &val); + reportData->data[i].subid = psbus.sensors[i].id; + reportData->data[i].pressureVal = val; + reportData->sensorDataNum++; + } + } + zcanbus_send_report(kreport_pressure_data, (uint8_t*)reportData, // + sizeof(*reportData) + sizeof(reportData->data[0]) * reportData->sensorDataNum, 30); + } }; } // namespace iflytop \ No newline at end of file