diff --git a/src/general_menus.cpp b/src/general_menus.cpp index 335d5f345..c4d415557 100644 --- a/src/general_menus.cpp +++ b/src/general_menus.cpp @@ -106,7 +106,9 @@ void menuProcSetup(uint8_t event) lcd_putsnAtt(PARAM_OFS - 2*FW, y, STR_VBEEPMODE+(LEN_VBEEPMODE*2)+(LEN_VBEEPMODE*g_eeGeneral.beeperMode), LEN_VBEEPMODE, (sub==subN ? INVERS:0)); if(sub==subN) { CHECK_INCDEC_GENVAR(event, g_eeGeneral.beeperMode, -2, 1); +#if defined(FRSKY) if (checkIncDec_Ret) FRSKY_setModelAlarms(); +#endif } if((y+=FH)>7*FH) return; }subN++; diff --git a/src/menus.cpp b/src/menus.cpp index 0c5c1a1fd..8daef9203 100644 --- a/src/menus.cpp +++ b/src/menus.cpp @@ -56,7 +56,10 @@ void DisplayScreenIndex(uint8_t index, uint8_t count, uint8_t attr) lcd_outdezAtt(1+128-FW*(count>9 ? 3 : 2),0,index+1,attr); } -#if defined(NAVIGATION_POT1) || defined(NAVIGATION_RE1) +#if defined(NAVIGATION_RE1) +int8_t scrollRE; +int16_t p1valdiff; +#elif defined(NAVIGATION_POT1) int16_t p1valdiff; #endif @@ -155,22 +158,40 @@ bool check_submenu_simple(uint8_t event, uint8_t maxrow) #define DEC(val,max) if(val>0 ) {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) { + int8_t maxcol = MAXCOL(m_posVert); + #ifdef NAVIGATION_RE1 // check rotary encoder 1 if changed -> cursor down/up static int16_t re1valprev; p1valdiff = 0; - int8_t scrollRE = re1valprev - g_rotenc[0]; + scrollRE = re1valprev - g_rotenc[0]; if (scrollRE) { re1valprev = g_rotenc[0]; if (s_editMode > 0) { - p1valdiff = scrollRE; + p1valdiff = -scrollRE; scrollRE = 0; } } - if (event == EVT_KEY_FIRST(BTN_RE1)) { - scrollRE = 0; - if (s_editMode++ > 0) s_editMode = 0; - if (s_editMode > 0 && m_posVert == 0) s_editMode = -1; + if (event == EVT_KEY_LONG(BTN_RE1)) { + if (!menuTab && !s_editMode) { + popMenu(); + killEvents(event); + } + } + if (event == EVT_KEY_BREAK(BTN_RE1)) { + if (s_editMode > 0 && (maxcol & ZCHAR)) { + if (m_posHorz < maxcol-ZCHAR) { + m_posHorz++; + } + else { + s_editMode = 0; + } + } + else { + scrollRE = 0; + if (s_editMode++ > 0) s_editMode = 0; + if (s_editMode > 0 && m_posVert == 0 && menuTab) s_editMode = -1; + } } #else #define scrollRE 0 @@ -212,7 +233,7 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa int8_t cc = curr; if (scrollLR || (scrollRE && s_editMode < 0)) { - cc = limit((int8_t)0, (int8_t)(curr - scrollLR - scrollRE), (int8_t)(menuTabSize-1)); + cc = limit((int8_t)0, (int8_t)(curr - scrollLR + scrollRE), (int8_t)(menuTabSize-1)); } switch(event) { @@ -242,8 +263,6 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa theFile.DisplayProgressBar(menuTab ? lcd_lastPos-2*FW-((curr+1)/10*FWNUM)-2 : 20*FW+1); - uint8_t maxcol = MAXCOL(m_posVert); - if (s_editMode<=0) { if (scrollUD) { m_posVert = limit((int8_t)0, (int8_t)(m_posVert - scrollUD), (int8_t)maxrow); @@ -257,14 +276,19 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa } #ifdef NAVIGATION_RE1 - while (scrollRE) { + while (!s_editMode && scrollRE) { if (scrollRE > 0) { --scrollRE; - if (++m_posHorz > MAXCOL(m_posVert)) { - m_posHorz = 0; - if (++m_posVert > maxrow) { - m_posVert = maxrow; - m_posHorz = MAXCOL(m_posVert); + maxcol = MAXCOL(m_posVert); + if (maxcol & ZCHAR) maxcol = 0; + if (++m_posHorz > maxcol) { + if (m_posVert < maxrow) { + maxcol = MAXCOL(++m_posVert); // TODO not stored into maxcol? + if (maxcol < 0) m_posVert++; + m_posHorz = 0; + } + else { + --m_posHorz; scrollRE = 0; } } @@ -278,7 +302,9 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa scrollRE = 0; } else { - m_posHorz = MAXCOL(m_posVert); + maxcol = MAXCOL(m_posVert); + if (maxcol < 0) maxcol = MAXCOL(--m_posVert); + m_posHorz = maxcol; } } } @@ -291,8 +317,21 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa { case EVT_ENTRY: minit(); +#ifdef NAVIGATION_RE1 + if (menuTab) { + s_editMode = -1; + break; + } + // no break +#else s_editMode = -1; break; +#endif +#ifdef NAVIGATION_RE1 + case EVT_ENTRY_UP: + s_editMode = 0; + break; +#endif case EVT_KEY_FIRST(KEY_MENU): if (maxcol > 0) s_editMode = (s_editMode<=0); @@ -306,7 +345,7 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa s_editMode = 0; break; } - if(m_posVert==0 || !menuTab) { + if (m_posVert==0 || !menuTab) { popMenu(); //beeps itself } else { diff --git a/src/menus.h b/src/menus.h index cff2ab379..83d1a31e3 100644 --- a/src/menus.h +++ b/src/menus.h @@ -79,11 +79,20 @@ void menuProcModelSelect(uint8_t event); void menuProcStatistic(uint8_t event); void menuProcDebug(uint8_t event); -#if defined(NAVIGATION_POT1) || defined(NAVIGATION_RE1) +#if defined(NAVIGATION_RE1) +extern int8_t scrollRE; +extern int16_t p1valdiff; +#define IS_RE1_EVT_TYPE(event, type) (event==type(BTN_RE1)) +#define IS_RE1_EVT(event) ((event&0x0f)==BTN_RE1) +#else +#define IS_RE1_EVT_TYPE(event, type) (0) +#define IS_RE1_EVT(event) (0) +#if defined(NAVIGATION_POT1) extern int16_t p1valdiff; #else #define p1valdiff 0 #endif +#endif extern int8_t checkIncDec_Ret; // global helper vars extern int8_t s_editMode; // global editmode diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 9d6c18d6a..a582b996a 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -176,7 +176,7 @@ void menuProcModelSelect(uint8_t event) } uint8_t _event = (s_warning ? 0 : event); - uint8_t _event_ = _event; + uint8_t _event_ = (IS_RE1_EVT(_event) ? 0 : _event); if (s_copyMode || !EFile::exists(FILE_MODEL(g_eeGeneral.currModel))) { if ((_event & 0x1f) == KEY_EXIT) @@ -190,7 +190,14 @@ void menuProcModelSelect(uint8_t event) lcd_puts(9*FW-(LEN_FREE-4)*FW, 0, STR_FREE); lcd_outdezAtt( 17*FW, 0, EeFsGetFree(),0); - DisplayScreenIndex(e_ModelSelect, DIM(menuTabModel), INVERS); + DisplayScreenIndex(e_ModelSelect, DIM(menuTabModel), (sub == g_eeGeneral.currModel) ? INVERS : 0); + +#ifdef NAVIGATION_RE1 + if (scrollRE > 0 && s_editMode < 0) { + chainMenu(menuProcModel); + return; + } +#endif switch(_event) { @@ -199,6 +206,7 @@ void menuProcModelSelect(uint8_t event) s_copyMode = 0; // TODO only this one? s_copyTgtOfs = 0; s_copySrcRow = -1; + s_editMode = -1; break; case EVT_KEY_LONG(KEY_EXIT): if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && EFile::exists(FILE_MODEL(sub))) { @@ -216,6 +224,12 @@ void menuProcModelSelect(uint8_t event) killEvents(_event); } break; +#ifdef NAVIGATION_RE1 + case EVT_KEY_BREAK(BTN_RE1): + s_editMode = (s_editMode == 0 && sub == g_eeGeneral.currModel) ? -1 : 0; + break; + case EVT_KEY_LONG(BTN_RE1): +#endif case EVT_KEY_LONG(KEY_MENU): case EVT_KEY_BREAK(KEY_MENU): if (s_copyMode && (s_copyTgtOfs || s_copySrcRow>=0)) { @@ -250,7 +264,10 @@ void menuProcModelSelect(uint8_t event) s_copyTgtOfs = 0; return; } - else if (_event == EVT_KEY_LONG(KEY_MENU)) { + else if (_event == EVT_KEY_LONG(KEY_MENU) || IS_RE1_EVT_TYPE(_event, EVT_KEY_LONG)) { +#ifdef NAVIGATION_RE1 + s_editMode = -1; +#endif displayPopup(STR_LOADINGMODEL); eeCheck(true); // force writing of current model data before this is changed if (g_eeGeneral.currModel != sub) { @@ -272,7 +289,7 @@ void menuProcModelSelect(uint8_t event) chainMenu(_event == EVT_KEY_FIRST(KEY_RIGHT) ? menuProcModel : menuTabModel[DIM(menuTabModel)-1]); return; } - AUDIO_WARNING1(); // TODO it was beepWarn(); + AUDIO_WARNING1(); break; case EVT_KEY_FIRST(KEY_UP): case EVT_KEY_FIRST(KEY_DOWN): @@ -352,42 +369,53 @@ void menuProcModelSelect(uint8_t event) void EditName(uint8_t x, uint8_t y, char *name, uint8_t size, uint8_t event, bool active, uint8_t & cur) { + lcd_putsnAtt(x, y, name, size, ZCHAR | (active ? ((s_editMode>0) ? 0 : INVERS) : 0)); + if (active) { if (s_editMode>0) { + uint8_t next = cur; + char c = name[next]; + char v = c; + if (p1valdiff || 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; + STORE_MODELVARS; + } + switch(event) { case EVT_KEY_BREAK(KEY_LEFT): - if (cur>0) cur--; + if (next>0) next--; break; case EVT_KEY_BREAK(KEY_RIGHT): - if (cur=-26 && v<=26) { + v = -v; // toggle case + STORE_MODELVARS; // TODO optim if (c!=v) at the end + if (event==EVT_KEY_LONG(KEY_LEFT)) + killEvents(KEY_LEFT); + } } + + name[cur] = v; + lcd_putcAtt(x+cur*FW, y, idx2char(v), INVERS); + cur = next; } else { - cur = m_posHorz = 0; + cur = 0; } } - - lcd_putsnAtt(x, y, name, size, ZCHAR | (active ? ((s_editMode>0) ? 0 : INVERS) : 0)); - if (active && s_editMode>0) { - char c = name[cur]; - char v = c; - if (p1valdiff || 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; - STORE_MODELVARS; - } - - if (v>=-26 && v<=26 && (event==EVT_KEY_LONG(KEY_RIGHT) || event==EVT_KEY_LONG(KEY_LEFT))) { - v = -v; // toggle case - STORE_MODELVARS; - if (event==EVT_KEY_LONG(KEY_LEFT)) - killEvents(KEY_LEFT); - } - name[cur] = v; - lcd_putcAtt(x+cur*FW, y, idx2char(v), INVERS); - } } #undef PARAM_OFS @@ -395,7 +423,7 @@ void EditName(uint8_t x, uint8_t y, char *name, uint8_t size, uint8_t event, boo void menuProcModel(uint8_t event) { lcd_outdezNAtt(7*FW,0,g_eeGeneral.currModel+1,INVERS+LEADING0,2); - MENU(STR_MENUSETUP, menuTabModel, e_Model, (g_model.protocol==PROTO_PPM||g_model.protocol==PROTO_DSM2||g_model.protocol==PROTO_PXX ? 12 : 11), {0,sizeof(g_model.name)-1,2,2,0,0,0,0,0,6,2,1}); + MENU(STR_MENUSETUP, menuTabModel, e_Model, (g_model.protocol==PROTO_PPM||g_model.protocol==PROTO_DSM2||g_model.protocol==PROTO_PXX ? 12 : 11), {0,ZCHAR|sizeof(g_model.name)-1,2,2,0,0,0,0,0,6,2,1}); uint8_t sub = m_posVert; uint8_t y = 1*FH; @@ -519,7 +547,7 @@ void menuProcModel(uint8_t event) else if (sub==subN) { m_posHorz = 0; } - if (sub==subN && (s_editMode>0 || p1valdiff || (g_model.protocol!=0 && g_model.protocol!=PROTO_DSM2))) { // TODO avoid DSM2 when not defined + if (sub==subN && (s_editMode>0 || p1valdiff || (g_model.protocol!=0/*TODO constant*/ && g_model.protocol!=PROTO_DSM2))) { // TODO avoid DSM2 when not defined switch (m_posHorz) { case 0: CHECK_INCDEC_MODELVAR(event,g_model.protocol,0,PROTO_MAX-1); @@ -596,7 +624,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), {6, 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; @@ -657,7 +685,11 @@ void menuProcPhasesAll(uint8_t event) switch (event) { case EVT_KEY_FIRST(KEY_MENU): +#ifdef NAVIGATION_RE1 + case EVT_KEY_BREAK(BTN_RE1): +#endif if (sub == MAX_PHASES) { + s_editMode = 0; trimsCheckTimer = 200; // 2 seconds } // no break @@ -1801,43 +1833,6 @@ void menuProcFunctionSwitches(uint8_t event) } } -#if 0 -void menuProcSafetySwitches(uint8_t event) -{ - MENU(STR_MENUSAFETYSWITCHES, menuTabModel, e_SafetySwitches, NUM_CHNOUT+1, {0, 1/*repeated*/}); - - uint8_t y = 0; - uint8_t k = 0; - - for(uint8_t i=0; i<7; i++){ - y=(i+1)*FH; - k=i+s_pgOfs; - if(k==NUM_CHNOUT) break; - SafetySwData *sd = &g_model.safetySw[k]; - putsChn(0,y,k+1,0); - for(uint8_t j=0; j<=2;j++){ - uint8_t attr = ((m_posVert-1==k && m_posHorz==j) ? ((s_editMode>0) ? BLINK : INVERS) : 0); - uint8_t active = (attr && (s_editMode>0 || p1valdiff)); - switch(j) - { - case 0: - putsSwitches(6*FW, y, sd->swtch , attr); - if (active) { - CHECK_INCDEC_MODELVAR( event, sd->swtch, -MAX_SWITCH, MAX_SWITCH); - } - break; - case 1: - lcd_outdezAtt(16*FW, y, sd->val, attr); - if (active) { - CHECK_INCDEC_MODELVAR( event, sd->val, -125, 125); - } - break; - } - } - } -} -#endif - #ifdef FRSKY #define TELEM_COL2 (9*FW+2) void menuProcTelemetry(uint8_t event) @@ -1852,7 +1847,7 @@ void menuProcTelemetry(uint8_t event) uint8_t blink; uint8_t y; - switch(event){ + switch (event) { case EVT_KEY_BREAK(KEY_DOWN): case EVT_KEY_BREAK(KEY_UP): case EVT_KEY_BREAK(KEY_LEFT): diff --git a/src/o9xstrings.cpp b/src/o9xstrings.cpp index ce3e357ad..aabf9117f 100644 --- a/src/o9xstrings.cpp +++ b/src/o9xstrings.cpp @@ -251,7 +251,6 @@ const pm_char STR_MENUCURVES[] PROGMEM = TR_MENUCURVES; const pm_char STR_MENUCURVE[] PROGMEM = TR_MENUCURVE; const pm_char STR_MENUCUSTOMSWITCHES[] PROGMEM = TR_MENUCUSTOMSWITCHES; const pm_char STR_MENUFUNCSWITCHES[] PROGMEM = TR_MENUFUNCSWITCHES; -const pm_char STR_MENUSAFETYSWITCHES[] PROGMEM = TR_MENUSAFETYSWITCHES; #ifdef FRSKY const pm_char STR_MENUTELEMETRY[] PROGMEM = TR_MENUTELEMETRY; diff --git a/src/o9xstrings.h b/src/o9xstrings.h index 9a1a04630..0c5266272 100644 --- a/src/o9xstrings.h +++ b/src/o9xstrings.h @@ -319,7 +319,6 @@ extern const pm_char STR_MENUCURVES[]; extern const pm_char STR_MENUCURVE[]; extern const pm_char STR_MENUCUSTOMSWITCHES[]; extern const pm_char STR_MENUFUNCSWITCHES[]; -extern const pm_char STR_MENUSAFETYSWITCHES[]; extern const pm_char STR_MENUTELEMETRY[]; extern const pm_char STR_MENUTEMPLATES[]; extern const pm_char STR_MENUSTAT[]; diff --git a/src/open9x.cpp b/src/open9x.cpp index 829c693d9..64c0a540a 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -719,7 +719,7 @@ uint8_t checkTrim(uint8_t event) uint8_t phase = getTrimFlightPhase(idx, getFlightPhase()); int16_t before = getTrimValue(phase, idx); int8_t v = (s==0) ? min(32, abs(before)/4+1) : 1 << (s-1); // 1=>1 2=>2 3=>4 4=>8 - bool thro = (idx==2/*TODO constant*/ && g_model.thrTrim); + bool thro = (idx==THR_STICK && g_model.thrTrim); if (thro) v = 4; // if throttle trim and trim trottle then step=4 int16_t after = (k&1) ? before + v : before - v; // positive = k&1 @@ -981,7 +981,7 @@ FORCEINLINE void evalTrims(uint8_t phase) int16_t v = anas[i]; int32_t vv = 2*RESX; int16_t trim = getTrimValue(getTrimFlightPhase(i, phase), i); - if (i==2/*TODO constant*/ && g_model.thrTrim) { + if (i==THR_STICK && g_model.thrTrim) { if (g_eeGeneral.throttleReversed) trim = -trim; vv = ((int32_t)trim-TRIM_MIN)*(RESX-v)/(2*RESX); @@ -1026,7 +1026,7 @@ uint8_t evalSticks(uint8_t phase) if(v <= -RESX) v = -RESX; if(v >= RESX) v = RESX; - if (g_eeGeneral.throttleReversed && ch==2/*TODO THR_STICK*/) + if (g_eeGeneral.throttleReversed && ch==THR_STICK) v = -v; calibratedStick[ch] = v; //for show in expo @@ -1050,7 +1050,7 @@ uint8_t evalSticks(uint8_t phase) } #ifdef HELI - if(d && (ch==1/*TODO ELE_STICK*/ || ch==3/*TODO AIL_STICK*/)) + if(d && (ch==ELE_STICK || ch==AIL_STICK)) v = int32_t(v)*g_model.swashR.value*RESX/(int32_t(d)*100); #endif @@ -1460,7 +1460,7 @@ void perMain() uint16_t val; if (g_model.thrTraceSrc == 0) { - val = calibratedStick[2/*TODO THR_STICK*/]; // get throttle channel value + val = calibratedStick[THR_STICK]; // get throttle channel value val = (g_eeGeneral.throttleReversed ? RESX-val : val+RESX); } else if (g_model.thrTraceSrc > NUM_POTS) { @@ -2053,7 +2053,7 @@ void instantTrim() uint8_t phase = getFlightPhase(); for (uint8_t i=0; i 1..4 -> 1..4 #define CONVERT_MODE(x) (((x)<=4) ? pgm_read_byte(modn12x3 + 4*g_eeGeneral.stickMode + (x)-1) : (x) ) -#define THR_STICK (2-(g_eeGeneral.stickMode&1)) -#define ELE_STICK (1+(g_eeGeneral.stickMode&1)) -#define AIL_STICK ((g_eeGeneral.stickMode&2) ? 0 : 3) -#define RUD_STICK ((g_eeGeneral.stickMode&2) ? 3 : 0) + +#define RUD_STICK 0 +#define ELE_STICK 1 +#define THR_STICK 2 +#define AIL_STICK 3 extern uint8_t channel_order(uint8_t x); diff --git a/src/translations/en.h b/src/translations/en.h index 5d9af6ea2..477667706 100644 --- a/src/translations/en.h +++ b/src/translations/en.h @@ -291,7 +291,6 @@ #define TR_MENUCURVE "CURVE" #define TR_MENUCUSTOMSWITCHES "CUSTOM SWITCHES" #define TR_MENUFUNCSWITCHES "FUNC SWITCHES" -#define TR_MENUSAFETYSWITCHES "SAFETY SWITCHES" #define TR_MENUTELEMETRY "TELEMETRY" #define TR_MENUTEMPLATES "TEMPLATES" #define TR_MENUSTAT "STAT" diff --git a/src/translations/fr.h b/src/translations/fr.h index cbfd5bcbd..3564f9f9a 100644 --- a/src/translations/fr.h +++ b/src/translations/fr.h @@ -291,7 +291,6 @@ #define TR_MENUCURVE "COURBE" #define TR_MENUCUSTOMSWITCHES "INTERS PERS" #define TR_MENUFUNCSWITCHES "INTERS FONCTIONS" -#define TR_MENUSAFETYSWITCHES "INTERS SECURITE" #define TR_MENUTELEMETRY "TELEMETRIE" #define TR_MENUTEMPLATES "GABARITS" #define TR_MENUSTAT "STAT"