Qmax / Mbed 2 deprecated OBD_Accelerometer_Interface

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
bala0x07
Date:
Sun Mar 19 22:57:49 2017 +0000
Parent:
0:e36d80703ed0
Child:
2:49712259aa71
Commit message:
20-Mar-2017; Added VIN number

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
obd_libraries.cpp Show annotated file Show diff for this revision Revisions of this file
obd_libraries.h Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Mon Feb 27 06:12:23 2017 +0000
+++ b/main.cpp	Sun Mar 19 22:57:49 2017 +0000
@@ -58,6 +58,8 @@
 
 extern char obd_reset_cmd[];
 
+extern char no_of_stored_dtc;
+
 extern void OBD_onDataRx();
 extern void interrupt_sudden_jerk();
 extern void interrupt_activity_inactivity();
@@ -203,13 +205,19 @@
     
     
     pcm.printf("\r\n\r\n\t\t>>>>>------>> OBD - ACCELEROMETER INTERFACE <<------<<<<<\r\n\r\n");
-    
+    /*
     initialize_obd();                   // OBD- scan tool initialization would be done here
     
     fetch_battery_voltage();            // OBD - section
     
     fetch_vehicle_speed();
     
+    check_for_MIL();
+    
+    if(no_of_stored_dtc > 0)
+        check_for_dtc();
+    */
+    fetch_vin_number();
     //initialize_accelerometer();         // All Accerometer configurations will be done here
     
     //while(1);                           // Wait forever, let the ISR do the rest
--- a/obd_libraries.cpp	Mon Feb 27 06:12:23 2017 +0000
+++ b/obd_libraries.cpp	Sun Mar 19 22:57:49 2017 +0000
@@ -16,6 +16,10 @@
 char engine_rpm_cmd[]           =   "010C\r";
 char vehicle_speed_cmd[]        =   "010D\r";
 char vin_number_cmd[]           =   "0902 5\r";
+char check_dtc_cmd[]            =   "03\r";
+char check_mil_cmd[]            =   "0101\r";
+
+char no_of_stored_dtc;
 
 float car_battery_voltage;
 long vehicle_speed;
@@ -118,11 +122,179 @@
     
     vehicle_speed =  strtol(vehicle_speed_data, &strtol_pointer, 16);
     
-    printf("\r\nVEHICLE SPEED = %ld\r\n", vehicle_speed);
+    printf("\r\nVEHICLE SPEED = %ld", vehicle_speed);
+}
+
+//************************************************************************************************************************
+
+void process_mil_data(char *mil_data_pointer)
+{
+    char mil_data[2], mil_data_converted;
+    char count;
+    
+    // char virtual_mil_buffer = "0101\r41 01 00 04 60 00 \r\r";
+    mil_data_pointer += 11;
+    
+    for(count = 0; count < 2; count++)
+    {
+        mil_data[count] = *mil_data_pointer++;
+    }
+    
+    mil_data_converted = (((mil_data[0] - 0x30)<<4) + (mil_data[1] - 0x30)); // Converting the ASCII data to the Hex data
+    
+    // The following code lines checks for the number of Mal function indicator lamp enabled by tghe CAN ECU
+    
+    if(mil_data_converted & 0x80) // Checks for the MSB bit enabled or not which inc=dicates that the MIL is On or NOT
+    {
+        pco.printf("\r\nMIL (MALFUNCTION INDICATOR LAMP) IS ON");
+        no_of_stored_dtc = (mil_data_converted & 0b01111111);
+        pco.printf("\r\n NO OF STORED DYNAMIC TROUBLE CODE = %d", no_of_stored_dtc);
+    }
+    else
+        pco.printf("\r\nMIL (MALFUNCTION INDICATOR LAMP) IS OFF");
 }
 
 //************************************************************************************************************************
 
