OBD II library

Dependents:   Car_test

Committer:
okini3939
Date:
Wed Dec 20 07:20:57 2017 +0000
Revision:
0:804498f871bc
1st build;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:804498f871bc 1 #include "mbed.h"
okini3939 0:804498f871bc 2 #include "OBD2.h"
okini3939 0:804498f871bc 3
okini3939 0:804498f871bc 4 OBD2::OBD2 (PinName rd, PinName td, int speed) : _can(rd, td) {
okini3939 0:804498f871bc 5 _can.frequency(speed);
okini3939 0:804498f871bc 6 _can.attach(this, &OBD2::isrRecv, CAN::RxIrq);
okini3939 0:804498f871bc 7 }
okini3939 0:804498f871bc 8
okini3939 0:804498f871bc 9 void OBD2::isrRecv () {
okini3939 0:804498f871bc 10 int i;
okini3939 0:804498f871bc 11 CANMessage msg;
okini3939 0:804498f871bc 12
okini3939 0:804498f871bc 13 if (_can.read(msg)) {
okini3939 0:804498f871bc 14 printf(" id=%03x, type=%02x, format=%02x, len=%d \r\n", msg.id, msg.type, msg.format, msg.len);
okini3939 0:804498f871bc 15 for (i = 0; i < 6; i ++) {
okini3939 0:804498f871bc 16 printf(" %02x", msg.data[i]);
okini3939 0:804498f871bc 17 }
okini3939 0:804498f871bc 18 printf("\r\n");
okini3939 0:804498f871bc 19
okini3939 0:804498f871bc 20 if (msg.id == PID_REPLY && msg.data[1] == 0x41) {
okini3939 0:804498f871bc 21 if (msg.data[2] == _pid && !_received) {
okini3939 0:804498f871bc 22 for (i = 0; i < msg.data[0] - 2 && i < 5; i ++) {
okini3939 0:804498f871bc 23 _data[i] = msg.data[i + 3];
okini3939 0:804498f871bc 24 }
okini3939 0:804498f871bc 25 _received = 1;
okini3939 0:804498f871bc 26 }
okini3939 0:804498f871bc 27 }
okini3939 0:804498f871bc 28 }
okini3939 0:804498f871bc 29 }
okini3939 0:804498f871bc 30
okini3939 0:804498f871bc 31 int OBD2::request (int pid) {
okini3939 0:804498f871bc 32 int i;
okini3939 0:804498f871bc 33 CANMessage msg;
okini3939 0:804498f871bc 34
okini3939 0:804498f871bc 35 msg.id = PID_REQUEST_ALL;
okini3939 0:804498f871bc 36 msg.len = 8;
okini3939 0:804498f871bc 37 msg.data[0] = 0x02; // len
okini3939 0:804498f871bc 38 msg.data[1] = 0x01; // mode: Show current data
okini3939 0:804498f871bc 39 msg.data[2] = pid;
okini3939 0:804498f871bc 40 for (i = 3; i < 8; i ++) {
okini3939 0:804498f871bc 41 msg.data[i] = 0;
okini3939 0:804498f871bc 42 }
okini3939 0:804498f871bc 43
okini3939 0:804498f871bc 44 _pid = pid;
okini3939 0:804498f871bc 45 _received = 0;
okini3939 0:804498f871bc 46 if (_can.write(msg)) {
okini3939 0:804498f871bc 47 return 0;
okini3939 0:804498f871bc 48 }
okini3939 0:804498f871bc 49 return -1;
okini3939 0:804498f871bc 50 }
okini3939 0:804498f871bc 51
okini3939 0:804498f871bc 52 float OBD2::read () {
okini3939 0:804498f871bc 53 float f = 0;
okini3939 0:804498f871bc 54 Timer t;
okini3939 0:804498f871bc 55
okini3939 0:804498f871bc 56 t.start();
okini3939 0:804498f871bc 57 while (!_received) {
okini3939 0:804498f871bc 58 if (t.read_ms() > 500) return 0;
okini3939 0:804498f871bc 59 }
okini3939 0:804498f871bc 60 printf(" %dms\r\n", t.read_ms());
okini3939 0:804498f871bc 61
okini3939 0:804498f871bc 62 switch (_pid) {
okini3939 0:804498f871bc 63 case ENGINE_LOAD:
okini3939 0:804498f871bc 64 case THROTTLE:
okini3939 0:804498f871bc 65 case FUEL_LEVEL:
okini3939 0:804498f871bc 66 f = _data[0] / 255.0 * 100; // %
okini3939 0:804498f871bc 67 break;
okini3939 0:804498f871bc 68 case ENGINE_COOLANT_TEMP:
okini3939 0:804498f871bc 69 case INTAKE_TEMP:
okini3939 0:804498f871bc 70 case AMB_AIR_TEMP:
okini3939 0:804498f871bc 71 f = _data[0] - 40; // Deg C
okini3939 0:804498f871bc 72 break;
okini3939 0:804498f871bc 73 case INTAKE_PRESSURE:
okini3939 0:804498f871bc 74 f = _data[0]; // kPa
okini3939 0:804498f871bc 75 break;
okini3939 0:804498f871bc 76 case ENGINE_RPM:
okini3939 0:804498f871bc 77 f = ((_data[0] << 8) | _data[1]) / 4.0; // rpm
okini3939 0:804498f871bc 78 break;
okini3939 0:804498f871bc 79 case VEHICLE_SPEED:
okini3939 0:804498f871bc 80 f = _data[0]; // km/h
okini3939 0:804498f871bc 81 break;
okini3939 0:804498f871bc 82 }
okini3939 0:804498f871bc 83 return f;
okini3939 0:804498f871bc 84 }