summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-07-27 11:24:22 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-07-27 11:24:22 +0000
commit406edc298d90173f4a81119a1280f085b216ab64 (patch)
tree779d0c8858256552aea096d30268e4ee78db41f4
parentc16a86677f98a986b31c6f4e251da41ccda3c7fe (diff)
downloadrockbox-406edc298d90173f4a81119a1280f085b216ab64.zip
rockbox-406edc298d90173f4a81119a1280f085b216ab64.tar.gz
rockbox-406edc298d90173f4a81119a1280f085b216ab64.tar.bz2
rockbox-406edc298d90173f4a81119a1280f085b216ab64.tar.xz
Added key-release event masking
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1460 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/drivers/button.c45
-rw-r--r--firmware/drivers/button.h10
2 files changed, 45 insertions, 10 deletions
diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c
index 636376b..24e4588 100644
--- a/firmware/drivers/button.c
+++ b/firmware/drivers/button.c
@@ -36,6 +36,8 @@ struct event_queue button_queue;
#define REPEAT_INTERVAL 4
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);
@@ -45,13 +47,23 @@ static void button_tick(void)
static int count=0;
static int lastbtn=0;
static bool repeat=false;
+ int diff;
/* only poll every X ticks */
if ( ++tick >= POLL_FREQUENCY ) {
bool post = false;
int btn = button_read();
- if ( btn ) {
+ 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 ) {
post = true;
@@ -96,7 +108,8 @@ static void button_tick(void)
/* Report that the key has been released */
if(lastbtn != btn)
{
- queue_post(&button_queue, BUTTON_REL | lastbtn, NULL);
+ if(lastbtn & release_mask)
+ queue_post(&button_queue, BUTTON_REL | lastbtn, NULL);
}
}
@@ -118,6 +131,27 @@ int button_get(bool block)
return BUTTON_NONE;
}
+int button_set_repeat(int newmask)
+{
+ int oldmask = repeat_mask;
+ repeat_mask = newmask;
+ return oldmask;
+}
+
+int button_set_release(int newmask)
+{
+ int oldmask = release_mask;
+ release_mask = 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:
@@ -151,13 +185,6 @@ void button_init()
tick_add_task(button_tick);
}
-int button_set_repeat(int newmask)
-{
- int oldmask = repeat_mask;
- repeat_mask = newmask;
- return oldmask;
-}
-
/*
* Get button pressed from hardware
*/
diff --git a/firmware/drivers/button.h b/firmware/drivers/button.h
index 0ff6b58..d5c194c 100644
--- a/firmware/drivers/button.h
+++ b/firmware/drivers/button.h
@@ -27,6 +27,8 @@ extern struct event_queue button_queue;
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
@@ -40,6 +42,9 @@ int button_set_repeat(int newmask);
#define BUTTON_HELD 0x4000
#define BUTTON_REL 0x8000
+/* Special message */
+#define BUTTON_LOCKED 0x2000
+
#ifdef HAVE_RECORDER_KEYPAD
/* Recorder specific button codes */
@@ -61,6 +66,9 @@ int button_set_repeat(int newmask);
#define DEFAULT_REPEAT_MASK (BUTTON_LEFT | BUTTON_RIGHT)
-#endif
+#endif /* HAVE_PLAYER_KEYPAD */
+
+#define DEFAULT_RELEASE_MASK 0
+#define DEFAULT_LOCKED_MASK 0
#endif