66inline void PutU16(uint8_t* p, uint16_t v)
noexcept {
67 p[0] =
static_cast<uint8_t
>(v);
68 p[1] =
static_cast<uint8_t
>(v >> 8U);
70inline void PutU32(uint8_t* p, uint32_t v)
noexcept {
71 p[0] =
static_cast<uint8_t
>(v);
72 p[1] =
static_cast<uint8_t
>(v >> 8U);
73 p[2] =
static_cast<uint8_t
>(v >> 16U);
74 p[3] =
static_cast<uint8_t
>(v >> 24U);
76inline uint16_t
GetU16(
const uint8_t* p)
noexcept {
77 return static_cast<uint16_t
>(
static_cast<uint16_t
>(p[0]) |
static_cast<uint16_t
>(p[1] << 8U));
79inline uint32_t
GetU32(
const uint8_t* p)
noexcept {
80 return static_cast<uint32_t
>(p[0]) | (
static_cast<uint32_t
>(p[1]) << 8U) | (
static_cast<uint32_t
>(p[2]) << 16U) |
81 (
static_cast<uint32_t
>(p[3]) << 24U);
110 for (uint8_t i = 0; i < f.len; ++i) {
121template <
typename OnFrame>
130 for (
int pass = 0; pass < 2; ++pass) {
134 const uint32_t raw =
GetU32(&p[off]);
146 for (uint8_t i = 0; i < f.
len; ++i) {
149 on_frame(
static_cast<const CanFrame&
>(f));
154 if (header !=
nullptr) *header = h;
Transport-neutral CAN frame and the ICanPort interface for port bindings (EspTwaiPort,...
constexpr uint8_t kFdf
FD frame format.
Definition HfCanPort.h:42
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 HfCanFrameRecord.h:34
std::size_t EncodeRecord(uint8_t *out, std::size_t cap, const CanFrame &f) noexcept
Append the record of f.
Definition HfCanFrameRecord.h:100
constexpr uint8_t kDgramKeepAlive
Definition HfCanFrameRecord.h:47
uint32_t GetU32(const uint8_t *p) noexcept
Definition HfCanFrameRecord.h:79
constexpr std::size_t kMaxDatagram
Definition HfCanFrameRecord.h:41
constexpr uint8_t kRecordFlagMask
Definition HfCanFrameRecord.h:44
constexpr uint32_t kIdExtBit
Definition HfCanFrameRecord.h:42
void PutU32(uint8_t *p, uint32_t v) noexcept
Definition HfCanFrameRecord.h:70
DecodeError DecodeDatagram(const uint8_t *p, std::size_t n, Header *header, OnFrame &&on_frame)
Decode a datagram; on_frame(const CanFrame&) is called per record.
Definition HfCanFrameRecord.h:122
constexpr std::size_t kHeaderSize
Definition HfCanFrameRecord.h:37
constexpr std::size_t kRecordHeaderSize
Definition HfCanFrameRecord.h:38
constexpr std::size_t RecordSize(const CanFrame &f) noexcept
Bytes the record of f takes.
Definition HfCanFrameRecord.h:94
constexpr std::size_t kMaxRecordSize
Definition HfCanFrameRecord.h:39
void PutU16(uint8_t *p, uint16_t v) noexcept
Definition HfCanFrameRecord.h:66
constexpr uint32_t kIdRtrBit
Definition HfCanFrameRecord.h:43
constexpr uint8_t kVersion
Definition HfCanFrameRecord.h:36
std::size_t EncodeHeader(uint8_t *out, const Header &h) noexcept
Write the header; out has kHeaderSize bytes.
Definition HfCanFrameRecord.h:85
DecodeError
Why a datagram was rejected.
Definition HfCanFrameRecord.h:58
@ Truncated
shorter than the header, or a record runs past the end
@ BadFrame
record is not a well-formed frame (flags, id range, length)
@ BadLength
record len > 64
uint16_t GetU16(const uint8_t *p) noexcept
Definition HfCanFrameRecord.h:76
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
One CAN or CAN FD frame; len is a byte count, never a DLC code.
Definition HfCanPort.h:49
uint32_t id
Definition HfCanPort.h:50
uint8_t len
Definition HfCanPort.h:51
uint8_t flags
Definition HfCanPort.h:52
uint8_t data[kFdMaxLen]
Definition HfCanPort.h:53