X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fisotp%2Fisotp.c;h=6522f7aaa4d87451b07471c3e55e1b8fe86957dc;hb=fe5f39179f7c85a2924c288149b5ecc8488918b1;hp=f5b207956434f1a05de9a8bbd5a4c1dc30dbf9e2;hpb=10a35b0a7c380d77cdd24ac90d6aa0abd4601f3e;p=apps%2Flow-level-can-service.git diff --git a/src/isotp/isotp.c b/src/isotp/isotp.c index f5b2079..6522f7a 100644 --- a/src/isotp/isotp.c +++ b/src/isotp/isotp.c @@ -2,16 +2,9 @@ #include #include -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; */ /* } */ @@ -28,28 +21,52 @@ IsoTpShims isotp_init_shims(LogShim log, SendCanMessageShim send_can_message, 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); + // TODO why is this still not printing the entire payload? + snprintf(destination, destination_length, "ID: 0x%02x, Payload: 0x%02x%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]); } -void 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) { + IsoTpMessage message = { + arbitration_id: arbitration_id, + completed: false, + payload: {0}, + size: 0 + }; + if(data_length < 1) { - return; + return message; } if(handle->type == ISOTP_HANDLE_RECEIVING) { if(handle->receive_handle.arbitration_id != arbitration_id) { - return; + 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) { if(handle->send_handle.receiving_arbitration_id != arbitration_id) { - return; + 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; } IsoTpProtocolControlInformation pci = (IsoTpProtocolControlInformation) @@ -67,12 +84,13 @@ void isotp_receive_can_frame(IsoTpShims* shims, IsoTpHandle* handle, switch(pci) { case PCI_SINGLE: { - IsoTpMessage message = { - arbitration_id: arbitration_id, - payload: payload, - size: payload_length - }; - + 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; } @@ -80,4 +98,5 @@ void isotp_receive_can_frame(IsoTpShims* shims, IsoTpHandle* handle, shims->log("Only single frame messages are supported"); break; } + return message; }