Zephyr Project API 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
ringq.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2025 Måns Ansgariusson <mansgariusson@gmail.com>
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_SYS_RINGQ_H_
8#define ZEPHYR_INCLUDE_SYS_RINGQ_H_
9
11
12#ifdef __cplusplus
13extern "C" {
14#endif
15
23
27struct sys_ringq {
29 struct ring_buf rb;
30 ring_buf_idx_t item_size;
32};
33
35
36#define SYS_RINGQ_INIT(buf, item_sz, item_capacity) \
37{ \
38 .rb = RING_BUF_INIT(buf, item_sz * item_capacity), \
39 .item_size = item_sz, \
40}
41
43
53#define SYS_RINGQ_DEFINE(name, item_size, item_capacity) \
54 static uint8_t __noinit CONCAT(_ringq_data_, name)[item_size * item_capacity]; \
55 struct sys_ringq name = SYS_RINGQ_INIT(CONCAT(_ringq_data_, name), item_size, item_capacity)
56
70static inline void sys_ringq_init(struct sys_ringq *ringq, uint8_t *data, size_t data_size,
71 size_t item_size)
72{
73 __ASSERT(data != NULL, "Data buffer should not be NULL");
74 __ASSERT(item_size > 0, "item_size should be greater than 0");
75
76 /* Adjust data size to be a multiple of item size */
77 data_size = (data_size / item_size) * item_size;
78 __ASSERT(data_size > 0, "data_size should be a multiple of item_size and greater than 0");
79
80 ring_buf_init(&ringq->rb, data_size, data);
81 ringq->item_size = item_size;
82}
83
89static inline void sys_ringq_reset(struct sys_ringq *ringq)
90{
91 ring_buf_reset(&ringq->rb);
92}
93
101static inline bool sys_ringq_empty(const struct sys_ringq *ringq)
102{
103 return ring_buf_is_empty(&ringq->rb);
104}
105
113static inline bool sys_ringq_full(const struct sys_ringq *ringq)
114{
115 return ring_buf_space_get(&ringq->rb) == 0;
116}
117
125static inline size_t sys_ringq_space(const struct sys_ringq *ringq)
126{
127 return ring_buf_space_get(&ringq->rb) / ringq->item_size;
128}
129
137static inline size_t sys_ringq_capacity(const struct sys_ringq *ringq)
138{
139 return ring_buf_capacity_get(&ringq->rb) / ringq->item_size;
140}
141
149static inline size_t sys_ringq_size(const struct sys_ringq *ringq)
150{
151 return ring_buf_size_get(&ringq->rb) / ringq->item_size;
152}
153
164static inline int sys_ringq_put(struct sys_ringq *ringq, const void *element)
165{
166 return ring_buf_put(&ringq->rb, (const uint8_t *)element, ringq->item_size) == 0 ?
167 -ENOSPC : 0;
168}
169
180static inline int sys_ringq_get(struct sys_ringq *ringq, void *element)
181{
182 return ring_buf_get(&ringq->rb, (uint8_t *)element, ringq->item_size) == 0 ? -ENODATA : 0;
183}
184
193static inline int sys_ringq_peek(struct sys_ringq *ringq, void *data)
194{
195 return ring_buf_peek(&ringq->rb, (uint8_t *)data, ringq->item_size) == 0 ? -ENODATA : 0;
196}
197
201
202#ifdef __cplusplus
203}
204#endif
205
206#endif /* ZEPHYR_INCLUDE_SYS_RINGQ_H_ */
uint32_t ring_buf_get(struct ring_buf *buf, uint8_t *data, uint32_t size)
Read data from a ring buffer.
static uint32_t ring_buf_space_get(const struct ring_buf *buf)
Determine free space in a ring buffer.
Definition ring_buffer.h:236
static uint32_t ring_buf_size_get(const struct ring_buf *buf)
Determine size of available data in a ring buffer.
Definition ring_buffer.h:275
uint32_t ring_buf_put(struct ring_buf *buf, const uint8_t *data, uint32_t size)
Write (copy) data to a ring buffer.
uint32_t ring_buf_peek(struct ring_buf *buf, uint8_t *data, uint32_t size)
Peek at data from a ring buffer.
static uint32_t ring_buf_capacity_get(const struct ring_buf *buf)
Return ring buffer capacity.
Definition ring_buffer.h:263
static void ring_buf_reset(struct ring_buf *buf)
Reset ring buffer state.
Definition ring_buffer.h:224
static void ring_buf_init(struct ring_buf *buf, uint32_t size, uint8_t *data)
Initialize a ring buffer for byte data.
Definition ring_buffer.h:174
static bool ring_buf_is_empty(const struct ring_buf *buf)
Determine if a ring buffer is empty.
Definition ring_buffer.h:214
static bool sys_ringq_full(const struct sys_ringq *ringq)
Determine if a sys_ringq is full.
Definition ringq.h:113
static size_t sys_ringq_size(const struct sys_ringq *ringq)
Determine size of available data in a ringq queue.
Definition ringq.h:149
static int sys_ringq_put(struct sys_ringq *ringq, const void *element)
Write (copy) data to a ringq queue.
Definition ringq.h:164
static bool sys_ringq_empty(const struct sys_ringq *ringq)
Determine if a sys_ringq is empty.
Definition ringq.h:101
static int sys_ringq_get(struct sys_ringq *ringq, void *element)
Read data from a sys_ringq queue.
Definition ringq.h:180
static size_t sys_ringq_capacity(const struct sys_ringq *ringq)
Return ringq queue capacity.
Definition ringq.h:137
static size_t sys_ringq_space(const struct sys_ringq *ringq)
Determine free space in a ringq queue.
Definition ringq.h:125
static void sys_ringq_reset(struct sys_ringq *ringq)
Reset ringq queue state to its initial state.
Definition ringq.h:89
static int sys_ringq_peek(struct sys_ringq *ringq, void *data)
Peek first element from a sys_ringq queue.
Definition ringq.h:193
static void sys_ringq_init(struct sys_ringq *ringq, uint8_t *data, size_t data_size, size_t item_size)
Initialize a ringq queue.
Definition ringq.h:70
#define ENODATA
Missing expected message data.
Definition errno.h:77
#define ENOSPC
No space left on device.
Definition errno.h:66
#define NULL
Definition iar_missing_defs.h:20
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
A structure to represent a ring buffer.
Definition ring_buffer.h:50
A structure to represent a ringq queue.
Definition ringq.h:27