+void process_dtc_data(char *dtc_data_pointer)   // Incomplete Code block
+{
+/*
+     char i;
+     for(i = 0; i<14; i++)
+     {
+         pco.printf("\r\nData = %c", *(dtc_data_pointer+i));
+     }
+*/     
+     // char virtual_dtc_buffer[] = "03\r43 00 85\r\r>";
+     char count1, count2, count_bytes = 0; 
+     //char dtc_data_raw[5];
+     char dtc_data[2];                  // Since each DTC needs 2 bytes to make the code
+     //pco.printf("\r\n String Length = %d", strlen(dtc_data_pointer));
+     dtc_data_pointer += 6;             // Neglecting the preceding data to scroll to the actual data having some meaning 
+     
+     //char dtc_codes[no_of_stored_dtc * 5]; // Since each DTC requires 5 characters to display
+     
+     char dtc_codes[5];
+     
+     //pco.printf("\r\n String Length = %d", strlen(dtc_data_pointer));
+     for(count1 = 0; count1 < (strlen(dtc_data_pointer)); count1++)
+     {
+         
+         if(*(dtc_data_pointer + count1) != '\r'){
+            count_bytes++;
+            pco.printf("\r\nData = %c Count Bytes = %d", *(dtc_data_pointer+count1), count_bytes); }   // To be commented
+         else
+            break;
+     }
+     pco.printf("\r\nDATA POINTER POINTING TO : %c", *dtc_data_pointer);
+     //pco.printf("\r\nCount Bytes = %d", count_bytes);   // To be commented
+/*
+
+FORMULA:
+t = total bytes of returned data
+n = no of dtc
+
+t = 2n + (n -1) , where (n-1) indicates the added spaces between two bytes
+t = 3n -1
+
+Therefore, n = (t + 1) / 3
+     
+*/  
+     if(((count_bytes + 1)/3) == no_of_stored_dtc)
+        pco.printf("\r\nNO OF STORED DTC MATCHES WITH THE DTC CODE RETURNED");
+     else
+        pco.printf("\r\nNO OF STORED DTC DOESNT MATCH WITH THE DTC DATA RETURNED");
+    
+     pco.printf("\r\n %d", ((*dtc_data_pointer) - 0x30)); dtc_data_pointer++;
+     pco.printf("\r\n %d", ((*dtc_data_pointer) - 0x30)); dtc_data_pointer++;
+     pco.printf("\r\n %d", ((*dtc_data_pointer) - 0x30)); dtc_data_pointer++;
+     pco.printf("\r\n %d", ((*dtc_data_pointer) - 0x30)); dtc_data_pointer++;
+     pco.printf("\r\n %d", ((*dtc_data_pointer) - 0x30));
+     
+     dtc_data_pointer -= 4;
+     
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//                VERIFIED UPTO THIS LEVEL      
+
+ for(count1 = 0; count1 < no_of_stored_dtc; count1++)
+     {
+         for(count2 = 0; count2 < 2; count2++)
+         {
+            //dtc_data[count1] = (*(dtc_data_pointer + count1)) - 0x30; // Converts to integer and stores in dtc_data
+            dtc_data[count1] = *dtc_data_pointer++;
+            pco.printf("\r\nData = %c", dtc_data[count1]);
+         }
+         char a[2];
+         a[0] = 'B';
+         a[1] = 'G';
+         pco.printf("\r\nData = %s", a);
+         //dtc_data_pointer += 2;
+         dtc_data_pointer++;
+
+
+/*     
+     for(count1 = 0; count1 < no_of_stored_dtc; count1++)
+     {
+         for(count2 = 0; count2 < 3; count2++)
+         {
+            if((*(dtc_data_pointer + count1)) != ' ') {
+                dtc_data[count1] = (*(dtc_data_pointer + count1)) - 0x30; // Converts to integer and stores in dtc_data
+                pco.printf("\r\nData = %c", *(dtc_data_pointer + count1)); }
+            else {
+                dtc_data_pointer += 3;
+                break; }
+         }
+*/  
+     
+/*
+     for(count1 = 0; count1 < count_bytes; count1++)
+        pco.printf("\r\n DTC Bytes = %c+%d", *dtc_data_pointer, (*(dtc_data_pointer++) - 0x30));
+     
+     // The following lines of code copy the data pointed by dtc_data_pointer to the dtc_data array
+     for(count1= 0; count1 < no_of_stored_dtc; count1++)
+     {
+         for(count2 = 0; count2 < 2; count2++)
+         {
+            dtc_data[count2] = *(dtc_data_pointer + count2);
+         }
+         pco.printf("\r\nDTC DATA >>>> %c", dtc_data[1]);
+         dtc_data_pointer += 1; // To skip the space present between two DTC data
+*/         
+         switch((dtc_data[0] & 0x11000000) >> 6)
+         {
+             case 0:
+             dtc_codes[count1*5] = 'P';
+             break;
+             
+             case 1:
+             dtc_codes[count1*5] = 'C';
+             break;
+             
+             case 2:
+             dtc_codes[count1*5] = 'B';
+             break;
+             
+             case 3:
+             dtc_codes[count1*5] = 'U';
+             break;
+         }
+         
+//         dtc_codes[(count1*5)+1] = (((dtc_data[0] & 0b00110000) >> 4) + 0x30); 
+//         dtc_codes[(count1*5)+2] = ((dtc_data[0] & 0b00001111) + 0x30);
+//         dtc_codes[(count1*5)+3] = (((dtc_data[1] & 0b11110000) >> 4) + 0x30);
+//         dtc_codes[(count1*5)+4] = ((dtc_data[1] & 0b00001111) + 0x30);
+         dtc_codes[1] = (((dtc_data[0] & 0b00110000) >> 4) + 0x30); 
+         dtc_codes[2] = ((dtc_data[0] & 0b00001111) + 0x30);
+         dtc_codes[3] = (((dtc_data[1] & 0b11110000) >> 4) + 0x30);
+         dtc_codes[4] = ((dtc_data[1] & 0b00001111) + 0x30);
+         
+         pco.printf("\r\n DTC CODE NO %d : %s", count1+1, dtc_codes);    
+         
+     }   
+}
+
+
+//************************************************************************************************************************
 
 void fetch_battery_voltage()
 {
@@ -146,18 +318,18 @@
 
 void fetch_vehicle_speed()
 {
-    char virtual_rx_speed_buffer[] = "010D\r41 0D 4F\r\r>";     
+    char virtual_rx_speed_buffer[] = "010D\r41 0D 4F \r\r>";     
     /*
     OBD_UART.printf(vehicle_speed_cmd);
     wait(1);
     while(!(OBD_UART_RX_Buffer[OBD_RxBuffer_End_Pos-1] == '>'));        // Waits here until the reception complete flag has been enabled
     pco.printf("Reception Complete\r\n");
-    received_data_verification(OBD_UART_RX_Buffer, allow_long_cmd, (strlen(vehicle_speed_cmd)-1));
+    received_data_verification(OBD_UART_RX_Buffer, vehicle_speed_cmd, (strlen(vehicle_speed_cmd)-1));
     */
     process_vehicle_speed(virtual_rx_speed_buffer);
 
     if(pass == 1)
-        printf("\r\VEHICLE SPEED DATA RECEIVED SUCCESSFULLY \r\n\r\n");
+        printf("\r\nVEHICLE SPEED DATA RECEIVED SUCCESSFULLY \r\n\r\n");
     else
         printf("\r\nVEHICLE SPEED DATA RECEPTION FAILED\r\n\r\n");
     reception_complete = 0;     // Disabling the reception complete flag
@@ -166,11 +338,60 @@
 }  
 
 //************************************************************************************************************************
-/*
+
 void fetch_vin_number()
 {
     char virtual_rx_vin_buffer[] = "0902 5\r014 \r0: 49 02 01 54 4D 42 \r1: 46 4B 4A 35 4A 32 43 \r2: 47 30 31 34 37 33 33 \r\r>"; 
-    */
+    char vin_buffer[100], count;
+    char *vin_data_pointer;
+    char internal_counter = 0;
+    char small_buffer[2];
+    long ascii_converted_data;
+    char *vin_conv_pointer;
+    char vin_number[17];
+    
+    vin_data_pointer = virtual_rx_vin_buffer;
+    vin_data_pointer += 23;
+    
+    int length;
+    for(count = 0; count < (strlen(virtual_rx_vin_buffer) - 1); count++)
+    {
+        if((*vin_data_pointer == '\r') | (*vin_data_pointer == ' ') | (*vin_data_pointer == '>'))
+        {
+            printf("\r\ncount1 = %c", *vin_data_pointer); 
+            vin_data_pointer++;
+            continue;
+        }
+        else if(*(vin_data_pointer + 1) == ':')
+        {
+            vin_data_pointer += 2;
+            continue;
+        }
+        else
+        {
+            printf("\r\ncount2 = %d", count); 
+            vin_buffer[internal_counter] = *vin_data_pointer;
+            internal_counter++;
+        }
+        vin_data_pointer++;
+    }
+    
+    length = strlen(vin_buffer);
+    printf("\r\n VIN BUFFER LENGTH = %d", length);
+    
+    printf("\r\n VIN NUMBER : %s", vin_buffer);
+    
+    internal_counter = 0;
+    
+    for(count = 0; count < strlen(vin_buffer); count+=2)
+    {
+        small_buffer[0] = vin_buffer[count];
+        small_buffer[1] = vin_buffer[count+1];
+        ascii_converted_data =  strtol(small_buffer, &vin_conv_pointer, 16);
+        vin_number[internal_counter] = ascii_converted_data;
+        internal_counter++;
+    }
+    printf("\r\n\r\nVEHICLE CHASSIS NUMBER : %s", vin_number);
     
     /*
     Chassis Number : TMBFKJ5J2CG014733
@@ -190,14 +411,75 @@
     wait(1);
     while(!(OBD_UART_RX_Buffer[OBD_RxBuffer_End_Pos-1] == '>'));        // Waits here until the reception complete flag has been enabled
     pco.printf("Reception Complete\r\n");
-    received_data_verification(OBD_UART_RX_Buffer, allow_long_cmd, (strlen(vin_number_cmd)-1));
-    */  
+    received_data_verification(OBD_UART_RX_Buffer, vin_number_cmd, (strlen(vin_number_cmd)-1));
+    */
+}
+    
+    
+
+//************************************************************************************************************************
+
+void check_for_MIL()
+{
+    char virtual_mil_buffer[] = "0101\r41 01 82 04 60 00 \r\r";
+    /*
+    OBD_UART.printf(check_mil_cmd);
+    wait(1);
+    while(!(OBD_UART_RX_Buffer[OBD_RxBuffer_End_Pos-1] == '>'));        // Waits here until the reception complete flag has been enabled
+    pco.printf("Reception Complete\r\n");
+    received_data_verification(OBD_UART_RX_Buffer, check_mil_cmd, (strlen(check_mil_cmd)-1));
+    */
+    
+    //process_dtc_data(OBD_UART_RX_Buffer);
+    process_mil_data(virtual_mil_buffer);
+    
+    if(pass == 1)
+        printf("\r\VEHICLE MIL DATA RECEIVED SUCCESSFULLY \r\n\r\n");
+    else
+        printf("\r\nVEHICLE MIL DATA RECEPTION FAILED\r\n\r\n");
+    reception_complete = 0;     // Disabling the reception complete flag
+    OBD_RxBuffer_End_Pos = 0;   // Rx Buffer will be overwritten in the next data reception
+}
+ 
 
 //************************************************************************************************************************
