Add a function to parse the entire payload as a float.
authorChristopher Peplin <chris.peplin@rhubarbtech.com>
Mon, 20 Jan 2014 21:19:01 +0000 (16:19 -0500)
committerChristopher Peplin <chris.peplin@rhubarbtech.com>
Mon, 20 Jan 2014 21:19:01 +0000 (16:19 -0500)
src/uds/uds.c
src/uds/uds.h
tests/test_core.c

index 443b05a..b3f2cda 100644 (file)
@@ -1,5 +1,6 @@
 #include <uds/uds.h>
 #include <bitfield/bitfield.h>
+#include <canutil/read.h>
 #include <string.h>
 #include <limits.h>
 #include <stddef.h>
@@ -241,3 +242,9 @@ DiagnosticResponse diagnostic_receive_can_frame(DiagnosticShims* shims,
     }
     return response;
 }
+
+float diagnostic_payload_to_float(const DiagnosticResponse* response) {
+    return bitfield_parse_float(response->payload,
+            response->payload_length, 0,
+            response->payload_length * CHAR_BIT, 1.0, 0);
+}
index 091d3c9..78f70e1 100644 (file)
@@ -83,6 +83,8 @@ DiagnosticResponse diagnostic_receive_can_frame(DiagnosticShims* shims,
         const uint16_t arbitration_id, const uint8_t data[],
         const uint8_t size);
 
+float diagnostic_payload_to_float(const DiagnosticResponse* response);
+
 /* Public: Render a DiagnosticResponse as a string into the given buffer.
  *
  * TODO implement this
index 489e174..c37656e 100644 (file)
@@ -260,6 +260,20 @@ START_TEST (test_negative_response)
 }
 END_TEST
 
+START_TEST (test_payload_to_float)
+{
+    uint16_t arb_id = OBD2_MODE_POWERTRAIN_DIAGNOSTIC_REQUEST;
+    DiagnosticRequestHandle handle = diagnostic_request_pid(&SHIMS,
+            DIAGNOSTIC_STANDARD_PID, arb_id, 0x2, response_received_handler);
+
+    fail_if(last_response_was_received);
+    const uint8_t can_data[] = {0x4, 0x1 + 0x40, 0x2, 0x45, 0x12};
+    DiagnosticResponse response = diagnostic_receive_can_frame(&SHIMS, &handle, arb_id + 0x8,
+            can_data, sizeof(can_data));
+    ck_assert_int_eq(diagnostic_payload_to_float(&response), 0x4512);
+}
+END_TEST
+
 Suite* testSuite(void) {
     Suite* s = suite_create("uds");
     TCase *tc_core = tcase_create("core");
@@ -275,6 +289,7 @@ Suite* testSuite(void) {
     tcase_add_test(tc_core, test_missing_pid);
     tcase_add_test(tc_core, test_wrong_pid_then_right_completes);
     tcase_add_test(tc_core, test_negative_response);
+    tcase_add_test(tc_core, test_payload_to_float);
 
     // TODO these are future work:
     // TODO test request MIL