Library to control Dodge LX (83.3k) CAN devices

Dependencies:   DodgeRadioLib EthernetWrapperLib OBDIILib mbed

ecu_reader.cpp

Committer:
rtgree01
Date:
2011-12-30
Revision:
1:90487a39d54e
Parent:
0:4d16a55d0eec
Child:
2:e8b13ea2881b

File content as of revision 1:90487a39d54e:

#include "mbed.h"
#include "ecu_reader.h"


// Use a timer to see if things take too long
Timer CANTimer;  
namespace mbed { 


ecu_reader::ecu_reader(CAN *c, int can_speed)
{
    can = c;
    can->frequency(can_speed);
    data.mafSensor = -1;
    data.speed = -1;
}

void ecu_reader::request(unsigned char pid)
{
    char can_msg[8];
        
    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 (can->write(CANMessage(PID_REQUEST, can_msg, 8)))
   {
   }
}

void ecu_reader::readCAN()
{   
    CANMessage can_MsgRx;

    while (can->read(can_MsgRx))
    {
        if (can_MsgRx.id == PID_REPLY)
        {
            switch (can_MsgRx.data[2])
            {
                case ENGINE_RPM:
                    data.rpm = (int)(((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/4);
                break;
                
                case ENGINE_COOLANT_TEMP:
                    data.coolantTemp =  (int)(can_MsgRx.data[3] * 0.621371192);
                break;

                case MAF_SENSOR:
                    data.mafSensor =  (int)(((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/100);
                break;
                
                case O2_VOLTAGE:
                    data.o2Voltage = (int)(can_MsgRx.data[3]*0.005);
                break;
                
                case THROTTLE:            //
                    data.throttle = (int) ((can_MsgRx.data[3]*100)/255);
                break;
                
                case VEHICLE_SPEED:
                    data.speed = (int)can_MsgRx.data[3];
                break;
                
                case FUEL_LEVEL:
                    data.fuel = 100 * can_MsgRx.data[3] / 255;
                break;
            }
        }
    }
    
    if ((data.mafSensor != -1) && (data.speed != -1))
    {
        float mph = 0.621371192 * data.speed;
        data.mpg = mph / (data.mafSensor * 0.0804988);
        
        printf("Current MPG = %f\n\r", data.mpg);
    }
}
}