OBD II library

Dependents:   Car_test

OBD2.cpp

Committer:
okini3939
Date:
2017-12-20
Revision:
0:804498f871bc

File content as of revision 0:804498f871bc:

#include "mbed.h"
#include "OBD2.h"

OBD2::OBD2 (PinName rd, PinName td, int speed) : _can(rd, td) {
    _can.frequency(speed);
    _can.attach(this, &OBD2::isrRecv, CAN::RxIrq);
}

void OBD2::isrRecv () {
    int i;
    CANMessage msg;

    if (_can.read(msg)) {
        printf(" id=%03x, type=%02x, format=%02x, len=%d \r\n", msg.id, msg.type, msg.format, msg.len);
        for (i = 0; i < 6; i ++) {
            printf(" %02x", msg.data[i]);
        }
        printf("\r\n");

        if (msg.id == PID_REPLY && msg.data[1] == 0x41) {
            if (msg.data[2] == _pid && !_received) {
                for (i = 0; i < msg.data[0] - 2 && i < 5; i ++) {
                    _data[i] = msg.data[i + 3];
                }
                _received = 1;
            }
        }
    }
}

int OBD2::request (int pid) {
    int i;
    CANMessage msg;

    msg.id = PID_REQUEST_ALL;
    msg.len = 8;
    msg.data[0] = 0x02; // len
    msg.data[1] = 0x01; // mode: Show current data
    msg.data[2] = pid;
    for (i = 3; i < 8; i ++) {
        msg.data[i] = 0;
    }

    _pid = pid;
    _received = 0;
    if (_can.write(msg)) {
        return 0;
    }
    return -1;
}

float OBD2::read () {
    float f = 0;
    Timer t;

    t.start();
    while (!_received) {
        if (t.read_ms() > 500) return 0;
    }
    printf("  %dms\r\n", t.read_ms());

    switch (_pid) {
    case ENGINE_LOAD:
    case THROTTLE:
    case FUEL_LEVEL:
        f = _data[0] / 255.0 * 100; // %
        break;
    case ENGINE_COOLANT_TEMP:
    case INTAKE_TEMP:
    case AMB_AIR_TEMP:
        f = _data[0] - 40; // Deg C
        break;
    case INTAKE_PRESSURE:
        f = _data[0]; // kPa
        break;
    case ENGINE_RPM:
        f = ((_data[0] << 8) | _data[1]) / 4.0; // rpm
        break;
    case VEHICLE_SPEED:
        f = _data[0]; // km/h
        break;
    }
    return f;
}