diff options
Diffstat (limited to 'src/isotp')
-rw-r--r-- | src/isotp/isotp.c | 14 | ||||
-rw-r--r-- | src/isotp/isotp.h | 62 |
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__ |