halx
読み取り中…
検索中…
一致する文字列を見つけられません
queue.hpp
[詳解]
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <memory>
6#include <optional>
7#include <type_traits>
8
9#include <cmsis_os2.h>
10
11namespace halx::rtos {
12
13template <class T> class Queue {
14private:
15 struct Deleter {
16 void operator()(osMessageQueueId_t queue_id) {
17 osMessageQueueDelete(queue_id);
18 }
19 };
20
21 using QueueId =
22 std::unique_ptr<std::remove_pointer_t<osMessageQueueId_t>, Deleter>;
23
24public:
25 Queue(size_t capacity, uint32_t attr_bits = 0) {
26 osMessageQueueAttr_t attr{};
27 attr.attr_bits = attr_bits;
28 queue_id_ = QueueId{osMessageQueueNew(capacity, sizeof(T), &attr)};
29 }
30
31 bool push(const T &value, uint32_t timeout = 0) {
32 return osMessageQueuePut(queue_id_.get(), &value, 0, timeout) == osOK;
33 }
34
35 std::optional<T> pop(uint32_t timeout = 0) {
36 T value;
37 if (osMessageQueueGet(queue_id_.get(), &value, nullptr, timeout) != osOK) {
38 return std::nullopt;
39 }
40 return value;
41 }
42
43 void clear() { osMessageQueueReset(queue_id_.get()); }
44
45 size_t size() const { return osMessageQueueGetCount(queue_id_.get()); }
46
47 size_t capacity() const { return osMessageQueueGetCapacity(queue_id_.get()); }
48
49private:
50 QueueId queue_id_;
51};
52
53} // namespace halx::rtos
void clear()
Definition queue.hpp:43
size_t size() const
Definition queue.hpp:45
std::optional< T > pop(uint32_t timeout=0)
Definition queue.hpp:35
size_t capacity() const
Definition queue.hpp:47
bool push(const T &value, uint32_t timeout=0)
Definition queue.hpp:31
Queue(size_t capacity, uint32_t attr_bits=0)
Definition queue.hpp:25
Definition mutex.hpp:9