Library to control Dodge LX (83.3k) CAN devices
Dependencies: DodgeRadioLib EthernetWrapperLib OBDIILib mbed
Diff: ecu_reader.cpp
- Revision:
- 0:4d16a55d0eec
- Child:
- 1:90487a39d54e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ecu_reader.cpp Sat Aug 20 14:20:13 2011 +0000 @@ -0,0 +1,85 @@ +#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_mMsgRx.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); + } +} +} \ No newline at end of file