#pragma once #include #include struct fifo { uint8_t size; uint8_t pWrite; uint8_t pRead; uint8_t *pBuffer; union { struct { uint8_t blocking:1; // Blocking Mode uint8_t irq_rd:1, // fifo_read / fifo_poll called from IRQ (force non blocking) irq_wr:1; // fifo_write called from IRQ (force non blocking) }; uint8_t flags; }; uint16_t timeout; avrWAIT wtimeout; }; typedef struct fifo FIFO; // FIFO Options #define FO_BLOCKING (1<<0) #define FO_IRQ_RD (1<<1) #define FO_IRQ_WR (1<<2) FIFO* fifo_alloc (uint8_t size); void fifo_write (FIFO* fifo,uint8_t byte); uint16_t fifo_read (FIFO* fifo); uint16_t fifo_poll (FIFO* fifo); uint8_t fifo_avail (FIFO* fifo); uint8_t fifo_free (FIFO* fifo); void fifo_set_blocking(FIFO* fifo,uint8_t blocking); void fifo_set_timeout(FIFO*fifo,uint16_t timeout); void fifo_options(FIFO* fifo,uint8_t options); uint16_t fifo_read_block (FIFO* fifo,uint8_t* buffer,int maxlen);