From 8e07f9b0f41399edff4875690eaa2c8617e9ae3c Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Wed, 14 Jun 2017 23:34:27 +0200 Subject: [PATCH] Allow to disable telemetry alarams (#4981) * Allow to disable telemetry alarams This mainly useful for cheap transceivers that have telemetry but no power amplifier and very limited range of often 10-20 meters. This includes fishpepper's tinyFISH FC (and its legal/illegal clones) and also Spektrum BNF models. * Always disable a warning when RSSI Warnings are disabled * Compile fix * Fix typos, also mute sensor lost Refactor the FrskyRSSIAlarm[2] into a EEPROM compatible RssiAlarm struct * Compile fixes * Also refactor Companion * Cleanup unused datastruct on ARM * Compile fix for AVR * Change int to uin8_t for avr * Fix strings --- companion/src/eeprominterface.cpp | 3 +- .../src/firmwares/opentx/opentxeeprom.cpp | 18 +- companion/src/modeledit/telemetry.cpp | 36 ++-- companion/src/modeledit/telemetry.h | 8 +- companion/src/modeledit/telemetry.ui | 161 +++++++++--------- companion/src/multimodelprinter.cpp | 13 +- companion/src/radiodata.h | 20 ++- radio/src/datastructs.h | 47 ++--- radio/src/gui/128x64/model_telemetry.cpp | 23 ++- radio/src/gui/128x64/view_telemetry.cpp | 2 +- radio/src/gui/212x64/model_telemetry.cpp | 17 +- radio/src/gui/212x64/view_main.cpp | 2 +- radio/src/gui/212x64/view_telemetry.cpp | 2 +- radio/src/gui/480x272/model_telemetry.cpp | 20 ++- radio/src/lua/api_general.cpp | 4 +- radio/src/opentx.cpp | 10 ++ radio/src/opentx.h | 2 + radio/src/storage/eeprom_conversions.cpp | 13 +- radio/src/telemetry/telemetry.cpp | 42 ++--- radio/src/translations.cpp | 5 +- radio/src/translations.h | 3 + radio/src/translations/cz.h.txt | 3 + radio/src/translations/de.h.txt | 3 + radio/src/translations/en.h.txt | 3 + radio/src/translations/es.h.txt | 3 + radio/src/translations/fi.h.txt | 3 + radio/src/translations/fr.h.txt | 3 + radio/src/translations/it.h.txt | 3 + radio/src/translations/nl.h.txt | 3 + radio/src/translations/pl.h.txt | 3 + radio/src/translations/pt.h.txt | 3 + radio/src/translations/se.h.txt | 3 + 32 files changed, 297 insertions(+), 187 deletions(-) diff --git a/companion/src/eeprominterface.cpp b/companion/src/eeprominterface.cpp index a46f7445d..99ab432eb 100644 --- a/companion/src/eeprominterface.cpp +++ b/companion/src/eeprominterface.cpp @@ -1392,8 +1392,6 @@ void FrSkyData::clear() mAhPersistent = 0; storedMah = 0; fasOffset = 0; - rssiAlarms[0].clear(2, 45); - rssiAlarms[1].clear(3, 42); for (int i=0; i<4; i++) screens[i].clear(); varioSource = 2/*VARIO*/; @@ -1560,6 +1558,7 @@ void ModelData::clear() timers[i].clear(); swashRingData.clear(); frsky.clear(); + rssiAlarms.clear(); for (int i=0; i(this, frsky.varioCenterMin)); Append(new SignedField<8>(this, frsky.varioMin)); Append(new SignedField<8>(this, frsky.varioMax)); - for (int i=0; i<2; i++) { - Append(new ConversionField< UnsignedField<2> >(this, frsky.rssiAlarms[i].level, &rssiConversionTable[i], "RSSI")); - Append(new ConversionField< SignedField<6> >(this, frsky.rssiAlarms[i].value, -45+i*3)); - } + Append(new BoolField<1>(this, rssiAlarms.disabled)); + Append(new SpareBitsField<1>(this)); + Append(new ConversionField >(this, rssiAlarms.warning, -45)); + Append(new SpareBitsField<2>(this)); + Append(new ConversionField >(this, rssiAlarms.critical, -42)); + if (version == 216) { Append(new BoolField<1>(this, frsky.mAhPersistent)); Append(new UnsignedField<15>(this, frsky.storedMah)); @@ -2881,8 +2883,8 @@ class FrskyField: public StructField { Append(new SignedField<4>(this, frsky.varioMin, "Vario Min")); Append(new SignedField<4>(this, frsky.varioMax)); for (int i=0; i<2; i++) { - Append(new ConversionField< UnsignedField<2> >(this, frsky.rssiAlarms[i].level, &rssiConversionTable[i], "RSSI level")); - Append(new ConversionField< SignedField<6> >(this, frsky.rssiAlarms[i].value, -45+i*3, 0, 0, 100, "RSSI value")); + Append(new ConversionField< UnsignedField<2> >(this, rssiAlarms.level[i], &rssiConversionTable[i], "RSSI level")); + Append(new ConversionField< SignedField<6> >(this, i ==0 ? rssiAlarms.warning : rssiAlarms.critical, -45+i*3, 0, 0, 100, "RSSI value")); } for (int i=0; i<2; i++) { Append(new FrskyScreenField(this, frsky.screens[i], board, version, variant)); @@ -3246,7 +3248,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig } if ((board != BOARD_STOCK && (board != BOARD_M128 || version < 215)) || (variant & FRSKY_VARIANT)) { - internalField.Append(new FrskyField(this, modelData.frsky, board, version, variant)); + internalField.Append(new FrskyField(this, modelData.frsky, modelData.rssiAlarms, board, version, variant)); } else if ((board == BOARD_STOCK || board == BOARD_M128) && (variant & MAVLINK_VARIANT)) { internalField.Append(new MavlinkField(this, modelData.mavlink, board, version)); diff --git a/companion/src/modeledit/telemetry.cpp b/companion/src/modeledit/telemetry.cpp index 58c6e38d6..b3628612e 100644 --- a/companion/src/modeledit/telemetry.cpp +++ b/companion/src/modeledit/telemetry.cpp @@ -829,24 +829,26 @@ void TelemetryPanel::setup() } ui->telemetryProtocol->setCurrentIndex(model->telemetryProtocol); ui->ignoreSensorIds->setField(model->frsky.ignoreSensorIds, this); + ui->disableTelemetryAlarms->setField(model->rssiAlarms.disabled); } else { ui->telemetryProtocolLabel->hide(); ui->telemetryProtocol->hide(); ui->ignoreSensorIds->hide(); + ui->disableTelemetryAlarms->hide(); } - ui->rssiAlarm1SB->setValue(model->frsky.rssiAlarms[0].value); - ui->rssiAlarm2SB->setValue(model->frsky.rssiAlarms[1].value); - if (!IS_HORUS_OR_TARANIS(firmware->getBoard())) { - ui->rssiAlarm1CB->setCurrentIndex(model->frsky.rssiAlarms[0].level); - ui->rssiAlarm2CB->setCurrentIndex(model->frsky.rssiAlarms[1].level); + ui->rssiAlarmWarningSB->setValue(model->rssiAlarms.warning); + ui->rssiAlarmCriticalSB->setValue(model->rssiAlarms.critical); + if (!IS_ARM(firmware->getBoard())) { + ui->rssiAlarmWarningCB->setCurrentIndex(model->rssiAlarms.level[0]); + ui->rssiAlarmCriticalCB->setCurrentIndex(model->rssiAlarms.level[1]); } else { - ui->rssiAlarm1CB->hide(); - ui->rssiAlarm2CB->hide(); - ui->rssiAlarm1Label->setText(tr("Low Alarm")); - ui->rssiAlarm2Label->setText(tr("Critical Alarm")); + ui->rssiAlarmWarningCB->hide(); + ui->rssiAlarmCriticalCB->hide(); + ui->rssiAlarmWarningLabel->setText(tr("Low Alarm")); + ui->rssiAlarmCriticalLabel->setText(tr("Critical Alarm")); } /*if (IS_ARM(firmware->getBoard())) { @@ -1001,27 +1003,27 @@ void TelemetryPanel::on_frskyProtoCB_currentIndexChanged(int index) } } -void TelemetryPanel::on_rssiAlarm1CB_currentIndexChanged(int index) +void TelemetryPanel::on_rssiAlarmWarningCB_currentIndexChanged(int index) { - model->frsky.rssiAlarms[0].level = index; + model->rssiAlarms.level[0] = index; emit modified(); } -void TelemetryPanel::on_rssiAlarm2CB_currentIndexChanged(int index) +void TelemetryPanel::on_rssiAlarmCriticalCB_currentIndexChanged(int index) { - model->frsky.rssiAlarms[1].level = index; + model->rssiAlarms.level[1] = index; emit modified(); } -void TelemetryPanel::on_rssiAlarm1SB_editingFinished() +void TelemetryPanel::on_rssiAlarmWarningSB_editingFinished() { - model->frsky.rssiAlarms[0].value = ui->rssiAlarm1SB->value(); + model->rssiAlarms.warning= ui->rssiAlarmWarningSB->value(); emit modified(); } -void TelemetryPanel::on_rssiAlarm2SB_editingFinished() +void TelemetryPanel::on_rssiAlarmCriticalSB_editingFinished() { - model->frsky.rssiAlarms[1].value = ui->rssiAlarm2SB->value(); + model->rssiAlarms.critical = ui->rssiAlarmCriticalSB->value(); emit modified(); } diff --git a/companion/src/modeledit/telemetry.h b/companion/src/modeledit/telemetry.h index 3c9233177..532f88698 100644 --- a/companion/src/modeledit/telemetry.h +++ b/companion/src/modeledit/telemetry.h @@ -138,10 +138,10 @@ class TelemetryPanel : public ModelPanel void onModified(); void on_frskyProtoCB_currentIndexChanged(int index); void on_bladesCount_editingFinished(); - void on_rssiAlarm1CB_currentIndexChanged(int index); - void on_rssiAlarm2CB_currentIndexChanged(int index); - void on_rssiAlarm1SB_editingFinished(); - void on_rssiAlarm2SB_editingFinished(); + void on_rssiAlarmWarningCB_currentIndexChanged(int index); + void on_rssiAlarmCriticalCB_currentIndexChanged(int index); + void on_rssiAlarmWarningSB_editingFinished(); + void on_rssiAlarmCriticalSB_editingFinished(); void on_varioLimitMin_DSB_editingFinished(); void on_varioLimitMax_DSB_editingFinished(); void on_varioLimitCenterMin_DSB_editingFinished(); diff --git a/companion/src/modeledit/telemetry.ui b/companion/src/modeledit/telemetry.ui index 6c0515415..13e2fe4a5 100644 --- a/companion/src/modeledit/telemetry.ui +++ b/companion/src/modeledit/telemetry.ui @@ -74,8 +74,38 @@ 4 + + + + + 0 + 0 + + + + + ---- + + + + + Yellow + + + + + Orange + + + + + Red + + + + - + 0 @@ -96,8 +126,8 @@ - - + + 0 @@ -126,36 +156,8 @@ - - - - true - - - - 0 - 0 - - - - - - - 20 - - - 80 - - - 1 - - - 50 - - - - + 0 @@ -173,38 +175,8 @@ - - - - - 0 - 0 - - - - - ---- - - - - - Yellow - - - - - Orange - - - - - Red - - - - - + true @@ -231,7 +203,48 @@ - + + + + true + + + + 0 + 0 + + + + + + + 20 + + + 80 + + + 1 + + + 50 + + + + + + + + 75 + true + + + + RSSI + + + + Qt::Vertical @@ -244,16 +257,10 @@ - - - - - 75 - true - - + + - RSSI + Disable telemetry audio warnings @@ -1024,10 +1031,10 @@ telemetryProtocol - rssiAlarm1CB - rssiAlarm1SB - rssiAlarm2CB - rssiAlarm2SB + rssiAlarmWarningCB + rssiAlarmWarningSB + rssiAlarmCriticalCB + rssiAlarmCriticalSB varioSource varioLimitMin_DSB varioLimitCenterMin_DSB diff --git a/companion/src/multimodelprinter.cpp b/companion/src/multimodelprinter.cpp index 615bd5897..2c9cf0a98 100644 --- a/companion/src/multimodelprinter.cpp +++ b/companion/src/multimodelprinter.cpp @@ -571,15 +571,20 @@ QString MultiModelPrinter::printTelemetry() MultiColumns columns(modelPrinterMap.size()); columns.append(""); for (int i=0; i<2; i++) { - columns.append(""); } columns.append("
" + QString(i==0 ? tr("RSSI Alarms") : "") + ""); + columns.append("
" + QString(i == 0 ? tr("RSSI Alarms") : "") + ""); if (IS_HORUS_OR_TARANIS(getCurrentBoard())) { - COMPARE(i==0 ? tr("Low Alarm") : tr("Critical Alarm")); + COMPARE(i == 0 ? tr("Low Alarm") : tr("Critical Alarm")); } else { - COMPARE(getFrSkyAlarmType(model->frsky.rssiAlarms[i].level)); + COMPARE(getFrSkyAlarmType(model->rssiAlarms.level[i])); } columns.append("<"); - COMPARE(QString::number(model->frsky.rssiAlarms[i].value, 10)); + if (i == 0) { + COMPARE(QString::number(model->rssiAlarms.warning, 10)); + } + else { + COMPARE(QString::number(model->rssiAlarms.critical, 10)); + } columns.append("

"); diff --git a/companion/src/radiodata.h b/companion/src/radiodata.h index 15d029af8..c9fde2a68 100644 --- a/companion/src/radiodata.h +++ b/companion/src/radiodata.h @@ -591,12 +591,20 @@ class FrSkyAlarmData { void clear() { memset(this, 0, sizeof(FrSkyAlarmData)); } }; -class FrSkyRSSIAlarm { +class RSSIAlarmData { public: - FrSkyRSSIAlarm() { clear(0, 50); } - unsigned int level; - int value; - void clear(unsigned int level, int value) { this->level = level; this->value = value;} + RSSIAlarmData() { clear(); } + unsigned int level[2]; // AVR Only + int warning; + int critical; + bool disabled; + void clear() { + this->level[0] = 2; + this->level[1] = 3; + this->warning = 42; + this->critical = 45; + this->disabled = false; + } }; class FrSkyChannelData { @@ -703,7 +711,6 @@ class FrSkyData { unsigned int altitudeSource; unsigned int currentSource; FrSkyScreenData screens[4]; - FrSkyRSSIAlarm rssiAlarms[2]; unsigned int varioSource; bool varioCenterSilent; int varioMin; @@ -1066,6 +1073,7 @@ class ModelData { MavlinkData mavlink; unsigned int telemetryProtocol; FrSkyData frsky; + RSSIAlarmData rssiAlarms; char bitmap[10+1]; diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index e41a7b2a5..f51cfc97a 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -468,11 +468,22 @@ PACK(struct ScriptData { /* * Frsky Telemetry structure */ - +#if defined(CPUARM) +PACK(struct RssiAlarmData { + int8_t disabled:1; + int8_t spare:1; + int8_t warning:6; + int8_t spare2:2; + int8_t critical:6; + inline int8_t getWarningRssi() {return 45 + warning;} + inline int8_t getCriticalRssi() {return 42 + critical;} + }); +#else PACK(struct FrSkyRSSIAlarm { int8_t level:2; int8_t value:6; }); +#endif #if defined(CPUARM) typedef int16_t ls_telemetry_value_t; @@ -508,27 +519,15 @@ union FrSkyScreenData { #endif #if defined(COLORLCD) -PACK(struct FrSkyTelemetryData { +PACK(struct FrSkyTelemetryData { // TODO EEPROM change, rename to VarioData uint8_t varioSource:7; uint8_t varioCenterSilent:1; int8_t varioCenterMax; int8_t varioCenterMin; int8_t varioMin; int8_t varioMax; - FrSkyRSSIAlarm rssiAlarms[2]; }); #elif defined(CPUARM) -PACK(struct FrSkyChannelData { - uint8_t ratio; // 0.0 means not used, 0.1V steps EG. 6.6 Volts = 66. 25.1V = 251, etc. - int16_t offset:12; - uint16_t type:4; // channel unit (0=volts, ...) - uint8_t alarms_value[2]; // 0.1V steps EG. 6.6 Volts = 66. 25.1V = 251, etc. - uint8_t alarms_level:4; - uint8_t alarms_greater:2; // 0=LT(<), 1=GT(>) - uint8_t spare:2; - uint8_t multiplier; // 0=no multiplier, 1=*2 multiplier -}); - // TODO remove this also on Taranis PACK(struct FrSkyTelemetryData { uint8_t voltsSource; @@ -541,7 +540,6 @@ PACK(struct FrSkyTelemetryData { int8_t varioCenterMin; int8_t varioMin; int8_t varioMax; - FrSkyRSSIAlarm rssiAlarms[2]; }); #else PACK(struct FrSkyChannelData { @@ -756,7 +754,9 @@ typedef uint8_t swarnenable_t; #define MODEL_GVARS_DATA GVarData gvars[MAX_GVARS]; #endif -#if defined(TELEMETRY_MAVLINK) +#if defined(CPUARM) + #define TELEMETRY_DATA NOBACKUP(FrSkyTelemetryData frsky); NOBACKUP(RssiAlarmData rssiAlarms); +#elif defined(TELEMETRY_MAVLINK) #define TELEMETRY_DATA MavlinkTelemetryData mavlink; #elif defined(TELEMETRY_FRSKY) || !defined(PCBSTD) #define TELEMETRY_DATA NOBACKUP(FrSkyTelemetryData frsky); @@ -1082,7 +1082,7 @@ static inline void check_struct() CHKSIZE(FrSkyBarData, 6); CHKSIZE(FrSkyLineData, 4); CHKTYPE(union FrSkyScreenData, 24); - CHKSIZE(FrSkyTelemetryData, 106); + CHKSIZE(FrSkyTelemetryData, 104); CHKSIZE(ModelHeader, 12); CHKSIZE(CurveData, 4); @@ -1101,7 +1101,7 @@ static inline void check_struct() CHKSIZE(FrSkyBarData, 6); CHKSIZE(FrSkyLineData, 6); CHKTYPE(union FrSkyScreenData, 24); - CHKSIZE(FrSkyTelemetryData, 106); + CHKSIZE(FrSkyTelemetryData, 104); CHKSIZE(ModelHeader, 24); CHKSIZE(CurveData, 4); #if defined(PCBX9E) @@ -1123,7 +1123,7 @@ static inline void check_struct() CHKSIZE(TimerData, 16); CHKSIZE(SwashRingData, 8); - CHKSIZE(FrSkyTelemetryData, 7); + CHKSIZE(FrSkyTelemetryData, 5); CHKSIZE(ModelHeader, 27); CHKSIZE(CurveData, 4); CHKSIZE(RadioData, 847); @@ -1140,7 +1140,7 @@ static inline void check_struct() CHKSIZE(SwashRingData, 8); CHKSIZE(FrSkyBarData, 5); CHKSIZE(FrSkyLineData, 2); - CHKSIZE(FrSkyTelemetryData, 90); + CHKSIZE(FrSkyTelemetryData, 88); CHKSIZE(ModelHeader, 12); CHKTYPE(CurveData, 4); CHKSIZE(RadioData, 727); @@ -1184,9 +1184,6 @@ static inline void check_struct() #if defined(CPUARM) CHKSIZE(LogicalSwitchData, 9); -#if !defined(COLORLCD) - CHKSIZE(FrSkyChannelData, 7); -#endif CHKSIZE(TelemetrySensor, 13); CHKSIZE(ModuleData,70); #else @@ -1199,7 +1196,11 @@ static inline void check_struct() CHKSIZE(GVarData, 7); #endif +#if defined(CPUARM) + CHKSIZE(RssiAlarmData, 2); +#else CHKSIZE(FrSkyRSSIAlarm, 1); +#endif CHKSIZE(TrainerData, 16); #undef CHKSIZE diff --git a/radio/src/gui/128x64/model_telemetry.cpp b/radio/src/gui/128x64/model_telemetry.cpp index ded21ad84..954352855 100644 --- a/radio/src/gui/128x64/model_telemetry.cpp +++ b/radio/src/gui/128x64/model_telemetry.cpp @@ -41,6 +41,7 @@ enum MenuModelTelemetryFrskyItems { ITEM_TELEMETRY_RSSI_ALARM1, ITEM_TELEMETRY_RSSI_ALARM2, #if defined(CPUARM) + ITEM_TELEMETRY_DISABLE_ALARMS, ITEM_TELEMETRY_SENSORS_LABEL, ITEM_TELEMETRY_SENSOR1, ITEM_TELEMETRY_SENSOR2, @@ -151,7 +152,7 @@ enum MenuModelTelemetryFrskyItems { #endif #if defined(CPUARM) - #define RSSI_ROWS LABEL(RSSI), 0, 0, + #define RSSI_ROWS LABEL(RSSI), 0, 0, 1, #else #define RSSI_ROWS LABEL(RSSI), 1, 1, #endif @@ -704,14 +705,18 @@ void menuModelTelemetryFrsky(event_t event) case ITEM_TELEMETRY_RSSI_ALARM1: case ITEM_TELEMETRY_RSSI_ALARM2: { - uint8_t alarm = k-ITEM_TELEMETRY_RSSI_ALARM1; #if defined(CPUARM) - lcdDrawTextAlignedLeft(y, (alarm==0 ? STR_LOWALARM : STR_CRITICALALARM)); - lcdDrawNumber(LCD_W, y, getRssiAlarmValue(alarm), RIGHT | attr, 3); + bool warning = (k==ITEM_TELEMETRY_RSSI_ALARM1); + lcdDrawTextAlignedLeft(y, (warning ? STR_LOWALARM : STR_CRITICALALARM)); + lcdDrawNumber(LCD_W, y, warning? g_model.rssiAlarms.getWarningRssi() : g_model.rssiAlarms.getCriticalRssi(), RIGHT | attr, 3); if (attr && s_editMode>0) { - CHECK_INCDEC_MODELVAR(event, g_model.frsky.rssiAlarms[alarm].value, -30, 30); - } + if (warning) + CHECK_INCDEC_MODELVAR(event, g_model.rssiAlarms.warning, -30, 30); + else + CHECK_INCDEC_MODELVAR(event, g_model.rssiAlarms.critical, -30, 30); + } #else // CPUARM + uint8_t alarm = (k-ITEM_TELEMETRY_RSSI_ALARM1); lcdDrawTextAlignedLeft(y, STR_ALARM); lcdDrawTextAtIndex(TELEM_COL2, y, STR_VALARM, ((2+alarm+g_model.frsky.rssiAlarms[alarm].level)%4), menuHorizontalPosition<=0 ? attr : 0); lcdDrawChar(TELEM_COL2+4*FW, y, '<'); @@ -729,7 +734,11 @@ void menuModelTelemetryFrsky(event_t event) #endif // CPUARM break; } - +#if defined(CPUARM) + case ITEM_TELEMETRY_DISABLE_ALARMS: + g_model.rssiAlarms.disabled = editCheckBox(g_model.rssiAlarms.disabled, LCD_W - 10, y, STR_DISABLE_ALARM, attr, event); + break; +#endif #if !defined(CPUARM) #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) case ITEM_TELEMETRY_USR_LABEL: diff --git a/radio/src/gui/128x64/view_telemetry.cpp b/radio/src/gui/128x64/view_telemetry.cpp index c9747f241..03b92d70c 100644 --- a/radio/src/gui/128x64/view_telemetry.cpp +++ b/radio/src/gui/128x64/view_telemetry.cpp @@ -43,7 +43,7 @@ void displayRssiLine() lcdDrawText(lcdLastLeftPos,STATUS_BAR_Y, "RSSI : ", RIGHT | SMLSIZE); lcdDrawRect(65, 57, 38, 7); uint8_t v = 4*rssi/11; - lcdDrawFilledRect(66+36-v, 58, v, 5, (rssi < getRssiAlarmValue(0)) ? DOTTED : SOLID); + lcdDrawFilledRect(66+36-v, 58, v, 5, (rssi < g_model.rssiAlarms.getWarningRssi()) ? DOTTED : SOLID); #else rssi = min((uint8_t)99, telemetryData.rssi[1].value); lcdDrawTextAlignedLeft(STATUS_BAR_Y, STR_TX); lcdDrawNumber(4*FW+1, STATUS_BAR_Y, rssi, LEADING0, 2); diff --git a/radio/src/gui/212x64/model_telemetry.cpp b/radio/src/gui/212x64/model_telemetry.cpp index 862169012..3a4ba22be 100644 --- a/radio/src/gui/212x64/model_telemetry.cpp +++ b/radio/src/gui/212x64/model_telemetry.cpp @@ -25,6 +25,7 @@ enum MenuModelTelemetryFrskyItems { ITEM_TELEMETRY_RSSI_LABEL, ITEM_TELEMETRY_RSSI_ALARM1, ITEM_TELEMETRY_RSSI_ALARM2, + ITEM_TELEMETRY_DISABLE_ALARMS, ITEM_TELEMETRY_SENSORS_LABEL, ITEM_TELEMETRY_SENSOR1, ITEM_TELEMETRY_SENSOR2, @@ -85,7 +86,7 @@ enum MenuModelTelemetryFrskyItems { #else #define VARIO_ROWS #endif -#define RSSI_ROWS LABEL(RSSI), 0, 0, +#define RSSI_ROWS LABEL(RSSI), 0, 0, 0, #define VARIO_RANGE_ROWS 3 #define TELEMETRY_TYPE_ROWS (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) ? (uint8_t)0 : HIDDEN_ROW, @@ -526,14 +527,20 @@ void menuModelTelemetryFrsky(event_t event) case ITEM_TELEMETRY_RSSI_ALARM1: case ITEM_TELEMETRY_RSSI_ALARM2: { - uint8_t alarm = k-ITEM_TELEMETRY_RSSI_ALARM1; - lcdDrawTextAlignedLeft(y, (alarm==0 ? STR_LOWALARM : STR_CRITICALALARM)); - lcdDrawNumber(TELEM_COL2, y, getRssiAlarmValue(alarm), LEFT|attr, 3); + bool warning = (k==ITEM_TELEMETRY_RSSI_ALARM1); + lcdDrawTextAlignedLeft(y, (warning ? STR_LOWALARM : STR_CRITICALALARM)); + lcdDrawNumber(TELEM_COL2, y, warning? g_model.rssiAlarms.getWarningRssi() : g_model.rssiAlarms.getCriticalRssi(), LEFT|attr, 3); if (attr && s_editMode>0) { - CHECK_INCDEC_MODELVAR(event, g_model.frsky.rssiAlarms[alarm].value, -30, 30); + if (warning) + CHECK_INCDEC_MODELVAR(event, g_model.rssiAlarms.warning, -30, 30); + else + CHECK_INCDEC_MODELVAR(event, g_model.rssiAlarms.critical, -30, 30); } break; } + case ITEM_TELEMETRY_DISABLE_ALARMS: + g_model.rssiAlarms.disabled = editCheckBox(g_model.rssiAlarms.disabled, TELEM_COL3, y, STR_DISABLE_ALARM, attr, event); + break; #if defined(VARIO) case ITEM_TELEMETRY_VARIO_LABEL: diff --git a/radio/src/gui/212x64/view_main.cpp b/radio/src/gui/212x64/view_main.cpp index 197a40bf7..86ce656cf 100644 --- a/radio/src/gui/212x64/view_main.cpp +++ b/radio/src/gui/212x64/view_main.cpp @@ -299,7 +299,7 @@ void displayTopBar() /* The inside of the RSSI gauge */ if (TELEMETRY_RSSI() > 0) { - displayTopBarGauge(batt_icon_x+5*FW, TELEMETRY_RSSI() / 10, TELEMETRY_RSSI() < getRssiAlarmValue(0)); + displayTopBarGauge(batt_icon_x+5*FW, TELEMETRY_RSSI() / 10, TELEMETRY_RSSI() < g_model.rssiAlarms.getWarningRssi()); } } diff --git a/radio/src/gui/212x64/view_telemetry.cpp b/radio/src/gui/212x64/view_telemetry.cpp index 9820af59b..546f84930 100644 --- a/radio/src/gui/212x64/view_telemetry.cpp +++ b/radio/src/gui/212x64/view_telemetry.cpp @@ -36,7 +36,7 @@ void displayRssiLine() lcdDrawSizedText(0, STATUS_BAR_Y, STR_RX, 2); lcdDrawNumber(4*FW, STATUS_BAR_Y, rssi, LEADING0|RIGHT, 2); lcdDrawRect(BAR_LEFT, 57, 78, 7); - lcdDrawFilledRect(BAR_LEFT+1, 58, 19*rssi/25, 5, (rssi < getRssiAlarmValue(0)) ? DOTTED : SOLID); + lcdDrawFilledRect(BAR_LEFT+1, 58, 19*rssi/25, 5, (rssi < g_model.rssiAlarms.getWarningRssi()) ? DOTTED : SOLID); } else { lcdDrawText(7*FW, STATUS_BAR_Y, STR_NODATA, BLINK); diff --git a/radio/src/gui/480x272/model_telemetry.cpp b/radio/src/gui/480x272/model_telemetry.cpp index fe85f3e0b..027aba2c9 100644 --- a/radio/src/gui/480x272/model_telemetry.cpp +++ b/radio/src/gui/480x272/model_telemetry.cpp @@ -25,6 +25,7 @@ enum MenuModelTelemetryFrskyItems { ITEM_TELEMETRY_RSSI_LABEL, ITEM_TELEMETRY_RSSI_ALARM1, ITEM_TELEMETRY_RSSI_ALARM2, + ITEM_TELEMETRY_DISABLE_ALARMS, ITEM_TELEMETRY_SENSORS_LABEL, ITEM_TELEMETRY_SENSOR1, ITEM_TELEMETRY_SENSOR2, @@ -87,7 +88,7 @@ enum MenuModelTelemetryFrskyItems { #else #define VARIO_ROWS #endif -#define RSSI_ROWS LABEL(RSSI), 0, 0, +#define RSSI_ROWS LABEL(RSSI), 0, 0, 0, #define VARIO_RANGE_ROWS 3 #define TELEMETRY_TYPE_ROWS (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) ? (uint8_t)0 : HIDDEN_ROW, @@ -533,15 +534,22 @@ bool menuModelTelemetryFrsky(event_t event) case ITEM_TELEMETRY_RSSI_ALARM1: case ITEM_TELEMETRY_RSSI_ALARM2: { - uint8_t alarm = k-ITEM_TELEMETRY_RSSI_ALARM1; - lcdDrawText(MENUS_MARGIN_LEFT, y, (alarm==0 ? STR_LOWALARM : STR_CRITICALALARM)); - lcdDrawNumber(TELEM_COL2, y, getRssiAlarmValue(alarm), LEFT|attr, 3); + bool warning = (k==ITEM_TELEMETRY_RSSI_ALARM1); + lcdDrawText(MENUS_MARGIN_LEFT, y, (warning ? STR_LOWALARM : STR_CRITICALALARM)); + lcdDrawNumber(TELEM_COL2, y, warning? g_model.rssiAlarms.getWarningRssi() : g_model.rssiAlarms.getCriticalRssi(), LEFT|attr, 3); + if (attr && s_editMode>0) { - CHECK_INCDEC_MODELVAR(event, g_model.frsky.rssiAlarms[alarm].value, -30, 30); + if (warning) + CHECK_INCDEC_MODELVAR(event, g_model.rssiAlarms.warning, -30, 30); + else + CHECK_INCDEC_MODELVAR(event, g_model.rssiAlarms.critical, -30, 30); } break; } - + case ITEM_TELEMETRY_DISABLE_ALARMS: + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_DISABLE_ALARM); + g_model.rssiAlarms.disabled = editCheckBox(g_model.rssiAlarms.disabled, TELEM_COL3, y, attr, event); + break; #if defined(VARIO) case ITEM_TELEMETRY_VARIO_LABEL: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_VARIO); diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index cde9efb1a..81ad22c3e 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1085,8 +1085,8 @@ Get RSSI value as well as low and critical RSSI alarm levels (in dB) static int luaGetRSSI(lua_State * L) { lua_pushunsigned(L, min((uint8_t)99, TELEMETRY_RSSI())); - lua_pushunsigned(L, getRssiAlarmValue(0)); - lua_pushunsigned(L, getRssiAlarmValue(1)); + lua_pushunsigned(L, g_model.rssiAlarms.getWarningRssi()); + lua_pushunsigned(L, g_model.rssiAlarms.getCriticalRssi()); return 3; } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index f5d3c5a22..5b7fe65d0 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1036,6 +1036,13 @@ void checkFailsafe() #else #define checkFailsafe() #endif +#if defined(CPUARM) +void checkRSSIAlaramsDisabled() +{ + if (g_model.rssiAlarms.disabled) + ALERT(STR_RSSIALARM_WARN, STR_NO_RSSIALARM, AU_ERROR); +} +#endif #if defined(GUI) void checkAll() @@ -1053,6 +1060,9 @@ void checkAll() checkSwitches(); checkFailsafe(); #endif +#if defined(CPUARM) + checkRSSIAlaramsDisabled(); +#endif #if defined(SDCARD) && defined(CPUARM) checkSDVersion(); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 04d32fbf4..8850870db 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1532,7 +1532,9 @@ inline int div_and_round(int num, int den) } #if defined(TELEMETRY_FRSKY) +#if !defined(CPUARM) NOINLINE uint8_t getRssiAlarmValue(uint8_t alarm); +#endif extern const pm_uint8_t bchunit_ar[]; diff --git a/radio/src/storage/eeprom_conversions.cpp b/radio/src/storage/eeprom_conversions.cpp index f87e4a2d1..e9eed053a 100644 --- a/radio/src/storage/eeprom_conversions.cpp +++ b/radio/src/storage/eeprom_conversions.cpp @@ -436,8 +436,14 @@ typedef union { FrSkyLineData_v216 lines[4]; } FrSkyScreenData_v216; + +PACK(struct FrSkyChannelData_v216 { + uint8_t unused[7]; +}); + + PACK(typedef struct { - FrSkyChannelData channels[4]; + FrSkyChannelData_v216 channels[4]; uint8_t usrProto; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh, 3=Halcyon uint8_t voltsSource:7; uint8_t altitudeDisplayed:1; @@ -450,7 +456,7 @@ PACK(typedef struct { int8_t varioCenterMin; int8_t varioMin; int8_t varioMax; - FrSkyRSSIAlarm rssiAlarms[2]; + uint8_t rssiAlarms[2]; uint16_t mAhPersistent:1; uint16_t storedMah:15; int8_t fasOffset; @@ -613,6 +619,7 @@ PACK(typedef struct { GVarData gvars[MAX_GVARS]; FrSkyTelemetryData frsky; + RssiAlarmData rssiAlarms; MODELDATA_EXTRA_217 @@ -1007,7 +1014,7 @@ void ConvertModel_216_to_217(ModelData & model) newModel.switchWarningEnable = oldModel.switchWarningEnable; memcpy(newModel.gvars, oldModel.gvars, sizeof(newModel.gvars)); - memcpy(&newModel.frsky.rssiAlarms, &oldModel.frsky.rssiAlarms, sizeof(newModel.frsky.rssiAlarms)); + memcpy(&newModel.rssiAlarms, &oldModel.frsky.rssiAlarms, sizeof(newModel.rssiAlarms)); for (int i=0; i