chore(bw): simplify navigation code (#5269)

This commit is contained in:
philmoz
2024-07-28 08:13:20 +10:00
committed by GitHub
parent c086eb4bd9
commit 0cc22c364d
40 changed files with 422 additions and 1590 deletions
@@ -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):
+1
View File
@@ -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);
}
@@ -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)) {
@@ -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;
-1
View File
@@ -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)) {
+10 -6
View File
@@ -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
}
+3 -2
View File
@@ -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)) {
+5 -13
View File
@@ -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<MAX_FLIGHT_MODES; i++) {
memclear(&g_model.flightModeData[i], TRIMS_ARRAY_SIZE);
@@ -1075,10 +1076,8 @@ void menuModelSetup(event_t event)
#endif
s_editMode = 0;
switch (event) {
case EVT_KEY_BREAK(KEY_ENTER):
break;
case EVT_KEY_LONG(KEY_ENTER):
killEvents(event);
if (menuHorizontalPosition < 0 ||
menuHorizontalPosition >= 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);
@@ -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;
+1 -2
View File
@@ -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);
}
+2
View File
@@ -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);
+1
View File
@@ -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);
+1 -3
View File
@@ -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);
+1
View File
@@ -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)) {
+1
View File
@@ -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);
}
@@ -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);
+8
View File
@@ -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;
}
+4 -2
View File
@@ -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)) {
+4 -13
View File
@@ -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<MAX_FLIGHT_MODES; i++) {
memclear(&g_model.flightModeData[i], TRIMS_ARRAY_SIZE);
@@ -877,10 +878,8 @@ void menuModelSetup(event_t event)
if (attr) {
s_editMode = 0;
switch (event) {
case EVT_KEY_BREAK(KEY_ENTER):
break;
case EVT_KEY_LONG(KEY_ENTER):
killEvents(event);
if (menuHorizontalPosition < 0) {
START_NO_HIGHLIGHT();
getMovedSwitch();
@@ -958,6 +957,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();
@@ -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);
@@ -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;
}
+1 -1
View File
@@ -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);
}
+4 -5
View File
@@ -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;
+1
View File
@@ -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);
@@ -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 == ' ') {
+2 -1
View File
@@ -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)
@@ -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;
@@ -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;
@@ -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);
}
@@ -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);
}
@@ -182,6 +182,7 @@ void runPopupRegister(event_t event)
// no break
case EVT_KEY_LONG(KEY_EXIT):
killEvents(event);
s_editMode = 0;
// no break;
@@ -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)) {
+1 -1
View File
@@ -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;
}
@@ -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();
@@ -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)) {
+240 -7
View File
@@ -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 (val<max) {val++;} else {val=min;}
#define DEC(val, min, max) if (val>min) {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
+51 -210
View File
@@ -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 (val<max) {val++;} else {val=min;}
#define DEC(val, min, max) if (val>min) {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<horzpos_t>(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<horzpos_t>(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<horzpos_t>(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;
}
+52 -202
View File
@@ -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 (val<max) {val++;} else {val=min;}
#define DEC(val, min, max) if (val>min) {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;
}
-617
View File
@@ -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<int>(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<int>(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 (val<max) {val++;} else if (max>min) {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; i<rowcount; i++) {
if (i>horTabMax || horTab[i] != HIDDEN_ROW) {
linesCount++;
}
}
}
}
else if (horTab) {
if (rowcount > NUM_BODY_LINES) {
while (1) {
vertpos_t firstLine = 0;
for (int numLines=0; firstLine<rowcount && numLines<menuVerticalOffset; firstLine++) {
if (firstLine>=horTabMax || horTab[firstLine] != HIDDEN_ROW) {
numLines++;
}
}
if (l_posVert < firstLine) {
menuVerticalOffset--;
}
else {
vertpos_t lastLine = firstLine;
for (int numLines=0; lastLine<rowcount && numLines<NUM_BODY_LINES; lastLine++) {
if (lastLine>=horTabMax || horTab[lastLine] != HIDDEN_ROW) {
numLines++;
}
}
if (l_posVert >= lastLine) {
menuVerticalOffset++;
}
else {
linesCount = menuVerticalOffset + NUM_BODY_LINES;
for (int i=lastLine; i<rowcount; i++) {
if (i>horTabMax || 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<menuVerticalOffset) {
menuVerticalOffset = l_posVert;
}
}
if (scrollbar_X && linesCount > 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;
}
@@ -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 (val<max) {val++;} else {val=min;}
#define DEC(val, min, max) if (val>min) {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<horzpos_t>(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<maxrow; i++) {
if (i>=horTabMax || horTab[i] != HIDDEN_ROW) {
linesCount++;
}
}
}
}
else if (horTab) {
if (maxrow > maxLines) {
while (1) {
vertpos_t firstLine = 0;
for (int numLines=0; firstLine<maxrow && numLines<menuVerticalOffset; firstLine++) {
if (firstLine>=horTabMax || horTab[firstLine+1] != HIDDEN_ROW) {
numLines++;
}
}
if (l_posVert <= firstLine) {
menuVerticalOffset--;
}
else {
vertpos_t lastLine = firstLine;
for (int numLines=0; lastLine<maxrow && numLines<maxLines; lastLine++) {
if (lastLine>=horTabMax || horTab[lastLine+1] != HIDDEN_ROW) {
numLines++;
}
}
if (l_posVert > lastLine) {
menuVerticalOffset++;
}
else {
linesCount = menuVerticalOffset + maxLines;
for (int i=lastLine; i<maxrow; i++) {
if (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;
}
}
}
+2 -1
View File
@@ -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)