summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.mkd15
-rw-r--r--src/isotp/isotp.c14
-rw-r--r--src/isotp/isotp.h62
3 files changed, 89 insertions, 2 deletions
diff --git a/README.mkd b/README.mkd
index a8497071..530ebad5 100644
--- a/README.mkd
+++ b/README.mkd
@@ -1,5 +1,16 @@
-ISO 15765-2 Support Library in C
-============
+ISO-TP (ISO 15765-2) Support Library in C
+================================
+
+## API
+
+ IspTpHandler handler = isotp_init(42, NULL, NULL, NULL);
+ isotp_send(const uint8_t* payload, uint16_t payload_size);
+ while(true) {
+ isotp_handle_can_frame(42, data, 8);
+ }
+ isotp_destroy(&handler);
+
+// TODO should handlers take a context? depends on how we want to use this
## Testing
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__