#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;
-// TODO why isn't this picked up from the header?
-extern IsoTpHandle isotp_receive(IsoTpShims* shims, const uint16_t arbitration_id,
- IsoTpMessageReceivedHandler callback);
-
-
/* void isotp_set_timeout(IsoTpHandler* handler, uint16_t timeout_ms) { */
/* handler->timeout_ms = timeout_ms; */
/* } */
void isotp_message_to_string(const IsoTpMessage* message, char* destination,
size_t destination_length) {
- snprintf(destination, destination_length,"ID: 0x%02x, Payload: 0x%llx",
- // TODO the payload may be backwards here
- message->arbitration_id, message->payload);
+ snprintf(destination, destination_length, "ID: 0x%02x, Payload: 0x%02x%02x%02x%02x%02x%02x%02x%02x",
+ message->arbitration_id,
+ message->payload[0],
+ message->payload[1],
+ message->payload[2],
+ message->payload[3],
+ message->payload[4],
+ message->payload[5],
+ message->payload[6],
+ message->payload[7]);
}
-bool isotp_receive_can_frame(IsoTpShims* shims, IsoTpHandle* handle,
+IsoTpMessage isotp_receive_can_frame(IsoTpShims* shims, IsoTpHandle* handle,
const uint16_t arbitration_id, const uint8_t data[],
const uint8_t data_length) {
- bool message_completed = false;
+ IsoTpMessage message = {
+ arbitration_id: arbitration_id,
+ completed: false,
+ payload: {0},
+ size: 0
+ };
if(data_length < 1) {
- return message_completed;
+ return message;
}
if(handle->type == ISOTP_HANDLE_RECEIVING) {
if(handle->receive_handle.arbitration_id != arbitration_id) {
- return message_completed;
+ if(shims->log != NULL) {
+ shims->log("The arb ID 0x%x doesn't match the expected rx ID 0x%x",
+ arbitration_id, handle->receive_handle.arbitration_id);
+ }
+ return message;
}
} else if(handle->type == ISOTP_HANDLE_SENDING) {
+ // TODO this will need to be tested when we add multi-frame support,
+ // which is when it'll be necessary to pass in CAN messages to SENDING
+ // handles.
if(handle->send_handle.receiving_arbitration_id != arbitration_id) {
- return message_completed;
+ if(shims->log != NULL) {
+ shims->log("The arb ID 0x%x doesn't match the expected tx continuation ID 0x%x",
+ arbitration_id, handle->send_handle.receiving_arbitration_id);
+ }
+ return message;
}
} else {
shims->log("The ISO-TP handle is corrupt");
- return message_completed;
+ return message;
}
IsoTpProtocolControlInformation pci = (IsoTpProtocolControlInformation)
switch(pci) {
case PCI_SINGLE: {
- IsoTpMessage message = {
- arbitration_id: arbitration_id,
- payload: payload,
- size: payload_length
- };
-
- message_completed = isotp_handle_single_frame(handle, &message);
+ if(payload_length > 0) {
+ memcpy(message.payload, payload, payload_length);
+ }
+ message.size = payload_length;
+ message.completed = true;
+ handle->success = true;
+ handle->completed = true;
+ isotp_handle_single_frame(handle, &message);
break;
}
default:
shims->log("Only single frame messages are supported");
break;
}
- return message_completed;
+ return message;
}