1#ifndef ISOTPC_USER_DEFINITIONS_H
2#define ISOTPC_USER_DEFINITIONS_H
17 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
18 #define ISOTP_BYTE_ORDER_LITTLE_ENDIAN
19 #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
21 #error "unsupported byte ordering"
24 #define ISOTP_PACKED_STRUCT(content) typedef struct __attribute__((packed)) content
31 #define ISOTP_PACKED_STRUCT(content) __pragma(pack(push, 1)) typedef struct content __pragma(pack(pop))
33 #define snprintf _snprintf
36 #define ISOTP_BYTE_ORDER_LITTLE_ENDIAN
37 #define __builtin_bswap8 _byteswap_uint8
38 #define __builtin_bswap16 _byteswap_uint16
39 #define __builtin_bswap32 _byteswap_uint32
40 #define __builtin_bswap64 _byteswap_uint64
43#define LE32TOH(le) ((uint32_t)(((le) << 24) | (((le) & 0x0000FF00) << 8) | (((le) & 0x00FF0000) >> 8) | ((le) >> 24)))
54#define ISOTP_CAN_DL_CLASSIC 8
56#if (ISO_TP_MAX_CAN_FRAME_SIZE != 8) && (ISO_TP_MAX_CAN_FRAME_SIZE != 12) && (ISO_TP_MAX_CAN_FRAME_SIZE != 16) && (ISO_TP_MAX_CAN_FRAME_SIZE != 20) && \
57 (ISO_TP_MAX_CAN_FRAME_SIZE != 24) && (ISO_TP_MAX_CAN_FRAME_SIZE != 32) && (ISO_TP_MAX_CAN_FRAME_SIZE != 48) && (ISO_TP_MAX_CAN_FRAME_SIZE != 64)
58 #error "ISO_TP_MAX_CAN_FRAME_SIZE must be one of 8, 12, 16, 20, 24, 32, 48, 64"
61#if (ISO_TP_DEFAULT_TX_DL > ISO_TP_MAX_CAN_FRAME_SIZE) || (ISO_TP_DEFAULT_TX_DL < ISOTP_CAN_DL_CLASSIC)
62 #error "ISO_TP_DEFAULT_TX_DL must be at least 8 and must not exceed ISO_TP_MAX_CAN_FRAME_SIZE"
66#define ISOTP_CAN_FRAME_FLAG_NONE 0x00
68#define ISOTP_CAN_FRAME_FLAG_FD 0x01
70#define ISOTP_CAN_FRAME_FLAG_BRS 0x02
78#define ISOTP_SF_MAX_PAYLOAD(can_dl) ((can_dl) > ISOTP_CAN_DL_CLASSIC ? (uint32_t)((can_dl) - 2u) : (uint32_t)((can_dl) - 1u))
92#define ISOTP_RET_ERROR -1
94#define ISOTP_RET_INPROGRESS -2
96#define ISOTP_RET_OVERFLOW -3
98#define ISOTP_RET_WRONG_SN -4
100#define ISOTP_RET_NO_DATA -5
102#define ISOTP_RET_TIMEOUT -6
104#define ISOTP_RET_LENGTH -7
106#define ISOTP_RET_NOSPACE -8
113#define IsoTpTimeAfter(a, b) ((int32_t)((int32_t)(b) - (int32_t)(a)) < 0)
116#define ISOTP_INVALID_BS 0xFFFF
119#define ISOTP_MAX_ERROR_MSG_SIZE 128
146#if defined(ISOTP_BYTE_ORDER_LITTLE_ENDIAN)
148 uint8_t reserve_1 : 4;
150 uint8_t reserve_2[ISO_TP_MAX_CAN_FRAME_SIZE - 1];
156 uint8_t data[ISO_TP_MAX_CAN_FRAME_SIZE - 1];
160 uint8_t set_to_zero : 4;
163 uint8_t data[ISO_TP_MAX_CAN_FRAME_SIZE - 2];
164} IsoTpSingleFrameEscape;
167 uint8_t FF_DL_high : 4;
170 uint8_t data[ISO_TP_MAX_CAN_FRAME_SIZE - 2];
171} IsoTpFirstFrameShort;
174 uint8_t set_to_zero_high : 4;
176 uint8_t set_to_zero_low;
178 uint8_t data[ISO_TP_MAX_CAN_FRAME_SIZE - 6];
179} IsoTpFirstFrameLong);
184 uint8_t data[ISO_TP_MAX_CAN_FRAME_SIZE - 1];
185} IsoTpConsecutiveFrame;
192 uint8_t reserve[ISO_TP_MAX_CAN_FRAME_SIZE - 3];
199 uint8_t reserve_1 : 4;
200 uint8_t reserve_2[ISO_TP_MAX_CAN_FRAME_SIZE - 1];
216 uint8_t data[ISO_TP_MAX_CAN_FRAME_SIZE - 1];
231 uint8_t set_to_zero : 4;
233 uint8_t data[ISO_TP_MAX_CAN_FRAME_SIZE - 2];
234} IsoTpSingleFrameEscape;
248 uint8_t FF_DL_high : 4;
250 uint8_t data[ISO_TP_MAX_CAN_FRAME_SIZE - 2];
251} IsoTpFirstFrameShort;
265 uint8_t set_to_zero_high : 4;
266 uint8_t set_to_zero_low;
268 uint8_t data[ISO_TP_MAX_CAN_FRAME_SIZE - 6];
269} IsoTpFirstFrameLong);
284 uint8_t data[ISO_TP_MAX_CAN_FRAME_SIZE - 1];
285} IsoTpConsecutiveFrame;
302 uint8_t reserve[ISO_TP_MAX_CAN_FRAME_SIZE - 3];
308 uint8_t ptr[ISO_TP_MAX_CAN_FRAME_SIZE];
314 IsoTpSingleFrame single_frame;
315 IsoTpSingleFrameEscape single_frame_escape;
316 IsoTpFirstFrameShort first_frame_short;
317 IsoTpFirstFrameLong first_frame_long;
318 IsoTpConsecutiveFrame consecutive_frame;
319 IsoTpFlowControl flow_control;
320 IsoTpDataArray data_array;
330#ifdef ISO_TP_TRANSMIT_COMPLETE_CALLBACK
341#ifdef ISO_TP_RECEIVE_COMPLETE_CALLBACK
350typedef void (*
isotp_rx_done_cb)(
void* link,
const uint8_t* data, uint32_t size,
void* user_arg);
356 ISOTP_PCI_TYPE_SINGLE = 0x0,
357 ISOTP_PCI_TYPE_FIRST_FRAME = 0x1,
358 TSOTP_PCI_TYPE_CONSECUTIVE_FRAME = 0x2,
359 ISOTP_PCI_TYPE_FLOW_CONTROL_FRAME = 0x3,
361 ISOTP_PCI_TYPE_CONSECUTIVE_FRAME = 0x2,
362} IsoTpProtocolControlInformation;
366typedef enum { PCI_FLOW_STATUS_CONTINUE = 0x0, PCI_FLOW_STATUS_WAIT = 0x1, PCI_FLOW_STATUS_OVERFLOW = 0x2 } IsoTpFlowStatus;
373#define ISOTP_PROTOCOL_RESULT_OK 0
375#define ISOTP_PROTOCOL_RESULT_TIMEOUT_A -1
377#define ISOTP_PROTOCOL_RESULT_TIMEOUT_BS -2
379#define ISOTP_PROTOCOL_RESULT_TIMEOUT_CR -3
381#define ISOTP_PROTOCOL_RESULT_WRONG_SN -4
383#define ISOTP_PROTOCOL_RESULT_INVALID_FS -5
385#define ISOTP_PROTOCOL_RESULT_UNEXP_PDU -6
387#define ISOTP_PROTOCOL_RESULT_WFT_OVRN -7
389#define ISOTP_PROTOCOL_RESULT_BUFFER_OVFLW -8
391#define ISOTP_PROTOCOL_RESULT_ERROR -9
@ ISOTP_RECEIVE_STATUS_FULL
@ ISOTP_RECEIVE_STATUS_IDLE
@ ISOTP_RECEIVE_STATUS_INPROGRESS
@ ISOTP_SEND_STATUS_ERROR
@ ISOTP_SEND_STATUS_INPROGRESS
Compile-time transport configuration and defaults.
void(* isotp_rx_done_cb)(void *link, const uint8_t *data, uint32_t size, void *user_arg)
Called after a complete payload has been received successfully.
void(* isotp_tx_done_cb)(void *link, uint32_t tx_size, void *user_arg)
Called after a complete payload has been transmitted successfully.