+
 /*
+_______________________________________________________________________________________________________________________
+
+NOTE :
+-----
+THE FOLLOWING CODE O DETERMINE THE DIAGNOSTIC TROUBLE CODE (DTC) IS BASED ON THE INTERPRETATION GIVEN IN WIKIPEDIA
+FOR THE  ISO 15765-2 PROTOCOL
+DIFFERENT INTERPRETATION METHODOLOGY IS GIVEN IN THE ELM327 DATASHEET FOR SAE PROTOCOL
+SO THESE THINGS ARE SUBJECTED TO MODIFICATION AND HAVE NOT BEEN CONFIRMED WITH THE REAL TIME DATA 
+_______________________________________________________________________________________________________________________
+
+*/
+
 void check_for_dtc()
 {
-*/    
+    char virtual_dtc_buffer[] = "03\r43 00 85\r\r>";
+    //char virtual_dtc_buffer[] = "0123456789a\rbc>";
+    /*
+    OBD_UART.printf(check_dtc_cmd);
+    wait(1);
+    while(!(OBD_UART_RX_Buffer[OBD_RxBuffer_End_Pos-1] == '>'));        // Waits here until the reception complete flag has been enabled
+    pco.printf("Reception Complete\r\n");
+    received_data_verification(OBD_UART_RX_Buffer, check_dtc_cmd, (strlen(check_dtc_cmd)-1));
+    */
+
+    //process_dtc_data(OBD_UART_RX_Buffer);
+    process_dtc_data(virtual_dtc_buffer);
+    
+    if(pass == 1)
+        printf("\r\VEHICLE DIAGNOSTIC TROUBLE CODE RECEIVED SUCCESSFULLY \r\n\r\n");
+    else
+        printf("\r\nVEHICLE DIAGNOSTIC TROUBLE CODE DATA RECEPTION FAILED\r\n\r\n");
+    reception_complete = 0;     // Disabling the reception complete flag
+    OBD_RxBuffer_End_Pos = 0;   // Rx Buffer will be overwritten in the next data reception
+}
+
 
 //************************************************************************************************************************
 
--- a/obd_libraries.h	Mon Feb 27 06:12:23 2017 +0000
+++ b/obd_libraries.h	Sun Mar 19 22:57:49 2017 +0000
@@ -3,10 +3,15 @@
 //char* copy_characters(char *copy_char_pointer, char start_position, char end_position);
 void process_battery_voltage(char *battery_voltage_pointer);
 void process_vehicle_speed(char *vehicle_speed_pointer);
+void process_dtc_data(char *dtc_data_pointer);
+void process_mil_data(char *mil_data_pointer);
+void process_dtc_data(char *dtc_data_pointer);
 void fetch_battery_voltage(void);
 void fetch_vehicle_speed(void);
 void fetch_vin_number(void);
 void check_for_dtc(void);
+void check_for_MIL(void);
+void check_for_dtc(void);
 void initialize_obd(void);