[stock] Rotary encoder support

This commit is contained in:
bsongis
2013-02-08 20:58:18 +00:00
parent a323af62c0
commit c087ed17ef
11 changed files with 174 additions and 63 deletions
+32 -15
View File
@@ -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
+4 -6
View File
@@ -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
+13
View File
@@ -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);
+12 -3
View File
@@ -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
+15
View File
@@ -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
+19 -28
View File
@@ -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
+7 -3
View File
@@ -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) {
+3 -7
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

+65 -1
View File
@@ -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()
+4
View File
@@ -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