OBD Source Code -Section 1- Without Car / Section 2 - With car
Dependencies: mbed
obd_libraries.cpp
- Committer:
- bala0x07
- Date:
- 2017-02-27
- Revision:
- 0:e36d80703ed0
- Child:
- 1:c23c05b36e33
File content as of revision 0:e36d80703ed0:
#include "mbed.h"
#include "obd_libraries.h"
#include "common_definitions.h"
Serial pco(USBTX, USBRX);
Serial OBD_UART(PA_0, PA_1);
char pass = 0;
char reception_complete = 0;
char obd_reset_cmd[] = "ATZ\r";
char battery_voltage_cmd[] = "ATRV\r";
char protocol_auto_detect_cmd[] = "ATSP0\r";
char read_CAN_protocol_cmd[] = "ATDPN\r";
char allow_long_cmd[] = "ATAL\r";
char engine_rpm_cmd[] = "010C\r";
char vehicle_speed_cmd[] = "010D\r";
char vin_number_cmd[] = "0902 5\r";
float car_battery_voltage;
long vehicle_speed;
char OBD_UART_RX_Buffer[50];
extern char OBD_RxBuffer_End_Pos;
//char OBD_UART_RX_Size = 50;
//Serial pco(USBTX, USBRX);
//Serial OBD_UART(PA_0, PA_1);
void OBD_onDataRx()
{
//pcm.printf("\r\n ENTERED \r\n");
if(OBD_UART.readable()) {
pco.putc(OBD_UART_RX_Buffer[OBD_RxBuffer_End_Pos++] = OBD_UART.getc());
/*
if(OBD_RxBuffer_End_Pos >= OBD_UART_RX_Size) {
// BUFFER OVERFLOW. What goes here depends on how you want to cope with that situation.
// For now just throw everything away.
OBD_RxBuffer_End_Pos = 0;
}
*/
}
}
//************************************************************************************************************************
void received_data_verification(char *rcv_data_pointer, char *ref_data_pointer, char num)
{
char dummy_data[num], count;
for(count = 0; count < num; count++)
{
pco.putc(*rcv_data_pointer);
if(*rcv_data_pointer++ == *ref_data_pointer++)
pass = 1;
else
{
pass = 0;
return;
}
}
}
//************************************************************************************************************************
/*
char* copy_characters(char *copy_char_pointer, char start_position, char end_position)
{
char total_num;
char count;
total_num = end_position - start_position;
char copied_data[total_num];
copy_char_pointer += start_position;
for(count = 0; count < total_num; count++)
{
copied_data[count] = *copy_char_pointer++;
}
pco.printf("\r\n%s", copied_data);
copy_char_pointer = copied_data; // Shifting the pointer to copied_data array
return copy_char_pointer;
}
*/
//************************************************************************************************************************
void process_battery_voltage(char *battery_voltage_pointer)
{
char battery_voltage_data[4]; // One decimal point precision ( For ex : 12.5 )
char count;
battery_voltage_pointer += 5; // ATRV<CR> counts to 5
for(count = 0; count < 4; count++)
{
battery_voltage_data[count] = *battery_voltage_pointer++;
}
car_battery_voltage = atof(battery_voltage_data); // Converts the Battery Volatge from String to Float data type
printf("\r\nCAR BATTERY VOLTAGE = %f",car_battery_voltage);
}
//************************************************************************************************************************
void process_vehicle_speed(char *vehicle_speed_pointer)
{
char vehicle_speed_data[2]; // Vehicle speed data is returned by a 2 byte value
char *strtol_pointer;
char count;
//"010D\r41 0D 4F\r\r>"
vehicle_speed_pointer += 11;
for(count = 0; count < 2; count++)
{
vehicle_speed_data[count] = *vehicle_speed_pointer++;
}
vehicle_speed = strtol(vehicle_speed_data, &strtol_pointer, 16);
printf("\r\nVEHICLE SPEED = %ld\r\n", vehicle_speed);
}
//************************************************************************************************************************
void fetch_battery_voltage()
{
OBD_UART.printf(battery_voltage_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, battery_voltage_cmd, (strlen(battery_voltage_cmd)-1));
process_battery_voltage(OBD_UART_RX_Buffer);
if(pass == 1)
printf("\r\nOBD READ BATTERY VOLTAGE SUCCESSFUL \r\n\r\n");
else
printf("\r\nOBD READ BATTERY VOLTAGE 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
}
//************************************************************************************************************************
void fetch_vehicle_speed()
{
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));
*/
process_vehicle_speed(virtual_rx_speed_buffer);
if(pass == 1)
printf("\r\VEHICLE 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
OBD_RxBuffer_End_Pos = 0; // Rx Buffer will be overwritten in the next data reception
}
//************************************************************************************************************************
/*
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>";
*/
/*
Chassis Number : TMBFKJ5J2CG014733
[TX] - 0902 5<CR>
[RX] - 0902 5<CR>
014 <CR>
0: 49 02 01 54 4D 42 <CR>
1: 46 4B 4A 35 4A 32 43 <CR>
2: 47 30 31 34 37 33 33 <CR>
<CR>
>
*/
/*
OBD_UART.printf(vin_number_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(vin_number_cmd)-1));
*/
//************************************************************************************************************************
/*
void check_for_dtc()
{
*/
//************************************************************************************************************************
void initialize_obd()
{
char data[3];
char *data_pointer;
data_pointer = data;
pco.baud(38400);
OBD_UART.baud(38400);
OBD_UART.attach(&OBD_onDataRx);
OBD_UART.printf("%s",obd_reset_cmd);
wait(1);
/*
pco.printf("Reception not completed");
pco.printf("\r\n%d",OBD_RxBuffer_End_Pos);
pco.printf("\r\n%c",OBD_UART_RX_Buffer[OBD_RxBuffer_End_Pos-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, obd_reset_cmd, (strlen(obd_reset_cmd)-1));
if(pass == 1)
printf("\r\nOBD RESET SUCCESSFUL \r\n\r\n");
else
printf("\r\nOBD RESET 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
//--------------------------------------------------------------------------------------------------------------------------
OBD_UART.printf(allow_long_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(allow_long_cmd)-1));
if(pass == 1)
printf("\r\nLONG DATA RECEPTION ENABLED SUCCESSFULLY \r\n\r\n");
else
printf("\r\nLONG DATA RECEPTION ENABLING 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
}
//************************************************************************************************************************