Leave payload parsing to applications using this library.
[apps/agl-service-can-low-level.git] / src / uds / uds.c
index 400eedf..1bb9ef8 100644 (file)
@@ -268,8 +268,7 @@ int diagnostic_payload_to_integer(const DiagnosticResponse* response) {
             response->payload_length * CHAR_BIT);
 }
 
-float diagnostic_decode_obd2_pid(const DiagnosticResponse* response,
-        int parsed_payload) {
+float diagnostic_decode_obd2_pid(const DiagnosticResponse* response) {
     // handles on the single number values, not the bit encoded ones
     switch(response->pid) {
         case 0xa:
@@ -305,13 +304,26 @@ float diagnostic_decode_obd2_pid(const DiagnosticResponse* response,
 void diagnostic_response_to_string(const DiagnosticResponse* response,
         char* destination, size_t destination_length) {
     int bytes_used = snprintf(destination, destination_length,
-            "arb_id: 0x%02x, mode: 0x%x, pid: 0x%x, ",
+            "arb_id: 0x%02x, mode: 0x%x, ",
             response->arbitration_id,
-            response->mode,
-            response->pid);
-    int remaining_space = destination_length - bytes_used;
+            response->mode);
+
+    if(response->has_pid) {
+        bytes_used += snprintf(destination + bytes_used,
+                destination_length - bytes_used,
+                "pid: 0x%x, ",
+                response->pid);
+    }
+
+    if(!response->success) {
+        bytes_used += snprintf(destination + bytes_used,
+                destination_length - bytes_used,
+                "nrc: 0x%x, ",
+                response->negative_response_code);
+    }
+
     if(response->payload_length > 0) {
-        snprintf(destination + bytes_used, remaining_space,
+        snprintf(destination + bytes_used, destination_length - bytes_used,
                 "payload: 0x%02x%02x%02x%02x%02x%02x%02x",
                 response->payload[0],
                 response->payload[1],
@@ -321,17 +333,25 @@ void diagnostic_response_to_string(const DiagnosticResponse* response,
                 response->payload[5],
                 response->payload[6]);
     } else {
-        snprintf(destination + bytes_used, remaining_space, "no payload");
+        snprintf(destination + bytes_used, destination_length - bytes_used,
+                "no payload");
     }
 }
 
 void diagnostic_request_to_string(const DiagnosticRequest* request,
         char* destination, size_t destination_length) {
     int bytes_used = snprintf(destination, destination_length,
-            "arb_id: 0x%02x, mode: 0x%x, pid: 0x%x, ",
+            "arb_id: 0x%02x, mode: 0x%x, ",
             request->arbitration_id,
-            request->mode,
-            request->pid);
+            request->mode);
+
+    if(request->has_pid) {
+        bytes_used += snprintf(destination + bytes_used,
+                destination_length - bytes_used,
+                "pid: 0x%x, ",
+                request->pid);
+    }
+
     int remaining_space = destination_length - bytes_used;
     if(request->payload_length > 0) {
         snprintf(destination + bytes_used, remaining_space,