tinyusb  0.4
Click here to lend your support to tinyusb donation and make a donation at pledgie.com
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
fifo.c
Go to the documentation of this file.
1 /**************************************************************************/
37 /**************************************************************************/
38 #include <string.h>
39 #include "fifo.h"
40 
41 //static inline void mutex_lock (fifo_t* f) ATTR_ALWAYS_INLINE;
42 //static inline void mutex_unlock (fifo_t* f) ATTR_ALWAYS_INLINE;
43 #define mutex_lock(f)
44 #define mutex_unlock(f)
45 
46 static inline bool is_fifo_initalized(fifo_t* f) ATTR_ALWAYS_INLINE;
47 
48 
49 /**************************************************************************/
64 /**************************************************************************/
65 bool fifo_read(fifo_t* f, void * p_buffer)
66 {
67  if( !is_fifo_initalized(f) || fifo_is_empty(f) )
68  {
69  return false;
70  }
71 
72  mutex_lock(f);
73 
74  memcpy(p_buffer,
75  f->buffer + (f->rd_idx * f->item_size),
76  f->item_size);
77  f->rd_idx = (f->rd_idx + 1) % f->depth;
78  f->count--;
79 
80  mutex_unlock(f);
81 
82  return true;
83 }
84 
85 /**************************************************************************/
101 /**************************************************************************/
102 bool fifo_write(fifo_t* f, void const * p_data)
103 {
104  if ( !is_fifo_initalized(f) || (fifo_is_full(f) && !f->overwritable) )
105  {
106  return false;
107  }
108 
109  mutex_lock(f);
110 
111  memcpy( f->buffer + (f->wr_idx * f->item_size),
112  p_data,
113  f->item_size);
114 
115  f->wr_idx = (f->wr_idx + 1) % f->depth;
116 
117  if (fifo_is_full(f))
118  {
119  f->rd_idx = f->wr_idx; // keep the full state (rd == wr && len = size)
120  }else
121  {
122  f->count++;
123  }
124 
125  mutex_unlock(f);
126 
127  return true;
128 }
129 
130 /**************************************************************************/
137 /**************************************************************************/
139 {
140  mutex_lock(f);
141 
142  f->rd_idx = f->wr_idx = f->count = 0;
143 
144  mutex_unlock(f);
145 }
146 
147 //--------------------------------------------------------------------+
148 // HELPER FUNCTIONS
149 //--------------------------------------------------------------------+
150 
151 /**************************************************************************/
159 /**************************************************************************/
160 //static inline void mutex_lock (fifo_t* f)
161 //{
162 // if (f->irq > 0)
163 // {
164 // #if !defined (_TEST_)
165 // NVIC_DisableIRQ(f->irq);
166 // #endif
167 // }
168 //}
169 
170 /**************************************************************************/
177 /**************************************************************************/
178 //static inline void mutex_unlock (fifo_t* f)
179 //{
180 // if (f->irq > 0)
181 // {
182 // #if !defined (_TEST_)
183 // NVIC_EnableIRQ(f->irq);
184 // #endif
185 // }
186 //}
187 
188 static inline bool is_fifo_initalized(fifo_t* f)
189 {
190  return !( f->buffer == NULL || f->depth == 0 || f->item_size == 0);
191 }
static bool is_fifo_initalized(fifo_t *f) ATTR_ALWAYS_INLINE
Disables the IRQ specified in the FIFO's 'irq' field to prevent reads/write issues with interrupts...
Definition: fifo.c:188
volatile uint16_t rd_idx
read pointer
Definition: fifo.h:62
uint16_t const depth
max items
Definition: fifo.h:58
uint16_t const item_size
size of each item
Definition: fifo.h:59
void fifo_clear(fifo_t *f)
Clear the fifo read and write pointers and set length to zero.
Definition: fifo.c:138
bool fifo_write(fifo_t *f, void const *p_data)
Write one byte into the RX buffer.
Definition: fifo.c:102
bool fifo_read(fifo_t *f, void *p_buffer)
Read one byte out of the RX buffer.
Definition: fifo.c:65
volatile uint16_t wr_idx
write pointer
Definition: fifo.h:61
uint8_t *const buffer
buffer pointer
Definition: fifo.h:57
Simple Circular FIFO.
Definition: fifo.h:55
#define ATTR_ALWAYS_INLINE
Generally, functions are not inlined unless optimization is specified. For functions declared inline...
Definition: compiler_gcc.h:89
volatile uint16_t count
number of items in queue
Definition: fifo.h:60