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
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), \
61 (item_capacity))
62
76static inline void sys_ringq_init(struct sys_ringq *ringq, uint8_t *data, size_t data_size,
77 size_t item_size)
78{
79 __ASSERT(data != NULL, "Data buffer should not be NULL");
80 __ASSERT(item_size > 0, "item_size should be greater than 0");
81
82 /* Adjust data size to be a multiple of item size */
83 data_size = (data_size / item_size) * item_size;
84 __ASSERT(data_size > 0, "data_size should be a multiple of item_size and greater than 0");
85
86 ring_buf_init(&ringq->rb, data_size, data);
87 ringq->item_size = item_size;
88}
89
95static inline void sys_ringq_reset(struct sys_ringq *ringq)
96{
97 ring_buf_reset(&ringq->rb);
98}
99
107static inline bool sys_ringq_empty(const struct sys_ringq *ringq)
108{
109 return ring_buf_is_empty(&ringq->rb);
110}
111
119static inline bool sys_ringq_full(const struct sys_ringq *ringq)
120{
121 return ring_buf_space_get(&ringq->rb) == 0;
122}
123
131static inline size_t sys_ringq_space(const struct sys_ringq *ringq)
132{
133 return ring_buf_space_get(&ringq->rb) / ringq->item_size;
134}
135
143static inline size_t sys_ringq_capacity(const struct sys_ringq *ringq)
144{
145 return ring_buf_capacity_get(&ringq->rb) / ringq->item_size;
146}
147
155static inline size_t sys_ringq_size(const struct sys_ringq *ringq)
156{
157 return ring_buf_size_get(&ringq->rb) / ringq->item_size;
158}
159
170static inline int sys_ringq_put(struct sys_ringq *ringq, const void *element)
171{
172 return ring_buf_put(&ringq->rb, (const uint8_t *)element, ringq->item_size) == 0 ?
173 -ENOSPC : 0;
174}
175
186static inline int sys_ringq_get(struct sys_ringq *ringq, void *element)
187{
188 return ring_buf_get(&ringq->rb, (uint8_t *)element, ringq->item_size) == 0 ? -ENODATA : 0;
189}
190
199static inline int sys_ringq_peek(struct sys_ringq *ringq, void *data)
200{
201 return ring_buf_peek(&ringq->rb, (uint8_t *)data, ringq->item_size) == 0 ? -ENODATA : 0;
202}
203
207
208#ifdef __cplusplus
209}
210#endif
211
212#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:253
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:292
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:280
static void ring_buf_reset(struct ring_buf *buf)
Reset ring buffer state.
Definition ring_buffer.h:241
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:191
static bool ring_buf_is_empty(const struct ring_buf *buf)
Determine if a ring buffer is empty.
Definition ring_buffer.h:231
static bool sys_ringq_full(const struct sys_ringq *ringq)
Determine if a sys_ringq is full.
Definition ringq.h:119
static size_t sys_ringq_size(const struct sys_ringq *ringq)
Determine size of available data in a ringq queue.
Definition ringq.h:155
static int sys_ringq_put(struct sys_ringq *ringq, const void *element)
Write (copy) data to a ringq queue.
Definition ringq.h:170
static bool sys_ringq_empty(const struct sys_ringq *ringq)
Determine if a sys_ringq is empty.
Definition ringq.h:107
static int sys_ringq_get(struct sys_ringq *ringq, void *element)
Read data from a sys_ringq queue.
Definition ringq.h:186
static size_t sys_ringq_capacity(const struct sys_ringq *ringq)
Return ringq queue capacity.
Definition ringq.h:143
static size_t sys_ringq_space(const struct sys_ringq *ringq)
Determine free space in a ringq queue.
Definition ringq.h:131
static void sys_ringq_reset(struct sys_ringq *ringq)
Reset ringq queue state to its initial state.
Definition ringq.h:95
static int sys_ringq_peek(struct sys_ringq *ringq, void *data)
Peek first element from a sys_ringq queue.
Definition ringq.h:199
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:76
#define ENODATA
Missing expected message data.
Definition errno.h:78
#define ENOSPC
No space left on device.
Definition errno.h:67
#define NULL
Definition iar_missing_defs.h:20
Header file for the ring buffer API.
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
A structure to represent a ring buffer.
Definition ring_buffer.h:67
An opaque structure representing a ringq queue.
Definition ringq.h:32