diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index ccd2b5545..316f70a88 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -305,6 +305,7 @@ int8_t editSwitch(coord_t x, coord_t y, int8_t value, LcdFlags attr, event_t eve #if defined(GVARS) && defined(CPUARM) int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, uint8_t editflags, event_t event); void drawGVarName(coord_t x, coord_t y, int8_t index, LcdFlags flags=0); +void drawGVarValue(coord_t x, coord_t y, uint8_t gvar, gvar_t value, LcdFlags flags=0); #elif defined(GVARS) int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, event_t event); #else @@ -431,6 +432,8 @@ void deleteMix(uint8_t idx); typedef int (*FnFuncP) (int x); void drawFunction(FnFuncP fn, uint8_t offset=0); +void onSourceLongEnterPress(const char *result); + uint8_t switchToMix(uint8_t source); void deleteExpoMix(uint8_t expo, uint8_t idx); diff --git a/radio/src/gui/128x64/model_special_functions.cpp b/radio/src/gui/128x64/model_special_functions.cpp index 504c1eb89..7a50aff6d 100644 --- a/radio/src/gui/128x64/model_special_functions.cpp +++ b/radio/src/gui/128x64/model_special_functions.cpp @@ -71,6 +71,36 @@ void onCustomFunctionsFileSelectionMenu(const char * result) #endif #if defined(PCBX7) + +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); + } +} + void onCustomFunctionsMenu(const char * result) { int sub = menuVerticalPosition; @@ -399,8 +429,17 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF drawStringWithIndex(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, STR_GV, val_displayed+1, attr); break; default: // FUNC_ADJUST_GVAR_INC +#if defined(PCBX7) + val_min = -100; val_max = +100; + if (val_displayed < 0) + lcdDrawText(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, "-= ", attr); + else + lcdDrawText(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, "+= ", attr); + drawGVarValue(lcdNextPos, y, CFN_GVAR_INDEX(cfn), abs(val_displayed), attr|LEFT); +#else val_max = 1; lcdDrawTextAtIndex(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, PSTR("\003-=1+=1"), val_displayed, attr); +#endif break; } @@ -419,9 +458,26 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF else if (attr) { REPEAT_LAST_CURSOR_MOVE(); } - +#if defined(PCBX7) + 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); + POPUP_MENU_START(onAdjustGvarSourceLongEnterPress); + s_editMode = EDIT_MODIFY_FIELD; + } +#else if (active) { CFN_PARAM(cfn) = CHECK_INCDEC_PARAM(event, val_displayed, val_min, val_max); +#endif } break; } diff --git a/radio/src/gui/128x64/widgets.cpp b/radio/src/gui/128x64/widgets.cpp index c831732f5..3d814f80a 100644 --- a/radio/src/gui/128x64/widgets.cpp +++ b/radio/src/gui/128x64/widgets.cpp @@ -116,6 +116,15 @@ void display5posSlider(coord_t x, coord_t y, uint8_t value, uint8_t attr) #if defined(GVARS) && defined(CPUARM) +void drawGVarValue(coord_t x, coord_t y, uint8_t gvar, gvar_t value, LcdFlags flags) +{ + uint8_t prec = g_model.gvars[gvar].prec; + if (prec > 0) { + flags |= (prec == 1 ? PREC1 : PREC2); + } + drawValueWithUnit(x, y, value, g_model.gvars[gvar].unit ? UNIT_PERCENT : UNIT_RAW, flags); +} + int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, uint8_t editflags, event_t event) { uint16_t delta = GV_GET_GV1_VALUE(max);