Open Model Railroad Network (OpenMRN)
Loading...
Searching...
No Matches
can_frame.h
Go to the documentation of this file.
1
34#ifndef _nmranet_can_h_
35#define _nmranet_can_h_
36
37#if defined (__linux__)
38 #include <sys/socket.h>
39 #include <linux/can.h>
40 #include <linux/can/raw.h>
41 #include <linux/can/error.h>
42
43 #define SET_CAN_FRAME_EFF(_frame) (_frame).can_id |= CAN_EFF_FLAG
44 #define SET_CAN_FRAME_RTR(_frame) (_frame).can_id |= CAN_RTR_FLAG
45 #define SET_CAN_FRAME_ERR(_frame) (_frame).can_id |= CAN_ERR_FLAG
46 #define CLR_CAN_FRAME_EFF(_frame) (_frame).can_id &= ~CAN_EFF_FLAG
47 #define CLR_CAN_FRAME_RTR(_frame) (_frame).can_id &= ~CAN_RTR_FLAG
48 #define CLR_CAN_FRAME_ERR(_frame) (_frame).can_id &= ~CAN_ERR_FLAG
49 #define IS_CAN_FRAME_EFF(_frame) ((_frame).can_id & CAN_EFF_FLAG)
50 #define IS_CAN_FRAME_RTR(_frame) ((_frame).can_id & CAN_RTR_FLAG)
51 #define IS_CAN_FRAME_ERR(_frame) ((_frame).can_id & CAN_ERR_FLAG)
52
53 #define GET_CAN_FRAME_ID_EFF(_frame) ((_frame).can_id & CAN_EFF_MASK)
54 #define GET_CAN_FRAME_ID(_frame) ((_frame).can_id & CAN_SFF_MASK)
55 #define SET_CAN_FRAME_ID_EFF(_frame, _value) \
56 { \
57 (_frame).can_id &= ~CAN_EFF_MASK; \
58 (_frame).can_id += ((_value) & CAN_EFF_MASK); \
59 }
60 #define SET_CAN_FRAME_ID(_frame, _value) \
61 { \
62 (_frame).can_id &= ~CAN_SFF_MASK; \
63 (_frame).can_id += ((_value) & CAN_SFF_MASK); \
64 }
65
66#elif defined (__nuttx__) || defined (__FreeRTOS__) || defined (__MACH__) || \
67 defined (__WIN32__) || defined (__EMSCRIPTEN__) || defined (ESP_NONOS) || \
68 defined (ARDUINO) || defined (ESP_PLATFORM)
69 #include <stdint.h>
70
71 struct can_frame
72 {
73 union
74 {
75 uint32_t raw[4];
76 struct
77 {
78 uint32_t can_id;
80 uint8_t can_dlc : 4;
81 uint8_t can_rtr : 1;
82 uint8_t can_eff : 1;
83 uint8_t can_err : 1;
84 uint8_t can_res : 1;
86 uint8_t pad;
87 uint8_t res0;
88 uint8_t res1;
90 union
91 {
93 uint64_t data64 __attribute__((aligned(8)));
95 uint8_t data[8] __attribute__((aligned(8)));
96 };
97 };
98 };
99 };
100
101 #define SET_CAN_FRAME_EFF(_frame) (_frame).can_eff = 1
102 #define SET_CAN_FRAME_RTR(_frame) (_frame).can_rtr = 1
103 #define SET_CAN_FRAME_ERR(_frame) (_frame).can_err = 1
104 #define CLR_CAN_FRAME_EFF(_frame) (_frame).can_eff = 0
105 #define CLR_CAN_FRAME_RTR(_frame) (_frame).can_rtr = 0
106 #define CLR_CAN_FRAME_ERR(_frame) (_frame).can_err = 0
107 #define IS_CAN_FRAME_EFF(_frame) ((_frame).can_eff)
108 #define IS_CAN_FRAME_RTR(_frame) ((_frame).can_rtr)
109 #define IS_CAN_FRAME_ERR(_frame) ((0))
110
111 #define GET_CAN_FRAME_ID_EFF(_frame) (_frame).can_id
112 #define GET_CAN_FRAME_ID(_frame) (_frame).can_id
113 #define SET_CAN_FRAME_ID_EFF(_frame, _value) (_frame).can_id = ((_value) & 0x1FFFFFFFU)
114 #define SET_CAN_FRAME_ID(_frame, _value) (_frame).can_id = ((_value) & 0x7ffU)
115
116#else
117#error No CAN frame representation for your OS
118#endif
119
120#endif /* _nmranet_can_h_ */