Split up functions in send/receive files for clarity.
[apps/agl-service-can-low-level.git] / src / isotp / isotp_types.h
1 #ifndef __ISOTP_TYPES__
2 #define __ISOTP_TYPES__
3
4 #include <stdint.h>
5 #include <stdbool.h>
6 #include <stdio.h>
7
8 #define CAN_MESSAGE_BYTE_SIZE 8
9 #define MAX_ISO_TP_MESSAGE_SIZE 4096
10 // TODO we want to avoid malloc, and we can't be allocated 4K on the stack for
11 // each IsoTpMessage, so for now we're setting an artificial max message size
12 // here - since we only handle single frame messages, 8 bytes is plenty.
13 #define OUR_MAX_ISO_TP_MESSAGE_SIZE 8
14
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18
19 const uint8_t ISO_TP_DEFAULT_RESPONSE_TIMEOUT;
20 const bool ISO_TP_DEFAULT_FRAME_PADDING_STATUS;
21
22 typedef struct {
23     const uint16_t arbitration_id;
24     uint8_t payload[OUR_MAX_ISO_TP_MESSAGE_SIZE];
25     uint16_t size;
26     bool completed;
27 } IsoTpMessage;
28
29 typedef void (*LogShim)(const char* message, ...);
30 typedef bool (*SendCanMessageShim)(const uint16_t arbitration_id,
31         const uint8_t* data, const uint8_t size);
32 typedef bool (*SetTimerShim)(uint16_t time_ms, void (*callback));
33
34 typedef void (*IsoTpMessageReceivedHandler)(const IsoTpMessage* message);
35 typedef void (*IsoTpMessageSentHandler)(const IsoTpMessage* message,
36         const bool success);
37 typedef void (*IsoTpCanFrameSentHandler)(const IsoTpMessage* message);
38
39 typedef struct {
40     LogShim log;
41     SendCanMessageShim send_can_message;
42     SetTimerShim set_timer;
43 } IsoTpShims;
44
45 typedef struct {
46     bool success;
47     bool completed;
48     uint16_t arbitration_id;
49     IsoTpMessageReceivedHandler message_received_callback;
50
51     // Private
52     uint16_t timeout_ms;
53     // timeout_ms: ISO_TP_DEFAULT_RESPONSE_TIMEOUT,
54     bool frame_padding;
55     // frame_padding: ISO_TP_DEFAULT_FRAME_PADDING_STATUS,
56     uint8_t* receive_buffer;
57     uint16_t received_buffer_size;
58     uint16_t incoming_message_size;
59     // TODO timer callback for multi frame
60 } IsoTpReceiveHandle;
61
62 typedef enum {
63     PCI_SINGLE = 0x0,
64     PCI_FIRST_FRAME = 0x1,
65     PCI_CONSECUTIVE_FRAME = 0x2,
66     PCI_FLOW_CONTROL_FRAME = 0x3
67 } IsoTpProtocolControlInformation;
68
69 typedef enum {
70     PCI_FLOW_STATUS_CONTINUE = 0x0,
71     PCI_FLOW_STATUS_WAIT = 0x1,
72     PCI_FLOW_STATUS_OVERFLOW = 0x2
73 } IsoTpFlowStatus;
74
75 #ifdef __cplusplus
76 }
77 #endif
78
79 #endif // __ISOTP_TYPES__