diff options
Diffstat (limited to 'src/isotp')
-rw-r--r-- | src/isotp/isotp.c | 40 | ||||
-rw-r--r-- | src/isotp/isotp.h | 12 |
2 files changed, 45 insertions, 7 deletions
diff --git a/src/isotp/isotp.c b/src/isotp/isotp.c index af9c2631..1514625d 100644 --- a/src/isotp/isotp.c +++ b/src/isotp/isotp.c @@ -7,6 +7,12 @@ 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; +const uint8_t PCI_START_BIT = 0; +const uint8_t PCI_WIDTH = 4; +const uint8_t PAYLOAD_LENGTH_START_BIT = 4; +const uint8_t PAYLOAD_LENGTH_WIDTH = 4; +const uint8_t PAYLOAD_START_BIT = 8; + void isotp_receive_can_frame(IsoTpHandler* handler, const uint16_t arbitration_id, const uint64_t data, const uint8_t length) { @@ -39,10 +45,42 @@ void isotp_receive_can_frame(IsoTpHandler* handler, } } -bool isotp_send(const uint8_t* payload, uint16_t size) { +void isotp_complete_send(IsoTpHandler* handler, const uint8_t* payload, + uint8_t size, bool status) { + handler->message_sent_callback(handler->arbitration_id, payload, size, + status); +} + +bool isotp_send_single_frame(IsoTpHandler* handler, const uint8_t* payload, + uint8_t size) { + uint64_t data; + setBitField(&data, PCI_SINGLE, PCI_START_BIT, PCI_WIDTH); + setBitField(&data, size, PAYLOAD_LENGTH_START_BIT, PAYLOAD_LENGTH_WIDTH); + // TODO this is probably wrong + if(size > 0) { + setBitField(&data, *payload, PAYLOAD_START_BIT, size * 8); + } + handler->shims->send_can_message(handler->arbitration_id, payload, size); + isotp_complete_send(handler, payload, size, true); + return true; +} + +bool isotp_send_multi_frame(IsoTpHandler* handler, const uint8_t* payload, + uint16_t size) { + return false; +} + +bool isotp_send(IsoTpHandler* handler, const uint8_t* payload, + uint16_t size) { // we determine if it's single/multi frame and start the send + if(size < 8) { + return isotp_send_single_frame(handler, payload, size); + } else { + return isotp_send_multi_frame(handler, payload, size); + } } + void isotp_set_timeout(IsoTpHandler* handler, uint16_t timeout_ms) { handler->timeout_ms = timeout_ms; } diff --git a/src/isotp/isotp.h b/src/isotp/isotp.h index f1719548..7ea0190c 100644 --- a/src/isotp/isotp.h +++ b/src/isotp/isotp.h @@ -14,15 +14,14 @@ const uint8_t ISO_TP_DEFAULT_RESPONSE_TIMEOUT; const bool ISO_TP_DEFAULT_FRAME_PADDING_STATUS; typedef void (*LogShim)(const char* message); -typedef bool (*SendCanMessageShim)(const uint16_t arbitration_id, const uint8_t* data, - const uint8_t size); +typedef bool (*SendCanMessageShim)(const uint16_t arbitration_id, + const uint8_t* data, const uint8_t size); typedef bool (*SetTimerShim)(uint16_t time_ms, void (*callback)); typedef void (*IsoTpMessageReceivedHandler)(const uint16_t arbitration_id, const uint8_t* payload, const uint16_t size); -typedef void (*IsoTpMessageSentHandler)(const bool success, - const uint16_t arbitration_id, const uint8_t* payload, - const uint16_t size); +typedef void (*IsoTpMessageSentHandler)(const uint16_t arbitration_id, + const uint8_t* payload, const uint16_t size, const bool success); typedef void (*IsoTpCanFrameSentHandler)(const uint16_t arbitration_id, const uint8_t* payload, const uint8_t size); @@ -91,7 +90,8 @@ void isotp_set_timeout(IsoTpHandler* handler, uint16_t timeout_ms); // 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); +bool isotp_send(IsoTpHandler* handler, const uint8_t* payload, + uint16_t payload_size); void isotp_receive_can_frame(IsoTpHandler* handler, const uint16_t arbitration_id, const uint64_t data, |