diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c index 24e45886ad..878f041c78 100644 --- a/firmware/drivers/button.c +++ b/firmware/drivers/button.c @@ -37,7 +37,6 @@ struct event_queue button_queue; static int repeat_mask = DEFAULT_REPEAT_MASK; static int release_mask = DEFAULT_RELEASE_MASK; -static int locked_mask = DEFAULT_LOCKED_MASK; static int button_read(void); @@ -50,73 +49,92 @@ static void button_tick(void) int diff; /* only poll every X ticks */ - if ( ++tick >= POLL_FREQUENCY ) { + if ( ++tick >= POLL_FREQUENCY ) + { bool post = false; int btn = button_read(); - + + /* Find out if a key has been released */ + diff = btn ^ lastbtn; + if((btn & diff) == 0) + { + if(diff & release_mask) + queue_post(&button_queue, BUTTON_REL | diff, NULL); + } + if ( btn ) { - /* Find out if a key has been released */ - diff = btn ^ lastbtn; - if((btn & diff) == 0) - { - if(diff & release_mask) - queue_post(&button_queue, BUTTON_REL | diff, NULL); - } - /* normal keypress */ - if ( btn != lastbtn ) { + if ( btn != lastbtn ) + { post = true; + repeat = false; } - /* repeat? */ - else { - if ( repeat ) { + else /* repeat? */ + { + if ( repeat ) + { if ( ! --count ) { post = true; count = REPEAT_INTERVAL; } } - else if (count++ > REPEAT_START) { - /* Only repeat if a repeatable key is pressed */ - if(btn & repeat_mask) - { - post = true; - repeat = true; - count = REPEAT_INTERVAL; - } - /* If the OFF button is pressed long enough, and we are - still alive, then the unit must be connected to a - charger. Therefore we will reboot and let the original - firmware handle the charging. */ + else + { + if(btn & repeat_mask || #ifdef HAVE_RECORDER_KEYPAD - if(btn == BUTTON_OFF) -#elif HAVE_PLAYER_KEYPAD - if(btn == BUTTON_STOP) + btn == BUTTON_OFF) +#else + btn == BUTTON_STOP) #endif - system_reboot(); + { + if (count++ > REPEAT_START) + { + /* Only repeat if a repeatable key is pressed */ + if(btn & repeat_mask) + { + post = true; + repeat = true; + count = REPEAT_INTERVAL; + } + /* If the OFF button is pressed long enough, + and we are still alive, then the unit must be + connected to a charger. Therefore we will + reboot and let the original firmware handle + the charging. */ +#ifdef HAVE_RECORDER_KEYPAD + if(btn == BUTTON_OFF) +#elif HAVE_PLAYER_KEYPAD + if(btn == BUTTON_STOP) +#endif + system_reboot(); + } + } + else + { + count = 0; + } } } if ( post ) { - queue_post(&button_queue, btn, NULL); + if(repeat) + queue_post(&button_queue, BUTTON_REPEAT | btn, NULL); + else + queue_post(&button_queue, btn, NULL); backlight_on(); } } - else { + else + { repeat = false; count = 0; - /* Report that the key has been released */ - if(lastbtn != btn) - { - if(lastbtn & release_mask) - queue_post(&button_queue, BUTTON_REL | lastbtn, NULL); - } } - - lastbtn = btn; + + lastbtn = btn & ~(BUTTON_REL | BUTTON_REPEAT); tick = 0; } - + backlight_tick(); } @@ -145,13 +163,6 @@ int button_set_release(int newmask) return oldmask; } -int button_set_locked(int newmask) -{ - int oldmask = locked_mask; - locked_mask = newmask; - return oldmask; -} - #ifdef HAVE_RECORDER_KEYPAD /* AJBR buttons are connected to the CPU as follows: diff --git a/firmware/drivers/button.h b/firmware/drivers/button.h index d5c194cedb..22d648caf6 100644 --- a/firmware/drivers/button.h +++ b/firmware/drivers/button.h @@ -28,7 +28,6 @@ void button_init (void); int button_get (bool block); int button_set_repeat(int newmask); int button_set_release(int newmask); -int button_set_locked(int newmask); /* Shared button codes */ #define BUTTON_NONE 0x0000 @@ -39,7 +38,7 @@ int button_set_locked(int newmask); #define BUTTON_RIGHT 0x0080 /* Button modifiers */ -#define BUTTON_HELD 0x4000 +#define BUTTON_REPEAT 0x4000 #define BUTTON_REL 0x8000 /* Special message */ @@ -56,7 +55,11 @@ int button_set_locked(int newmask); #define DEFAULT_REPEAT_MASK (BUTTON_LEFT | BUTTON_RIGHT | \ BUTTON_UP | BUTTON_DOWN) - + +#define ALL_BUTTONS (BUTTON_ON | BUTTON_UP | BUTTON_DOWN | BUTTON_LEFT | \ + BUTTON_RIGHT | BUTTON_OFF | BUTTON_PLAY | BUTTON_F1 | \ + BUTTON_F2 | BUTTON_F3) + #elif HAVE_PLAYER_KEYPAD /* Jukebox 6000 and Studio specific button codes */ @@ -66,9 +69,11 @@ int button_set_locked(int newmask); #define DEFAULT_REPEAT_MASK (BUTTON_LEFT | BUTTON_RIGHT) +#define ALL_BUTTONS (BUTTON_ON | BUTTON_UP | BUTTON_DOWN | BUTTON_LEFT | \ + BUTTON_RIGHT | BUTTON_OFF | BUTTON_MENU) + #endif /* HAVE_PLAYER_KEYPAD */ #define DEFAULT_RELEASE_MASK 0 -#define DEFAULT_LOCKED_MASK 0 #endif