HardFOC Core
API reference
Loading...
Searching...
No Matches
HfCanPort.h
Go to the documentation of this file.
1
23#pragma once
24
25#include <cstdint>
26
27namespace hf::can {
28
30inline constexpr uint8_t kClassicMaxLen = 8U;
32inline constexpr uint8_t kFdMaxLen = 64U;
34inline constexpr uint32_t kMaxStdId = 0x7FFU;
36inline constexpr uint32_t kMaxExtId = 0x1FFFFFFFU;
37
39namespace frame_flag {
40inline constexpr uint8_t kExt = 0x01U;
41inline constexpr uint8_t kRtr = 0x02U;
42inline constexpr uint8_t kFdf = 0x04U;
43inline constexpr uint8_t kBrs = 0x08U;
44inline constexpr uint8_t kEsi = 0x10U;
45inline constexpr uint8_t kAll = kExt | kRtr | kFdf | kBrs | kEsi;
46} // namespace frame_flag
47
49struct CanFrame {
50 uint32_t id{0};
51 uint8_t len{0};
52 uint8_t flags{0};
53 uint8_t data[kFdMaxLen]{};
54 uint32_t ts_us{0};
55
56 constexpr bool IsExtended() const noexcept { return (flags & frame_flag::kExt) != 0U; }
57 constexpr bool IsRemote() const noexcept { return (flags & frame_flag::kRtr) != 0U; }
58 constexpr bool IsFd() const noexcept { return (flags & frame_flag::kFdf) != 0U; }
59};
60
62constexpr bool IsExactFdLength(uint8_t len) noexcept {
63 return len <= 8U || len == 12U || len == 16U || len == 20U || len == 24U || len == 32U || len == 48U || len == 64U;
64}
65
67constexpr bool IsWellFormed(const CanFrame& f) noexcept {
68 if ((f.flags & static_cast<uint8_t>(~frame_flag::kAll)) != 0U) return false;
69 if (f.id > (f.IsExtended() ? kMaxExtId : kMaxStdId)) return false;
70 if (f.IsFd()) return !f.IsRemote() && f.len <= kFdMaxLen && IsExactFdLength(f.len);
71 if ((f.flags & (frame_flag::kBrs | frame_flag::kEsi)) != 0U) return false;
72 return f.len <= kClassicMaxLen;
73}
74
76struct PortCaps {
77 bool fd{false};
79 uint32_t nominal_bps{0};
80 uint32_t data_bps{0};
81 uint8_t hw_filters{0};
82};
83
85enum class TxResult : uint8_t { Ok = 0, QueueFull, BusOff, NotAllowed };
86
89
91struct PortStatus {
93 uint16_t tec{0};
94 uint16_t rec{0};
95 uint32_t rx_overruns{0};
96 uint32_t tx_queue_full{0};
97 uint32_t bus_off_count{0};
98};
99
101using RxSink = bool (*)(void* ctx, const CanFrame& frame);
103using TxDoneSink = void (*)(void* ctx);
104
106class ICanPort {
107 public:
108 virtual ~ICanPort() = default;
109
111 virtual PortCaps Caps() const = 0;
113 virtual TxResult Send(const CanFrame& frame) = 0;
115 virtual void SetRxSink(RxSink sink, void* ctx) = 0;
117 virtual PortStatus Status() const = 0;
119 virtual bool Recover() = 0;
121 virtual bool RxBackpressure() const { return false; }
123 virtual void SetTxDoneSink(TxDoneSink sink, void* ctx) {
124 (void)sink;
125 (void)ctx;
126 }
127
128 protected:
129 ICanPort() = default;
130 ICanPort(const ICanPort&) = default;
131 ICanPort& operator=(const ICanPort&) = default;
132};
133
134} // namespace hf::can
One CAN transport binding.
Definition HfCanPort.h:106
virtual bool RxBackpressure() const
True if the port holds a frame the RX sink refused and offers it again (no loss).
Definition HfCanPort.h:121
virtual TxResult Send(const CanFrame &frame)=0
Queue frame without blocking.
virtual ~ICanPort()=default
virtual PortCaps Caps() const =0
Static capabilities.
virtual void SetRxSink(RxSink sink, void *ctx)=0
Install the RX sink (nullptr detaches).
virtual void SetTxDoneSink(TxDoneSink sink, void *ctx)
Install the TX-done sink. Ports without a TX-done event ignore it.
Definition HfCanPort.h:123
virtual bool Recover()=0
Request bus-off recovery; false when not possible now.
ICanPort(const ICanPort &)=default
virtual PortStatus Status() const =0
Error counters and state.
ICanPort()=default
ICanPort & operator=(const ICanPort &)=default
constexpr uint8_t kFdf
FD frame format.
Definition HfCanPort.h:42
constexpr uint8_t kAll
Definition HfCanPort.h:45
constexpr uint8_t kBrs
bit-rate switch (FD only)
Definition HfCanPort.h:43
constexpr uint8_t kEsi
error state indicator (FD only)
Definition HfCanPort.h:44
constexpr uint8_t kRtr
remote request (classic only)
Definition HfCanPort.h:41
constexpr uint8_t kExt
29-bit identifier
Definition HfCanPort.h:40
Definition EspTwaiPort.cpp:12
TxResult
Result of a non-blocking ICanPort::Send.
Definition HfCanPort.h:85
bool(*)(void *ctx, const CanFrame &frame) RxSink
RX sink; may run in ISR context (copy and return). Returns false if it could not take the frame.
Definition HfCanPort.h:101
constexpr bool IsExactFdLength(uint8_t len) noexcept
Is len an exact FD payload size (0..8, 12, 16, 20, 24, 32, 48, 64)?
Definition HfCanPort.h:62
constexpr uint32_t kMaxExtId
Largest 29-bit identifier.
Definition HfCanPort.h:36
void(*)(void *ctx) TxDoneSink
TX-done sink: the port has room again; may run in ISR context.
Definition HfCanPort.h:103
BusState
Controller error state.
Definition HfCanPort.h:88
constexpr uint32_t kMaxStdId
Largest 11-bit identifier.
Definition HfCanPort.h:34
constexpr bool IsWellFormed(const CanFrame &f) noexcept
Structurally valid frame (flags, id range, length for the frame kind)?
Definition HfCanPort.h:67
constexpr uint8_t kFdMaxLen
Largest CAN FD payload in bytes.
Definition HfCanPort.h:32
constexpr uint8_t kClassicMaxLen
Largest classic CAN payload in bytes.
Definition HfCanPort.h:30
One CAN or CAN FD frame; len is a byte count, never a DLC code.
Definition HfCanPort.h:49
uint8_t len
Definition HfCanPort.h:51
constexpr bool IsRemote() const noexcept
Definition HfCanPort.h:57
constexpr bool IsExtended() const noexcept
Definition HfCanPort.h:56
uint8_t flags
Definition HfCanPort.h:52
uint32_t ts_us
RX timestamp (µs, port clock); ignored on TX.
Definition HfCanPort.h:54
uint8_t data[kFdMaxLen]
Definition HfCanPort.h:53
constexpr bool IsFd() const noexcept
Definition HfCanPort.h:58
What a port binding can carry.
Definition HfCanPort.h:76
uint32_t data_bps
Definition HfCanPort.h:80
uint8_t max_len
Definition HfCanPort.h:78
uint32_t nominal_bps
0 = not a physical bus
Definition HfCanPort.h:79
uint8_t hw_filters
Definition HfCanPort.h:81
bool fd
Definition HfCanPort.h:77
Error counters and statistics of one port.
Definition HfCanPort.h:91
uint32_t bus_off_count
Definition HfCanPort.h:97
uint32_t rx_overruns
Definition HfCanPort.h:95
uint32_t tx_queue_full
Definition HfCanPort.h:96
uint16_t tec
Definition HfCanPort.h:93
uint16_t rec
Definition HfCanPort.h:94
BusState state
Definition HfCanPort.h:92