diff --git a/src/Makefile b/src/Makefile index 4b792fa47..4d108b517 100644 --- a/src/Makefile +++ b/src/Makefile @@ -79,10 +79,14 @@ TEMPLATES = YES # POTS (POT1, POT2, POT3), NAVIGATION = NO -# Switches autmatic selection +# Switches automatic selection # Values = YES, NO AUTOSWITCH = NO +# Double keys support (+/- means invert, +/up means max, -/dwn means min, up/down means reset to default) +# Values = YES, NO +DBLKEYS = NO + # AUDIO Mods # Values = YES, NO AUDIO = NO @@ -311,6 +315,10 @@ ifeq ($(AUTOSWITCH), YES) CPPDEFS += -DAUTOSWITCH endif +ifeq ($(DBLKEYS), YES) + CPPDEFS += -DDBLKEYS +endif + ifeq ($(SPLASH), YES) CPPDEFS += -DSPLASH endif diff --git a/src/menus.cpp b/src/menus.cpp index 324601ad4..d53b20a88 100644 --- a/src/menus.cpp +++ b/src/menus.cpp @@ -73,6 +73,7 @@ int16_t checkIncDec(uint8_t event, int16_t val, int16_t i_min, int16_t i_max, ui { int16_t newval = val; +#if defined(DBLKEYS) if (keyState(KEY_RIGHT) && keyState(KEY_LEFT)) { newval = -val; killEvents(KEY_LEFT); @@ -93,8 +94,9 @@ int16_t checkIncDec(uint8_t event, int16_t val, int16_t i_min, int16_t i_max, ui killEvents(KEY_UP); killEvents(KEY_DOWN); } - else - + else +#endif + if (event==EVT_KEY_FIRST(KEY_RIGHT) || event==EVT_KEY_REPT(KEY_RIGHT) || (s_editMode>0 && (event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP)))) { newval++; AUDIO_KEYPAD_UP(); @@ -117,10 +119,8 @@ int16_t checkIncDec(uint8_t event, int16_t val, int16_t i_min, int16_t i_max, ui #if defined(AUTOSWITCH) if (s_editMode>0 && (i_flags & INCDEC_SWITCH)) { - uint8_t swtch = getMovedSwitch(); - if (swtch) { - newval = (val == swtch ? -swtch : swtch); - } + int8_t swtch = getMovedSwitch(); + if (swtch) newval = swtch; } #endif diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 53f0da5bb..b0eff59df 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -819,14 +819,22 @@ void menuProcModel(uint8_t event) static uint8_t s_currIdx; -#ifdef FLIGHT_PHASES - -#if defined(TRANSLATIONS_CZ) -#define PHASES_EDIT_2ND_COLUMN 12*FW +#if defined(TRANSLATIONS_FR) || defined(TRANSLATIONS_CZ) +#define MIXES_2ND_COLUMN (13*FW) #else -#define PHASES_EDIT_2ND_COLUMN 10*FW +#define MIXES_2ND_COLUMN (9*FW) #endif +uint8_t editDelay(const uint8_t y, const uint8_t event, const uint8_t attr, const pm_char *str, uint8_t delay) +{ + lcd_putsLeft(y, str); + lcd_outdezAtt(MIXES_2ND_COLUMN, y, 5*delay, attr|PREC1|LEFT); + if (attr) CHECK_INCDEC_MODELVAR(event, delay, 0, MAX_DELAY); + return delay; +} + +#ifdef FLIGHT_PHASES + void menuProcPhaseOne(uint8_t event) { PhaseData *phase = phaseaddress(s_currIdx); @@ -844,17 +852,17 @@ void menuProcPhaseOne(uint8_t event) switch(i) { case 0: lcd_putsLeft( y, STR_NAME); - EditName(PHASES_EDIT_2ND_COLUMN, y, phase->name, sizeof(phase->name), event, attr, m_posHorz); + EditName(MIXES_2ND_COLUMN, y, phase->name, sizeof(phase->name), event, attr, m_posHorz); break; case 1: lcd_putsLeft( y, STR_SWITCH); - putsSwitches(PHASES_EDIT_2ND_COLUMN, y, phase->swtch, attr); + putsSwitches(MIXES_2ND_COLUMN, y, phase->swtch, attr); if (attr) CHECK_INCDEC_MODELSWITCH(event, phase->swtch, -MAX_SWITCH, MAX_SWITCH); break; case 2: lcd_putsLeft( y, STR_TRIMS); for (uint8_t t=0; t0) ? BLINK|INVERS : INVERS) : 0); + putsTrimMode(MIXES_2ND_COLUMN+(t*FW), y, s_currIdx, t, (attr && m_posHorz==t) ? ((s_editMode>0) ? BLINK|INVERS : INVERS) : 0); if (attr && m_posHorz==t && ((s_editMode>0) || p1valdiff)) { int16_t v = getRawTrimValue(s_currIdx, t); if (v < TRIM_EXTENDED_MAX) v = TRIM_EXTENDED_MAX; @@ -867,7 +875,7 @@ void menuProcPhaseOne(uint8_t event) } #if defined(ROTARY_ENCODERS) for (uint8_t t=0; t0) ? BLINK|INVERS : INVERS) : 0); + putsRotaryEncoderMode(MIXES_2ND_COLUMN+((4+t)*FW)+2, y, s_currIdx, t, (attr && m_posHorz==4+t) ? ((s_editMode>0) ? BLINK|INVERS : INVERS) : 0); if (attr && m_posHorz==4+t && ((s_editMode>0) || p1valdiff)) { #if defined(EXTRA_ROTARY_ENCODERS) int16_t v; @@ -896,14 +904,10 @@ void menuProcPhaseOne(uint8_t event) #endif break; case 3: - lcd_putsLeft(y, STR_FADEIN); - lcd_outdezAtt(PHASES_EDIT_2ND_COLUMN, y, phase->fadeIn*5, attr|PREC1|LEFT); - if(attr) CHECK_INCDEC_MODELVAR(event, phase->fadeIn, 0, 15); + phase->fadeIn = editDelay(y, event, attr, STR_FADEIN, phase->fadeIn); break; case 4: - lcd_putsLeft( y, STR_FADEOUT); - lcd_outdezAtt(PHASES_EDIT_2ND_COLUMN, y, phase->fadeOut*5, attr|PREC1|LEFT); - if(attr) CHECK_INCDEC_MODELVAR(event, phase->fadeOut, 0, 15); + phase->fadeOut = editDelay(y, event, attr, STR_FADEOUT, phase->fadeOut); break; } } @@ -1584,22 +1588,6 @@ enum MixFields { MIX_FIELD_COUNT }; -#if defined(TRANSLATIONS_FR) -#define MIXES_2ND_COLUMN (13*FW) -#elif defined(TRANSLATIONS_CZ) -#define MIXES_2ND_COLUMN (13*FW) -#else -#define MIXES_2ND_COLUMN (9*FW) -#endif - -uint8_t editMixDelay(const uint8_t y, const uint8_t event, const uint8_t attr, const pm_char *str, uint8_t delay) -{ - lcd_putsLeft(y, str); - lcd_outdezAtt(MIXES_2ND_COLUMN, y, 5*delay, attr|PREC1|LEFT); - if (attr) CHECK_INCDEC_MODELVAR(event, delay, 0, MAX_DELAY); - return delay; -} - void menuProcMixOne(uint8_t event) { TITLEP(s_currCh ? STR_INSERTMIX : STR_EDITMIX); @@ -1731,16 +1719,16 @@ void menuProcMixOne(uint8_t event) if(attr) CHECK_INCDEC_MODELVAR( event, md2->mltpx, 0, 2); break; case MIX_FIELD_DELAY_UP: - md2->delayUp = editMixDelay(y, event, attr, STR_DELAYUP, md2->delayUp); + md2->delayUp = editDelay(y, event, attr, STR_DELAYUP, md2->delayUp); break; case MIX_FIELD_DELAY_DOWN: - md2->delayDown = editMixDelay(y, event, attr, STR_DELAYDOWN, md2->delayDown); + md2->delayDown = editDelay(y, event, attr, STR_DELAYDOWN, md2->delayDown); break; case MIX_FIELD_SLOW_UP: - md2->speedUp = editMixDelay(y, event, attr, STR_SLOWUP, md2->speedUp); + md2->speedUp = editDelay(y, event, attr, STR_SLOWUP, md2->speedUp); break; case MIX_FIELD_SLOW_DOWN: - md2->speedDown = editMixDelay(y, event, attr, STR_SLOWDOWN, md2->speedDown); + md2->speedDown = editDelay(y, event, attr, STR_SLOWDOWN, md2->speedDown); break; } } diff --git a/src/myeeprom.h b/src/myeeprom.h index 85416f122..6fbad7385 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -184,7 +184,7 @@ PACK(typedef struct t_ExpoData { PACK(typedef struct t_ExpoData { uint8_t mode:2; // 0=end, 1=pos, 2=neg, 3=both uint8_t chn:2; - uint8_t curve:4; // 0=no curve, 1-6=std curves, 7-10=CV1-CV4, 11-15=CV9-CV13 + uint8_t curve:4; // 0=no curve, 1-6=std curves, 7-14=CV1-CV8 int8_t swtch:5; uint8_t phase:3; // if negPhase is 0: 0=normal, 5=FP4 if negPhase is 1: 5=!FP4 uint8_t negPhase:1; diff --git a/src/open9x.cpp b/src/open9x.cpp index c09a6abac..8ea38acc8 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -789,7 +789,7 @@ int8_t getMovedSwitch() bool next = __getSwitch(i); if (prev != next) { if (i!=MAX_PSWITCH || next==true) - result = i; + result = next ? i : -i; if (mask) switches_states ^= mask; else