| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | // Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | #ifndef FREERTOS_RINGBUF_H
 | 
					
						
							|  |  |  | #define FREERTOS_RINGBUF_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-23 23:26:53 +01:00
										 |  |  | #ifndef INC_FREERTOS_H
 | 
					
						
							|  |  |  | 	#error "include FreeRTOS.h" must appear in source files before "include ringbuf.h"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <freertos/queue.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * Type by which ring buffers are referenced. For example, a call to xRingbufferCreate() | 
					
						
							|  |  |  |  * returns a RingbufHandle_t variable that can then be used as a parameter to | 
					
						
							|  |  |  |  * xRingbufferSend(), xRingbufferReceive(), etc. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | typedef void * RingbufHandle_t; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-13 17:23:44 +02:00
										 |  |  | typedef enum { | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * No-split buffers will only store an item in contiguous memory and will | 
					
						
							|  |  |  | 	 * never split an item. Each item requires an 8 byte overhead for a header | 
					
						
							|  |  |  | 	 * and will always internally occupy a 32-bit aligned size of space. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2016-11-13 17:23:44 +02:00
										 |  |  | 	RINGBUF_TYPE_NOSPLIT = 0, | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Allow-split buffers will split an item into two parts if necessary in | 
					
						
							|  |  |  | 	 * order to store it. Each item requires an 8 byte overhead for a header, | 
					
						
							|  |  |  | 	 * splitting incurs an extra header. Each item will always internally occupy | 
					
						
							|  |  |  | 	 * a 32-bit aligned size of space. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2016-11-13 17:23:44 +02:00
										 |  |  | 	RINGBUF_TYPE_ALLOWSPLIT, | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Byte buffers store data as a sequence of bytes and do not maintain separate | 
					
						
							|  |  |  | 	 * items, therefore byte buffers have no overhead. All data is stored as a | 
					
						
							|  |  |  | 	 * sequence of byte and any number of bytes can be sent or retrieved each | 
					
						
							|  |  |  | 	 * time. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2016-11-13 17:23:44 +02:00
										 |  |  | 	RINGBUF_TYPE_BYTEBUF | 
					
						
							|  |  |  | } ringbuf_type_t; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief       Create a ring buffer | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param[in]   xBufferSize Size of the buffer in bytes. Note that items require | 
					
						
							|  |  |  |  *              space for overhead in no-split/allow-split buffers | 
					
						
							|  |  |  |  * @param[in]   xBufferType Type of ring buffer, see documentation. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @note    xBufferSize of no-split/allow-split buffers will be rounded up to the nearest 32-bit aligned size. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @return  A handle to the created ring buffer, or NULL in case of error. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | RingbufHandle_t xRingbufferCreate(size_t xBufferSize, ringbuf_type_t xBufferType); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief Create a ring buffer of type RINGBUF_TYPE_NOSPLIT for a fixed item_size | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This API is similar to xRingbufferCreate(), but it will internally allocate | 
					
						
							|  |  |  |  * additional space for the headers. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param[in]   xItemSize   Size of each item to be put into the ring buffer | 
					
						
							|  |  |  |  * @param[in]   xItemNum    Maximum number of items the buffer needs to hold simultaneously | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @return  A RingbufHandle_t handle to the created ring buffer, or NULL in case of error. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | RingbufHandle_t xRingbufferCreateNoSplit(size_t xItemSize, size_t xItemNum); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief       Insert an item into the ring buffer | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * Attempt to insert an item into the ring buffer. This function will block until | 
					
						
							|  |  |  |  * enough free space is available or until it timesout. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param[in]   xRingbuffer     Ring buffer to insert the item into | 
					
						
							|  |  |  |  * @param[in]   pvItem          Pointer to data to insert. NULL is allowed if xItemSize is 0. | 
					
						
							|  |  |  |  * @param[in]   xItemSize       Size of data to insert. | 
					
						
							|  |  |  |  * @param[in]   xTicksToWait    Ticks to wait for room in the ring buffer. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @note    For no-split/allow-split ring buffers, the actual size of memory that | 
					
						
							|  |  |  |  *          the item will occupy will be rounded up to the nearest 32-bit aligned | 
					
						
							|  |  |  |  *          size. This is done to ensure all items are always stored in 32-bit | 
					
						
							|  |  |  |  *          aligned fashion. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @return | 
					
						
							|  |  |  |  *      - pdTRUE if succeeded | 
					
						
							|  |  |  |  *      - pdFALSE on time-out or when the data is larger than the maximum permissible size of the buffer | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | BaseType_t xRingbufferSend(RingbufHandle_t xRingbuffer, const void *pvItem, size_t xItemSize, TickType_t xTicksToWait); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief       Insert an item into the ring buffer in an ISR | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * Attempt to insert an item into the ring buffer from an ISR. This function | 
					
						
							|  |  |  |  * will return immediately if there is insufficient free space in the buffer. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param[in]   xRingbuffer Ring buffer to insert the item into | 
					
						
							|  |  |  |  * @param[in]   pvItem      Pointer to data to insert. NULL is allowed if xItemSize is 0. | 
					
						
							|  |  |  |  * @param[in]   xItemSize   Size of data to insert. | 
					
						
							|  |  |  |  * @param[out]  pxHigherPriorityTaskWoken   Value pointed to will be set to pdTRUE if the function woke up a higher priority task. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @note    For no-split/allow-split ring buffers, the actual size of memory that | 
					
						
							|  |  |  |  *          the item will occupy will be rounded up to the nearest 32-bit aligned | 
					
						
							|  |  |  |  *          size. This is done to ensure all items are always stored in 32-bit | 
					
						
							|  |  |  |  *          aligned fashion. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @return | 
					
						
							|  |  |  |  *      - pdTRUE if succeeded | 
					
						
							|  |  |  |  *      - pdFALSE when the ring buffer does not have space. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | BaseType_t xRingbufferSendFromISR(RingbufHandle_t xRingbuffer, const void *pvItem, size_t xItemSize, BaseType_t *pxHigherPriorityTaskWoken); | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief   Retrieve an item from the ring buffer | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * Attempt to retrieve an item from the ring buffer. This function will block | 
					
						
							|  |  |  |  * until an item is available or until it timesout. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param[in]   xRingbuffer     Ring buffer to retrieve the item from | 
					
						
							|  |  |  |  * @param[out]  pxItemSize      Pointer to a variable to which the size of the retrieved item will be written. | 
					
						
							|  |  |  |  * @param[in]   xTicksToWait    Ticks to wait for items in the ring buffer. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @note    A call to vRingbufferReturnItem() is required after this to free the item retrieved. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @return | 
					
						
							|  |  |  |  *      - Pointer to the retrieved item on success; *pxItemSize filled with the length of the item. | 
					
						
							|  |  |  |  *      - NULL on timeout, *pxItemSize is untouched in that case. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | void *xRingbufferReceive(RingbufHandle_t xRingbuffer, size_t *pxItemSize, TickType_t xTicksToWait); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief   Retrieve an item from the ring buffer in an ISR | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Attempt to retrieve an item from the ring buffer. This function returns immediately | 
					
						
							|  |  |  |  * if there are no items available for retrieval | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param[in]   xRingbuffer     Ring buffer to retrieve the item from | 
					
						
							|  |  |  |  * @param[out]  pxItemSize      Pointer to a variable to which the size of the | 
					
						
							|  |  |  |  *                              retrieved item will be written. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @note    A call to vRingbufferReturnItemFromISR() is required after this to free the item retrieved. | 
					
						
							|  |  |  |  * @note    Byte buffers do not allow multiple retrievals before returning an item | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * @return | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  *      - Pointer to the retrieved item on success; *pxItemSize filled with the length of the item. | 
					
						
							|  |  |  |  *      - NULL when the ring buffer is empty, *pxItemSize is untouched in that case. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | void *xRingbufferReceiveFromISR(RingbufHandle_t xRingbuffer, size_t *pxItemSize); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief   Retrieve a split item from an allow-split ring buffer | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Attempt to retrieve a split item from an allow-split ring buffer. If the item | 
					
						
							|  |  |  |  * is not split, only a single item is retried. If the item is split, both parts | 
					
						
							|  |  |  |  * will be retrieved. This function will block until an item is available or | 
					
						
							|  |  |  |  * until it timesout. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param[in]   xRingbuffer     Ring buffer to retrieve the item from | 
					
						
							|  |  |  |  * @param[out]  ppvHeadItem     Double pointer to first part (set to NULL if no items were retrieved) | 
					
						
							|  |  |  |  * @param[out]  ppvTailItem     Double pointer to second part (set to NULL if item is not split) | 
					
						
							|  |  |  |  * @param[out]  pxHeadItemSize  Pointer to size of first part (unmodified if no items were retrieved) | 
					
						
							|  |  |  |  * @param[out]  pxTailItemSize  Pointer to size of second part (unmodified if item is not split) | 
					
						
							|  |  |  |  * @param[in]   xTicksToWait    Ticks to wait for items in the ring buffer. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @note    Call(s) to vRingbufferReturnItem() is required after this to free up the item(s) retrieved. | 
					
						
							|  |  |  |  * @note    This function should only be called on allow-split buffers | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @return | 
					
						
							|  |  |  |  *      - pdTRUE if an item (split or unsplit) was retrieved | 
					
						
							|  |  |  |  *      - pdFALSE when no item was retrieved | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | BaseType_t xRingbufferReceiveSplit(RingbufHandle_t xRingbuffer, void **ppvHeadItem, void **ppvTailItem, size_t *pxHeadItemSize, size_t *pxTailItemSize, TickType_t xTicksToWait); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief   Retrieve a split item from an allow-split ring buffer in an ISR | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * Attempt to retrieve a split item from an allow-split ring buffer. If the item | 
					
						
							|  |  |  |  * is not split, only a single item is retried. If the item is split, both parts | 
					
						
							|  |  |  |  * will be retrieved. This function returns immediately if there are no items | 
					
						
							|  |  |  |  * available for retrieval | 
					
						
							| 
									
										
										
										
											2017-11-23 23:26:53 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param[in]   xRingbuffer     Ring buffer to retrieve the item from | 
					
						
							|  |  |  |  * @param[out]  ppvHeadItem     Double pointer to first part (set to NULL if no items were retrieved) | 
					
						
							|  |  |  |  * @param[out]  ppvTailItem     Double pointer to second part (set to NULL if item is not split) | 
					
						
							|  |  |  |  * @param[out]  pxHeadItemSize  Pointer to size of first part (unmodified if no items were retrieved) | 
					
						
							|  |  |  |  * @param[out]  pxTailItemSize  Pointer to size of second part (unmodified if item is not split) | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @note    Calls to vRingbufferReturnItemFromISR() is required after this to free up the item(s) retrieved. | 
					
						
							|  |  |  |  * @note    This function should only be called on allow-split buffers | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * @return | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  *      - pdTRUE if an item (split or unsplit) was retrieved | 
					
						
							|  |  |  |  *      - pdFALSE when no item was retrieved | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | BaseType_t xRingbufferReceiveSplitFromISR(RingbufHandle_t xRingbuffer, void **ppvHeadItem, void **ppvTailItem, size_t *pxHeadItemSize, size_t *pxTailItemSize); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief   Retrieve bytes from a byte buffer, specifying the maximum amount of bytes to retrieve | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Attempt to retrieve data from a byte buffer whilst specifying a maximum number | 
					
						
							|  |  |  |  * of bytes to retrieve. This function will block until there is data available | 
					
						
							|  |  |  |  * for retrieval or until it timesout. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param[in]   xRingbuffer     Ring buffer to retrieve the item from | 
					
						
							|  |  |  |  * @param[out]  pxItemSize      Pointer to a variable to which the size of the retrieved item will be written. | 
					
						
							|  |  |  |  * @param[in]   xTicksToWait    Ticks to wait for items in the ring buffer. | 
					
						
							|  |  |  |  * @param[in]   xMaxSize        Maximum number of bytes to return. | 
					
						
							| 
									
										
										
										
											2017-11-23 23:26:53 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @note    A call to vRingbufferReturnItem() is required after this to free up the data retrieved. | 
					
						
							|  |  |  |  * @note    This function should only be called on byte buffers | 
					
						
							|  |  |  |  * @note    Byte buffers do not allow multiple retrievals before returning an item | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * @return | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  *      - Pointer to the retrieved item on success; *pxItemSize filled with | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  *        the length of the item. | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  *      - NULL on timeout, *pxItemSize is untouched in that case. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | void *xRingbufferReceiveUpTo(RingbufHandle_t xRingbuffer, size_t *pxItemSize, TickType_t xTicksToWait, size_t xMaxSize); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-13 17:23:44 +02:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief   Retrieve bytes from a byte buffer, specifying the maximum amount of | 
					
						
							|  |  |  |  *          bytes to retrieve. Call this from an ISR. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Attempt to retrieve bytes from a byte buffer whilst specifying a maximum number | 
					
						
							|  |  |  |  * of bytes to retrieve. This function will return immediately if there is no data | 
					
						
							|  |  |  |  * available for retrieval. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param[in]   xRingbuffer Ring buffer to retrieve the item from | 
					
						
							|  |  |  |  * @param[out]  pxItemSize  Pointer to a variable to which the size of the retrieved item will be written. | 
					
						
							|  |  |  |  * @param[in]   xMaxSize    Maximum number of bytes to return. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @note    A call to vRingbufferReturnItemFromISR() is required after this to free up the data received. | 
					
						
							|  |  |  |  * @note    This function should only be called on byte buffers | 
					
						
							|  |  |  |  * @note    Byte buffers do not allow multiple retrievals before returning an item | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @return | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  *      - Pointer to the retrieved item on success; *pxItemSize filled with | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  *        the length of the item. | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  *      - NULL when the ring buffer is empty, *pxItemSize is untouched in that case. | 
					
						
							| 
									
										
										
										
											2016-11-13 17:23:44 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | void *xRingbufferReceiveUpToFromISR(RingbufHandle_t xRingbuffer, size_t *pxItemSize, size_t xMaxSize); | 
					
						
							| 
									
										
										
										
											2016-11-13 17:23:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief   Return a previously-retrieved item to the ring buffer | 
					
						
							| 
									
										
										
										
											2016-11-13 17:23:44 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param[in]   xRingbuffer Ring buffer the item was retrieved from | 
					
						
							|  |  |  |  * @param[in]   pvItem      Item that was received earlier | 
					
						
							| 
									
										
										
										
											2017-11-23 23:26:53 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @note    If a split item is retrieved, both parts should be returned by calling this function twice | 
					
						
							| 
									
										
										
										
											2016-11-13 17:23:44 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | void vRingbufferReturnItem(RingbufHandle_t xRingbuffer, void *pvItem); | 
					
						
							| 
									
										
										
										
											2016-11-13 17:23:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief   Return a previously-retrieved item to the ring buffer from an ISR | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param[in]   xRingbuffer Ring buffer the item was retrieved from | 
					
						
							|  |  |  |  * @param[in]   pvItem      Item that was received earlier | 
					
						
							|  |  |  |  * @param[out]  pxHigherPriorityTaskWoken   Value pointed to will be set to pdTRUE | 
					
						
							|  |  |  |  *                                          if the function woke up a higher priority task. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @note    If a split item is retrieved, both parts should be returned by calling this function twice | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | void vRingbufferReturnItemFromISR(RingbufHandle_t xRingbuffer, void *pvItem, BaseType_t *pxHigherPriorityTaskWoken); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief   Delete a ring buffer | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param[in]   xRingbuffer     Ring buffer to delete | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | void vRingbufferDelete(RingbufHandle_t xRingbuffer); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief   Get maximum size of an item that can be placed in the ring buffer | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This function returns the maximum size an item can have if it was placed in | 
					
						
							|  |  |  |  * an empty ring buffer. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param[in]   xRingbuffer     Ring buffer to query | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @return  Maximum size, in bytes, of an item that can be placed in a ring buffer. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | size_t xRingbufferGetMaxItemSize(RingbufHandle_t xRingbuffer); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief   Get current free size available for an item/data in the buffer | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This gives the real time free space available for an item/data in the ring | 
					
						
							|  |  |  |  * buffer. This represents the maximum size an item/data can have if it was | 
					
						
							|  |  |  |  * currently sent to the ring buffer. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @warning This API is not thread safe. So, if multiple threads are accessing | 
					
						
							|  |  |  |  *          the same ring buffer, it is the application's responsibility to | 
					
						
							|  |  |  |  *          ensure atomic access to this API and the subsequent Send | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param[in]   xRingbuffer     Ring buffer to query | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @return  Current free size, in bytes, available for an entry | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | size_t xRingbufferGetCurFreeSize(RingbufHandle_t xRingbuffer); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief   Add the ring buffer's read semaphore to a queue set. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * The ring buffer's read semaphore indicates that data has been written | 
					
						
							|  |  |  |  * to the ring buffer. This function adds the ring buffer's read semaphore to | 
					
						
							|  |  |  |  * a queue set. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param[in]   xRingbuffer     Ring buffer to add to the queue set | 
					
						
							|  |  |  |  * @param[in]   xQueueSet       Queue set to add the ring buffer's read semaphore to | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @return | 
					
						
							|  |  |  |  *      - pdTRUE on success, pdFALSE otherwise | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | BaseType_t xRingbufferAddToQueueSetRead(RingbufHandle_t xRingbuffer, QueueSetHandle_t xQueueSet); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief   Check if the selected queue set member is the ring buffer's read semaphore | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * This API checks if queue set member returned from xQueueSelectFromSet() | 
					
						
							|  |  |  |  * is the read semaphore of this ring buffer. If so, this indicates the ring buffer | 
					
						
							|  |  |  |  * has items waiting to be retrieved. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param[in]   xRingbuffer     Ring buffer which should be checked | 
					
						
							|  |  |  |  * @param[in]   xMember         Member returned from xQueueSelectFromSet | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @return | 
					
						
							|  |  |  |  *      - pdTRUE when semaphore belongs to ring buffer | 
					
						
							|  |  |  |  *      - pdFALSE otherwise. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | BaseType_t xRingbufferCanRead(RingbufHandle_t xRingbuffer, QueueSetMemberHandle_t xMember); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief   Remove the ring buffer's read semaphore from a queue set. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * This specifically removes a ring buffer's read semaphore from a queue set. The | 
					
						
							|  |  |  |  * read semaphore is used to indicate when data has been written to the ring buffer | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param[in]   xRingbuffer     Ring buffer to remove from the queue set | 
					
						
							|  |  |  |  * @param[in]   xQueueSet       Queue set to remove the ring buffer's read semaphore from | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @return | 
					
						
							|  |  |  |  *      - pdTRUE on success | 
					
						
							|  |  |  |  *      - pdFALSE otherwise | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | BaseType_t xRingbufferRemoveFromQueueSetRead(RingbufHandle_t xRingbuffer, QueueSetHandle_t xQueueSet); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief   Get information about ring buffer status | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * Get information of the a ring buffer's current status such as | 
					
						
							|  |  |  |  * free/read/write pointer positions, and number of items waiting to be retrieved. | 
					
						
							|  |  |  |  * Arguments can be set to NULL if they are not required. | 
					
						
							| 
									
										
										
										
											2018-01-18 00:56:58 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param[in]   xRingbuffer     Ring buffer to remove from the queue set | 
					
						
							|  |  |  |  * @param[out]  uxFree          Pointer use to store free pointer position | 
					
						
							|  |  |  |  * @param[out]  uxRead          Pointer use to store read pointer position | 
					
						
							|  |  |  |  * @param[out]  uxWrite         Pointer use to store write pointer position | 
					
						
							|  |  |  |  * @param[out]  uxItemsWaiting  Pointer use to store number of items (bytes for byte buffer) waiting to be retrieved | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | void vRingbufferGetInfo(RingbufHandle_t xRingbuffer, UBaseType_t *uxFree, UBaseType_t *uxRead, UBaseType_t *uxWrite, UBaseType_t *uxItemsWaiting); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @brief   Debugging function to print the internal pointers in the ring buffer | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  |  * @param   xRingbuffer Ring buffer to show | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | void xRingbufferPrintInfo(RingbufHandle_t xRingbuffer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* -------------------------------- Deprecated Functions --------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @cond */    //Doxygen command to hide deprecated function from API Reference
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Deprecated as function is not thread safe and does not check if an item is | 
					
						
							|  |  |  |  * actually available for retrieval. Use xRingbufferReceiveSplit() instead for | 
					
						
							|  |  |  |  * thread safe method of retrieve a split item. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | bool xRingbufferIsNextItemWrapped(RingbufHandle_t xRingbuffer) __attribute__((deprecated)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Deprecated as queue sets are not meant to be used for writing to buffers. Adding | 
					
						
							|  |  |  |  * the ring buffer write semaphore to a queue set will break queue set usage rules, | 
					
						
							|  |  |  |  * as every read of a semaphore must be preceded by a call to xQueueSelectFromSet(). | 
					
						
							|  |  |  |  * QueueSetWrite no longer supported. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | BaseType_t xRingbufferAddToQueueSetWrite(RingbufHandle_t xRingbuffer, QueueSetHandle_t xQueueSet) __attribute__((deprecated)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Deprecated as queue sets are not meant to be used for writing to buffers. | 
					
						
							|  |  |  |  * QueueSetWrite no longer supported. | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | BaseType_t xRingbufferRemoveFromQueueSetWrite(RingbufHandle_t xRingbuffer, QueueSetHandle_t xQueueSet) __attribute__((deprecated)); | 
					
						
							|  |  |  | /** @endcond */ | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-23 23:26:53 +01:00
										 |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-11-23 23:26:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif /* FREERTOS_RINGBUF_H */
 | 
					
						
							|  |  |  | 
 |