Paparazzi UAS v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
Loading...
Searching...
No Matches
ring_buffer.c
Go to the documentation of this file.
1/*
2 * General purpose circular buffer
3 *
4 * Copyright (C) 2021 Fabien-B <fabien-b@github.com>
5 *
6 * This file is part of paparazzi. See LICENCE file.
7 */
8
9#include "utils/ring_buffer.h"
10#include <string.h>
11
12
13void ring_buffer_init(ring_buffer_t *rb, uint8_t *buf, size_t size) {
14 rb->read_offset = 0;
15 rb->write_offset = 0;
16 rb->size = size;
17 rb->buf = buf;
18}
19
21 if (rb->write_offset >= rb->read_offset) {
22 return rb->write_offset - rb->read_offset;
23 }
24 else {
25 return rb->size - (rb->read_offset - rb->write_offset);
26 }
27}
28
32
33size_t ring_buffer_write(ring_buffer_t *rb, uint8_t *data, size_t len) {
35 if (len > free_space) {
36 len = free_space;
37 }
38
39 size_t first_chunk = rb->size - rb->write_offset;
40 if (first_chunk > len) {
41 first_chunk = len;
42 }
43
44 // Copy first chunk
45 memcpy(&rb->buf[rb->write_offset], data, first_chunk);
46
47 // Copy second chunk if wrap needed
48 size_t remaining = len - first_chunk;
49 if (remaining > 0) {
50 memcpy(&rb->buf[0], data + first_chunk, remaining);
51 }
52
53 rb->write_offset = (rb->write_offset + len) % rb->size;
54
55 return len;
56}
57
59{
60 size_t available = ring_buffer_available(rb);
61 if (len > available) {
62 len = available;
63 }
64
65 // how much until wrap?
66 size_t first_chunk = rb->size - rb->read_offset;
67 if (first_chunk > len) {
68 first_chunk = len;
69 }
70
71 memcpy(read_buffer, &rb->buf[rb->read_offset], first_chunk);
72
73 size_t remaining = len - first_chunk;
74 if (remaining > 0) {
76 }
77
78 rb->read_offset = (rb->read_offset + len) % rb->size;
79
80 return len;
81}
uint16_t foo
Definition main_demo5.c:58
size_t ring_buffer_free_space(ring_buffer_t *ring_buffer)
Definition ring_buffer.c:29
size_t ring_buffer_write(ring_buffer_t *rb, uint8_t *data, size_t len)
Write.
Definition ring_buffer.c:33
size_t ring_buffer_read(ring_buffer_t *rb, uint8_t *read_buffer, size_t len)
Read.
Definition ring_buffer.c:58
size_t ring_buffer_available(ring_buffer_t *rb)
Definition ring_buffer.c:20
void ring_buffer_init(ring_buffer_t *rb, uint8_t *buf, size_t size)
Init.
Definition ring_buffer.c:13
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.