From 18a1992e32c79b841b25c1218b0ef3c3c90b6063 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 17 Jun 2025 04:07:53 +0200 Subject: [PATCH] feat(telem): allow CRSF cells or volt array for frame 0x0E (#6361) --- radio/src/telemetry/crossfire.cpp | 24 +++++++++++++++++++----- radio/src/telemetry/crossfire.h | 2 ++ radio/src/translations/untranslated.h | 1 + 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/radio/src/telemetry/crossfire.cpp b/radio/src/telemetry/crossfire.cpp index a27dedc3c..4ba1fd784 100644 --- a/radio/src/telemetry/crossfire.cpp +++ b/radio/src/telemetry/crossfire.cpp @@ -67,6 +67,7 @@ const CrossfireSensor crossfireSensors[] = { CS(CF_RPM_ID, 0, STR_SENSOR_RPM, UNIT_RPMS, 0), CS(TEMP_ID, 0, STR_SENSOR_TEMP, UNIT_DEGREE, 1), CS(CELLS_ID, 0, STR_SENSOR_CELLS, UNIT_CELLS, 2), + CS(VOLT_ARRAY_ID, 0, STR_SENSOR_VOLT, UNIT_VOLTS, 2), CS(0, 0, "UNKNOWN", UNIT_RAW, 0), }; // clang-format on @@ -101,6 +102,8 @@ const CrossfireSensor & getCrossfireSensor(uint8_t id, uint8_t subId) return crossfireSensors[TEMP_INDEX]; else if (id == CELLS_ID) return crossfireSensors[CELLS_INDEX]; + else if (id == VOLT_ARRAY_ID) + return crossfireSensors[VOLT_ARRAY_INDEX]; else return crossfireSensors[UNKNOWN_INDEX]; } @@ -223,12 +226,23 @@ void processCrossfireTelemetryFrame(uint8_t module, uint8_t* rxBuffer, getCrossfireTelemetryValue<1>(3, value, rxBuffer); uint8_t sensorID = value; - // We can handle only up to 8 cells - for(uint8_t i = 0; i * 2 < min(16, crsfPayloadLen - 4); i++) { - getCrossfireTelemetryValue<2>(4 + i * 2, value, rxBuffer); - const CrossfireSensor & sensor = crossfireSensors[CELLS_INDEX]; - setTelemetryValue(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id + (sensorID << 8), 0, 0, + if (sensorID < 128) { + // Treating frame as Cells sensor + // We can handle only up to 8 cells + for(uint8_t i = 0; i * 2 < min(16, crsfPayloadLen - 4); i++) { + getCrossfireTelemetryValue<2>(4 + i * 2, value, rxBuffer); + const CrossfireSensor & sensor = crossfireSensors[CELLS_INDEX]; + setTelemetryValue(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id + (sensorID << 8), 0, 0, i << 16 | value / 10, sensor.unit, sensor.precision); + } + } else { + // Treating frame as Voltage sensor array + for(uint8_t i = 0; i * 2 < (crsfPayloadLen - 4); i++) { + value = (rxBuffer[4 + i * 2] << 8) + rxBuffer[4 + i * 2 + 1]; + const CrossfireSensor & sensor = crossfireSensors[VOLT_ARRAY_INDEX]; + setTelemetryValue(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id + (sensorID << 8), 0, i, + value / 10, sensor.unit, sensor.precision); + } } break; } diff --git a/radio/src/telemetry/crossfire.h b/radio/src/telemetry/crossfire.h index 232f1d3b9..3a3c713b2 100644 --- a/radio/src/telemetry/crossfire.h +++ b/radio/src/telemetry/crossfire.h @@ -39,6 +39,7 @@ #define CF_RPM_ID 0x0C #define TEMP_ID 0x0D #define CELLS_ID 0x0E +#define VOLT_ARRAY_ID 0xFE // Pseudo sensor out of 0x0E frame #define LINK_ID 0x14 #define CHANNELS_ID 0x16 #define LINK_RX_ID 0x1C @@ -102,6 +103,7 @@ enum CrossfireSensorIndexes { CF_RPM_INDEX, TEMP_INDEX, CELLS_INDEX, + VOLT_ARRAY_INDEX, UNKNOWN_INDEX, }; diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index 95a44d5fb..29b878ee0 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -116,6 +116,7 @@ #define STR_SENSOR_A2 "A2" #define STR_SENSOR_A3 "A3" #define STR_SENSOR_A4 "A4" +#define STR_SENSOR_VOLT "Volt" #define STR_SENSOR_BATT "RxBt" #define STR_SENSOR_ALT "Alt" #define STR_SENSOR_TEMP "Temp"