ESP8266 ILI9341 display support code with printf sources, wire-frame viewer and custom fonts  1.0
ESP8266ILI9341DisplayProject
queue.c
Go to the documentation of this file.
1 
25 #include "user_config.h"
26 
27 #ifdef AVR
28 #include <stdlib.h>
29 #endif
30 
31 #include "lib/queue.h"
32 
38 queue_t *queue_new(size_t size)
39 {
40  queue_t *q = safecalloc( sizeof(queue_t),1);
41  if(!q)
42  return(NULL);
43  q->buf = safecalloc(size+1,1);
44  if(!q->buf)
45  {
46  safefree(q);
47  return(NULL);
48  }
49  q->in = 0;
50  q->out = 0;
51  q->bytes = 0;
52  q->size = size;
53  q->flags = 0;
54  return(q);
55 }
56 
63 {
64  if(!q)
65  return;
66  if(q->buf)
67  {
68  safefree(q->buf);
69  // This clear help prevents a freed pointer from being used by mistake
70  // can be removed in production
71  q->buf = NULL;
72  q->in = 0;
73  q->out = 0;
74  q->bytes = 0;
75  q->size = 0;
76  q->flags = 0;
77  }
78  safefree(q);
79 }
80 
81 
88 {
89  if(!q)
90  return;
91  q->in = 0;
92  q->out = 0;
93  q->bytes = 0;
94  q->flags = 0;
95 }
96 
102 size_t queue_used(queue_t *q)
103 {
104  if(!q || !q->buf)
105  return(0);
106  return(q->bytes);
107 }
108 
115 {
116  if(!q || !q->buf)
117  return(1);
118  if(!q->bytes)
119  return(1);
120  return(0);
121 }
122 
129 {
130  if(!q || !q->buf)
131  return(0);
132  return(q->size - q->bytes);
133 }
134 
140 size_t queue_full(queue_t *q)
141 {
142  if(!q || !q->buf)
143  return(0);
144  return(queue_space(q) ? 0 : 1);
145 }
146 
157 size_t queue_push_buffer(queue_t *q, uint8_t *src, size_t size)
158 {
159  size_t bytes = 0;
160 
161  if(!q || !q->buf)
162  return(0);
163 
164  while(size && queue_space(q) )
165  {
166  if(q->in >= q->size)
167  q->in = 0;
168  q->buf[q->in++] = *src++;
169  ++q->bytes;
170  --size;
171  ++bytes;
172  }
173  return(bytes);
174 }
175 
186 size_t queue_pop_buffer(queue_t *q, uint8_t *dst, size_t size)
187 {
188  size_t bytes = 0;
189 
190  if(!q || !q->buf)
191  return(0);
192 
193  while(size && q->bytes)
194  {
195  *dst++ = q->buf[q->out++];
196  if(q->out >= q->size)
197  q->out = 0;
198  --q->bytes;
199  --size;
200  ++bytes;
201  }
202  return(bytes);
203 }
204 
205 
217 {
218  if(!q || !q->buf)
219  return(0);
220 
221  if(q->bytes >= q->size)
222  {
223  q->flags |= QUEUE_OVERRUN;
224  return(0);
225  }
226  if(q->in >= q->size)
227  q->in = 0;
228 
229  if(c == '\n') // st EOL flasg when we see one
230  q->flags |= QUEUE_EOL;
231  q->buf[q->in++] = c;
232  ++q->bytes;
233  return(1);
234 }
235 
245 {
246  uint8_t c;
247  if(!q || !q->buf)
248  return(0);
249 
250  if(q->bytes)
251  {
252  c = q->buf[q->out];
253  if(c == '\n') // reset EOL flag after a read
254  q->flags &= ~QUEUE_EOL;
255  if(++q->out >= q->size)
256  q->out = 0;
257  q->bytes--;
258  return(c);
259  }
260  return(0);
261 }
char * buf
Definition: queue.h:37
dst_t dst
DST start and stop in GMT epoch.
Definition: time.c:52
size_t queue_push_buffer(queue_t *q, uint8_t *src, size_t size)
Add a data buffer to the ring buffer Note: This function does not wait/block util there is enough fre...
Definition: queue.c:157
Master include file for project Includes all project includes and defines here.
size_t out
Definition: queue.h:40
void queue_flush(queue_t *q)
Flush ring buffer.
Definition: queue.c:87
size_t queue_full(queue_t *q)
Is the ring buffer full ?
Definition: queue.c:140
size_t in
Definition: queue.h:39
int queue_pushc(queue_t *q, uint8_t c)
Add a byte to the ring buffer Note: This function does not wait/block util there is enough free space...
Definition: queue.c:216
#define QUEUE_EOL
Definition: queue.h:33
void queue_del(queue_t *q)
Delete a ring buffer and free memory.
Definition: queue.c:62
size_t queue_space(queue_t *q)
Find the amount of free space remaining in the ring buffer.
Definition: queue.c:128
Ring buffer code.
size_t bytes
Definition: queue.h:41
#define NULL
Definition: cpu.h:55
int queue_popc(queue_t *q)
Remove a byte from the ring buffer Note: This function does not wait/block util there is data to meet...
Definition: queue.c:244
queue structure
Definition: queue.h:36
uint8_t flags
Definition: queue.h:38
queue_t * queue_new(size_t size)
Create a ring buffer of a given size.
Definition: queue.c:38
size_t queue_empty(queue_t *q)
Is the ring buffer empty ?
Definition: queue.c:114
size_t queue_pop_buffer(queue_t *q, uint8_t *dst, size_t size)
Get a data buffer from the ring buffer. Note: This function does not wait/block until there is enough...
Definition: queue.c:186
size_t queue_used(queue_t *q)
Find the number of bytes used by the ring buffer.
Definition: queue.c:102
MEMSPACE void safefree(void *p)
Safe free - Only free a pointer if it is in malloc memory range. We want to try to catch frees of sta...
Definition: system.c:165
unsigned char uint8_t
Definition: send.c:17
#define QUEUE_OVERRUN
Definition: queue.h:32
MEMSPACE void * safecalloc(size_t nmemb, size_t size)
Safe Calloc - Display Error message if Calloc fails.
Definition: system.c:128
size_t size
Definition: queue.h:42