Library to control Dodge LX (83.3k) CAN devices

Dependencies:   DodgeRadioLib EthernetWrapperLib OBDIILib mbed

Committer:
rtgree01
Date:
Sat Aug 20 14:20:13 2011 +0000
Revision:
0:4d16a55d0eec
Child:
1:90487a39d54e
First Rev with OBDII enabled, calculates mpg, but no transmission

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rtgree01 0:4d16a55d0eec 1 #include "mbed.h"
rtgree01 0:4d16a55d0eec 2 #include "ecu_reader.h"
rtgree01 0:4d16a55d0eec 3
rtgree01 0:4d16a55d0eec 4
rtgree01 0:4d16a55d0eec 5 // Use a timer to see if things take too long
rtgree01 0:4d16a55d0eec 6 Timer CANTimer;
rtgree01 0:4d16a55d0eec 7 namespace mbed {
rtgree01 0:4d16a55d0eec 8
rtgree01 0:4d16a55d0eec 9
rtgree01 0:4d16a55d0eec 10 ecu_reader::ecu_reader(CAN *c, int can_speed)
rtgree01 0:4d16a55d0eec 11 {
rtgree01 0:4d16a55d0eec 12 can = c;
rtgree01 0:4d16a55d0eec 13 can->frequency(can_speed);
rtgree01 0:4d16a55d0eec 14 data.mafSensor = -1;
rtgree01 0:4d16a55d0eec 15 data.speed = -1;
rtgree01 0:4d16a55d0eec 16 }
rtgree01 0:4d16a55d0eec 17
rtgree01 0:4d16a55d0eec 18 void ecu_reader::request(unsigned char pid)
rtgree01 0:4d16a55d0eec 19 {
rtgree01 0:4d16a55d0eec 20 char can_msg[8];
rtgree01 0:4d16a55d0eec 21
rtgree01 0:4d16a55d0eec 22 can_msg[0] = 0x02;
rtgree01 0:4d16a55d0eec 23 can_msg[1] = 0x01;
rtgree01 0:4d16a55d0eec 24 can_msg[2] = pid;
rtgree01 0:4d16a55d0eec 25 can_msg[3] = 0;
rtgree01 0:4d16a55d0eec 26 can_msg[4] = 0;
rtgree01 0:4d16a55d0eec 27 can_msg[5] = 0;
rtgree01 0:4d16a55d0eec 28 can_msg[6] = 0;
rtgree01 0:4d16a55d0eec 29 can_msg[7] = 0;
rtgree01 0:4d16a55d0eec 30
rtgree01 0:4d16a55d0eec 31 if (can->write(CANMessage(PID_REQUEST, can_msg, 8)))
rtgree01 0:4d16a55d0eec 32 {
rtgree01 0:4d16a55d0eec 33 }
rtgree01 0:4d16a55d0eec 34 }
rtgree01 0:4d16a55d0eec 35
rtgree01 0:4d16a55d0eec 36 void ecu_reader::readCAN()
rtgree01 0:4d16a55d0eec 37 {
rtgree01 0:4d16a55d0eec 38 CANMessage can_MsgRx;
rtgree01 0:4d16a55d0eec 39
rtgree01 0:4d16a55d0eec 40 while (can->read(can_MsgRx))
rtgree01 0:4d16a55d0eec 41 {
rtgree01 0:4d16a55d0eec 42 if (can_MsgRx.id == PID_REPLY)
rtgree01 0:4d16a55d0eec 43 {
rtgree01 0:4d16a55d0eec 44 switch (can_MsgRx.data[2])
rtgree01 0:4d16a55d0eec 45 {
rtgree01 0:4d16a55d0eec 46 case ENGINE_RPM:
rtgree01 0:4d16a55d0eec 47 data.rpm = (int)(((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/4);
rtgree01 0:4d16a55d0eec 48 break;
rtgree01 0:4d16a55d0eec 49
rtgree01 0:4d16a55d0eec 50 case ENGINE_COOLANT_TEMP:
rtgree01 0:4d16a55d0eec 51 data.coolantTemp = (int)(can_MsgRx.data[3] * 0.621371192);
rtgree01 0:4d16a55d0eec 52 break;
rtgree01 0:4d16a55d0eec 53
rtgree01 0:4d16a55d0eec 54 case MAF_SENSOR:
rtgree01 0:4d16a55d0eec 55 data.mafSensor = (int)(((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/100);
rtgree01 0:4d16a55d0eec 56 break;
rtgree01 0:4d16a55d0eec 57
rtgree01 0:4d16a55d0eec 58 case O2_VOLTAGE:
rtgree01 0:4d16a55d0eec 59 data.o2Voltage = (int)(can_MsgRx.data[3]*0.005);
rtgree01 0:4d16a55d0eec 60 break;
rtgree01 0:4d16a55d0eec 61
rtgree01 0:4d16a55d0eec 62 case THROTTLE: //
rtgree01 0:4d16a55d0eec 63 data.throttle = (int) ((can_MsgRx.data[3]*100)/255);
rtgree01 0:4d16a55d0eec 64 break;
rtgree01 0:4d16a55d0eec 65
rtgree01 0:4d16a55d0eec 66 case VEHICLE_SPEED:
rtgree01 0:4d16a55d0eec 67 data.speed = (int)can_MsgRx.data[3];
rtgree01 0:4d16a55d0eec 68 break;
rtgree01 0:4d16a55d0eec 69
rtgree01 0:4d16a55d0eec 70 case FUEL_LEVEL:
rtgree01 0:4d16a55d0eec 71 data.fuel = 100 * can_mMsgRx.data[3] / 255;
rtgree01 0:4d16a55d0eec 72 break;
rtgree01 0:4d16a55d0eec 73 }
rtgree01 0:4d16a55d0eec 74 }
rtgree01 0:4d16a55d0eec 75 }
rtgree01 0:4d16a55d0eec 76
rtgree01 0:4d16a55d0eec 77 if ((data.mafSensor != -1) && (data.speed != -1))
rtgree01 0:4d16a55d0eec 78 {
rtgree01 0:4d16a55d0eec 79 float mph = 0.621371192 * data.speed;
rtgree01 0:4d16a55d0eec 80 data.mpg = mph / (data.mafSensor * 0.0804988);
rtgree01 0:4d16a55d0eec 81
rtgree01 0:4d16a55d0eec 82 printf("Current MPG = %f\n\r", data.mpg);
rtgree01 0:4d16a55d0eec 83 }
rtgree01 0:4d16a55d0eec 84 }
rtgree01 0:4d16a55d0eec 85 }