Add kbd_peekMask() and kbd_getMask() functions.
authorasterix <asterix@38d2e660-2303-0410-9eaa-f027e97ec537>
Wed, 11 Jan 2012 14:40:26 +0000 (14:40 +0000)
committerasterix <asterix@38d2e660-2303-0410-9eaa-f027e97ec537>
Wed, 11 Jan 2012 14:40:26 +0000 (14:40 +0000)
git-svn-id: https://src.develer.com/svnoss/bertos/trunk@5247 38d2e660-2303-0410-9eaa-f027e97ec537

bertos/drv/kbd.c
bertos/drv/kbd.h

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
 
index 989ebf7f4107a02644ad68311366a378213b675b..eb699602d26cf3158c5f6cad080da70fb8893bd5 100644 (file)
@@ -85,7 +85,9 @@ typedef struct KbdHandler
 
 void kbd_init(void);
 keymask_t kbd_peek(void);
+keymask_t kbd_peekMask(keymask_t mask);
 keymask_t kbd_get(void);
+keymask_t kbd_getMask(keymask_t mask);
 keymask_t kbd_get_timeout(mtime_t timeout);
 void kbd_addHandler(struct KbdHandler *handler);
 void kbd_remHandler(struct KbdHandler *handler);