Open FFBoard
Open source force feedback firmware
ringbuffer.c
Go to the documentation of this file.
1#include "ringbuffer.h"
2
3#define NO_MEM_COPY
4#ifndef NO_MEM_COPY
5#include <string.h>
6#else
7#ifndef memcpy
8static void *memcpy(void *dst, const void *src, size_t n)
9{
10 size_t i = 0;
11 /* Verify if n, and the pointers are word aligned.
12 * If it's word aligned copy by word.
13 */
14 if((uintptr_t)dst % sizeof(uint32_t) == 0 &&
15 (uintptr_t)src % sizeof(uint32_t) == 0 &&
16 n % sizeof(uint32_t) == 0) {
17
18 uint32_t *d_word = dst;
19 const uint32_t *s_word = src;
20
21 for (i=0; i<n/sizeof(uint32_t); i++) {
22 d_word[i] = s_word[i];
23 }
24 }
25 else {
26
27 char *d = dst;
28 const char *s = src;
29
30 for (i=0; i<n; i++) {
31 d[i] = s[i];
32 }
33 }
34
35 return dst;
36}
37#endif
38#endif
39
40int ringBufferInit(RingBuffer *buffer, uint8_t *data, size_t len) {
41 if(!isMultipleTwo(len)) {
42 return 0;
43 }
44
45 buffer->tail = 0;
46 buffer->head = 0;
47 buffer->sizeMask = len-1;
48 buffer->data = data;
49 return 1;
50}
51
53 if(buffer->tail >= buffer->head) {
54 return buffer->tail-buffer->head;
55 }
56
57 return buffer->sizeMask-(buffer->head-buffer->tail)+1;
58}
59
61 return (buffer->tail == buffer->head);
62}
63
65 return buffer->sizeMask - ringBufferLen(buffer);
66}
67
69 return buffer->sizeMask;
70}
71
73 buffer->data[buffer->tail] = data;
74 buffer->tail = (buffer->tail + 1) & buffer->sizeMask;
75}
76
77void ringBufferAppendMultiple(RingBuffer *buffer, const uint8_t *data, size_t len){
78 if(buffer->tail + len > buffer->sizeMask) {
79 uint32_t lenToTheEnd = buffer->sizeMask - buffer->tail + 1;
80 uint32_t lenFromBegin = len - lenToTheEnd;
81 memcpy(buffer->data + buffer->tail, data, lenToTheEnd);
82 memcpy(buffer->data, data + lenToTheEnd, lenFromBegin);
83 }
84 else {
85 memcpy(buffer->data + buffer->tail, data, len);
86 }
87 buffer->tail = (buffer->tail + len) & buffer->sizeMask;
88}
89
91 return buffer->data[buffer->head];
92}
93
95 uint8_t data = buffer->data[buffer->head];
96 buffer->head = (buffer->head + 1) & buffer->sizeMask;
97 return data;
98}
99
100void ringBufferGetMultiple(RingBuffer *buffer, uint8_t *dst, size_t len) {
102 buffer->head = (buffer->head + len) & buffer->sizeMask;
103}
104
105void ringBufferPeekMultiple(const RingBuffer *buffer, uint8_t *dst, size_t len){
106 if(buffer->head + len > buffer->sizeMask) {
107 uint32_t lenToTheEnd = buffer->sizeMask - buffer->head + 1;
108 uint32_t lenFromBegin = len - lenToTheEnd;
109 memcpy(dst, buffer->data + buffer->head, lenToTheEnd);
110 memcpy(dst + lenToTheEnd, buffer->data, lenFromBegin);
111 }
112 else {
113 memcpy(dst, buffer->data + buffer->head, len);
114 }
115}
116
118 buffer->head = (buffer->head + len) & buffer->sizeMask;
119}
120
122 buffer->head = buffer->tail = 0;
123}
static struct @612 data
uint8_t const * buffer
Definition: midi_device.h:100
uint8_t ringBufferGetOne(RingBuffer *buffer)
Definition: ringbuffer.c:94
static void * memcpy(void *dst, const void *src, size_t n)
Definition: ringbuffer.c:8
size_t ringBufferFreeSpace(const RingBuffer *buffer)
Definition: ringbuffer.c:64
size_t ringBufferLen(const RingBuffer *buffer)
Definition: ringbuffer.c:52
void ringBufferAppendOne(RingBuffer *buffer, uint8_t data)
Definition: ringbuffer.c:72
void ringBufferGetMultiple(RingBuffer *buffer, uint8_t *dst, size_t len)
Definition: ringbuffer.c:100
int ringBufferInit(RingBuffer *buffer, uint8_t *data, size_t len)
Definition: ringbuffer.c:40
size_t ringBufferMaxSize(const RingBuffer *buffer)
Definition: ringbuffer.c:68
void ringBufferAppendMultiple(RingBuffer *buffer, const uint8_t *data, size_t len)
Definition: ringbuffer.c:77
void ringBufferClear(RingBuffer *buffer)
Definition: ringbuffer.c:121
uint8_t ringBufferEmpty(const RingBuffer *buffer)
Definition: ringbuffer.c:60
void ringBufferDiscardMultiple(RingBuffer *buffer, size_t len)
Definition: ringbuffer.c:117
void ringBufferPeekMultiple(const RingBuffer *buffer, uint8_t *dst, size_t len)
Definition: ringbuffer.c:105
uint8_t ringBufferPeekOne(const RingBuffer *buffer)
Definition: ringbuffer.c:90
static int isMultipleTwo(size_t len)
Definition: ringbuffer.h:61