From 18a0e3629c1bb38b0cf68dd30a02f4912f8b91d4 Mon Sep 17 00:00:00 2001 From: Frankie Arzu <32604366+frankiearzu@users.noreply.github.com> Date: Fri, 28 Mar 2025 19:56:43 -0500 Subject: [PATCH] fix(tele): DSM LIPO 6S sensor endian order (#6014) --- radio/src/telemetry/spektrum.cpp | 44 ++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/radio/src/telemetry/spektrum.cpp b/radio/src/telemetry/spektrum.cpp index a3347a66d..c926cb3d5 100644 --- a/radio/src/telemetry/spektrum.cpp +++ b/radio/src/telemetry/spektrum.cpp @@ -272,13 +272,13 @@ const SpektrumSensor spektrumSensors[] = { //SS(0x38, 0, uint16, STR_SENSOR_PRESSSURE, UNIT_PSI, 1), // 0x3A Lipo 6s Monitor Cells - SS(I2C_CELLS, 0, uint16, STR_SENSOR_CL01, UNIT_VOLTS, 2), // Voltage across cell 1, .01V steps - SS(I2C_CELLS, 2, uint16, STR_SENSOR_CL02, UNIT_VOLTS, 2), - SS(I2C_CELLS, 4, uint16, STR_SENSOR_CL03, UNIT_VOLTS, 2), - SS(I2C_CELLS, 6, uint16, STR_SENSOR_CL04, UNIT_VOLTS, 2), - SS(I2C_CELLS, 8, uint16, STR_SENSOR_CL05, UNIT_VOLTS, 2), - SS(I2C_CELLS, 10, uint16, STR_SENSOR_CL06, UNIT_VOLTS, 2), - SS(I2C_CELLS, 12, uint16, STR_SENSOR_TEMP2, UNIT_CELSIUS, 1), // Temperature, 0.1C (0-655.34C) + SS(I2C_CELLS, 0, uint16le, STR_SENSOR_CL01, UNIT_VOLTS, 2), // Voltage across cell 1, .01V steps + SS(I2C_CELLS, 2, uint16le, STR_SENSOR_CL02, UNIT_VOLTS, 2), + SS(I2C_CELLS, 4, uint16le, STR_SENSOR_CL03, UNIT_VOLTS, 2), + SS(I2C_CELLS, 6, uint16le, STR_SENSOR_CL04, UNIT_VOLTS, 2), + SS(I2C_CELLS, 8, uint16le, STR_SENSOR_CL05, UNIT_VOLTS, 2), + SS(I2C_CELLS, 10, uint16le, STR_SENSOR_CL06, UNIT_VOLTS, 2), + SS(I2C_CELLS, 12, uint16le, STR_SENSOR_TEMP2, UNIT_CELSIUS, 1), // Temperature, 0.1C (0-655.34C) // 0x40 Vario-S SS(I2C_VARIO, 0, int16, STR_SENSOR_ALT, UNIT_METERS, 1), @@ -677,6 +677,12 @@ void processSpektrumPacket(const uint8_t *packet) continue; // discard unavailable sensors (farzu: i think might not be needed.. previous validation) } else { value = value / 10; + if (i2cAddress == I2C_SMART_BAT_CELLS_1_6) { + // Map to FrSky style cell values (All Cells in a single Sensor) + int cellIndex = ((sensor->startByte-2) / 2) << 16; // First cell is at StartByte 2 + uint32_t valueCells = cellIndex | value; + setTelemetryValue(PROTOCOL_TELEMETRY_SPEKTRUM, I2C_PSEUDO_TX_CELLS, 0, instance, valueCells, UNIT_CELLS, 2); + } } } // I2C_SMART_BAT_REALTIME @@ -695,14 +701,14 @@ void processSpektrumPacket(const uint8_t *packet) } } // I2C_ESC - else if (i2cAddress == I2C_CELLS && sensor->unit == UNIT_VOLTS) { - if (value == 0x7FFF) continue; // ignore NO-DATA - - // Map to FrSky style cell values (All Cells in a single Sensor) - int cellIndex = (sensor->startByte / 2) << 16; - uint32_t valueCells = cellIndex | value; - setTelemetryValue(PROTOCOL_TELEMETRY_SPEKTRUM, I2C_PSEUDO_TX_CELLS, 0, instance, valueCells, UNIT_CELLS, 2); - + else if (i2cAddress == I2C_CELLS) { + if (value == 0x7FFF) continue; // ignore NO-DATA for Voltage and Temp + if (sensor->unit == UNIT_VOLTS) { + // Map to FrSky style cell values (All Cells in a single Sensor) + int cellIndex = (sensor->startByte / 2) << 16; // First Cell is at startByte 0 + uint32_t valueCells = cellIndex | value; + setTelemetryValue(PROTOCOL_TELEMETRY_SPEKTRUM, I2C_PSEUDO_TX_CELLS, 0, instance, valueCells, UNIT_CELLS, 2); + } // Continue to process regular Single Cell value } // I2C_CELLS @@ -1145,13 +1151,13 @@ static char test17data[] = {0x17, 0x00, 0x25, 0x00, 0x00, static char test34data[] = {0x34, 0x00, 0x2F, 0x00, 0x30, 0x09, 0x85, 0x01, 0x2B, 0x00, 0x07, 0x0A, 0x81, 0x01 }; -// *********** Lipo monitor (Big-Endian)*************** +// *********** Lipo monitor (Little-Endian)*************** // Example 0x3A: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 // 3A 00 | 01 9A | 01 9B | 01 9C | 01 9D | 7F FF | 7F FF | 0F AC // 4.10V 4.11V 4.12V 4.12v -- -- 40.1C -static char test3Adata[] = {0x3A, 0x00, 0x01, 0x9A, 0x01, 0x9B, 0x01, 0x9C, - 0x01, 0x9D, 0x7F, 0xFF, 0x7F, 0xFF, - 0x01, 0x91 }; +static char test3Adata[] = {0x3A, 0x00, 0x9A, 0x01, 0x9B, 0x01, 0x9C, 0x01, + 0x9D, 0x01, 0x7F, 0xFF, 0x7F, 0xFF, + 0x91, 0x01 }; // RemoteID (0x27), embeds Gps data in its frames, but by puting the real I2C frame