summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/obd2/obd2.c14
-rw-r--r--tests/test_core.c7
2 files changed, 18 insertions, 3 deletions
diff --git a/src/obd2/obd2.c b/src/obd2/obd2.c
index 3dad886a..c780fd8c 100644
--- a/src/obd2/obd2.c
+++ b/src/obd2/obd2.c
@@ -147,6 +147,8 @@ static bool handle_positive_response(DiagnosticRequestHandle* handle,
} else {
response->pid = message->payload[PID_BYTE_INDEX];
}
+ // TODO we're not currently throwing an error or anything if the PID
+ // doesn't match - it may be OK to leave that up to the user.
}
uint8_t payload_index = 1 + handle->request.pid_length;
@@ -197,13 +199,23 @@ DiagnosticResponse diagnostic_receive_can_frame(DiagnosticShims* shims,
response.mode - MODE_RESPONSE_OFFSET,
handle->request.mode);
}
+ } else {
+ shims->log("Received an empty response on arb ID 0x%x",
+ response.arbitration_id);
}
+ // TODO For now even if we got an empty repsonse or something for
+ // the wrong mode, we're marking this as completed - I'm not sure
+ // those other cases could or will ever happen in practice.
+ // Alternatively, we could re-init handle->isotp_receive_handle if
+ // the current one completed without a valid response to this
+ // diagnostic request.
+ response.completed = true;
+ handle->completed = true;
if(handle->completed && handle->callback != NULL) {
handle->callback(&response);
}
}
-
} else {
shims->log("Mode %d request to arb ID 0x%x is already completed",
handle->request.mode, handle->request.arbitration_id);
diff --git a/tests/test_core.c b/tests/test_core.c
index cf8673ae..51dff33f 100644
--- a/tests/test_core.c
+++ b/tests/test_core.c
@@ -140,8 +140,11 @@ START_TEST (test_wrong_mode_response)
const uint8_t can_data[] = {0x4, 0x1 + 0x40, 0x0, 0x2, 0x45};
diagnostic_receive_can_frame(&SHIMS, &handle, arb_id + 0x8, can_data,
sizeof(can_data));
- fail_if(last_response_was_received);
- fail_if(handle.completed);
+ // TODO change this if we even re-request a message receipt on a mode or PID
+ // mismatch
+ fail_unless(last_response_was_received);
+ fail_unless(handle.completed);
+ fail_if(last_response_received.success);
}
END_TEST