diff --git a/radio/src/gui/horus/menu_model_custom_functions.cpp b/radio/src/gui/horus/menu_model_custom_functions.cpp index 8039c7a9c..75c036519 100644 --- a/radio/src/gui/horus/menu_model_custom_functions.cpp +++ b/radio/src/gui/horus/menu_model_custom_functions.cpp @@ -30,7 +30,18 @@ void onCustomFunctionsFileSelectionMenu(const char * result) { int sub = menuVerticalPosition; - CustomFunctionData * cf = &g_model.customFn[sub]; + CustomFunctionData * cf; + uint8_t eeFlags; + + if (menuHandlers[menuLevel] == menuModelCustomFunctions) { + cf = &g_model.customFn[sub]; + eeFlags = EE_MODEL; + } + else { + cf = &g_eeGeneral.customFn[sub]; + eeFlags = EE_GENERAL; + } + uint8_t func = CFN_FUNC(cf); if (result == STR_UPDATE_LIST) { @@ -95,6 +106,35 @@ void onCustomFunctionsMenu(const char *result) } } +void onAdjustGvarSourceLongEnterPress(const char * result) +{ + CustomFunctionData * cfn = &g_model.customFn[menuVerticalPosition]; + + if (result == STR_CONSTANT) { + CFN_GVAR_MODE(cfn) = FUNC_ADJUST_GVAR_CONSTANT; + CFN_PARAM(cfn) = 0; + storageDirty(EE_MODEL); + } + else if (result == STR_MIXSOURCE) { + CFN_GVAR_MODE(cfn) = FUNC_ADJUST_GVAR_SOURCE; + CFN_PARAM(cfn) = 0; + storageDirty(EE_MODEL); + } + else if (result == STR_GLOBALVAR) { + CFN_GVAR_MODE(cfn) = FUNC_ADJUST_GVAR_GVAR; + CFN_PARAM(cfn) = 0; + storageDirty(EE_MODEL); + } + else if (result == STR_INCDEC) { + CFN_GVAR_MODE(cfn) = FUNC_ADJUST_GVAR_INCDEC; + CFN_PARAM(cfn) = 0; + storageDirty(EE_MODEL); + } + else { + onSourceLongEnterPress(result); + } +} + bool menuCustomFunctions(evt_t event, CustomFunctionData * functions, CustomFunctionsContext & functionsContext) { uint32_t sub = menuVerticalPosition; @@ -134,7 +174,9 @@ bool menuCustomFunctions(evt_t event, CustomFunctionData * functions, CustomFunc LcdFlags active = (attr && s_editMode>0); switch (j) { case 0: - if (active || AUTOSWITCH_ENTER_LONG()) CHECK_INCDEC_SWITCH(event, CFN_SWITCH(cfn), SWSRC_FIRST, SWSRC_LAST, eeFlags, isSwitchAvailableInCustomFunctions); + if (active || AUTOSWITCH_ENTER_LONG()) { + CHECK_INCDEC_SWITCH(event, CFN_SWITCH(cfn), SWSRC_FIRST, SWSRC_LAST, eeFlags, isSwitchAvailableInCustomFunctions); + } putsSwitches(MODEL_CUSTOM_FUNC_1ST_COLUMN, y, CFN_SWITCH(cfn), attr | ((functionsContext.activeSwitches & ((MASK_CFN_TYPE)1 << k)) ? BOLD : 0)); break; @@ -290,26 +332,22 @@ bool menuCustomFunctions(evt_t event, CustomFunctionData * functions, CustomFunc case FUNC_ADJUST_GVAR_SOURCE: val_max = MIXSRC_LAST_CH; putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr); - INCDEC_SET_FLAG(eeFlags | INCDEC_SOURCE); - INCDEC_ENABLE_CHECK(isSourceAvailable); + if (active) { + INCDEC_SET_FLAG(eeFlags | INCDEC_SOURCE); + INCDEC_ENABLE_CHECK(isSourceAvailable); + } break; case FUNC_ADJUST_GVAR_GVAR: val_max = MAX_GVARS-1; drawStringWithIndex(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_GV, val_displayed+1, attr); break; default: // FUNC_ADJUST_GVAR_INC - val_max = 1; - lcdDrawTextAtIndex(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, PSTR("\003-=1+=1"), val_displayed, attr); - break; - } - - if (attr && event==EVT_KEY_LONG(KEY_ENTER)) { - killEvents(event); - s_editMode = !s_editMode; - active = true; - CFN_GVAR_MODE(cfn) += 1; - CFN_GVAR_MODE(cfn) &= 0x03; - val_displayed = 0; + val_min = -100; val_max = +100; + if (val_displayed < 0) + lcdDrawText(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, "-= ", attr); + else + lcdDrawText(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, "+= ", attr); + lcdDrawNumber(lcdNextPos, y, abs(val_displayed), attr|LEFT); } } #endif @@ -317,8 +355,21 @@ bool menuCustomFunctions(evt_t event, CustomFunctionData * functions, CustomFunc REPEAT_LAST_CURSOR_MOVE(0); } - if (active) { + if (active || event==EVT_KEY_LONG(KEY_ENTER)) { CFN_PARAM(cfn) = CHECK_INCDEC_PARAM(event, val_displayed, val_min, val_max); + if (func == FUNC_ADJUST_GVAR && attr && event==EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); + if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_CONSTANT) + POPUP_MENU_ADD_ITEM(STR_CONSTANT); + if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_SOURCE) + POPUP_MENU_ADD_ITEM(STR_MIXSOURCE); + if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_GVAR) + POPUP_MENU_ADD_ITEM(STR_GLOBALVAR); + if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_INCDEC) + POPUP_MENU_ADD_ITEM(STR_INCDEC); + popupMenuHandler = onAdjustGvarSourceLongEnterPress; + s_editMode = EDIT_MODIFY_FIELD; + } } break; } diff --git a/radio/src/gui/horus/menus.h b/radio/src/gui/horus/menus.h index 92de43b30..517ebe948 100644 --- a/radio/src/gui/horus/menus.h +++ b/radio/src/gui/horus/menus.h @@ -451,6 +451,8 @@ void pushModelNotes(); typedef int (*FnFuncP) (int x); void drawFunction(FnFuncP fn, int x, int y, int width); +void onSourceLongEnterPress(const char *result); + uint8_t switchToMix(uint8_t source); #endif // _MENUS_H_ diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 0298dac07..1cc197b20 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -86,8 +86,8 @@ #define IS_HAPTIC_FUNC(func) (0) #endif -#define HAS_ENABLE_PARAM(func) ((func) < FUNC_FIRST_WITHOUT_ENABLE && !IS_ADJUST_GV_FUNC(func)) -#define HAS_REPEAT_PARAM(func) (IS_PLAY_FUNC(func) || IS_HAPTIC_FUNC(func) || IS_ADJUST_GV_FUNC(func)) +#define HAS_ENABLE_PARAM(func) ((func) < FUNC_FIRST_WITHOUT_ENABLE) +#define HAS_REPEAT_PARAM(func) (IS_PLAY_FUNC(func) || IS_HAPTIC_FUNC(func)) #if defined(CPUARM) #define CFN_EMPTY(p) (!(p)->swtch)