Add kbd_peekMask() and kbd_getMask() functions.
[bertos.git] / bertos / drv / kbd.c
index 402e07d73832a67c54a36c4b1d9015ac16bb545c..b75db360354c82214de1c2c1550bb02ff0bbb45c 100644 (file)
@@ -176,6 +176,12 @@ static void kbd_softint(UNUSED_ARG(iptr_t, arg))
  *
  */
 keymask_t kbd_peek(void)
+{
+       return kbd_peekMask((keymask_t)0xFFFFFFFFFFFFFFFFULL);
+}
+
+
+keymask_t kbd_peekMask(keymask_t mask)
 {
        keymask_t key = 0;
 
@@ -187,10 +193,12 @@ keymask_t kbd_peek(void)
 
        /* Extract an event from the keyboard buffer */
        IRQ_DISABLE;
-       if (kbd_cnt)
+       if (kbd_cnt && (kbd_buf & mask))
        {
-               --kbd_cnt;
-               key = kbd_buf;
+               key = kbd_buf & mask;
+               kbd_buf &= ~mask;
+               if (!kbd_buf)
+                       --kbd_cnt;
        }
        IRQ_ENABLE;
 
@@ -203,14 +211,23 @@ keymask_t kbd_peek(void)
  * \note This function is \b not interrupt safe!
  */
 keymask_t kbd_get(void)
+{
+       return kbd_getMask((keymask_t)0xFFFFFFFFFFFFFFFFULL);
+}
+
+keymask_t kbd_getMask(keymask_t mask)
 {
        keymask_t key;
 
        #if CONFIG_KBD_POLL == KBD_POLL_SOFTINT
-               event_wait(&key_pressed);
-               key = kbd_peek();
+               do
+               {
+                       event_wait(&key_pressed);
+                       key = kbd_peekMask(mask);
+               }
+               while (!key);
        #else
-               while (!(key = kbd_peek()))
+               while (!(key = kbd_peekMask(mask)))
                        cpu_relax();
        #endif