|  |  | @ -4,13 +4,13 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  |  * Ring buffer to store scan codes from keyboard |  |  |  |  * Ring buffer to store scan codes from keyboard | 
			
		
	
		
		
			
				
					
					|  |  |  |  *------------------------------------------------------------------*/ |  |  |  |  *------------------------------------------------------------------*/ | 
			
		
	
		
		
			
				
					
					|  |  |  | #define RBUF_SIZE 32 |  |  |  | #define RBUF_SIZE 32 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #include <util/atomic.h> | 
			
		
	
		
		
			
				
					
					|  |  |  | static uint8_t rbuf[RBUF_SIZE]; |  |  |  | static uint8_t rbuf[RBUF_SIZE]; | 
			
		
	
		
		
			
				
					
					|  |  |  | static uint8_t rbuf_head = 0; |  |  |  | static uint8_t rbuf_head = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  | static uint8_t rbuf_tail = 0; |  |  |  | static uint8_t rbuf_tail = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  | static inline void rbuf_enqueue(uint8_t data) |  |  |  | static inline void rbuf_enqueue(uint8_t data) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |     uint8_t sreg = SREG; |  |  |  |   ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     cli(); |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     uint8_t next = (rbuf_head + 1) % RBUF_SIZE; |  |  |  |     uint8_t next = (rbuf_head + 1) % RBUF_SIZE; | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (next != rbuf_tail) { |  |  |  |     if (next != rbuf_tail) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         rbuf[rbuf_head] = data; |  |  |  |         rbuf[rbuf_head] = data; | 
			
		
	
	
		
		
			
				
					|  |  | @ -18,36 +18,34 @@ static inline void rbuf_enqueue(uint8_t data) | 
			
		
	
		
		
			
				
					
					|  |  |  |     } else { |  |  |  |     } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |         print("rbuf: full\n"); |  |  |  |         print("rbuf: full\n"); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     SREG = sreg; |  |  |  |   } | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | static inline uint8_t rbuf_dequeue(void) |  |  |  | static inline uint8_t rbuf_dequeue(void) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |     uint8_t val = 0; |  |  |  |     uint8_t val = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     uint8_t sreg = SREG; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     cli(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (rbuf_head != rbuf_tail) { |  |  |  |     if (rbuf_head != rbuf_tail) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         val = rbuf[rbuf_tail]; |  |  |  |         val = rbuf[rbuf_tail]; | 
			
		
	
		
		
			
				
					
					|  |  |  |         rbuf_tail = (rbuf_tail + 1) % RBUF_SIZE; |  |  |  |         rbuf_tail = (rbuf_tail + 1) % RBUF_SIZE; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     SREG = sreg; |  |  |  |   } | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     return val; |  |  |  |     return val; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | static inline bool rbuf_has_data(void) |  |  |  | static inline bool rbuf_has_data(void) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |     uint8_t sreg = SREG; |  |  |  |   bool has_data; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     cli(); |  |  |  |   ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     bool has_data = (rbuf_head != rbuf_tail); |  |  |  |     has_data = (rbuf_head != rbuf_tail); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     SREG = sreg; |  |  |  |   } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     return has_data; |  |  |  |   return has_data; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | static inline void rbuf_clear(void) |  |  |  | static inline void rbuf_clear(void) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |     uint8_t sreg = SREG; |  |  |  |   ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     cli(); |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     rbuf_head = rbuf_tail = 0; |  |  |  |     rbuf_head = rbuf_tail = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |     SREG = sreg; |  |  |  |   } | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | #endif  /* RING_BUFFER_H */ |  |  |  | #endif  /* RING_BUFFER_H */ | 
			
		
	
	
		
		
			
				
					|  |  | 
 |