Return completed rx messages instead of relying on callbacks.

This commit is contained in:
Christopher Peplin 2014-01-01 16:08:10 -05:00
parent 8702b34a8f
commit 482c7eafcb
7 changed files with 34 additions and 33 deletions

View File

@ -58,7 +58,8 @@ Then, set up a callback and send an ISO-TP message:
Finally, receive an ISO-TP message:
// This is your callback for when a complete ISO-TP message is received at
// the arbitration ID you specify
// the arbitration ID you specify - it's optional. The completed message is
// also returned by isotp_receive_can_frame
void message_received(const IsoTpMessage* message) {
}
@ -69,9 +70,9 @@ Finally, receive an ISO-TP message:
} else {
while(true) {
// Continue to read from CAN, passing off each message to the handle
bool complete = isotp_receive_can_frame(&shims, &handle, 0x100, data, size);
IsoTp message = isotp_receive_can_frame(&shims, &handle, 0x100, data, size);
if(complete && handle.completed) {
if(message.completed && handle.completed) {
if(handle.success) {
// A message has been received successfully
} else {

View File

@ -33,26 +33,29 @@ void isotp_message_to_string(const IsoTpMessage* message, char* destination,
message->arbitration_id, payload_string);
}
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
};
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;
return message;
}
} else if(handle->type == ISOTP_HANDLE_SENDING) {
if(handle->send_handle.receiving_arbitration_id != arbitration_id) {
return message_completed;
return message;
}
} else {
shims->log("The ISO-TP handle is corrupt");
return message_completed;
return message;
}
IsoTpProtocolControlInformation pci = (IsoTpProtocolControlInformation)
@ -70,18 +73,15 @@ bool isotp_receive_can_frame(IsoTpShims* shims, IsoTpHandle* handle,
switch(pci) {
case PCI_SINGLE: {
IsoTpMessage message = {
arbitration_id: arbitration_id,
payload: payload,
size: payload_length
};
message_completed = isotp_handle_single_frame(handle, &message);
message.payload = payload;
message.size = payload_length;
message.completed = true;
isotp_handle_single_frame(handle, &message);
break;
}
default:
shims->log("Only single frame messages are supported");
break;
}
return message_completed;
return message;
}

View File

@ -18,8 +18,9 @@ const bool ISO_TP_DEFAULT_FRAME_PADDING_STATUS;
typedef struct {
const uint16_t arbitration_id;
const uint8_t* payload;
const uint16_t size;
uint8_t* payload;
uint16_t size;
bool completed;
} IsoTpMessage;
typedef void (*LogShim)(const char* message, ...);
@ -95,11 +96,8 @@ IsoTpShims isotp_init_shims(LogShim log,
/* Public:
*
* Returns true if a complete ISO-TP message was sent or received as of
* processing this CAN frame. Check the 'success' and 'completed' flag on the
* handle to make sure.
*/
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 size);
@ -121,8 +119,8 @@ IsoTpHandle isotp_send(IsoTpShims* shims, const uint16_t arbitration_id,
const uint8_t* payload, uint16_t size,
IsoTpMessageSentHandler callback);
IsoTpHandle isotp_receive(IsoTpShims* shims, const uint16_t arbitration_id,
IsoTpMessageReceivedHandler callback);
IsoTpHandle isotp_receive(IsoTpShims* shims,
const uint16_t arbitration_id, IsoTpMessageReceivedHandler callback);
#ifdef __cplusplus
}

View File

@ -24,4 +24,3 @@ IsoTpHandle isotp_receive(IsoTpShims* shims,
};
return handle;
}

View File

@ -49,6 +49,8 @@ IsoTpHandle isotp_send_multi_frame(IsoTpShims* shims, IsoTpMessage* message,
completed: true,
type: ISOTP_HANDLE_SENDING
};
// TODO need to set sending and receiving arbitration IDs separately if we
// can't always just add 0x8 (and I think we can't)
return handle;
}

View File

@ -9,9 +9,6 @@
extern "C" {
#endif
IsoTpHandle isotp_send(IsoTpShims* shims, const uint16_t arbitration_id,
const uint8_t* payload, uint16_t size,
IsoTpMessageSentHandler callback);
#ifdef __cplusplus
}

View File

@ -28,7 +28,8 @@ extern void setup();
START_TEST (test_receive_wrong_id)
{
const uint8_t data[CAN_MESSAGE_BYTE_SIZE] = {0};
fail_if(isotp_receive_can_frame(&SHIMS, &HANDLE, 0x100, data, 1));
IsoTpMessage message = isotp_receive_can_frame(&SHIMS, &HANDLE, 0x100, data, 1);
fail_if(message.completed);
fail_if(message_was_received);
}
END_TEST
@ -37,7 +38,8 @@ START_TEST (test_receive_bad_pci)
{
// 4 is a reserved number for the PCI field - only 0-3 are allowed
const uint8_t data[CAN_MESSAGE_BYTE_SIZE] = {0x40};
fail_if(isotp_receive_can_frame(&SHIMS, &HANDLE, 0x2a, data, 1));
IsoTpMessage message = isotp_receive_can_frame(&SHIMS, &HANDLE, 0x2a, data, 1);
fail_if(message.completed);
fail_if(message_was_received);
}
END_TEST
@ -45,7 +47,8 @@ END_TEST
START_TEST (test_receive_single_frame_empty_payload)
{
const uint8_t data[CAN_MESSAGE_BYTE_SIZE] = {0x00, 0x12, 0x34};
fail_unless(isotp_receive_can_frame(&SHIMS, &HANDLE, 0x2a, data, 3));
IsoTpMessage message = isotp_receive_can_frame(&SHIMS, &HANDLE, 0x2a, data, 3);
fail_unless(message.completed);
fail_unless(message_was_received);
ck_assert_int_eq(last_message_received_arb_id, 0x2a);
ck_assert_int_eq(last_message_received_payload_size, 0);
@ -55,7 +58,8 @@ END_TEST
START_TEST (test_receive_single_frame)
{
const uint8_t data[CAN_MESSAGE_BYTE_SIZE] = {0x02, 0x12, 0x34};
fail_unless(isotp_receive_can_frame(&SHIMS, &HANDLE, 0x2a, data, 3));
IsoTpMessage message = isotp_receive_can_frame(&SHIMS, &HANDLE, 0x2a, data, 3);
fail_unless(message.completed);
fail_unless(message_was_received);
ck_assert_int_eq(last_message_received_arb_id, 0x2a);
ck_assert_int_eq(last_message_received_payload_size, 2);