key.c 890 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /*
  2. key.c
  3. */
  4. #include <stdint.h>
  5. #include "stm32l031xx.h" /* IRQ disable/enable */
  6. #include "key.h"
  7. #define KEY_QUEUE_MASK 0x0f
  8. #define KEY_QUEUE_MAX (KEY_QUEUE_MASK+1)
  9. uint8_t volatile key_queue[KEY_QUEUE_MAX];
  10. uint8_t volatile key_queue_start = 0;
  11. uint8_t volatile key_queue_end = 0;
  12. int key_add(uint8_t key)
  13. {
  14. uint8_t new_end;
  15. new_end = key_queue_end;
  16. new_end++;
  17. new_end &= KEY_QUEUE_MASK;
  18. if ( new_end == key_queue_start )
  19. return 0; /* buffer is full */
  20. key_queue[key_queue_end] = key;
  21. key_queue_end = new_end;
  22. return 1;
  23. }
  24. uint8_t key_get(void)
  25. {
  26. uint8_t key;
  27. uint8_t new_start;
  28. if ( key_queue_start == key_queue_end )
  29. {
  30. return KEY_NONE;
  31. }
  32. //__disable_irq();
  33. key = key_queue[key_queue_start];
  34. new_start = key_queue_start;
  35. new_start++;
  36. new_start &= KEY_QUEUE_MASK;
  37. key_queue_start = new_start;
  38. //__enable_irq();
  39. return key;
  40. }