From 0cc22c364d5c254054cd4974008ac616ad7fb6bc Mon Sep 17 00:00:00 2001 From: philmoz Date: Sun, 28 Jul 2024 08:13:20 +1000 Subject: [PATCH] chore(bw): simplify navigation code (#5269) --- radio/src/gui/128x64/model_curve_edit.cpp | 1 - radio/src/gui/128x64/model_gvars.cpp | 1 + radio/src/gui/128x64/model_input_edit.cpp | 1 - .../src/gui/128x64/model_logical_switches.cpp | 2 +- radio/src/gui/128x64/model_mix_edit.cpp | 1 - radio/src/gui/128x64/model_outputs.cpp | 16 +- radio/src/gui/128x64/model_select.cpp | 5 +- radio/src/gui/128x64/model_setup.cpp | 18 +- .../gui/128x64/model_special_functions.cpp | 7 +- radio/src/gui/128x64/radio_setup.cpp | 3 +- radio/src/gui/128x64/view_statistics.cpp | 2 + radio/src/gui/128x64/widgets.cpp | 1 + radio/src/gui/212x64/gui.h | 4 +- radio/src/gui/212x64/model_failsafe.cpp | 1 + radio/src/gui/212x64/model_gvars.cpp | 1 + .../src/gui/212x64/model_logical_switches.cpp | 1 + radio/src/gui/212x64/model_outputs.cpp | 8 + radio/src/gui/212x64/model_select.cpp | 6 +- radio/src/gui/212x64/model_setup.cpp | 17 +- .../gui/212x64/model_special_functions.cpp | 6 +- radio/src/gui/212x64/radio_setup.cpp | 2 +- radio/src/gui/212x64/view_statistics.cpp | 9 +- radio/src/gui/212x64/widgets.cpp | 1 + .../src/gui/common/stdlcd/draw_functions.cpp | 1 + radio/src/gui/common/stdlcd/menus.cpp | 3 +- radio/src/gui/common/stdlcd/model_inputs.cpp | 3 + radio/src/gui/common/stdlcd/model_mixes.cpp | 3 + .../common/stdlcd/model_module_options.cpp | 1 + .../common/stdlcd/model_receiver_options.cpp | 1 + .../gui/common/stdlcd/model_setup_pxx2.cpp | 1 + .../gui/common/stdlcd/model_usbjoystick.cpp | 1 - radio/src/gui/common/stdlcd/popups.cpp | 2 +- radio/src/gui/common/stdlcd/radio_trainer.cpp | 1 + .../src/gui/common/stdlcd/view_telemetry.cpp | 2 + radio/src/gui/navigation/navigation.cpp | 247 ++++++- radio/src/gui/navigation/navigation_9x.cpp | 261 ++------ radio/src/gui/navigation/navigation_x7.cpp | 254 ++----- radio/src/gui/navigation/navigation_x9d.cpp | 617 ------------------ radio/src/gui/navigation/navigation_xlite.cpp | 497 -------------- radio/src/keys.cpp | 3 +- 40 files changed, 422 insertions(+), 1590 deletions(-) delete mode 100644 radio/src/gui/navigation/navigation_x9d.cpp delete mode 100644 radio/src/gui/navigation/navigation_xlite.cpp diff --git a/radio/src/gui/128x64/model_curve_edit.cpp b/radio/src/gui/128x64/model_curve_edit.cpp index b9d16d5c0..f5cce2df0 100644 --- a/radio/src/gui/128x64/model_curve_edit.cpp +++ b/radio/src/gui/128x64/model_curve_edit.cpp @@ -161,7 +161,6 @@ void menuModelCurveOne(event_t event) case EVT_KEY_FIRST(KEY_ENTER): if (!keysGetState(KEY_SHIFT)) break; - killEvents(event); #else case EVT_KEY_BREAK(KEY_MODEL): case EVT_KEY_BREAK(KEY_MENU): diff --git a/radio/src/gui/128x64/model_gvars.cpp b/radio/src/gui/128x64/model_gvars.cpp index 17ba31858..a856c3686 100644 --- a/radio/src/gui/128x64/model_gvars.cpp +++ b/radio/src/gui/128x64/model_gvars.cpp @@ -41,6 +41,7 @@ void editGVarValue(coord_t x, coord_t y, event_t event, uint8_t gvar, uint8_t fl if (flags & INVERS) { if (event == EVT_KEY_LONG(KEY_ENTER) && flightMode > 0) { + killEvents(event); *v = (*v > GVAR_MAX ? 0 : GVAR_MAX+1); storageDirty(EE_MODEL); } diff --git a/radio/src/gui/128x64/model_input_edit.cpp b/radio/src/gui/128x64/model_input_edit.cpp index 5b0ab920d..ad988e8b4 100644 --- a/radio/src/gui/128x64/model_input_edit.cpp +++ b/radio/src/gui/128x64/model_input_edit.cpp @@ -60,7 +60,6 @@ void menuModelExpoOne(event_t event) #if defined(NAVIGATION_XLITE) if (event == EVT_KEY_FIRST(KEY_ENTER) && keysGetState(KEY_SHIFT)) { pushMenu(menuChannelsView); - killEvents(event); } #else if (event == EVT_KEY_BREAK(KEY_MODEL) || event == EVT_KEY_BREAK(KEY_MENU)) { diff --git a/radio/src/gui/128x64/model_logical_switches.cpp b/radio/src/gui/128x64/model_logical_switches.cpp index 56dbcfeaf..7cefce9ec 100644 --- a/radio/src/gui/128x64/model_logical_switches.cpp +++ b/radio/src/gui/128x64/model_logical_switches.cpp @@ -263,7 +263,7 @@ void menuModelLogicalSwitches(event_t event) uint8_t k = 0; int8_t sub = menuVerticalPosition - HEADER_LINE; - if ((event == EVT_KEY_BREAK(KEY_ENTER)) || (event == EVT_KEY_LONG(KEY_ENTER))) { + if (event == EVT_KEY_BREAK(KEY_ENTER)) { LogicalSwitchData * cs = lswAddress(sub); if (cs->func) s_currIdx = sub; diff --git a/radio/src/gui/128x64/model_mix_edit.cpp b/radio/src/gui/128x64/model_mix_edit.cpp index 14d708bdf..56048a90e 100644 --- a/radio/src/gui/128x64/model_mix_edit.cpp +++ b/radio/src/gui/128x64/model_mix_edit.cpp @@ -95,7 +95,6 @@ void menuModelMixOne(event_t event) #if defined(NAVIGATION_XLITE) if (event == EVT_KEY_FIRST(KEY_ENTER) && keysGetState(KEY_SHIFT)) { pushMenu(menuChannelsView); - killEvents(event); } #else if (event == EVT_KEY_BREAK(KEY_MODEL) || event == EVT_KEY_BREAK(KEY_MENU)) { diff --git a/radio/src/gui/128x64/model_outputs.cpp b/radio/src/gui/128x64/model_outputs.cpp index 6ee27d405..7a65f5a14 100644 --- a/radio/src/gui/128x64/model_outputs.cpp +++ b/radio/src/gui/128x64/model_outputs.cpp @@ -123,8 +123,10 @@ void menuModelLimitsOne(event_t event) case ITEM_OUTPUTONE_MIN: lcdDrawTextAlignedLeft(y, STR_MIN); if (GV_IS_GV_VALUE(ld->min, -GV_RANGELARGE, GV_RANGELARGE) || (attr && event == EVT_KEY_LONG(KEY_ENTER))) { - ld->min = GVAR_MENU_ITEM(LIMITS_ONE_2ND_COLUMN, y, ld->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, attr|PREC1, 0, event); - break; + if (event == EVT_KEY_LONG(KEY_ENTER)) + killEvents(event); + ld->min = GVAR_MENU_ITEM(LIMITS_ONE_2ND_COLUMN, y, ld->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, attr|PREC1, 0, event); + break; } lcdDrawNumber(LIMITS_ONE_2ND_COLUMN, y, minMaxDisplay(ld->min-LIMITS_MIN_MAX_OFFSET), attr|PREC1); if (active) { @@ -135,8 +137,10 @@ void menuModelLimitsOne(event_t event) case ITEM_OUTPUTONE_MAX: lcdDrawTextAlignedLeft(y, STR_MAX); if (GV_IS_GV_VALUE(ld->max, -GV_RANGELARGE, GV_RANGELARGE) || (attr && event == EVT_KEY_LONG(KEY_ENTER))) { - ld->max = GVAR_MENU_ITEM(LIMITS_ONE_2ND_COLUMN, y, ld->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, attr|PREC1, 0, event); - break; + if (event == EVT_KEY_LONG(KEY_ENTER)) + killEvents(event); + ld->max = GVAR_MENU_ITEM(LIMITS_ONE_2ND_COLUMN, y, ld->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, attr|PREC1, 0, event); + break; } lcdDrawNumber(LIMITS_ONE_2ND_COLUMN, y, minMaxDisplay(ld->max+LIMITS_MIN_MAX_OFFSET), attr|PREC1); if (active) { @@ -232,8 +236,7 @@ void menuModelLimits(event_t event) LcdFlags attr = (sub==MAX_OUTPUT_CHANNELS) ? INVERS : 0; if (sub == k && - ((event == EVT_KEY_BREAK(KEY_ENTER)) || - (event == EVT_KEY_LONG(KEY_ENTER))) && + (event == EVT_KEY_BREAK(KEY_ENTER)) && (k != MAX_OUTPUT_CHANNELS)) { s_editMode = 0; POPUP_MENU_START(onLimitsMenu, 5, STR_EDIT, STR_RESET, @@ -247,6 +250,7 @@ void menuModelLimits(event_t event) if (attr) { s_editMode = 0; if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); START_NO_HIGHLIGHT(); moveTrimsToOffsets(); // if highlighted and menu pressed - move trims to offsets } diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index 2ec8bb278..28e527a71 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -117,8 +117,7 @@ void menuModelSelect(event_t event) // Suppress exit in "copy mode": handled in this function event_t _event_ = event; if ((s_copyMode && IS_KEY_EVT(event, KEY_EXIT)) || - event == EVT_KEY_BREAK(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_ENTER) || - event == EVT_KEY_LONG(KEY_ENTER)) { + event == EVT_KEY_BREAK(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_ENTER)) { _event_ = 0; } @@ -141,6 +140,7 @@ void menuModelSelect(event_t event) break; case EVT_KEY_LONG(KEY_EXIT): + killEvents(event); if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && modelExists(sub)) { POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); SET_WARNING_INFO(modelHeaders[sub].name, sizeof(g_model.header.name), 0); @@ -201,6 +201,7 @@ void menuModelSelect(event_t event) else if (event == EVT_KEY_BREAK(KEY_ENTER) || event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); s_copyMode = 0; if (g_eeGeneral.currModel != sub) { if (modelExists(sub)) { diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index b73b6e2f2..521cf5fce 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -954,6 +954,7 @@ void menuModelSetup(event_t event) if (attr && menuHorizontalPosition>0) { s_editMode = 0; if (event==EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); START_NO_HIGHLIGHT(); for (uint8_t i=0; i= switchWarningsCount) { START_NO_HIGHLIGHT(); @@ -1147,6 +1146,7 @@ void menuModelSetup(event_t event) if (menuHorizontalPosition > 0) { switch (event) { case EVT_KEY_LONG(KEY_ENTER): + killEvents(event); if (g_model.potsWarnMode == POTS_WARN_MANUAL) { SAVE_POT_POSITION(menuHorizontalPosition-1); AUDIO_WARNING1(); @@ -1429,16 +1429,6 @@ void menuModelSetup(event_t event) lcdDrawTextIndented(y, STR_STATUS); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, 1000000 / getMixerSchedulerPeriod(), LEFT | attr); lcdDrawText(lcdNextPos, y, "Hz ", attr); - // lcdDrawNumber(lcdNextPos, y, telemetryErrors, attr); - // lcdDrawText(lcdNextPos + 1, y, "Err", attr); - // if (attr) { - // s_editMode = 0; - // if (event == EVT_KEY_LONG(KEY_ENTER)) { - // START_NO_HIGHLIGHT(); - // telemetryErrors = 0; - // AUDIO_WARNING1(); - // } - // } break; #endif @@ -1822,6 +1812,7 @@ void menuModelSetup(event_t event) modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; } else if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); uint8_t newVal = 0; #if defined(STORAGE_MODELSLIST) newVal = modelslist.findNextUnusedModelId(moduleIdx); @@ -1959,6 +1950,7 @@ void menuModelSetup(event_t event) s_editMode = 0; if (moduleData.failsafeMode == FAILSAFE_CUSTOM) { if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); setCustomFailsafe(moduleIdx); AUDIO_WARNING1(); SEND_FAILSAFE_NOW(moduleIdx); diff --git a/radio/src/gui/128x64/model_special_functions.cpp b/radio/src/gui/128x64/model_special_functions.cpp index 9521a34d8..c355581eb 100644 --- a/radio/src/gui/128x64/model_special_functions.cpp +++ b/radio/src/gui/128x64/model_special_functions.cpp @@ -197,7 +197,11 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF } else { drawSwitch(MODEL_SPECIAL_FUNC_1ST_COLUMN, y, CFN_SWITCH(cfn), attr | ((functionsContext->activeSwitches & ((MASK_CFN_TYPE)1 << k)) ? BOLD : 0)); - if (active || AUTOSWITCH_ENTER_LONG()) CHECK_INCDEC_SWITCH(event, CFN_SWITCH(cfn), SWSRC_FIRST, SWSRC_LAST, eeFlags, isSwitchAvailableInCustomFunctions); + if (active || AUTOSWITCH_ENTER_LONG()) { + if (event == EVT_KEY_LONG(KEY_ENTER)) + killEvents(event); + CHECK_INCDEC_SWITCH(event, CFN_SWITCH(cfn), SWSRC_FIRST, SWSRC_LAST, eeFlags, isSwitchAvailableInCustomFunctions); + } } if (func == FUNC_OVERRIDE_CHANNEL && functions != g_model.customFn) { func = CFN_FUNC(cfn) = func+1; @@ -411,6 +415,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF #if !defined(NAVIGATION_X7) // For X7 type navigation the ENTER long press is handled below if (attr && event==EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); s_editMode = !s_editMode; active = true; CFN_GVAR_MODE(cfn) += 1; diff --git a/radio/src/gui/128x64/radio_setup.cpp b/radio/src/gui/128x64/radio_setup.cpp index 47d755cab..d83330b5d 100644 --- a/radio/src/gui/128x64/radio_setup.cpp +++ b/radio/src/gui/128x64/radio_setup.cpp @@ -144,8 +144,7 @@ void menuRadioSetup(event_t event) if ((menuVerticalPosition == ITEM_RADIO_SETUP_DATE + HEADER_LINE || menuVerticalPosition == ITEM_RADIO_SETUP_TIME + HEADER_LINE) && (s_editMode > 0) && - (event == EVT_KEY_BREAK(KEY_ENTER) || event == EVT_KEY_LONG(KEY_ENTER) || - event == EVT_KEY_BREAK(KEY_EXIT))) { + (event == EVT_KEY_BREAK(KEY_ENTER) || event == EVT_KEY_BREAK(KEY_EXIT))) { // set the date and time into RTC chip rtcSetTime(&t); } diff --git a/radio/src/gui/128x64/view_statistics.cpp b/radio/src/gui/128x64/view_statistics.cpp index 668c7a0a4..40ce0f7fb 100644 --- a/radio/src/gui/128x64/view_statistics.cpp +++ b/radio/src/gui/128x64/view_statistics.cpp @@ -50,6 +50,7 @@ void menuStatisticsView(event_t event) break; case EVT_KEY_LONG(KEY_ENTER): + killEvents(event); g_eeGeneral.globalTimer = 0; storageDirty(EE_GENERAL); sessionTimer = 0; @@ -111,6 +112,7 @@ void menuStatisticsDebug(event_t event) break; case EVT_KEY_LONG(KEY_ENTER): + killEvents(event); g_eeGeneral.globalTimer = 0; sessionTimer = 0; storageDirty(EE_GENERAL); diff --git a/radio/src/gui/128x64/widgets.cpp b/radio/src/gui/128x64/widgets.cpp index b63429776..66b206824 100644 --- a/radio/src/gui/128x64/widgets.cpp +++ b/radio/src/gui/128x64/widgets.cpp @@ -204,6 +204,7 @@ int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int // TRACE("editGVarFieldValue(val=%d min=%d max=%d)", value, min, max); if (modelGVEnabled() && invers && event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); s_editMode = !s_editMode; if (attr & PREC1) value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, mixerCurrentFlightMode)*10 : delta); diff --git a/radio/src/gui/212x64/gui.h b/radio/src/gui/212x64/gui.h index bbeac7bc0..bef2b4b62 100644 --- a/radio/src/gui/212x64/gui.h +++ b/radio/src/gui/212x64/gui.h @@ -33,7 +33,6 @@ #define HEADER_LINE 0 #define HEADER_LINE_COLUMNS -#define DEFAULT_SCROLLBAR_X (LCD_W-1) #define NUM_BODY_LINES (LCD_LINES-1) #define TEXT_VIEWER_LINES NUM_BODY_LINES #define MENU_HEADER_HEIGHT FH @@ -172,8 +171,7 @@ void menuChannelsView(event_t event); void repeatLastCursorMove(event_t event); -#define POS_HORZ_INIT(posVert) ((COLATTR(posVert) & NAVIGATION_LINE_BY_LINE) ? -1 : 0) -#define EDIT_MODE_INIT 0 // TODO enum +#define EDIT_MODE_INIT 0 void onSwitchLongEnterPress(const char *result); void onSourceLongEnterPress(const char *result); diff --git a/radio/src/gui/212x64/model_failsafe.cpp b/radio/src/gui/212x64/model_failsafe.cpp index 61568e6a7..5fa5190b6 100644 --- a/radio/src/gui/212x64/model_failsafe.cpp +++ b/radio/src/gui/212x64/model_failsafe.cpp @@ -37,6 +37,7 @@ void menuModelFailsafe(event_t event) break; case EVT_KEY_LONG(KEY_ENTER): + killEvents(event); event = 0; if (menuVerticalPosition < sentModuleChannels(g_moduleIdx)) { diff --git a/radio/src/gui/212x64/model_gvars.cpp b/radio/src/gui/212x64/model_gvars.cpp index c0d0f0cd9..840b9b3fd 100644 --- a/radio/src/gui/212x64/model_gvars.cpp +++ b/radio/src/gui/212x64/model_gvars.cpp @@ -43,6 +43,7 @@ void editGVarValue(coord_t x, coord_t y, event_t event, uint8_t gvar, uint8_t fl if (flags & INVERS) { if (event == EVT_KEY_LONG(KEY_ENTER) && flightMode > 0) { + killEvents(event); *v = (*v > GVAR_MAX ? 0 : GVAR_MAX+1); storageDirty(EE_MODEL); } diff --git a/radio/src/gui/212x64/model_logical_switches.cpp b/radio/src/gui/212x64/model_logical_switches.cpp index d2cd9f34e..b0cab9ba9 100644 --- a/radio/src/gui/212x64/model_logical_switches.cpp +++ b/radio/src/gui/212x64/model_logical_switches.cpp @@ -240,6 +240,7 @@ void menuModelLogicalSwitches(event_t event) } cs->v2 = CHECK_INCDEC_PARAM(event, cs->v2, v2_min, v2_max); if (cstate==LS_FAMILY_OFS && cs->v1!=0 && event==EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); getvalue_t x = getValue(v1_val); if (abs(v1_val) <= MIXSRC_LAST_CH) { cs->v2 = calcRESXto100(x); diff --git a/radio/src/gui/212x64/model_outputs.cpp b/radio/src/gui/212x64/model_outputs.cpp index 23281f6cb..d6da7deb3 100644 --- a/radio/src/gui/212x64/model_outputs.cpp +++ b/radio/src/gui/212x64/model_outputs.cpp @@ -127,6 +127,7 @@ void menuModelLimits(event_t event) if (attr) { s_editMode = 0; if (event==EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); START_NO_HIGHLIGHT(); moveTrimsToOffsets(); // if highlighted and menu pressed - move trims to offsets } @@ -161,6 +162,8 @@ void menuModelLimits(event_t event) case ITEM_LIMITS_OFFSET: if (GV_IS_GV_VALUE(ld->offset, -1000, 1000) || (attr && event == EVT_KEY_LONG(KEY_ENTER))) { + if (event == EVT_KEY_LONG(KEY_ENTER)) + killEvents(event); ld->offset = GVAR_MENU_ITEM(LIMITS_OFFSET_POS, y, ld->offset, -1000, 1000, RIGHT|attr|PREC1, 0, event); break; } @@ -174,6 +177,7 @@ void menuModelLimits(event_t event) ld->offset = checkIncDec(event, ld->offset, -1000, 1000, EE_MODEL, nullptr, stops1000); } else if (attr && event==EVT_KEY_LONG(KEY_MENU)) { + killEvents(event); copySticksToOffset(k); s_editMode = 0; } @@ -181,6 +185,8 @@ void menuModelLimits(event_t event) case ITEM_LIMITS_MIN: if (GV_IS_GV_VALUE(ld->min, -GV_RANGELARGE, GV_RANGELARGE) || (attr && event == EVT_KEY_LONG(KEY_ENTER))) { + if (event == EVT_KEY_LONG(KEY_ENTER)) + killEvents(event); ld->min = GVAR_MENU_ITEM(LIMITS_MIN_POS, y, ld->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, attr|PREC1|RIGHT, 0, event); break; } @@ -190,6 +196,8 @@ void menuModelLimits(event_t event) case ITEM_LIMITS_MAX: if (GV_IS_GV_VALUE(ld->max, -GV_RANGELARGE, GV_RANGELARGE) || (attr && event == EVT_KEY_LONG(KEY_ENTER))) { + if (event == EVT_KEY_LONG(KEY_ENTER)) + killEvents(event); ld->max = GVAR_MENU_ITEM(LIMITS_MAX_POS, y, ld->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, attr|PREC1|RIGHT, 0, event); break; } diff --git a/radio/src/gui/212x64/model_select.cpp b/radio/src/gui/212x64/model_select.cpp index e63462cab..55e21ea03 100644 --- a/radio/src/gui/212x64/model_select.cpp +++ b/radio/src/gui/212x64/model_select.cpp @@ -114,8 +114,7 @@ void menuModelSelect(event_t event) // Suppress exit in "copy mode": handled in this function event_t _event_ = event; if ((s_copyMode && IS_KEY_EVT(event, KEY_EXIT)) || - event == EVT_KEY_BREAK(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_ENTER) || - event == EVT_KEY_LONG(KEY_ENTER)) { + event == EVT_KEY_BREAK(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_ENTER)) { _event_ = 0; } @@ -137,6 +136,7 @@ void menuModelSelect(event_t event) break; case EVT_KEY_LONG(KEY_EXIT): + killEvents(event); if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && modelExists(sub)) { char * nametmp = reusableBuffer.modelsel.mainname; strcat_modelname (nametmp, sub, 0); @@ -160,6 +160,7 @@ void menuModelSelect(event_t event) } } break; + case EVT_KEY_LONG(KEY_ENTER): case EVT_KEY_BREAK(KEY_ENTER): s_editMode = 0; @@ -195,6 +196,7 @@ void menuModelSelect(event_t event) event = EVT_ENTRY_UP; } else if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); s_copyMode = 0; if (g_eeGeneral.currModel != sub) { if (modelExists(sub)) { diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index d0910d04d..525f646a2 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -766,6 +766,7 @@ void menuModelSetup(event_t event) if (attr && menuHorizontalPosition>0) { s_editMode = 0; if (event==EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); START_NO_HIGHLIGHT(); for (uint8_t i=0; i 0) { switch (event) { case EVT_KEY_LONG(KEY_ENTER): + killEvents(event); if (g_model.potsWarnMode == POTS_WARN_MANUAL) { SAVE_POT_POSITION(menuHorizontalPosition-1); AUDIO_WARNING1(); @@ -1278,16 +1278,6 @@ void menuModelSetup(event_t event) lcdDrawTextIndented(y, STR_STATUS); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, 1000000 / getMixerSchedulerPeriod(), LEFT | attr); lcdDrawText(lcdNextPos, y, "Hz ", attr); - // lcdDrawNumber(lcdNextPos, y, telemetryErrors, attr); - // lcdDrawText(lcdNextPos + 1, y, "Err", attr); - // if (attr) { - // s_editMode = 0; - // if (event == EVT_KEY_LONG(KEY_ENTER)) { - // START_NO_HIGHLIGHT(); - // telemetryErrors = 0; - // AUDIO_WARNING1(); - // } - // } break; #endif @@ -1657,6 +1647,7 @@ void menuModelSetup(event_t event) s_editMode = 0; if (moduleData.failsafeMode == FAILSAFE_CUSTOM) { if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); setCustomFailsafe(moduleIdx); AUDIO_WARNING1(); SEND_FAILSAFE_NOW(moduleIdx); diff --git a/radio/src/gui/212x64/model_special_functions.cpp b/radio/src/gui/212x64/model_special_functions.cpp index 5c7592635..9ba6414fc 100644 --- a/radio/src/gui/212x64/model_special_functions.cpp +++ b/radio/src/gui/212x64/model_special_functions.cpp @@ -188,7 +188,11 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF case ITEM_CUSTOM_FUNCTIONS_SWITCH: if(CFN_SWITCH(cfn) == SWSRC_NONE) CFN_ACTIVE(cfn) = 0; // Disable new function by default drawSwitch(MODEL_SPECIAL_FUNC_1ST_COLUMN, y, CFN_SWITCH(cfn), attr | ((functionsContext->activeSwitches & ((MASK_CFN_TYPE)1 << k)) ? BOLD : 0)); - if (active || AUTOSWITCH_ENTER_LONG()) CHECK_INCDEC_SWITCH(event, CFN_SWITCH(cfn), SWSRC_FIRST, SWSRC_LAST, eeFlags, isSwitchAvailableInCustomFunctions); + if (active || AUTOSWITCH_ENTER_LONG()) { + if (event == EVT_KEY_LONG(KEY_ENTER)) + killEvents(event); + CHECK_INCDEC_SWITCH(event, CFN_SWITCH(cfn), SWSRC_FIRST, SWSRC_LAST, eeFlags, isSwitchAvailableInCustomFunctions); + } if (func == FUNC_OVERRIDE_CHANNEL && functions != g_model.customFn) { func = CFN_FUNC(cfn) = func+1; } diff --git a/radio/src/gui/212x64/radio_setup.cpp b/radio/src/gui/212x64/radio_setup.cpp index e23ec0098..d1f221f38 100644 --- a/radio/src/gui/212x64/radio_setup.cpp +++ b/radio/src/gui/212x64/radio_setup.cpp @@ -137,7 +137,7 @@ void menuRadioSetup(event_t event) if ((menuVerticalPosition==ITEM_RADIO_SETUP_DATE || menuVerticalPosition==ITEM_RADIO_SETUP_TIME) && (s_editMode>0) && - (event==EVT_KEY_BREAK(KEY_ENTER) || event==EVT_KEY_BREAK(KEY_ENTER) || event==EVT_KEY_LONG(KEY_ENTER) || event==EVT_KEY_BREAK(KEY_EXIT))) { + (event==EVT_KEY_BREAK(KEY_ENTER) || event==EVT_KEY_BREAK(KEY_EXIT))) { // set the date and time into RTC chip rtcSetTime(&t); } diff --git a/radio/src/gui/212x64/view_statistics.cpp b/radio/src/gui/212x64/view_statistics.cpp index 6ebb26584..1f73e0acc 100644 --- a/radio/src/gui/212x64/view_statistics.cpp +++ b/radio/src/gui/212x64/view_statistics.cpp @@ -49,6 +49,7 @@ void menuStatisticsView(event_t event) case EVT_KEY_LONG(KEY_MENU): // historical case EVT_KEY_LONG(KEY_ENTER): + killEvents(event); g_eeGeneral.globalTimer = 0; storageDirty(EE_GENERAL); sessionTimer = 0; @@ -119,6 +120,7 @@ void menuStatisticsDebug(event_t event) switch (event) { case EVT_KEY_LONG(KEY_ENTER): + killEvents(event); g_eeGeneral.globalTimer = 0; sessionTimer = 0; storageDirty(EE_GENERAL); @@ -152,6 +154,7 @@ void menuStatisticsDebug(event_t event) #if defined(WATCHDOG_TEST) case EVT_KEY_LONG(KEY_MENU): { + killEvents(event); POPUP_CONFIRMATION("Test the watchdog?", nullptr); const char * w = "The radio will reset!"; SET_WARNING_INFO(w, strlen(w), 0); @@ -231,17 +234,12 @@ void menuStatisticsDebug2(event_t event) case EVT_KEY_BREAK(KEY_EXIT): chainMenu(menuMainView); break; - - // case EVT_KEY_LONG(KEY_ENTER): - // telemetryErrors = 0; - // break; } // UART statistics // lcdDrawTextAlignedLeft(MENU_DEBUG_ROW1, "Tlm RX Err"); // lcdDrawNumber(MENU_DEBUG_COL1_OFS, MENU_DEBUG_ROW1, telemetryErrors, RIGHT); - lcdDrawText(LCD_W/2, 7*FH+1, STR_MENUTORESET, CENTERED); lcdInvertLastLine(); } @@ -252,6 +250,7 @@ void menuTraceBuffer(event_t event) switch(event) { case EVT_KEY_LONG(KEY_ENTER): + killEvents(event); dumpTraceBuffer(); break; diff --git a/radio/src/gui/212x64/widgets.cpp b/radio/src/gui/212x64/widgets.cpp index 73e3af66e..56b81a894 100644 --- a/radio/src/gui/212x64/widgets.cpp +++ b/radio/src/gui/212x64/widgets.cpp @@ -162,6 +162,7 @@ int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int // TRACE("editGVarFieldValue(val=%d min=%d max=%d)", value, min, max); if (modelGVEnabled() && invers && event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); s_editMode = !s_editMode; if (attr & PREC1) { value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, mixerCurrentFlightMode)*10 : delta); diff --git a/radio/src/gui/common/stdlcd/draw_functions.cpp b/radio/src/gui/common/stdlcd/draw_functions.cpp index 02181f23f..2fd299a6e 100644 --- a/radio/src/gui/common/stdlcd/draw_functions.cpp +++ b/radio/src/gui/common/stdlcd/draw_functions.cpp @@ -237,6 +237,7 @@ void editName(coord_t x, coord_t y, char* name, uint8_t size, event_t event, #else case EVT_KEY_LONG(KEY_ENTER): #endif + killEvents(event); #if !defined(NAVIGATION_XLITE) if (v == ' ') { diff --git a/radio/src/gui/common/stdlcd/menus.cpp b/radio/src/gui/common/stdlcd/menus.cpp index 33d618aa3..2c770fbe9 100644 --- a/radio/src/gui/common/stdlcd/menus.cpp +++ b/radio/src/gui/common/stdlcd/menus.cpp @@ -47,6 +47,7 @@ void abortPopMenu() void chainMenu(MenuHandlerFunc newMenu) { + killAllEvents(); menuHandlers[menuLevel] = newMenu; menuEvent = EVT_ENTRY; // TODO ? AUDIO_KEY_PRESS(); @@ -55,7 +56,7 @@ void chainMenu(MenuHandlerFunc newMenu) void pushMenu(MenuHandlerFunc newMenu) { - killEvents(KEY_ENTER); // TODO: Check if needed. + killAllEvents(); if (menuLevel == 0) { if (newMenu == menuRadioSetup) diff --git a/radio/src/gui/common/stdlcd/model_inputs.cpp b/radio/src/gui/common/stdlcd/model_inputs.cpp index e5416e084..20c7c2be8 100644 --- a/radio/src/gui/common/stdlcd/model_inputs.cpp +++ b/radio/src/gui/common/stdlcd/model_inputs.cpp @@ -260,6 +260,7 @@ void menuModelExposAll(event_t event) s_copyTgtOfs = 0; break; case EVT_KEY_LONG(KEY_EXIT): + killEvents(event); if (s_copyMode && s_copyTgtOfs == 0) { deleteExpo(s_currIdx); event = 0; @@ -296,6 +297,7 @@ void menuModelExposAll(event_t event) } // no break case EVT_KEY_LONG(KEY_ENTER): + killEvents(event); if (s_copyTgtOfs) { s_copyMode = 0; s_copyTgtOfs = 0; @@ -319,6 +321,7 @@ void menuModelExposAll(event_t event) // TODO: add PLUS / MINUS? // case EVT_KEY_LONG(KEY_LEFT): // case EVT_KEY_LONG(KEY_RIGHT): + // killEvents(event); // if (s_copyMode && !s_copyTgtOfs) { // if (reachExposLimit()) break; // s_currCh = chn; diff --git a/radio/src/gui/common/stdlcd/model_mixes.cpp b/radio/src/gui/common/stdlcd/model_mixes.cpp index 23315854b..597918ade 100644 --- a/radio/src/gui/common/stdlcd/model_mixes.cpp +++ b/radio/src/gui/common/stdlcd/model_mixes.cpp @@ -176,6 +176,7 @@ void menuModelMixAll(event_t event) s_copyTgtOfs = 0; break; case EVT_KEY_LONG(KEY_EXIT): + killEvents(event); if (s_copyMode && s_copyTgtOfs == 0) { deleteMix(s_currIdx); event = 0; @@ -213,6 +214,7 @@ void menuModelMixAll(event_t event) // no break case EVT_KEY_LONG(KEY_ENTER): + killEvents(event); if (s_copyTgtOfs) { s_copyMode = 0; s_copyTgtOfs = 0; @@ -236,6 +238,7 @@ void menuModelMixAll(event_t event) // TODO: add PLUS / MINUS? // case EVT_KEY_LONG(KEY_LEFT): // case EVT_KEY_LONG(KEY_RIGHT): + // killEvents(event); // if (s_copyMode && !s_copyTgtOfs) { // if (reachMixesLimit()) break; // s_currCh = chn; diff --git a/radio/src/gui/common/stdlcd/model_module_options.cpp b/radio/src/gui/common/stdlcd/model_module_options.cpp index 3ff084ab3..52c2696a1 100644 --- a/radio/src/gui/common/stdlcd/model_module_options.cpp +++ b/radio/src/gui/common/stdlcd/model_module_options.cpp @@ -103,6 +103,7 @@ void menuModelModuleOptions(event_t event) } if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.moduleSettings.dirty) { + killEvents(event); reusableBuffer.hardwareAndSettings.moduleSettings.dirty = MODULE_SETTINGS_OK; moduleState[g_moduleIdx].writeModuleSettings(&reusableBuffer.hardwareAndSettings.moduleSettings); } diff --git a/radio/src/gui/common/stdlcd/model_receiver_options.cpp b/radio/src/gui/common/stdlcd/model_receiver_options.cpp index a1bac4f2e..d3ed310ed 100644 --- a/radio/src/gui/common/stdlcd/model_receiver_options.cpp +++ b/radio/src/gui/common/stdlcd/model_receiver_options.cpp @@ -127,6 +127,7 @@ void menuModelReceiverOptions(event_t event) } if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.receiverSettings.dirty) { + killEvents(event); reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_OK; moduleState[g_moduleIdx].writeReceiverSettings(&reusableBuffer.hardwareAndSettings.receiverSettings); } diff --git a/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp b/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp index bae701868..9ff745486 100644 --- a/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp +++ b/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp @@ -182,6 +182,7 @@ void runPopupRegister(event_t event) // no break case EVT_KEY_LONG(KEY_EXIT): + killEvents(event); s_editMode = 0; // no break; diff --git a/radio/src/gui/common/stdlcd/model_usbjoystick.cpp b/radio/src/gui/common/stdlcd/model_usbjoystick.cpp index a4ea00881..35ddd05c0 100644 --- a/radio/src/gui/common/stdlcd/model_usbjoystick.cpp +++ b/radio/src/gui/common/stdlcd/model_usbjoystick.cpp @@ -53,7 +53,6 @@ void menuModelUSBJoystickOne(event_t event) #if defined(NAVIGATION_XLITE) if (event == EVT_KEY_FIRST(KEY_ENTER) && keysGetState(KEY_SHIFT)) { pushMenu(menuChannelsView); - killEvents(event); } #else if (event == EVT_KEY_BREAK(KEY_MODEL) || event == EVT_KEY_BREAK(KEY_MENU)) { diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index bb09a0fc8..c38cf1ca6 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -344,8 +344,8 @@ void POPUP_MENU_TITLE(const char * s) void POPUP_MENU_START(PopupMenuHandler handler) { + killAllEvents(); if (handler != popupMenuHandler) { - killAllEvents(); AUDIO_KEY_PRESS(); popupMenuHandler = handler; } diff --git a/radio/src/gui/common/stdlcd/radio_trainer.cpp b/radio/src/gui/common/stdlcd/radio_trainer.cpp index b92966b60..bff97fd03 100644 --- a/radio/src/gui/common/stdlcd/radio_trainer.cpp +++ b/radio/src/gui/common/stdlcd/radio_trainer.cpp @@ -112,6 +112,7 @@ void menuRadioTrainer(event_t event) if (attr) { s_editMode = 0; if (event==EVT_KEY_LONG(KEY_ENTER)){ + killEvents(event); memcpy(g_eeGeneral.trainer.calib, trainerInput, sizeof(g_eeGeneral.trainer.calib)); storageDirty(EE_GENERAL); AUDIO_WARNING1(); diff --git a/radio/src/gui/common/stdlcd/view_telemetry.cpp b/radio/src/gui/common/stdlcd/view_telemetry.cpp index 65c643a21..c31b44f1c 100644 --- a/radio/src/gui/common/stdlcd/view_telemetry.cpp +++ b/radio/src/gui/common/stdlcd/view_telemetry.cpp @@ -62,9 +62,11 @@ void menuViewTelemetry(event_t event) } #endif else if (EVT_KEY_PREVIOUS_VIEW(event)) { + killEvents(event); decrTelemetryScreen(); } else if (EVT_KEY_NEXT_VIEW(event)) { + killEvents(event); incrTelemetryScreen(); } else if (event == EVT_KEY_LONG(KEY_ENTER)) { diff --git a/radio/src/gui/navigation/navigation.cpp b/radio/src/gui/navigation/navigation.cpp index 3ac90fa86..5fb964f32 100644 --- a/radio/src/gui/navigation/navigation.cpp +++ b/radio/src/gui/navigation/navigation.cpp @@ -20,15 +20,248 @@ */ #include "opentx.h" +#include "navigation.h" -#if defined(NAVIGATION_X9D) - #include "navigation_x9d.cpp" -#elif defined(NAVIGATION_9X) - #include "navigation_9x.cpp" -#elif defined(NAVIGATION_XLITE) - #include "navigation_xlite.cpp" -#elif defined(NAVIGATION_X7) +#include "switches.h" + +vertpos_t menuVerticalOffset; +vertpos_t menuVerticalPosition; +horzpos_t menuHorizontalPosition; + +int8_t s_editMode; +uint8_t noHighlightCounter; +uint8_t menuCalibrationState; + +int8_t checkIncDec_Ret; + +tmr10ms_t menuEntryTime; + +extern int checkIncDecSelection; + +INIT_STOPS(stops100, 3, -100, 0, 100) +INIT_STOPS(stops1000, 3, -1000, 0, 1000) +INIT_STOPS(stopsSwitch, 15, SWSRC_FIRST, + CATEGORY_END(-SWSRC_FIRST_LOGICAL_SWITCH), + CATEGORY_END(-SWSRC_FIRST_TRIM), + CATEGORY_END(-SWSRC_LAST_SWITCH + 1), 0, + CATEGORY_END(SWSRC_LAST_SWITCH), CATEGORY_END(SWSRC_FIRST_TRIM - 1), + CATEGORY_END(SWSRC_FIRST_LOGICAL_SWITCH - 1), SWSRC_LAST) + +#define INC(val, min, max) if (valmin) {val--;} else {val=max;} + +#define MAXCOL_RAW(row) (horTab ? *(horTab+min(row, (vertpos_t)horTabMax)) : (const uint8_t)0) +#define MAXCOL(row) (MAXCOL_RAW(row) >= HIDDEN_ROW ? MAXCOL_RAW(row) : (const uint8_t)(MAXCOL_RAW(row) & (~NAVIGATION_LINE_BY_LINE))) + +#define CURSOR_NOT_ALLOWED_IN_ROW(row) ((int8_t)MAXCOL(row) < 0) + +uint8_t chgMenu(uint8_t curr, const MenuHandler * menuTab, uint8_t menuTabSize, int direction) +{ + int cc = curr + direction; + while (cc != curr) { + if (cc < 0) + cc = menuTabSize - 1; + else if (cc >= menuTabSize) + cc = 0; + if (menuTab[cc].isEnabled()) + return cc; + cc += direction; + } + return curr; +} + +uint8_t menuSize(const MenuHandler * menuTab, uint8_t menuTabSize) +{ + uint8_t sz = 0; + for (int i = 0; i < menuTabSize; i += 1) { + if (menuTab[i].isEnabled()) { + sz += 1; + } + } + return sz; +} + +uint8_t menuIdx(const MenuHandler * menuTab, uint8_t curr) +{ + return menuSize(menuTab, curr + 1) - 1; +} + +inline int showPopupMenus(event_t event, int newval, int i_min, int i_max, + unsigned int i_flags, IsValueAvailable isValueAvailable, + bool& isSource) +{ + if (i_flags & (INCDEC_SOURCE | INCDEC_SOURCE_VALUE)) { + if (event == EVT_KEY_LONG(KEY_ENTER)) { + checkIncDecSelection = MIXSRC_NONE; + + if (i_flags & INCDEC_SOURCE_VALUE && isSource) { + POPUP_MENU_ADD_ITEM(STR_CONSTANT); + } + + if (i_min <= MIXSRC_FIRST_INPUT && i_max >= MIXSRC_FIRST_INPUT) { + if (getFirstAvailable(MIXSRC_FIRST_INPUT, MIXSRC_LAST_INPUT, isInputAvailable) != MIXSRC_NONE && + (i_flags & INCDEC_SOURCE_NOINPUTS) == 0) { + POPUP_MENU_ADD_ITEM(STR_MENU_INPUTS); + } + } +#if defined(LUA_MODEL_SCRIPTS) + if (i_min <= MIXSRC_FIRST_LUA && i_max >= MIXSRC_FIRST_LUA) { + if (getFirstAvailable(MIXSRC_FIRST_LUA, MIXSRC_LAST_LUA, isSourceAvailable) != MIXSRC_NONE && + (i_flags & INCDEC_SOURCE_NOINPUTS) == 0) { + POPUP_MENU_ADD_ITEM(STR_MENU_LUA); + } + } +#endif + if (i_min <= MIXSRC_FIRST_STICK && i_max >= MIXSRC_FIRST_STICK) POPUP_MENU_ADD_ITEM(STR_MENU_STICKS); + if (i_min <= MIXSRC_FIRST_POT && i_max >= MIXSRC_FIRST_POT) POPUP_MENU_ADD_ITEM(STR_MENU_POTS); + if (i_min <= MIXSRC_MIN && i_max >= MIXSRC_MIN) POPUP_MENU_ADD_ITEM(STR_MENU_MIN); + if (i_min <= MIXSRC_MAX && i_max >= MIXSRC_MAX) POPUP_MENU_ADD_ITEM(STR_MENU_MAX); +#if defined(HELI) + if (modelHeliEnabled()) + if (i_min <= MIXSRC_FIRST_HELI && i_max >= MIXSRC_FIRST_HELI && isValueAvailable && isValueAvailable(MIXSRC_FIRST_HELI)) + POPUP_MENU_ADD_ITEM(STR_MENU_HELI); +#endif + if (i_min <= MIXSRC_FIRST_TRIM && i_max >= MIXSRC_FIRST_TRIM) POPUP_MENU_ADD_ITEM(STR_MENU_TRIMS); + if (i_min <= MIXSRC_FIRST_SWITCH && i_max >= MIXSRC_FIRST_SWITCH) POPUP_MENU_ADD_ITEM(STR_MENU_SWITCHES); + if (i_min <= MIXSRC_FIRST_TRAINER && i_max >= MIXSRC_FIRST_TRAINER) POPUP_MENU_ADD_ITEM(STR_MENU_TRAINER); + if (i_min <= MIXSRC_FIRST_CH && i_max >= MIXSRC_FIRST_CH) POPUP_MENU_ADD_ITEM(STR_MENU_CHANNELS); + if (i_min <= MIXSRC_FIRST_GVAR && i_max >= MIXSRC_FIRST_GVAR && isValueAvailable && isValueAvailable(MIXSRC_FIRST_GVAR)) { + POPUP_MENU_ADD_ITEM(STR_MENU_GVARS); + } + + if (modelTelemetryEnabled() && i_min <= MIXSRC_FIRST_TELEM && i_max >= MIXSRC_FIRST_TELEM) { + for (int i = 0; i < MAX_TELEMETRY_SENSORS; i++) { + TelemetrySensor * sensor = & g_model.telemetrySensors[i]; + if (sensor->isAvailable()) { + POPUP_MENU_ADD_ITEM(STR_MENU_TELEMETRY); + break; + } + } + } + if (i_flags & INCDEC_SOURCE_INVERT) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT); + POPUP_MENU_START(onSourceLongEnterPress); + } + if (checkIncDecSelection != 0) { + if (i_flags & INCDEC_SOURCE_VALUE) { + if (checkIncDecSelection == MIXSRC_VALUE) { + newval = 0; + isSource = false; + } else { + newval = (checkIncDecSelection == MIXSRC_INVERT ? -newval : checkIncDecSelection); + if (checkIncDecSelection != MIXSRC_INVERT) + isSource = true; + } + } else { + newval = (checkIncDecSelection == MIXSRC_INVERT ? -newval : checkIncDecSelection); + } + if (checkIncDecSelection != MIXSRC_MIN && checkIncDecSelection != MIXSRC_MAX) + s_editMode = EDIT_MODIFY_FIELD; + checkIncDecSelection = 0; + } + } + else if (i_flags & INCDEC_SWITCH) { + if (event == EVT_KEY_LONG(KEY_ENTER)) { + checkIncDecSelection = SWSRC_NONE; + if (i_min <= SWSRC_FIRST_SWITCH && i_max >= SWSRC_LAST_SWITCH) POPUP_MENU_ADD_ITEM(STR_MENU_SWITCHES); + if (i_min <= SWSRC_FIRST_TRIM && i_max >= SWSRC_LAST_TRIM) POPUP_MENU_ADD_ITEM(STR_MENU_TRIMS); + if (i_min <= SWSRC_FIRST_LOGICAL_SWITCH && i_max >= SWSRC_LAST_LOGICAL_SWITCH) { + for (int i = 0; i < MAX_LOGICAL_SWITCHES; i++) { + if (isValueAvailable && isValueAvailable(SWSRC_FIRST_LOGICAL_SWITCH+i)) { + POPUP_MENU_ADD_ITEM(STR_MENU_LOGICAL_SWITCHES); + break; + } + } + } + if (isValueAvailable && isValueAvailable(SWSRC_ON)) POPUP_MENU_ADD_ITEM(STR_MENU_OTHER); + if (isValueAvailable && isValueAvailable(-newval)) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT); + POPUP_MENU_START(onSwitchLongEnterPress); + s_editMode = EDIT_MODIFY_FIELD; + } + if (checkIncDecSelection != 0) { + newval = (checkIncDecSelection == SWSRC_INVERT ? -newval : checkIncDecSelection); + s_editMode = EDIT_MODIFY_FIELD; + checkIncDecSelection = 0; + } + } + + return newval; +} + +int checkMovedInput(int newval, int i_min, int i_max, unsigned int i_flags, bool isSource) +{ +#if defined(AUTOSWITCH) + if (i_flags & INCDEC_SWITCH) { + newval = checkIncDecMovedSwitch(newval); + } +#endif + +#if defined(AUTOSOURCE) + if (i_flags & (INCDEC_SOURCE|INCDEC_SOURCE_VALUE)) { + int source = GET_MOVED_SOURCE(i_min, i_max); + if (source) { + if (i_flags & INCDEC_SOURCE_VALUE) { + if (isSource) { + // Only use moved source if already a source value + newval = source; + } + } else { + newval = source; + } + } +#if defined(AUTOSWITCH) + else { + uint8_t swtch = abs(getMovedSwitch()); + if (swtch && !IS_SWITCH_MULTIPOS(swtch)) { + newval = switchToMix(swtch); + } + } +#endif + } +#endif + return newval; +} + +int checkBoolean(event_t event, int i_min, int i_max, int newval, int val) +{ + if (i_min == 0 && i_max == 1 && + (event == EVT_KEY_BREAK(KEY_ENTER))) { + s_editMode = 0; + newval = !val; + } + + return newval; +} + +void finishCheckIncDec(event_t event, int i_min, int i_max, + unsigned int i_flags, int newval, int val, + const CheckIncDecStops &stops) +{ + if (newval != val) { +#if !defined(ROTARY_ENCODER_NAVIGATION) + if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && + (newval != i_min) && stops.contains(newval)) { + bool pause = (newval > val ? !stops.contains(newval + 1) + : !stops.contains(newval - 1)); + if (pause) { + pauseEvents(event); // delay before auto-repeat continues + } + } + if (!IS_KEY_REPT(event)) { + AUDIO_KEY_PRESS(); + } +#endif + storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); + checkIncDec_Ret = (newval > val ? 1 : -1); + } + else { + checkIncDec_Ret = 0; + } +} + +#if defined(NAVIGATION_X7) || defined(NAVIGATION_X9D) #include "navigation_x7.cpp" +#elif defined(NAVIGATION_9X) || defined(NAVIGATION_XLITE) + #include "navigation_9x.cpp" #else static_assert("navigation not defined"); #endif diff --git a/radio/src/gui/navigation/navigation_9x.cpp b/radio/src/gui/navigation/navigation_9x.cpp index 521f1a2c6..05daff1e7 100644 --- a/radio/src/gui/navigation/navigation_9x.cpp +++ b/radio/src/gui/navigation/navigation_9x.cpp @@ -19,31 +19,7 @@ * GNU General Public License for more details. */ -#include "opentx.h" -#include "navigation.h" - -#include "switches.h" - -vertpos_t menuVerticalOffset; -vertpos_t menuVerticalPosition; -horzpos_t menuHorizontalPosition; - -int8_t s_editMode; -uint8_t noHighlightCounter; -uint8_t menuCalibrationState; - -int8_t checkIncDec_Ret; - -INIT_STOPS(stops100, 3, -100, 0, 100) -INIT_STOPS(stops1000, 3, -1000, 0, 1000) -INIT_STOPS(stopsSwitch, 15, SWSRC_FIRST, - CATEGORY_END(-SWSRC_FIRST_LOGICAL_SWITCH), - CATEGORY_END(-SWSRC_FIRST_TRIM), - CATEGORY_END(-SWSRC_LAST_SWITCH + 1), 0, - CATEGORY_END(SWSRC_LAST_SWITCH), CATEGORY_END(SWSRC_FIRST_TRIM - 1), - CATEGORY_END(SWSRC_FIRST_LOGICAL_SWITCH - 1), SWSRC_LAST) - -extern int checkIncDecSelection; +#define POS_HORZ_INIT(posVert) 0 int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_flags, IsValueAvailable isValueAvailable, @@ -98,7 +74,7 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, } } while (isValueAvailable && !isValueAvailable(newval) && newval >= i_min); - + if (newval < i_min) { newval = val; killEvents(event); @@ -106,35 +82,7 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, } } -#if defined(AUTOSWITCH) - if (i_flags & INCDEC_SWITCH) { - newval = checkIncDecMovedSwitch(newval); - } -#endif - -#if defined(AUTOSOURCE) - if (i_flags & (INCDEC_SOURCE|INCDEC_SOURCE_VALUE)) { - int source = GET_MOVED_SOURCE(i_min, i_max); - if (source) { - if (i_flags & INCDEC_SOURCE_VALUE) { - if (isSource) { - // Only use moved source if already a source value - newval = source; - } - } else { - newval = source; - } - } -#if defined(AUTOSWITCH) - else { - uint8_t swtch = abs(getMovedSwitch()); - if (swtch && !IS_SWITCH_MULTIPOS(swtch)) { - newval = switchToMix(swtch); - } - } -#endif - } -#endif + newval = checkMovedInput(newval, i_min, i_max, i_flags, isSource); if (invert) { newval = -newval; @@ -142,99 +90,11 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, } } - if (i_min == 0 && i_max == 1 && - (event == EVT_KEY_BREAK(KEY_ENTER))) { - s_editMode = 0; - newval = !val; - } + newval = checkBoolean(event, i_min, i_max, newval, val); - if (i_flags & (INCDEC_SOURCE | INCDEC_SOURCE_VALUE)) { - if (event == EVT_KEY_LONG(KEY_ENTER)) { - checkIncDecSelection = MIXSRC_NONE; + newval = showPopupMenus(event, newval, i_min, i_max, i_flags, isValueAvailable, isSource); - if (i_flags & INCDEC_SOURCE_VALUE && isSource) { - POPUP_MENU_ADD_ITEM(STR_CONSTANT); - } - - if (i_min <= MIXSRC_FIRST_INPUT && i_max >= MIXSRC_FIRST_INPUT) { - if (getFirstAvailable(MIXSRC_FIRST_INPUT, MIXSRC_LAST_INPUT, isInputAvailable) != MIXSRC_NONE && - (i_flags & INCDEC_SOURCE_NOINPUTS) == 0) { - POPUP_MENU_ADD_ITEM(STR_MENU_INPUTS); - } - } -#if defined(LUA_MODEL_SCRIPTS) - if (i_min <= MIXSRC_FIRST_LUA && i_max >= MIXSRC_FIRST_LUA) { - if (getFirstAvailable(MIXSRC_FIRST_LUA, MIXSRC_LAST_LUA, isSourceAvailable) != MIXSRC_NONE) { - POPUP_MENU_ADD_ITEM(STR_MENU_LUA); - } - } -#endif - if (i_min <= MIXSRC_FIRST_STICK && i_max >= MIXSRC_FIRST_STICK) POPUP_MENU_ADD_ITEM(STR_MENU_STICKS); - if (i_min <= MIXSRC_FIRST_POT && i_max >= MIXSRC_FIRST_POT) POPUP_MENU_ADD_ITEM(STR_MENU_POTS); - if (i_min <= MIXSRC_MIN && i_max >= MIXSRC_MIN) POPUP_MENU_ADD_ITEM(STR_MENU_MIN); - if (i_min <= MIXSRC_MAX && i_max >= MIXSRC_MAX) POPUP_MENU_ADD_ITEM(STR_MENU_MAX); -#if defined(HELI) - if (modelHeliEnabled()) - if (i_min <= MIXSRC_FIRST_HELI && i_max >= MIXSRC_FIRST_HELI && isValueAvailable && isValueAvailable(MIXSRC_FIRST_HELI)) - POPUP_MENU_ADD_ITEM(STR_MENU_HELI); -#endif - if (i_min <= MIXSRC_FIRST_TRIM && i_max >= MIXSRC_FIRST_TRIM) POPUP_MENU_ADD_ITEM(STR_MENU_TRIMS); - if (i_min <= MIXSRC_FIRST_SWITCH && i_max >= MIXSRC_FIRST_SWITCH) POPUP_MENU_ADD_ITEM(STR_MENU_SWITCHES); - if (i_min <= MIXSRC_FIRST_TRAINER && i_max >= MIXSRC_FIRST_TRAINER) POPUP_MENU_ADD_ITEM(STR_MENU_TRAINER); - if (i_min <= MIXSRC_FIRST_CH && i_max >= MIXSRC_FIRST_CH) POPUP_MENU_ADD_ITEM(STR_MENU_CHANNELS); - if (i_min <= MIXSRC_FIRST_GVAR && i_max >= MIXSRC_FIRST_GVAR && isValueAvailable && isValueAvailable(MIXSRC_FIRST_GVAR)) { - POPUP_MENU_ADD_ITEM(STR_MENU_GVARS); - } - - if (modelTelemetryEnabled() && i_min <= MIXSRC_FIRST_TELEM && i_max >= MIXSRC_FIRST_TELEM) { - for (int i = 0; i < MAX_TELEMETRY_SENSORS; i++) { - TelemetrySensor * sensor = & g_model.telemetrySensors[i]; - if (sensor->isAvailable()) { - POPUP_MENU_ADD_ITEM(STR_MENU_TELEMETRY); - break; - } - } - } - if (i_flags & INCDEC_SOURCE_INVERT) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT); - POPUP_MENU_START(onSourceLongEnterPress); - } - if (checkIncDecSelection != 0) { - if (i_flags & INCDEC_SOURCE_VALUE) { - if (checkIncDecSelection == MIXSRC_VALUE) { - newval = 0; - isSource = false; - } else { - newval = (checkIncDecSelection == MIXSRC_INVERT ? -newval : checkIncDecSelection); - if (checkIncDecSelection != MIXSRC_INVERT) - isSource = true; - } - } else { - newval = (checkIncDecSelection == MIXSRC_INVERT ? -newval : checkIncDecSelection); - } - if (checkIncDecSelection != MIXSRC_MIN && checkIncDecSelection != MIXSRC_MAX) - s_editMode = EDIT_MODIFY_FIELD; - checkIncDecSelection = 0; - } - } - - if (newval != val) { - if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && - (newval != i_min) && stops.contains(newval)) { - bool pause = (newval > val ? !stops.contains(newval + 1) - : !stops.contains(newval - 1)); - if (pause) { - pauseEvents(event); // delay before auto-repeat continues - } - } - if (!IS_KEY_REPT(event)) { - AUDIO_KEY_PRESS(); - } - storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); - checkIncDec_Ret = (newval > val ? 1 : -1); - } - else { - checkIncDec_Ret = 0; - } + finishCheckIncDec(event, i_min, i_max, i_flags, newval, val, stops); if (i_flags & INCDEC_SOURCE_VALUE) { SourceNumVal v; @@ -246,48 +106,36 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, return newval; } -#define SCROLL_POT1_TH 32 - -#define CURSOR_NOT_ALLOWED_IN_ROW(row) ((int8_t)MAXCOL(row) < 0) - -#define INC(val, min, max) if (valmin) {val--;} else {val=max;} - -tmr10ms_t menuEntryTime; - -#define MAXCOL_RAW(row) (horTab ? *(horTab+min(row, (vertpos_t)horTabMax)) : (const uint8_t)0) -#define MAXCOL(row) (MAXCOL_RAW(row) >= HIDDEN_ROW ? MAXCOL_RAW(row) : (const uint8_t)(MAXCOL_RAW(row) & (~NAVIGATION_LINE_BY_LINE))) -#define POS_HORZ_INIT(posVert) 0 - -uint8_t chgMenu(uint8_t curr, const MenuHandler * menuTab, uint8_t menuTabSize, int direction) +vertpos_t prevRow(vertpos_t l_posVert, vertpos_t maxrow, bool wrap, + horzpos_t& l_posHorz, const uint8_t *horTab, uint8_t horTabMax) { - int cc = curr + direction; - while (cc != curr) { - if (cc < 0) - cc = menuTabSize - 1; - else if (cc >= menuTabSize) - cc = 0; - if (menuTab[cc].isEnabled()) - return cc; - cc += direction; - } - return curr; -} - -uint8_t menuSize(const MenuHandler * menuTab, uint8_t menuTabSize) -{ - uint8_t sz = 0; - for (int i = 0; i < menuTabSize; i += 1) { - if (menuTab[i].isEnabled()) { - sz += 1; + if (s_editMode <= 0) { + vertpos_t origPos = l_posVert; + do { + DEC(l_posVert, 0, maxrow - 1); + } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); + if (origPos == 0 && !wrap) { + l_posVert = origPos; } } - return sz; + l_posHorz = min(l_posHorz, MAXCOL(l_posVert)); + return l_posVert; } -uint8_t menuIdx(const MenuHandler * menuTab, uint8_t curr) +vertpos_t nextRow(vertpos_t l_posVert, vertpos_t maxrow, bool wrap, + horzpos_t& l_posHorz, const uint8_t *horTab, uint8_t horTabMax) { - return menuSize(menuTab, curr + 1) - 1; + if (s_editMode <= 0) { + vertpos_t origPos = l_posVert; + do { + INC(l_posVert, 0, maxrow - 1); + } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); + if (l_posVert == 0 && !wrap) { + l_posVert = origPos; + } + } + l_posHorz = min(l_posHorz, MAXCOL(l_posVert)); + return l_posVert; } void check(event_t event, uint8_t curr, const MenuHandler *menuTab, @@ -324,7 +172,6 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, menuCalibrationState = 0; drawScreenIndex(menuIdx(menuTab, curr), menuSize(menuTab, menuTabSize), attr); - } switch (event) { @@ -336,7 +183,7 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, break; case EVT_KEY_BREAK(KEY_ENTER): - if (!menuTab || l_posVert>0) { + if (!menuTab || l_posVert > 0) { s_editMode = (s_editMode <= 0); } break; @@ -348,12 +195,12 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, case EVT_KEY_BREAK(KEY_EXIT): AUDIO_KEY_PRESS(); - if (s_editMode>0) { + if (s_editMode > 0) { s_editMode = 0; break; } - if (l_posVert==0 || !menuTab) { + if (l_posVert == 0 || !menuTab) { popMenu(); // beeps itself } else { @@ -363,52 +210,48 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, break; case EVT_KEY_REPT(KEY_RIGHT): //inc - if (l_posHorz==maxcol) break; + if (l_posHorz == maxcol) break; // no break case EVT_KEY_FIRST(KEY_RIGHT)://inc - if (!horTab || s_editMode>0) break; + if (!horTab || s_editMode > 0) break; INC(l_posHorz, 0, maxcol); break; case EVT_KEY_REPT(KEY_DOWN): - if (l_posVert==maxrow) break; - // no break + l_posVert = nextRow(l_posVert, maxrow, false, l_posHorz, horTab, horTabMax); + break; case EVT_KEY_FIRST(KEY_DOWN): - if (s_editMode>0) break; - do { - INC(l_posVert, 0, maxrow - 1); - } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); - l_posHorz = min(l_posHorz, MAXCOL(l_posVert)); + l_posVert = nextRow(l_posVert, maxrow, true, l_posHorz, horTab, horTabMax); break; case EVT_KEY_REPT(KEY_LEFT): //dec - if (l_posHorz==0) break; + if (l_posHorz == 0) break; // no break case EVT_KEY_FIRST(KEY_LEFT)://dec - if (!horTab || s_editMode>0) break; + if (!horTab || s_editMode > 0) break; DEC(l_posHorz, 0, maxcol); break; case EVT_KEY_REPT(KEY_UP): - if (l_posVert==0) break; - // no break - case EVT_KEY_FIRST(KEY_UP): - if (s_editMode>0) break; + l_posVert = prevRow(l_posVert, maxrow, false, l_posHorz, horTab, horTabMax); + break; - do { - DEC(l_posVert, 0, maxrow - 1); - } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); - l_posHorz = min((uint8_t)l_posHorz, MAXCOL(l_posVert)); + case EVT_KEY_FIRST(KEY_UP): + l_posVert = prevRow(l_posVert, maxrow, true, l_posHorz, horTab, horTabMax); break; } uint8_t maxLines = menuTab ? LCD_LINES-1 : LCD_LINES-2; int linesCount = maxrow; - if (l_posVert == 0 || (l_posVert==1 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW) || (l_posVert==2 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW && MAXCOL(vertpos_t(1)) >= HIDDEN_ROW)) { + + if (l_posVert == 0 || + (l_posVert==1 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW) || + (l_posVert==2 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW && + MAXCOL(vertpos_t(1)) >= HIDDEN_ROW)) { menuVerticalOffset = 0; if (horTab) { linesCount = 0; @@ -418,8 +261,7 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, } } } - } - else if (horTab) { + } else if (horTab) { if (maxrow > maxLines) { while (1) { vertpos_t firstLine = 0; @@ -453,8 +295,7 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, } } } - } - else { + } else { if (l_posVert>maxLines+menuVerticalOffset) { menuVerticalOffset = l_posVert-maxLines; } diff --git a/radio/src/gui/navigation/navigation_x7.cpp b/radio/src/gui/navigation/navigation_x7.cpp index 07f63eb30..d1ef0e83e 100644 --- a/radio/src/gui/navigation/navigation_x7.cpp +++ b/radio/src/gui/navigation/navigation_x7.cpp @@ -19,32 +19,15 @@ * GNU General Public License for more details. */ -#include "opentx.h" -#include "navigation.h" - -#include "switches.h" #include "hal/rotary_encoder.h" -vertpos_t menuVerticalOffset; -vertpos_t menuVerticalPosition; -horzpos_t menuHorizontalPosition; +#define COLATTR(row) (MAXCOL_RAW(row) == (uint8_t)-1 ? (const uint8_t)0 : (const uint8_t)(MAXCOL_RAW(row) & NAVIGATION_LINE_BY_LINE)) +#define POS_HORZ_INIT(posVert) ((COLATTR(posVert) & NAVIGATION_LINE_BY_LINE) ? -1 : 0) -int8_t s_editMode; -uint8_t noHighlightCounter; -uint8_t menuCalibrationState; - -int8_t checkIncDec_Ret; - -INIT_STOPS(stops100, 3, -100, 0, 100) -INIT_STOPS(stops1000, 3, -1000, 0, 1000) -INIT_STOPS(stopsSwitch, 15, SWSRC_FIRST, - CATEGORY_END(-SWSRC_FIRST_LOGICAL_SWITCH), - CATEGORY_END(-SWSRC_FIRST_TRIM), - CATEGORY_END(-SWSRC_LAST_SWITCH + 1), 0, - CATEGORY_END(SWSRC_LAST_SWITCH), CATEGORY_END(SWSRC_FIRST_TRIM - 1), - CATEGORY_END(SWSRC_FIRST_LOGICAL_SWITCH - 1), SWSRC_LAST) - -extern int checkIncDecSelection; +#if LCD_W >= 212 +#define DEFAULT_SCROLLBAR_X (LCD_W-1) +coord_t scrollbar_X = DEFAULT_SCROLLBAR_X; +#endif int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_flags, IsValueAvailable isValueAvailable, @@ -116,35 +99,7 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, } } -#if defined(AUTOSWITCH) - if (i_flags & INCDEC_SWITCH) { - newval = checkIncDecMovedSwitch(newval); - } -#endif - -#if defined(AUTOSOURCE) - if (i_flags & (INCDEC_SOURCE|INCDEC_SOURCE_VALUE)) { - int source = GET_MOVED_SOURCE(i_min, i_max); - if (source) { - if (i_flags & INCDEC_SOURCE_VALUE) { - if (isSource) { - // Only use moved source if already a source value - newval = source; - } - } else { - newval = source; - } - } -#if defined(AUTOSWITCH) - else { - unsigned int swtch = abs(getMovedSwitch()); - if (swtch && !IS_SWITCH_MULTIPOS(swtch)) { - newval = switchToMix(swtch); - } - } -#endif - } -#endif + newval = checkMovedInput(newval, i_min, i_max, i_flags, isSource); if (invert) { newval = -newval; @@ -152,113 +107,11 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, } } - if (i_min == 0 && i_max == 1 && - event == EVT_KEY_BREAK(KEY_ENTER)) { - s_editMode = 0; - newval = !val; - } + newval = checkBoolean(event, i_min, i_max, newval, val); - if (i_flags & (INCDEC_SOURCE | INCDEC_SOURCE_VALUE)) { - if (event == EVT_KEY_LONG(KEY_ENTER)) { - checkIncDecSelection = MIXSRC_NONE; + newval = showPopupMenus(event, newval, i_min, i_max, i_flags, isValueAvailable, isSource); - if (i_flags & INCDEC_SOURCE_VALUE && isSource) { - POPUP_MENU_ADD_ITEM(STR_CONSTANT); - } - - if (i_min <= MIXSRC_FIRST_INPUT && i_max >= MIXSRC_FIRST_INPUT) { - if (getFirstAvailable(MIXSRC_FIRST_INPUT, MIXSRC_LAST_INPUT, isInputAvailable) != MIXSRC_NONE && - (i_flags & INCDEC_SOURCE_NOINPUTS) == 0) { - POPUP_MENU_ADD_ITEM(STR_MENU_INPUTS); - } - } -#if defined(LUA_MODEL_SCRIPTS) - if (i_min <= MIXSRC_FIRST_LUA && i_max >= MIXSRC_FIRST_LUA) { - if (getFirstAvailable(MIXSRC_FIRST_LUA, MIXSRC_LAST_LUA, isSourceAvailable) != MIXSRC_NONE && - (i_flags & INCDEC_SOURCE_NOINPUTS) == 0) { - POPUP_MENU_ADD_ITEM(STR_MENU_LUA); - } - } -#endif - if (i_min <= MIXSRC_FIRST_STICK && i_max >= MIXSRC_FIRST_STICK) POPUP_MENU_ADD_ITEM(STR_MENU_STICKS); - if (i_min <= MIXSRC_FIRST_POT && i_max >= MIXSRC_FIRST_POT) POPUP_MENU_ADD_ITEM(STR_MENU_POTS); - if (i_min <= MIXSRC_MIN && i_max >= MIXSRC_MIN) POPUP_MENU_ADD_ITEM(STR_MENU_MIN); - if (i_min <= MIXSRC_MAX && i_max >= MIXSRC_MAX) POPUP_MENU_ADD_ITEM(STR_MENU_MAX); -#if defined(HELI) - if (modelHeliEnabled()) - if (i_min <= MIXSRC_FIRST_HELI && i_max >= MIXSRC_FIRST_HELI && isValueAvailable && isValueAvailable(MIXSRC_FIRST_HELI)) - POPUP_MENU_ADD_ITEM(STR_MENU_HELI); -#endif - if (i_min <= MIXSRC_FIRST_TRIM && i_max >= MIXSRC_FIRST_TRIM) POPUP_MENU_ADD_ITEM(STR_MENU_TRIMS); - if (i_min <= MIXSRC_FIRST_SWITCH && i_max >= MIXSRC_FIRST_SWITCH) POPUP_MENU_ADD_ITEM(STR_MENU_SWITCHES); - if (i_min <= MIXSRC_FIRST_TRAINER && i_max >= MIXSRC_FIRST_TRAINER) POPUP_MENU_ADD_ITEM(STR_MENU_TRAINER); - if (i_min <= MIXSRC_FIRST_CH && i_max >= MIXSRC_FIRST_CH) POPUP_MENU_ADD_ITEM(STR_MENU_CHANNELS); - if (i_min <= MIXSRC_FIRST_GVAR && i_max >= MIXSRC_FIRST_GVAR && isValueAvailable && isValueAvailable(MIXSRC_FIRST_GVAR)) { - POPUP_MENU_ADD_ITEM(STR_MENU_GVARS); - } - - if (modelTelemetryEnabled() && i_min <= MIXSRC_FIRST_TELEM && i_max >= MIXSRC_FIRST_TELEM) { - for (int i = 0; i < MAX_TELEMETRY_SENSORS; i++) { - TelemetrySensor * sensor = & g_model.telemetrySensors[i]; - if (sensor->isAvailable()) { - POPUP_MENU_ADD_ITEM(STR_MENU_TELEMETRY); - break; - } - } - } - if (i_flags & INCDEC_SOURCE_INVERT) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT); - POPUP_MENU_START(onSourceLongEnterPress); - } - if (checkIncDecSelection != 0) { - if (i_flags & INCDEC_SOURCE_VALUE) { - if (checkIncDecSelection == MIXSRC_VALUE) { - newval = 0; - isSource = false; - } else { - newval = (checkIncDecSelection == MIXSRC_INVERT ? -newval : checkIncDecSelection); - if (checkIncDecSelection != MIXSRC_INVERT) - isSource = true; - } - } else { - newval = (checkIncDecSelection == MIXSRC_INVERT ? -newval : checkIncDecSelection); - } - if (checkIncDecSelection != MIXSRC_MIN && checkIncDecSelection != MIXSRC_MAX) - s_editMode = EDIT_MODIFY_FIELD; - checkIncDecSelection = 0; - } - } - else if (i_flags & INCDEC_SWITCH) { - if (event == EVT_KEY_LONG(KEY_ENTER)) { - checkIncDecSelection = SWSRC_NONE; - if (i_min <= SWSRC_FIRST_SWITCH && i_max >= SWSRC_LAST_SWITCH) POPUP_MENU_ADD_ITEM(STR_MENU_SWITCHES); - if (i_min <= SWSRC_FIRST_TRIM && i_max >= SWSRC_LAST_TRIM) POPUP_MENU_ADD_ITEM(STR_MENU_TRIMS); - if (i_min <= SWSRC_FIRST_LOGICAL_SWITCH && i_max >= SWSRC_LAST_LOGICAL_SWITCH) { - for (int i = 0; i < MAX_LOGICAL_SWITCHES; i++) { - if (isValueAvailable && isValueAvailable(SWSRC_FIRST_LOGICAL_SWITCH+i)) { - POPUP_MENU_ADD_ITEM(STR_MENU_LOGICAL_SWITCHES); - break; - } - } - } - if (isValueAvailable && isValueAvailable(SWSRC_ON)) POPUP_MENU_ADD_ITEM(STR_MENU_OTHER); - if (isValueAvailable && isValueAvailable(-newval)) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT); - POPUP_MENU_START(onSwitchLongEnterPress); - s_editMode = EDIT_MODIFY_FIELD; - } - if (checkIncDecSelection != 0) { - newval = (checkIncDecSelection == SWSRC_INVERT ? -newval : checkIncDecSelection); - s_editMode = EDIT_MODIFY_FIELD; - checkIncDecSelection = 0; - } - } - - if (newval != val || isSource != origIsSource) { - storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); - checkIncDec_Ret = (newval > val ? 1 : -1); - } - else { - checkIncDec_Ret = 0; - } + finishCheckIncDec(event, i_min, i_max, i_flags, newval, val, stops); if (i_flags & INCDEC_SOURCE_VALUE) { SourceNumVal v; @@ -270,49 +123,14 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, return newval; } -#define SCROLL_POT1_TH 32 - -#define CURSOR_NOT_ALLOWED_IN_ROW(row) ((int8_t)MAXCOL(row) < 0) - -#define INC(val, min, max) if (valmin) {val--;} else {val=max;} - -tmr10ms_t menuEntryTime; - -#define MAXCOL_RAW(row) (horTab ? *(horTab+min(row, (vertpos_t)horTabMax)) : (const uint8_t)0) -#define MAXCOL(row) (MAXCOL_RAW(row) >= HIDDEN_ROW ? MAXCOL_RAW(row) : (const uint8_t)(MAXCOL_RAW(row) & (~NAVIGATION_LINE_BY_LINE))) -#define COLATTR(row) (MAXCOL_RAW(row) == (uint8_t)-1 ? (const uint8_t)0 : (const uint8_t)(MAXCOL_RAW(row) & NAVIGATION_LINE_BY_LINE)) -#define POS_HORZ_INIT(posVert) ((COLATTR(posVert) & NAVIGATION_LINE_BY_LINE) ? -1 : 0) - -uint8_t chgMenu(uint8_t curr, const MenuHandler * menuTab, uint8_t menuTabSize, int direction) +void onLongMenuPress(const char * result) { - int cc = curr + direction; - while (cc != curr) { - if (cc < 0) - cc = menuTabSize - 1; - else if (cc >= menuTabSize) - cc = 0; - if (menuTab[cc].isEnabled()) - return cc; - cc += direction; + if (result == STR_VIEW_CHANNELS) { + pushMenu(menuChannelsView); } - return curr; -} - -uint8_t menuSize(const MenuHandler * menuTab, uint8_t menuTabSize) -{ - uint8_t sz = 0; - for (int i = 0; i < menuTabSize; i += 1) { - if (menuTab[i].isEnabled()) { - sz += 1; - } + else if (result == STR_VIEW_NOTES) { + pushModelNotes(); } - return sz; -} - -uint8_t menuIdx(const MenuHandler * menuTab, uint8_t curr) -{ - return menuSize(menuTab, curr + 1) - 1; } void check(event_t event, uint8_t curr, const MenuHandler *menuTab, @@ -327,6 +145,20 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, if (menuTab) { int cc = curr; switch (event) { + case EVT_KEY_LONG(KEY_MENU): + case EVT_KEY_LONG(KEY_MODEL): + if (menuTab == menuTabModel) { + if (modelHasNotes()) { + POPUP_MENU_ADD_SD_ITEM(STR_VIEW_CHANNELS); + POPUP_MENU_ADD_ITEM(STR_VIEW_NOTES); + POPUP_MENU_START(onLongMenuPress); + } + else { + pushMenu(menuChannelsView); + } + } + break; + case EVT_KEY_BREAK(KEY_PAGEUP): if (s_editMode>0) break; @@ -346,7 +178,13 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, chainMenu(menuTab[cc].menuFunc); } - drawScreenIndex(menuIdx(menuTab, curr), menuSize(menuTab, menuTabSize), 0); + if (!(flags&CHECK_FLAG_NO_SCREEN_INDEX)) { + drawScreenIndex(menuIdx(menuTab, curr), menuSize(menuTab, menuTabSize), 0); + } + +#if LCD_W >= 212 + lcdDrawFilledRect(0, 0, LCD_W, MENU_HEADER_HEIGHT, SOLID, FILL_WHITE|GREY_DEFAULT); +#endif } switch (event) { @@ -355,12 +193,18 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, s_editMode = EDIT_MODE_INIT; l_posVert = MENU_FIRST_LINE_EDIT(horTab, horTabMax); l_posHorz = POS_HORZ_INIT(l_posVert); +#if LCD_W >= 212 + scrollbar_X = DEFAULT_SCROLLBAR_X; +#endif break; case EVT_ENTRY_UP: menuEntryTime = get_tmr10ms(); s_editMode = 0; l_posHorz = POS_HORZ_INIT(l_posVert); +#if LCD_W >= 212 + scrollbar_X = DEFAULT_SCROLLBAR_X; +#endif break; case EVT_KEY_BREAK(KEY_ENTER): @@ -410,7 +254,7 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, case EVT_KEY_FIRST(KEY_MINUS): case EVT_KEY_REPT(KEY_MINUS): AUDIO_KEY_PRESS(); - if (s_editMode > 0) break; // TODO it was != + if (s_editMode > 0) break; if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { if (l_posHorz >= 0) { INC(l_posHorz, 0, maxcol); @@ -436,7 +280,7 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, INC(l_posVert, MENU_FIRST_LINE_EDIT(horTab, horTabMax), rowcount - 1); } #else - INC(l_posVert, MENU_FIRST_LINE_EDIT(horTab, horTabMax), rowcount-1); + INC(l_posVert, MENU_FIRST_LINE_EDIT(horTab, horTabMax), rowcount - 1); #endif } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); @@ -449,7 +293,7 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, case EVT_KEY_FIRST(KEY_PLUS): case EVT_KEY_REPT(KEY_PLUS): AUDIO_KEY_PRESS(); - if (s_editMode > 0) break; // TODO it was != + if (s_editMode > 0) break; if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { if (l_posHorz >= 0) { DEC(l_posHorz, 0, maxcol); @@ -478,7 +322,7 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, DEC(l_posVert, MENU_FIRST_LINE_EDIT(horTab, horTabMax), rowcount - 1); } #else - DEC(l_posVert, MENU_FIRST_LINE_EDIT(horTab, horTabMax), rowcount-1); + DEC(l_posVert, MENU_FIRST_LINE_EDIT(horTab, horTabMax), rowcount - 1); #endif } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); @@ -550,6 +394,12 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, } } +#if LCD_W >= 212 + if (scrollbar_X && linesCount > NUM_BODY_LINES) { + drawVerticalScrollbar(scrollbar_X, MENU_HEADER_HEIGHT, LCD_H-MENU_HEADER_HEIGHT, menuVerticalOffset, linesCount, NUM_BODY_LINES); + } +#endif + menuVerticalPosition = l_posVert; menuHorizontalPosition = l_posHorz; } diff --git a/radio/src/gui/navigation/navigation_x9d.cpp b/radio/src/gui/navigation/navigation_x9d.cpp deleted file mode 100644 index 9d52a6abc..000000000 --- a/radio/src/gui/navigation/navigation_x9d.cpp +++ /dev/null @@ -1,617 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "opentx.h" -#include "navigation.h" - -#include "switches.h" -#include "hal/rotary_encoder.h" - -vertpos_t menuVerticalOffset; -vertpos_t menuVerticalPosition; -horzpos_t menuHorizontalPosition; - -int8_t s_editMode; -uint8_t noHighlightCounter; -uint8_t menuCalibrationState; - -int8_t checkIncDec_Ret; - -INIT_STOPS(stops100, 3, -100, 0, 100) -INIT_STOPS(stops1000, 3, -1000, 0, 1000) -INIT_STOPS(stopsSwitch, 15, SWSRC_FIRST, - CATEGORY_END(-SWSRC_FIRST_LOGICAL_SWITCH), - CATEGORY_END(-SWSRC_FIRST_TRIM), - CATEGORY_END(-SWSRC_LAST_SWITCH + 1), 0, - CATEGORY_END(SWSRC_LAST_SWITCH), CATEGORY_END(SWSRC_FIRST_TRIM - 1), - CATEGORY_END(SWSRC_FIRST_LOGICAL_SWITCH - 1), SWSRC_LAST) - -extern int checkIncDecSelection; - -int checkIncDec(event_t event, int val, int i_min, int i_max, - unsigned int i_flags, IsValueAvailable isValueAvailable, - const CheckIncDecStops &stops) -{ - int newval = val; - event_t evt_rot_inc = EVT_ROTARY_RIGHT; - event_t evt_rot_dec = EVT_ROTARY_LEFT; -#if defined(ROTARY_ENCODER_NAVIGATION) - if (g_eeGeneral.rotEncMode == ROTARY_ENCODER_MODE_VERT_NORM_HORZ_INVERT) { - evt_rot_inc = EVT_ROTARY_LEFT; - evt_rot_dec = EVT_ROTARY_RIGHT; - } -#endif - - bool isSource = false; - bool origIsSource = false; - if (i_flags & INCDEC_SOURCE_VALUE) { - SourceNumVal v; - v.rawValue = val; - // Save isSource flag; - origIsSource = isSource = v.isSource; - // Remove isSource flag; - val = v.value; - newval = v.value; - } - - if (s_editMode > 0) { - bool invert = false; - if ((i_flags & INCDEC_SOURCE_INVERT) && (newval < 0)) { - invert = true; - newval = -newval; - val = -val; - } - - if (event == evt_rot_inc || event == EVT_KEY_FIRST(KEY_PLUS) || - event == EVT_KEY_REPT(KEY_PLUS)) { - - if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { - newval += min(10, i_max - val); - } else { - newval += min(rotaryEncoderGetAccel(), i_max - val); - } - - while (isValueAvailable && !isValueAvailable(newval) && newval <= i_max) { - newval++; - } - - if (newval > i_max) { - newval = val; - AUDIO_KEY_ERROR(); - } - } else if (event == evt_rot_dec || event == EVT_KEY_FIRST(KEY_MINUS) || - event == EVT_KEY_REPT(KEY_MINUS)) { - - if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { - newval -= min(10, val - i_min); - } else { - newval -= min(rotaryEncoderGetAccel(), val - i_min); - } - - while (isValueAvailable && !isValueAvailable(newval) && newval >= i_min) { - newval--; - } - - if (newval < i_min) { - newval = val; - AUDIO_KEY_ERROR(); - } - } - -#if defined(AUTOSWITCH) - if (i_flags & INCDEC_SWITCH) { - newval = checkIncDecMovedSwitch(newval); - } -#endif - -#if defined(AUTOSOURCE) - if (i_flags & (INCDEC_SOURCE|INCDEC_SOURCE_VALUE)) { - int source = GET_MOVED_SOURCE(i_min, i_max); - if (source) { - if (i_flags & INCDEC_SOURCE_VALUE) { - if (isSource) { - // Only use moved source if already a source value - newval = source; - } - } else { - newval = source; - } - } -#if defined(AUTOSWITCH) - else { - unsigned int swtch = abs(getMovedSwitch()); - if (swtch && !IS_SWITCH_MULTIPOS(swtch)) { - newval = switchToMix(swtch); - } - } -#endif - } -#endif - - if (invert) { - newval = -newval; - val = -val; - } - } - - if (i_min == 0 && i_max == 1 && - event == EVT_KEY_BREAK(KEY_ENTER)) { - s_editMode = 0; - newval = !val; - } - - if (i_flags & (INCDEC_SOURCE | INCDEC_SOURCE_VALUE)) { - if (event == EVT_KEY_LONG(KEY_ENTER)) { - checkIncDecSelection = MIXSRC_NONE; - - if (i_flags & INCDEC_SOURCE_VALUE && isSource) { - POPUP_MENU_ADD_ITEM(STR_CONSTANT); - } - - if (i_min <= MIXSRC_FIRST_INPUT && i_max >= MIXSRC_FIRST_INPUT) { - if (getFirstAvailable(MIXSRC_FIRST_INPUT, MIXSRC_LAST_INPUT, isInputAvailable) != MIXSRC_NONE && - (i_flags & INCDEC_SOURCE_NOINPUTS) == 0) { - POPUP_MENU_ADD_ITEM(STR_MENU_INPUTS); - } - } -#if defined(LUA_MODEL_SCRIPTS) - if (i_min <= MIXSRC_FIRST_LUA && i_max >= MIXSRC_FIRST_LUA) { - if (getFirstAvailable(MIXSRC_FIRST_LUA, MIXSRC_LAST_LUA, isSourceAvailable) != MIXSRC_NONE) { - POPUP_MENU_ADD_ITEM(STR_MENU_LUA); - } - } -#endif - if (i_min <= MIXSRC_FIRST_STICK && i_max >= MIXSRC_FIRST_STICK) POPUP_MENU_ADD_ITEM(STR_MENU_STICKS); - if (i_min <= MIXSRC_FIRST_POT && i_max >= MIXSRC_FIRST_POT) POPUP_MENU_ADD_ITEM(STR_MENU_POTS); - if (i_min <= MIXSRC_MIN && i_max >= MIXSRC_MIN) POPUP_MENU_ADD_ITEM(STR_MENU_MIN); - if (i_min <= MIXSRC_MAX && i_max >= MIXSRC_MAX) POPUP_MENU_ADD_ITEM(STR_MENU_MAX); -#if defined(HELI) - if (modelHeliEnabled()) - if (i_min <= MIXSRC_FIRST_HELI && i_max >= MIXSRC_FIRST_HELI && isValueAvailable && isValueAvailable(MIXSRC_FIRST_HELI)) - POPUP_MENU_ADD_ITEM(STR_MENU_HELI); -#endif - if (i_min <= MIXSRC_FIRST_TRIM && i_max >= MIXSRC_FIRST_TRIM) POPUP_MENU_ADD_ITEM(STR_MENU_TRIMS); - if (i_min <= MIXSRC_FIRST_SWITCH && i_max >= MIXSRC_FIRST_SWITCH) POPUP_MENU_ADD_ITEM(STR_MENU_SWITCHES); - if (i_min <= MIXSRC_FIRST_TRAINER && i_max >= MIXSRC_FIRST_TRAINER) POPUP_MENU_ADD_ITEM(STR_MENU_TRAINER); - if (i_min <= MIXSRC_FIRST_CH && i_max >= MIXSRC_FIRST_CH) POPUP_MENU_ADD_ITEM(STR_MENU_CHANNELS); - if (i_min <= MIXSRC_FIRST_GVAR && i_max >= MIXSRC_FIRST_GVAR && isValueAvailable && isValueAvailable(MIXSRC_FIRST_GVAR)) { - POPUP_MENU_ADD_ITEM(STR_MENU_GVARS); - } - - if (modelTelemetryEnabled() && i_min <= MIXSRC_FIRST_TELEM && i_max >= MIXSRC_FIRST_TELEM) { - for (int i = 0; i < MAX_TELEMETRY_SENSORS; i++) { - TelemetrySensor * sensor = & g_model.telemetrySensors[i]; - if (sensor->isAvailable()) { - POPUP_MENU_ADD_ITEM(STR_MENU_TELEMETRY); - break; - } - } - } - if (i_flags & INCDEC_SOURCE_INVERT) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT); - POPUP_MENU_START(onSourceLongEnterPress); - } - if (checkIncDecSelection != 0) { - if (i_flags & INCDEC_SOURCE_VALUE) { - if (checkIncDecSelection == MIXSRC_VALUE) { - newval = 0; - isSource = false; - } else { - newval = (checkIncDecSelection == MIXSRC_INVERT ? -newval : checkIncDecSelection); - if (checkIncDecSelection != MIXSRC_INVERT) - isSource = true; - } - } else { - newval = (checkIncDecSelection == MIXSRC_INVERT ? -newval : checkIncDecSelection); - } - if (checkIncDecSelection != MIXSRC_MIN && checkIncDecSelection != MIXSRC_MAX) - s_editMode = EDIT_MODIFY_FIELD; - checkIncDecSelection = 0; - } - } - else if (i_flags & INCDEC_SWITCH) { - if (event == EVT_KEY_LONG(KEY_ENTER)) { - checkIncDecSelection = SWSRC_NONE; - if (i_min <= SWSRC_FIRST_SWITCH && i_max >= SWSRC_LAST_SWITCH) POPUP_MENU_ADD_ITEM(STR_MENU_SWITCHES); - if (i_min <= SWSRC_FIRST_TRIM && i_max >= SWSRC_LAST_TRIM) POPUP_MENU_ADD_ITEM(STR_MENU_TRIMS); - if (i_min <= SWSRC_FIRST_LOGICAL_SWITCH && i_max >= SWSRC_LAST_LOGICAL_SWITCH) { - for (int i = 0; i < MAX_LOGICAL_SWITCHES; i++) { - if (isValueAvailable && isValueAvailable(SWSRC_FIRST_LOGICAL_SWITCH+i)) { - POPUP_MENU_ADD_ITEM(STR_MENU_LOGICAL_SWITCHES); - break; - } - } - } - if (isValueAvailable && isValueAvailable(SWSRC_ON)) POPUP_MENU_ADD_ITEM(STR_MENU_OTHER); - if (isValueAvailable && isValueAvailable(-newval)) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT); - POPUP_MENU_START(onSwitchLongEnterPress); - s_editMode = EDIT_MODIFY_FIELD; - } - if (checkIncDecSelection != 0) { - newval = (checkIncDecSelection == SWSRC_INVERT ? -newval : checkIncDecSelection); - s_editMode = EDIT_MODIFY_FIELD; - checkIncDecSelection = 0; - } - } - - if (newval != val) { -#if !defined(ROTARY_ENCODER_NAVIGATION) - if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && - (newval != i_min) && stops.contains(newval)) { - bool pause = (newval > val ? !stops.contains(newval + 1) - : !stops.contains(newval - 1)); - if (pause) { - pauseEvents(event); // delay before auto-repeat continues - } - } - if (!IS_KEY_REPT(event)) { - AUDIO_KEY_PRESS(); - } -#endif - storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); - checkIncDec_Ret = (newval > val ? 1 : -1); - } - else { - checkIncDec_Ret = 0; - } - - if (newval != val) { -#if !defined(ROTARY_ENCODER_NAVIGATION) - if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && - (newval != i_min) && stops.contains(newval)) { - bool pause = (newval > val ? !stops.contains(newval + 1) - : !stops.contains(newval - 1)); - if (pause) { - pauseEvents(event); // delay before auto-repeat continues - } - } - if (!IS_KEY_REPT(event)) { - AUDIO_KEY_PRESS(); - } -#endif - storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); - checkIncDec_Ret = (newval > val ? 1 : -1); - } - else { - checkIncDec_Ret = 0; - } - - if (i_flags & INCDEC_SOURCE_VALUE) { - SourceNumVal v; - v.isSource = isSource; - v.value = newval; - newval = v.rawValue; - } - - return newval; -} - -#define CURSOR_NOT_ALLOWED_IN_ROW(row) ((int8_t)MAXCOL(row) < 0) -#define MAXCOL_RAW(row) (horTab ? *(horTab+min(row, (vertpos_t)horTabMax)) : (const uint8_t)0) -#define MAXCOL(row) (MAXCOL_RAW(row) >= HIDDEN_ROW ? MAXCOL_RAW(row) : (const uint8_t)(MAXCOL_RAW(row) & (~NAVIGATION_LINE_BY_LINE))) -#define COLATTR(row) (MAXCOL_RAW(row) == (uint8_t)-1 ? (const uint8_t)0 : (const uint8_t)(MAXCOL_RAW(row) & NAVIGATION_LINE_BY_LINE)) -#define INC(val, min, max) if (valmin) {val=min;} -#define DEC(val, min, max) if (val>min) {val--;} else {val=max;} - -coord_t scrollbar_X = DEFAULT_SCROLLBAR_X; - -void onLongMenuPress(const char * result) -{ - if (result == STR_VIEW_CHANNELS) { - pushMenu(menuChannelsView); - } - else if (result == STR_VIEW_NOTES) { - pushModelNotes(); - } -} - -tmr10ms_t menuEntryTime; - -uint8_t chgMenu(uint8_t curr, const MenuHandler * menuTab, uint8_t menuTabSize, int direction) -{ - int cc = curr + direction; - while (cc != curr) { - if (cc < 0) - cc = menuTabSize - 1; - else if (cc >= menuTabSize) - cc = 0; - if (menuTab[cc].isEnabled()) - return cc; - cc += direction; - } - return curr; -} - -uint8_t menuSize(const MenuHandler * menuTab, uint8_t menuTabSize) -{ - uint8_t sz = 0; - for (int i = 0; i < menuTabSize; i += 1) { - if (menuTab[i].isEnabled()) { - sz += 1; - } - } - return sz; -} - -uint8_t menuIdx(const MenuHandler * menuTab, uint8_t curr) -{ - return menuSize(menuTab, curr + 1) - 1; -} - -void check(event_t event, uint8_t curr, const MenuHandler *menuTab, - uint8_t menuTabSize, const uint8_t *horTab, uint8_t horTabMax, - vertpos_t rowcount, uint8_t flags) -{ - vertpos_t l_posVert = menuVerticalPosition; - horzpos_t l_posHorz = menuHorizontalPosition; - - uint8_t maxcol = MAXCOL(l_posVert); - - if (menuTab) { - int cc = curr; - switch (event) { - case EVT_KEY_LONG(KEY_MENU): - if (menuTab == menuTabModel) { - if (modelHasNotes()) { - POPUP_MENU_ADD_SD_ITEM(STR_VIEW_CHANNELS); - POPUP_MENU_ADD_ITEM(STR_VIEW_NOTES); - POPUP_MENU_START(onLongMenuPress); - } - else { - pushMenu(menuChannelsView); - } - } - break; - - case EVT_KEY_BREAK(KEY_PAGEUP): - if (s_editMode>0) - break; - - cc = chgMenu(curr, menuTab, menuTabSize, -1); - break; - - case EVT_KEY_BREAK(KEY_PAGEDN): - if (s_editMode>0) - break; - - cc = chgMenu(curr, menuTab, menuTabSize, 1); - break; - } - - if (!menuCalibrationState && cc != curr) { - chainMenu(menuTab[cc].menuFunc); - } - - if (!(flags&CHECK_FLAG_NO_SCREEN_INDEX)) { - drawScreenIndex(menuIdx(menuTab, curr), menuSize(menuTab, menuTabSize), 0); - } - - lcdDrawFilledRect(0, 0, LCD_W, MENU_HEADER_HEIGHT, SOLID, FILL_WHITE|GREY_DEFAULT); - } - - switch (event) { - case EVT_ENTRY: - menuEntryTime = get_tmr10ms(); - s_editMode = EDIT_MODE_INIT; - l_posVert = MENU_FIRST_LINE_EDIT(horTab, horTabMax); - l_posHorz = POS_HORZ_INIT(l_posVert); - SET_SCROLLBAR_X(LCD_W-1); - break; - - case EVT_ENTRY_UP: - menuEntryTime = get_tmr10ms(); - s_editMode = 0; - l_posHorz = POS_HORZ_INIT(l_posVert); - SET_SCROLLBAR_X(LCD_W-1); - break; - - case EVT_KEY_BREAK(KEY_ENTER): - if (s_editMode > 1) - break; - if (menuHorizontalPosition < 0 && maxcol > 0) { - l_posHorz = 0; - AUDIO_KEY_PRESS(); - } - else { - s_editMode = (s_editMode<=0); - AUDIO_KEY_PRESS(); - } - break; - - case EVT_KEY_LONG(KEY_EXIT): - s_editMode = 0; // TODO needed? we call ENTRY_UP after which does the same - popMenu(); - break; - - case EVT_KEY_BREAK(KEY_EXIT): - if (s_editMode > 0) { - s_editMode = 0; - AUDIO_KEY_PRESS(); - break; - } - - if (l_posHorz >= 0 && (COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { - l_posHorz = -1; - AUDIO_KEY_PRESS(); - } - else { - uint8_t posVertInit = MENU_FIRST_LINE_EDIT(horTab, horTabMax); - if (menuVerticalOffset != 0 || l_posVert != posVertInit) { - menuVerticalOffset = 0; - l_posVert = posVertInit; - l_posHorz = POS_HORZ_INIT(l_posVert); - AUDIO_KEY_PRESS(); - } - else { - popMenu(); - } - } - break; - - case EVT_ROTARY_RIGHT: - case EVT_KEY_FIRST(KEY_MINUS): - case EVT_KEY_REPT(KEY_MINUS): - AUDIO_KEY_PRESS(); - if (s_editMode != 0) break; - if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { - if (l_posHorz >= 0) { - INC(l_posHorz, 0, maxcol); - break; - } - } - else { - if (l_posHorz < maxcol) { - l_posHorz++; - break; - } - else { - l_posHorz = 0; - } - } - - do { -#if defined(ROTARY_ENCODER_NAVIGATION) - if (g_eeGeneral.rotEncMode == ROTARY_ENCODER_MODE_INVERT_VERT_HORZ_NORM || \ - g_eeGeneral.rotEncMode == ROTARY_ENCODER_MODE_INVERT_VERT_HORZ_ALT) { - DEC(l_posVert, MENU_FIRST_LINE_EDIT(horTab, horTabMax), rowcount - 1); - } else { - INC(l_posVert, MENU_FIRST_LINE_EDIT(horTab, horTabMax), rowcount - 1); - } -#else - INC(l_posVert, MENU_FIRST_LINE_EDIT(horTab, horTabMax), rowcount - 1); -#endif - } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); - - s_editMode = 0; // if we go down, we must be in this mode - - l_posHorz = POS_HORZ_INIT(l_posVert); - break; - - case EVT_ROTARY_LEFT: - case EVT_KEY_FIRST(KEY_PLUS): - case EVT_KEY_REPT(KEY_PLUS): - AUDIO_KEY_PRESS(); - if (s_editMode != 0) break; - if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { - if (l_posHorz >= 0) { - DEC(l_posHorz, 0, maxcol); - break; - } - } else if (l_posHorz > 0) { - l_posHorz--; - break; - } else { -#if defined(ROTARY_ENCODER_NAVIGATION) - l_posHorz = - g_eeGeneral.rotEncMode == ROTARY_ENCODER_MODE_INVERT_VERT_HORZ_ALT - ? 0 - : 0xff; -#else - l_posHorz = 0xff; -#endif - } - - do { -#if defined(ROTARY_ENCODER_NAVIGATION) - if (g_eeGeneral.rotEncMode == ROTARY_ENCODER_MODE_INVERT_VERT_HORZ_NORM || \ - g_eeGeneral.rotEncMode == ROTARY_ENCODER_MODE_INVERT_VERT_HORZ_ALT) { - INC(l_posVert, MENU_FIRST_LINE_EDIT(horTab, horTabMax), rowcount - 1); - } else { - DEC(l_posVert, MENU_FIRST_LINE_EDIT(horTab, horTabMax), rowcount - 1); - } -#else - DEC(l_posVert, MENU_FIRST_LINE_EDIT(horTab, horTabMax), rowcount - 1); -#endif - } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); - - s_editMode = 0; // if we go up, we must be in this mode - - if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) - l_posHorz = -1; - else - l_posHorz = min((uint8_t)l_posHorz, MAXCOL(l_posVert)); - - break; - } - - int linesCount = rowcount; - - if (l_posVert == 0 || (l_posVert==1 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW) || (l_posVert==2 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW && MAXCOL(vertpos_t(1)) >= HIDDEN_ROW)) { - menuVerticalOffset = 0; - if (horTab) { - linesCount = 0; - for (int i=0; ihorTabMax || horTab[i] != HIDDEN_ROW) { - linesCount++; - } - } - } - } - else if (horTab) { - if (rowcount > NUM_BODY_LINES) { - while (1) { - vertpos_t firstLine = 0; - for (int numLines=0; firstLine=horTabMax || horTab[firstLine] != HIDDEN_ROW) { - numLines++; - } - } - if (l_posVert < firstLine) { - menuVerticalOffset--; - } - else { - vertpos_t lastLine = firstLine; - for (int numLines=0; lastLine=horTabMax || horTab[lastLine] != HIDDEN_ROW) { - numLines++; - } - } - if (l_posVert >= lastLine) { - menuVerticalOffset++; - } - else { - linesCount = menuVerticalOffset + NUM_BODY_LINES; - for (int i=lastLine; ihorTabMax || horTab[i] != HIDDEN_ROW) { - linesCount++; - } - } - break; - } - } - } - } - } - else { - if (l_posVert>=NUM_BODY_LINES+menuVerticalOffset) { - menuVerticalOffset = l_posVert-NUM_BODY_LINES+1; - } - else if (l_posVert NUM_BODY_LINES) { - drawVerticalScrollbar(scrollbar_X, MENU_HEADER_HEIGHT, LCD_H-MENU_HEADER_HEIGHT, menuVerticalOffset, linesCount, NUM_BODY_LINES); - } - - menuVerticalPosition = l_posVert; - menuHorizontalPosition = l_posHorz; -} diff --git a/radio/src/gui/navigation/navigation_xlite.cpp b/radio/src/gui/navigation/navigation_xlite.cpp deleted file mode 100644 index 4c36d2a86..000000000 --- a/radio/src/gui/navigation/navigation_xlite.cpp +++ /dev/null @@ -1,497 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "opentx.h" -#include "switches.h" - -vertpos_t menuVerticalOffset; -vertpos_t menuVerticalPosition; -horzpos_t menuHorizontalPosition; - -int8_t s_editMode; -uint8_t noHighlightCounter; -uint8_t menuCalibrationState; - -int8_t checkIncDec_Ret; - -INIT_STOPS(stops100, 3, -100, 0, 100) -INIT_STOPS(stops1000, 3, -1000, 0, 1000) -INIT_STOPS(stopsSwitch, 15, SWSRC_FIRST, - CATEGORY_END(-SWSRC_FIRST_LOGICAL_SWITCH), - CATEGORY_END(-SWSRC_FIRST_TRIM), - CATEGORY_END(-SWSRC_LAST_SWITCH + 1), 0, - CATEGORY_END(SWSRC_LAST_SWITCH), CATEGORY_END(SWSRC_FIRST_TRIM - 1), - CATEGORY_END(SWSRC_FIRST_LOGICAL_SWITCH - 1), SWSRC_LAST) - -extern int checkIncDecSelection; - -int checkIncDec(event_t event, int val, int i_min, int i_max, - unsigned int i_flags, IsValueAvailable isValueAvailable, - const CheckIncDecStops &stops) -{ - int newval = val; - - bool isSource = false; - bool origIsSource = false; - if (i_flags & INCDEC_SOURCE_VALUE) { - SourceNumVal v; - v.rawValue = val; - // Save isSource flag; - origIsSource = isSource = v.isSource; - // Remove isSource flag; - val = v.value; - newval = v.value; - } - - if (s_editMode > 0) { - bool invert = false; - if ((i_flags & INCDEC_SOURCE_INVERT) && (newval < 0)) { - invert = true; - newval = -newval; - val = -val; - } - - if (event == EVT_KEY_FIRST(KEY_RIGHT) || event == EVT_KEY_REPT(KEY_RIGHT) || - event == EVT_KEY_FIRST(KEY_UP) || event == EVT_KEY_REPT(KEY_UP)) { - do { - if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { - newval += min(10, i_max-val); - } - else { - newval++; - } - } while (isValueAvailable && !isValueAvailable(newval) && - newval <= i_max); - - if (newval > i_max) { - newval = val; - killEvents(event); - AUDIO_KEY_ERROR(); - } - } else if (event == EVT_KEY_FIRST(KEY_LEFT) || - event == EVT_KEY_REPT(KEY_LEFT) || - event == EVT_KEY_FIRST(KEY_DOWN) || - event == EVT_KEY_REPT(KEY_DOWN)) { - do { - if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { - newval -= min(10, val-i_min); - } - else { - newval--; - } - } while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min); - - if (newval < i_min) { - newval = val; - killEvents(event); - AUDIO_KEY_ERROR(); - } - } - -#if defined(AUTOSWITCH) - if (i_flags & INCDEC_SWITCH) { - newval = checkIncDecMovedSwitch(newval); - } -#endif - -#if defined(AUTOSOURCE) - if (i_flags & (INCDEC_SOURCE|INCDEC_SOURCE_VALUE)) { - int source = GET_MOVED_SOURCE(i_min, i_max); - if (source) { - if (i_flags & INCDEC_SOURCE_VALUE) { - if (isSource) { - // Only use moved source if already a source value - newval = source; - } - } else { - newval = source; - } - } -#if defined(AUTOSWITCH) - else { - uint8_t swtch = abs(getMovedSwitch()); - if (swtch && !IS_SWITCH_MULTIPOS(swtch)) { - newval = switchToMix(swtch); - } - } -#endif - } -#endif - - if (invert) { - newval = -newval; - val = -val; - } - } - - if (i_min == 0 && i_max == 1 && - event == EVT_KEY_BREAK(KEY_ENTER)) { - s_editMode = 0; - newval = !val; - } - - if (newval != val) { - if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && - (newval != i_min) && stops.contains(newval)) { - bool pause = (newval > val ? !stops.contains(newval + 1) - : !stops.contains(newval - 1)); - if (pause) { - pauseEvents(event); // delay before auto-repeat continues - } - } - if (!IS_KEY_REPT(event)) { - AUDIO_KEY_PRESS(); - } - storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); - checkIncDec_Ret = (newval > val ? 1 : -1); - } - else { - checkIncDec_Ret = 0; - } - - if (i_flags & (INCDEC_SOURCE | INCDEC_SOURCE_VALUE)) { - if (event == EVT_KEY_LONG(KEY_ENTER) && !keysGetState(KEY_SHIFT)) { - checkIncDecSelection = MIXSRC_NONE; - - if (i_flags & INCDEC_SOURCE_VALUE && isSource) { - POPUP_MENU_ADD_ITEM(STR_CONSTANT); - } - - if (i_min <= MIXSRC_FIRST_INPUT && i_max >= MIXSRC_FIRST_INPUT) { - if (getFirstAvailable(MIXSRC_FIRST_INPUT, MIXSRC_LAST_INPUT, isInputAvailable) != MIXSRC_NONE && - (i_flags & INCDEC_SOURCE_NOINPUTS) == 0) { - POPUP_MENU_ADD_ITEM(STR_MENU_INPUTS); - } - } -#if defined(LUA_MODEL_SCRIPTS) - if (i_min <= MIXSRC_FIRST_LUA && i_max >= MIXSRC_FIRST_LUA) { - if (getFirstAvailable(MIXSRC_FIRST_LUA, MIXSRC_LAST_LUA, isSourceAvailable) != MIXSRC_NONE) { - POPUP_MENU_ADD_ITEM(STR_MENU_LUA); - } - } -#endif - if (i_min <= MIXSRC_FIRST_STICK && i_max >= MIXSRC_FIRST_STICK) POPUP_MENU_ADD_ITEM(STR_MENU_STICKS); - if (i_min <= MIXSRC_FIRST_POT && i_max >= MIXSRC_FIRST_POT) POPUP_MENU_ADD_ITEM(STR_MENU_POTS); - if (i_min <= MIXSRC_MIN && i_max >= MIXSRC_MIN) POPUP_MENU_ADD_ITEM(STR_MENU_MIN); - if (i_min <= MIXSRC_MAX && i_max >= MIXSRC_MAX) POPUP_MENU_ADD_ITEM(STR_MENU_MAX); -#if defined(HELI) - if (modelHeliEnabled()) - if (i_min <= MIXSRC_FIRST_HELI && i_max >= MIXSRC_FIRST_HELI && isValueAvailable && isValueAvailable(MIXSRC_FIRST_HELI)) - POPUP_MENU_ADD_ITEM(STR_MENU_HELI); -#endif - if (i_min <= MIXSRC_FIRST_TRIM && i_max >= MIXSRC_FIRST_TRIM) POPUP_MENU_ADD_ITEM(STR_MENU_TRIMS); - if (i_min <= MIXSRC_FIRST_SWITCH && i_max >= MIXSRC_FIRST_SWITCH) POPUP_MENU_ADD_ITEM(STR_MENU_SWITCHES); - if (i_min <= MIXSRC_FIRST_TRAINER && i_max >= MIXSRC_FIRST_TRAINER) POPUP_MENU_ADD_ITEM(STR_MENU_TRAINER); - if (i_min <= MIXSRC_FIRST_CH && i_max >= MIXSRC_FIRST_CH) POPUP_MENU_ADD_ITEM(STR_MENU_CHANNELS); - if (i_min <= MIXSRC_FIRST_GVAR && i_max >= MIXSRC_FIRST_GVAR && isValueAvailable && isValueAvailable(MIXSRC_FIRST_GVAR)) { - POPUP_MENU_ADD_ITEM(STR_MENU_GVARS); - } - - if (modelTelemetryEnabled() && i_min <= MIXSRC_FIRST_TELEM && i_max >= MIXSRC_FIRST_TELEM) { - for (int i = 0; i < MAX_TELEMETRY_SENSORS; i++) { - TelemetrySensor * sensor = & g_model.telemetrySensors[i]; - if (sensor->isAvailable()) { - POPUP_MENU_ADD_ITEM(STR_MENU_TELEMETRY); - break; - } - } - } - if (i_flags & INCDEC_SOURCE_INVERT) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT); - POPUP_MENU_START(onSourceLongEnterPress); - } - if (checkIncDecSelection != 0) { - if (i_flags & INCDEC_SOURCE_VALUE) { - if (checkIncDecSelection == MIXSRC_VALUE) { - newval = 0; - isSource = false; - } else { - newval = (checkIncDecSelection == MIXSRC_INVERT ? -newval : checkIncDecSelection); - if (checkIncDecSelection != MIXSRC_INVERT) - isSource = true; - } - } else { - newval = (checkIncDecSelection == MIXSRC_INVERT ? -newval : checkIncDecSelection); - } - if (checkIncDecSelection != MIXSRC_MIN && checkIncDecSelection != MIXSRC_MAX) - s_editMode = EDIT_MODIFY_FIELD; - checkIncDecSelection = 0; - } - } - else if (i_flags & INCDEC_SWITCH) { - if (event == EVT_KEY_LONG(KEY_ENTER) && !keysGetState(KEY_SHIFT)) { - checkIncDecSelection = SWSRC_NONE; - if (i_min <= SWSRC_FIRST_SWITCH && i_max >= SWSRC_LAST_SWITCH) POPUP_MENU_ADD_ITEM(STR_MENU_SWITCHES); - if (i_min <= SWSRC_FIRST_TRIM && i_max >= SWSRC_LAST_TRIM) POPUP_MENU_ADD_ITEM(STR_MENU_TRIMS); - if (i_min <= SWSRC_FIRST_LOGICAL_SWITCH && i_max >= SWSRC_LAST_LOGICAL_SWITCH) { - for (int i = 0; i < MAX_LOGICAL_SWITCHES; i++) { - if (isValueAvailable && isValueAvailable(SWSRC_FIRST_LOGICAL_SWITCH+i)) { - POPUP_MENU_ADD_ITEM(STR_MENU_LOGICAL_SWITCHES); - break; - } - } - } - if (isValueAvailable && isValueAvailable(SWSRC_ON)) POPUP_MENU_ADD_ITEM(STR_MENU_OTHER); - if (isValueAvailable && isValueAvailable(-newval)) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT); - POPUP_MENU_START(onSwitchLongEnterPress); - s_editMode = EDIT_MODIFY_FIELD; - } - if (checkIncDecSelection != 0) { - newval = (checkIncDecSelection == SWSRC_INVERT ? -newval : checkIncDecSelection); - s_editMode = EDIT_MODIFY_FIELD; - checkIncDecSelection = 0; - } - } - - if (i_flags & INCDEC_SOURCE_VALUE) { - SourceNumVal v; - v.isSource = isSource; - v.value = newval; - newval = v.rawValue; - } - - return newval; -} - -#define SCROLL_POT1_TH 32 - -#define CURSOR_NOT_ALLOWED_IN_ROW(row) ((int8_t)MAXCOL(row) < 0) - -#define INC(val, min, max) if (valmin) {val--;} else {val=max;} - -tmr10ms_t menuEntryTime; - -#define MAXCOL_RAW(row) (horTab ? *(horTab+min(row, (vertpos_t)horTabMax)) : (const uint8_t)0) -#define MAXCOL(row) (MAXCOL_RAW(row) >= HIDDEN_ROW ? MAXCOL_RAW(row) : (const uint8_t)(MAXCOL_RAW(row) & (~NAVIGATION_LINE_BY_LINE))) -#define POS_HORZ_INIT(posVert) 0 - -uint8_t chgMenu(uint8_t curr, const MenuHandler * menuTab, uint8_t menuTabSize, int direction) -{ - int cc = curr + direction; - while (cc != curr) { - if (cc < 0) - cc = menuTabSize - 1; - else if (cc >= menuTabSize) - cc = 0; - if (menuTab[cc].isEnabled()) - return cc; - cc += direction; - } - return curr; -} - -uint8_t menuSize(const MenuHandler * menuTab, uint8_t menuTabSize) -{ - uint8_t sz = 0; - for (int i = 0; i < menuTabSize; i += 1) { - if (menuTab[i].isEnabled()) { - sz += 1; - } - } - return sz; -} - -uint8_t menuIdx(const MenuHandler * menuTab, uint8_t curr) -{ - return menuSize(menuTab, curr + 1) - 1; -} - -void check(event_t event, uint8_t curr, const MenuHandler *menuTab, - uint8_t menuTabSize, const uint8_t *horTab, uint8_t horTabMax, - vertpos_t maxrow, uint8_t flags) -{ - vertpos_t l_posVert = menuVerticalPosition; - horzpos_t l_posHorz = menuHorizontalPosition; - - uint8_t maxcol = MAXCOL(l_posVert); - - if (menuTab) { - uint8_t attr = 0; - - if (l_posVert==0 && !menuCalibrationState) { - attr = INVERS; - - int8_t cc = curr; - - switch (event) { - case EVT_KEY_FIRST(KEY_LEFT): - cc = chgMenu(curr, menuTab, menuTabSize, -1); - break; - - case EVT_KEY_FIRST(KEY_RIGHT): - cc = chgMenu(curr, menuTab, menuTabSize, 1); - break; - } - - if (cc != curr) { - chainMenu(menuTab[cc].menuFunc); - } - } - - menuCalibrationState = 0; - drawScreenIndex(menuIdx(menuTab, curr), menuSize(menuTab, menuTabSize), attr); - } - - switch (event) { - case EVT_ENTRY: - menuEntryTime = get_tmr10ms(); - l_posVert = 0; - l_posHorz = POS_HORZ_INIT(l_posVert); - s_editMode = EDIT_MODE_INIT; - break; - - case EVT_KEY_FIRST(KEY_ENTER): - if (!menuTab || l_posVert > 0) { - s_editMode = (s_editMode <= 0); - } - break; - - case EVT_KEY_LONG(KEY_EXIT): - s_editMode = 0; // TODO needed? we call ENTRY_UP after which does the same - popMenu(); - break; - - case EVT_KEY_BREAK(KEY_EXIT): - AUDIO_KEY_PRESS(); - if (s_editMode > 0) { - s_editMode = 0; - break; - } - - if (l_posVert == 0 || !menuTab) { - popMenu(); // beeps itself - } - else { - l_posVert = 0; - l_posHorz = 0; - } - break; - - case EVT_KEY_REPT(KEY_RIGHT): //inc - if (l_posHorz == maxcol) break; - // no break - - case EVT_KEY_FIRST(KEY_RIGHT)://inc - if (!horTab || s_editMode > 0) break; - INC(l_posHorz, 0, maxcol); - break; - - case EVT_KEY_REPT(KEY_DOWN): - if (l_posVert == maxrow) break; - // no break - - case EVT_KEY_FIRST(KEY_DOWN): - if (s_editMode > 0) break; - do { - INC(l_posVert, 0, maxrow); - } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); - l_posHorz = min(l_posHorz, MAXCOL(l_posVert)); - break; - - case EVT_KEY_REPT(KEY_LEFT): //dec - if (l_posHorz==0) break; - // no break - - case EVT_KEY_FIRST(KEY_LEFT)://dec - if (!horTab || s_editMode > 0) break; - DEC(l_posHorz, 0, maxcol); - break; - - case EVT_KEY_REPT(KEY_UP): - if (l_posVert == 0) break; - // no break - case EVT_KEY_FIRST(KEY_UP): - if (s_editMode > 0) break; - do { - DEC(l_posVert, 0, maxrow); - } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); - l_posHorz = min((uint8_t)l_posHorz, MAXCOL(l_posVert)); - break; - } - - uint8_t maxLines = menuTab ? LCD_LINES-1 : LCD_LINES-2; - - int linesCount = maxrow; - if (l_posVert == 0 || (l_posVert==1 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW) || (l_posVert==2 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW && MAXCOL(vertpos_t(1)) >= HIDDEN_ROW)) { - menuVerticalOffset = 0; - if (horTab) { - linesCount = 0; - for (int i=0; i=horTabMax || horTab[i] != HIDDEN_ROW) { - linesCount++; - } - } - } - } - else if (horTab) { - if (maxrow > maxLines) { - while (1) { - vertpos_t firstLine = 0; - for (int numLines=0; firstLine=horTabMax || horTab[firstLine+1] != HIDDEN_ROW) { - numLines++; - } - } - if (l_posVert <= firstLine) { - menuVerticalOffset--; - } - else { - vertpos_t lastLine = firstLine; - for (int numLines=0; lastLine=horTabMax || horTab[lastLine+1] != HIDDEN_ROW) { - numLines++; - } - } - if (l_posVert > lastLine) { - menuVerticalOffset++; - } - else { - linesCount = menuVerticalOffset + maxLines; - for (int i=lastLine; i=horTabMax || horTab[i] != HIDDEN_ROW) { - linesCount++; - } - } - break; - } - } - } - } - } - else { - if (l_posVert>maxLines+menuVerticalOffset) { - menuVerticalOffset = l_posVert-maxLines; - } - else if (l_posVert<=menuVerticalOffset) { - menuVerticalOffset = l_posVert-1; - } - } - - menuVerticalPosition = l_posVert; - menuHorizontalPosition = l_posHorz; - // cosmetics on 9x - if (menuVerticalOffset > 0) { - l_posVert--; - if (l_posVert == menuVerticalOffset && CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)) { - menuVerticalOffset = l_posVert-1; - } - } -} diff --git a/radio/src/keys.cpp b/radio/src/keys.cpp index e28a3530c..3b4f610f0 100644 --- a/radio/src/keys.cpp +++ b/radio/src/keys.cpp @@ -102,7 +102,7 @@ event_t Key::input(bool val) evt = (m_flags & KFLAG_LONG_PRESS) ? _MSK_KEY_LONG_BRK : _MSK_KEY_BREAK; } #else - if ((m_flags & (KFLAG_KILLED|KFLAG_LONG_PRESS)) == 0) { + if ((m_flags & (KFLAG_KILLED)) == 0) { evt = _MSK_KEY_BREAK; } #endif @@ -443,6 +443,7 @@ bool keysPollingCycle() if (evt == EVT_KEY_LONG(KEY_PAGEDN)) { // Convert long press PAGEDN to short press PAGEUP evt = EVT_KEY_BREAK(KEY_PAGEUP); + killEvents(KEY_PAGEDN); } #endif #if defined(KEYS_GPIO_REG_SHIFT)