Wirepas SDK
ringbuffer.h
Go to the documentation of this file.
1/* Copyright 2017 Wirepas Ltd. All Rights Reserved.
2 *
3 * See file LICENSE.txt for full license details.
4 *
5 */
6
7#ifndef RINGBUFFER_H_
8#define RINGBUFFER_H_
9
10/*----------------------------------------------------------------------------
11 Notes:
12 The length of the receive and transmit buffers must be a power of 2.
13 Each buffer has a next_in and a next_out index.
14 If next_in = next_out, the buffer is empty.
15 (next_in - next_out) % buffer_size = the number of characters in the buffer.
16 *----------------------------------------------------------------------------*/
17
18#if !defined BUFFER_SIZE
19#error Please define BUFFER_SIZE before including this header!
20#endif
21
22#if BUFFER_SIZE < 2
23#error BUFFER_SIZE is too small. It must be larger than 1.
24#elif ((BUFFER_SIZE & (BUFFER_SIZE-1)) != 0)
25#error BUFFER_SIZE must be a power of 2.
26#endif
27
28#define MASK (BUFFER_SIZE-1)
29
30typedef struct
31{
32 uint16_t in; // Next In Index
33 uint16_t out; // Next Out Index
34 uint8_t buf[BUFFER_SIZE]; // Buffer
36
38#define Ringbuffer_size(p) (BUFFER_SIZE)
40#define Ringbuffer_usage(p) ((uint16_t)((p).in - (p).out))
42#define Ringbuffer_free(p) (Ringbuffer_size(p)-Ringbuffer_usage(p))
43
45#define Ringbuffer_contents(p) ((p).buf)
46
48#define Ringbuffer_reset(p) do{ (p).out = 0; (p).in = 0; }while(false)
50#define Ringbuffer_isReset(p) ((p).out == 0 && (p).in == 0)
51
53#define Ringbuffer_getHeadIdx(p) ((p).in & MASK)
55#define Ringbuffer_getHeadByte(p) ((p).buf[Ringbuffer_getHeadIdx(p)])
57#define Ringbuffer_getHeadPtr(p) (uint8_t *)(&Ringbuffer_getHeadByte(p))
59#define Ringbuffer_incrHead(p, a) ((p).in += (a))
60
62#define Ringbuffer_getTailIdx(p) ((p).out & MASK)
64#define Ringbuffer_getTailByte(p) ((p).buf[Ringbuffer_getTailIdx(p)])
66#define Ringbuffer_getTailPtr(p) (uint8_t *)(&Ringbuffer_getTailByte(p))
68#define Ringbuffer_incrTail(p, a) ((p).out += (a))
69
109#endif /* RINGBUFFER_H_ */
uint16_t in
Definition ringbuffer.h:32
uint16_t out
Definition ringbuffer.h:33