Sketch out the API and add some notes.
authorChristopher Peplin <chris.peplin@rhubarbtech.com>
Fri, 27 Dec 2013 19:02:14 +0000 (14:02 -0500)
committerChristopher Peplin <chris.peplin@rhubarbtech.com>
Fri, 27 Dec 2013 19:02:14 +0000 (14:02 -0500)
README.mkd
src/isotp/isotp.c [new file with mode: 0644]
src/isotp/isotp.h [new file with mode: 0644]

index a849707..530ebad 100644 (file)
@@ -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
 
 
 ## Testing
 
diff --git a/src/isotp/isotp.c b/src/isotp/isotp.c
new file mode 100644 (file)
index 0000000..1b7f398
--- /dev/null
@@ -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 (file)
index 0000000..923d592
--- /dev/null
@@ -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__