summaryrefslogtreecommitdiffstats
path: root/src/isotp
diff options
context:
space:
mode:
Diffstat (limited to 'src/isotp')
-rw-r--r--src/isotp/isotp.c28
-rw-r--r--src/isotp/isotp.h19
-rw-r--r--src/isotp/receive.c7
-rw-r--r--src/isotp/receive.h19
4 files changed, 59 insertions, 14 deletions
diff --git a/src/isotp/isotp.c b/src/isotp/isotp.c
index da7fa29d..597ffe9d 100644
--- a/src/isotp/isotp.c
+++ b/src/isotp/isotp.c
@@ -1,15 +1,32 @@
#include <isotp/isotp.h>
+#include <isotp/receive.h>
+#include <bitfield/bitfield.h>
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;
-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
+void isotp_receive_can_frame(IsoTpHandler* handler,
+ const uint16_t arbitration_id, const uint8_t* data, const uint8_t length) {
+ if(arbitration_id != handler->arbitration_id){
+ return;
+ }
+
+ // TODO use CanMessage struct from canutil library - allocate payload buffer
+ // on stack, 8 bytes
+ // TODO this function should receive uint64_t...
+ IsoTpProtocolControlInformation pci = (IsoTpProtocolControlInformation)
+ getBitField((uint64_t)data, 0, 2, false);
+
+ switch(pci) {
+ case PCI_SINGLE:
+ isotp_handle_single_frame(handler, arbitration_id, data, length);
+ break;
+ default:
+ handler->shims->log("Only single frame messages are supported");
+ break;
+ }
}
bool isotp_send(const uint8_t* payload, uint16_t payload_size) {
@@ -36,6 +53,7 @@ IsoTpHandler isotp_init(IsoTpShims* shims, uint16_t arbitration_id,
IsoTpCanFrameSentHandler can_frame_sent_callback) {
IsoTpHandler handler = {
shims: shims,
+ arbitration_id: arbitration_id,
message_received_callback: message_received_callback,
message_sent_callback: message_sent_callback,
can_frame_sent_callback: can_frame_sent_callback,
diff --git a/src/isotp/isotp.h b/src/isotp/isotp.h
index c500f6e3..089ecbc0 100644
--- a/src/isotp/isotp.h
+++ b/src/isotp/isotp.h
@@ -42,7 +42,7 @@ typedef struct {
typedef struct {
IsoTpShims* shims;
- uint16_t arb_id;
+ uint16_t arbitration_id;
IsoTpMessageReceivedHandler message_received_callback;
IsoTpMessageSentHandler message_sent_callback;
IsoTpCanFrameSentHandler can_frame_sent_callback;
@@ -58,16 +58,16 @@ typedef struct {
} IsoTpHandler;
typedef enum {
- PCI_SINGLE,
- PCI_FIRST_FRAME,
- PCI_CONSECUTIVE_FRAME,
- PCI_FLOW_CONTROL_FRAME
+ PCI_SINGLE = 0x0,
+ PCI_FIRST_FRAME = 0x1,
+ PCI_CONSECUTIVE_FRAME = 0x2,
+ PCI_FLOW_CONTROL_FRAME = 0x3
} IsoTpProtocolControlInformation;
typedef enum {
- PCI_FLOW_STATUS_CONTINUE,
- PCI_FLOW_STATUS_WAIT,
- PCI_FLOW_STATUS_OVERFLOW
+ PCI_FLOW_STATUS_CONTINUE = 0x0,
+ PCI_FLOW_STATUS_WAIT = 0x1,
+ PCI_FLOW_STATUS_OVERFLOW = 0x2
} IsoTpFlowStatus;
IsoTpShims isotp_init_shims(LogShim log,
@@ -93,7 +93,8 @@ void isotp_set_timeout(IsoTpHandler* handler, uint16_t timeout_ms);
// 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,
+void isotp_receive_can_frame(IsoTpHandler* handler,
+ const uint16_t arbitration_id, const uint8_t* data,
const uint8_t length);
void isotp_destroy(IsoTpHandler* handler);
diff --git a/src/isotp/receive.c b/src/isotp/receive.c
new file mode 100644
index 00000000..9add9d5f
--- /dev/null
+++ b/src/isotp/receive.c
@@ -0,0 +1,7 @@
+#include <isotp/receive.h>
+
+void isotp_handle_single_frame(IsoTpHandler* handler,
+ const uint16_t arbitration_id, const uint8_t* data,
+ const uint8_t length) {
+ handler->message_received_callback(arbitration_id, data, length);
+}
diff --git a/src/isotp/receive.h b/src/isotp/receive.h
new file mode 100644
index 00000000..f7d6c61f
--- /dev/null
+++ b/src/isotp/receive.h
@@ -0,0 +1,19 @@
+#ifndef __ISOTP_RECEIVE_H__
+#define __ISOTP_RECEIVE_H__
+
+#include <isotp/isotp.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void isotp_handle_single_frame(IsoTpHandler* handler, const uint16_t arbitration_id,
+ const uint8_t* data, const uint8_t length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // __ISOTP_RECEIVE_H__