diff --git a/src/Makefile b/src/Makefile index 480303f2f..eb9e6d2ef 100644 --- a/src/Makefile +++ b/src/Makefile @@ -50,8 +50,9 @@ DELAY = 5 #----------- BUILD OPTIONS --------------------------- # PCB version -# Values: STD, STD128, GRUVIN9X, SKY9X, X9D, ACT -PCB = STD +# Values: 9X, 9X128, 9XR, 9XR128, GRUVIN9X, SKY9X, X9D, ACT +# Old values STD and STD128 are mapped to 9X and 9X128 for compatibility +PCB = 9X # PCB revision # Values: REVA, REVB @@ -77,6 +78,7 @@ TEMPLATES = YES # POT2 (menus scroll), # POT3 (cursor down/up), # POTS (POT1, POT2, POT3), +# ROTENC (Rotary encoder) NAVIGATION = NO # Switches automatic selection @@ -219,7 +221,7 @@ SVNREV = $(shell sh -c "svnversion | egrep -o '[[:digit:]]+[[:alpha:]]*$$'") CPPDEFS = # MCU name -ifeq ($(PCB), STD) +ifeq ($(PCB), $(filter $(PCB), STD 9X 9XR)) ARCH = AVR TRGT = avr- MCU = atmega64 @@ -228,7 +230,7 @@ ifeq ($(PCB), STD) SDCARD = NO endif -ifeq ($(PCB), STD128) +ifeq ($(PCB), $(filter $(PCB), STD128 9X128 9XR128)) ARCH = AVR TRGT = avr- MCU = atmega128 @@ -336,9 +338,6 @@ DBGFMT = dwarf-2 # For a directory that has spaces, enclose it in quotes. EXTRAINCDIRS = . translations -# NOTE: PCB version now overrides all the earlier individual settings -# These individual settings work only for PCB=STD - CPPDEFS += -DTRANSLATIONS_$(TRANSLATIONS) # TTS language @@ -366,13 +365,20 @@ endif ifeq ($(NAVIGATION), POTS) CPPDEFS += -DNAVIGATION_POT1 -DNAVIGATION_POT2 -DNAVIGATION_POT3 endif +ifeq ($(NAVIGATION), ROTENC) + CPPDEFS += -DROTARY_ENCODER_NAVIGATION +endif ifeq ($(AUTOSWITCH), YES) CPPDEFS += -DAUTOSWITCH endif ifeq ($(DBLKEYS), YES) - CPPDEFS += -DDBLKEYS + ifeq ($(PCB), $(filter $(PCB), 9XR 9XR128)) + $(warning Sorry, DBLKEYS doesnt work on 9XR) + else + CPPDEFS += -DDBLKEYS + endif endif ifeq ($(SPLASH), YES) @@ -601,7 +607,7 @@ ifeq ($(PCB), GRUVIN9X) CPPDEFS += -DROTARY_ENCODERS=${ROTARY_ENCODERS} endif -ifeq ($(PCB), STD128) +ifeq ($(PCB), $(filter $(PCB), STD128 9X128 9XR128)) # 9x radio with Atmega 64 replace by Atmega 128 OPT = 2 CPPDEFS += -DPCBSTD -DCPUM128 -DEEPROM_VARIANT=0x8000 @@ -610,6 +616,12 @@ ifeq ($(PCB), STD128) EXTRABOARDSRC += stock/lcd_driver.cpp EEPROMSRC = eeprom_avr.cpp PULSESSRC = pulses_avr.cpp + + ifeq ($(PCB), 9XR128) + CPPDEFS += -DPCB9XR128 + else + CPPDEFS += -DPCB9X128 + endif ifeq ($(AUDIO), YES) CPPDEFS += -DAUDIO @@ -625,7 +637,7 @@ ifeq ($(PCB), STD128) ifeq ($(PWM_BACKLIGHT), YES) ifeq ($(VOICE), YES) - $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with VOICE mod.) + $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with VOICE mod) else CPPDEFS += -DPWM_BACKLIGHT endif @@ -641,7 +653,7 @@ ifeq ($(PCB), STD128) endif endif -ifeq ($(PCB), STD) +ifeq ($(PCB), $(filter $(PCB), STD 9X 9XR)) # 9x radio OPT = s EXTRAINCDIRS += stock @@ -651,6 +663,12 @@ ifeq ($(PCB), STD) EEPROMSRC = eeprom_avr.cpp PULSESSRC = pulses_avr.cpp + ifeq ($(PCB), 9XR) + CPPDEFS += -DPCB9XR + else + CPPDEFS += -DPCB9X + endif + ifeq ($(AUDIO), YES) CPPDEFS += -DAUDIO CPPSRC += audio_avr.cpp @@ -665,7 +683,7 @@ ifeq ($(PCB), STD) ifeq ($(PWM_BACKLIGHT), YES) ifeq ($(VOICE), YES) - $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with VOICE mod.) + $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with VOICE mod) else CPPDEFS += -DPWM_BACKLIGHT endif @@ -687,7 +705,6 @@ ifeq ($(PPM_CENTER_ADJUSTABLE), YES) CPPDEFS += -DPPM_CENTER_ADJUSTABLE endif - ifeq ($(PPM_LIMITS_SYMETRICAL), YES) CPPDEFS += -DPPM_LIMITS_SYMETRICAL endif @@ -922,10 +939,10 @@ splash_9x.lbm: splash_9x.xbm @echo "Convert 9x splash from xbm to lbm:" $(IMG2LBM) $< $@ img -splash_X9D.lbm: splash_X9D.xbm +splash_X9D.lbm: splash_X9D.bmp @echo @echo "Convert X9D splash from xbm to lbm:" - $(IMG2LBM) $< $@ img + $(IMG2LBM) $< $@ bmp splash_ACT.lbm: splash_ACT.xbm @echo diff --git a/src/general_menus.cpp b/src/general_menus.cpp index e0f1220e6..099337d91 100644 --- a/src/general_menus.cpp +++ b/src/general_menus.cpp @@ -539,9 +539,8 @@ void menuGeneralSdManager(uint8_t event) reusableBuffer.sd.offset = 65535; break; #if defined(ROTARY_ENCODERS) - case EVT_KEY_FIRST(BTN_REa): - case EVT_KEY_FIRST(BTN_REb): - if (!navigationRotaryEncoder(event)) + case EVT_KEY_FIRST_ROTARY_ENCODERS: + if (!IS_RE_NAVIGATION_EVT(event)) break; // no break #endif @@ -560,9 +559,8 @@ void menuGeneralSdManager(uint8_t event) break; } #if defined(ROTARY_ENCODERS) - case EVT_KEY_LONG(BTN_REa): - case EVT_KEY_LONG(BTN_REb): - if (!navigationRotaryEncoder(event)) + case EVT_KEY_LONG_ROTARY_ENCODERS: + if (!IS_RE_NAVIGATION_EVT(event)) break; // no break #endif diff --git a/src/main_views.cpp b/src/main_views.cpp index 5000d2d36..97d2e7ed9 100644 --- a/src/main_views.cpp +++ b/src/main_views.cpp @@ -328,11 +328,24 @@ void menuMainView(uint8_t event) break; #endif +#if defined(ROTARY_ENCODER_NAVIGATION) + case EVT_KEY_BREAK_ROTARY_ENCODERS: + if (!IS_RE_NAVIGATION_EVT(event)) + break; + // no break; +#endif case EVT_KEY_MODEL_MENU: pushMenu(menuModelSelect); killEvents(event); break; +#if defined(ROTARY_ENCODER_NAVIGATION) + case EVT_KEY_LONG_ROTARY_ENCODERS: + if (!IS_RE_NAVIGATION_EVT(event)) + break; + killEvents(event); + // no break; +#endif case EVT_KEY_GENERAL_MENU: pushMenu(menuGeneralSetup); killEvents(event); diff --git a/src/menus.cpp b/src/menus.cpp index 86a003196..ddc7b07f9 100644 --- a/src/menus.cpp +++ b/src/menus.cpp @@ -518,10 +518,20 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t 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; + killEvents(event); + // no break +#endif + case EVT_KEY_LONG(KEY_EXIT): s_editMode = 0; popMenu(); break; + case EVT_KEY_BREAK(KEY_EXIT): #if defined(ROTARY_ENCODER_NAVIGATION) if (s_editMode==0) @@ -673,9 +683,8 @@ 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(BTN_REa): - case EVT_KEY_BREAK(BTN_REb): - if (!navigationRotaryEncoder(event)) + case EVT_KEY_BREAK_ROTARY_ENCODERS: + if (!IS_RE_NAVIGATION_EVT(event)) break; // no break #endif diff --git a/src/menus.h b/src/menus.h index 5f15615bb..e761aeee9 100644 --- a/src/menus.h +++ b/src/menus.h @@ -122,11 +122,26 @@ void menuStatisticsDebug(uint8_t event); #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 diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 1305ff966..0bc37eddb 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -297,15 +297,13 @@ void menuModelSelect(uint8_t event) s_copyMode = 0; } break; -#if defined(ROTARY_ENCODERS) - case EVT_KEY_BREAK(BTN_REa): - case EVT_KEY_BREAK(BTN_REb): - if (navigationRotaryEncoder(event)) +#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; break; - case EVT_KEY_LONG(BTN_REa): - case EVT_KEY_LONG(BTN_REb): - if (!navigationRotaryEncoder(event)) + case EVT_KEY_LONG_ROTARY_ENCODERS: + if (!IS_RE_NAVIGATION_EVT(event)) break; // no break #endif @@ -575,9 +573,8 @@ void editName(uint8_t x, uint8_t y, char *name, uint8_t size, uint8_t event, uin #if defined(PCBX9D) || defined(PCBACT) case EVT_KEY_BREAK(KEY_ENTER): #else - case EVT_KEY_BREAK(BTN_REa): - case EVT_KEY_BREAK(BTN_REb): - if (!navigationRotaryEncoder(event)) + case EVT_KEY_BREAK_ROTARY_ENCODERS: + if (!IS_RE_NAVIGATION_EVT(event)) break; #endif if (s_editMode == EDIT_MODIFY_FIELD) { @@ -599,9 +596,8 @@ void editName(uint8_t x, uint8_t y, char *name, uint8_t size, uint8_t event, uin #if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBX9D) #if defined(ROTARY_ENCODERS) - case EVT_KEY_LONG(BTN_REa): - case EVT_KEY_LONG(BTN_REb): - if (!navigationRotaryEncoder(event)) + case EVT_KEY_LONG_ROTARY_ENCODERS: + if (!IS_RE_NAVIGATION_EVT(event)) break; // no break #endif @@ -1271,9 +1267,8 @@ void menuModelPhasesAll(uint8_t event) switch (event) { #if defined(ROTARY_ENCODERS) - case EVT_KEY_BREAK(BTN_REa): - case EVT_KEY_BREAK(BTN_REb): - if (!navigationRotaryEncoder(event)) + case EVT_KEY_BREAK_ROTARY_ENCODERS: + if (!IS_RE_NAVIGATION_EVT(event)) break; // no break #endif @@ -1499,9 +1494,8 @@ void menuModelCurveOne(uint8_t event) s_editMode = 1; break; #if defined(ROTARY_ENCODERS) - case EVT_KEY_BREAK(BTN_REa): - case EVT_KEY_BREAK(BTN_REb): - if (!navigationRotaryEncoder(event)) + case EVT_KEY_BREAK_ROTARY_ENCODERS: + if (!IS_RE_NAVIGATION_EVT(event)) break; // no break #endif @@ -2203,9 +2197,8 @@ void menuModelExpoMix(uint8_t expo, uint8_t event) } // no break #if defined(ROTARY_ENCODERS) - case EVT_KEY_BREAK(BTN_REa): - case EVT_KEY_BREAK(BTN_REb): - if (event!=EVT_KEY_BREAK(KEY_ENTER) && !navigationRotaryEncoder(event)) + case EVT_KEY_BREAK_ROTARY_ENCODERS: + if (event!=EVT_KEY_BREAK(KEY_ENTER) && !IS_RE_NAVIGATION_EVT(event)) break; // no break #endif @@ -2669,9 +2662,8 @@ void menuModelCurvesAll(uint8_t event) switch (event) { #if defined(ROTARY_ENCODERS) - case EVT_KEY_BREAK(BTN_REa): - case EVT_KEY_BREAK(BTN_REb): - if (!navigationRotaryEncoder(event)) + case EVT_KEY_BREAK_ROTARY_ENCODERS: + if (!IS_RE_NAVIGATION_EVT(event)) break; // no break #endif @@ -2893,9 +2885,8 @@ void menuModelCustomSwitches(uint8_t event) switch (event) { #if defined(ROTARY_ENCODERS) - case EVT_KEY_BREAK(BTN_REa): - case EVT_KEY_BREAK(BTN_REb): - if (!navigationRotaryEncoder(event)) + case EVT_KEY_BREAK_ROTARY_ENCODERS: + if (!IS_RE_NAVIGATION_EVT(event)) break; // no break #endif diff --git a/src/open9x.cpp b/src/open9x.cpp index 76245f117..9851868b2 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -3335,10 +3335,10 @@ void saveTimers() } #endif -#if defined(PCBACT) -volatile rotenc_t g_rotenc[1] = {0}; -#elif defined(ROTARY_ENCODERS) +#if defined(ROTARY_ENCODERS) volatile rotenc_t g_rotenc[ROTARY_ENCODERS] = {0}; +#elif defined(ROTARY_ENCODER_NAVIGATION) +volatile rotenc_t g_rotenc[1] = {0}; #endif #ifndef SIMU @@ -3720,6 +3720,10 @@ 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 b139fbd59..8207c1c03 100644 --- a/src/open9x.h +++ b/src/open9x.h @@ -736,10 +736,6 @@ extern void setTrimValue(uint8_t phase, uint8_t idx, int16_t trim); #if defined(ROTARY_ENCODERS) int16_t getRotaryEncoder(uint8_t idx); void incRotaryEncoder(uint8_t idx, int8_t inc); -inline bool navigationRotaryEncoder(uint8_t event) -{ - return g_eeGeneral.reNavigation == (EVT_KEY_MASK(event) - BTN_REa + 1); -} #endif #if defined(PCBSKY9X) @@ -1079,11 +1075,11 @@ typedef uint32_t rotenc_t; typedef uint8_t rotenc_t; #endif -#if defined(PCBACT) -extern volatile rotenc_t g_rotenc[1]; -#elif defined(ROTARY_ENCODERS) +#if defined(ROTARY_ENCODERS) // Global rotary encoder registers extern volatile rotenc_t g_rotenc[ROTARY_ENCODERS]; +#elif defined(ROTARY_ENCODER_NAVIGATION) +extern volatile rotenc_t g_rotenc[1]; #endif #ifdef JETI diff --git a/src/splash_X9D.bmp b/src/splash_X9D.bmp new file mode 100644 index 000000000..308476d90 Binary files /dev/null and b/src/splash_X9D.bmp differ diff --git a/src/stock/board_stock.cpp b/src/stock/board_stock.cpp index 43777e218..795c775de 100644 --- a/src/stock/board_stock.cpp +++ b/src/stock/board_stock.cpp @@ -34,6 +34,66 @@ #include "../open9x.h" +#if defined(ROTARY_ENCODER_NAVIGATION) + +uint8_t RotEncoder ; + +#if defined(TELEMETREZ) +uint8_t TrotCount ; // TeZ version +uint8_t LastTrotCount ; // TeZ version +uint8_t TezRotary ; +#else +uint8_t RotPosition ; +int8_t LastRotaryValue ; +int8_t Rotary_diff ; +int8_t RotaryControl ; +#endif + +void rotencPoll() +{ +#if defined(TELEMETREZ) + if (TrotCount != LastTrotCount ) { + g_rotenc[0] = LastTrotCount = TrotCount ; + } +#else + // Rotary Encoder polling + PORTA = 0 ; // No pullups + DDRA = 0x1F ; // Top 3 bits input + asm(" rjmp 1f") ; + asm("1:") ; +// asm(" nop") ; +// asm(" nop") ; + uint8_t rotary ; + 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 + + rotary &= 0xDF ; + if ( rotary != RotPosition ) { + uint8_t x ; + x = RotPosition & 0x40 ; + x <<= 1 ; + x ^= rotary & 0x80 ; + if ( x ) { + g_rotenc[0] -= 1 ; + } + else { + g_rotenc[0] += 1 ; + } + RotPosition = rotary ; + } +#endif +} +#endif + #ifndef SIMU inline void boardInit() { @@ -203,9 +263,13 @@ void readKeysAndTrims() for (int i=0; i<8; i++) { // INP_D_TRM_RH_UP 0 .. INP_D_TRM_LH_UP 7 - keys[enuk].input(in & pgm_read_byte(crossTrim+i),(EnumKeys)enuk); + keys[enuk].input(in & pgm_read_byte(crossTrim+i), (EnumKeys)enuk); ++enuk; } + +#if defined(ROTARY_ENCODER_NAVIGATION) + keys[enuk].input(RotEncoder & 0x20, (EnumKeys)enuk); // Rotary Enc. Switch +#endif } bool checkSlaveMode() diff --git a/src/stock/board_stock.h b/src/stock/board_stock.h index 8505c2309..350f0d9cc 100644 --- a/src/stock/board_stock.h +++ b/src/stock/board_stock.h @@ -197,4 +197,8 @@ void fadeBacklight(); #define OUT_C_LCD_RES 2 #define OUT_C_LCD_CS1 1 +#if defined(ROTARY_ENCODER_NAVIGATION) +void rotencPoll(); +#endif + #endif