FreeRTOS-Cpp
Loading...
Searching...
No Matches
StreamBuffer.hpp
1/*
2 * FreeRTOS-Cpp
3 * Copyright (C) 2021 Jon Enz. All Rights Reserved.
4 *
5 * SPDX-License-Identifier: MIT
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 *
25 * https://github.com/jonenz/FreeRTOS-Cpp
26 */
27
28#ifndef FREERTOS_STREAMBUFFER_HPP
29#define FREERTOS_STREAMBUFFER_HPP
30
31#include "FreeRTOS.h"
32#include "stream_buffer.h"
33
34#if (configUSE_STREAM_BUFFERS == 1)
35
36namespace FreeRTOS {
37
62 public:
63 friend class StreamBuffer;
64 template <size_t>
65 friend class StaticStreamBuffer;
66
67 StreamBufferBase(const StreamBufferBase&) = delete;
68 StreamBufferBase& operator=(const StreamBufferBase&) = delete;
69
70 static void* operator new(size_t) = delete;
71 static void* operator new[](size_t) = delete;
72
73 static void* operator new(size_t, void* ptr) {
74 return ptr;
75 }
76
77 static void* operator new[](size_t, void* ptr) {
78 return ptr;
79 }
80
91 inline bool isValid() const {
92 return (handle != NULL);
93 }
94
133 inline size_t send(const void* data, const size_t length,
134 const TickType_t ticksToWait = portMAX_DELAY) const {
135 return xStreamBufferSend(handle, data, length, ticksToWait);
136 }
137
176 inline size_t sendFromISR(bool& higherPriorityTaskWoken, const void* data,
177 const size_t length) const {
178 BaseType_t taskWoken = pdFALSE;
179 const size_t result =
180 xStreamBufferSendFromISR(handle, data, length, &taskWoken);
181 if (taskWoken == pdTRUE) {
182 higherPriorityTaskWoken = true;
183 }
184 return result;
185 }
186
198 inline size_t sendFromISR(const void* data, const size_t length) const {
199 return xStreamBufferSendFromISR(handle, data, length, NULL);
200 }
201
239 inline size_t receive(void* buffer, const size_t bufferLength,
240 const TickType_t ticksToWait = portMAX_DELAY) const {
241 return xStreamBufferReceive(handle, buffer, bufferLength, ticksToWait);
242 }
243
284 inline size_t receiveFromISR(bool& higherPriorityTaskWoken, void* buffer,
285 const size_t bufferLength) const {
286 BaseType_t taskWoken = pdFALSE;
287 const size_t result =
288 xStreamBufferReceiveFromISR(handle, buffer, bufferLength, &taskWoken);
289 if (taskWoken == pdTRUE) {
290 higherPriorityTaskWoken = true;
291 }
292 return result;
293 }
294
306 inline size_t receiveFromISR(void* buffer, const size_t bufferLength) const {
307 return xStreamBufferReceiveFromISR(handle, buffer, bufferLength, NULL);
308 }
309
325 inline size_t bytesAvailable() const {
326 return xStreamBufferBytesAvailable(handle);
327 }
328
344 inline size_t spacesAvailable() const {
345 return xStreamBufferSpacesAvailable(handle);
346 }
347
375 inline bool setTriggerLevel(const size_t triggerLevel = 0) const {
376 return (xStreamBufferSetTriggerLevel(handle, triggerLevel) == pdTRUE);
377 }
378
396 inline bool reset() const {
397 return (xStreamBufferReset(handle) == pdPASS);
398 }
399
414 inline bool isEmpty() const {
415 return (xStreamBufferIsEmpty(handle) == pdTRUE);
416 }
417
432 inline bool isFull() const {
433 return (xStreamBufferIsFull(handle) == pdTRUE);
434 }
435
436 private:
437 StreamBufferBase() = default;
438
450 vStreamBufferDelete(this->handle);
451 }
452
453 StreamBufferBase(StreamBufferBase&&) noexcept = default;
454 StreamBufferBase& operator=(StreamBufferBase&&) noexcept = default;
455
456 StreamBufferHandle_t handle = NULL;
457};
458
459#if (configSUPPORT_DYNAMIC_ALLOCATION == 1)
460
471 public:
504 explicit StreamBuffer(const size_t size, const size_t triggerLevel = 0) {
505 this->handle = xStreamBufferCreate(size, triggerLevel);
506 }
507 ~StreamBuffer() = default;
508
509 StreamBuffer(const StreamBuffer&) = delete;
510 StreamBuffer& operator=(const StreamBuffer&) = delete;
511
512 StreamBuffer(StreamBuffer&&) noexcept = default;
513 StreamBuffer& operator=(StreamBuffer&&) noexcept = default;
514};
515
516#endif /* configSUPPORT_DYNAMIC_ALLOCATION */
517
518#if (configSUPPORT_STATIC_ALLOCATION == 1)
519
531template <size_t N>
533 public:
562 explicit StaticStreamBuffer(const size_t triggerLevel = 0) {
563 this->handle = xStreamBufferCreateStatic(sizeof(storage), triggerLevel,
564 storage, &staticStreamBuffer);
565 }
566 ~StaticStreamBuffer() = default;
567
568 StaticStreamBuffer(const StaticStreamBuffer&) = delete;
569 StaticStreamBuffer& operator=(const StaticStreamBuffer&) = delete;
570
571 StaticStreamBuffer(StaticStreamBuffer&&) noexcept = default;
572 StaticStreamBuffer& operator=(StaticStreamBuffer&&) noexcept = default;
573
574 private:
575 StaticStreamBuffer_t staticStreamBuffer;
576 uint8_t storage[N];
577};
578
579#endif /* configSUPPORT_STATIC_ALLOCATION */
580
581} // namespace FreeRTOS
582
583#endif /* configUSE_STREAM_BUFFERS */
584
585#endif // FREERTOS_STREAMBUFFER_HPP
Class that encapsulates the functionality of a FreeRTOS stream buffer.
Definition StreamBuffer.hpp:532
StaticStreamBuffer(const size_t triggerLevel=0)
Construct a new StaticStreamBuffer object by calling StreamBufferHandle_t xStreamBufferCreateStatic( ...
Definition StreamBuffer.hpp:562
Base class that provides the standard stream buffer interface to FreeRTOS::StreamBuffer and FreeRTOS:...
Definition StreamBuffer.hpp:61
bool isEmpty() const
Function that calls BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer )
Definition StreamBuffer.hpp:414
size_t sendFromISR(bool &higherPriorityTaskWoken, const void *data, const size_t length) const
Function that calls size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,...
Definition StreamBuffer.hpp:176
~StreamBufferBase()
Destroy the StreamBufferBase object by calling void vStreamBufferDelete( StreamBufferHandle_t xStream...
Definition StreamBuffer.hpp:449
bool reset() const
Function that calls BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer )
Definition StreamBuffer.hpp:396
size_t spacesAvailable() const
Function that calls size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer )
Definition StreamBuffer.hpp:344
bool isValid() const
Function that checks if the underlying stream buffer handle is not NULL. This should be used to ensur...
Definition StreamBuffer.hpp:91
size_t bytesAvailable() const
Function that calls size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer )
Definition StreamBuffer.hpp:325
size_t sendFromISR(const void *data, const size_t length) const
Function that calls size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,...
Definition StreamBuffer.hpp:198
size_t receiveFromISR(void *buffer, const size_t bufferLength) const
Function that calls size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,...
Definition StreamBuffer.hpp:306
bool isFull() const
Function that calls BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer )
Definition StreamBuffer.hpp:432
size_t send(const void *data, const size_t length, const TickType_t ticksToWait=portMAX_DELAY) const
Function that calls size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, const void *pvTxDat...
Definition StreamBuffer.hpp:133
size_t receive(void *buffer, const size_t bufferLength, const TickType_t ticksToWait=portMAX_DELAY) const
Function that calls size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,...
Definition StreamBuffer.hpp:239
bool setTriggerLevel(const size_t triggerLevel=0) const
Function that calls BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,...
Definition StreamBuffer.hpp:375
size_t receiveFromISR(bool &higherPriorityTaskWoken, void *buffer, const size_t bufferLength) const
Function that calls size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,...
Definition StreamBuffer.hpp:284
Class that encapsulates the functionality of a FreeRTOS stream buffer.
Definition StreamBuffer.hpp:470
StreamBuffer(const size_t size, const size_t triggerLevel=0)
Construct a new StreamBuffer object by calling StreamBufferHandle_t xStreamBufferCreate( size_t xBuff...
Definition StreamBuffer.hpp:504