diff --git a/companion/src/firmwares/customfunctiondata.cpp b/companion/src/firmwares/customfunctiondata.cpp index 42a0e2f3cda..88ae4a9c21c 100644 --- a/companion/src/firmwares/customfunctiondata.cpp +++ b/companion/src/firmwares/customfunctiondata.cpp @@ -122,6 +122,8 @@ QString CustomFunctionData::funcToString(const AssignFunc func, const ModelData return tr("Racing Mode"); else if (func == FuncDisableTouch) return tr("Disable Touch"); + else if (func == FuncDisableKeys) + return tr("Disable Keys"); else if (func == FuncSetScreen) return tr("Set Main Screen"); else if (func == FuncDisableAudioAmp) @@ -491,6 +493,7 @@ bool CustomFunctionData::isParamAvailable() const FuncBindExternalModule, FuncRacingMode, FuncDisableTouch, + FuncDisableKeys, FuncDisableAudioAmp }; diff --git a/companion/src/firmwares/customfunctiondata.h b/companion/src/firmwares/customfunctiondata.h index 06f2585dad3..21b29bcba6e 100644 --- a/companion/src/firmwares/customfunctiondata.h +++ b/companion/src/firmwares/customfunctiondata.h @@ -68,6 +68,7 @@ enum AssignFunc { FuncBindExternalModule, FuncRacingMode, FuncDisableTouch, + FuncDisableKeys, FuncSetScreen, FuncDisableAudioAmp, FuncRGBLed, diff --git a/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp b/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp index 3f808247128..5783e9d4d05 100644 --- a/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp +++ b/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp @@ -64,6 +64,7 @@ static const YamlLookupTable customFnLut = { { FuncRGBLed, "RGB_LED" }, { FuncLCDtoVideo, "LCD_TO_VIDEO" }, { FuncPushCustomSwitch1, "PUSH_CUST_SWITCH" }, + { FuncDisableKeys, "DISABLE_KEYS" }, }; static const YamlLookupTable trainerLut = { diff --git a/radio/src/cfn_sort.cpp b/radio/src/cfn_sort.cpp index 936ef2f0018..de1d121e53d 100644 --- a/radio/src/cfn_sort.cpp +++ b/radio/src/cfn_sort.cpp @@ -22,6 +22,7 @@ // This file is auto-generated via cfn_sorter.sh. Do not edit. #include "dataconstants.h" +#include "hal_keys_lock.h" Functions cfn_sorted[] = { #if defined(TRANSLATIONS_CN) @@ -62,6 +63,9 @@ Functions cfn_sorted[] = { /* 暂停背景音乐 */ FUNC_BACKGND_MUSIC_PAUSE, /* 振动 */ FUNC_HAPTIC, /* LUA脚本 */ FUNC_PLAY_SCRIPT, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif #if defined(FUNCTION_SWITCHES) /* Push CS */ FUNC_PUSH_CUST_SWITCH, #endif @@ -89,6 +93,9 @@ Functions cfn_sorted[] = { /* ModuleBind */ FUNC_BIND, /* Nastav */ FUNC_ADJUST_GVAR, /* Nastavit Failsafe */ FUNC_SET_FAILSAFE, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif #if !OLED_SCREEN /* Podsvětlení */ FUNC_BACKLIGHT, #endif @@ -129,6 +136,9 @@ Functions cfn_sorted[] = { /* Lua skript */ FUNC_PLAY_SCRIPT, /* Lydstyrke */ FUNC_VOLUME, /* Modul tilslut */ FUNC_BIND, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif /* Nulstil */ FUNC_RESET, /* Overskriv */ FUNC_OVERRIDE_CHANNEL, /* RGB lys */ FUNC_RGB_LED, @@ -179,6 +189,9 @@ Functions cfn_sorted[] = { #endif /* Lua-Skript */ FUNC_PLAY_SCRIPT, /* ModuleBind */ FUNC_BIND, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif /* RacingMode */ FUNC_RACING_MODE, /* RangeCheck */ FUNC_RANGECHECK, /* RGB LED */ FUNC_RGB_LED, @@ -219,6 +232,9 @@ Functions cfn_sorted[] = { #if !OLED_SCREEN /* Luz Fondo */ FUNC_BACKLIGHT, #endif +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif #if defined(COLORLCD) /* No Touch */ FUNC_DISABLE_TOUCH, #endif @@ -257,6 +273,9 @@ Functions cfn_sorted[] = { #endif /* Lua Script */ FUNC_PLAY_SCRIPT, /* ModuleBind */ FUNC_BIND, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif #if defined(COLORLCD) /* No Touch */ FUNC_DISABLE_TOUCH, #endif @@ -301,6 +320,9 @@ Functions cfn_sorted[] = { /* Luminosité */ FUNC_BACKLIGHT, #endif /* Musique */ FUNC_BACKGND_MUSIC, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif #if defined(COLORLCD) /* Non Tactile */ FUNC_DISABLE_TOUCH, #endif @@ -336,6 +358,9 @@ Functions cfn_sorted[] = { #endif /* Lua Script */ FUNC_PLAY_SCRIPT, /* ModuleBind */ FUNC_BIND, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif /* Override */ FUNC_OVERRIDE_CHANNEL, /* Play Track */ FUNC_PLAY_TRACK, /* Play Value */ FUNC_PLAY_VALUE, @@ -390,6 +415,9 @@ Functions cfn_sorted[] = { /* Modo Racing */ FUNC_RACING_MODE, /* Musica Sf */ FUNC_BACKGND_MUSIC, /* Musica Sf || */ FUNC_BACKGND_MUSIC_PAUSE, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif #if defined(FUNCTION_SWITCHES) /* Premi CS */ FUNC_PUSH_CUST_SWITCH, #endif @@ -421,6 +449,9 @@ Functions cfn_sorted[] = { /* LCD to Video */ FUNC_LCD_TO_VIDEO, #endif /* LUAスクリプト */ FUNC_PLAY_SCRIPT, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif #if defined(FUNCTION_SWITCHES) /* Push CS */ FUNC_PUSH_CUST_SWITCH, #endif @@ -459,6 +490,9 @@ Functions cfn_sorted[] = { /* LCD -> 비디오 출력 */ FUNC_LCD_TO_VIDEO, #endif /* Lua 스크립트 실행 */ FUNC_PLAY_SCRIPT, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif /* RGB LED */ FUNC_RGB_LED, /* SD 로그 저장 */ FUNC_LOGS, /* 값 재생 */ FUNC_PLAY_VALUE, @@ -515,6 +549,9 @@ Functions cfn_sorted[] = { #endif /* Lua Script */ FUNC_PLAY_SCRIPT, /* ModuleBind */ FUNC_BIND, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif #if defined(COLORLCD) /* No Touch */ FUNC_DISABLE_TOUCH, #endif @@ -557,6 +594,9 @@ Functions cfn_sorted[] = { /* ModuleBind */ FUNC_BIND, /* Muz. tła */ FUNC_BACKGND_MUSIC, /* Muz. tła || */ FUNC_BACKGND_MUSIC_PAUSE, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif #if defined(COLORLCD) /* No Touch */ FUNC_DISABLE_TOUCH, #endif @@ -605,6 +645,9 @@ Functions cfn_sorted[] = { /* LuzFundo */ FUNC_BACKLIGHT, #endif /* ModCorrida */ FUNC_RACING_MODE, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif #if defined(COLORLCD) /* No Touch */ FUNC_DISABLE_TOUCH, #endif @@ -632,6 +675,9 @@ Functions cfn_sorted[] = { /* LCD в видео */ FUNC_LCD_TO_VIDEO, #endif /* Lua скрипт */ FUNC_PLAY_SCRIPT, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif /* Play Value */ FUNC_PLAY_VALUE, /* RGB подсветка */ FUNC_RGB_LED, /* SD логи */ FUNC_LOGS, @@ -690,6 +736,9 @@ Functions cfn_sorted[] = { /* Lås */ FUNC_OVERRIDE_CHANNEL, /* Lärare */ FUNC_TRAINER, /* Musik */ FUNC_BACKGND_MUSIC, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif /* Parkoppla modul */ FUNC_BIND, /* Pausa musik */ FUNC_BACKGND_MUSIC_PAUSE, /* Range check */ FUNC_RANGECHECK, @@ -714,6 +763,9 @@ Functions cfn_sorted[] = { /* Återställ */ FUNC_RESET, #elif defined(TRANSLATIONS_TW) /* Lua腳本 */ FUNC_PLAY_SCRIPT, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif #if defined(FUNCTION_SWITCHES) /* Push CS */ FUNC_PUSH_CUST_SWITCH, #endif @@ -793,6 +845,9 @@ Functions cfn_sorted[] = { /* LCD to Video */ FUNC_LCD_TO_VIDEO, #endif /* Lua Скрипт */ FUNC_PLAY_SCRIPT, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif #if defined(FUNCTION_SWITCHES) /* Push CS */ FUNC_PUSH_CUST_SWITCH, #endif @@ -816,6 +871,9 @@ Functions cfn_sorted[] = { #endif /* Lua Script */ FUNC_PLAY_SCRIPT, /* ModuleBind */ FUNC_BIND, +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + /* No Keys */ FUNC_DISABLE_KEYS, +#endif #if defined(COLORLCD) /* No Touch */ FUNC_DISABLE_TOUCH, #endif diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 9b6681a9223..79572130816 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -738,6 +738,7 @@ enum Functions { #if defined(FUNCTION_SWITCHES) || defined(CFN_ONLY) FUNC_PUSH_CUST_SWITCH, #endif + FUNC_DISABLE_KEYS, FUNC_TEST, // MUST remain last #if defined(DEBUG) FUNC_MAX SKIP diff --git a/radio/src/edgetx.cpp b/radio/src/edgetx.cpp index f0d25602375..cb473bcfdb0 100644 --- a/radio/src/edgetx.cpp +++ b/radio/src/edgetx.cpp @@ -217,6 +217,11 @@ void per10ms() evalFunctionSwitches(); #endif + if (radioGFEnabled()) + evalUIFunctions(g_eeGeneral.customFn, globalFunctionsContext); + if (modelSFEnabled()) + evalUIFunctions(g_model.customFn, modelFunctionsContext); + #if defined(ROTARY_ENCODER_NAVIGATION) && !defined(COLORLCD) if (rotaryEncoderPollingCycle()) { inactivityTimerReset(ActivitySource::Keys); diff --git a/radio/src/edgetx.h b/radio/src/edgetx.h index 80eb1fb0321..f8c83518289 100644 --- a/radio/src/edgetx.h +++ b/radio/src/edgetx.h @@ -151,12 +151,13 @@ void memswap(void * a, void * b, uint8_t size); struct CustomFunctionsContext { MASK_FUNC_TYPE activeFunctions; + MASK_FUNC_TYPE activeUIFunctions; MASK_CFN_TYPE activeSwitches; tmr10ms_t lastFunctionTime[MAX_SPECIAL_FUNCTIONS]; inline bool isFunctionActive(uint8_t func) { - return activeFunctions & ((MASK_FUNC_TYPE)1 << func); + return (activeFunctions | activeUIFunctions) & ((MASK_FUNC_TYPE)1 << func); } void reset() @@ -431,6 +432,7 @@ enum FunctionsActive { FUNCTION_DISABLE_TOUCH, FUNCTION_DISABLE_AUDIO_AMP, FUNCTION_VOLUME, + FUNCTION_DISABLE_KEYS, }; #define VARIO_FREQUENCY_ZERO 700/*Hz*/ @@ -445,6 +447,7 @@ inline bool isFunctionActive(uint8_t func) return globalFunctionsContext.isFunctionActive(func) || modelFunctionsContext.isFunctionActive(func); } void evalFunctions(CustomFunctionData * functions, CustomFunctionsContext & functionsContext); +void evalUIFunctions(CustomFunctionData * functions, CustomFunctionsContext & functionsContext); inline void customFunctionsReset() { globalFunctionsContext.reset(); diff --git a/radio/src/functions.cpp b/radio/src/functions.cpp index c9794f77c4f..09ea5fc1bbc 100644 --- a/radio/src/functions.cpp +++ b/radio/src/functions.cpp @@ -36,8 +36,8 @@ void switchToRadio() {}; void switchToVideo() {}; #endif #endif -CustomFunctionsContext modelFunctionsContext = { 0 }; +CustomFunctionsContext modelFunctionsContext = { 0 }; CustomFunctionsContext globalFunctionsContext = { 0 }; #if defined(DEBUG) @@ -379,14 +379,6 @@ void evalFunctions(CustomFunctionData * functions, CustomFunctionsContext & func break; #endif - case FUNC_LOGS: - if (CFN_PARAM(cfn)) { - newActiveFunctions |= (1u << FUNCTION_LOGS); - logDelay100ms = CFN_PARAM( - cfn); // logging period is 0..25.5s in 100ms increments - } - break; - #if defined(FUNCTION_SWITCHES) case FUNC_PUSH_CUST_SWITCH: if (CFN_PARAM(cfn)) { // Duration is set @@ -428,35 +420,20 @@ void evalFunctions(CustomFunctionData * functions, CustomFunctionsContext & func } break; #endif -#if defined(HARDWARE_TOUCH) - case FUNC_DISABLE_TOUCH: - newActiveFunctions |= (1u << FUNCTION_DISABLE_TOUCH); - break; -#endif + #if defined(AUDIO_MUTE_GPIO) case FUNC_DISABLE_AUDIO_AMP: newActiveFunctions |= (1u << FUNCTION_DISABLE_AUDIO_AMP); break; #endif - case FUNC_SET_SCREEN: - if (isRepeatDelayElapsed(functions, functionsContext, i)) { - TRACE("SET VIEW %d", (CFN_PARAM(cfn))); -#if defined(COLORLCD) - int8_t screenNumber = max(0, CFN_PARAM(cfn) - 1); - setRequestedMainView(screenNumber); - mainRequestFlags |= (1u << REQUEST_MAIN_VIEW); -#else - extern void showTelemScreen(uint8_t index); - showTelemScreen(CFN_PARAM(cfn)); -#endif - } - break; + #if defined(VIDEO_SWITCH) case FUNC_LCD_TO_VIDEO: switchToVideo(); videoEnabled = true; break; #endif + #if defined(DEBUG) case FUNC_TEST: testFunc(); @@ -506,6 +483,66 @@ void evalFunctions(CustomFunctionData * functions, CustomFunctionsContext & func functionsContext.activeFunctions = newActiveFunctions; } +void evalUIFunctions(CustomFunctionData * functions, CustomFunctionsContext & functionsContext) +{ + MASK_FUNC_TYPE newActiveFunctions = 0; + + for (uint8_t i=0; igetLvObj(), ETX_STATE_SF_ACTIVE); - } else { - lv_obj_clear_state(headerSF->getLvObj(), ETX_STATE_SF_ACTIVE); + protected: + uint8_t index; + Window *specialFunctionOneWindow = nullptr; + StaticText *headerSF = nullptr; + bool active = false; + bool saveKeyLockState; + + virtual bool isActive() const = 0; + virtual bool isSwitchAvailable(int value) const = 0; + virtual CustomFunctionData *customFunctionData() const = 0; + virtual bool isAssignableFunctionAvailable(int function) const = 0; + virtual void setDirty() const = 0; + + void checkEvents() override + { + Page::checkEvents(); + if (active != isActive()) { + if (isActive()) { + lv_obj_add_state(headerSF->getLvObj(), ETX_STATE_SF_ACTIVE); + } else { + lv_obj_clear_state(headerSF->getLvObj(), ETX_STATE_SF_ACTIVE); + } + active = isActive(); } - active = isActive(); } -} - -void FunctionEditPage::buildHeader(Window *window, const char *title, - const char *prefix) -{ - header->setTitle(title); - headerSF = header->setTitle2(prefix + std::to_string(index + 1)); - - etx_txt_color(headerSF->getLvObj(), COLOR_THEME_ACTIVE_INDEX, - ETX_STATE_SF_ACTIVE); - etx_font(headerSF->getLvObj(), FONT_BOLD_INDEX, ETX_STATE_SF_ACTIVE); -} -void FunctionEditPage::addSourceChoice(FormLine *line, const char *title, - CustomFunctionData *cfn, int16_t vmax) -{ - new StaticText(line, rect_t{}, title); - new SourceChoice(line, rect_t{}, 0, vmax, GET_SET_DEFAULT(CFN_PARAM(cfn)), true); -} - -NumberEdit *FunctionEditPage::addNumberEdit(FormLine *line, const char *title, - CustomFunctionData *cfn, - int16_t vmin, int16_t vmax) -{ - new StaticText(line, rect_t{}, title); - return new NumberEdit(line, rect_t{}, vmin, vmax, - GET_SET_DEFAULT(CFN_PARAM(cfn))); -} - -void FunctionEditPage::updateSpecialFunctionOneWindow() -{ - specialFunctionOneWindow->clear(); - specialFunctionOneWindow->setFlexLayout(); - FlexGridLayout grid(col_dsc, row_dsc, PAD_TINY); - auto line = specialFunctionOneWindow->newLine(grid); - - CustomFunctionData *cfn = customFunctionData(); - uint8_t func = CFN_FUNC(cfn); + void addSourceChoice(FormLine *line, const char *title, + CustomFunctionData *cfn, int16_t vmax) + { + new StaticText(line, rect_t{}, title); + new SourceChoice(line, rect_t{}, 0, vmax, GET_SET_DEFAULT(CFN_PARAM(cfn)), true); + } - // Func param - switch (func) { - case FUNC_OVERRIDE_CHANNEL: { - new StaticText(line, rect_t{}, STR_CH); - new NumberEdit(line, rect_t{}, 1, MAX_OUTPUT_CHANNELS, - GET_SET_VALUE_WITH_OFFSET(CFN_CH_INDEX(cfn), 1)); - line = specialFunctionOneWindow->newLine(grid); + NumberEdit *addNumberEdit(FormLine *line, const char *title, + CustomFunctionData *cfn, int16_t vmin, int16_t vmax) + { + new StaticText(line, rect_t{}, title); + return new NumberEdit(line, rect_t{}, vmin, vmax, + GET_SET_DEFAULT(CFN_PARAM(cfn))); + } - int limit = - (g_model.extendedLimits ? LIMIT_EXT_PERCENT : LIMIT_STD_PERCENT); - addNumberEdit(line, STR_VALUE, cfn, -limit, limit); - break; - } + void updateSpecialFunctionOneWindow() + { + specialFunctionOneWindow->clear(); + specialFunctionOneWindow->setFlexLayout(); + FlexGridLayout grid(col_dsc, row_dsc, PAD_TINY); + auto line = specialFunctionOneWindow->newLine(grid); + + CustomFunctionData *cfn = customFunctionData(); + uint8_t func = CFN_FUNC(cfn); + + // Func param + switch (func) { + case FUNC_OVERRIDE_CHANNEL: { + new StaticText(line, rect_t{}, STR_CH); + new NumberEdit(line, rect_t{}, 1, MAX_OUTPUT_CHANNELS, + GET_SET_VALUE_WITH_OFFSET(CFN_CH_INDEX(cfn), 1)); + line = specialFunctionOneWindow->newLine(grid); - case FUNC_TRAINER: { - new StaticText(line, rect_t{}, STR_VALUE); - auto max_sticks = adcGetMaxInputs(ADC_INPUT_MAIN); - auto choice = new Choice(line, rect_t{}, 0, max_sticks + 1, - GET_SET_DEFAULT(CFN_CH_INDEX(cfn))); - choice->setTextHandler([=](int32_t value) { - if (value == 0) - return std::string(STR_STICKS); - else if (value == MAX_STICKS + 1) - return std::string(STR_CHANS); - - return std::string(getMainControlLabel(value - 1)); - }); - break; - } + int limit = + (g_model.extendedLimits ? LIMIT_EXT_PERCENT : LIMIT_STD_PERCENT); + addNumberEdit(line, STR_VALUE, cfn, -limit, limit); + break; + } - case FUNC_RESET: - if (CFN_PARAM(cfn) <= FUNC_RESET_PARAM_LAST) { - new StaticText(line, rect_t{}, STR_RESET); - auto choice = - new Choice(line, rect_t{}, 0, - FUNC_RESET_PARAM_FIRST_TELEM + lastUsedTelemetryIndex(), - GET_SET_DEFAULT(CFN_PARAM(cfn))); - choice->setAvailableHandler(isSourceAvailableInResetSpecialFunction); + case FUNC_TRAINER: { + new StaticText(line, rect_t{}, STR_VALUE); + auto max_sticks = adcGetMaxInputs(ADC_INPUT_MAIN); + auto choice = new Choice(line, rect_t{}, 0, max_sticks + 1, + GET_SET_DEFAULT(CFN_CH_INDEX(cfn))); choice->setTextHandler([=](int32_t value) { - if (value < FUNC_RESET_PARAM_FIRST_TELEM) - return std::string(STR_VFSWRESET[value]); - else - return std::string( - g_model.telemetrySensors[value - FUNC_RESET_PARAM_FIRST_TELEM] - .label, - TELEM_LABEL_LEN); + if (value == 0) + return std::string(STR_STICKS); + else if (value == MAX_STICKS + 1) + return std::string(STR_CHANS); + + return std::string(getMainControlLabel(value - 1)); }); + break; } - break; - case FUNC_VOLUME: - addSourceChoice(line, STR_VOLUME, cfn, MIXSRC_LAST_CH); - break; + case FUNC_RESET: + if (CFN_PARAM(cfn) <= FUNC_RESET_PARAM_LAST) { + new StaticText(line, rect_t{}, STR_RESET); + auto choice = + new Choice(line, rect_t{}, 0, + FUNC_RESET_PARAM_FIRST_TELEM + lastUsedTelemetryIndex(), + GET_SET_DEFAULT(CFN_PARAM(cfn))); + choice->setAvailableHandler(isSourceAvailableInResetSpecialFunction); + choice->setTextHandler([=](int32_t value) { + if (value < FUNC_RESET_PARAM_FIRST_TELEM) + return std::string(STR_VFSWRESET[value]); + else + return std::string( + g_model.telemetrySensors[value - FUNC_RESET_PARAM_FIRST_TELEM] + .label, + TELEM_LABEL_LEN); + }); + } + break; - case FUNC_BACKLIGHT: - addSourceChoice(line, STR_VALUE, cfn, MIXSRC_LAST_CH); - break; + case FUNC_VOLUME: + addSourceChoice(line, STR_VOLUME, cfn, MIXSRC_LAST_CH); + break; - case FUNC_PLAY_SOUND: - new StaticText(line, rect_t{}, STR_VALUE); - new Choice(line, rect_t{}, STR_FUNCSOUNDS, 0, - AU_SPECIAL_SOUND_LAST - AU_SPECIAL_SOUND_FIRST - 1, - GET_SET_DEFAULT(CFN_PARAM(cfn))); - break; + case FUNC_BACKLIGHT: + addSourceChoice(line, STR_VALUE, cfn, MIXSRC_LAST_CH); + break; - case FUNC_PLAY_TRACK: - case FUNC_BACKGND_MUSIC: - case FUNC_PLAY_SCRIPT: - case FUNC_RGB_LED: - new StaticText(line, rect_t{}, STR_VALUE); - new FileChoice( - line, rect_t{}, - func == FUNC_PLAY_SCRIPT || func == FUNC_RGB_LED - ? (func == FUNC_PLAY_SCRIPT ? SCRIPTS_FUNCS_PATH - : SCRIPTS_RGB_PATH) - : std::string(SOUNDS_PATH, SOUNDS_PATH_LNG_OFS) + - std::string(currentLanguagePack->id, 2), - (func == FUNC_PLAY_SCRIPT || func == FUNC_RGB_LED) ? SCRIPTS_EXT - : SOUNDS_EXT, - sizeof(cfn->play.name), - [=]() { return std::string(cfn->play.name, ZLEN(cfn->play.name)); }, - [=](std::string newValue) { - strncpy(cfn->play.name, newValue.c_str(), sizeof(cfn->play.name)); - SET_DIRTY(); - if (func == FUNC_PLAY_SCRIPT || func == FUNC_RGB_LED) - LUA_LOAD_MODEL_SCRIPTS(); - }, - true, funcGetLabel(func)); - break; - - case FUNC_SET_TIMER: { - new StaticText(line, rect_t{}, STR_TIMER); - if (timersSetupCount() > 0) { - auto timerchoice = new Choice(line, rect_t{}, 0, TIMERS - 1, - GET_SET_DEFAULT(CFN_TIMER_INDEX(cfn))); - timerchoice->setTextHandler([](int32_t value) { - return std::string(STR_TIMER) + std::to_string(value + 1); - }); - timerchoice->setAvailableHandler( - [=](int value) { return isTimerSourceAvailable(value); }); - - line = specialFunctionOneWindow->newLine(grid); + case FUNC_PLAY_SOUND: new StaticText(line, rect_t{}, STR_VALUE); - new TimeEdit(line, rect_t{}, 0, 9 * 60 * 60 - 1, - GET_SET_DEFAULT(CFN_PARAM(cfn))); - } else { - new StaticText(line, rect_t{}, STR_NO_TIMERS); - } - break; - } - - static const char* const strModules[] = { "Int.", "Ext." }; - case FUNC_SET_FAILSAFE: - new StaticText(line, rect_t{}, STR_MODULE); - new Choice(line, rect_t{}, strModules, 0, NUM_MODULES - 1, - GET_SET_DEFAULT(CFN_PARAM(cfn))); - break; - - case FUNC_PLAY_VALUE: - addSourceChoice(line, STR_VALUE, cfn, MIXSRC_LAST_TELEM); - break; + new Choice(line, rect_t{}, STR_FUNCSOUNDS, 0, + AU_SPECIAL_SOUND_LAST - AU_SPECIAL_SOUND_FIRST - 1, + GET_SET_DEFAULT(CFN_PARAM(cfn))); + break; + + case FUNC_PLAY_TRACK: + case FUNC_BACKGND_MUSIC: + case FUNC_PLAY_SCRIPT: + case FUNC_RGB_LED: + new StaticText(line, rect_t{}, STR_VALUE); + new FileChoice( + line, rect_t{}, + func == FUNC_PLAY_SCRIPT || func == FUNC_RGB_LED + ? (func == FUNC_PLAY_SCRIPT ? SCRIPTS_FUNCS_PATH + : SCRIPTS_RGB_PATH) + : std::string(SOUNDS_PATH, SOUNDS_PATH_LNG_OFS) + + std::string(currentLanguagePack->id, 2), + (func == FUNC_PLAY_SCRIPT || func == FUNC_RGB_LED) ? SCRIPTS_EXT + : SOUNDS_EXT, + sizeof(cfn->play.name), + [=]() { return std::string(cfn->play.name, ZLEN(cfn->play.name)); }, + [=](std::string newValue) { + strncpy(cfn->play.name, newValue.c_str(), sizeof(cfn->play.name)); + SET_DIRTY(); + if (func == FUNC_PLAY_SCRIPT || func == FUNC_RGB_LED) + LUA_LOAD_MODEL_SCRIPTS(); + }, + true, funcGetLabel(func)); + break; + + case FUNC_SET_TIMER: { + new StaticText(line, rect_t{}, STR_TIMER); + if (timersSetupCount() > 0) { + auto timerchoice = new Choice(line, rect_t{}, 0, TIMERS - 1, + GET_SET_DEFAULT(CFN_TIMER_INDEX(cfn))); + timerchoice->setTextHandler([](int32_t value) { + return std::string(STR_TIMER) + std::to_string(value + 1); + }); + timerchoice->setAvailableHandler( + [=](int value) { return isTimerSourceAvailable(value); }); - case FUNC_HAPTIC: - addNumberEdit(line, STR_VALUE, cfn, 0, 3); - break; + line = specialFunctionOneWindow->newLine(grid); + new StaticText(line, rect_t{}, STR_VALUE); + new TimeEdit(line, rect_t{}, 0, 9 * 60 * 60 - 1, + GET_SET_DEFAULT(CFN_PARAM(cfn))); + } else { + new StaticText(line, rect_t{}, STR_NO_TIMERS); + } + break; + } -#if defined(FUNCTION_SWITCHES) - case FUNC_PUSH_CUST_SWITCH: { - new StaticText(line, rect_t{}, STR_SWITCH); - auto choice = new Choice(line, rect_t{}, 0, switchGetMaxSwitches() - 1, - [=]() { return switchGetSwitchFromCustomIdx(CFN_CS_INDEX(cfn)); }, - [=](int n) { CFN_CS_INDEX(cfn) = switchGetCustomSwitchIdx(n); }, - STR_SWITCH); - choice->setTextHandler([=](int n) { - return std::string(switchGetDefaultName(n)); - }); - choice->setAvailableHandler(switchIsCustomSwitch); + static const char* const strModules[] = { "Int.", "Ext." }; + case FUNC_SET_FAILSAFE: + new StaticText(line, rect_t{}, STR_MODULE); + new Choice(line, rect_t{}, strModules, 0, NUM_MODULES - 1, + GET_SET_DEFAULT(CFN_PARAM(cfn))); + break; + + case FUNC_PLAY_VALUE: + addSourceChoice(line, STR_VALUE, cfn, MIXSRC_LAST_TELEM); + break; + + case FUNC_HAPTIC: + addNumberEdit(line, STR_VALUE, cfn, 0, 3); + break; + + #if defined(FUNCTION_SWITCHES) + case FUNC_PUSH_CUST_SWITCH: { + new StaticText(line, rect_t{}, STR_SWITCH); + auto choice = new Choice(line, rect_t{}, 0, switchGetMaxSwitches() - 1, + [=]() { return switchGetSwitchFromCustomIdx(CFN_CS_INDEX(cfn)); }, + [=](int n) { CFN_CS_INDEX(cfn) = switchGetCustomSwitchIdx(n); }, + STR_SWITCH); + choice->setTextHandler([=](int n) { + return std::string(switchGetDefaultName(n)); + }); + choice->setAvailableHandler(switchIsCustomSwitch); - line = specialFunctionOneWindow->newLine(grid); + line = specialFunctionOneWindow->newLine(grid); - auto edit = addNumberEdit(line, STR_INTERVAL, cfn, PUSH_CS_DURATION_MIN, - PUSH_CS_DURATION_MAX); + auto edit = addNumberEdit(line, STR_INTERVAL, cfn, PUSH_CS_DURATION_MIN, + PUSH_CS_DURATION_MAX); + edit->setDisplayHandler([=](int32_t value) { + return formatNumberAsString(CFN_PARAM(cfn), PREC1, 0, nullptr, "s"); + }); + } + break; + #endif + + case FUNC_LOGS: { + if (CFN_PARAM(cfn) == 0) // use stored value if SF exists + CFN_PARAM(cfn) = SD_LOGS_PERIOD_DEFAULT; // otherwise initialize with + // default value + + auto edit = addNumberEdit(line, STR_INTERVAL, cfn, SD_LOGS_PERIOD_MIN, + SD_LOGS_PERIOD_MAX); + edit->setDefault( + SD_LOGS_PERIOD_DEFAULT); // set default period for DEF button edit->setDisplayHandler([=](int32_t value) { return formatNumberAsString(CFN_PARAM(cfn), PREC1, 0, nullptr, "s"); }); + break; } - break; -#endif - - case FUNC_LOGS: { - if (CFN_PARAM(cfn) == 0) // use stored value if SF exists - CFN_PARAM(cfn) = SD_LOGS_PERIOD_DEFAULT; // otherwise initialize with - // default value - - auto edit = addNumberEdit(line, STR_INTERVAL, cfn, SD_LOGS_PERIOD_MIN, - SD_LOGS_PERIOD_MAX); - edit->setDefault( - SD_LOGS_PERIOD_DEFAULT); // set default period for DEF button - edit->setDisplayHandler([=](int32_t value) { - return formatNumberAsString(CFN_PARAM(cfn), PREC1, 0, nullptr, "s"); - }); - break; - } - case FUNC_SET_SCREEN: - CFN_PARAM(cfn) = (int16_t)max(CFN_PARAM(cfn), (int16_t)1); - CFN_PARAM(cfn) = (int16_t)min( - CFN_PARAM(cfn), (int16_t)ViewMain::instance()->getMainViewsCount()); - addNumberEdit(line, STR_VALUE, cfn, 1, - ViewMain::instance()->getMainViewsCount()); - break; + case FUNC_SET_SCREEN: + CFN_PARAM(cfn) = (int16_t)max(CFN_PARAM(cfn), (int16_t)1); + CFN_PARAM(cfn) = (int16_t)min( + CFN_PARAM(cfn), (int16_t)ViewMain::instance()->getMainViewsCount()); + addNumberEdit(line, STR_VALUE, cfn, 1, + ViewMain::instance()->getMainViewsCount()); + break; + + case FUNC_ADJUST_GVAR: { + if (validateSFGV(cfn)) SET_DIRTY(); + new StaticText(line, rect_t{}, STR_GLOBALVAR); + auto gvarchoice = new Choice(line, rect_t{}, 0, MAX_GVARS - 1, + GET_DEFAULT(CFN_GVAR_INDEX(cfn)), + [=](int32_t newValue){ + CFN_GVAR_INDEX(cfn) = newValue; + SET_DIRTY(); + updateSpecialFunctionOneWindow(); + }); + gvarchoice->setTextHandler([](int32_t value) { + return std::string(getSourceString(value + MIXSRC_FIRST_GVAR)); + }); + line = specialFunctionOneWindow->newLine(grid); - case FUNC_ADJUST_GVAR: { - if (validateSFGV(cfn)) SET_DIRTY(); - new StaticText(line, rect_t{}, STR_GLOBALVAR); - auto gvarchoice = new Choice(line, rect_t{}, 0, MAX_GVARS - 1, - GET_DEFAULT(CFN_GVAR_INDEX(cfn)), - [=](int32_t newValue){ - CFN_GVAR_INDEX(cfn) = newValue; - SET_DIRTY(); - updateSpecialFunctionOneWindow(); - }); - gvarchoice->setTextHandler([](int32_t value) { - return std::string(getSourceString(value + MIXSRC_FIRST_GVAR)); - }); - line = specialFunctionOneWindow->newLine(grid); + new StaticText(line, rect_t{}, STR_MODE); + auto modechoice = new Choice(line, rect_t{}, FUNC_ADJUST_GVAR_CONSTANT, + FUNC_ADJUST_GVAR_INCDEC, + GET_DEFAULT(CFN_GVAR_MODE(cfn)), + [=](int32_t newValue) { + CFN_GVAR_MODE(cfn) = newValue; + CFN_PARAM(cfn) = 0; + SET_DIRTY(); + updateSpecialFunctionOneWindow(); + }); + line = specialFunctionOneWindow->newLine(grid); - new StaticText(line, rect_t{}, STR_MODE); - auto modechoice = new Choice(line, rect_t{}, FUNC_ADJUST_GVAR_CONSTANT, - FUNC_ADJUST_GVAR_INCDEC, - GET_DEFAULT(CFN_GVAR_MODE(cfn)), - [=](int32_t newValue) { - CFN_GVAR_MODE(cfn) = newValue; - CFN_PARAM(cfn) = 0; - SET_DIRTY(); - updateSpecialFunctionOneWindow(); - }); - line = specialFunctionOneWindow->newLine(grid); + modechoice->setTextHandler([](int32_t value) { + switch (value) { + case FUNC_ADJUST_GVAR_CONSTANT: + return std::string(STR_CONSTANT); + case FUNC_ADJUST_GVAR_SOURCE: + return std::string(STR_MIXSOURCE); + case FUNC_ADJUST_GVAR_SOURCERAW: + return std::string(STR_MIXSOURCERAW); + case FUNC_ADJUST_GVAR_GVAR: + return std::string(STR_GLOBALVAR); + case FUNC_ADJUST_GVAR_INCDEC: + return std::string(STR_INCDEC); + } + return std::string("---"); + }); - modechoice->setTextHandler([](int32_t value) { - switch (value) { - case FUNC_ADJUST_GVAR_CONSTANT: - return std::string(STR_CONSTANT); + switch (CFN_GVAR_MODE(cfn)) { + case FUNC_ADJUST_GVAR_CONSTANT: { + int16_t val_min, val_max; + getMixSrcRange(CFN_GVAR_INDEX(cfn) + MIXSRC_FIRST_GVAR, val_min, + val_max); + addNumberEdit(line, STR_CONSTANT, cfn, val_min, val_max); + break; + } case FUNC_ADJUST_GVAR_SOURCE: - return std::string(STR_MIXSOURCE); case FUNC_ADJUST_GVAR_SOURCERAW: - return std::string(STR_MIXSOURCERAW); - case FUNC_ADJUST_GVAR_GVAR: - return std::string(STR_GLOBALVAR); - case FUNC_ADJUST_GVAR_INCDEC: - return std::string(STR_INCDEC); + addSourceChoice(line, STR_MIXSOURCE, cfn, MIXSRC_LAST_CH); + break; + case FUNC_ADJUST_GVAR_GVAR: { + new StaticText(line, rect_t{}, STR_GLOBALVAR); + auto gvarchoice = new Choice(line, rect_t{}, 0, MAX_GVARS - 1, + GET_SET_DEFAULT(CFN_PARAM(cfn))); + gvarchoice->setTextHandler([](int32_t value) { + return std::string(getSourceString(value + MIXSRC_FIRST_GVAR)); + }); + gvarchoice->setAvailableHandler( + [=](int value) { return CFN_GVAR_INDEX(cfn) != value; }); + break; + } + case FUNC_ADJUST_GVAR_INCDEC: { + int16_t val_min, val_max; + getMixSrcRange(CFN_GVAR_INDEX(cfn) + MIXSRC_FIRST_GVAR, val_min, + val_max); + getGVarIncDecRange(val_min, val_max); + auto numedit = addNumberEdit(line, STR_INCDEC, cfn, val_min, val_max); + numedit->setDisplayHandler([](int value) { + return formatNumberAsString(abs(value), 0, 0, + value >= 0 ? "+=" : "-=", nullptr); + }); + break; + } } - return std::string("---"); - }); + } + } - switch (CFN_GVAR_MODE(cfn)) { - case FUNC_ADJUST_GVAR_CONSTANT: { - int16_t val_min, val_max; - getMixSrcRange(CFN_GVAR_INDEX(cfn) + MIXSRC_FIRST_GVAR, val_min, - val_max); - addNumberEdit(line, STR_CONSTANT, cfn, val_min, val_max); - break; - } - case FUNC_ADJUST_GVAR_SOURCE: - case FUNC_ADJUST_GVAR_SOURCERAW: - addSourceChoice(line, STR_MIXSOURCE, cfn, MIXSRC_LAST_CH); - break; - case FUNC_ADJUST_GVAR_GVAR: { - new StaticText(line, rect_t{}, STR_GLOBALVAR); - auto gvarchoice = new Choice(line, rect_t{}, 0, MAX_GVARS - 1, - GET_SET_DEFAULT(CFN_PARAM(cfn))); - gvarchoice->setTextHandler([](int32_t value) { - return std::string(getSourceString(value + MIXSRC_FIRST_GVAR)); - }); - gvarchoice->setAvailableHandler( - [=](int value) { return CFN_GVAR_INDEX(cfn) != value; }); - break; - } - case FUNC_ADJUST_GVAR_INCDEC: { - int16_t val_min, val_max; - getMixSrcRange(CFN_GVAR_INDEX(cfn) + MIXSRC_FIRST_GVAR, val_min, - val_max); - getGVarIncDecRange(val_min, val_max); - auto numedit = addNumberEdit(line, STR_INCDEC, cfn, val_min, val_max); - numedit->setDisplayHandler([](int value) { - return formatNumberAsString(abs(value), 0, 0, - value >= 0 ? "+=" : "-=", nullptr); - }); - break; - } + if (HAS_REPEAT_PARAM(func)) { // !1x 1x 1s 2s 3s ... + line = specialFunctionOneWindow->newLine(grid); + new StaticText(line, rect_t{}, STR_REPEAT); + if (func == FUNC_PLAY_SCRIPT || func == FUNC_RGB_LED) { + auto repeat = new Choice(line, rect_t{}, 0, 1, + GET_DEFAULT((int8_t)CFN_PLAY_REPEAT(cfn)), + SET_DEFAULT(CFN_PLAY_REPEAT(cfn))); + repeat->setTextHandler([](int32_t value) { + // 0 == repeat at 50ms interval for backward compatibility + return (value == 0) ? std::string("On") : std::string("1x"); + }); + } else { + auto repeat = new NumberEdit(line, rect_t{}, -1, 60 / CFN_PLAY_REPEAT_MUL, + GET_DEFAULT((int8_t)CFN_PLAY_REPEAT(cfn)), + SET_DEFAULT(CFN_PLAY_REPEAT(cfn))); + repeat->setDisplayHandler([](int32_t value) { + if (value == 0) + return std::string("1x"); + else if (value == (int8_t)CFN_PLAY_REPEAT_NOSTART) + return std::string("!1x"); + else { + return formatNumberAsString(value * CFN_PLAY_REPEAT_MUL, 0, 0, + nullptr, "s"); + } + }); } } - } - if (HAS_REPEAT_PARAM(func)) { // !1x 1x 1s 2s 3s ... line = specialFunctionOneWindow->newLine(grid); - new StaticText(line, rect_t{}, STR_REPEAT); - if (func == FUNC_PLAY_SCRIPT || func == FUNC_RGB_LED) { - auto repeat = new Choice(line, rect_t{}, 0, 1, - GET_DEFAULT((int8_t)CFN_PLAY_REPEAT(cfn)), - SET_DEFAULT(CFN_PLAY_REPEAT(cfn))); - repeat->setTextHandler([](int32_t value) { - // 0 == repeat at 50ms interval for backward compatibility - return (value == 0) ? std::string("On") : std::string("1x"); - }); - } else { - auto repeat = new NumberEdit(line, rect_t{}, -1, 60 / CFN_PLAY_REPEAT_MUL, - GET_DEFAULT((int8_t)CFN_PLAY_REPEAT(cfn)), - SET_DEFAULT(CFN_PLAY_REPEAT(cfn))); - repeat->setDisplayHandler([](int32_t value) { - if (value == 0) - return std::string("1x"); - else if (value == (int8_t)CFN_PLAY_REPEAT_NOSTART) - return std::string("!1x"); - else { - return formatNumberAsString(value * CFN_PLAY_REPEAT_MUL, 0, 0, - nullptr, "s"); - } - }); - } + new StaticText(line, rect_t{}, STR_ENABLE); + new ToggleSwitch(line, rect_t{}, GET_DEFAULT(CFN_ACTIVE(cfn)), + [=](int newValue) { + CFN_ACTIVE(cfn) = newValue; + SET_DIRTY(); + if (CFN_FUNC(cfn) == FUNC_PLAY_SCRIPT || CFN_FUNC(cfn) == FUNC_RGB_LED) + LUA_LOAD_MODEL_SCRIPTS(); + }); } - line = specialFunctionOneWindow->newLine(grid); - new StaticText(line, rect_t{}, STR_ENABLE); - new ToggleSwitch(line, rect_t{}, GET_DEFAULT(CFN_ACTIVE(cfn)), - [=](int newValue) { - CFN_ACTIVE(cfn) = newValue; - SET_DIRTY(); - if (CFN_FUNC(cfn) == FUNC_PLAY_SCRIPT || CFN_FUNC(cfn) == FUNC_RGB_LED) - LUA_LOAD_MODEL_SCRIPTS(); - }); -} + void buildHeader(Window *window, const char *title, const char *prefix) + { + header->setTitle(title); + headerSF = header->setTitle2(prefix + std::to_string(index + 1)); -void FunctionEditPage::buildBody(Window *form) -{ - form->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_LARGE); + etx_txt_color(headerSF->getLvObj(), COLOR_THEME_ACTIVE_INDEX, + ETX_STATE_SF_ACTIVE); + etx_font(headerSF->getLvObj(), FONT_BOLD_INDEX, ETX_STATE_SF_ACTIVE); + } - FlexGridLayout grid(col_dsc, row_dsc, PAD_TINY); + void buildBody(Window *form) + { + form->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_LARGE); - CustomFunctionData *cfn = customFunctionData(); + FlexGridLayout grid(col_dsc, row_dsc, PAD_TINY); - // Switch - auto line = form->newLine(grid); - new StaticText(line, rect_t{}, STR_SF_SWITCH); - auto switchChoice = new SwitchChoice(line, rect_t{}, SWSRC_FIRST, SWSRC_LAST, - GET_SET_DEFAULT(CFN_SWITCH(cfn))); - switchChoice->setAvailableHandler( - [=](int value) { return isSwitchAvailable(value); }); + CustomFunctionData *cfn = customFunctionData(); - // Patch function in case not available - if (!isAssignableFunctionAvailable(CFN_FUNC(cfn))) { - auto func = 0; - while (!isAssignableFunctionAvailable(func) && (func < FUNC_MAX - 1)) { - func++; - } - if (func < FUNC_MAX - 1) { - CFN_FUNC(cfn) = func; + // Switch + auto line = form->newLine(grid); + new StaticText(line, rect_t{}, STR_SF_SWITCH); + auto switchChoice = new SwitchChoice(line, rect_t{}, SWSRC_FIRST, SWSRC_LAST, + GET_SET_DEFAULT(CFN_SWITCH(cfn))); + switchChoice->setAvailableHandler( + [=](int value) { return isSwitchAvailable(value); }); + + // Patch function in case not available + if (!isAssignableFunctionAvailable(CFN_FUNC(cfn))) { + auto func = 0; + while (!isAssignableFunctionAvailable(func) && (func < FUNC_MAX - 1)) { + func++; + } + if (func < FUNC_MAX - 1) { + CFN_FUNC(cfn) = func; + } } - } - // Function - line = form->newLine(grid); - new StaticText(line, rect_t{}, STR_FUNC); - auto functionChoice = - new Choice(line, rect_t{}, 0, FUNC_MAX - 1, GET_DEFAULT(getFuncSortIdx(CFN_FUNC(cfn))), - [=](int32_t newValue) { - Functions newFunc = cfn_sorted[newValue]; - // If changing from Lua script then reload to remove old reference - if ((CFN_FUNC(cfn) == FUNC_PLAY_SCRIPT || CFN_FUNC(cfn) == FUNC_RGB_LED) && newFunc != FUNC_PLAY_SCRIPT && newFunc != FUNC_RGB_LED) - LUA_LOAD_MODEL_SCRIPTS(); - CFN_FUNC(cfn) = newFunc; - CFN_RESET(cfn); - SET_DIRTY(); - updateSpecialFunctionOneWindow(); - }); - functionChoice->setTextHandler([=](int val) { return funcGetLabel(cfn_sorted[val]); }); - functionChoice->setAvailableHandler( - [=](int value) { return isAssignableFunctionAvailable(cfn_sorted[value]); }); - - specialFunctionOneWindow = new Window(form, rect_t{}); - updateSpecialFunctionOneWindow(); -} + // Function + line = form->newLine(grid); + new StaticText(line, rect_t{}, STR_FUNC); + auto functionChoice = + new Choice(line, rect_t{}, 0, FUNC_MAX - 1, GET_DEFAULT(getFuncSortIdx(CFN_FUNC(cfn))), + [=](int32_t newValue) { + Functions newFunc = cfn_sorted[newValue]; + // If changing from Lua script then reload to remove old reference + if ((CFN_FUNC(cfn) == FUNC_PLAY_SCRIPT || CFN_FUNC(cfn) == FUNC_RGB_LED) && newFunc != FUNC_PLAY_SCRIPT && newFunc != FUNC_RGB_LED) + LUA_LOAD_MODEL_SCRIPTS(); + CFN_FUNC(cfn) = newFunc; + CFN_RESET(cfn); + SET_DIRTY(); + updateSpecialFunctionOneWindow(); + }); + functionChoice->setTextHandler([=](int val) { return funcGetLabel(cfn_sorted[val]); }); + functionChoice->setAvailableHandler( + [=](int value) { return isAssignableFunctionAvailable(cfn_sorted[value]); }); + + specialFunctionOneWindow = new Window(form, rect_t{}); + updateSpecialFunctionOneWindow(); + } +}; //----------------------------------------------------------------------------- diff --git a/radio/src/gui/colorlcd/model/special_functions.h b/radio/src/gui/colorlcd/model/special_functions.h index d2adf5ad15e..fec408ce347 100644 --- a/radio/src/gui/colorlcd/model/special_functions.h +++ b/radio/src/gui/colorlcd/model/special_functions.h @@ -28,7 +28,6 @@ struct CustomFunctionData; class FunctionEditPage; -class FunctionLineButton; class NumberEdit; //----------------------------------------------------------------------------- @@ -79,43 +78,6 @@ class FunctionLineButton : public ListLineButton //----------------------------------------------------------------------------- -class FunctionEditPage : public Page -{ - public: - FunctionEditPage(uint8_t index, EdgeTxIcon icon, const char *title, - const char *prefix); - - void delayedInit() override; - - protected: - uint8_t index; - Window *specialFunctionOneWindow = nullptr; - StaticText *headerSF = nullptr; - bool active = false; - - virtual bool isActive() const = 0; - virtual bool isSwitchAvailable(int value) const = 0; - virtual CustomFunctionData *customFunctionData() const = 0; - virtual bool isAssignableFunctionAvailable(int function) const = 0; - virtual void setDirty() const = 0; - - void checkEvents() override; - - void buildHeader(Window *window, const char *title, const char *prefix); - - void addSourceChoice(FormLine *line, const char *title, - CustomFunctionData *cfn, int16_t vmax); - - NumberEdit *addNumberEdit(FormLine *line, const char *title, - CustomFunctionData *cfn, int16_t vmin, int16_t vmax); - - void updateSpecialFunctionOneWindow(); - - void buildBody(Window *form); -}; - -//----------------------------------------------------------------------------- - class FunctionsPage : public PageGroupItem { public: diff --git a/radio/src/gui/common/stdlcd/popups_common.cpp b/radio/src/gui/common/stdlcd/popups_common.cpp index 1728b2dbc12..050fa1f5000 100644 --- a/radio/src/gui/common/stdlcd/popups_common.cpp +++ b/radio/src/gui/common/stdlcd/popups_common.cpp @@ -250,10 +250,12 @@ void CLEAR_POPUP() popupMenuItemsCount = 0; } -void POPUP_WAIT(const char * s) +void POPUP_WAIT(const char * s, const char * info) { warningText = s; - warningInfoText = nullptr; + warningInfoText = info; + warningInfoLength = info ? strlen(info) : 0; + warningInfoFlags = 0; warningType = WARNING_TYPE_WAIT; popupFunc = runPopupWarning; } diff --git a/radio/src/gui/common/stdlcd/popups_common.h b/radio/src/gui/common/stdlcd/popups_common.h index c09b9b48a57..42dae2a7f5d 100644 --- a/radio/src/gui/common/stdlcd/popups_common.h +++ b/radio/src/gui/common/stdlcd/popups_common.h @@ -82,7 +82,7 @@ typedef void (* ProgressHandler)(const char *, const char *, int, int); #if !defined(GUI) #define DISPLAY_WARNING(...) - inline void POPUP_WAIT(const char * s) { } + inline void POPUP_WAIT(const char * s, const char * = nullptr) { } inline void POPUP_WARNING(const char *, const char * = nullptr) { } inline void POPUP_CONFIRMATION(const char * s, PopupMenuHandler handler) { } inline void POPUP_INPUT(const char * s, PopupFunc func) { } @@ -90,7 +90,7 @@ typedef void (* ProgressHandler)(const char *, const char *, int, int); #else #define DISPLAY_WARNING(evt) (*popupFunc)(evt) extern void CLEAR_POPUP(); - extern void POPUP_WAIT(const char * s); + extern void POPUP_WAIT(const char * s, const char * = nullptr); extern void POPUP_INFORMATION(const char * s); extern void POPUP_WARNING(const char * message, const char * info = nullptr); extern void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags); diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 5f716d537f2..3f66088aaaf 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -662,6 +662,10 @@ bool isAssignableFunctionAvailable(int function, bool modelFunctions) case FUNC_PUSH_CUST_SWITCH: return modelFunctions; #endif +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + case FUNC_DISABLE_KEYS: + return g_eeGeneral.keyLockEnabled; +#endif default: return true; diff --git a/radio/src/keys.cpp b/radio/src/keys.cpp index 6fd15aa1adc..c3128d34a0b 100644 --- a/radio/src/keys.cpp +++ b/radio/src/keys.cpp @@ -183,7 +183,7 @@ void Key::killEvents() static Key keys[MAX_KEYS]; static Key trim_keys[MAX_TRIMS * 2]; -#if !defined(BOOT) +#if !defined(BOOT) && defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) // Per-target key combo (from hal.h KEYS_LOCK_KEY1/KEY2) long-pressed together // toggles a software key lock. static bool s_keys_locked = false; @@ -198,9 +198,18 @@ bool consumeKeysLockToggleEvent() s_keys_lock_notify = false; return true; } + +void setKeyLockedState(bool state) +{ + if (g_eeGeneral.keyLockEnabled && s_keys_locked != state) { + s_keys_locked = state; + s_keys_lock_notify = true; + } +} #else bool areKeysLocked() { return false; } bool consumeKeysLockToggleEvent() { return false; } +void setKeyLockedState(bool state) {} #endif /** @@ -544,7 +553,7 @@ bool keysPollingCycle() event_t evt = keys[i].input(keys_input & (1 << i)); if (evt) { evt = keyMapping(evt | i); -#if !defined(BOOT) +#if !defined(BOOT) && defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) if (evt) { if (!s_keys_locked) { pushEvent(evt); diff --git a/radio/src/keys.h b/radio/src/keys.h index 16d2487015a..0b63ac64ffa 100644 --- a/radio/src/keys.h +++ b/radio/src/keys.h @@ -194,6 +194,7 @@ bool rotaryEncoderPollingCycle(); // suppressed; trims/sticks/switches still work. bool areKeysLocked(); bool consumeKeysLockToggleEvent(); +void setKeyLockedState(bool); #if defined(USE_HATS_AS_KEYS) void setHatsAsKeys(bool val); diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index faf23a44d07..0e54c7b3011 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -3296,6 +3296,9 @@ LROT_BEGIN(etxcst, NULL, 0) LROT_NUMENTRY( FUNC_PUSH_CUST_SWITCH, FUNC_PUSH_CUST_SWITCH ) #endif LROT_NUMENTRY( FUNC_SET_SCREEN, FUNC_SET_SCREEN ) +#if defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2) + LROT_NUMENTRY( FUNC_DISABLE_KEYS, FUNC_DISABLE_KEYS ) +#endif #if defined(COLORLCD) LROT_NUMENTRY( FUNC_DISABLE_TOUCH, FUNC_DISABLE_TOUCH ) diff --git a/radio/src/main.cpp b/radio/src/main.cpp index ae0b95eb37c..cf7d420f421 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -286,6 +286,7 @@ void checkHatsAsKeys() // Tick count at which to clear our key-lock message. 0 = no message active. static tmr10ms_t s_keysLockMsgUntil = 0; static const char* s_keysLockMsg = nullptr; +static const char* s_keysLockInfo = nullptr; #endif void checkKeysLock() @@ -308,7 +309,8 @@ void checkKeysLock() // couldn't dismiss it. Keep our own deadline and re-arm POPUP_WAIT every // tick below — that survives other code clearing warningText (e.g. the // GVAR display in view_main.cpp). - s_keysLockMsg = areKeysLocked() ? lockedMsg : STR_KEYS_UNLOCKED; + s_keysLockMsg = areKeysLocked() ? STR_KEYS_LOCKED : STR_KEYS_UNLOCKED; + s_keysLockInfo = areKeysLocked() ? lockedMsg : nullptr; s_keysLockMsgUntil = get_tmr10ms() + 150; #endif } @@ -321,10 +323,11 @@ void checkKeysLock() // may have replaced it in the meantime. if (warningText == s_keysLockMsg) CLEAR_POPUP(); s_keysLockMsg = nullptr; + s_keysLockInfo = nullptr; } else { // Keep the popup fresh every tick — another path (GVAR, etc.) may // have cleared warningText; just re-arm it. - POPUP_WAIT(s_keysLockMsg); + POPUP_WAIT(s_keysLockMsg, s_keysLockInfo); } } #endif diff --git a/radio/src/storage/yaml/CMakeLists.txt b/radio/src/storage/yaml/CMakeLists.txt index 8dc63e4a6bd..0b819dbbc57 100644 --- a/radio/src/storage/yaml/CMakeLists.txt +++ b/radio/src/storage/yaml/CMakeLists.txt @@ -104,4 +104,4 @@ add_custom_target(yaml_data ${RADIO_DIRECTORY}/util/generate_yaml.py ) -add_dependencies(yaml_data hal_settings) +add_dependencies(yaml_data hal_settings hal_keys_lock) diff --git a/radio/src/storage/yaml/yaml_datastructs_128x64.cpp b/radio/src/storage/yaml/yaml_datastructs_128x64.cpp index bcaa9b16239..337d6646e62 100644 --- a/radio/src/storage/yaml/yaml_datastructs_128x64.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_128x64.cpp @@ -85,6 +85,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_c14.cpp b/radio/src/storage/yaml/yaml_datastructs_c14.cpp index f4238e12738..2e532203acd 100644 --- a/radio/src/storage/yaml/yaml_datastructs_c14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_c14.cpp @@ -86,6 +86,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_f16.cpp b/radio/src/storage/yaml/yaml_datastructs_f16.cpp index 5292bd2f4aa..fd361a8d794 100644 --- a/radio/src/storage/yaml/yaml_datastructs_f16.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_f16.cpp @@ -87,6 +87,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, { FUNC_LCD_TO_VIDEO, "LCD_TO_VIDEO" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_gx12.cpp b/radio/src/storage/yaml/yaml_datastructs_gx12.cpp index 90753d91179..7d6f21239c1 100644 --- a/radio/src/storage/yaml/yaml_datastructs_gx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_gx12.cpp @@ -86,6 +86,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, { FUNC_PUSH_CUST_SWITCH, "PUSH_CUST_SWITCH" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_nb4p.cpp b/radio/src/storage/yaml/yaml_datastructs_nb4p.cpp index 828067c59a0..8d85daaaa8a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nb4p.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nb4p.cpp @@ -86,6 +86,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 504da097c95..d1c7029e059 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -93,6 +93,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_pa01.cpp b/radio/src/storage/yaml/yaml_datastructs_pa01.cpp index 6e688662c31..bffe2e437a8 100644 --- a/radio/src/storage/yaml/yaml_datastructs_pa01.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_pa01.cpp @@ -87,6 +87,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, { FUNC_PUSH_CUST_SWITCH, "PUSH_CUST_SWITCH" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_pl18.cpp b/radio/src/storage/yaml/yaml_datastructs_pl18.cpp index 47755c93eda..5718310a57d 100644 --- a/radio/src/storage/yaml/yaml_datastructs_pl18.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_pl18.cpp @@ -93,6 +93,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_pl18u.cpp b/radio/src/storage/yaml/yaml_datastructs_pl18u.cpp index aff93211bca..79d8ead9699 100644 --- a/radio/src/storage/yaml/yaml_datastructs_pl18u.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_pl18u.cpp @@ -86,6 +86,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_st16.cpp b/radio/src/storage/yaml/yaml_datastructs_st16.cpp index d54976a4c79..c61f55f512a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_st16.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_st16.cpp @@ -87,6 +87,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, { FUNC_PUSH_CUST_SWITCH, "PUSH_CUST_SWITCH" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_t15.cpp b/radio/src/storage/yaml/yaml_datastructs_t15.cpp index 72b8d46d959..69b4a3dd0b4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t15.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t15.cpp @@ -87,6 +87,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, { FUNC_PUSH_CUST_SWITCH, "PUSH_CUST_SWITCH" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_t15pro.cpp b/radio/src/storage/yaml/yaml_datastructs_t15pro.cpp index d54976a4c79..c61f55f512a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t15pro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t15pro.cpp @@ -87,6 +87,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, { FUNC_PUSH_CUST_SWITCH, "PUSH_CUST_SWITCH" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_t20.cpp b/radio/src/storage/yaml/yaml_datastructs_t20.cpp index f1441e3c762..5afaac79271 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t20.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t20.cpp @@ -86,6 +86,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, { FUNC_PUSH_CUST_SWITCH, "PUSH_CUST_SWITCH" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_t22.cpp b/radio/src/storage/yaml/yaml_datastructs_t22.cpp index 72f20e7b452..a824c2ebc39 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t22.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t22.cpp @@ -87,6 +87,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, { FUNC_PUSH_CUST_SWITCH, "PUSH_CUST_SWITCH" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index eca692f00c0..bf94f0dd7ce 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -86,6 +86,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, { FUNC_PUSH_CUST_SWITCH, "PUSH_CUST_SWITCH" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tx15.cpp b/radio/src/storage/yaml/yaml_datastructs_tx15.cpp index d54976a4c79..c61f55f512a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx15.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx15.cpp @@ -87,6 +87,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, { FUNC_PUSH_CUST_SWITCH, "PUSH_CUST_SWITCH" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tx16smk3.cpp b/radio/src/storage/yaml/yaml_datastructs_tx16smk3.cpp index f7c22690247..4921fbc62ad 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx16smk3.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx16smk3.cpp @@ -87,6 +87,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, { FUNC_PUSH_CUST_SWITCH, "PUSH_CUST_SWITCH" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 0c942f03f2a..814161d5192 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -86,6 +86,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 54992e240d2..2d7d4bcf39a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -85,6 +85,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9dp2019.cpp b/radio/src/storage/yaml/yaml_datastructs_x9dp2019.cpp index 54992e240d2..2d7d4bcf39a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9dp2019.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9dp2019.cpp @@ -85,6 +85,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 20ec6ec9d0e..6e28e8c899c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -85,6 +85,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index bcaa9b16239..337d6646e62 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -85,6 +85,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index f30b72c5076..c1173685f80 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -85,6 +85,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_DISABLE_KEYS, "DISABLE_KEYS" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/translations/i18n/cn.h b/radio/src/translations/i18n/cn.h index 483fa0ce4a3..7a1ff580cff 100644 --- a/radio/src/translations/i18n/cn.h +++ b/radio/src/translations/i18n/cn.h @@ -240,6 +240,7 @@ #define TR_SF_SCREENSHOT "截屏" #define TR_SF_RACING_MODE "竞速模式" #define TR_SF_DISABLE_TOUCH "禁用触摸" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "关闭音频功放" #define TR_SF_SET_SCREEN TR_BW_COL("设置主屏", "选择主屏") #define TR_SF_PUSH_CUST_SWITCH "Push CS" @@ -572,7 +573,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "开机图片" #define TR_PLAY_HELLO "开机语音" diff --git a/radio/src/translations/i18n/cz.h b/radio/src/translations/i18n/cz.h index 3a25c3fc068..d404022b8a7 100644 --- a/radio/src/translations/i18n/cz.h +++ b/radio/src/translations/i18n/cz.h @@ -242,6 +242,7 @@ #define TR_SF_SCREENSHOT "Snímek LCD" #define TR_SF_RACING_MODE "Závodní režim" #define TR_SF_DISABLE_TOUCH "Deaktivace dotyku" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "Vypnutí zesilovače zvuku" #define TR_SF_SET_SCREEN TR_BW_COL("Nast obrazovku", "Vybrat hlavní obrazovku") #define TR_SF_PUSH_CUST_SWITCH "Push CS" @@ -575,7 +576,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN TR("úvodní logo", "Zobrazit úvodní logo") #define TR_PLAY_HELLO "Zvuk při spuštění" diff --git a/radio/src/translations/i18n/da.h b/radio/src/translations/i18n/da.h index 0c54b1408bd..ab2dc8f6293 100644 --- a/radio/src/translations/i18n/da.h +++ b/radio/src/translations/i18n/da.h @@ -242,6 +242,7 @@ #define TR_SF_SCREENSHOT "Skærm klip" #define TR_SF_RACING_MODE "Ræs tilstand" #define TR_SF_DISABLE_TOUCH "Ikke berøringsaktiv" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP TR("Sluk audio amp", "Sluk audio amplifier") #define TR_SF_SET_SCREEN TR_BW_COL("Vis skærm", "Vælg hoved skærm") #define TR_SF_PUSH_CUST_SWITCH TR("Tryk BK", "Tryk bruger kontakt") @@ -577,7 +578,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "Start skærm" #define TR_PLAY_HELLO "Startop lyd" diff --git a/radio/src/translations/i18n/de.h b/radio/src/translations/i18n/de.h index bca8b70f9a7..868861061fb 100644 --- a/radio/src/translations/i18n/de.h +++ b/radio/src/translations/i18n/de.h @@ -243,6 +243,7 @@ #define TR_SF_SCREENSHOT "Screenshot" #define TR_SF_RACING_MODE "RacingMode" #define TR_SF_DISABLE_TOUCH "Kein Touch" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "Audio Verst. Aus" #define TR_SF_SET_SCREEN TR_BW_COL("Seite anz.", "Hauptseite anzeigen") #define TR_SF_PUSH_CUST_SWITCH "LS setzen" @@ -573,7 +574,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN TR("Startbild Ein", "Startbild Anzeigedauer") #define TR_PLAY_HELLO "Startton abspielen" diff --git a/radio/src/translations/i18n/en.h b/radio/src/translations/i18n/en.h index f7b47e1f439..cb632635129 100644 --- a/radio/src/translations/i18n/en.h +++ b/radio/src/translations/i18n/en.h @@ -241,6 +241,7 @@ #define TR_SF_SCREENSHOT "Screenshot" #define TR_SF_RACING_MODE "RacingMode" #define TR_SF_DISABLE_TOUCH "No Touch" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "Audio Amp Off" #define TR_SF_SET_SCREEN TR_BW_COL("Set Screen", "Set Main Screen") #define TR_SF_PUSH_CUST_SWITCH "Push CS" @@ -573,7 +574,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "Splash screen" #define TR_PLAY_HELLO "Startup Sound" diff --git a/radio/src/translations/i18n/es.h b/radio/src/translations/i18n/es.h index 97354276c6b..3028720ad3a 100644 --- a/radio/src/translations/i18n/es.h +++ b/radio/src/translations/i18n/es.h @@ -240,6 +240,7 @@ #define TR_SF_SCREENSHOT "Captura" #define TR_SF_RACING_MODE "RacingMode" #define TR_SF_DISABLE_TOUCH "No Touch" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "Audio Amp Off" #define TR_SF_SET_SCREEN TR_BW_COL("Ajus. pantalla", "Set Main Screen") #define TR_SF_PUSH_CUST_SWITCH "Push CS" @@ -571,7 +572,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "Pantalla inicio" #define TR_PLAY_HELLO "Startup Sound" diff --git a/radio/src/translations/i18n/fi.h b/radio/src/translations/i18n/fi.h index 0ac929af423..d8a2ee5ddfc 100644 --- a/radio/src/translations/i18n/fi.h +++ b/radio/src/translations/i18n/fi.h @@ -241,6 +241,7 @@ #define TR_SF_SCREENSHOT "Screenshot" #define TR_SF_RACING_MODE "RacingMode" #define TR_SF_DISABLE_TOUCH "No Touch" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "Audio Amp Off" #define TR_SF_SET_SCREEN TR_BW_COL("Set Screen", "Set Main Screen") #define TR_SF_PUSH_CUST_SWITCH "Push CS" @@ -572,7 +573,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "Splash screen" #define TR_PLAY_HELLO "Startup Sound" diff --git a/radio/src/translations/i18n/fr.h b/radio/src/translations/i18n/fr.h index 8438e5c047b..4d75085407a 100644 --- a/radio/src/translations/i18n/fr.h +++ b/radio/src/translations/i18n/fr.h @@ -244,6 +244,7 @@ #define TR_SF_SCREENSHOT "Photo Écran" #define TR_SF_RACING_MODE "Racing Mode" #define TR_SF_DISABLE_TOUCH "Non Tactile" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "Désact. Ampli Audio" #define TR_SF_SET_SCREEN TR_BW_COL("Aff. écran", "Définir Écran Princ.") #define TR_SF_PUSH_CUST_SWITCH "Push CS" @@ -576,7 +577,7 @@ #define TR_ONE_LOG_PER_DAY "Un log par jour" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "Écran d'accueil" #define TR_PLAY_HELLO "Son de démarrage" diff --git a/radio/src/translations/i18n/he.h b/radio/src/translations/i18n/he.h index 1aa90014f3e..f3886c70a8c 100644 --- a/radio/src/translations/i18n/he.h +++ b/radio/src/translations/i18n/he.h @@ -244,6 +244,7 @@ #define TR_SF_SCREENSHOT "צילום מסך" #define TR_SF_RACING_MODE "מצב תחרות" #define TR_SF_DISABLE_TOUCH "ללא מסך מגע" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "Audio Amp Off" #define TR_SF_SET_SCREEN TR_BW_COL("Set Screen", "הגדרת מסך ראשי") #define TR_SF_PUSH_CUST_SWITCH "Push CS" @@ -576,7 +577,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "מסך פתיחה" #define TR_PLAY_HELLO "צליל אתחול" diff --git a/radio/src/translations/i18n/it.h b/radio/src/translations/i18n/it.h index ff20e47bef2..89bbeb46453 100644 --- a/radio/src/translations/i18n/it.h +++ b/radio/src/translations/i18n/it.h @@ -241,6 +241,7 @@ #define TR_SF_SCREENSHOT "Screenshot" #define TR_SF_RACING_MODE "Modo Racing" #define TR_SF_DISABLE_TOUCH "Disab. touch" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "Amp Audio Off" #define TR_SF_SET_SCREEN TR_BW_COL("Setta Schermo", "Setta Schermo Princ.") #define TR_SF_PUSH_CUST_SWITCH "Premi CS" @@ -573,7 +574,7 @@ #define TR_ONE_LOG_PER_DAY "Un log al giorno" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN TR("Sch. avvio", "Schermata d'avvio") #define TR_PLAY_HELLO "Suono all'accensione" diff --git a/radio/src/translations/i18n/jp.h b/radio/src/translations/i18n/jp.h index ebf7c5cd1b0..73eb8a9f6b1 100644 --- a/radio/src/translations/i18n/jp.h +++ b/radio/src/translations/i18n/jp.h @@ -241,6 +241,7 @@ #define TR_SF_SCREENSHOT "画面キャプチャ" #define TR_SF_RACING_MODE "レースモード" #define TR_SF_DISABLE_TOUCH "非タッチ" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "オーディオアンプ OFF" #define TR_SF_SET_SCREEN TR_BW_COL("画面設定", "メイン画面設定") #define TR_SF_PUSH_CUST_SWITCH "Push CS" @@ -572,7 +573,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "起動イメージ" #define TR_PLAY_HELLO "起動時サウンド" diff --git a/radio/src/translations/i18n/ko.h b/radio/src/translations/i18n/ko.h index 8165f851b4e..9eaf5e398b2 100644 --- a/radio/src/translations/i18n/ko.h +++ b/radio/src/translations/i18n/ko.h @@ -241,6 +241,7 @@ #define TR_SF_SCREENSHOT "스크린샷 저장" #define TR_SF_RACING_MODE "레이싱 모드" #define TR_SF_DISABLE_TOUCH "터치 비활성화" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "오디오 앰프 끄기" #define TR_SF_SET_SCREEN TR_BW_COL("텔레 화면 설정", "메인 화면 설정") #define TR_SF_PUSH_CUST_SWITCH "커스텀 스위치 실행" @@ -582,7 +583,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "시작화면" #define TR_PLAY_HELLO "시작 사운드" diff --git a/radio/src/translations/i18n/nl.h b/radio/src/translations/i18n/nl.h index c710d2b26df..3bc557dd451 100644 --- a/radio/src/translations/i18n/nl.h +++ b/radio/src/translations/i18n/nl.h @@ -241,6 +241,7 @@ #define TR_SF_SCREENSHOT "Schermafdr" #define TR_SF_RACING_MODE "RacingMode" #define TR_SF_DISABLE_TOUCH "No Touch" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "Audio Amp Off" #define TR_SF_SET_SCREEN TR_BW_COL("Set Screen", "Set Main Screen") #define TR_SF_PUSH_CUST_SWITCH "Push CS" @@ -574,7 +575,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "Startscherm Aan" #define TR_PLAY_HELLO "Startup Sound" diff --git a/radio/src/translations/i18n/pl.h b/radio/src/translations/i18n/pl.h index c0ac974c9ef..2dd26830795 100644 --- a/radio/src/translations/i18n/pl.h +++ b/radio/src/translations/i18n/pl.h @@ -240,6 +240,7 @@ #define TR_SF_SCREENSHOT "Zrzut Ekra" #define TR_SF_RACING_MODE "RacingMode" #define TR_SF_DISABLE_TOUCH "No Touch" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP TR("Wycisz wzm.", "Wycisz wzmacniacz audio") #define TR_SF_SET_SCREEN TR_BW_COL("Ustaw ekran", "Set Main Screen") #define TR_SF_PUSH_CUST_SWITCH "Push CS" @@ -572,7 +573,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "Logo ekranu" #define TR_PLAY_HELLO "Dźwięk uruchomienia" diff --git a/radio/src/translations/i18n/pt.h b/radio/src/translations/i18n/pt.h index 8681b69781b..6b51950ecad 100644 --- a/radio/src/translations/i18n/pt.h +++ b/radio/src/translations/i18n/pt.h @@ -242,6 +242,7 @@ #define TR_SF_SCREENSHOT "Capt. Tela" #define TR_SF_RACING_MODE "ModCorrida" #define TR_SF_DISABLE_TOUCH "No Touch" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "Amp Audio Desl" #define TR_SF_SET_SCREEN TR_BW_COL("Def Tela", "Def Tela Princ") #define TR_SF_PUSH_CUST_SWITCH "Push CS" @@ -573,7 +574,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "Tela abertura" #define TR_PLAY_HELLO "Som ao ligar" diff --git a/radio/src/translations/i18n/ru.h b/radio/src/translations/i18n/ru.h index 6199d12f9e9..5f21bc018c0 100644 --- a/radio/src/translations/i18n/ru.h +++ b/radio/src/translations/i18n/ru.h @@ -244,6 +244,7 @@ #define TR_SF_SCREENSHOT "Скриншот" #define TR_SF_RACING_MODE "Режим гонка" #define TR_SF_DISABLE_TOUCH "Сенсор вык" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "Вык аудио усил." #define TR_SF_SET_SCREEN TR_BW_COL("Устан экран", "Выбр глав экран") #define TR_SF_PUSH_CUST_SWITCH "Нажать CS" @@ -575,7 +576,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "Заставка" #define TR_PLAY_HELLO "Звук запуска" diff --git a/radio/src/translations/i18n/se.h b/radio/src/translations/i18n/se.h index 0fe1bb248be..01a267d1c67 100644 --- a/radio/src/translations/i18n/se.h +++ b/radio/src/translations/i18n/se.h @@ -244,6 +244,7 @@ #define TR_SF_SCREENSHOT "Skärmbild" #define TR_SF_RACING_MODE "Tävlingsläge" #define TR_SF_DISABLE_TOUCH "Ej pekskärm" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP TR("Audioförst. av","Audioförstärkare av") #define TR_SF_SET_SCREEN TR_BW_COL("Visa skärm", "Sätt huvudskärm") #define TR_SF_PUSH_CUST_SWITCH "Tryck CS" @@ -575,7 +576,7 @@ #define TR_ONE_LOG_PER_DAY "En logg per dag" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "Startbild" #define TR_PLAY_HELLO "Startljud" diff --git a/radio/src/translations/i18n/tw.h b/radio/src/translations/i18n/tw.h index ccb47c84036..ad4ef2fcf20 100644 --- a/radio/src/translations/i18n/tw.h +++ b/radio/src/translations/i18n/tw.h @@ -239,6 +239,7 @@ #define TR_SF_SCREENSHOT "截屏" #define TR_SF_RACING_MODE "競速模式" #define TR_SF_DISABLE_TOUCH "禁用觸摸" +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "關閉音頻功放" #define TR_SF_SET_SCREEN TR_BW_COL("設置主屏", "選擇主屏") #define TR_SF_PUSH_CUST_SWITCH "Push CS" @@ -570,7 +571,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "開機圖片" #define TR_PLAY_HELLO "開機語音" diff --git a/radio/src/translations/i18n/ua.h b/radio/src/translations/i18n/ua.h index 78e78f1e5c2..747d8ec1100 100644 --- a/radio/src/translations/i18n/ua.h +++ b/radio/src/translations/i18n/ua.h @@ -243,6 +243,7 @@ #define TR_SF_SCREENSHOT "Скріншот" #define TR_SF_RACING_MODE "Режим перегонів" #define TR_SF_DISABLE_TOUCH "Сенсор вимк." +#define TR_SF_DISABLE_KEYS "No Keys" #define TR_SF_DISABLE_AUDIO_AMP "Підсил. вимк." #define TR_SF_SET_SCREEN TR_BW_COL("Set Screen", "Вибір гол. екр.") #define TR_SF_PUSH_CUST_SWITCH "Push CS" @@ -574,7 +575,7 @@ #define TR_ONE_LOG_PER_DAY "One log per day" #define TR_KEY_LOCK_FMT "Key lock (%s+%s hold)" #define TR_KEYS_LOCKED "Keys locked" -#define TR_KEYS_LOCKED_FMT "Keys locked (%s+%s)" +#define TR_KEYS_LOCKED_FMT TR_BW_COL("%s+%s to unlock", "Keys locked (%s+%s to unlock)") #define TR_KEYS_UNLOCKED "Keys unlocked" #define TR_SPLASHSCREEN "Заставка" #define TR_PLAY_HELLO "Звук запуску" diff --git a/radio/src/translations/sim_string_list.h b/radio/src/translations/sim_string_list.h index 7ab2adb6e78..b65e00bf0f2 100644 --- a/radio/src/translations/sim_string_list.h +++ b/radio/src/translations/sim_string_list.h @@ -922,6 +922,7 @@ #define STR_SF_BG_MUSIC currentLangStrings->STR_SF_BG_MUSIC #define STR_SF_DISABLE_AUDIO_AMP currentLangStrings->STR_SF_DISABLE_AUDIO_AMP #define STR_SF_DISABLE_TOUCH currentLangStrings->STR_SF_DISABLE_TOUCH +#define STR_SF_DISABLE_KEYS currentLangStrings->STR_SF_DISABLE_KEYS #define STR_SF_FAILSAFE currentLangStrings->STR_SF_FAILSAFE #define STR_SF_HAPTIC currentLangStrings->STR_SF_HAPTIC #define STR_SF_INST_TRIM currentLangStrings->STR_SF_INST_TRIM diff --git a/radio/src/translations/string_list.h b/radio/src/translations/string_list.h index 6313b094368..5a79692d447 100644 --- a/radio/src/translations/string_list.h +++ b/radio/src/translations/string_list.h @@ -921,6 +921,7 @@ STR(SF_BG_MUSIC_PAUSE) STR(SF_BG_MUSIC) STR(SF_DISABLE_AUDIO_AMP) STR(SF_DISABLE_TOUCH) +STR(SF_DISABLE_KEYS) STR(SF_FAILSAFE) STR(SF_HAPTIC) STR(SF_INST_TRIM) diff --git a/tools/cfn_sorter.cpp b/tools/cfn_sorter.cpp index 7f5e9883566..34bc55d26ab 100755 --- a/tools/cfn_sorter.cpp +++ b/tools/cfn_sorter.cpp @@ -128,6 +128,7 @@ int main() { TR_SF_RGBLEDS, "FUNC_RGB_LED", FUNC_RGB_LED, "" }, { TR_SF_LCD_TO_VIDEO, "FUNC_LCD_TO_VIDEO", FUNC_LCD_TO_VIDEO, "defined(VIDEO_SWITCH)" }, { TR_SF_PUSH_CUST_SWITCH, "FUNC_PUSH_CUST_SWITCH", FUNC_PUSH_CUST_SWITCH, "defined(FUNCTION_SWITCHES)" }, + { TR_SF_DISABLE_KEYS, "FUNC_DISABLE_KEYS", FUNC_DISABLE_KEYS, "defined(KEYS_LOCK_KEY1) && defined(KEYS_LOCK_KEY2)" }, { TR_SF_TEST, "FUNC_TEST", FUNC_TEST, "defined(DEBUG)" }, }; diff --git a/tools/cfn_sorter.sh b/tools/cfn_sorter.sh index 9bd9ef22a8d..d5c5d278e0c 100755 --- a/tools/cfn_sorter.sh +++ b/tools/cfn_sorter.sh @@ -88,6 +88,7 @@ cat <> "${OUTPUT_FILE}" // This file is auto-generated via cfn_sorter.sh. Do not edit. #include "dataconstants.h" +#include "hal_keys_lock.h" Functions cfn_sorted[] = { EOF