From 78aa381464da4711edf0aec726e8566b44477487 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 28 Aug 2023 12:02:03 +0200 Subject: [PATCH] fix(radio): YAML timer handling (#3949) * fix: YAML timer handling * chore: improve YAML set timer handling * chore: improve timer handling * feat: only offer defined timer for set and reset functions * feat: only offer defined timer for set and reset functions (bw) * chore: cosmetics --- .../gui/128x64/model_special_functions.cpp | 2 +- radio/src/gui/212x64/lcd.cpp | 2 +- .../gui/212x64/model_special_functions.cpp | 2 +- radio/src/gui/colorlcd/special_functions.cpp | 7 +++-- radio/src/gui/gui_common.cpp | 22 ++++++++------- radio/src/gui/gui_common.h | 1 + .../storage/yaml/yaml_datastructs_funcs.cpp | 27 ++++++++++++++++++- radio/src/translations/da.h | 6 +---- radio/src/translations/de.h | 6 +---- radio/src/translations/en.h | 7 +---- radio/src/translations/es.h | 7 +---- radio/src/translations/fi.h | 7 +---- radio/src/translations/fr.h | 6 +---- radio/src/translations/he.h | 6 +---- radio/src/translations/it.h | 6 +---- radio/src/translations/nl.h | 7 +---- radio/src/translations/pl.h | 8 ++---- radio/src/translations/pt.h | 7 +---- radio/src/translations/se.h | 7 +---- 19 files changed, 61 insertions(+), 82 deletions(-) diff --git a/radio/src/gui/128x64/model_special_functions.cpp b/radio/src/gui/128x64/model_special_functions.cpp index 949202447..9f93a48ec 100644 --- a/radio/src/gui/128x64/model_special_functions.cpp +++ b/radio/src/gui/128x64/model_special_functions.cpp @@ -247,7 +247,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF else if (func == FUNC_SET_TIMER) { maxParam = MAX_TIMERS - 1; lcdDrawTextAtIndex(lcdNextPos, y, STR_VFSWRESET, CFN_TIMER_INDEX(cfn), attr); - if (active) CFN_TIMER_INDEX(cfn) = checkIncDec(event, CFN_TIMER_INDEX(cfn), 0, maxParam, eeFlags); + if (active) CFN_TIMER_INDEX(cfn) = checkIncDec(event, CFN_TIMER_INDEX(cfn), 0, maxParam, eeFlags, isTimerSourceAvailable); break; } else if (attr) { diff --git a/radio/src/gui/212x64/lcd.cpp b/radio/src/gui/212x64/lcd.cpp index 4c4d9a80f..19274805a 100644 --- a/radio/src/gui/212x64/lcd.cpp +++ b/radio/src/gui/212x64/lcd.cpp @@ -714,7 +714,7 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att) lcdDrawSizedText(x, y, g_model.timers[idx].name, LEN_TIMER_NAME, att); } else { - drawStringWithIndex(x, y, STR_SRC_TIMER, idx, att); + drawStringWithIndex(x, y, STR_SRC_TIMER, idx + 1, att); } } else { diff --git a/radio/src/gui/212x64/model_special_functions.cpp b/radio/src/gui/212x64/model_special_functions.cpp index 88ac985d0..a803c053e 100644 --- a/radio/src/gui/212x64/model_special_functions.cpp +++ b/radio/src/gui/212x64/model_special_functions.cpp @@ -239,7 +239,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF else if (func == FUNC_SET_TIMER) { maxParam = TIMERS-1; drawStringWithIndex(lcdNextPos, y, STR_TIMER, CFN_TIMER_INDEX(cfn)+1, attr); - if (active) CFN_TIMER_INDEX(cfn) = checkIncDec(event, CFN_TIMER_INDEX(cfn), 0, maxParam, eeFlags); + if (active) CFN_TIMER_INDEX(cfn) = checkIncDec(event, CFN_TIMER_INDEX(cfn), 0, maxParam, eeFlags, isTimerSourceAvailable); break; } else if (attr) { diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 6a0e46bea..38eb310d7 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -207,8 +207,11 @@ class SpecialFunctionEditPage : public Page timerchoice->setTextHandler([](int32_t value) { return std::string(STR_TIMER) + std::to_string(value + 1); }); - line = specialFunctionOneWindow->newLine(&grid); + timerchoice->setAvailableHandler([=](int value) { + return isTimerSourceAvailable(value); + }); + line = specialFunctionOneWindow->newLine(&grid); new StaticText(line, rect_t{}, STR_VALUE, 0, COLOR_THEME_PRIMARY1); new TimeEdit(line, rect_t{}, 0, 9 * 60 * 60 - 1, GET_SET_DEFAULT(CFN_PARAM(cfn))); @@ -619,7 +622,7 @@ class SpecialFunctionButton : public Button break; case FUNC_SET_TIMER: - sprintf(s+strlen(s), "%s%d = %s", STR_TIMER, CFN_TIMER_INDEX(cfn) + 1, getTimerString(CFN_PARAM(cfn), {.options = SHOW_TIME})); + sprintf(s+strlen(s), "%s%d = %s", STR_SRC_TIMER, CFN_TIMER_INDEX(cfn) + 1, getTimerString(CFN_PARAM(cfn), {.options = SHOW_TIME})); break; case FUNC_SET_FAILSAFE: diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 694749e7c..cccf88c5f 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -608,6 +608,12 @@ bool isAssignableFunctionAvailable(int function) } #endif +bool isTimerSourceAvailable(int index) +{ + TimerData *timer = &g_model.timers[index]; + return timer->mode != 0; +} + bool isSourceAvailableInGlobalResetSpecialFunction(int index) { if (index >= FUNC_RESET_PARAM_FIRST_TELEM) @@ -622,16 +628,14 @@ bool isSourceAvailableInResetSpecialFunction(int index) TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index-FUNC_RESET_PARAM_FIRST_TELEM]; return telemetrySensor.isAvailable(); } -#if TIMERS < 3 - else if (index == FUNC_RESET_TIMER3) { - return false; + else if (index <= FUNC_RESET_TIMER3) { + if (index > (TIMERS - 1)) + return false; + else { + TimerData *timer = &g_model.timers[index]; + return timer->mode != 0; + } } -#endif -#if TIMERS < 2 - else if (index == FUNC_RESET_TIMER2) { - return false; - } -#endif else { return true; } diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 4d241f708..877a42c61 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -78,6 +78,7 @@ bool isLogicalSwitchFunctionAvailable(int function); bool isLogicalSwitchAvailable(int index); bool isAssignableFunctionAvailable(int function); bool isSourceAvailable(int source); +bool isTimerSourceAvailable(int source); bool isSourceAvailableInGlobalFunctions(int source); bool isSourceAvailableInCustomSwitches(int source); bool isSourceAvailableInResetSpecialFunction(int index); diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 35b47e53f..3f482609b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -224,6 +224,26 @@ static uint32_t r_mixSrcRaw(const YamlNode* node, const char* val, uint8_t val_l return MIXSRC_FIRST_HELI + (val[3] - '1'); + } else if (val_len > 3 && + val[0] == 'T' && + val[1] == 'm' && + val[2] == 'r' && + val[3] >= '1' && + val[3] <= ('1' + MAX_TIMERS)) { + + return MIXSRC_FIRST_TIMER + (val[3] - '1'); + + } else if (val_len > 5 && // Old form, removed in 2.10 + val[0] == 'T' && + val[1] == 'I' && + val[2] == 'M' && + val[3] == 'E' && + val[4] == 'R' && + val[5] >= '1' && + val[5] <= ('1' + MAX_TIMERS)) { + + return MIXSRC_FIRST_TIMER + (val[5] - '1'); + } else if (val_len > 1 && val[0] == 'T' && val[1] >= '1' && @@ -346,6 +366,11 @@ static bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, return false; str = closing_parenthesis; } + else if (val >= MIXSRC_FIRST_TIMER + && val <= MIXSRC_LAST_TIMER) { + if (!wf(opaque, "Tmr", 3)) return false; + str = yaml_unsigned2str(val - MIXSRC_FIRST_TIMER + 1); + } else if (val >= MIXSRC_FIRST_TELEM && val <= MIXSRC_LAST_TELEM) { @@ -1415,7 +1440,7 @@ static void r_customFn(void* user, uint8_t* data, uint32_t bitoffs, && val[1] == 'm' && val[2] == 'r' && val[3] >= '1' - && val[3] <= '3') { + && val[3] <= ('1' + MAX_TIMERS)) { CFN_TIMER_INDEX(cfn) = val[3] - '1'; diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index ce333305c..1826e5c39 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -125,12 +125,8 @@ #define TR_SF_RESERVE "[reserve]" #define TR_FSW_RESET_TELEM TR("Telm", "Telemetri") +#define TR_FSW_RESET_TIMERS "Tid1","Tid2","Tid3" -#if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "Tidtag 1","Tidtag 2","Tidtag 3" -#else - #define TR_FSW_RESET_TIMERS "Tid1","Tid2","Tid3" -#endif #define TR_VFSWRESET TR_FSW_RESET_TIMERS,TR("Alle","Flight"),TR_FSW_RESET_TELEM diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index caee9f528..894c50cf5 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -121,12 +121,8 @@ #define TR_SF_SET_SCREEN "Set Main Screen" #define TR_FSW_RESET_TELEM TR("Telm","Telemetrie") +#define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" -#if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "Timer 1","Timer 2","Timer 3" -#else - #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" -#endif #define TR_VFSWRESET TR_FSW_RESET_TIMERS,"All",TR_FSW_RESET_TELEM diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index af8a0fe7f..4bcfc59d9 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -123,12 +123,7 @@ #define TR_SF_RESERVE "[reserve]" #define TR_FSW_RESET_TELEM TR("Telm", "Telemetry") - -#if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "Timer 1","Timer 2","Timer 3" -#else - #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" -#endif +#define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" #define TR_VFSWRESET TR_FSW_RESET_TIMERS,TR("All","Flight"),TR_FSW_RESET_TELEM diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index cbec8d6ed..d531105e0 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -119,12 +119,7 @@ #define TR_SF_SET_SCREEN "Set Main Screen" #define TR_FSW_RESET_TELEM TR("Telm", "Telemetría") - -#if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "Timer 1","Timer 2","Timer 3" -#else - #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" -#endif +#define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" #define TR_VFSWRESET TR_FSW_RESET_TIMERS,TR("Todo","Vuelo"),TR_FSW_RESET_TELEM diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index bf74d88be..d4e87bcf2 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -124,12 +124,7 @@ #define TR_SF_SET_SCREEN "Set Main Screen" #define TR_FSW_RESET_TELEM TR("Telm","Telemetry") - -#if defined(PCBTARANIS) - #define TR_FSW_RESET_TIMERS "Timer 1","Timer 2","Timer 3" -#else - #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" -#endif +#define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" #define TR_VFSWRESET TR_FSW_RESET_TIMERS,"All",TR_FSW_RESET_TELEM diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index 70dccd99b..40dd59c9b 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -123,12 +123,8 @@ #define TR_SF_SET_SCREEN "Définir Écran Princ." #define TR_FSW_RESET_TELEM TR("Télem.", "Télémétrie") +#define TR_FSW_RESET_TIMERS "Chr1","Chr2","Chr3" -#if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "Chrono 1","Chrono 2","Chrono 3" -#else - #define TR_FSW_RESET_TIMERS "Chr1","Chr2","Chr3" -#endif #define TR_VFSWRESET TR_FSW_RESET_TIMERS, "Tout", TR_FSW_RESET_TELEM #define TR_FUNCSOUNDS TR("Bp1","Beep1"),TR("Bp2","Beep2"),TR("Bp3","Beep3"),TR("Wrn1","Warn1"),TR("Wrn2","Warn2"),TR("Chee","Cheep"),TR("Rata","Ratata"),"Tick",TR("Sirn","Siren"),"Ring",TR("SciF","SciFi"),TR("Robt","Robot"),TR("Chrp","Chirp"),"Tada",TR("Crck","Crickt"),TR("Alrm","AlmClk") diff --git a/radio/src/translations/he.h b/radio/src/translations/he.h index 1cfde313d..ead9740a3 100644 --- a/radio/src/translations/he.h +++ b/radio/src/translations/he.h @@ -176,12 +176,8 @@ #define TR_VFSWFUNC TR_SF_SAFETY,"Trainer","Inst. Trim","Reset","Set",TR_ADJUST_GVAR,"Volume","SetFailsafe","RangeCheck","ModuleBind",TR_SOUND,TR_PLAY_TRACK,TR_PLAY_VALUE,TR_SF_RESERVE,TR_SF_PLAY_SCRIPT,TR_SF_RESERVE,TR_SF_BG_MUSIC,TR_VVARIO,TR_HAPTIC,TR_SDCLOGS,"Backlight",TR_SF_SCREENSHOT,TR_SF_RACING_MODE,TR_SF_DISABLE_TOUCH, TR_SF_SET_SCREEN TR_SF_TEST #define TR_FSW_RESET_TELEM TR("Telm", "טלמטריה") +#define TR_FSW_RESET_TIMERS "שעון 1","שעון 2","שעון 3" -#if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "שעון 1","שעון 2","שעון 3" -#else - #define TR_FSW_RESET_TIMERS "שעון 1","שעון 2","שעון 3" -#endif #define TR_VFSWRESET TR_FSW_RESET_TIMERS,TR("All","Flight"),TR_FSW_RESET_TELEM diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index 85d9d3d11..e2b84635a 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -122,12 +122,8 @@ #define TR_SF_SET_SCREEN "Setta Schermo Princ." #define TR_FSW_RESET_TELEM TR("Telm", "Telemetria") +#define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" -#if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "Timer 1","Timer 2","Timer 3" -#else - #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" -#endif #define TR_VFSWRESET TR_FSW_RESET_TIMERS,TR("All","Tutto"),TR_FSW_RESET_TELEM diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index 7fd646559..bc4100fe3 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -120,12 +120,7 @@ #define TR_SF_RESERVE "[reserve]" #define TR_FSW_RESET_TELEM TR("Telm", "Telemetrie") - -#if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "Timer 1","Timer 2","Timer 3" -#else - #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" -#endif +#define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" #define TR_VFSWRESET TR_FSW_RESET_TIMERS,TR("All","Vliegdata"),TR_FSW_RESET_TELEM diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index 725a24f69..f9d43dd5d 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -117,13 +117,9 @@ #define TR_SF_DISABLE_TOUCH "No Touch" #define TR_SF_SET_SCREEN "Set Main Screen" -#define TR_FSW_RESET_TELEM TR("Telm", "Telemetra") +#define TR_FSW_RESET_TELEM TR("Telm", "Telemetra") +#define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" -#if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "Timer 1","Timer 2","Timer 3" -#else - #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" -#endif #define TR_VFSWRESET TR_FSW_RESET_TIMERS,TR("All","Flight"),TR_FSW_RESET_TELEM #define TR_FUNCSOUNDS TR("Bp1","Beep1"),TR("Bp2","Beep2"),TR("Bp3","Beep3"),TR("Ost1","Ostrz1"),TR("Ost2","Ostrz2"),TR("Chee","Cheep"),TR("Rata","Ratata"),"Tick",TR("Syre","Syrena"),TR("Dzwo","Dzwone"),TR("Crck","Krytcz"),TR("Alrm","AlmZeg") diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index 3d7c6c4c7..ddc6fc024 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -126,12 +126,7 @@ #define TR_SF_RESERVE "[reserve]" #define TR_FSW_RESET_TELEM TR("Telm", "Telemetria") - -#if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "Timer 1","Timer 2","Timer 3" -#else - #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" -#endif +#define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" #define TR_VFSWRESET TR_FSW_RESET_TIMERS,TR("All","Flight"),TR_FSW_RESET_TELEM diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index e9edb3244..fa7c1df74 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -129,12 +129,7 @@ #define TR_SF_RESERVE "[reserv]" #define TR_FSW_RESET_TELEM TR("Telm","Telemetri") - -#if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "Timer 1","Timer 2","Timer 3" -#else - #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" -#endif +#define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" #define TR_VFSWRESET TR_FSW_RESET_TIMERS,"Alla",TR_FSW_RESET_TELEM #define TR_FUNCSOUNDS TR("Bp1","Beep1"),TR("Bp2","Beep2"),TR("Bp3","Beep3"),TR("Wrn1","Warn1"),TR("Wrn2","Warn2"),TR("Chee","Cheep"),TR("Rata","Ratata"),"Tick",TR("Sirn","Siren"),"Ring",TR("SciF","SciFi"),TR("Robt","Robot"),TR("Chrp","Chirp"),"Tada",TR("Crck","Crickt"),TR("Alrm","AlmClk")