OBD Source Code -Section 1- Without Car / Section 2 - With car
Dependencies: mbed
Diff: obd_libraries.cpp
- Revision:
- 1:c23c05b36e33
- Parent:
- 0:e36d80703ed0
- Child:
- 2:49712259aa71
--- 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
+}
+
//************************************************************************************************************************