From e616c4674dd24a42d71a7d92ce0f2d12808c7d90 Mon Sep 17 00:00:00 2001 From: bsongis Date: Wed, 13 Feb 2013 06:35:45 +0000 Subject: [PATCH] [Rotary encoders] Navigation system reworked --- src/general_menus.cpp | 41 ++-- src/gruvin9x/board_gruvin9x.cpp | 8 +- src/keys.cpp | 14 +- src/main_views.cpp | 15 +- src/menus.cpp | 379 ++++++++++++++------------------ src/menus.h | 79 +++---- src/model_menus.cpp | 122 ++++------ src/open9x.cpp | 31 ++- src/open9x.h | 72 +++++- src/simpgmspace.cpp | 16 +- src/simpgmspace.h | 4 +- src/simu.cpp | 18 ++ src/stock/board_stock.cpp | 22 +- src/stock/board_stock.h | 1 + src/translations.cpp | 6 +- src/translations.h | 13 +- src/translations/cz.h | 1 - src/translations/de.h | 1 - src/translations/en.h | 1 - src/translations/es.h | 1 - src/translations/fr.h | 1 - src/translations/it.h | 1 - src/translations/pt.h | 1 - src/translations/se.h | 1 - 24 files changed, 417 insertions(+), 432 deletions(-) diff --git a/src/general_menus.cpp b/src/general_menus.cpp index bbb845c69..b5df41a47 100644 --- a/src/general_menus.cpp +++ b/src/general_menus.cpp @@ -367,14 +367,11 @@ void menuGeneralSetup(uint8_t event) if(attr) g_eeGeneral.inactivityTimer = checkIncDec(event, g_eeGeneral.inactivityTimer, 0, 250, EE_GENERAL); //0..250minutes break; -#if defined(ROTARY_ENCODERS) && NUM_ROTARY_ENCODERS > 0 +#if ROTARY_ENCODERS > 0 case ITEM_SETUP_RE_NAVIGATION: g_eeGeneral.reNavigation = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_RENAVIG, STR_VRENAVIG, g_eeGeneral.reNavigation, 0, NUM_ROTARY_ENCODERS, attr, event); if (attr && checkIncDec_Ret) { - for (uint8_t i=0; i 0) { + REPEAT_LAST_CURSOR_MOVE(); + } +#endif break; } } @@ -538,14 +540,14 @@ void menuGeneralSdManager(uint8_t event) f_chdir(ROOT_PATH); reusableBuffer.sd.offset = 65535; break; -#if defined(ROTARY_ENCODERS) - case EVT_KEY_FIRST_ROTARY_ENCODERS: - if (!IS_RE_NAVIGATION_EVT(event)) - break; - // no break -#endif + +#if defined(PCBX9D) + case EVT_KEY_BREAK(KEY_ENTER): +#else + CASE_EVT_ROTARY_BREAK case EVT_KEY_FIRST(KEY_RIGHT): case EVT_KEY_FIRST(KEY_ENTER): +#endif { if (m_posVert > 0) { uint8_t index = m_posVert-1-s_pgOfs; @@ -554,18 +556,17 @@ void menuGeneralSdManager(uint8_t event) s_pgOfs = 0; m_posVert = 1; reusableBuffer.sd.offset = 65535; + break; } } - break; - } -#if defined(ROTARY_ENCODERS) - case EVT_KEY_LONG_ROTARY_ENCODERS: - if (!IS_RE_NAVIGATION_EVT(event)) + if (!IS_ROTARY_BREAK(event) || m_posVert==0) break; - // no break -#endif + // no break; + } + case EVT_KEY_LONG(KEY_ENTER): killEvents(event); + _event = 0; if (m_posVert == 0) { s_menu[s_menu_count++] = STR_SD_INFO; s_menu[s_menu_count++] = STR_SD_FORMAT; @@ -863,8 +864,8 @@ void menuGeneralDiagKeys(uint8_t event) } } -#if defined (ROTARY_ENCODERS) - for(uint8_t i=0; i0 && (event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP)))) { +#if defined(PCBX9D) + if (s_editMode>0 && (IS_ROTARY_RIGHT(event) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP))) { +#else + if (event==EVT_KEY_FIRST(KEY_RIGHT) || event==EVT_KEY_REPT(KEY_RIGHT) || (s_editMode>0 && (IS_ROTARY_RIGHT(event) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP)))) { +#endif newval++; AUDIO_KEYPAD_UP(); } - else if (event==EVT_KEY_FIRST(KEY_LEFT) || event==EVT_KEY_REPT(KEY_LEFT) || (s_editMode>0 && (event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)))) { +#if defined(PCBX9D) + else if (s_editMode>0 && (IS_ROTARY_LEFT(event) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN))) { +#else + else if (event==EVT_KEY_FIRST(KEY_LEFT) || event==EVT_KEY_REPT(KEY_LEFT) || (s_editMode>0 && (IS_ROTARY_LEFT(event) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)))) { +#endif newval--; AUDIO_KEYPAD_DOWN(); } - if (i_min==0 && i_max==1 && event==EVT_KEY_BREAK(KEY_ENTER)) { + if (i_min==0 && i_max==1 && (event==EVT_KEY_BREAK(KEY_ENTER) || IS_ROTARY_BREAK(event))) { s_editMode = 0; newval = !val; } -#if defined(PCBX9D) || defined(ROTARY_ENCODER_NAVIGATION) || defined(NAVIGATION_POT1) - //change values based on P1 +#if defined(NAVIGATION_POT1) + // change values based on P1 newval -= p1valdiff; p1valdiff = 0; #endif @@ -167,7 +171,7 @@ int16_t checkIncDec(uint8_t event, int16_t val, int16_t i_min, int16_t i_max, ui } if (newval != val) { - if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && (newval==0 || newval==-100 || newval==+100)) { + if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && (newval==0 || newval==-100 || newval==+100) && !IS_ROTARY_EVENT(event)) { pauseEvents(event); // delay before auto-repeat continues if (newval>val) // without AUDIO it's optimized, because the 2 sounds are the same AUDIO_KEYPAD_UP(); @@ -205,56 +209,6 @@ bool check_submenu_simple(check_event_t event, uint8_t maxrow) return check_simple(event, 0, 0, 0, maxrow); } -#if defined(PCBX9D) -void check_rotary_encoder(uint8_t & event) -{ - if (lastCursorMove < -1 || event==EVT_KEY_REPT(KEY_MOVE_UP) || event==EVT_KEY_FIRST(KEY_MOVE_UP)) { - scrollRE = -1; - } - else if (lastCursorMove > 1 || event==EVT_KEY_REPT(KEY_MOVE_DOWN) || event==EVT_KEY_FIRST(KEY_MOVE_DOWN)) { - scrollRE = 1; - } - else { - scrollRE = 0; - } - - if (s_editMode > 0) { - p1valdiff = scrollRE; - scrollRE = 0; - } - - // TODO remove later... - uint8_t key = EVT_KEY_MASK(event); - if (key==KEY_MOVE_UP || key==KEY_MOVE_DOWN) - event = 0; -} -#elif defined(ROTARY_ENCODER_NAVIGATION) -void check_rotary_encoder() -{ - // check rotary encoder 1 if changed -> cursor down/up - static int16_t rePreviousValue; - - if (IS_RE_NAVIGATION_ENABLE()) { - uint8_t re = NAVIGATION_RE_IDX(); - p1valdiff = 0; - int16_t reNewValue = (g_rotenc[re] / ROTARY_ENCODER_GRANULARITY); - scrollRE = rePreviousValue - reNewValue; - if (scrollRE) { - rePreviousValue = reNewValue; - if (s_editMode > 0) { - p1valdiff = -scrollRE; - scrollRE = 0; - } - } - } - else { - rePreviousValue = 0; - p1valdiff = 0; - scrollRE = 0; - } -} -#endif - void title(const pm_char * s) { lcd_putsAtt(0, 0, s, INVERS); @@ -263,27 +217,16 @@ void title(const pm_char * s) #define SCROLL_TH 64 #define SCROLL_POT1_TH 32 -#if defined(ROTARY_ENCODER_NAVIGATION) -#define MAXCOL(row) ((horTab && row >= 0) ? pgm_read_byte(horTab+min(row, (maxrow_t)horTabMax)) : (const uint8_t)0) -#else #define MAXCOL(row) (horTab ? pgm_read_byte(horTab+min(row, (maxrow_t)horTabMax)) : (const uint8_t)0) -#endif - -#define INC(val,max) if(val0 ) {val--;} else {val=max;} - -#if defined(PCBX9D) || defined(PCBACT) -#define RE_NAV_ENTER (KEY_ENTER) -#define SCROLL(min, val, max) ((val) > (max) ? ((min) + (val) - (max) - 1) : ((val) < (min) ? ((max) - (min) + (val) + 1) : (val))) -#else -#define RE_NAV_ENTER (BTN_REa+g_eeGeneral.reNavigation-1) -#define SCROLL(min, val, max) limit(min, val, max) -#endif +#define INC(val, min, max) if (valmin) {val--;} else {val=max;} #if defined(PCBX9D) -#define POS_VERT_INIT (menuTab ? (MAXCOL((int16_t)1) == 255 ? 2 : 1) : 0) +#define IS_ROTARY_SHORT(evt) (evt==EVT_KEY_BREAK(KEY_ENTER)) +#define SCROLL(min, val, max) ((val) > (max) ? ((min) + (val) - (max) - 1) : ((val) < (min) ? ((max) - (min) + (val) + 1) : (val))) #else -#define POS_VERT_INIT 0 +#define IS_ROTARY_SHORT(evt) (evt==EVT_ROTARY_BREAK) +#define SCROLL(min, val, max) limit(min, val, max) #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) @@ -293,29 +236,6 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t uint8_t maxcol = MAXCOL(l_posVert); -#if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBX9D) - if (!(s_warning || s_menu_count)) - CHECK_ROTARY_ENCODER(event); -#endif - -#if defined(ROTARY_ENCODER_NAVIGATION) - if (l_posVert < 0 && (event==EVT_KEY_BREAK(RE_NAV_ENTER) || event==EVT_KEY_BREAK(KEY_MENU))) { - popMenu(); - return false; - } -#endif - -#if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBX9D) - if (IS_RE_NAVIGATION_ENABLE() && event==EVT_KEY_BREAK(RE_NAV_ENTER) && s_editMode != EDIT_MODIFY_STRING) { - scrollRE = 0; - if (s_editMode++ > 0) s_editMode = 0; - if (s_editMode > 0 && l_posVert == 0 && menuTab) s_editMode = -1; - if (maxrow == 0) s_editMode = -1; - } -#else -#define scrollRE 0 -#endif - #ifdef NAVIGATION_POT1 // check pot 1 - if changed -> scroll values static int16_t p1valprev; @@ -341,7 +261,7 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t #define scrollUD 0 #endif - if (scrollRE || scrollLR || scrollUD || p1valdiff) backlightOn(); // on keypress turn the light on + if (scrollLR || scrollUD || p1valdiff) backlightOn(); // on keypress turn the light on if (menuTab) { uint8_t attr = 0; @@ -369,17 +289,37 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t return false; } #else + if (l_posVert==0 && !s_noScroll) { attr = INVERS; int8_t cc = curr; - if (scrollLR || (scrollRE && s_editMode < 0)) { - cc = SCROLL((int8_t)0, (int8_t)(cc - scrollLR + scrollRE), (int8_t)(menuTabSize-1)); + if (scrollLR) { + cc = SCROLL((int8_t)0, (int8_t)(cc - scrollLR), (int8_t)(menuTabSize-1)); } switch(event) { +#if defined(ROTARY_ENCODER_NAVIGATION) + case EVT_ROTARY_BREAK: + if (s_editMode < 0 && maxrow > 0) { + s_editMode = 0; + // TODO ? l_posVert = (horTab && horTab[1]==0xff) ? 2 : 1; + l_posHorz = 0; + } + else { + s_editMode = -1; + } + event = 0; + break; +#endif + case EVT_KEY_FIRST(KEY_LEFT): +#if defined(ROTARY_ENCODER_NAVIGATION) + case EVT_ROTARY_LEFT: + if (s_editMode >= 0) + break; +#endif if (curr > 0) cc = curr - 1; else @@ -387,6 +327,11 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t break; case EVT_KEY_FIRST(KEY_RIGHT): +#if defined(ROTARY_ENCODER_NAVIGATION) + case EVT_ROTARY_RIGHT: + if (s_editMode >= 0) + break; +#endif if (curr < (menuTabSize-1)) cc = curr + 1; else @@ -414,11 +359,6 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t displayScrollbar(LCD_W-1, FH, LCD_H-FH, s_pgOfs, maxrow, LCD_LINES-1); #endif } -#if defined(ROTARY_ENCODER_NAVIGATION) - else if (l_posVert < 0) { - lcd_putsAtt(LCD_W-LEN_BACK*FW, 0, STR_BACK, INVERS); - } -#endif DISPLAY_PROGRESS_BAR(menuTab ? lcdLastPos-2*FW-((curr+1)/10*FWNUM)-2 : 20*FW+1); @@ -431,70 +371,6 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t if (scrollLR && l_posVert>0) { l_posHorz = limit((int8_t)0, (int8_t)(l_posHorz - scrollLR), (int8_t)maxcol); } - -#if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBX9D) - lastCursorMove = 0; -#if defined(PCBX9D) - // TODO remove that - while (s_editMode<=0 && scrollRE) { -#else - while (s_editMode==0 && scrollRE) { -#endif - if (scrollRE > 0) { - --scrollRE; - maxcol = MAXCOL(l_posVert); - lastCursorMove = +1; - if (++l_posHorz > maxcol) { - if (l_posVert < maxrow) { - do { - ++l_posVert; - } while(MAXCOL(l_posVert) == (uint8_t)-1); - maxcol = MAXCOL(l_posVert); - l_posHorz = 0; - } - else { -#if defined(PCBX9D) - l_posVert = POS_VERT_INIT; - l_posHorz = 0; - s_pgOfs = 0; -#else - --l_posHorz; - scrollRE = 0; -#endif - } - } - } - else { - ++scrollRE; - lastCursorMove = -1; - if (l_posHorz-- == 0) { - do { - --l_posVert; - } while(MAXCOL(l_posVert) == (uint8_t)-1); -#if defined(PCBX9D) - if (l_posVert < (menuTab ? 1 : 0)) { - l_posVert = maxrow; - l_posHorz = MAXCOL(l_posVert); - } - else if (l_posVert == (menuTab ? 0 : -1)) { - l_posHorz = 0; - } -#else - if (l_posVert <= (menuTab ? 0 : -1)) { - l_posVert = menuTab ? 0 : -1; - l_posHorz = 0; - scrollRE = 0; - } -#endif - else { - maxcol = MAXCOL(l_posVert); - l_posHorz = maxcol; - } - } - } - } -#endif - } switch(event) @@ -504,41 +380,53 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t l_posHorz = 0; #if defined(ROTARY_ENCODER_NAVIGATION) if (menuTab) { - s_editMode = -1; + s_editMode = EDIT_MODE_INIT; break; } // no break #else - s_editMode = -1; // TODO why not 0? + s_editMode = EDIT_MODE_INIT; break; #endif + #if defined(ROTARY_ENCODER_NAVIGATION) case EVT_ENTRY_UP: s_editMode = 0; break; #endif - case EVT_KEY_FIRST(KEY_MENU): + +#if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBX9D) + case EVT_ROTARY_BREAK: + if (s_editMode > 1) break; +#endif + +#if !defined(PCBX9D) + case EVT_KEY_FIRST(KEY_ENTER): +#endif if (!menuTab || l_posVert>0) s_editMode = (s_editMode<=0); break; #if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_KEY_LONG_ROTARY_ENCODERS: - if (l_posVert!=0 || !IS_RE_NAVIGATION_EVT(event)) - break; + case EVT_ROTARY_LONG: + if (s_editMode > 1) break; killEvents(event); + if (l_posVert != POS_VERT_INIT) { + l_posVert = POS_VERT_INIT; + s_editMode = EDIT_MODE_INIT; + break; + } // no break #endif - case EVT_KEY_LONG(KEY_EXIT): - s_editMode = 0; + s_editMode = 0; // TODO needed? we call ENTRY_UP after which does the same popMenu(); - break; + return false; case EVT_KEY_BREAK(KEY_EXIT): #if defined(ROTARY_ENCODER_NAVIGATION) - if (s_editMode==0) - s_editMode = -1; + if (s_editMode == 0) + s_editMode = EDIT_MODE_INIT; else #endif if (s_editMode>0) { @@ -546,15 +434,17 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t break; } #if defined(PCBX9D) - uint8_t posVertInit = POS_VERT_INIT; - if (s_pgOfs != 0 || l_posHorz != 0 || l_posVert != posVertInit) { - s_pgOfs = 0; - l_posVert = posVertInit; - l_posHorz = 0; - } - else { - popMenu(); - return false; + { + uint8_t posVertInit = POS_VERT_INIT; + if (s_pgOfs != 0 || l_posHorz != 0 || l_posVert != posVertInit) { + s_pgOfs = 0; + l_posVert = posVertInit; + l_posHorz = 0; + } + else { + popMenu(); + return false; + } } #else if (l_posVert==0 || !menuTab) { @@ -569,45 +459,95 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t #endif break; -#if !defined(PCBX9D) && !defined(PCBACT) +#if !defined(PCBX9D) 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, maxcol); +#endif + +#if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBX9D) + CASE_EVT_ROTARY_MOVE_RIGHT + if (s_editMode != 0) break; + // TODO s_editMode test is duplicated + // TODO could be written in a smarter way! + if (l_posHorz < maxcol) { + l_posHorz++; + break; + } + else { + l_posHorz = 0; + if (!IS_ROTARY_MOVE_RIGHT(event)) + break; + } +#else + INC(l_posHorz, 0, maxcol); break; +#endif + +#if !defined(PCBX9D) + case EVT_KEY_REPT(KEY_DOWN): //inc + if (!IS_ROTARY_RIGHT(event) && l_posVert==maxrow) break; + // no break + + case EVT_KEY_FIRST(KEY_DOWN): //inc + if (s_editMode>0) break; +#endif + do { + INC(l_posVert, POS_VERT_INIT, maxrow); + } while (MAXCOL(l_posVert) == (uint8_t)-1); + +#if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBX9D) + s_editMode = 0; // TODO why? +#endif + l_posHorz = min(l_posHorz, MAXCOL(l_posVert)); + break; + +#if !defined(PCBX9D) 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, maxcol); - break; - case EVT_KEY_REPT(KEY_DOWN): //inc - if (l_posVert==maxrow) break; - // no break - case EVT_KEY_FIRST(KEY_DOWN): //inc - if (s_editMode>0) break; - do { - INC(l_posVert, maxrow); - } while (MAXCOL(l_posVert) == (uint8_t)-1); -#if defined(ROTARY_ENCODER_NAVIGATION) - s_editMode = 0; #endif - l_posHorz = min(l_posHorz, MAXCOL(l_posVert)); + +#if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBX9D) + CASE_EVT_ROTARY_MOVE_LEFT + // TODO could be written in a smarter way! + if (s_editMode != 0) break; + if (l_posHorz > 0) { + l_posHorz--; + break; + } + else if (IS_ROTARY_MOVE_LEFT(event) && s_editMode == 0) { + l_posHorz = 0xff; + } + else { + l_posHorz = maxcol; + break; + } +#else + DEC(l_posHorz, 0, maxcol); break; +#endif + +#if !defined(PCBX9D) case EVT_KEY_REPT(KEY_UP): //dec - if (l_posVert==0) break; + if (!IS_ROTARY_LEFT(event) && l_posVert==0) break; // no break case EVT_KEY_FIRST(KEY_UP): //dec - if (s_editMode>0)break; + if (s_editMode>0) break; +#endif + do { - DEC(l_posVert, maxrow); + DEC(l_posVert, POS_VERT_INIT, maxrow); } while(MAXCOL(l_posVert) == (uint8_t)-1); l_posHorz = min(l_posHorz, MAXCOL(l_posVert)); break; -#endif + } uint8_t max = menuTab ? LCD_LINES-1 : LCD_LINES-2; @@ -699,10 +639,7 @@ void displayWarning(uint8_t event) lcd_puts(16, 5*FH, s_warning_type == WARNING_TYPE_CONFIRM ? STR_POPUPS : STR_EXIT); switch(event) { #if defined(ROTARY_ENCODERS) - case EVT_KEY_BREAK_ROTARY_ENCODERS: - if (!IS_RE_NAVIGATION_EVT(event)) - break; - // no break + case EVT_ROTARY_BREAK: #endif case EVT_KEY_BREAK(KEY_ENTER): if (s_warning_type == WARNING_TYPE_ASTERISK) @@ -813,6 +750,7 @@ const char * displayMenu(uint8_t event) } switch(event) { + CASE_EVT_ROTARY_RIGHT case EVT_KEY_BREAK(KEY_MOVE_UP): if (s_menu_item > 0) s_menu_item--; @@ -821,6 +759,10 @@ const char * displayMenu(uint8_t event) result = STR_UPDATE_LIST; } break; + +#if defined(ROTARY_ENCODER_NAVIGATION) + CASE_EVT_ROTARY_LEFT +#endif case EVT_KEY_BREAK(KEY_MOVE_DOWN): if (s_menu_item < display_count - 1 && s_menu_offset + s_menu_item + 1 < s_menu_count) s_menu_item++; @@ -829,9 +771,14 @@ const char * displayMenu(uint8_t event) result = STR_UPDATE_LIST; } break; + CASE_EVT_ROTARY_BREAK case EVT_KEY_BREAK(KEY_ENTER): result = s_menu[s_menu_item]; // no break +#if defined(ROTARY_ENCODER_NAVIGATION) + CASE_EVT_ROTARY_LONG + killEvents(event); +#endif case EVT_KEY_BREAK(KEY_EXIT): s_menu_count = 0; s_menu_item = 0; diff --git a/src/menus.h b/src/menus.h index e5a6d07a3..06db385b2 100644 --- a/src/menus.h +++ b/src/menus.h @@ -102,46 +102,12 @@ void menuModelCustomFunctions(uint8_t event); void menuStatisticsView(uint8_t event); void menuStatisticsDebug(uint8_t event); -#if defined(PCBX9D) || defined(ROTARY_ENCODER_NAVIGATION) - extern int8_t scrollRE; - extern int16_t p1valdiff; // TODO 0 in case of PCBX9D? - extern int8_t lastCursorMove; -#elif defined(NAVIGATION_POT1) +#if defined(NAVIGATION_POT1) extern int16_t p1valdiff; #else #define p1valdiff 0 #endif -#if defined(PCBX9D) || defined(PCBACT) - #define IS_RE_NAVIGATION_ENABLE() true - #define NAVIGATION_RE_IDX() 0 - #define IS_RE_NAVIGATION_EVT_TYPE(event, type) (event==type(KEY_ENTER)) - #define IS_RE_NAVIGATION_EVT(event) (EVT_KEY_MASK(event)==KEY_ENTER) -#elif defined(ROTARY_ENCODERS) - #define NAVIGATION_RE_IDX() (g_eeGeneral.reNavigation - 1) - #define IS_RE_NAVIGATION_ENABLE() g_eeGeneral.reNavigation - #define IS_RE_NAVIGATION_EVT_TYPE(event, type) (g_eeGeneral.reNavigation && event==type(BTN_REa + g_eeGeneral.reNavigation - 1)) - #define IS_RE_NAVIGATION_EVT(event) (g_eeGeneral.reNavigation && EVT_KEY_MASK(event)==(BTN_REa + g_eeGeneral.reNavigation - 1)) -#elif defined(ROTARY_ENCODER_NAVIGATION) - #define IS_RE_NAVIGATION_ENABLE() true - #define NAVIGATION_RE_IDX() 0 - #define IS_RE_NAVIGATION_EVT_TYPE(event, type) (event==type(BTN_REa)) - #define IS_RE_NAVIGATION_EVT(event) (EVT_KEY_MASK(event)==BTN_REa) -#else - #define IS_RE_NAVIGATION_EVT_TYPE(event, type) (0) - #define IS_RE_NAVIGATION_EVT(event) (0) -#endif - -#if ROTARY_ENCODERS > 1 -#define EVT_KEY_FIRST_ROTARY_ENCODERS EVT_KEY_FIRST(BTN_REa): case EVT_KEY_FIRST(BTN_REb) -#define EVT_KEY_BREAK_ROTARY_ENCODERS EVT_KEY_BREAK(BTN_REa): case EVT_KEY_BREAK(BTN_REb) -#define EVT_KEY_LONG_ROTARY_ENCODERS EVT_KEY_LONG(BTN_REa): case EVT_KEY_LONG(BTN_REb) -#else -#define EVT_KEY_FIRST_ROTARY_ENCODERS EVT_KEY_FIRST(BTN_REa) -#define EVT_KEY_BREAK_ROTARY_ENCODERS EVT_KEY_BREAK(BTN_REa) -#define EVT_KEY_LONG_ROTARY_ENCODERS EVT_KEY_LONG(BTN_REa) -#endif - extern int8_t checkIncDec_Ret; // global helper vars #define EDIT_SELECT_MENU -1 @@ -180,19 +146,9 @@ 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(PCBX9D) -void check_rotary_encoder(uint8_t & event); -#define CHECK_ROTARY_ENCODER(event) check_rotary_encoder(event) -#elif defined(ROTARY_ENCODER_NAVIGATION) -void check_rotary_encoder(); -#define CHECK_ROTARY_ENCODER(event) check_rotary_encoder() -#endif - // Menus related stuff ... #if defined(SDCARD) -#define maxrow_t int16_t -#elif defined(ROTARY_ENCODER_NAVIGATION) -#define maxrow_t int8_t +#define maxrow_t uint16_t #else #define maxrow_t uint8_t #endif @@ -300,14 +256,33 @@ void menuChannelsMonitor(uint8_t event); #define KEY_MOVE_DOWN KEY_DOWN #endif -#if defined(ROTARY_ENCODERS) || defined(PCBX9D) - #define CURSOR_MOVED_LEFT(event) (EVT_KEY_MASK(event) == KEY_LEFT || lastCursorMove < 0) - #define CURSOR_MOVED_RIGHT(event) (EVT_KEY_MASK(event) == KEY_RIGHT || lastCursorMove > 0) - #define REPEAT_LAST_CURSOR_MOVE() if (lastCursorMove) lastCursorMove *= 2; else m_posHorz = 0 +#define CURSOR_MOVED_LEFT(event) (IS_ROTARY_LEFT(event) || EVT_KEY_MASK(event) == KEY_LEFT) +#define CURSOR_MOVED_RIGHT(event) (IS_ROTARY_RIGHT(event) || EVT_KEY_MASK(event) == KEY_RIGHT) + +#if defined(PCBX9D) +#define CASE_EVT_ROTARY_MOVE_RIGHT CASE_EVT_ROTARY_LEFT +#define CASE_EVT_ROTARY_MOVE_LEFT CASE_EVT_ROTARY_RIGHT +#define IS_ROTARY_MOVE_RIGHT IS_ROTARY_LEFT +#define IS_ROTARY_MOVE_LEFT IS_ROTARY_RIGHT +#else +#define CASE_EVT_ROTARY_MOVE_RIGHT CASE_EVT_ROTARY_RIGHT +#define CASE_EVT_ROTARY_MOVE_LEFT CASE_EVT_ROTARY_LEFT +#define IS_ROTARY_MOVE_RIGHT IS_ROTARY_RIGHT +#define IS_ROTARY_MOVE_LEFT IS_ROTARY_LEFT +#endif + +#if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBX9D) + #define REPEAT_LAST_CURSOR_MOVE() putEvent(event) #else - #define CURSOR_MOVED_LEFT(event) (EVT_KEY_MASK(event) == KEY_LEFT) - #define CURSOR_MOVED_RIGHT(event) (EVT_KEY_MASK(event) == KEY_RIGHT) #define REPEAT_LAST_CURSOR_MOVE() m_posHorz = 0; #endif +#if defined(PCBX9D) + #define POS_VERT_INIT (menuTab ? (MAXCOL((uint16_t)1) == 255 ? 2 : 1) : 0) + #define EDIT_MODE_INIT 0 // TODO enum +#else + #define POS_VERT_INIT 0 + #define EDIT_MODE_INIT -1 +#endif + #endif diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 056e34548..ec9a6c6d9 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -239,18 +239,15 @@ void menuModelSelect(uint8_t event) event = 0; } #endif - uint8_t _event_ = (IS_RE_NAVIGATION_EVT(event) ? 0 : event); + + uint8_t _event_ = (IS_ROTARY_BREAK(event) || IS_ROTARY_LONG(event) ? 0 : event); if (s_copyMode && (event & 0x1f) == KEY_EXIT) _event_ -= KEY_EXIT; int8_t oldSub = m_posVert; if (!check_submenu_simple(_event_, MAX_MODELS-1)) return; -#if defined(PCBX9D) || defined(PCBACT) - if (m_posVert < 0) m_posVert = MAX_MODELS-1; -#elif defined(ROTARY_ENCODER_NAVIGATION) - if (m_posVert < 0) m_posVert = 0; -#endif + if (s_editMode > 0) s_editMode = 0; #if !defined(CPUARM) @@ -268,19 +265,12 @@ void menuModelSelect(uint8_t event) int8_t sub = m_posVert; -#if defined(ROTARY_ENCODER_NAVIGATION) - if (scrollRE > 0 && s_editMode < 0) { - chainMenu(menuModelSetup); - return; - } -#endif - - switch(event) + switch (event) { case EVT_ENTRY: m_posVert = sub = g_eeGeneral.currModel; s_copyMode = 0; - s_editMode = -1; + s_editMode = EDIT_MODE_INIT; eeCheck(true); break; case EVT_KEY_LONG(KEY_EXIT): @@ -298,14 +288,17 @@ void menuModelSelect(uint8_t event) } break; #if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_KEY_BREAK_ROTARY_ENCODERS: - if (IS_RE_NAVIGATION_EVT(event)) - s_editMode = (s_editMode == 0 && sub == g_eeGeneral.currModel) ? -1 : 0; + case EVT_ROTARY_BREAK: + s_editMode = (s_editMode == 0 && sub == g_eeGeneral.currModel) ? -1 : 0; break; - case EVT_KEY_LONG_ROTARY_ENCODERS: - if (!IS_RE_NAVIGATION_EVT(event)) - break; - // no break + + case EVT_ROTARY_LONG: + if (s_editMode < 0) { + killEvents(event); + popMenu(); + return; + } + // no break; #endif case EVT_KEY_LONG(KEY_ENTER): case EVT_KEY_BREAK(KEY_ENTER): @@ -340,7 +333,7 @@ void menuModelSelect(uint8_t event) s_copyMode = 0; event = EVT_ENTRY_UP; } - else if (event == EVT_KEY_LONG(KEY_MENU) || IS_RE_NAVIGATION_EVT_TYPE(event, EVT_KEY_LONG)) { + else if (event == EVT_KEY_LONG(KEY_MENU) || IS_ROTARY_LONG(event)) { s_copyMode = 0; killEvents(event); #if defined(SDCARD) @@ -386,10 +379,15 @@ void menuModelSelect(uint8_t event) killEvents(event); return; #else +#if defined(ROTARY_ENCODER_NAVIGATION) + case EVT_ROTARY_LEFT: + case EVT_ROTARY_RIGHT: + if (s_editMode >= 0) break; +#endif case EVT_KEY_FIRST(KEY_LEFT): case EVT_KEY_FIRST(KEY_RIGHT): if (sub == g_eeGeneral.currModel) { - chainMenu(event == EVT_KEY_FIRST(KEY_RIGHT) ? menuModelSetup : menuTabModel[DIM(menuTabModel)-1]); + chainMenu((IS_ROTARY_RIGHT(event) || event == EVT_KEY_FIRST(KEY_RIGHT)) ? menuModelSetup : menuTabModel[DIM(menuTabModel)-1]); return; } AUDIO_WARNING2(); @@ -560,7 +558,8 @@ void editName(uint8_t x, uint8_t y, char *name, uint8_t size, uint8_t event, uin char c = name[cur]; int8_t v = c; - if (p1valdiff || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_FIRST(KEY_UP) + /* TODO work with masks */ + if (p1valdiff || IS_ROTARY_RIGHT(event) || IS_ROTARY_LEFT(event) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_DOWN) || event==EVT_KEY_REPT(KEY_UP)) { v = checkIncDec(event, abs(v), 0, ZCHAR_MAX, 0); if (c < 0) v = -v; @@ -568,13 +567,7 @@ void editName(uint8_t x, uint8_t y, char *name, uint8_t size, uint8_t event, uin switch (event) { #if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBX9D) -#if defined(PCBX9D) || defined(PCBACT) - case EVT_KEY_BREAK(KEY_ENTER): -#else - case EVT_KEY_BREAK_ROTARY_ENCODERS: - if (!IS_RE_NAVIGATION_EVT(event)) - break; -#endif + case EVT_ROTARY_BREAK: if (s_editMode == EDIT_MODIFY_FIELD) { s_editMode = EDIT_MODIFY_STRING; cur = 0; @@ -585,23 +578,18 @@ void editName(uint8_t x, uint8_t y, char *name, uint8_t size, uint8_t event, uin s_editMode = 0; break; #endif + +#if !defined(PCBX9D) case EVT_KEY_BREAK(KEY_LEFT): if (cur>0) cur--; break; case EVT_KEY_BREAK(KEY_RIGHT): if (cur=-26 && v<=26) { v = -v; // toggle case if (event==EVT_KEY_LONG(KEY_LEFT)) @@ -824,8 +815,10 @@ void menuModelSetup(uint8_t event) g_model.switchWarningStates = 0x01 + (switches_states << 1); // no break case EVT_KEY_BREAK(KEY_ENTER): +#if !defined(PCBX9D) case EVT_KEY_BREAK(KEY_LEFT): case EVT_KEY_BREAK(KEY_RIGHT): +#endif g_model.switchWarningStates ^= 0x01; STORE_MODELVARS; break; @@ -1264,12 +1257,7 @@ void menuModelPhasesAll(uint8_t event) int8_t sub = m_posVert - 1; switch (event) { -#if defined(ROTARY_ENCODERS) - case EVT_KEY_BREAK_ROTARY_ENCODERS: - if (!IS_RE_NAVIGATION_EVT(event)) - break; - // no break -#endif + CASE_EVT_ROTARY_BREAK case EVT_KEY_FIRST(KEY_ENTER): if (sub == MAX_PHASES) { s_editMode = 0; @@ -1491,12 +1479,7 @@ void menuModelCurveOne(uint8_t event) case EVT_ENTRY: s_editMode = 1; break; -#if defined(ROTARY_ENCODERS) - case EVT_KEY_BREAK_ROTARY_ENCODERS: - if (!IS_RE_NAVIGATION_EVT(event)) - break; - // no break -#endif + CASE_EVT_ROTARY_BREAK case EVT_KEY_BREAK(KEY_ENTER): #if defined(PCBX9D) || defined(PCBACT) if (s_editMode <= 0) { @@ -1539,6 +1522,8 @@ void menuModelCurveOne(uint8_t event) popMenu(); } break; + + /* CASE_EVT_ROTARY_LEFT */ case EVT_KEY_REPT(KEY_LEFT): case EVT_KEY_FIRST(KEY_LEFT): if (s_editMode==1 && m_posHorz>0) m_posHorz--; @@ -1555,6 +1540,8 @@ void menuModelCurveOne(uint8_t event) return; } break; + + /* CASE_EVT_ROTARY_RIGHT */ case EVT_KEY_REPT(KEY_RIGHT): case EVT_KEY_FIRST(KEY_RIGHT): if (s_editMode==1 && m_posHorz<(crv.points-1)) m_posHorz++; @@ -2056,7 +2043,7 @@ void menuModelMixOne(uint8_t event) CHECK_INCDEC_MODELVAR(event, md2->curveParam, -MAX_CURVES, CURVE_BASE+MAX_CURVES-1); if (md2->curveParam == 0) md2->curveMode = MODE_DIFFERENTIAL; -#if defined(ROTARY_ENCODERS) || defined(PCBX9D) +#if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBX9D) if (m_posHorz != 0) { REPEAT_LAST_CURSOR_MOVE(); } @@ -2139,11 +2126,7 @@ static uint8_t s_copySrcCh; void menuModelExpoMix(uint8_t expo, uint8_t event) { -#if defined(ROTARY_ENCODERS) - int8_t sub = m_posVert; -#else uint8_t sub = m_posVert; -#endif if (s_editMode > 0) s_editMode = 0; @@ -2194,12 +2177,8 @@ void menuModelExpoMix(uint8_t expo, uint8_t event) break; } // no break -#if defined(ROTARY_ENCODERS) - case EVT_KEY_BREAK_ROTARY_ENCODERS: - if (event!=EVT_KEY_BREAK(KEY_ENTER) && !IS_RE_NAVIGATION_EVT(event)) - break; - // no break -#endif + + CASE_EVT_ROTARY_BREAK case EVT_KEY_LONG(KEY_ENTER): killEvents(event); if (s_copyTgtOfs) { @@ -2659,11 +2638,8 @@ void menuModelCurvesAll(uint8_t event) int8_t sub = m_posVert - 1; switch (event) { -#if defined(ROTARY_ENCODERS) - case EVT_KEY_BREAK_ROTARY_ENCODERS: - if (!IS_RE_NAVIGATION_EVT(event)) - break; - // no break +#if defined(ROTARY_ENCODER_NAVIGATION) + case EVT_ROTARY_BREAK: #endif #if !defined(PCBX9D) case EVT_KEY_FIRST(KEY_RIGHT): @@ -2882,11 +2858,8 @@ void menuModelCustomSwitches(uint8_t event) int8_t sub = m_posVert - 1; switch (event) { -#if defined(ROTARY_ENCODERS) - case EVT_KEY_BREAK_ROTARY_ENCODERS: - if (!IS_RE_NAVIGATION_EVT(event)) - break; - // no break +#if defined(ROTARY_ENCODER_NAVIGATION) + case EVT_ROTARY_BREAK: #endif #if !defined(PCBX9D) case EVT_KEY_FIRST(KEY_RIGHT): @@ -3069,7 +3042,6 @@ void menuModelCustomFunctions(uint8_t event) if (sd->swtch > MAX_SWITCH+1) sd->swtch -= (MAX_SWITCH+1); if (sd->swtch < -MAX_SWITCH-1) sd->swtch += (MAX_SWITCH+1); } - // printf("ICI switch=%d [%d:%d]\n", sd->swtch, SWITCH_OFF-MAX_SWITCH, SWITCH_ON+MAX_SWITCH+1+2*MAX_PSWITCH); fflush(stdout); putsSwitches(3, y, sd->swtch, SWONOFF | attr | ((abs(sd->swtch) <= (MAX_SWITCH+1) && getSwitch(sd->swtch, 0) && (sd->func > FUNC_INSTANT_TRIM || sd->active)) ? BOLD : 0)); if (active || AUTOSWITCH_ENTER_LONG()) { #if defined(PCBX9D) diff --git a/src/open9x.cpp b/src/open9x.cpp index 93d5f1e76..68432d306 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -262,6 +262,28 @@ void per10ms() readKeysAndTrims(); +#if defined(ROTARY_ENCODER_NAVIGATION) + if (IS_RE_NAVIGATION_ENABLE()) { + static int16_t rePreviousValue; + int16_t reNewValue = (g_rotenc[NAVIGATION_RE_IDX()] / ROTARY_ENCODER_GRANULARITY); + int8_t scrollRE = reNewValue - rePreviousValue; + if (scrollRE) { + rePreviousValue = reNewValue; + putEvent(scrollRE < 0 ? EVT_ROTARY_LEFT : EVT_ROTARY_RIGHT); + } + extern uint8_t s_evt; + uint8_t evt = s_evt; + if (EVT_KEY_MASK(evt) == BTN_REa + NAVIGATION_RE_IDX()) { + if (IS_KEY_BREAK(evt)) { + putEvent(EVT_ROTARY_BREAK); + } + else if (IS_KEY_LONG(evt)) { + putEvent(EVT_ROTARY_LONG); + } + } + } +#endif + #if defined(MAVLINK) && !defined(CPUARM) check_mavlink(); #endif @@ -1204,6 +1226,10 @@ void checkBacklight() Voice.voice_process() ; #endif } + +#if defined(PCBSTD) && defined(ROTARY_ENCODER_NAVIGATION) + rotencPoll(); +#endif } void backlightOn() @@ -3235,6 +3261,7 @@ ISR(TIMER3_CAPT_vect) // G: High frequency noise can cause stack overflo with IS // TODO serial_arm and serial_avr #if defined(FRSKY) && !defined(CPUARM) +// TODO in frsky.cpp? FORCEINLINE void FRSKY_USART0_vect() { if (frskyTxBufferCount > 0) { @@ -3736,10 +3763,6 @@ int main(void) break; #endif -#if defined(PCBSTD) && defined(ROTARY_ENCODER_NAVIGATION) - rotencPoll(); -#endif - perMain(); if (heartbeat == HEART_TIMER_PULSES+HEART_TIMER10ms) { diff --git a/src/open9x.h b/src/open9x.h index 5a9e942b6..b5ebd111e 100644 --- a/src/open9x.h +++ b/src/open9x.h @@ -156,7 +156,7 @@ #define IF_GVARS(x) #endif -#if defined(PCBACT) || ROTARY_ENCODERS > 0 +#if ROTARY_ENCODERS > 0 #define ROTARY_ENCODER_NAVIGATION #endif @@ -624,15 +624,66 @@ enum CswFunctions { #define EVT_KEY_REPT(key) ((key)|_MSK_KEY_REPT) #define EVT_KEY_LONG(key) ((key)|_MSK_KEY_LONG) -#define IS_KEY_BREAK(key) (((key)&0xf0) == _MSK_KEY_BREAK) -#define IS_KEY_FIRST(key) (((key)&0xf0) == _MSK_KEY_FIRST) +#define IS_KEY_BREAK(evt) (((evt)&0xf0) == _MSK_KEY_BREAK) +#define IS_KEY_FIRST(evt) (((evt)&0xf0) == _MSK_KEY_FIRST) +#define IS_KEY_LONG(evt) (((evt)&0xf0) == _MSK_KEY_LONG) + +#define EVT_ENTRY 0xbf +#define EVT_ENTRY_UP 0xbe + +#if defined(PCBX9D) +#define EVT_ROTARY_BREAK EVT_KEY_BREAK(KEY_ENTER) +#define EVT_ROTARY_LONG EVT_KEY_LONG(KEY_ENTER) +#else +#define EVT_ROTARY_BREAK 0xcf +#define EVT_ROTARY_LONG 0xce +#define EVT_ROTARY_LEFT 0xdf +#define EVT_ROTARY_RIGHT 0xde +#endif + +#if defined(PCBX9D) +#define IS_ROTARY_LEFT(evt) (evt==EVT_KEY_FIRST(KEY_MOVE_DOWN) || evt==EVT_KEY_REPT(KEY_MOVE_DOWN)) +#define IS_ROTARY_RIGHT(evt) (evt==EVT_KEY_FIRST(KEY_MOVE_UP) || evt==EVT_KEY_REPT(KEY_MOVE_UP)) +#define IS_ROTARY_BREAK(evt) (evt==EVT_KEY_BREAK(KEY_ENTER)) +#define IS_ROTARY_LONG(evt) (evt==EVT_KEY_LONG(KEY_ENTER)) +#define IS_ROTARY_EVENT(evt) (0) +#define CASE_EVT_ROTARY_BREAK /*case EVT_KEY_BREAK(KEY_ENTER):*/ +#define CASE_EVT_ROTARY_LONG /*case EVT_KEY_LONG(KEY_ENTER):*/ +#define CASE_EVT_ROTARY_LEFT case EVT_KEY_FIRST(KEY_MOVE_DOWN): case EVT_KEY_REPT(KEY_MOVE_DOWN): +#define CASE_EVT_ROTARY_RIGHT case EVT_KEY_FIRST(KEY_MOVE_UP): case EVT_KEY_REPT(KEY_MOVE_UP): +#elif defined(ROTARY_ENCODER_NAVIGATION) +#define IS_ROTARY_LEFT(evt) (evt == EVT_ROTARY_LEFT) +#define IS_ROTARY_RIGHT(evt) (evt == EVT_ROTARY_RIGHT) +#define IS_ROTARY_BREAK(evt) (evt == EVT_ROTARY_BREAK) +#define IS_ROTARY_LONG(evt) (evt == EVT_ROTARY_LONG) +#define IS_ROTARY_EVENT(evt) (EVT_KEY_MASK(evt) >= 0x0e) +#define CASE_EVT_ROTARY_BREAK case EVT_ROTARY_BREAK: +#define CASE_EVT_ROTARY_LONG case EVT_ROTARY_LONG: +#define CASE_EVT_ROTARY_LEFT case EVT_ROTARY_LEFT: +#define CASE_EVT_ROTARY_RIGHT case EVT_ROTARY_RIGHT: +#else +#define IS_ROTARY_LEFT(evt) (0) +#define IS_ROTARY_RIGHT(evt) (0) +#define IS_ROTARY_BREAK(evt) (0) +#define IS_ROTARY_LONG(evt) (0) +#define IS_ROTARY_EVENT(evt) (0) +#define CASE_EVT_ROTARY_BREAK +#define CASE_EVT_ROTARY_LONG +#define CASE_EVT_ROTARY_LEFT +#define CASE_EVT_ROTARY_RIGHT +#endif + +#if defined(PCBX9D) + #define IS_RE_NAVIGATION_ENABLE() true + #define NAVIGATION_RE_IDX() 0 +#elif defined(ROTARY_ENCODERS) + #define NAVIGATION_RE_IDX() (g_eeGeneral.reNavigation - 1) + #define IS_RE_NAVIGATION_ENABLE() g_eeGeneral.reNavigation +#elif defined(ROTARY_ENCODER_NAVIGATION) + #define IS_RE_NAVIGATION_ENABLE() true + #define NAVIGATION_RE_IDX() 0 +#endif -#define EVT_ENTRY (0xff - _MSK_KEY_REPT) -#define EVT_ENTRY_UP (0xfe - _MSK_KEY_REPT) -#define EVT_ROTARY_SHORT (0xfd - _MSK_KEY_REPT) -#define EVT_ROTARY_LONG (0xfc - _MSK_KEY_REPT) -#define EVT_ROTARY_LEFT (0xfb - _MSK_KEY_REPT) -#define EVT_ROTARY_RIGHT (0xfa - _MSK_KEY_REPT) #define HEART_TIMER_PULSES 1 #define HEART_TIMER10ms 2 @@ -748,7 +799,7 @@ void incRotaryEncoder(uint8_t idx, int8_t inc); #endif #if defined(PCBSKY9X) -#define ROTARY_ENCODER_GRANULARITY 4 +#define ROTARY_ENCODER_GRANULARITY 2 #else #define ROTARY_ENCODER_GRANULARITY 1 #endif @@ -1089,7 +1140,6 @@ extern volatile rotenc_t g_rotenc[1]; #ifdef JETI // Jeti-DUPLEX Telemetry -extern uint16_t jeti_keys; #include "jeti.h" #endif diff --git a/src/simpgmspace.cpp b/src/simpgmspace.cpp index 66f93fed7..16ba0d583 100644 --- a/src/simpgmspace.cpp +++ b/src/simpgmspace.cpp @@ -38,7 +38,7 @@ #include #include -volatile uint8_t pinb=0xff, pinc=0xff, pind, pine=0xff, ping=0xff, pinh=0xff, pinj=0xff, pinl=0; +volatile uint8_t pina=0xff, pinb=0xff, pinc=0xff, pind, pine=0xff, ping=0xff, pinh=0xff, pinj=0xff, pinl=0; uint8_t portb, portc, porth=0, dummyport; uint16_t dummyport16; const char *eepromFile = NULL; @@ -127,6 +127,13 @@ void simuSetKey(uint8_t key, bool state) KEY_CASE(KEY_LEFT, GPIO_BUTTON_LEFT, PIN_BUTTON_LEFT) KEY_CASE(KEY_UP, GPIO_BUTTON_UP, PIN_BUTTON_UP) KEY_CASE(KEY_DOWN, GPIO_BUTTON_DOWN, PIN_BUTTON_DOWN) +#endif +#if defined(PCBSKY9X) + KEY_CASE(BTN_REa, PIOB->PIO_PDSR, 0x40) +#elif defined(PCBGRUVIN9X) + KEY_CASE(BTN_REa, pind, 0x20) +#elif defined(ROTARY_ENCODER_NAVIGATION) + KEY_CASE(BTN_REa, RotEncoder, 0x20) #endif } } @@ -274,17 +281,12 @@ void *main_thread(void *) doSplash(); #endif -#if !defined(CPUARM) - checkLowEEPROM(); -#endif - #if defined(CPUARM) eeLoadModel(g_eeGeneral.currModel); #endif - checkTHR(); - checkSwitches(); checkAlarm(); + checkAll(); } s_current_protocol = 0; diff --git a/src/simpgmspace.h b/src/simpgmspace.h index 0597eb9f4..1de71b235 100644 --- a/src/simpgmspace.h +++ b/src/simpgmspace.h @@ -191,6 +191,7 @@ extern void rxPdcUsart( void (*pChProcess)(uint8_t x) ); #define DDRE dummyport #define DDRF dummyport #define DDRG dummyport +#define PINA ~pina #define PINB ~pinb #define PINC ~pinc #define PIND ~pind @@ -292,6 +293,7 @@ extern void rxPdcUsart( void (*pChProcess)(uint8_t x) ); #define FE0 0 #define ISR(x, ...) void x() +#define asm(x) #if defined(CPUARM) extern volatile uint32_t Tenms; @@ -302,7 +304,7 @@ extern uint32_t Master_frequency; #define __enable_irq() #endif -extern volatile unsigned char pinb,pinc,pind,pine,ping,pinh,pinj,pinl; +extern volatile unsigned char pina, pinb, pinc, pind, pine, ping, pinh, pinj, pinl; extern uint8_t portb, portc, porth, dummyport; extern uint16_t dummyport16; extern uint8_t main_thread_running; diff --git a/src/simu.cpp b/src/simu.cpp index 7ad1397cd..c03dc8524 100644 --- a/src/simu.cpp +++ b/src/simu.cpp @@ -254,6 +254,9 @@ long Open9xSim::onTimeout(FXObject*,FXSelector,void*) KEY_Left, KEY_LEFT, KEY_Up, KEY_UP, KEY_Down, KEY_DOWN, +#endif +#if defined(ROTARY_ENCODER_NAVIGATION) + KEY_F, BTN_REa, #endif }; @@ -300,6 +303,21 @@ long Open9xSim::onTimeout(FXObject*,FXSelector,void*) simuSetTrim(i, getApp()->getKeyState(trimKeys[i])); } +#if defined(ROTARY_ENCODER_NAVIGATION) + static bool rotencAction = false; + if (getApp()->getKeyState(KEY_G)) { + if (!rotencAction) g_rotenc[0] += ROTARY_ENCODER_GRANULARITY; + rotencAction = true; + } + else if (getApp()->getKeyState(KEY_D)) { + if (!rotencAction) g_rotenc[0] -= ROTARY_ENCODER_GRANULARITY; + rotencAction = true; + } + else { + rotencAction = false; + } +#endif + #define SWITCH_KEY(key, swtch, states) \ static bool state##key = 0; \ static int8_t state_##swtch = 2; \ diff --git a/src/stock/board_stock.cpp b/src/stock/board_stock.cpp index 795c775de..a5d8ea967 100644 --- a/src/stock/board_stock.cpp +++ b/src/stock/board_stock.cpp @@ -49,16 +49,21 @@ int8_t Rotary_diff ; int8_t RotaryControl ; #endif +#define ROTENC_DOWN() (RotEncoder & 0x20) + void rotencPoll() { #if defined(TELEMETREZ) if (TrotCount != LastTrotCount ) { g_rotenc[0] = LastTrotCount = TrotCount ; } + if( TezRotary != 0) + RotEncoder = 0x20; // switch is on #else // Rotary Encoder polling PORTA = 0 ; // No pullups DDRA = 0x1F ; // Top 3 bits input + asm(" rjmp 1f") ; asm("1:") ; // asm(" nop") ; @@ -67,14 +72,8 @@ void rotencPoll() rotary = PINA ; DDRA = 0xFF ; // Back to all outputs rotary &= 0xE0 ; -// RotEncoder = rotary ; -#if defined(TELEMETREZ) - if( TezRotary != 0) - RotEncoder = 0x20; // switch is on -#else - RotEncoder = rotary ; // just read the lcd pin -#endif + RotEncoder = rotary ; // just read the lcd pin rotary &= 0xDF ; if ( rotary != RotPosition ) { @@ -90,9 +89,11 @@ void rotencPoll() } RotPosition = rotary ; } -#endif +#endif // TELEMETREZ } -#endif +#else +#define ROTENC_DOWN() (0) +#endif // ROTARY_ENCODER_NAVIGATION #ifndef SIMU inline void boardInit() @@ -143,8 +144,7 @@ FORCEINLINE #endif uint8_t keyDown() { - // printf("PINB=%x\n", PINB & 0x7E); fflush(stdout); - return (~PINB) & 0x7E; + return ((~PINB) & 0x7E) || ROTENC_DOWN(); } bool switchState(EnumKeys enuk) diff --git a/src/stock/board_stock.h b/src/stock/board_stock.h index 350f0d9cc..fe097fc26 100644 --- a/src/stock/board_stock.h +++ b/src/stock/board_stock.h @@ -198,6 +198,7 @@ void fadeBacklight(); #define OUT_C_LCD_CS1 1 #if defined(ROTARY_ENCODER_NAVIGATION) +extern uint8_t RotEncoder ; void rotencPoll(); #endif diff --git a/src/translations.cpp b/src/translations.cpp index ef9a215f2..135649065 100644 --- a/src/translations.cpp +++ b/src/translations.cpp @@ -47,6 +47,8 @@ const pm_char STR_OPEN9X[] PROGMEM = ISTR(VBEEPMODE) #if defined(ROTARY_ENCODERS) ISTR(VRENAVIG) +#endif +#if defined(ROTARY_ENCODER_NAVIGATION) ISTR(VRENCODERS) #endif ISTR(TRNMODE) @@ -289,10 +291,6 @@ const pm_char STR_SYNCMENU[] PROGMEM = TR_SYNCMENU; const pm_char STR_INVERT_THR[] PROGMEM = TR_INVERT_THR; -#if defined(ROTARY_ENCODER_NAVIGATION) -const pm_char STR_BACK[] PROGMEM = TR_BACK; -#endif - #if defined(FRSKY_HUB) const pm_char STR_MINRSSI[] PROGMEM = TR_MINRSSI; const pm_char STR_LATITUDE[] PROGMEM = TR_LATITUDE; diff --git a/src/translations.h b/src/translations.h index 7a363fafc..5f3e48d1e 100644 --- a/src/translations.h +++ b/src/translations.h @@ -87,6 +87,9 @@ extern const pm_char STR_OPEN9X[]; #define OFS_VRENAVIG (OFS_VBEEPMODE + sizeof(TR_VBEEPMODE)) #define OFS_VRENCODERS (OFS_VRENAVIG + sizeof(TR_VRENAVIG)) #define OFS_TRNMODE (OFS_VRENCODERS + sizeof(TR_VRENCODERS)) +#elif defined(ROTARY_ENCODER_NAVIGATION) +#define OFS_VRENCODERS (OFS_VBEEPMODE + sizeof(TR_VBEEPMODE)) +#define OFS_TRNMODE (OFS_VRENCODERS + sizeof(TR_VRENCODERS)) #else #define OFS_TRNMODE (OFS_VBEEPMODE + sizeof(TR_VBEEPMODE)) #endif @@ -194,7 +197,10 @@ extern const pm_char STR_OPEN9X[]; #if defined(ROTARY_ENCODERS) #define STR_VRENAVIG (STR_OPEN9X + OFS_VRENAVIG) -#define STR_VRENCODERS (STR_OPEN9X + OFS_VRENCODERS) +#endif + +#if defined(ROTARY_ENCODER_NAVIGATION) +#define STR_VRENCODERS (STR_OPEN9X + OFS_VRENCODERS) #endif #if defined(PCBGRUVIN9X) || defined(CPUARM) @@ -372,11 +378,6 @@ extern const pm_char STR_RXNUM[]; extern const pm_char STR_SYNCMENU[]; extern const pm_char STR_INVERT_THR[]; -#if defined(ROTARY_ENCODER_NAVIGATION) -extern const pm_char STR_BACK[]; -#define LEN_BACK PSIZE(TR_BACK) -#endif - #if defined(FRSKY) extern const pm_char STR_LIMIT[]; #endif diff --git a/src/translations/cz.h b/src/translations/cz.h index 909419892..6a8a6f11c 100644 --- a/src/translations/cz.h +++ b/src/translations/cz.h @@ -455,7 +455,6 @@ #define TR_MENUDEBUG "DIAG" #define TR_RXNUM "RxNum" #define TR_SYNCMENU "Sync [MENU]" -#define TR_BACK "Back" #define TR_LIMIT INDENT"Limit" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Latitude" diff --git a/src/translations/de.h b/src/translations/de.h index 40323856e..1c528bee4 100644 --- a/src/translations/de.h +++ b/src/translations/de.h @@ -414,7 +414,6 @@ #define TR_MENUDEBUG "DEBUG" #define TR_RXNUM "RxNum" #define TR_SYNCMENU "Sync [MENU]" -#define TR_BACK "Zur\205ck" #define TR_LIMIT INDENT"Limite" #define TR_MINRSSI "Min. RSSI" #define TR_LATITUDE "Latitude" diff --git a/src/translations/en.h b/src/translations/en.h index bab764aae..cb77f5d75 100644 --- a/src/translations/en.h +++ b/src/translations/en.h @@ -468,7 +468,6 @@ #define TR_MENUDEBUG "DEBUG" #define TR_RXNUM TR("RxNum","Receiver Number") #define TR_SYNCMENU "Sync [MENU]" -#define TR_BACK "Back" #define TR_LIMIT INDENT"Limit" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Latitude" diff --git a/src/translations/es.h b/src/translations/es.h index bdeca0328..eee4d0abb 100644 --- a/src/translations/es.h +++ b/src/translations/es.h @@ -469,7 +469,6 @@ #define TR_MENUDEBUG "DEBUG" #define TR_RXNUM TR("RxNum","Numero Receptor") #define TR_SYNCMENU "Sync [MENU]" -#define TR_BACK "Atras" #define TR_LIMIT INDENT"Limite" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Latitud" diff --git a/src/translations/fr.h b/src/translations/fr.h index 769ea4daa..b96da65dc 100644 --- a/src/translations/fr.h +++ b/src/translations/fr.h @@ -415,7 +415,6 @@ #define TR_MENUDEBUG "DEBUG" #define TR_RXNUM "NumRx" #define TR_SYNCMENU "Sync [MENU]" -#define TR_BACK "Ret." #define TR_LIMIT INDENT"Limit" #define TR_MINRSSI "RSSI Min." #define TR_LATITUDE "Latitude" diff --git a/src/translations/it.h b/src/translations/it.h index 34479ee1f..c1edf22cc 100644 --- a/src/translations/it.h +++ b/src/translations/it.h @@ -414,7 +414,6 @@ #define TR_MENUDEBUG "DEBUG" #define TR_RXNUM "RxNum" #define TR_SYNCMENU "Sinc.[Men\200]" -#define TR_BACK "Prec" #define TR_LIMIT "Limit" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Latitud." diff --git a/src/translations/pt.h b/src/translations/pt.h index d0b6fc1f8..a93f4a67e 100644 --- a/src/translations/pt.h +++ b/src/translations/pt.h @@ -415,7 +415,6 @@ #define TR_MENUDEBUG "DEPURAR" #define TR_RXNUM "RxNum" #define TR_SYNCMENU "Sync [MENU]" -#define TR_BACK "Atras" #define TR_LIMIT INDENT"Limite" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Latitude" diff --git a/src/translations/se.h b/src/translations/se.h index 0f93dcb8c..612560d74 100644 --- a/src/translations/se.h +++ b/src/translations/se.h @@ -468,7 +468,6 @@ #define TR_MENUDEBUG "Debug" #define TR_RXNUM "RxNum" #define TR_SYNCMENU "Synk [MENU]" -#define TR_BACK "EXIT" #define TR_LIMIT INDENT"Niv\200" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Breddgrad"