Library to control Dodge LX (83.3k) CAN devices
Dependencies: DodgeRadioLib EthernetWrapperLib OBDIILib mbed
ecu_reader.cpp@0:4d16a55d0eec, 2011-08-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |