OBD II library
Embed:
(wiki syntax)
Show/hide line numbers
OBD2.cpp
00001 #include "mbed.h" 00002 #include "OBD2.h" 00003 00004 OBD2::OBD2 (PinName rd, PinName td, int speed) : _can(rd, td) { 00005 _can.frequency(speed); 00006 _can.attach(this, &OBD2::isrRecv, CAN::RxIrq); 00007 } 00008 00009 void OBD2::isrRecv () { 00010 int i; 00011 CANMessage msg; 00012 00013 if (_can.read(msg)) { 00014 printf(" id=%03x, type=%02x, format=%02x, len=%d \r\n", msg.id, msg.type, msg.format, msg.len); 00015 for (i = 0; i < 6; i ++) { 00016 printf(" %02x", msg.data[i]); 00017 } 00018 printf("\r\n"); 00019 00020 if (msg.id == PID_REPLY && msg.data[1] == 0x41) { 00021 if (msg.data[2] == _pid && !_received) { 00022 for (i = 0; i < msg.data[0] - 2 && i < 5; i ++) { 00023 _data[i] = msg.data[i + 3]; 00024 } 00025 _received = 1; 00026 } 00027 } 00028 } 00029 } 00030 00031 int OBD2::request (int pid) { 00032 int i; 00033 CANMessage msg; 00034 00035 msg.id = PID_REQUEST_ALL; 00036 msg.len = 8; 00037 msg.data[0] = 0x02; // len 00038 msg.data[1] = 0x01; // mode: Show current data 00039 msg.data[2] = pid; 00040 for (i = 3; i < 8; i ++) { 00041 msg.data[i] = 0; 00042 } 00043 00044 _pid = pid; 00045 _received = 0; 00046 if (_can.write(msg)) { 00047 return 0; 00048 } 00049 return -1; 00050 } 00051 00052 float OBD2::read () { 00053 float f = 0; 00054 Timer t; 00055 00056 t.start(); 00057 while (!_received) { 00058 if (t.read_ms() > 500) return 0; 00059 } 00060 printf(" %dms\r\n", t.read_ms()); 00061 00062 switch (_pid) { 00063 case ENGINE_LOAD: 00064 case THROTTLE: 00065 case FUEL_LEVEL: 00066 f = _data[0] / 255.0 * 100; // % 00067 break; 00068 case ENGINE_COOLANT_TEMP: 00069 case INTAKE_TEMP: 00070 case AMB_AIR_TEMP: 00071 f = _data[0] - 40; // Deg C 00072 break; 00073 case INTAKE_PRESSURE: 00074 f = _data[0]; // kPa 00075 break; 00076 case ENGINE_RPM: 00077 f = ((_data[0] << 8) | _data[1]) / 4.0; // rpm 00078 break; 00079 case VEHICLE_SPEED: 00080 f = _data[0]; // km/h 00081 break; 00082 } 00083 return f; 00084 }
Generated on Sun Jul 24 2022 04:56:02 by 1.7.2