tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
queue.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2
3#ifndef TETL_FREERTOS_QUEUE_HPP
4#define TETL_FREERTOS_QUEUE_HPP
5
6#include <etl/version.hpp>
7
8#include <etl/cstdint.hpp>
9#include <etl/utility.hpp>
10
11#if defined(TETL_FREERTOS_USE_STUBS)
13#endif
14
16
23template <typename T, etl::uint32_t Size>
24struct queue {
25 using value_type = T;
27
32 queue();
33
38 ~queue();
39
40 queue(queue const&) = delete;
41 auto operator=(queue const&) -> queue& = delete;
42
43 queue(queue&&) = delete;
44 auto operator=(queue&&) -> queue& = delete;
45
47 [[nodiscard]] auto capacity() const -> size_type;
48
50 [[nodiscard]] auto send(T const& data, TickType_t ticksToWait = 0) const -> bool;
51
53 auto receive(T& data, TickType_t ticksToWait = 0) const -> bool;
54
56 [[nodiscard]] auto receive(TickType_t ticksToWait = 0) const -> pair<bool, T>;
57
58 [[nodiscard]] auto reset() const -> bool;
59 [[nodiscard]] auto messages_waiting() const -> etl::uint32_t;
60
61private:
62 QueueHandle_t _handle = nullptr;
63};
64
65template <typename T, etl::uint32_t Size>
66inline queue<T, Size>::queue()
67 : _handle{[]() { return xQueueCreate(Size, sizeof(T)); }()}
68{
69}
70
71template <typename T, etl::uint32_t Size>
73{
74 if (_handle != nullptr) {
75 vQueueDelete(_handle);
76 }
77}
78
79template <typename T, etl::uint32_t Size>
80inline auto queue<T, Size>::capacity() const -> size_type
81{
82 return Size;
83}
84
85template <typename T, etl::uint32_t Size>
86inline auto queue<T, Size>::send(T const& data, TickType_t ticksToWait) const -> bool
87{
88 auto const* const rawData = static_cast<void const*>(&data);
89 auto const success = xQueueSend(_handle, rawData, ticksToWait);
90 return static_cast<bool>(success);
91}
92
93template <typename T, etl::uint32_t Size>
94inline auto queue<T, Size>::receive(T& data, TickType_t ticksToWait) const -> bool
95{
96 auto* const rawData = static_cast<void*>(&data);
97 auto const success = xQueueReceive(_handle, rawData, ticksToWait);
98 return static_cast<bool>(success);
99}
100
101template <typename T, etl::uint32_t Size>
102inline auto queue<T, Size>::receive(TickType_t ticksToWait) const -> pair<bool, T>
103{
104 auto value = T{};
105 auto* const rawData = static_cast<void*>(&value);
106 auto const success = xQueueReceive(_handle, rawData, ticksToWait);
107 return {static_cast<bool>(success), value};
108}
109
110template <typename T, etl::uint32_t Size>
111inline auto queue<T, Size>::reset() const -> bool
112{
113 auto const result = xQueueReset(_handle);
114 return static_cast<bool>(result);
115}
116
117template <typename T, etl::uint32_t Size>
119{
120 auto const result = uxQueueMessagesWaiting(_handle);
121 return static_cast<etl::uint32_t>(result);
122}
123} // namespace etl::experimental::freertos
124
125#endif // TETL_FREERTOS_QUEUE_HPP
constexpr auto data(C &c) noexcept(noexcept(c.data())) -> decltype(c.data())
Returns a pointer to the block of memory containing the elements of the container.
Definition data.hpp:11
Definition queue.hpp:15
Definition adjacent_find.hpp:8
TETL_BUILTIN_UINT32 uint32_t
Unsigned integer type with width of exactly 32 bits.
Definition uint_t.hpp:17
auto send(T const &data, TickType_t ticksToWait=0) const -> bool
Push an element on to the queue.
Definition queue.hpp:86
~queue()
Delete a queue - freeing all the memory allocated for storing of items placed on the queue.
Definition queue.hpp:72
auto receive(T &data, TickType_t ticksToWait=0) const -> bool
Pop an element of the queue.
Definition queue.hpp:94
etl::uint32_t size_type
Definition queue.hpp:26
auto operator=(queue const &) -> queue &=delete
auto messages_waiting() const -> etl::uint32_t
Definition queue.hpp:118
auto capacity() const -> size_type
Returns the capacity of the internal buffer.
Definition queue.hpp:80
auto operator=(queue &&) -> queue &=delete
auto reset() const -> bool
Definition queue.hpp:111
queue()
Creates a new queue. RAM is automatically allocated from the FreeRTOS heap.
Definition queue.hpp:66
T value_type
Definition queue.hpp:25
etl::pair is a class template that provides a way to store two heterogeneous objects as a single unit...
Definition pair.hpp:36
auto vQueueDelete(QueueHandle_t xQueue) -> void
Definition stubs.hpp:71
auto xQueueReset(QueueHandle_t xQueue) -> BaseType_t
Definition stubs.hpp:85
etl::uint32_t TickType_t
Definition stubs.hpp:24
auto xQueueCreate(UBaseType_t uxQueueLength, UBaseType_t uxItemSize) -> QueueHandle_t
Definition stubs.hpp:65
QueueDefinition * QueueHandle_t
Definition stubs.hpp:63
auto xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait) -> BaseType_t
Definition stubs.hpp:79
auto uxQueueMessagesWaiting(QueueHandle_t xQueue) -> UBaseType_t
Definition stubs.hpp:91
auto xQueueSend(QueueHandle_t xQueue, void const *pvItemToQueue, TickType_t xTicksToWait) -> BaseType_t
Definition stubs.hpp:73