From be7a6a51ab8a979d17c627543d822e09b88d4cbd Mon Sep 17 00:00:00 2001 From: eshifri <46511024+eshifri@users.noreply.github.com> Date: Tue, 2 Aug 2022 16:22:42 -0700 Subject: [PATCH] feat: Allow the timer count direction to be selected (#2038) * timer direction: ellapsed or left * Add AUDIO announcement support * Storage for showElapsed * Translations * Fix storage * BW implementation * Different BW implementation * Companion support * Color LCD implementation and rebase to lvgl * Fix problems found by raphaelcoeffic * chore: Regenerate the YAML files properly * fix: Remove unused `TR_SHOW` remnant * chore: Formatting and cleanup * fix: Timer dir choice was shown in wrong place Wrong newline used in ce23b50 * Fix cpn ui triggers, remove unnecessary code and some formatting * fix(colorlcd): Hide timer dir opt if zero value Co-authored-by: Peter Feerick Co-authored-by: elecpower --- .../src/firmwares/edgetx/yaml_modeldata.cpp | 2 + companion/src/firmwares/timerdata.cpp | 23 +++++++++ companion/src/firmwares/timerdata.h | 13 ++++- companion/src/modeledit/setup.cpp | 18 ++++++- companion/src/modeledit/setup.h | 2 +- companion/src/modeledit/setup_timer.ui | 3 ++ companion/src/multimodelprinter.cpp | 1 + radio/src/datastructs.h | 24 +++++----- radio/src/datastructs_private.h | 2 + radio/src/gui/128x64/lcd.cpp | 15 ++++-- radio/src/gui/128x64/model_outputs.cpp | 2 +- radio/src/gui/128x64/model_setup.cpp | 20 ++++++-- radio/src/gui/212x64/model_setup.cpp | 48 ++++++++++++++----- radio/src/gui/212x64/view_main.cpp | 6 ++- radio/src/gui/colorlcd/timer_setup.cpp | 37 ++++++++++++-- radio/src/gui/colorlcd/widgets/timer.cpp | 29 +++++++---- .../storage/yaml/yaml_datastructs_nv14.cpp | 6 ++- .../src/storage/yaml/yaml_datastructs_t12.cpp | 6 ++- .../src/storage/yaml/yaml_datastructs_t8.cpp | 6 ++- .../storage/yaml/yaml_datastructs_tlite.cpp | 6 ++- .../storage/yaml/yaml_datastructs_tpro.cpp | 6 ++- .../storage/yaml/yaml_datastructs_tx12.cpp | 6 ++- .../storage/yaml/yaml_datastructs_tx12mk2.cpp | 6 ++- .../src/storage/yaml/yaml_datastructs_x10.cpp | 6 ++- .../storage/yaml/yaml_datastructs_x12s.cpp | 6 ++- .../src/storage/yaml/yaml_datastructs_x7.cpp | 6 ++- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 6 ++- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 6 ++- .../storage/yaml/yaml_datastructs_x9lite.cpp | 6 ++- .../storage/yaml/yaml_datastructs_x9lites.cpp | 6 ++- .../storage/yaml/yaml_datastructs_xlite.cpp | 6 ++- .../storage/yaml/yaml_datastructs_xlites.cpp | 6 ++- .../storage/yaml/yaml_datastructs_zorro.cpp | 6 ++- radio/src/timers.cpp | 5 +- radio/src/translations.cpp | 3 +- radio/src/translations.h | 2 + radio/src/translations/cn.h | 1 + radio/src/translations/cz.h | 1 + radio/src/translations/da.h | 1 + radio/src/translations/de.h | 1 + radio/src/translations/en.h | 1 + radio/src/translations/es.h | 1 + radio/src/translations/fi.h | 1 + radio/src/translations/fr.h | 1 + radio/src/translations/it.h | 1 + radio/src/translations/nl.h | 1 + radio/src/translations/pl.h | 1 + radio/src/translations/pt.h | 1 + radio/src/translations/se.h | 1 + radio/src/translations/tw.h | 1 + 50 files changed, 286 insertions(+), 85 deletions(-) diff --git a/companion/src/firmwares/edgetx/yaml_modeldata.cpp b/companion/src/firmwares/edgetx/yaml_modeldata.cpp index a69275118..718b5f309 100644 --- a/companion/src/firmwares/edgetx/yaml_modeldata.cpp +++ b/companion/src/firmwares/edgetx/yaml_modeldata.cpp @@ -283,6 +283,7 @@ Node convert::encode(const TimerData& rhs) node["persistent"] = rhs.persistent; node["countdownStart"] = rhs.countdownStart; node["value"] = rhs.pvalue; + node["showElapsed"] = rhs.showElapsed; return node; } @@ -297,6 +298,7 @@ bool convert::decode(const Node& node, TimerData& rhs) node["persistent"] >> rhs.persistent; node["countdownStart"] >> rhs.countdownStart; node["value"] >> rhs.pvalue; + node["showElapsed"] >> rhs.showElapsed; return true; } diff --git a/companion/src/firmwares/timerdata.cpp b/companion/src/firmwares/timerdata.cpp index abde9046f..15a9a109a 100644 --- a/companion/src/firmwares/timerdata.cpp +++ b/companion/src/firmwares/timerdata.cpp @@ -180,6 +180,16 @@ QString TimerData::modeToString(const int value) } } +QString TimerData::showElapsedToString(const unsigned int value) +{ + return (value) ? tr("Show Elapsed") : tr("Show Remaining"); +} + +QString TimerData::showElapsedToString() const +{ + return showElapsedToString(showElapsed); +} + // static AbstractStaticItemModel * TimerData::countdownBeepItemModel() { @@ -235,3 +245,16 @@ AbstractStaticItemModel * TimerData::modeItemModel() mdl->loadItemList(); return mdl; } + +AbstractStaticItemModel * TimerData::showElapsedItemModel() +{ + AbstractStaticItemModel *mdl = new AbstractStaticItemModel(); + mdl->setName(AIM_TIMER_SHOWELAPSED); + + for (unsigned int i = 0; i < TIMER_SHOW_COUNT; i++) { + mdl->appendToItemList(showElapsedToString(i), i); + } + + mdl->loadItemList(); + return mdl; +} diff --git a/companion/src/firmwares/timerdata.h b/companion/src/firmwares/timerdata.h index 78bcec716..4a0d938a7 100644 --- a/companion/src/firmwares/timerdata.h +++ b/companion/src/firmwares/timerdata.h @@ -32,6 +32,7 @@ constexpr char AIM_TIMER_COUNTDOWNBEEP[] {"timerdata.countdownBeep"}; constexpr char AIM_TIMER_COUNTDOWNSTART[] {"timerdata.countdownStart"}; constexpr char AIM_TIMER_PERSISTENT[] {"timerdata.persistent"}; constexpr char AIM_TIMER_MODE[] {"timerdata.mode"}; +constexpr char AIM_TIMER_SHOWELAPSED[] {"timerdata.showElapsed"}; constexpr int TIMER_NAME_LEN {8}; @@ -74,6 +75,12 @@ class TimerData { TIMERMODE_MAX = TIMERMODE_COUNT - 1 }; + enum TimerShowDirection { + TIMER_SHOW_REMAINING, + TIMER_SHOW_ELAPSED, + TIMER_SHOW_COUNT + }; + TimerData() { clear(); } RawSwitch swtch; @@ -85,6 +92,7 @@ class TimerData { unsigned int persistent; int countdownStart; int pvalue; + unsigned int showElapsed; void convert(RadioDataConversionState & cstate); void clear(); @@ -97,6 +105,8 @@ class TimerData { QString pvalueToString() const; QString valToString() const; QString modeToString() const; + QString showElapsedToString() const; + void countdownBeepChanged(); void modeChanged(); @@ -106,9 +116,10 @@ class TimerData { static QString pvalueToString(const int value); static QString valToString(const int value); static QString modeToString(const int value); + static QString showElapsedToString(const unsigned int value); static AbstractStaticItemModel * countdownBeepItemModel(); static AbstractStaticItemModel * countdownStartItemModel(); static AbstractStaticItemModel * persistentItemModel(); static AbstractStaticItemModel * modeItemModel(); - + static AbstractStaticItemModel * showElapsedItemModel(); }; diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 179c28b1b..217b2671f 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -59,6 +59,9 @@ TimerPanel::TimerPanel(QWidget * parent, ModelData & model, TimerData & timer, G ui->value->setField(timer.val, this); ui->value->setMaximumTime(firmware->getMaxTimerStart()); + connect(ui->value, &AutoTimeEdit::currentDataChanged, [=](const int val) { + update(); + }); ui->mode->setModel(panelItemModels->getItemModel(AIM_TIMER_MODE)); ui->mode->setField(timer.mode, this); @@ -85,6 +88,10 @@ TimerPanel::TimerPanel(QWidget * parent, ModelData & model, TimerData & timer, G ui->countdownStart->setModel(panelItemModels->getItemModel(AIM_TIMER_COUNTDOWNSTART)); ui->countdownStart->setField(timer.countdownStart, this); + + ui->showElapsed->setModel(panelItemModels->getItemModel(AIM_TIMER_SHOWELAPSED)); + ui->showElapsed->setField(timer.showElapsed, this); + disableMouseScrolling(); QWidget::setTabOrder(prevFocus, ui->name); QWidget::setTabOrder(ui->name, ui->value); @@ -93,6 +100,7 @@ TimerPanel::TimerPanel(QWidget * parent, ModelData & model, TimerData & timer, G QWidget::setTabOrder(ui->countdownBeep, ui->countdownStart); QWidget::setTabOrder(ui->countdownStart, ui->minuteBeep); QWidget::setTabOrder(ui->minuteBeep, ui->persistent); + QWidget::setTabOrder(ui->persistent, ui->showElapsed); update(); lock = false; @@ -114,6 +122,7 @@ void TimerPanel::update() ui->countdownBeep->updateValue(); ui->minuteBeep->updateValue(); ui->countdownStart->updateValue(); + ui->showElapsed->updateValue(); if (timer.mode != TimerData::TIMERMODE_OFF) ui->swtch->setEnabled(true); @@ -134,6 +143,13 @@ void TimerPanel::update() ui->persistentValue->setText(timer.pvalueToString()); } + if (timer.val) { + ui->showElapsed->setEnabled(true); + } + else { + ui->showElapsed->setEnabled(false); + } + lock = false; } @@ -1276,7 +1292,7 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge panelItemModels->registerItemModel(TimerData::persistentItemModel()); panelItemModels->registerItemModel(TimerData::modeItemModel()); panelFilteredModels->registerItemModel(new FilteredItemModel(ModelData::trainerModeItemModel(generalSettings, firmware)), FIM_TRAINERMODE); - + panelItemModels->registerItemModel(TimerData::showElapsedItemModel()); Board::Type board = firmware->getBoard(); memset(modules, 0, sizeof(modules)); diff --git a/companion/src/modeledit/setup.h b/companion/src/modeledit/setup.h index cdc7302cd..6ec69d032 100644 --- a/companion/src/modeledit/setup.h +++ b/companion/src/modeledit/setup.h @@ -223,7 +223,7 @@ class SetupPanel : public ModelPanel ModulePanel * modules[CPN_MAX_MODULES + 1]; TimerPanel * timers[CPN_MAX_TIMERS]; FunctionSwitchesPanel * funcswitches; - + void updateStartupSwitches(); void updatePotWarnings(); void updateBeepCenter(); diff --git a/companion/src/modeledit/setup_timer.ui b/companion/src/modeledit/setup_timer.ui index 63ddfa9eb..1cb73a7cf 100644 --- a/companion/src/modeledit/setup_timer.ui +++ b/companion/src/modeledit/setup_timer.ui @@ -91,6 +91,9 @@ + + + diff --git a/companion/src/multimodelprinter.cpp b/companion/src/multimodelprinter.cpp index de12b95cd..099ed68cc 100644 --- a/companion/src/multimodelprinter.cpp +++ b/companion/src/multimodelprinter.cpp @@ -352,6 +352,7 @@ QString MultiModelPrinter::printTimers() COMPARECELLWIDTH(model->timers[i].countdownStartToString(), 10); COMPARECELLWIDTH(DataHelpers::boolToString(model->timers[i].minuteBeep, DataHelpers::BOOL_FMT_YESNO), 10); COMPARECELLWIDTH(model->timers[i].persistentToString(false), 10); + COMPARECELLWIDTH(model->timers[i].showElapsedToString(), 12); columns.appendRowEnd(); } columns.appendTableEnd(); diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index c90cf723a..2736e3c2f 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -54,7 +54,7 @@ static inline void check_struct() CHKSIZE(LogicalSwitchData, 9); CHKSIZE(CustomFunctionData, 11); CHKSIZE(FlightModeData, 28 + 2*NUM_TRIMS); - CHKSIZE(TimerData, 11); + CHKSIZE(TimerData, 12); CHKSIZE(SwashRingData, 8); CHKSIZE(FrSkyBarData, 6); CHKSIZE(FrSkyLineData, 4); @@ -68,7 +68,7 @@ static inline void check_struct() CHKSIZE(LogicalSwitchData, 9); CHKSIZE(CustomFunctionData, 11); CHKSIZE(FlightModeData, 40); - CHKSIZE(TimerData, 16); + CHKSIZE(TimerData, 17); CHKSIZE(SwashRingData, 8); CHKSIZE(FrSkyBarData, 6); CHKSIZE(FrSkyLineData, 6); @@ -81,7 +81,7 @@ static inline void check_struct() CHKSIZE(LimitData, 13); CHKSIZE(CustomFunctionData, 9); CHKSIZE(FlightModeData, 44); - CHKSIZE(TimerData, 16); + CHKSIZE(TimerData, 17); CHKSIZE(SwashRingData, 8); CHKSIZE(ModelHeader, 31); CHKSIZE(CurveHeader, 4); @@ -118,33 +118,33 @@ static inline void check_struct() #if defined(PCBXLITES) CHKSIZE(RadioData, 861); - CHKSIZE(ModelData, 6161); + CHKSIZE(ModelData, 6164); #elif defined(PCBXLITE) CHKSIZE(RadioData, 859); - CHKSIZE(ModelData, 6161); + CHKSIZE(ModelData, 6164); #elif defined(RADIO_TPRO) CHKSIZE(RadioData, 842); - CHKSIZE(ModelData, 6186); + CHKSIZE(ModelData, 6189); #elif defined(PCBX7) CHKSIZE(RadioData, 865); - CHKSIZE(ModelData, 6161); + CHKSIZE(ModelData, 6164); #elif defined(PCBX9E) CHKSIZE(RadioData, 955); - CHKSIZE(ModelData, 6613); + CHKSIZE(ModelData, 6616); #elif defined(PCBX9D) || defined(PCBX9DP) CHKSIZE(RadioData, 897); - CHKSIZE(ModelData, 6605); + CHKSIZE(ModelData, 6608); #elif defined(PCBHORUS) #if defined(PCBX10) CHKSIZE(RadioData, 923); - CHKSIZE(ModelData, 11025); + CHKSIZE(ModelData, 11028); #else CHKSIZE(RadioData, 905); - CHKSIZE(ModelData, 11023); + CHKSIZE(ModelData, 11026); #endif #elif defined(PCBNV14) CHKSIZE(RadioData, 851); - CHKSIZE(ModelData, 10839); + CHKSIZE(ModelData, 10842); #endif #undef CHKSIZE diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 22a2a09fd..7aaece68b 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -237,6 +237,8 @@ PACK(struct TimerData { uint32_t minuteBeep:1; uint32_t persistent:2; int32_t countdownStart:2; + uint8_t showElapsed:1; + uint8_t spare:7 SKIP; NOBACKUP(char name[LEN_TIMER_NAME]); }); diff --git a/radio/src/gui/128x64/lcd.cpp b/radio/src/gui/128x64/lcd.cpp index 3652c9bf4..e0565315f 100644 --- a/radio/src/gui/128x64/lcd.cpp +++ b/radio/src/gui/128x64/lcd.cpp @@ -925,18 +925,23 @@ void drawTimerWithMode(coord_t x, coord_t y, uint8_t index, LcdFlags att) const TimerData &timer = g_model.timers[index]; if (timer.mode) { + const TimerData &timerData = g_model.timers[index]; const TimerState &timerState = timersStates[index]; const uint8_t negative = (timerState.val < 0 ? BLINK | INVERS : 0); - if (timerState.val < 60 * 60) { // display MM:SS - div_t qr = div((int) abs(timerState.val), 60); + int val = timerState.val; + if (timerData.start && timerData.showElapsed && + timerData.start != timerState.val) + val = (int)timerData.start - (int)timerState.val; + if (val < 60 * 60) { // display MM:SS + div_t qr = div((int) abs(val), 60); lcdDrawNumber(x - 5, y, qr.rem, att | LEADING0 | negative, 2); lcdDrawText(lcdLastLeftPos, y, ":", att | BLINK | negative); lcdDrawNumber(lcdLastLeftPos, y, qr.quot, att | negative); if (negative) lcdDrawText(lcdLastLeftPos, y, "-", att | negative); } - else if (timerState.val < (99 * 60 * 60) + (59 * 60)) { // display HHhMM - div_t qr = div((int) (abs(timerState.val) / 60), 60); + else if (val < (99 * 60 * 60) + (59 * 60)) { // display HHhMM + div_t qr = div((int) (abs(val) / 60), 60); lcdDrawNumber(x - 5, y, qr.rem, att | LEADING0, 2); lcdDrawText(lcdLastLeftPos, y, "h", att); lcdDrawNumber(lcdLastLeftPos, y, qr.quot, att); @@ -945,7 +950,7 @@ void drawTimerWithMode(coord_t x, coord_t y, uint8_t index, LcdFlags att) } else { //display HHHH for crazy large persistent timers lcdDrawText(x - 5, y, "h", att); - lcdDrawNumber(lcdLastLeftPos, y, timerState.val / 3600, att); + lcdDrawNumber(lcdLastLeftPos, y, val / 3600, att); } uint8_t xLabel = (negative ? x - 56 : x - 49); uint8_t len = zlen(timer.name, LEN_TIMER_NAME); diff --git a/radio/src/gui/128x64/model_outputs.cpp b/radio/src/gui/128x64/model_outputs.cpp index 1fdc325a7..0a41da90f 100644 --- a/radio/src/gui/128x64/model_outputs.cpp +++ b/radio/src/gui/128x64/model_outputs.cpp @@ -155,7 +155,7 @@ void menuModelLimitsOne(event_t event) case ITEM_OUTPUTONE_DIR: { - lcdDrawTextAlignedLeft(y, TR_LIMITS_HEADERS_DIRECTION); + lcdDrawTextAlignedLeft(y, STR_LIMITS_HEADERS_DIRECTION); lcdDrawTextAtIndex(LIMITS_ONE_2ND_COLUMN, y, STR_MMMINV, ld->revert, attr); if (active) { CHECK_INCDEC_MODELVAR_ZERO(event, ld->revert, 1); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 5d69b77a6..bc2cb1474 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -188,7 +188,7 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_TRAINER_LABEL, ITEM_MODEL_SETUP_TRAINER_MODE, #if defined(BLUETOOTH) - ITEM_MODEL_SETUP_TRAINER_BLUETOOTH, + ITEM_MODEL_SETUP_TRAINER_BLUETOOTH, #endif ITEM_MODEL_SETUP_TRAINER_CHANNELS, ITEM_MODEL_SETUP_TRAINER_PPM_PARAMS, @@ -261,11 +261,13 @@ inline uint8_t MODULE_SUBTYPE_ROWS(int moduleIdx) #define POT_WARN_ROWS ((g_model.potsWarnMode) ? (uint8_t)(NUM_POTS+NUM_SLIDERS) : (uint8_t)0) #define TIMER_ROWS(x) \ - 1, 0, 1, 0, 0, \ + 1, 0, \ + (uint8_t)((g_model.timers[x].start) ? 2 : 1), \ + 0, 0, \ g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 \ : (uint8_t)0 - #define EXTRA_MODULE_ROWS +#define EXTRA_MODULE_ROWS #if defined(FUNCTION_SWITCHES) #define FUNCTION_SWITCHES_ROWS READONLY_ROW, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|(NUM_FUNCTIONS_SWITCHES-1), @@ -571,6 +573,12 @@ void menuModelSetup(event_t event) menuHorizontalPosition == 0 ? attr : 0, menuHorizontalPosition == 1 ? attr : 0); + if (timer->start) { + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN + 5 * FW, y, STR_TIMER_DIR, + timer->showElapsed, + menuHorizontalPosition == 2 ? attr : 0); + } + if (attr && s_editMode > 0) { div_t qr = div(timer->start, 60); switch (menuHorizontalPosition) { @@ -586,6 +594,12 @@ void menuModelSetup(event_t event) if ((int16_t) timer->start > 5999) timer->start = 32399; // 8:59:59 break; + case 2: + if (timer->start) { + timer->showElapsed = + checkIncDecModel(event, timer->showElapsed, 0, 1); + } + break; } } break; diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 7a74c5220..ef22d8989 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -225,6 +225,12 @@ void editTimerStart(int timerIdx, coord_t y, LcdFlags attr, event_t event) menuHorizontalPosition == 0 ? attr : 0, menuHorizontalPosition == 1 ? attr : 0); + if (g_model.timers[timerIdx].start) { + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_TIMER_DIR, + g_model.timers[timerIdx].showElapsed, + menuHorizontalPosition == 2 ? attr : 0); + } + if (attr && menuHorizontalPosition < 0) { lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN - 1, y - 1, 4 * FW, FH + 1); } @@ -242,6 +248,12 @@ void editTimerStart(int timerIdx, coord_t y, LcdFlags attr, event_t event) if ((int16_t)timer->start < 0) timer->start = 0; if ((int16_t)timer->start > 5999) timer->start = 32399; // 8:59:59 break; + case 2: + if (g_model.timers[timerIdx].start) { + g_model.timers[timerIdx].showElapsed = checkIncDecModel( + event, g_model.timers[timerIdx].showElapsed, 0, 1); + } + break; } } } @@ -289,7 +301,10 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event) #endif #define TIMER_ROWS(x) \ - 1 | NAVIGATION_LINE_BY_LINE, 0, 1 | NAVIGATION_LINE_BY_LINE, 0, 0, \ + 1 | NAVIGATION_LINE_BY_LINE, 0, \ + (uint8_t)(((g_model.timers[x].start) ? 2 : 1) | \ + NAVIGATION_LINE_BY_LINE), \ + 0, 0, \ g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 \ : (uint8_t)0 @@ -520,17 +535,22 @@ void menuModelSetup(event_t event) editTimerStart(0, y, attr, event); break; - case ITEM_MODEL_SETUP_TIMER1_MINUTE_BEEP: - g_model.timers[0].minuteBeep = editCheckBox(g_model.timers[0].minuteBeep, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_MINUTEBEEP, attr, event); - break; + case ITEM_MODEL_SETUP_TIMER1_MINUTE_BEEP: + g_model.timers[0].minuteBeep = editCheckBox( + g_model.timers[0].minuteBeep, MODEL_SETUP_2ND_COLUMN, y, + INDENT TR_MINUTEBEEP, attr, event); + break; - case ITEM_MODEL_SETUP_TIMER1_COUNTDOWN_BEEP: - editTimerCountdown(0, y, attr, event); - break; + case ITEM_MODEL_SETUP_TIMER1_COUNTDOWN_BEEP: + editTimerCountdown(0, y, attr, event); + break; + + case ITEM_MODEL_SETUP_TIMER1_PERSISTENT: + g_model.timers[0].persistent = editChoice( + MODEL_SETUP_2ND_COLUMN, y, STR_PERSISTENT, STR_VPERSISTENT, + g_model.timers[0].persistent, 0, 2, attr, event); + break; - case ITEM_MODEL_SETUP_TIMER1_PERSISTENT: - g_model.timers[0].persistent = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_PERSISTENT, STR_VPERSISTENT, g_model.timers[0].persistent, 0, 2, attr, event); - break; #if TIMERS > 1 case ITEM_MODEL_SETUP_TIMER2: @@ -576,7 +596,9 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_SETUP_TIMER3_MINUTE_BEEP: - g_model.timers[2].minuteBeep = editCheckBox(g_model.timers[2].minuteBeep, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_MINUTEBEEP, attr, event); + g_model.timers[2].minuteBeep = + editCheckBox(g_model.timers[2].minuteBeep, MODEL_SETUP_2ND_COLUMN, + y, INDENT TR_MINUTEBEEP, attr, event); break; case ITEM_MODEL_SETUP_TIMER3_COUNTDOWN_BEEP: @@ -584,7 +606,9 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_SETUP_TIMER3_PERSISTENT: - g_model.timers[2].persistent = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_PERSISTENT, STR_VPERSISTENT, g_model.timers[2].persistent, 0, 2, attr, event); + g_model.timers[2].persistent = editChoice( + MODEL_SETUP_2ND_COLUMN, y, STR_PERSISTENT, STR_VPERSISTENT, + g_model.timers[2].persistent, 0, 2, attr, event); break; #endif diff --git a/radio/src/gui/212x64/view_main.cpp b/radio/src/gui/212x64/view_main.cpp index 6bc40a2b7..45e401903 100644 --- a/radio/src/gui/212x64/view_main.cpp +++ b/radio/src/gui/212x64/view_main.cpp @@ -318,7 +318,11 @@ void displayTimers() else { lcdDrawTextAtIndex(TIMERS_X, y-7, STR_VTMRMODES, timerData.mode, SMLSIZE); } - drawTimer(TIMERS_X, y, timerState.val, TIMEHOUR|MIDSIZE|LEFT, TIMEHOUR|MIDSIZE|LEFT); + int val = timerState.val; + if (timerData.start && timerData.showElapsed && + timerData.start != timerState.val) + val = (int)timerData.start - (int)timerState.val; + drawTimer(TIMERS_X, y, val, TIMEHOUR|MIDSIZE|LEFT, TIMEHOUR|MIDSIZE|LEFT); if (timerData.persistent) { lcdDrawChar(TIMERS_R, y+1, 'P', SMLSIZE); } diff --git a/radio/src/gui/colorlcd/timer_setup.cpp b/radio/src/gui/colorlcd/timer_setup.cpp index 4427cb38c..cc8f38735 100644 --- a/radio/src/gui/colorlcd/timer_setup.cpp +++ b/radio/src/gui/colorlcd/timer_setup.cpp @@ -43,6 +43,21 @@ static std::function timerValueUpdater(uint8_t timer) }; } +static void timer_start_changed(lv_event_t* e) +{ + lv_obj_t* target = lv_event_get_target(e); + auto obj = (lv_obj_t*)lv_event_get_user_data(e); + auto val = (TimeEdit*)lv_obj_get_user_data(target); + + if (!obj || !val) return; + + if (val->getValue() > 0) { + lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN); + } else { + lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); + } +} + TimerWindow::TimerWindow(uint8_t timer) : Page(ICON_STATS_TIMERS) { std::string title = std::string(STR_TIMER) + std::to_string(timer + 1); @@ -74,8 +89,21 @@ TimerWindow::TimerWindow(uint8_t timer) : Page(ICON_STATS_TIMERS) // Timer start value line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_START, 0, COLOR_THEME_PRIMARY1); - new TimeEdit(line, rect_t{}, 0, TIMER_MAX, GET_DEFAULT(p_timer->start), - timerValueUpdater(timer)); + auto timerValue = + new TimeEdit(line, rect_t{}, 0, TIMER_MAX, GET_DEFAULT(p_timer->start), + timerValueUpdater(timer)); + + // Timer direction + auto timerDirLine = form->newLine(&grid); + new StaticText(timerDirLine, rect_t{}, STR_LIMITS_HEADERS_DIRECTION, 0, + COLOR_THEME_PRIMARY1); + new Choice(timerDirLine, rect_t{}, STR_TIMER_DIR, 0, 1, + GET_SET_DEFAULT(p_timer->showElapsed)); + + if (timerValue->getValue() == 0) { + auto obj = timerDirLine->getLvObj(); + lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); + } // Timer minute beep line = form->newLine(&grid); @@ -88,7 +116,7 @@ TimerWindow::TimerWindow(uint8_t timer) : Page(ICON_STATS_TIMERS) auto box = new FormGroup(line, rect_t{}); box->setFlexLayout(LV_FLEX_FLOW_ROW); - + new Choice(box, rect_t{}, STR_VBEEPCOUNTDOWN, COUNTDOWN_SILENT, COUNTDOWN_COUNT - 1, GET_SET_DEFAULT(p_timer->countdownBeep)); new Choice(box, rect_t{}, STR_COUNTDOWNVALUES, 0, 3, @@ -100,4 +128,7 @@ TimerWindow::TimerWindow(uint8_t timer) : Page(ICON_STATS_TIMERS) new Choice(line, rect_t{}, STR_VPERSISTENT, 0, 2, GET_SET_DEFAULT(p_timer->persistent)); + + lv_obj_add_event_cb(timerValue->getLvObj(), timer_start_changed, + LV_EVENT_VALUE_CHANGED, timerDirLine->getLvObj()); } diff --git a/radio/src/gui/colorlcd/widgets/timer.cpp b/radio/src/gui/colorlcd/widgets/timer.cpp index 34ccc3fb4..c36a4ea6f 100644 --- a/radio/src/gui/colorlcd/widgets/timer.cpp +++ b/radio/src/gui/colorlcd/widgets/timer.cpp @@ -41,8 +41,8 @@ STATIC_LZ4_BITMAP(LBM_TIMER_BACKGROUND); class TimerWidget : public Widget { public: - TimerWidget(const WidgetFactory* factory, Window* parent, - const rect_t& rect, Widget::PersistentData* persistentData) : + TimerWidget(const WidgetFactory* factory, Window* parent, const rect_t& rect, + Widget::PersistentData* persistentData) : Widget(factory, parent, rect, persistentData) { } @@ -81,8 +81,11 @@ class TimerWidget : public Widget dc->drawBitmapPattern(3, 4, LBM_TIMER, colorFore); } // value - splitTimer(sDigitGroup0, sDigitGroup1, sUnit0, sUnit1, - abs(timerState.val), false); + int val = timerState.val; + if (timerData.start && timerData.showElapsed && + timerData.start != timerState.val) + val = (int)timerData.start - (int)timerState.val; + splitTimer(sDigitGroup0, sDigitGroup1, sUnit0, sUnit1, abs(val), false); dc->drawSizedText(76, 31, sDigitGroup0, ZLEN(sDigitGroup0), FONT(XL) | colorFore); @@ -115,12 +118,16 @@ class TimerWidget : public Widget FONT(XS) | COLOR_THEME_PRIMARY2); } // value + int val = timerState.val; + if (timerData.start && timerData.showElapsed && + timerData.start != timerState.val) + val = (int)timerData.start - (int)timerState.val; if (width() > 100 && height() > 40) { - if (abs(timerState.val) >= 3600) { - drawTimer(dc, 3, 20, abs(timerState.val), + if (abs(val) >= 3600) { + drawTimer(dc, 3, 20, abs(val), COLOR_THEME_PRIMARY2 | LEFT | TIMEHOUR); } else { - drawTimer(dc, 3, 18, abs(timerState.val), + drawTimer(dc, 3, 18, abs(val), COLOR_THEME_PRIMARY2 | LEFT | FONT(STD)); } } @@ -130,8 +137,12 @@ class TimerWidget : public Widget drawTimer(dc, 3, 20, abs(timerState.val), COLOR_THEME_PRIMARY2 | LEFT | FONT(XS) | TIMEHOUR); } else { - drawTimer(dc, 3, 18, abs(timerState.val), - COLOR_THEME_PRIMARY2 | LEFT); + // value + int val = timerState.val; + if (timerData.start && timerData.showElapsed && + timerData.start != timerState.val) + val = (int)timerData.start - (int)timerState.val; + drawTimer(dc, 3, 18, abs(val), COLOR_THEME_PRIMARY2 | LEFT); } } } diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 24f6e3dc0..b46583d7e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -463,6 +463,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 8), YAML_END }; @@ -836,7 +838,7 @@ static const struct YamlNode struct_TopBarPersistentData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 248, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -888,7 +890,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 248, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 7d6cea5c3..2b70734ca 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -430,6 +430,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 3), YAML_END }; @@ -806,7 +808,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -858,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 2c7432054..1c1e51a0b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -430,6 +430,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 3), YAML_END }; @@ -806,7 +808,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -858,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 2c7432054..1c1e51a0b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -430,6 +430,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 3), YAML_END }; @@ -806,7 +808,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -858,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index cb80626a5..f87877dde 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -436,6 +436,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 3), YAML_END }; @@ -812,7 +814,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -869,7 +871,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index a75335d90..4675fb7d4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -430,6 +430,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 3), YAML_END }; @@ -806,7 +808,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -858,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp index af5b6fa0f..023554db7 100755 --- a/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp @@ -430,6 +430,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 3), YAML_END }; @@ -806,7 +808,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -858,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 98cd5e44b..6e6bb0331 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -487,6 +487,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 8), YAML_END }; @@ -860,7 +862,7 @@ static const struct YamlNode struct_TopBarPersistentData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 248, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -912,7 +914,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 248, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index b06ae1d44..d57766329 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -485,6 +485,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 8), YAML_END }; @@ -858,7 +860,7 @@ static const struct YamlNode struct_TopBarPersistentData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 248, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -910,7 +912,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 248, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 2c7432054..1c1e51a0b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -430,6 +430,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 3), YAML_END }; @@ -806,7 +808,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -858,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 5f9f3cec7..115576605 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -438,6 +438,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 8), YAML_END }; @@ -819,7 +821,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 192, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -873,7 +875,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 192, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 0fcc29345..dc646a94f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -477,6 +477,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 8), YAML_END }; @@ -858,7 +860,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 192, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -913,7 +915,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 192, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index b47c9de97..ba8177b80 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -415,6 +415,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 3), YAML_END }; @@ -791,7 +793,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -843,7 +845,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index de3cbed44..68ec608a4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -425,6 +425,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 3), YAML_END }; @@ -801,7 +803,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -853,7 +855,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 3ae0a7c5b..ba8b1023b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -422,6 +422,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 3), YAML_END }; @@ -798,7 +800,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -850,7 +852,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index c89c63753..8877a3e36 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -426,6 +426,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 3), YAML_END }; @@ -802,7 +804,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -854,7 +856,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp index af5b6fa0f..023554db7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp @@ -430,6 +430,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_PADDING( 7 ), YAML_STRING("name", 3), YAML_END }; @@ -806,7 +808,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = { static const struct YamlNode struct_ModelData[] = { YAML_CUSTOM("semver",nullptr,w_semver), YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), YAML_UNSIGNED( "noGlobalFunctions", 1 ), @@ -858,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = { }; static const struct YamlNode struct_PartialModel[] = { YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/timers.cpp b/radio/src/timers.cpp index 9e0ce8c67..b5ef9f660 100644 --- a/radio/src/timers.cpp +++ b/radio/src/timers.cpp @@ -77,6 +77,7 @@ void evalTimers(int16_t throttle, uint8_t tick10ms) tmrstart_t timerStart = g_model.timers[i].start; int16_t timerSwtch = g_model.timers[i].swtch; TimerState * timerState = &timersStates[i]; + uint32_t showElapsed = g_model.timers[i].showElapsed; if (timerMode) { if ((timerState->state == TMR_OFF) @@ -166,7 +167,9 @@ void evalTimers(int16_t throttle, uint8_t tick10ms) AUDIO_TIMER_COUNTDOWN(i, newTimerVal); } if (g_model.timers[i].minuteBeep && (newTimerVal % 60) == 0) { - AUDIO_TIMER_MINUTE(newTimerVal); + tmrval_t announceVal = newTimerVal; + if (showElapsed) announceVal = timerStart - newTimerVal; + AUDIO_TIMER_MINUTE(announceVal); // TRACE("Timer[%d] %d minute announcement", i, newTimerVal/60); } } diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 0a4fd9376..798b99644 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -99,7 +99,7 @@ ISTR(SBUS_INVERSION_VALUES); ISTR(SPORT_MODES); ISTR(FSGROUPS); ISTR(ADCFILTERVALUES); - +ISTR(TIMER_DIR); #if defined(HELI) ISTR(VSWASHTYPE); @@ -778,6 +778,7 @@ const char STR_SPORT_UPDATE_POWER_MODE[] = TR_SPORT_UPDATE_POWER_MODE; const char STR_TOUCH_PANEL[] = TR_TOUCH_PANEL; const char STR_FILE_SIZE[] = TR_FILE_SIZE; const char STR_FILE_OPEN[] = TR_FILE_OPEN; +const char STR_LIMITS_HEADERS_DIRECTION[] = TR_LIMITS_HEADERS_DIRECTION; #if defined(COLORLCD) const char STR_ASSIGN_SPLASH[] = TR_ASSIGN_SPLASH; diff --git a/radio/src/translations.h b/radio/src/translations.h index 34d3a630f..8172287e2 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -118,6 +118,7 @@ extern const char* STR_VTRIMINC[]; extern const char* STR_VDISPLAYTRIMS[]; extern const char* STR_RETA123[]; +extern const char* STR_TIMER_DIR[]; extern const char* STR_VBLMODE[]; extern const char* STR_VCURVEFUNC[]; @@ -675,6 +676,7 @@ extern const char STR_SCRIPT_KILLED[]; extern const char STR_SCRIPT_ERROR[]; extern const char STR_PLAY_FILE[]; extern const char STR_ASSIGN_BITMAP[]; +extern const char STR_LIMITS_HEADERS_DIRECTION[]; #if defined(COLORLCD) extern const char STR_ASSIGN_SPLASH[]; extern const char STR_FIRST_CHANNEL[]; diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index 6f47838f6..a4bef6de8 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -250,6 +250,7 @@ #define TR_VCELLINDEX "最低值","1","2","3","4","5","6","最高值","差值" #define TR_TEXT_SIZE "标准","小","较小","中等","双倍" #define TR_SUBTRIMMODES STR_CHAR_DELTA "(中点)", "=(整体)" +#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") #if defined(COLORLCD) #define INDENT diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index 69846ed34..925ecda9d 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -266,6 +266,7 @@ #define TR_VPREC "X","X.X","X.XX" #define TR_VCELLINDEX "Nízký","1","2","3","4","5","6","Nejvíce","Delta" #define TR_SUBTRIMMODES STR_CHAR_DELTA"(pouze středy)","= (symetrický)" +#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") // ZERO TERMINATED STRINGS #if defined(COLORLCD) diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index 7e9af5a78..75164cb88 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -252,6 +252,7 @@ #define TR_VCELLINDEX "Lavest","1","2","3","4","5","6","Højst","Delta" #define TR_TEXT_SIZE "Standard","Tynd","Lille","Medium","Dobbelt" #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center kun)","= (symmetrisk)" +#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") #if defined(COLORLCD) #define INDENT diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index ec9aa1c16..a4aacc7e6 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -252,6 +252,7 @@ #define TR_VCELLINDEX "Niedrigst","1. Zelle","2. Zelle","3. Zelle","4. Zelle","5. Zelle","6. Zelle","Höchster","Differenz" #define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double" #define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)" +#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") // ZERO TERMINATED STRINGS #if defined(COLORLCD) diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index bc91f8175..c99010d43 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -250,6 +250,7 @@ #define TR_VCELLINDEX "Lowest","1","2","3","4","5","6","Highest","Delta" #define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double" #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symmetrical)" +#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") #if defined(COLORLCD) #define INDENT diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index f39915b50..264af13d7 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -249,6 +249,7 @@ #define TR_VCELLINDEX "Menor","1","2","3","4","5","6","Mayor","Delta" #define TR_TEXT_SIZE "Normal","Muy pequeño","Pequeño","Medio","Doble" #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)" +#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") #if defined(COLORLCD) #define INDENT diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index 30f8ea27f..30066c043 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -265,6 +265,7 @@ #define TR_VPREC "0.--","0.0","0.00" #define TR_VCELLINDEX "Alin","1","2","3","4","5","6","Korkein","Ero" #define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)" +#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") // ZERO TERMINATED STRINGS #define INDENT "\001" diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index 7c6d9bd18..f2905a710 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -269,6 +269,7 @@ #define TR_VPREC "0.--","0.0","0.00" #define TR_VCELLINDEX "Mini.","1","2","3","4","5","6","Maxi.","Diff." #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)" +#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") // ZERO TERMINATED STRINGS #if defined(COLORLCD) diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index f464235b7..8d7360c93 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -254,6 +254,7 @@ #define TR_VCELLINDEX "Minore","1","2","3","4","5","6","Maggiore","Delta" #define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double" #define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)" +#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") #if defined(COLORLCD) #define INDENT "\007" diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index 862407d3a..a805a30b3 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -255,6 +255,7 @@ #define TR_GYROS "GyrX","GyrY" #define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double" #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)" +#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") #if defined(COLORLCD) #define INDENT diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index 62bc2f9b9..279dedddf 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -249,6 +249,7 @@ #define TR_VCELLINDEX "Niskie","1","2","3","4","5","6","Wysokie","Delta" #define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double" #define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)" +#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") #if defined(COLORLCD) #define INDENT "\007" diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index a627c6bec..397154153 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -246,6 +246,7 @@ #define TR_VCELLINDEX "Lowest","1","2","3","4","5","6","Highest","Delta" #define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double" #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)" +#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") #if defined(COLORLCD) #define INDENT diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index 7c2fd88c0..4d9cc11cd 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -271,6 +271,7 @@ #define TR_VCELLINDEX "Lägsta","1","2","3","4","5","6","Högsta","Skillnad" #define TR_GYROS "GyrX","GyrY" #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)" +#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") // ZERO TERMINATED STRINGS #if defined(COLORLCD) diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index 2eb678339..e70ccff8b 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -250,6 +250,7 @@ #define TR_VCELLINDEX "最低值","1","2","3","4","5","6","最高值","差值" #define TR_TEXT_SIZE "標準","小","較小","中等","雙倍" #define TR_SUBTRIMMODES STR_CHAR_DELTA "(中点)","=(整體)" +#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") #if defined(COLORLCD) #define INDENT