@ -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 */