Corium 1.1.0
High-Performance Zero-Heap C++20 MPSC Application Runtime
Loading...
Searching...
No Matches
CanAdapter.hpp
Go to the documentation of this file.
1
7#pragma once
8
9#include <array>
10#include <cstdint>
11#include <span>
12
13#include "corium/EventSink.hpp"
15
17
19struct CanFrame {
20 uint32_t id{0};
21 uint8_t dlc{0};
22 bool isExtended{false};
23 bool isRtr{false};
24 std::array<uint8_t, 8> data{};
25
26 [[nodiscard]] std::span<const uint8_t> payload() const noexcept {
27 return {data.data(), static_cast<std::size_t>(dlc > 8 ? 8 : dlc)};
28 }
29};
30
32struct CanFdFrame {
33 uint32_t id{0};
34 uint8_t len{0};
35 bool isExtended{false};
36 bool bitRateSwitch{false};
37 bool errorStateIndicator{false};
38 std::array<uint8_t, 64> data{};
39
40 [[nodiscard]] std::span<const uint8_t> payload() const noexcept {
41 return {data.data(), static_cast<std::size_t>(len > 64 ? 64 : len)};
42 }
43};
44
48template <typename EventVariant>
50public:
52 : _sink(sink)
53 {}
54
59 template <typename TargetEvent = CanFrame>
60 void postFromIsr(const CanFrame& frame, EventPriority priority = EventPriority::Normal) noexcept {
61 if constexpr (std::is_same_v<TargetEvent, CanFrame>) {
62 _sink.post(EventVariant{frame}, priority);
63 } else {
64 _sink.post(EventVariant{TargetEvent{frame}}, priority);
65 }
66 }
67
72 template <typename TargetEvent = CanFdFrame>
73 void postFromIsr(const CanFdFrame& frame, EventPriority priority = EventPriority::Normal) noexcept {
74 if constexpr (std::is_same_v<TargetEvent, CanFdFrame>) {
75 _sink.post(EventVariant{frame}, priority);
76 } else {
77 _sink.post(EventVariant{TargetEvent{frame}}, priority);
78 }
79 }
80
81private:
83};
84
85} // namespace corium::embedded
Non-allocating type-erased fat pointer handle for lock-free event posting.
Bounded and multi-tier priority MPSC queueing policies.
Non-blocking hardware ISR adapter for CAN/CAN-FD controller interrupts. Ingests hardware mailbox/FIFO...
Definition CanAdapter.hpp:49
void postFromIsr(const CanFdFrame &frame, EventPriority priority=EventPriority::Normal) noexcept
Ingest high-speed CAN-FD frame from hardware interrupt (e.g. STM32 FDCAN1_IT0_IRQHandler).
Definition CanAdapter.hpp:73
void postFromIsr(const CanFrame &frame, EventPriority priority=EventPriority::Normal) noexcept
Ingest standard CAN frame from hardware interrupt (e.g. STM32 CAN_RX_IRQHandler).
Definition CanAdapter.hpp:60
CanIsrAdapter(EventSinkT< EventVariant > sink) noexcept
Definition CanAdapter.hpp:51
Definition CanAdapter.hpp:16
EventPriority
Event priority levels for multi-priority queue policies.
Definition QueuePolicies.hpp:32
ISO 11898-1:2015 CAN-FD flexible data-rate frame structure (up to 64 bytes payload).
Definition CanAdapter.hpp:32
bool errorStateIndicator
ESI: Error State Indicator flag.
Definition CanAdapter.hpp:37
bool isExtended
True if 29-bit extended ID.
Definition CanAdapter.hpp:35
uint8_t len
Data length in bytes (0..64)
Definition CanAdapter.hpp:34
std::array< uint8_t, 64 > data
Payload bytes (up to 64B)
Definition CanAdapter.hpp:38
bool bitRateSwitch
BRS: Bit Rate Switch flag.
Definition CanAdapter.hpp:36
std::span< const uint8_t > payload() const noexcept
Definition CanAdapter.hpp:40
Standard CAN 2.0B classic frame structure (up to 8 bytes payload).
Definition CanAdapter.hpp:19
std::array< uint8_t, 8 > data
Payload bytes.
Definition CanAdapter.hpp:24
bool isRtr
Remote Transmission Request flag.
Definition CanAdapter.hpp:23
uint8_t dlc
Data Length Code (0..8)
Definition CanAdapter.hpp:21
bool isExtended
True if 29-bit extended ID.
Definition CanAdapter.hpp:22
std::span< const uint8_t > payload() const noexcept
Definition CanAdapter.hpp:26