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.

42 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. ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
  13. uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
  14. if (next != rbuf_tail) {
  15. rbuf[rbuf_head] = data;
  16. rbuf_head = next;
  17. } else {
  18. print("rbuf: full\n");
  19. }
  20. }
  21. }
  22. static inline uint8_t rbuf_dequeue(void) {
  23. uint8_t val = 0;
  24. ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
  25. if (rbuf_head != rbuf_tail) {
  26. val = rbuf[rbuf_tail];
  27. rbuf_tail = (rbuf_tail + 1) % RBUF_SIZE;
  28. }
  29. }
  30. return val;
  31. }
  32. static inline bool rbuf_has_data(void) {
  33. bool has_data;
  34. ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { has_data = (rbuf_head != rbuf_tail); }
  35. return has_data;
  36. }
  37. static inline void rbuf_clear(void) {
  38. ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { rbuf_head = rbuf_tail = 0; }
  39. }
  40. #endif /* RING_BUFFER_H */