From a8167c5e0ccb91f019a48602134cefd7332b74e3 Mon Sep 17 00:00:00 2001 From: bsongis Date: Fri, 17 Feb 2012 15:11:02 +0000 Subject: [PATCH] A little commit between two snow balls fight to warm the hands: this is the way that Cam proposed to exit submenus with Rotary Encoders. Still remaining: the Curve submenu. Ideas needed ;) --- src/menus.cpp | 36 +++++++++++++++++++++++++++-------- src/menus.h | 6 +++++- src/model_menus.cpp | 44 ++++++++++++++++++++++++++++++++----------- src/o9xstrings.cpp | 4 ++++ src/o9xstrings.h | 2 ++ src/translations/en.h | 1 + src/translations/fr.h | 1 + 7 files changed, 74 insertions(+), 20 deletions(-) diff --git a/src/menus.cpp b/src/menus.cpp index 8daef9203..852a66f40 100644 --- a/src/menus.cpp +++ b/src/menus.cpp @@ -153,7 +153,11 @@ bool check_submenu_simple(uint8_t event, uint8_t maxrow) #define SCROLL_TH 64 #define SCROLL_POT1_TH 32 +#ifdef NAVIGATION_RE1 +#define MAXCOL(row) ((horTab && row > 0) ? pgm_read_byte(horTab+min(row, (int8_t)horTabMax)) : (const uint8_t)0) +#else #define MAXCOL(row) (horTab ? pgm_read_byte(horTab+min(row, horTabMax)) : (const uint8_t)0) +#endif #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, uint8_t maxrow) @@ -172,11 +176,10 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa scrollRE = 0; } } - if (event == EVT_KEY_LONG(BTN_RE1)) { - if (!menuTab && !s_editMode) { - popMenu(); - killEvents(event); - } + if (m_posVert < 0 && (event==EVT_KEY_FIRST(BTN_RE1) || event==EVT_KEY_FIRST(KEY_MENU))) { + popMenu(); + killEvents(event); + return false; } if (event == EVT_KEY_BREAK(BTN_RE1)) { if (s_editMode > 0 && (maxcol & ZCHAR)) { @@ -260,6 +263,11 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa s_noScroll = 0; DisplayScreenIndex(curr, menuTabSize, attr); } +#ifdef NAVIGATION_RE1 + else if (m_posVert < 0) { + lcd_putsAtt(DISPLAY_W-LEN_BACK*FW, 0, STR_BACK, INVERS); + } +#endif theFile.DisplayProgressBar(menuTab ? lcd_lastPos-2*FW-((curr+1)/10*FWNUM)-2 : 20*FW+1); @@ -283,7 +291,8 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa if (maxcol & ZCHAR) maxcol = 0; if (++m_posHorz > maxcol) { if (m_posVert < maxrow) { - maxcol = MAXCOL(++m_posVert); // TODO not stored into maxcol? + ++m_posVert; + maxcol = MAXCOL(m_posVert); // TODO not stored into maxcol? if (maxcol < 0) m_posVert++; m_posHorz = 0; } @@ -296,8 +305,12 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa else { ++scrollRE; if (m_posHorz-- == 0) { - if (m_posVert-- == 0) { + if (m_posVert-- <= 0) { +#ifdef NAVIGATION_RE1 + m_posVert = menuTab ? 0 : -1; +#else m_posVert = 0; +#endif m_posHorz = 0; scrollRE = 0; } @@ -376,8 +389,11 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa case EVT_KEY_FIRST(KEY_DOWN): //inc if(s_editMode>0)break; do { - INC(m_posVert,maxrow); + INC(m_posVert, maxrow); } while(MAXCOL(m_posVert) == (uint8_t)-1); +#ifdef NAVIGATION_RE1 + s_editMode = 0; +#endif m_posHorz = min(m_posHorz, MAXCOL(m_posVert)); BLINK_SYNC; break; @@ -405,7 +421,11 @@ MenuFuncP g_menuStack[5]; uint8_t g_menuPos[4]; uint8_t g_menuStackPtr = 0; +#ifdef NAVIGATION_RE1 +int8_t m_posVert; +#else uint8_t m_posVert; +#endif uint8_t m_posHorz; void popMenu() diff --git a/src/menus.h b/src/menus.h index 83d1a31e3..fb57f81cd 100644 --- a/src/menus.h +++ b/src/menus.h @@ -94,7 +94,7 @@ extern int16_t p1valdiff; #endif #endif -extern int8_t checkIncDec_Ret; // global helper vars +extern int8_t checkIncDec_Ret; // global helper vars extern int8_t s_editMode; // global editmode int16_t checkIncDec(uint8_t event, int16_t i_pval, int16_t i_min, int16_t i_max, uint8_t i_flags); @@ -108,7 +108,11 @@ int8_t checkIncDecGen(uint8_t event, int8_t i_val, int8_t i_min, int8_t i_max); var = checkIncDecGen(event,var,min,max) // Menus related stuff ... +#ifdef NAVIGATION_RE1 +extern int8_t m_posVert; +#else extern uint8_t m_posVert; +#endif extern uint8_t m_posHorz; inline void minit(){m_posVert=m_posHorz=0;} bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, const pm_uint8_t *subTab, uint8_t subTabMax, uint8_t maxrow); diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 8aff6fdcf..090f3f7bc 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -185,6 +185,10 @@ void menuProcModelSelect(uint8_t event) int8_t oldSub = m_posVert; if (!check_submenu_simple(_event_, MAX_MODELS-1)) return; +#ifdef NAVIGATION_RE1 + if (m_posVert < 0) m_posVert = 0; +#endif + int8_t sub = m_posVert; lcd_puts(9*FW-(LEN_FREE-4)*FW, 0, STR_FREE); @@ -624,7 +628,7 @@ void menuProcPhaseOne(uint8_t event) PhaseData *phase = phaseaddress(s_currIdx); putsFlightPhase(13*FW, 0, s_currIdx+1, 0); - SUBMENU(STR_MENUFLIGHTPHASE, (s_currIdx==0 ? 3 : 5), {ZCHAR|(sizeof(phase->name)-1), 0, 3/*, 0, 0*/}); + SUBMENU(STR_MENUFLIGHTPHASE, (s_currIdx==0 ? 3 : 5), {ZCHAR|(sizeof(phase->name)-1), 0, 3, 0/*, 0*/}); int8_t sub = m_posVert; @@ -849,8 +853,14 @@ void menuProcCurveOne(uint8_t event) case EVT_ENTRY: dfltCrv = 0; autoThrStep = 0; +#ifdef NAVIGATION_RE1 + s_editMode = -1; +#endif break; case EVT_KEY_FIRST(KEY_MENU): +#ifdef NAVIGATION_RE1 + case EVT_KEY_BREAK(BTN_RE1): +#endif if (s_editMode<=0) { switch (m_posHorz) { case 0: @@ -1148,9 +1158,9 @@ void menuProcExpoOne(uint8_t event) SIMPLE_SUBMENU(STR_MENUDREXPO, 6); - int8_t sub = m_posVert; + int8_t sub = m_posVert; - uint8_t y = FH; + uint8_t y = FH; for (uint8_t i=0; i<7; i++) { lcd_putsnAtt(0, y, STR_EXPLABELS+LEN_EXPLABELS*i, LEN_EXPLABELS, 0); @@ -1180,23 +1190,22 @@ void menuProcMixOne(uint8_t event) putsChn(lcd_lastPos+1*FW,0,md2->destCh,0); SIMPLE_SUBMENU_NOTITLE(13); - int8_t sub = m_posVert; + int8_t sub = m_posVert; - for(uint8_t k=0; k<7; k++) - { + for (uint8_t k=0; k<7; k++) { uint8_t y = (k+1) * FH; uint8_t i = k + s_pgOfs; uint8_t attr = sub==i ? INVERS : 0; switch(i) { case 0: - lcd_puts( 2*FW,y,STR_SOURCE); - putsChnRaw( FW*10,y,md2->srcRaw,attr); - if(attr) CHECK_INCDEC_MODELVAR( event, md2->srcRaw, 1,NUM_XCHNRAW); + lcd_puts(2*FW, y, STR_SOURCE); + putsChnRaw(FW*10, y, md2->srcRaw, attr); + if(attr) CHECK_INCDEC_MODELVAR(event, md2->srcRaw, 1,NUM_XCHNRAW); break; case 1: lcd_puts( 2*FW,y,STR_WEIGHT); lcd_outdezAtt(FW*10,y,md2->weight,attr|LEFT); - if(attr) CHECK_INCDEC_MODELVAR( event, md2->weight, -125,125); + if(attr) CHECK_INCDEC_MODELVAR(event, md2->weight, -125,125); break; case 2: lcd_puts( 2*FW,y,STR_OFFSET); @@ -1350,7 +1359,11 @@ void menuProcExpoMix(uint8_t expo, uint8_t _event_) lcd_puts(lcd_lastPos, 0, expo ? PSTR("/14") : PSTR("/32")); SIMPLE_MENU_NOTITLE(menuTabModel, expo ? e_ExposAll : e_MixAll, s_maxLines); +#ifdef NAVIGATION_RE1 + int8_t sub = m_posVert; +#else uint8_t sub = m_posVert; +#endif switch(_event) { @@ -1394,7 +1407,14 @@ void menuProcExpoMix(uint8_t expo, uint8_t _event_) break; } // no break +#ifdef NAVIGATION_RE1 + case EVT_KEY_BREAK(BTN_RE1): + case EVT_KEY_LONG(BTN_RE1): + if (sub == 0) + break; +#endif case EVT_KEY_LONG(KEY_MENU): + killEvents(_event); if (s_copyTgtOfs) { s_copyMode = 0; s_copyTgtOfs = 0; @@ -1409,7 +1429,6 @@ void menuProcExpoMix(uint8_t expo, uint8_t _event_) s_copyMode = 0; return; } - killEvents(_event); break; case EVT_KEY_LONG(KEY_LEFT): case EVT_KEY_LONG(KEY_RIGHT): @@ -1622,6 +1641,9 @@ void menuProcCurvesAll(uint8_t event) switch (event) { case EVT_KEY_FIRST(KEY_RIGHT): case EVT_KEY_FIRST(KEY_MENU): +#ifdef NAVIGATION_RE1 + case EVT_KEY_BREAK(BTN_RE1): +#endif if (sub >= 0) { s_curveChan = sub; pushMenu(menuProcCurveOne); diff --git a/src/o9xstrings.cpp b/src/o9xstrings.cpp index aabf9117f..fe282684d 100644 --- a/src/o9xstrings.cpp +++ b/src/o9xstrings.cpp @@ -270,3 +270,7 @@ const pm_char STR_RXNUM[] PROGMEM = TR_RXNUM; #if defined(PXX) const pm_char STR_SYNCMENU[] PROGMEM = TR_SYNCMENU; #endif + +#if defined(NAVIGATION_RE1) +const pm_char STR_BACK[] PROGMEM = TR_BACK; +#endif diff --git a/src/o9xstrings.h b/src/o9xstrings.h index 0c5266272..7231fb6c0 100644 --- a/src/o9xstrings.h +++ b/src/o9xstrings.h @@ -325,5 +325,7 @@ extern const pm_char STR_MENUSTAT[]; extern const pm_char STR_MENUDEBUG[]; extern const pm_char STR_RXNUM[]; extern const pm_char STR_SYNCMENU[]; +extern const pm_char STR_BACK[]; +#define LEN_BACK PSIZE(TR_BACK) #endif diff --git a/src/translations/en.h b/src/translations/en.h index 477667706..3b47dcc5b 100644 --- a/src/translations/en.h +++ b/src/translations/en.h @@ -297,3 +297,4 @@ #define TR_MENUDEBUG "DEBUG" #define TR_RXNUM "RxNum" #define TR_SYNCMENU "Sync [MENU]" +#define TR_BACK "Back" diff --git a/src/translations/fr.h b/src/translations/fr.h index 3564f9f9a..b296199c1 100644 --- a/src/translations/fr.h +++ b/src/translations/fr.h @@ -297,3 +297,4 @@ #define TR_MENUDEBUG "DEBUG" #define TR_RXNUM "RxNum" #define TR_SYNCMENU "Sync [MENU]" +#define TR_BACK "Back"