00001
00038 #ifndef _RING_BUFFER_H
00039 #define _RING_BUFFER_H
00040
00053 #define RING_BUFFER_NEW(struct_name, size, type, ...) \
00054 struct struct_name { \
00055 type queue[size]; \
00056 uint8_t start; \
00057 uint8_t end; \
00058 uint8_t buffer_size; \
00059 } __VA_ARGS__
00060
00061
00068 #define RING_BUFFER_INIT(buf, size) \
00069 do { \
00070 (buf).buffer_size = size; \
00071 } while(0)
00072
00073
00078 #define RING_BUFFER_CLEAR(buf) \
00079 do { \
00080 (buf).start = 0; \
00081 (buf).end = 0; \
00082 } while (0)
00083
00088 #define RING_BUFFER_EMPTY(buf) ((buf).start == (buf).end)
00089
00090
00095 #define RING_BUFFER_FULL(buf) \
00096 (((buf).end + 1) % (buf).buffer_size == (buf).start)
00097
00098
00106 #define RING_BUFFER_ADD(buf, val) \
00107 do { \
00108 (buf).queue[(buf).end] = val; \
00109 (buf).end = ((buf).end + 1) % (buf).buffer_size; \
00110 } while (0)
00111
00112
00122 #define RING_BUFFER_REMOVE(buf, val_ret) \
00123 do { \
00124 (val_ret) = (buf).queue[(buf).start]; \
00125 (buf).start = ((buf).start + 1) % (buf).buffer_size; \
00126 } while (0)
00127
00136 #define RING_BUFFER_PEEK(buf, val_ret) \
00137 do { \
00138 (val_ret) = (buf).queue[(buf).start]; \
00139 } while(0)
00140
00141 #endif
00142