PER Firmware
Loading...
Searching...
No Matches
timestamped_frame.h
Go to the documentation of this file.
1#ifndef TIMESTAMPED_FRAME_H
2#define TIMESTAMPED_FRAME_H
3
11#include <stdint.h>
12
13typedef struct {
14 uint32_t ticks_ms; // ms timestamp of reception
15 uint32_t identity; // [1 bit bus ID] [1 bit isExtID] [1 bit reserved] [29 bits CAN ID]
16 uint64_t payload; // message data
18
19static_assert(
20 sizeof(timestamped_frame_t) == 16,
21 "timestamped_frame_t should be 16 bytes for optimal access patterns"
22);
23
24// helper functions
25[[gnu::always_inline]]
26static inline void set_bus_id(timestamped_frame_t *frame, uint8_t bus_id) {
27 static constexpr uint32_t BUS_ID_MASK = (1u << 31u);
28
29 if (bus_id == 0) {
30 frame->identity &= ~BUS_ID_MASK;
31 } else {
32 frame->identity |= BUS_ID_MASK;
33 }
34}
35
36[[gnu::always_inline]]
37static inline void set_xid(timestamped_frame_t *frame, bool is_xid) {
38 static constexpr uint32_t IS_XID_MASK = (1u << 30u);
39
40 if (is_xid) {
41 frame->identity |= IS_XID_MASK;
42 } else {
43 frame->identity &= ~IS_XID_MASK;
44 }
45}
46
47[[gnu::always_inline]]
48static inline void set_can_id(timestamped_frame_t *frame, uint32_t can_id) {
49 static constexpr uint32_t CAN_ID_MASK = 0x1FFFFFFFu; // 29 bits for CAN ID
50
51 frame->identity &= ~CAN_ID_MASK; // Clear existing CAN ID bits
52 frame->identity |= (can_id & CAN_ID_MASK); // Set new CAN ID bits
53}
54
55#endif // TIMESTAMPED_FRAME_H
Definition timestamped_frame.h:13