diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 1d04ef74b..336ddd3ca 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -321,6 +321,7 @@ PACK(struct FrSkyTelemetryData { // TODO EEPROM change, rename to VarioData int8_t varioCenterMin; int8_t varioMin; int8_t varioMax; + uint8_t rssiSource; }); #else // TODO remove this also on Taranis @@ -335,6 +336,7 @@ PACK(struct FrSkyTelemetryData { int8_t varioCenterMin; int8_t varioMin; int8_t varioMax; + uint8_t rssiSource; }); #endif @@ -832,7 +834,7 @@ static inline void check_struct() CHKSIZE(FrSkyBarData, 6); CHKSIZE(FrSkyLineData, 4); CHKTYPE(union FrSkyScreenData, 24); - CHKSIZE(FrSkyTelemetryData, 104); + CHKSIZE(FrSkyTelemetryData, 105); CHKSIZE(ModelHeader, 12); CHKSIZE(CurveData, 4); #elif defined(PCBTARANIS) @@ -847,7 +849,7 @@ static inline void check_struct() CHKSIZE(FrSkyBarData, 6); CHKSIZE(FrSkyLineData, 6); CHKTYPE(union FrSkyScreenData, 24); - CHKSIZE(FrSkyTelemetryData, 104); + CHKSIZE(FrSkyTelemetryData, 105); CHKSIZE(ModelHeader, 24); CHKSIZE(CurveData, 4); #elif defined(PCBHORUS) @@ -858,7 +860,7 @@ static inline void check_struct() CHKSIZE(FlightModeData, 44); CHKSIZE(TimerData, 16); CHKSIZE(SwashRingData, 8); - CHKSIZE(FrSkyTelemetryData, 5); + CHKSIZE(FrSkyTelemetryData, 6); CHKSIZE(ModelHeader, 27); CHKSIZE(CurveData, 4); CHKSIZE(CustomScreenData, 610); @@ -873,7 +875,7 @@ static inline void check_struct() CHKSIZE(SwashRingData, 8); CHKSIZE(FrSkyBarData, 5); CHKSIZE(FrSkyLineData, 2); - CHKSIZE(FrSkyTelemetryData, 88); + CHKSIZE(FrSkyTelemetryData, 89); CHKSIZE(ModelHeader, 12); CHKTYPE(CurveData, 4); #else @@ -906,25 +908,25 @@ static inline void check_struct() #if defined(PCBXLITES) CHKSIZE(RadioData, 860); - CHKSIZE(ModelData, 6054); + CHKSIZE(ModelData, 6055); #elif defined(PCBXLITE) CHKSIZE(RadioData, 852); - CHKSIZE(ModelData, 6054); + CHKSIZE(ModelData, 6055); #elif defined(PCBX7) CHKSIZE(RadioData, 858); - CHKSIZE(ModelData, 6054); + CHKSIZE(ModelData, 6055); #elif defined(PCBX9E) CHKSIZE(RadioData, 960); - CHKSIZE(ModelData, 6549); + CHKSIZE(ModelData, 6550); #elif defined(PCBX9D) || defined(PCBX9DP) CHKSIZE(RadioData, 880); - CHKSIZE(ModelData, 6536); + CHKSIZE(ModelData, 6537); #elif defined(PCBSKY9X) CHKSIZE(RadioData, 735); - CHKSIZE(ModelData, 5215); + CHKSIZE(ModelData, 5216); #elif defined(PCBHORUS) CHKSIZE(RadioData, 855); - CHKSIZE(ModelData, 9721); + CHKSIZE(ModelData, 9722); #endif #undef CHKSIZE diff --git a/radio/src/gui/128x64/model_telemetry.cpp b/radio/src/gui/128x64/model_telemetry.cpp index 5aa0672ae..45d3c7471 100644 --- a/radio/src/gui/128x64/model_telemetry.cpp +++ b/radio/src/gui/128x64/model_telemetry.cpp @@ -26,6 +26,7 @@ enum MenuModelTelemetryFrskyItems { ITEM_TELEMETRY_INVERTED_SERIAL, #endif ITEM_TELEMETRY_RSSI_LABEL, + ITEM_TELEMETRY_RSSI_SOURCE, ITEM_TELEMETRY_RSSI_ALARM1, ITEM_TELEMETRY_RSSI_ALARM2, ITEM_TELEMETRY_DISABLE_ALARMS, @@ -57,7 +58,7 @@ enum MenuModelTelemetryFrskyItems { #define USRDATA_ROWS -#define RSSI_ROWS LABEL(RSSI), 0, 0, 1, +#define RSSI_ROWS LABEL(RSSI), 0, 0, 0, 1, #define SCREEN_TYPE_ROWS 0 @@ -254,6 +255,19 @@ void menuModelTelemetryFrsky(event_t event) lcdDrawTextAlignedLeft(y, "RSSI"); break; + case ITEM_TELEMETRY_RSSI_SOURCE: { + lcdDrawTextAlignedLeft(y, STR_SOURCE); + drawSource(TELEM_COL2, y, g_model.frsky.rssiSource ? MIXSRC_FIRST_TELEM + 3 * (g_model.frsky.rssiSource - 1) : 0, attr); + if (g_model.frsky.rssiSource) { + TelemetrySensor * sensor = &g_model.telemetrySensors[g_model.frsky.rssiSource]; + drawReceiverName(TELEM_COL2 + 5 * FW, y, (sensor->instance >> 7) & 0x01, (sensor->instance >> 5) & 0x03, 0); + } + if (attr) { + g_model.frsky.rssiSource = checkIncDec(event, g_model.frsky.rssiSource, 0, MAX_TELEMETRY_SENSORS, EE_MODEL | NO_INCDEC_MARKS, isRssiSensorAvailable); + } + break; + } + case ITEM_TELEMETRY_RSSI_ALARM1: case ITEM_TELEMETRY_RSSI_ALARM2: { bool warning = (k==ITEM_TELEMETRY_RSSI_ALARM1); diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 8a1b5dccd..c44969128 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -72,6 +72,7 @@ bool isCurrentSensor(int sensor); bool isTelemetryFieldAvailable(int index); bool isTelemetryFieldComparisonAvailable(int index); bool isSensorAvailable(int sensor); +bool isRssiSensorAvailable(int sensor); bool modelHasNotes(); diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 278da5772..657755181 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -46,6 +46,17 @@ bool isInputAvailable(int input) return false; } +bool isRssiSensorAvailable(int sensor) +{ + if (sensor == 0) + return true; + else { + TelemetrySensor &telemSensor = g_model.telemetrySensors[abs(sensor) - 1]; + return (telemSensor.isAvailable() && telemSensor.id == RSSI_ID); + } +} + + bool isSensorAvailable(int sensor) { if (sensor == 0) diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index cce6cc737..8b73386c9 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -162,8 +162,11 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe if (dataId == RSSI_ID) { telemetryStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected data = SPORT_DATA_U8(packet); - if (data == 0) - telemetryData.rssi.reset(); + if(g_model.frsky.rssiSource) { + TelemetrySensor * sensor = & g_model.telemetrySensors[g_model.frsky.rssiSource]; + if(sensor->instance == instance) + telemetryData.rssi.set(data); + } else telemetryData.rssi.set(data); }