Zephyr API Documentation 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
12
13#ifndef ZEPHYR_INCLUDE_SYS_RINGQ_H_
14#define ZEPHYR_INCLUDE_SYS_RINGQ_H_
15
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
28
32struct sys_ringq {
34 struct ring_buf rb;
35 ring_buf_idx_t item_size;
37};
38
40
41#define SYS_RINGQ_INIT(buf, item_sz, item_capacity) \
42{ \
43 .rb = RING_BUF_INIT(buf, item_sz * item_capacity), \
44 .item_size = item_sz, \
45}
46
48
58#define SYS_RINGQ_DEFINE(name, item_size, item_capacity) \
59 static uint8_t __noinit CONCAT(_ringq_data_, name)[item_size * item_capacity]; \
60 struct sys_ringq name = SYS_RINGQ_INIT(CONCAT(_ringq_data_, name), item_size, item_capacity)
61
75static inline void sys_ringq_init(struct sys_ringq *ringq, uint8_t *data, size_t data_size,
76 size_t item_size)
77{
78 __ASSERT(data != NULL, "Data buffer should not be NULL");
79 __ASSERT(item_size > 0, "item_size should be greater than 0");
80
81 /* Adjust data size to be a multiple of item size */
82 data_size = (data_size / item_size) * item_size;
83 __ASSERT(data_size > 0, "data_size should be a multiple of item_size and greater than 0");
84
85 ring_buf_init(&ringq->rb, data_size, data);
86 ringq->item_size = item_size;
87}
88
94static inline void sys_ringq_reset(struct sys_ringq *ringq)
95{
96 ring_buf_reset(&ringq->rb);
97}
98
106static inline bool sys_ringq_empty(const struct sys_ringq *ringq)
107{
108 return ring_buf_is_empty(&ringq->rb);
109}
110
118static inline bool sys_ringq_full(const struct sys_ringq *ringq)
119{
120 return ring_buf_space_get(&ringq->rb) == 0;
121}
122
130static inline size_t sys_ringq_space(const struct sys_ringq *ringq)
131{
132 return ring_buf_space_get(&ringq->rb) / ringq->item_size;
133}
134
142static inline size_t sys_ringq_capacity(const struct sys_ringq *ringq)
143{
144 return ring_buf_capacity_get(&ringq->rb) / ringq->item_size;
145}
146
154static inline size_t sys_ringq_size(const struct sys_ringq *ringq)
155{
156 return ring_buf_size_get(&ringq->rb) / ringq->item_size;
157}
158
169static inline int sys_ringq_put(struct sys_ringq *ringq, const void *element)
170{
171 return ring_buf_put(&ringq->rb, (const uint8_t *)element, ringq->item_size) == 0 ?
172 -ENOSPC : 0;
173}
174
185static inline int sys_ringq_get(struct sys_ringq *ringq, void *element)
186{
187 return ring_buf_get(&ringq->rb, (uint8_t *)element, ringq->item_size) == 0 ? -ENODATA : 0;
188}
189
198static inline int sys_ringq_peek(struct sys_ringq *ringq, void *data)
199{
200 return ring_buf_peek(&ringq->rb, (uint8_t *)data, ringq->item_size) == 0 ? -ENODATA : 0;
201}
202
206
207#ifdef __cplusplus
208}
209#endif
210
211#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:248
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:287
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:275
static void ring_buf_reset(struct ring_buf *buf)
Reset ring buffer state.
Definition ring_buffer.h:236
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:186
static bool ring_buf_is_empty(const struct ring_buf *buf)
Determine if a ring buffer is empty.
Definition ring_buffer.h:226
static bool sys_ringq_full(const struct sys_ringq *ringq)
Determine if a sys_ringq is full.
Definition ringq.h:118
static size_t sys_ringq_size(const struct sys_ringq *ringq)
Determine size of available data in a ringq queue.
Definition ringq.h:154
static int sys_ringq_put(struct sys_ringq *ringq, const void *element)
Write (copy) data to a ringq queue.
Definition ringq.h:169
static bool sys_ringq_empty(const struct sys_ringq *ringq)
Determine if a sys_ringq is empty.
Definition ringq.h:106
static int sys_ringq_get(struct sys_ringq *ringq, void *element)
Read data from a sys_ringq queue.
Definition ringq.h:185
static size_t sys_ringq_capacity(const struct sys_ringq *ringq)
Return ringq queue capacity.
Definition ringq.h:142
static size_t sys_ringq_space(const struct sys_ringq *ringq)
Determine free space in a ringq queue.
Definition ringq.h:130
static void sys_ringq_reset(struct sys_ringq *ringq)
Reset ringq queue state to its initial state.
Definition ringq.h:94
static int sys_ringq_peek(struct sys_ringq *ringq, void *data)
Peek first element from a sys_ringq queue.
Definition ringq.h:198
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:75
#define ENODATA
Missing expected message data.
Definition errno.h:77
#define ENOSPC
No space left on device.
Definition errno.h:66
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
A structure to represent a ring buffer.
Definition ring_buffer.h:62
An opaque structure representing a ringq queue.
Definition ringq.h:32