halx
読み取り中…
検索中…
一致する文字列を見つけられません
common.hpp
[詳解]
1#pragma once
2
3#include <array>
4#include <cstdint>
5#include <functional>
6#include <optional>
7
8#include "halx/core.hpp"
9
10namespace halx::peripheral {
11
12struct CanFilter {
13 uint32_t id;
14 uint32_t mask;
15 bool ide;
16};
17
18struct CanMessage {
19 uint32_t id;
20 bool ide;
21 uint8_t dlc;
22 alignas(alignof(uintptr_t)) std::array<uint8_t, 8> data;
23};
24
81class CanBase {
82public:
83 virtual ~CanBase() {}
84 virtual bool start() = 0;
85 virtual bool stop() = 0;
86 virtual bool transmit(const CanMessage &msg, uint32_t timeout) = 0;
87 virtual std::optional<size_t>
89 void (*callback)(const CanMessage &msg, void *context),
90 void *context) = 0;
91 virtual bool detach_rx_filter(size_t filter_index) = 0;
92
93 std::optional<size_t>
95 std::function<void(const CanMessage &)> &&callback) {
96 callback_ = std::move(callback);
97 return attach_rx_filter(
98 filter,
99 [](const CanMessage &msg, void *context) {
100 auto callback =
101 reinterpret_cast<std::function<void(const CanMessage &)> *>(
102 context);
103 (*callback)(msg);
104 },
105 &callback_);
106 }
107
108 template <class Queue>
109 std::optional<size_t> attach_rx_queue(const CanFilter &filter, Queue &queue) {
110 return attach_rx_filter(
111 filter,
112 [](const CanMessage &msg, void *context) {
113 auto *queue = reinterpret_cast<Queue *>(context);
114 queue->push(msg);
115 },
116 &queue);
117 }
118
119private:
120 std::function<void(const CanMessage &)> callback_;
121};
122
123} // namespace halx::peripheral
Definition common.hpp:81
virtual bool stop()=0
virtual ~CanBase()
Definition common.hpp:83
virtual bool start()=0
std::optional< size_t > attach_rx_filter(const CanFilter &filter, std::function< void(const CanMessage &)> &&callback)
Definition common.hpp:94
std::optional< size_t > attach_rx_queue(const CanFilter &filter, Queue &queue)
Definition common.hpp:109
virtual std::optional< size_t > attach_rx_filter(const CanFilter &filter, void(*callback)(const CanMessage &msg, void *context), void *context)=0
virtual bool detach_rx_filter(size_t filter_index)=0
virtual bool transmit(const CanMessage &msg, uint32_t timeout)=0
Definition can.hpp:13
Definition common.hpp:12
uint32_t id
Definition common.hpp:13
bool ide
Definition common.hpp:15
uint32_t mask
Definition common.hpp:14
Definition common.hpp:18
uint8_t dlc
Definition common.hpp:21
std::array< uint8_t, 8 > data
Definition common.hpp:22
uint32_t id
Definition common.hpp:19
bool ide
Definition common.hpp:20