diff -r 8ba7b3192d6b src/target/devo7e/capabilities.h --- a/src/target/devo7e/capabilities.h Wed Jan 01 10:54:22 2014 +0100 +++ b/src/target/devo7e/capabilities.h Wed Jan 01 19:42:22 2014 +0100 @@ -7,6 +7,9 @@ CHANDEF(HOLD1) CHANDEF(FMOD0) CHANDEF(FMOD1) + CHANDEF(FMOD2) + CHANDEF(AIL_DR0) + CHANDEF(AIL_DR1) #endif #ifdef UNDEF_INP @@ -14,9 +17,9 @@ #define INP_RUD_DR1 INP_HOLD1 #define INP_ELE_DR0 INP_HOLD0 #define INP_ELE_DR1 INP_HOLD1 -#define INP_AIL_DR0 INP_HOLD0 -#define INP_AIL_DR1 INP_HOLD1 -#define INP_FMOD2 INP_FMOD1 +//#define INP_AIL_DR0 INP_HOLD0 +//#define INP_AIL_DR1 INP_HOLD1 +//#define INP_FMOD2 INP_FMOD1 #define INP_MIX0 INP_FMOD0 #define INP_MIX1 INP_FMOD1 #define INP_MIX2 INP_FMOD1 diff -r 8ba7b3192d6b src/target/devo7e/channels.c --- a/src/target/devo7e/channels.c Wed Jan 01 10:54:22 2014 +0100 +++ b/src/target/devo7e/channels.c Wed Jan 01 19:42:22 2014 +0100 @@ -40,6 +40,7 @@ gpio_set(GPIOC, GPIO10 | GPIO11); } +extern u32 glbl_buttons; s32 CHAN_ReadRawInput(int channel) { s32 value = 0; @@ -50,8 +51,21 @@ case INP_ELEVATOR: value = adc_array_raw[3]; break; // bug fix: left vertical case INP_HOLD0: value = gpio_get(GPIOC, GPIO11); break; case INP_HOLD1: value = ! gpio_get(GPIOC, GPIO11); break; - case INP_FMOD0: value = gpio_get(GPIOC, GPIO10); break; - case INP_FMOD1: value = ! gpio_get(GPIOC, GPIO10); break; + //case INP_FMOD0: value = gpio_get(GPIOC, GPIO10); break; + //case INP_FMOD1: value = ! gpio_get(GPIOC, GPIO10); break; + + //case INP_AIL_DR0: value = !(glbl_buttons & (1 << 31)); break; + //case INP_AIL_DR1: value = !!(glbl_buttons & (1 << 31)); break; + + //case INP_ELE_DR0: value = !(glbl_buttons & (1 << 30)); break; + //case INP_ELE_DR1: value = !!(glbl_buttons & (1 << 30)); break; + + case INP_FMOD0: value = !!(glbl_buttons & (1 << 31)); break; + case INP_FMOD1: value = !(glbl_buttons & (3 << 30)); break; + case INP_FMOD2: value = !!(glbl_buttons & (1 << 30)); break; + + case INP_AIL_DR0: value = gpio_get(GPIOC, GPIO10); break; + case INP_AIL_DR1: value = ! gpio_get(GPIOC, GPIO10); break; } return value; } diff -r 8ba7b3192d6b src/target/devo7e/tx_buttons.c --- a/src/target/devo7e/tx_buttons.c Wed Jan 01 10:54:22 2014 +0100 +++ b/src/target/devo7e/tx_buttons.c Wed Jan 01 19:42:22 2014 +0100 @@ -20,9 +20,9 @@ static const u16 rows[] = {GPIO6, GPIO7, GPIO8, GPIO9, 0xffff}; static const u8 buttonmap[] = { BUT_TRIM_RH_POS, BUT_TRIM_RH_NEG, BUT_TRIM_RV_POS, BUT_TRIM_RV_NEG, - BUT_LAST, BUT_ENTER, BUT_RIGHT, BUT_LEFT, + 32, BUT_ENTER, BUT_RIGHT, BUT_LEFT, BUT_TRIM_LV_POS, BUT_TRIM_LV_NEG, BUT_TRIM_LH_NEG, BUT_TRIM_LH_POS, - BUT_LAST, BUT_DOWN, BUT_UP, BUT_EXIT, + 31, BUT_DOWN, BUT_UP, BUT_EXIT, }; #define COL_PORT GPIOB @@ -46,30 +46,33 @@ gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO5 | GPIO6 | GPIO7 | GPIO8); - gpio_set(GPIOB, GPIO5 | GPIO6| GPIO7 | GPIO8); + gpio_clear(GPIOB, GPIO5 | GPIO6| GPIO7 | GPIO8); /* PortC 6-9 are pull-up inputs */ gpio_set_mode(GPIOC, GPIO_MODE_INPUT, GPIO_CNF_INPUT_PULL_UPDOWN, GPIO6 | GPIO7 | GPIO8 | GPIO9); - gpio_set(GPIOC, GPIO6 | GPIO7 | GPIO8 | GPIO9); + gpio_clear(GPIOC, GPIO6 | GPIO7 | GPIO8 | GPIO9); } +u32 glbl_buttons = 0; u32 ScanButtons() { u8 idx = 0; u32 result = 0; const u16 *c, *r; - gpio_set(COL_PORT, COL_PORT_MASK); + gpio_clear(COL_PORT, COL_PORT_MASK); for(c = columns; *c != 0xffff; c++) { + gpio_set(COL_PORT, *c); + u16 but = gpio_port_read(ROW_PORT); gpio_clear(COL_PORT, *c); - u16 but = gpio_port_read(ROW_PORT); - gpio_set(COL_PORT, *c); for(r = rows; *r != 0xffff; r++) { - if(! (but & *r)) { + if((but & *r)) { result |= 1 << (buttonmap[idx] - 1); } idx++; } } - return result; + if (! (result & 0x3FFFFFFF)) + glbl_buttons = result; + return result & 0x3FFFFFFF; } diff -r 8ba7b3192d6b src/target/emu_devo7e/channels.c --- a/src/target/emu_devo7e/channels.c Wed Jan 01 10:54:22 2014 +0100 +++ b/src/target/emu_devo7e/channels.c Wed Jan 01 19:42:22 2014 +0100 @@ -26,8 +26,11 @@ case INP_AILERON: return CHAN_MIN_VALUE + step * gui.aileron; case INP_HOLD0: return (gui.rud_dr & 0x01) ? CHAN_MIN_VALUE : CHAN_MAX_VALUE; case INP_HOLD1: return (gui.rud_dr & 0x01) ? CHAN_MAX_VALUE : CHAN_MIN_VALUE; - case INP_FMOD0: return gui.gear ? CHAN_MIN_VALUE : CHAN_MAX_VALUE; - case INP_FMOD1: return gui.gear ? CHAN_MAX_VALUE : CHAN_MIN_VALUE; + case INP_AIL_DR0: return (gui.ail_dr & 0x01) ? CHAN_MIN_VALUE : CHAN_MAX_VALUE; + case INP_AIL_DR1: return (gui.ail_dr & 0x01) ? CHAN_MAX_VALUE : CHAN_MIN_VALUE; + case INP_FMOD0: return gui.fmod == 0 ? CHAN_MAX_VALUE : CHAN_MIN_VALUE; + case INP_FMOD1: return gui.fmod == 1 ? CHAN_MAX_VALUE : CHAN_MIN_VALUE; + case INP_FMOD2: return gui.fmod == 2 ? CHAN_MAX_VALUE : CHAN_MIN_VALUE; } return 0; }