You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

51 lines
1.2 KiB

  1. #ifndef RING_BUFFER_H
  2. #define RING_BUFFER_H
  3. /*--------------------------------------------------------------------
  4. * Ring buffer to store scan codes from keyboard
  5. *------------------------------------------------------------------*/
  6. #define RBUF_SIZE 32
  7. #include <util/atomic.h>
  8. static uint8_t rbuf[RBUF_SIZE];
  9. static uint8_t rbuf_head = 0;
  10. static uint8_t rbuf_tail = 0;
  11. static inline void rbuf_enqueue(uint8_t data)
  12. {
  13. ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
  14. uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
  15. if (next != rbuf_tail) {
  16. rbuf[rbuf_head] = data;
  17. rbuf_head = next;
  18. } else {
  19. print("rbuf: full\n");
  20. }
  21. }
  22. }
  23. static inline uint8_t rbuf_dequeue(void)
  24. {
  25. uint8_t val = 0;
  26. ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
  27. if (rbuf_head != rbuf_tail) {
  28. val = rbuf[rbuf_tail];
  29. rbuf_tail = (rbuf_tail + 1) % RBUF_SIZE;
  30. }
  31. }
  32. return val;
  33. }
  34. static inline bool rbuf_has_data(void)
  35. {
  36. bool has_data;
  37. ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
  38. has_data = (rbuf_head != rbuf_tail);
  39. }
  40. return has_data;
  41. }
  42. static inline void rbuf_clear(void)
  43. {
  44. ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
  45. rbuf_head = rbuf_tail = 0;
  46. }
  47. }
  48. #endif /* RING_BUFFER_H */