summaryrefslogtreecommitdiffstats
path: root/src/isotp
diff options
context:
space:
mode:
Diffstat (limited to 'src/isotp')
-rw-r--r--src/isotp/isotp.c14
-rw-r--r--src/isotp/isotp.h62
2 files changed, 76 insertions, 0 deletions
diff --git a/src/isotp/isotp.c b/src/isotp/isotp.c
new file mode 100644
index 00000000..1b7f398b
--- /dev/null
+++ b/src/isotp/isotp.c
@@ -0,0 +1,14 @@
+
+void isotp_receive_can_frame(const uint16_t arbitration_id, const uint8_t* data,
+ const uint8_t length) {
+ //match with any request we made
+ //handle flow control if necessary
+ //call callback if message completed
+}
+
+bool isotp_send(const uint8_t* payload, uint16_t payload_size) {
+ // we determine if it's single/multi frame and start the send
+}
+
+void isotp_set_timeout(uint16_t timeout) {
+}
diff --git a/src/isotp/isotp.h b/src/isotp/isotp.h
new file mode 100644
index 00000000..923d5926
--- /dev/null
+++ b/src/isotp/isotp.h
@@ -0,0 +1,62 @@
+#ifndef __ISOTP_H__
+#define __ISOTP_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct {
+ uint16_t arb_id;
+ void* message_received_callback;
+ void* message_sent_callback;
+ void* can_frame_sent_callback;
+
+ // Private
+ uint16_t timeout_ms;
+ bool framePadding;
+ uint8_t* receive_buffer;
+ uint16_t received_buffer_size;
+ uint16_t incoming_message_size;
+ bool sending;
+ // TODO timer
+} IsoTpHandler;
+
+enum {
+ PCI_SINGLE,
+ PCI_FIRST_FRAME,
+ PCI_CONSECUTIVE_FRAME,
+ PCI_FLOW_CONTROL_FRAME
+} IsoTpProtocolControlInformation;
+
+enum {
+ PCI_FLOW_STATUS_CONTINUE,
+ PCI_FLOW_STATUS_WAIT,
+ PCI_FLOW_STATUS_OVERFLOW
+} IsoTpFlowStatus;
+
+const uint16_t MAX_ISO_TP_MESSAGE_SIZE = 4096;
+const uint16_t MAX_CAN_FRAME_SIZE = 8;
+const uint8_t ISO_TP_DEFAULT_RESPONSE_TIMEOUT = 100;
+const bool ISO_TP_DEFAULT_FRAME_PADDING_STATUS = true;
+
+IsoTpHandler isotp_init(uint16_t arbitration_id,
+ IsoTpMessageReceivedHandler* message_received_callback,
+ IsoTpMessageSentHandler* message_sent_callback,
+ IsoTpCanFrameSentHandler* can_frame_sent_callback);
+
+void isotp_set_timeout(uint16_t timeout);
+
+// TODO we have to make sure to copy the payload internall if it's more than 1
+// frame, the soure could go out of scope
+bool isotp_send(const uint8_t* payload, uint16_t payload_size);
+
+void isotp_receive_can_frame(const uint16_t arbitration_id, const uint8_t* data,
+ const uint8_t length);
+
+void isotp_destroy(IsoTpHandler* handler);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // __ISOTP_H__