Reworked the button code
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1462 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
42df584960
commit
e1a97288fc
2 changed files with 69 additions and 53 deletions
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue