From bef5ee525dcabafe074583f212633edf5ede7c59 Mon Sep 17 00:00:00 2001 From: bsongis Date: Thu, 15 Nov 2012 17:49:31 +0000 Subject: [PATCH] [X9D] More work on navigation [RotEnc] Pressing [EXIT] inside a menu returns in page selection mode [stock] More flash saving --- src/menus.cpp | 72 +++++++++++++++++++++++++++++++++++---------- src/menus.h | 18 +++++++++--- src/model_menus.cpp | 49 +++++++++++++++++------------- src/myeeprom.h | 18 +++++++----- 4 files changed, 111 insertions(+), 46 deletions(-) diff --git a/src/menus.cpp b/src/menus.cpp index 31f5e64f8..a6e382811 100644 --- a/src/menus.cpp +++ b/src/menus.cpp @@ -191,17 +191,40 @@ int8_t checkIncDecGen(uint8_t event, int8_t i_val, int8_t i_min, int8_t i_max) return checkIncDec(event,i_val,i_min,i_max,EE_GENERAL); } -bool check_simple(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, maxrow_t maxrow) +bool check_simple(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, maxrow_t maxrow) { return check(event, curr, menuTab, menuTabSize, 0, 0, maxrow); } -bool check_submenu_simple(uint8_t event, uint8_t maxrow) +bool check_submenu_simple(check_event_t event, uint8_t maxrow) { return check_simple(event, 0, 0, 0, maxrow); } -#if defined(ROTARY_ENCODERS) +#if defined(PCBX9D) +void check_rotary_encoder(uint8_t & event) +{ + if (event==EVT_KEY_REPT(KEY_LEFT) || event==EVT_KEY_BREAK(KEY_LEFT)) { + scrollRE = -1; + } + else if (event==EVT_KEY_REPT(KEY_RIGHT) || event==EVT_KEY_FIRST(KEY_RIGHT)) { + scrollRE = 1; + } + else { + scrollRE = 0; + } + + if (s_editMode > 0) { + p1valdiff = -scrollRE; + scrollRE = 0; + } + + // TODO remove later... + uint8_t key = event & EVT_KEY_MASK; + if (key==KEY_LEFT || key==KEY_RIGHT) + event = 0; +} +#elif defined(ROTARY_ENCODERS) void check_rotary_encoder() { // check rotary encoder 1 if changed -> cursor down/up @@ -245,24 +268,32 @@ void title(const pm_char * s) #define INC(val,max) if(val0 ) {val--;} else {val=max;} -bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, const pm_uint8_t *horTab, uint8_t horTabMax, maxrow_t maxrow) +#if defined(PCBX9D) +#define RE_NAV_ENTER (KEY_ENTER) +#define RE_NAV_ENABLE true +#else +#define RE_NAV_ENTER (BTN_REa+g_eeGeneral.reNavigation-1) +#define RE_NAV_ENABLE g_eeGeneral.reNavigation +#endif + +bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, const pm_uint8_t *horTab, uint8_t horTabMax, maxrow_t maxrow) { maxrow_t l_posVert = m_posVert; uint8_t l_posHorz = m_posHorz; - int8_t maxcol = MAXCOL(l_posVert); + uint8_t maxcol = MAXCOL(l_posVert); #if defined(ROTARY_ENCODERS) if (!(s_warning || s_menu_count)) - check_rotary_encoder(); - if (l_posVert < 0 && (event==EVT_KEY_FIRST(BTN_REa) || event==EVT_KEY_FIRST(BTN_REb) || event==EVT_KEY_FIRST(KEY_MENU))) { + CHECK_ROTARY_ENCODER(event); + if (l_posVert < 0 && (event==EVT_KEY_FIRST(RE_NAV_ENTER) || event==EVT_KEY_FIRST(KEY_MENU))) { popMenu(); killEvents(event); return false; } - if (g_eeGeneral.reNavigation && event == EVT_KEY_BREAK(BTN_REa+g_eeGeneral.reNavigation-1)) { + if (RE_NAV_ENABLE && event==EVT_KEY_BREAK(RE_NAV_ENTER)) { if (s_editMode > 0 && (maxcol & ZCHAR)) { - if (l_posHorz < (uint8_t)maxcol-ZCHAR) { + if (l_posHorz < maxcol-ZCHAR) { l_posHorz++; } else { @@ -340,7 +371,7 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa } #if defined(ROTARY_ENCODERS) - if (g_eeGeneral.reNavigation && s_editMode < 0) + if (RE_NAV_ENABLE && s_editMode < 0) attr = INVERS|BLINK; #endif } @@ -381,10 +412,11 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa if (maxcol & ZCHAR) maxcol = 0; if (++l_posHorz > maxcol) { if (l_posVert < maxrow) { - ++l_posVert; + do { + ++l_posVert; + } while(MAXCOL(l_posVert) == (uint8_t)-1); maxcol = MAXCOL(l_posVert); if (maxcol & ZCHAR) maxcol = 0; - if (maxcol < 0) l_posVert++; l_posHorz = 0; } else { @@ -396,7 +428,10 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa else { ++scrollRE; if (l_posHorz-- == 0) { - if (l_posVert-- <= 0) { + do { + --l_posVert; + } while(MAXCOL(l_posVert) == (uint8_t)-1); + if (l_posVert <= (menuTab ? 0 : -1)) { l_posVert = menuTab ? 0 : -1; l_posHorz = 0; scrollRE = 0; @@ -404,7 +439,6 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa else { maxcol = MAXCOL(l_posVert); if (maxcol & ZCHAR) maxcol = 0; - if (maxcol < 0) { --l_posVert; maxcol = MAXCOL(l_posVert); if (maxcol & ZCHAR) maxcol = 0; } l_posHorz = maxcol; } } @@ -443,6 +477,11 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa popMenu(); break; case EVT_KEY_BREAK(KEY_EXIT): +#if defined(ROTARY_ENCODERS) + if (s_editMode==0) + s_editMode = -1; + else +#endif if (s_editMode>0) { s_editMode = 0; break; @@ -539,6 +578,8 @@ void chainMenu(MenuFuncP newMenu) void pushMenu(MenuFuncP newMenu) { + killEvents(KEY_ENTER); + if (g_menuStackPtr == 0) { if (newMenu == menuGeneralSetup) g_menuPos[0] = 1; @@ -595,8 +636,9 @@ void displayWarning(uint8_t event) case EVT_KEY_FIRST(BTN_REb): if (!navigationRotaryEncoder(event)) break; + // no break #endif - case EVT_KEY_FIRST(KEY_MENU): + case EVT_KEY_FIRST(KEY_ENTER): if (s_warning_type == WARNING_TYPE_ASTERISK) break; s_warning_result = true; diff --git a/src/menus.h b/src/menus.h index 5ec984509..c8b101cbc 100644 --- a/src/menus.h +++ b/src/menus.h @@ -136,8 +136,12 @@ int8_t checkIncDecGen(uint8_t event, int8_t i_val, int8_t i_min, int8_t i_max); #define CHECK_INCDEC_GENVAR(event, var, min, max) \ var = checkIncDecGen(event,var,min,max) -#if defined(ROTARY_ENCODERS) +#if defined(PCBX9D) +void check_rotary_encoder(uint8_t & event); +#define CHECK_ROTARY_ENCODER(event) check_rotary_encoder(event) +#elif defined(ROTARY_ENCODERS) void check_rotary_encoder(); +#define CHECK_ROTARY_ENCODER(event) check_rotary_encoder() #endif // Menus related stuff ... @@ -152,9 +156,15 @@ void check_rotary_encoder(); extern maxrow_t m_posVert; extern uint8_t m_posHorz; -bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, const pm_uint8_t *subTab, uint8_t subTabMax, maxrow_t maxrow); -bool check_simple(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, maxrow_t maxrow); -bool check_submenu_simple(uint8_t event, uint8_t maxrow); +#if defined(PCBX9D) +typedef uint8_t & check_event_t; +#else +typedef uint8_t check_event_t; +#endif + +bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, const pm_uint8_t *subTab, uint8_t subTabMax, maxrow_t maxrow); +bool check_simple(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, maxrow_t maxrow); +bool check_submenu_simple(check_event_t event, uint8_t maxrow); typedef void (*MenuFuncP_PROGMEM)(uint8_t event); diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 5fa6d995e..f97785515 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -379,7 +379,6 @@ void menuModelSelect(uint8_t event) s_copySrcRow = -1; } break; -#if !defined(PCBX9D) case EVT_KEY_FIRST(KEY_LEFT): case EVT_KEY_FIRST(KEY_RIGHT): if (sub == g_eeGeneral.currModel) { @@ -388,6 +387,7 @@ void menuModelSelect(uint8_t event) } AUDIO_WARNING2(); break; +#if !defined(PCBX9D) case EVT_KEY_FIRST(KEY_UP): case EVT_KEY_FIRST(KEY_DOWN): if (s_copyMode) { @@ -555,9 +555,13 @@ void editName(uint8_t x, uint8_t y, char *name, uint8_t size, uint8_t event, boo case EVT_KEY_LONG(BTN_REb): if (!navigationRotaryEncoder(event)) break; + // no break +#if defined(PCBX9D) + case EVT_KEY_LONG(KEY_ENTER): +#endif if (v==0) { s_editMode = 0; - killEvents(BTN_REa); + killEvents(event); break; } // no break @@ -1103,13 +1107,15 @@ void menuModelPhasesAll(uint8_t event) break; // no break #endif - case EVT_KEY_FIRST(KEY_MENU): + case EVT_KEY_FIRST(KEY_ENTER): if (sub == MAX_PHASES) { s_editMode = 0; trimsCheckTimer = 200; // 2 seconds } // no break +#if !defined(PCBX9D) case EVT_KEY_FIRST(KEY_RIGHT): +#endif if (sub >= 0 && sub < MAX_PHASES) { s_currIdx = sub; pushMenu(menuModelPhaseOne); @@ -1313,7 +1319,6 @@ void menuModelCurveOne(uint8_t event) switch(event) { case EVT_ENTRY: s_editMode = 1; - killEvents(KEY_MENU); break; #if defined(ROTARY_ENCODERS) case EVT_KEY_BREAK(BTN_REa): @@ -2184,7 +2189,11 @@ enum LimitsItems { void menuModelLimits(uint8_t event) { +#if defined(PCBSKY9X) + MENU(STR_MENULIMITS, menuTabModel, e_Limits, 1+NUM_CHNOUT+1, {0, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, 0}); +#else MENU(STR_MENULIMITS, menuTabModel, e_Limits, 1+NUM_CHNOUT+1, {0, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, 0}); +#endif uint8_t sub = m_posVert - 1; @@ -2365,8 +2374,10 @@ void menuModelCurvesAll(uint8_t event) break; // no break #endif +#if !defined(PCBX9D) case EVT_KEY_FIRST(KEY_RIGHT): - case EVT_KEY_FIRST(KEY_MENU): +#endif + case EVT_KEY_FIRST(KEY_ENTER): if (CURVE_SELECTED()) { s_curveChan = sub; pushMenu(menuModelCurveOne); @@ -2415,6 +2426,7 @@ enum CustomSwitchFields { void menuModelCustomSwitchOne(uint8_t event) { TITLE(STR_MENUCUSTOMSWITCH); + CustomSwData * cs = cswaddress(s_currIdx); uint8_t sw = DSW_SW1+s_currIdx; putsSwitches(14*FW, 0, sw, (getSwitch(sw, 0) ? BOLD : 0)); @@ -2533,8 +2545,10 @@ void menuModelCustomSwitches(uint8_t event) break; // no break #endif +#if !defined(PCBX9D) case EVT_KEY_FIRST(KEY_RIGHT): - case EVT_KEY_FIRST(KEY_MENU): +#endif + case EVT_KEY_FIRST(KEY_ENTER): if (sub >= 0) { s_currIdx = sub; pushMenu(menuModelCustomSwitchOne); @@ -3230,23 +3244,18 @@ void menuModelTemplates(uint8_t event) uint8_t sub = m_posVert - 1; - if (s_warning_result) { - if (sub