From d389d316945e3350c7c28470c6ad4e7ba3821aa1 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 18 Feb 2014 12:10:51 +0100 Subject: [PATCH 1/3] Issue #718 fixed (Cells voltage accuracy) --- radio/src/gui/view_telemetry.cpp | 2 +- radio/src/opentx.cpp | 2 +- radio/src/telemetry/frsky.h | 40 +++++++------- radio/src/telemetry/frsky_sport.cpp | 85 ++++++++++++++--------------- radio/src/telemetry/frsky_sport.h | 64 +++++++++++----------- 5 files changed, 97 insertions(+), 96 deletions(-) diff --git a/radio/src/gui/view_telemetry.cpp b/radio/src/gui/view_telemetry.cpp index 9e9c100c6..bc6faba85 100644 --- a/radio/src/gui/view_telemetry.cpp +++ b/radio/src/gui/view_telemetry.cpp @@ -379,7 +379,7 @@ void menuTelemetryFrsky(uint8_t event) #else uint8_t attr = PREC2; #endif - lcd_outdezNAtt(LCD_W, y, frskyData.hub.cellVolts[k] * 2, attr, 4); + lcd_outdezNAtt(LCD_W, y, TELEMETRY_CELL_VOLTAGE(k), attr, 4); y += 1*FH; } lcd_vline(LCD_W-3*FW-2, 8, 47); diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 320421007..bd758c4dc 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1280,7 +1280,7 @@ getvalue_t getValue(uint8_t i) else if (i==MIXSRC_FIRST_TELEM-1+TELEM_SPEED) return TELEMETRY_GPS_SPEED_BP; else if (i==MIXSRC_FIRST_TELEM-1+TELEM_DIST) return frskyData.hub.gpsDistance; else if (i==MIXSRC_FIRST_TELEM-1+TELEM_GPSALT) return TELEMETRY_GPS_ALT_BP; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CELL) return (int16_t)frskyData.hub.minCellVolts * 2; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CELL) return (int16_t)TELEMETRY_MIN_CELL_VOLTAGE; else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CELLS_SUM) return (int16_t)frskyData.hub.cellsSum; else if (i==MIXSRC_FIRST_TELEM-1+TELEM_VFAS) return (int16_t)frskyData.hub.vfas; else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CURRENT) return (int16_t)frskyData.hub.current; diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 440e2b0e5..a30940bb5 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -221,29 +221,31 @@ bool FRSKY_alarmRaised(uint8_t idx); void resetTelemetry(); -#define TELEMETRY_ALT_BP frskyData.hub.baroAltitude_bp -#define TELEMETRY_ALT_AP frskyData.hub.baroAltitude_ap -#define TELEMETRY_GPS_SPEED_BP frskyData.hub.gpsSpeed_bp -#define TELEMETRY_GPS_SPEED_AP frskyData.hub.gpsSpeed_ap -#define TELEMETRY_GPS_ALT_AP frskyData.hub.gpsAltitude_ap -#define TELEMETRY_GPS_ALT_BP frskyData.hub.gpsAltitude_bp -#define TELEMETRY_ALT frskyData.hub.baroAltitude_bp, frskyData.hub.baroAltitude_ap -#define TELEMETRY_ALT_FORMAT "%d.%02d," -#define TELEMETRY_CELLS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, frskyData.hub.cellVolts[0]*2/100, frskyData.hub.cellVolts[0]*2%100, frskyData.hub.cellVolts[1]*2/100, frskyData.hub.cellVolts[1]*2%100, frskyData.hub.cellVolts[2]*2/100, frskyData.hub.cellVolts[2]*2%100, frskyData.hub.cellVolts[3]*2/100, frskyData.hub.cellVolts[3]*2%100, frskyData.hub.cellVolts[4]*2/100, frskyData.hub.cellVolts[4]*2%100, frskyData.hub.cellVolts[5]*2/100, frskyData.hub.cellVolts[5]*2%100 -#define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," -#define TELEMETRY_CURRENT frskyData.hub.current / 100, frskyData.hub.current % 100 -#define TELEMETRY_CURRENT_FORMAT "%d.%02d," -#define TELEMETRY_VFAS frskyData.hub.vfas / 10, frskyData.hub.vfas % 10 -#define TELEMETRY_VFAS_FORMAT "%d.%d," -#define TELEMETRY_VSPEED frskyData.hub.varioSpeed < 0 ? '-' : ' ', frskyData.hub.varioSpeed / 100, frskyData.hub.varioSpeed % 100 -#define TELEMETRY_VSPEED_FORMAT "%c%d.%02d," +#define TELEMETRY_CELL_VOLTAGE(k) (frskyData.hub.cellVolts[k] * 2) +#define TELEMETRY_MIN_CELL_VOLTAGE (frskyData.hub.minCellVolts * 2) +#define TELEMETRY_ALT_BP frskyData.hub.baroAltitude_bp +#define TELEMETRY_ALT_AP frskyData.hub.baroAltitude_ap +#define TELEMETRY_GPS_SPEED_BP frskyData.hub.gpsSpeed_bp +#define TELEMETRY_GPS_SPEED_AP frskyData.hub.gpsSpeed_ap +#define TELEMETRY_GPS_ALT_AP frskyData.hub.gpsAltitude_ap +#define TELEMETRY_GPS_ALT_BP frskyData.hub.gpsAltitude_bp +#define TELEMETRY_ALT frskyData.hub.baroAltitude_bp, frskyData.hub.baroAltitude_ap +#define TELEMETRY_ALT_FORMAT "%d.%02d," +#define TELEMETRY_CELLS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, frskyData.hub.cellVolts[0]*2/100, frskyData.hub.cellVolts[0]*2%100, frskyData.hub.cellVolts[1]*2/100, frskyData.hub.cellVolts[1]*2%100, frskyData.hub.cellVolts[2]*2/100, frskyData.hub.cellVolts[2]*2%100, frskyData.hub.cellVolts[3]*2/100, frskyData.hub.cellVolts[3]*2%100, frskyData.hub.cellVolts[4]*2/100, frskyData.hub.cellVolts[4]*2%100, frskyData.hub.cellVolts[5]*2/100, frskyData.hub.cellVolts[5]*2%100 +#define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," +#define TELEMETRY_CURRENT frskyData.hub.current / 100, frskyData.hub.current % 100 +#define TELEMETRY_CURRENT_FORMAT "%d.%02d," +#define TELEMETRY_VFAS frskyData.hub.vfas / 10, frskyData.hub.vfas % 10 +#define TELEMETRY_VFAS_FORMAT "%d.%d," +#define TELEMETRY_VSPEED frskyData.hub.varioSpeed < 0 ? '-' : ' ', frskyData.hub.varioSpeed / 100, frskyData.hub.varioSpeed % 100 +#define TELEMETRY_VSPEED_FORMAT "%c%d.%02d," -#define TELEMETRY_STREAMING() (frskyStreaming > 0) +#define TELEMETRY_STREAMING() (frskyStreaming > 0) #if defined(FRSKY_HUB) - #define TELEMETRY_OPENXSENSOR() (frskyData.hub.openXsensor) + #define TELEMETRY_OPENXSENSOR() (frskyData.hub.openXsensor) #else - #define TELEMETRY_OPENXSENSOR() (0) + #define TELEMETRY_OPENXSENSOR() (0) #endif #endif diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 1f0d53888..4a7827add 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -36,46 +36,46 @@ #include "../opentx.h" -#define START_STOP 0x7e -#define BYTESTUFF 0x7d -#define STUFF_MASK 0x20 +#define START_STOP 0x7e +#define BYTESTUFF 0x7d +#define STUFF_MASK 0x20 // FrSky PRIM IDs (1 byte) -#define DATA_FRAME 0x10 +#define DATA_FRAME 0x10 // FrSky old DATA IDs (1 byte) -#define GPS_ALT_BP_ID 0x01 -#define TEMP1_ID 0x02 -#define RPM_ID 0x03 -#define FUEL_ID 0x04 -#define TEMP2_ID 0x05 -#define VOLTS_ID 0x06 -#define GPS_ALT_AP_ID 0x09 -#define BARO_ALT_BP_ID 0x10 -#define GPS_SPEED_BP_ID 0x11 -#define GPS_LONG_BP_ID 0x12 -#define GPS_LAT_BP_ID 0x13 -#define GPS_COURS_BP_ID 0x14 -#define GPS_DAY_MONTH_ID 0x15 -#define GPS_YEAR_ID 0x16 -#define GPS_HOUR_MIN_ID 0x17 -#define GPS_SEC_ID 0x18 -#define GPS_SPEED_AP_ID 0x19 -#define GPS_LONG_AP_ID 0x1A -#define GPS_LAT_AP_ID 0x1B -#define GPS_COURS_AP_ID 0x1C -#define BARO_ALT_AP_ID 0x21 -#define GPS_LONG_EW_ID 0x22 -#define GPS_LAT_NS_ID 0x23 -#define ACCEL_X_ID 0x24 -#define ACCEL_Y_ID 0x25 -#define ACCEL_Z_ID 0x26 -#define CURRENT_ID 0x28 -#define VARIO_ID 0x30 -#define VFAS_ID 0x39 -#define VOLTS_BP_ID 0x3A -#define VOLTS_AP_ID 0x3B -#define FRSKY_LAST_ID 0x3F +#define GPS_ALT_BP_ID 0x01 +#define TEMP1_ID 0x02 +#define RPM_ID 0x03 +#define FUEL_ID 0x04 +#define TEMP2_ID 0x05 +#define VOLTS_ID 0x06 +#define GPS_ALT_AP_ID 0x09 +#define BARO_ALT_BP_ID 0x10 +#define GPS_SPEED_BP_ID 0x11 +#define GPS_LONG_BP_ID 0x12 +#define GPS_LAT_BP_ID 0x13 +#define GPS_COURS_BP_ID 0x14 +#define GPS_DAY_MONTH_ID 0x15 +#define GPS_YEAR_ID 0x16 +#define GPS_HOUR_MIN_ID 0x17 +#define GPS_SEC_ID 0x18 +#define GPS_SPEED_AP_ID 0x19 +#define GPS_LONG_AP_ID 0x1A +#define GPS_LAT_AP_ID 0x1B +#define GPS_COURS_AP_ID 0x1C +#define BARO_ALT_AP_ID 0x21 +#define GPS_LONG_EW_ID 0x22 +#define GPS_LAT_NS_ID 0x23 +#define ACCEL_X_ID 0x24 +#define ACCEL_Y_ID 0x25 +#define ACCEL_Z_ID 0x26 +#define CURRENT_ID 0x28 +#define VARIO_ID 0x30 +#define VFAS_ID 0x39 +#define VOLTS_BP_ID 0x3A +#define VOLTS_AP_ID 0x3B +#define FRSKY_LAST_ID 0x3F // FrSky new DATA IDs (2 bytes) #define RSSI_ID 0xf101 @@ -119,8 +119,8 @@ #define GPS_TIME_DATE_LAST_ID 0x085f // FrSky wrong IDs ? -#define BETA_VARIO_ID 0x8030 -#define BETA_BARO_ALT_ID 0x8010 +#define BETA_VARIO_ID 0x8030 +#define BETA_BARO_ALT_ID 0x8010 uint8_t telemetryState = TELEMETRY_INIT; @@ -255,17 +255,16 @@ void processHubPacket(uint8_t id, uint16_t value) break; case VOLTS_ID: - // Voltage => Cell number + Cell voltage { + // Voltage => Cell number + Cell voltage uint8_t battnumber = ((frskyData.hub.volts & 0x00F0) >> 4); if (battnumber < 12) { if (frskyData.hub.cellsCount < battnumber+1) { frskyData.hub.cellsCount = battnumber+1; } - // TODO precision could be 0.01V instead of 0.02V - uint8_t cellVolts = (uint8_t)(((((frskyData.hub.volts & 0xFF00) >> 8) + ((frskyData.hub.volts & 0x000F) << 8)))/10); + uint16_t cellVolts = (uint16_t)(((((frskyData.hub.volts & 0xFF00) >> 8) + ((frskyData.hub.volts & 0x000F) << 8))) / 5); frskyData.hub.cellVolts[battnumber] = cellVolts; - if (!frskyData.hub.minCellVolts || cellVolts < frskyData.hub.minCellVolts || battnumber==frskyData.hub.minCellIdx) { + if (!frskyData.hub.minCellVolts || cellVolts 0) +#define TELEMETRY_STREAMING() (frskyData.rssi[0].value > 0) #endif From 44ea1ae8eba760fa085602399550c9b85c01c93c Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Thu, 20 Feb 2014 12:35:34 +0100 Subject: [PATCH 2/3] Cells decoding wasn't updated for SPORT --- radio/src/telemetry/frsky_sport.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 4a7827add..ac46c7252 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -491,8 +491,8 @@ void processSportPacket(uint8_t *packet) uint32_t minCell, minCellNum; //TODO: Use reported total voltages (bits 4-7)? - frskyData.hub.cellVolts[battnumber] = ((cells & 0x000FFF00) >> 8) / 10; - frskyData.hub.cellVolts[battnumber+1] = ((cells & 0xFFF00000) >> 20) / 10; + frskyData.hub.cellVolts[battnumber] = ((cells & 0x000FFF00) >> 8) / 5; + frskyData.hub.cellVolts[battnumber+1] = ((cells & 0xFFF00000) >> 20) / 5; if (frskyData.hub.cellsCount < battnumber+2) frskyData.hub.cellsCount = battnumber+2; From 5659dcb78ff56cacf229897b6ba9ae10978d881a Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Thu, 20 Feb 2014 12:46:29 +0100 Subject: [PATCH 3/3] Fix cell logs --- radio/src/telemetry/frsky.h | 2 +- radio/src/telemetry/frsky_sport.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index a30940bb5..5acce01ac 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -231,7 +231,7 @@ void resetTelemetry(); #define TELEMETRY_GPS_ALT_BP frskyData.hub.gpsAltitude_bp #define TELEMETRY_ALT frskyData.hub.baroAltitude_bp, frskyData.hub.baroAltitude_ap #define TELEMETRY_ALT_FORMAT "%d.%02d," -#define TELEMETRY_CELLS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, frskyData.hub.cellVolts[0]*2/100, frskyData.hub.cellVolts[0]*2%100, frskyData.hub.cellVolts[1]*2/100, frskyData.hub.cellVolts[1]*2%100, frskyData.hub.cellVolts[2]*2/100, frskyData.hub.cellVolts[2]*2%100, frskyData.hub.cellVolts[3]*2/100, frskyData.hub.cellVolts[3]*2%100, frskyData.hub.cellVolts[4]*2/100, frskyData.hub.cellVolts[4]*2%100, frskyData.hub.cellVolts[5]*2/100, frskyData.hub.cellVolts[5]*2%100 +#define TELEMETRY_CELLS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100 #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," #define TELEMETRY_CURRENT frskyData.hub.current / 100, frskyData.hub.current % 100 #define TELEMETRY_CURRENT_FORMAT "%d.%02d," diff --git a/radio/src/telemetry/frsky_sport.h b/radio/src/telemetry/frsky_sport.h index f0cef07ca..4b39022a1 100644 --- a/radio/src/telemetry/frsky_sport.h +++ b/radio/src/telemetry/frsky_sport.h @@ -189,7 +189,7 @@ void resetTelemetry(); #define TELEMETRY_ALT_AP (frskyData.hub.baroAltitude % 100) #define TELEMETRY_ALT frskyData.hub.baroAltitude < 0 ? '-' : ' ', abs(frskyData.hub.baroAltitude / 100), abs(frskyData.hub.baroAltitude % 100) #define TELEMETRY_ALT_FORMAT "%c%d.%02d," -#define TELEMETRY_CELLS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, frskyData.hub.cellVolts[0]*2/100, frskyData.hub.cellVolts[0]*2%100, frskyData.hub.cellVolts[1]*2/100, frskyData.hub.cellVolts[1]*2%100, frskyData.hub.cellVolts[2]*2/100, frskyData.hub.cellVolts[2]*2%100, frskyData.hub.cellVolts[3]*2/100, frskyData.hub.cellVolts[3]*2%100, frskyData.hub.cellVolts[4]*2/100, frskyData.hub.cellVolts[4]*2%100, frskyData.hub.cellVolts[5]*2/100, frskyData.hub.cellVolts[5]*2%100 +#define TELEMETRY_CELLS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100 #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," #define TELEMETRY_CURRENT frskyData.hub.current / 10, frskyData.hub.current % 10 #define TELEMETRY_CURRENT_FORMAT "%d.%d,"