px-fwlib 0.10.0
Cross-platform embedded library and documentation for 8/16/32-bit microcontrollers generated with Doxygen 1.9.2
px_queue.h
1#ifndef __PX_QUEUE_H__
2#define __PX_QUEUE_H__
3/* =============================================================================
4 ____ ___ ____ ___ _ _ ___ __ __ ___ __ __ TM
5 | _ \ |_ _| / ___| / _ \ | \ | | / _ \ | \/ | |_ _| \ \/ /
6 | |_) | | | | | | | | | | \| | | | | | | |\/| | | | \ /
7 | __/ | | | |___ | |_| | | |\ | | |_| | | | | | | | / \
8 |_| |___| \____| \___/ |_| \_| \___/ |_| |_| |___| /_/\_\
9
10 Copyright (c) 2019 Pieter Conradie <https://piconomix.com>
11
12 License: MIT
13 https://github.com/piconomix/px-fwlib/blob/master/LICENSE.md
14
15 Title: px_queue.h : A FIFO data queue
16 Author(s): Pieter Conradie
17 Creation Date: 2019-07-15
18
19============================================================================= */
20
21/**
22 * @ingroup UTILS
23 * @defgroup PX_QUEUE px_queue.h : A FIFO item queue
24 *
25 * A FIFO (First In First Out) queue of fixed sized items using zero based indexes.
26 *
27 * File(s):
28 * - utils/inc/px_queue.h
29 * - utils/src/px_queue.c
30 *
31 * @see https://en.wikipedia.org/wiki/Queue_(abstract_data_type)
32 *
33 * @{
34 */
35
36/* _____STANDARD INCLUDES____________________________________________________ */
37#include <stddef.h>
38
39/* _____PROJECT INCLUDES_____________________________________________________ */
40#include "px_defs.h"
41
42#ifdef __cplusplus
43extern "C" {
44#endif
45/* _____DEFINITIONS__________________________________________________________ */
46
47/* _____TYPE DEFINITIONS_____________________________________________________ */
48/// Queue index size definition
49typedef uint8_t px_queue_idx_t;
50
51/// Queue item size definition
52typedef uint8_t px_queue_item_size_t;
53
54/// Queue structure
55typedef struct
56{
57 uint8_t * buf; ///< Buffer to hold item data
58 px_queue_idx_t idx_rd; ///< Read index
59 px_queue_idx_t idx_wr; ///< Write index
60 px_queue_idx_t item_count; ///< Number of items stored in queue
61 px_queue_idx_t items_max; ///< Maximum number of items that can be stored in queue
62 px_queue_item_size_t item_size; ///< Size of each item
64
65/* _____GLOBAL VARIABLES_____________________________________________________ */
66
67/* _____GLOBAL FUNCTION DECLARATIONS_________________________________________ */
68/**
69 * Initialises a queue structure.
70 *
71 * @param queue Pointer to a queue object
72 * @param buf Buffer to hold items (must be at least item_size * items_max bytes)
73 * @param item_size Fixed size of each item
74 * @param items_max Maximum number of items that can be stored in array
75 */
76void px_queue_init(px_queue_t * queue,
77 void * buf,
78 px_queue_idx_t items_max,
79 px_queue_item_size_t item_size);
80
81/**
82 * See if the queue is empty.
83 *
84 * @param queue Pointer to a queue object
85 *
86 * @return true Queue is empty
87 * @return false Queue contains one or more items
88 */
89bool px_queue_is_empty(px_queue_t * queue);
90
91/**
92 * See if the queue is full.
93 *
94 * @param queue Pointer to a queue object
95 *
96 * @retval true The queue is full
97 * @retval false The queue has one or more empty slots
98 */
99bool px_queue_is_full(px_queue_t * queue);
100
101/**
102 * Get the number of items in the queue.
103 *
104 * @param queue Pointer to a queue object
105 *
106 * @returns px_queue_idx_t The number of items in the queue
107 */
109
110/**
111 * Write a new item to the queue.
112 *
113 * The item data is copied into the array.
114 *
115 * @param queue Pointer to a queue object.
116 * @param item_data Pointer to item data.
117 *
118 * @retval true Item added to the queue
119 * @retval false Queue is full and item was not added
120 */
121bool px_queue_wr(px_queue_t * queue, const void * item_data);
122
123/**
124 * Read the oldest item from the queue.
125 *
126 * The item data is copied into the specified buffer
127 *
128 * @param queue Pointer to a queue object.
129 * @param item_data Pointer to item data buffer.
130 *
131 * @retval true Item copied and removed from queue
132 * @retval false Queue is empty
133 */
134bool px_queue_rd(px_queue_t * queue, void * item_data);
135
136/**
137 * Remove oldest item from queue.
138 *
139 * @param queue Pointer to a queue object.
140 *
141 * @retval true Oldest item removed
142 * @retval false Queue is empty
143 */
145
146/**
147 * Remove all items from queue.
148 *
149 * @param queue Pointer to queue object.
150 */
151void px_queue_flush(px_queue_t * queue);
152
153/* _____MACROS_______________________________________________________________ */
154
155#ifdef __cplusplus
156}
157#endif
158
159/// @}
160#endif
px_queue_idx_t item_count
Number of items stored in queue.
Definition: px_queue.h:60
px_queue_item_size_t item_size
Size of each item.
Definition: px_queue.h:62
uint8_t * buf
Buffer to hold item data.
Definition: px_queue.h:57
px_queue_idx_t idx_wr
Write index.
Definition: px_queue.h:59
px_queue_idx_t items_max
Maximum number of items that can be stored in queue.
Definition: px_queue.h:61
px_queue_idx_t idx_rd
Read index.
Definition: px_queue.h:58
uint8_t px_queue_idx_t
Queue index size definition.
Definition: px_queue.h:49
bool px_queue_wr(px_queue_t *queue, const void *item_data)
Write a new item to the queue.
Definition: px_queue.c:105
bool px_queue_is_full(px_queue_t *queue)
See if the queue is full.
Definition: px_queue.c:83
bool px_queue_rd(px_queue_t *queue, void *item_data)
Read the oldest item from the queue.
Definition: px_queue.c:125
uint8_t px_queue_item_size_t
Queue item size definition.
Definition: px_queue.h:52
void px_queue_flush(px_queue_t *queue)
Remove all items from queue.
Definition: px_queue.c:162
px_queue_idx_t px_queue_get_item_count(px_queue_t *queue)
Get the number of items in the queue.
Definition: px_queue.c:97
bool px_queue_discard_oldest(px_queue_t *queue)
Remove oldest item from queue.
Definition: px_queue.c:145
void px_queue_init(px_queue_t *queue, void *buf, px_queue_idx_t items_max, px_queue_item_size_t item_size)
Initialises a queue structure.
Definition: px_queue.c:50
bool px_queue_is_empty(px_queue_t *queue)
See if the queue is empty.
Definition: px_queue.c:69
Queue structure.
Definition: px_queue.h:56