From c087ed17ef4d0aaed3c0a969181893b04df16a13 Mon Sep 17 00:00:00 2001 From: bsongis Date: Fri, 8 Feb 2013 20:58:18 +0000 Subject: [PATCH] [stock] Rotary encoder support --- src/Makefile | 47 ++++++++++++++++++--------- src/general_menus.cpp | 10 +++--- src/main_views.cpp | 13 ++++++++ src/menus.cpp | 15 +++++++-- src/menus.h | 15 +++++++++ src/model_menus.cpp | 47 +++++++++++---------------- src/open9x.cpp | 10 ++++-- src/open9x.h | 10 ++---- src/splash_X9D.bmp | Bin 0 -> 6526 bytes src/stock/board_stock.cpp | 66 +++++++++++++++++++++++++++++++++++++- src/stock/board_stock.h | 4 +++ 11 files changed, 174 insertions(+), 63 deletions(-) create mode 100644 src/splash_X9D.bmp 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 0000000000000000000000000000000000000000..308476d90afa6702eb41553dab0ff626569320ec GIT binary patch literal 6526 zcmbuD&u?Q_702&+wv$OFnTgX*nUN?cPDK!lBK0K$f(`0;Pz8bt2}h#43XMlpr4%vp z^8%`(B&vrM2sSVO!I*yl#bL*8+#O3i|ACzi>}bsAd+vQs#G(i}%E^28*E!$wJ?EZ# zU*7z|NB4sN{H`9tuX+1B@*Tv&4J3qrz8u2#%_!cX&M>cjz2RMY)KfE^f%lQ6f+qKt_mc919U3)e4KDm2r zM-8Ng)R9}rZNyGupPu$}VUhh>u-s-h=2ooIst0>+bGvLH_Gem*tA~g-Ew>$ePOi;!gc@bekyfR@@2>^W2*HK5gbG`QP_4{u zX3dH@o?W}FYo4S88BevDH?pVJ*vR5XO~)oJQ8BNl<&w4ubWyg4mPj2 z{<I)Ow>4wc+nc<_@w&I^WvzWpdTq}Rh_Tt0T`YJc z6NJ5?{*m$kTu;>^Q`|>pURb^nr4WXMSu=<}`@_n#rbi@?YNV_>LIhYqDH1Cp4akdX}=&1kV?FO1Ct~ z|08l(jFQ2mgX=v7SmYyB<0P}_l6Kib1u8Y>2N*p_p>c{5a%1%zN@?| z*b5U!HsP(HUNFjx9X8r>z#>AS6Fsr)4 zko=$7E*fH{li6ZteQu9m0*`7Nv){0D^lRkIa@y*{?q<;3)r3NE10OLE7G~^G&w927 zlCErLO`Gt{#h2zXqa;$7HkL>Az?kz+?i|`s$kCIk#}-&#iu!xZ(@24iUi3oRq*bl8 zxyOm>qdh8K;n1UuMn^@3eMhtH8JeES4`-qf3gX$awmlTjHX>?$d8<|?e2aIo|3%cw z>VYiY1|d7DR6a>#%EMDEc_nnD%v<+ecq4JgREk+qFC=5=pOEw8UXo`)`5rG1~eKq4E8mDGUBVv`5KT$4+0gn$J+q2dk%v%f8T9AAEgy zeqbR>+0MGY@S@ofJEtA@Q!5ZwI(BXjC)tthCLBa?F8QHY4yiV4qpw-^Ls_cnhxb1;Q z%#g<*&UtI5=yF5Ss6;U~k0cmI9>G*wSf_n(Xj8>9MqBn1r-g7h?r|K~7~;rp z9NXLAP!@>CA^GpOl8Sk+R8zIk#@Xj*flfnN^mwvz8tXOLI7sUbqfefd9r5VrPG4H^ zBleV;*q_*WeMEhcHfPLh2Yd@Fy|LPya5_J-TGINEd*PwH26@EYCbs9R@iYZvWgT0i z6op}`GLPMpv&5O=a-R5!6}`$)@g4V&*v6K7L6z~EgC}B)m5VQi3a@VWpgrL>v4IZG zL(No#E3OHXdj{eKt1(l-C5t_3)<9Wa@#q{LtHxko_rZ~s{4MbO8J5^Xeg^u^ z#V<}duh8vyk3dVQ??*T@+o@3*G)JfNVqdm|E#4;V)U$#+DLYuYC4ErE??kGo^XuGE zgT4=jbU);I5k2x;*ad9?%90tTIzeyL2J*Cfn$*#AKVhb}EsVOi@~z2C%@%XQz|$iS z%N2v1dvL^UJ24v1n2Jx`zt0vToe@jE;+*=P(AS8*K!0jkwMT3K-cwpVA%NL4&k4TS zl9h;mWF6-0``O~($XVdt%~-sHyPv*;D!saKh<)0A&vZ^>9NbUZryg6cPqIbsz3}@M z<5k|cUcZm{T(Qz)OjY4mwgJoB%B0!zZDzL_^ZkatUaXte+hkn&BLaVtMR@JKe#7*W zs6w7@bVA;>3+*7Z&v?fh#rHZd>3x>&k(W1x+;3{smFT_VfDSzI{DJ+C?Ox0v^-BX| zpk;msRNNhT<7-rP<67{=q<&DZgb?BBZnFHQ@O6Yo-8G1;lyJWs4W%u{tcbJ8;5*lsk#iQ z{JJZso@xCVJzXrgE-}PCl2MpY74x&uyneDS;@`8kqNR8fV`e+Dz`7R9=xZszI+K$f z?t81@cC>jB?>6G|Ub3O;BG2`oDLp0nFNB_;^QZ4}-fbi9C&swh;s1#G?RRGQx!|Ut z*fxpr1-UqiRa=qDg7{R7@q5Pj)?E# zp4(WaV#=@h-;xTevina$)3$D{;BU+98}$9rt;8>@1KNMMvS8n)UDEy*&)@Tm{?~k+ Z=DnHbSDZ=TDgBDdKJTCR-%O1K`wx%&e6|1p literal 0 HcmV?d00001 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