Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
OBDII.cpp
- Committer:
- AliBros
- Date:
- 2011-05-02
- Revision:
- 1:4b7c280d433d
- Parent:
- 0:5b4bcf184488
File content as of revision 1:4b7c280d433d:
#include "mbed.h"
#include "OBDII.h"
#include "globals.h"
// Use a timer to see if things take too long
Timer CANTimer;
namespace mbed {
OBDII::OBDII(int can_speed) {
can2.frequency(can_speed);
}
#define TIMEOUT 200
//function to request and OBD PID which will be placed in a buffer
unsigned char OBDII::request(unsigned char pid, char *buffer) {
char can_msg[8];
float engine_data;
//forming the CAN message payload
can_msg[0] = 0x02;
can_msg[1] = 0x01;
can_msg[2] = pid;
can_msg[3] = 0;
can_msg[4] = 0;
can_msg[5] = 0;
can_msg[6] = 0;
can_msg[7] = 0;
if (can2.write(CANMessage(PID_REQUEST, can_msg, 8))) {
}
CANTimer.reset();
CANTimer.start();
while (CANTimer.read_ms() < TIMEOUT) {
if (can2.read(can_MsgRx)) {
if ((can_MsgRx.id == PID_REPLY) && (can_MsgRx.data[2] == pid)) {
switch (can_MsgRx.data[2]) {
case ENGINE_RPM: // ((A*256)+B)/4 [RPM]
engine_data = ((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/4;
sprintf(buffer,"%d",(int) engine_data);
break;
case ENGINE_COOLANT_TEMP: // A-40 [degree C]
engine_data = can_MsgRx.data[3] - 40;
sprintf(buffer,"%d",(int) engine_data);
break;
case VEHICLE_SPEED: // A [km]
engine_data = can_MsgRx.data[3];
sprintf(buffer,"%d",(int) engine_data);
break;
case MAF_SENSOR: // ((256*A)+B) / 100 [g/s]
engine_data = ((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/100;
sprintf(buffer,"%d",(int) engine_data);
break;
case O2_VOLTAGE: // A * 0.005 (B-128) * 100/128 (if B==0xFF, sensor is not used in trim calc)
engine_data = can_MsgRx.data[3]*0.005;
sprintf(buffer,"%d",(int) engine_data);
case THROTTLE: //
engine_data = (can_MsgRx.data[3]*100)/255;
sprintf(buffer,"%d",(int) engine_data);
break;
}
return 1;
}
}
}
return 0;
}
}