Extremely simple OBDII library
Dependents: DodgeRadioEmulatorv30
OBDII.cpp@1:5605f12d5b16, 2013-01-01 (annotated)
- Committer:
- rtgree01
- Date:
- Tue Jan 01 03:51:44 2013 +0000
- Revision:
- 1:5605f12d5b16
- Parent:
- 0:7ec2509aa78c
OBD2 disabled; changed rate of output can messages
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rtgree01 | 0:7ec2509aa78c | 1 | #include "mbed.h" |
rtgree01 | 0:7ec2509aa78c | 2 | #include "OBDII.h" |
rtgree01 | 0:7ec2509aa78c | 3 | |
rtgree01 | 0:7ec2509aa78c | 4 | OBDII::OBDII(CAN *c, DigitalOut *rs, int can_speed) { |
rtgree01 | 0:7ec2509aa78c | 5 | can = c; |
rtgree01 | 0:7ec2509aa78c | 6 | canRS = rs; |
rtgree01 | 0:7ec2509aa78c | 7 | *canRS = 0; |
rtgree01 | 0:7ec2509aa78c | 8 | |
rtgree01 | 0:7ec2509aa78c | 9 | can->frequency(can_speed); |
rtgree01 | 0:7ec2509aa78c | 10 | data.mafSensor = -1; |
rtgree01 | 0:7ec2509aa78c | 11 | data.speed = -1; |
rtgree01 | 0:7ec2509aa78c | 12 | |
rtgree01 | 0:7ec2509aa78c | 13 | HostSock = new UDPSock(new Host(IpAddr(), 20000, NULL), 64, this); |
rtgree01 | 1:5605f12d5b16 | 14 | statusHost = new Host(IpAddr(224,1,2,3), 21000, NULL); //Join multicast group on port 50000 |
rtgree01 | 0:7ec2509aa78c | 15 | |
rtgree01 | 0:7ec2509aa78c | 16 | CANTimer.start(); |
rtgree01 | 0:7ec2509aa78c | 17 | done = true; |
rtgree01 | 0:7ec2509aa78c | 18 | mode = 0; |
rtgree01 | 0:7ec2509aa78c | 19 | } |
rtgree01 | 0:7ec2509aa78c | 20 | |
rtgree01 | 0:7ec2509aa78c | 21 | void OBDII::UpdateData(void) { |
rtgree01 | 0:7ec2509aa78c | 22 | readCAN(); |
rtgree01 | 0:7ec2509aa78c | 23 | |
rtgree01 | 0:7ec2509aa78c | 24 | if (CANTimer.read_ms() > 200) { |
rtgree01 | 0:7ec2509aa78c | 25 | done = true; |
rtgree01 | 0:7ec2509aa78c | 26 | } |
rtgree01 | 0:7ec2509aa78c | 27 | |
rtgree01 | 0:7ec2509aa78c | 28 | if (done) { |
rtgree01 | 0:7ec2509aa78c | 29 | CANTimer.reset(); |
rtgree01 | 0:7ec2509aa78c | 30 | mode++; |
rtgree01 | 0:7ec2509aa78c | 31 | |
rtgree01 | 0:7ec2509aa78c | 32 | switch (mode) { |
rtgree01 | 0:7ec2509aa78c | 33 | case 0: |
rtgree01 | 0:7ec2509aa78c | 34 | currentRequest_ = VEHICLE_SPEED; |
rtgree01 | 0:7ec2509aa78c | 35 | request(VEHICLE_SPEED); |
rtgree01 | 0:7ec2509aa78c | 36 | break; |
rtgree01 | 0:7ec2509aa78c | 37 | |
rtgree01 | 0:7ec2509aa78c | 38 | case 1: |
rtgree01 | 0:7ec2509aa78c | 39 | request(MAF_SENSOR); |
rtgree01 | 0:7ec2509aa78c | 40 | break; |
rtgree01 | 0:7ec2509aa78c | 41 | |
rtgree01 | 0:7ec2509aa78c | 42 | case 2: |
rtgree01 | 0:7ec2509aa78c | 43 | request(FUEL_LEVEL); |
rtgree01 | 0:7ec2509aa78c | 44 | break; |
rtgree01 | 0:7ec2509aa78c | 45 | |
rtgree01 | 0:7ec2509aa78c | 46 | case 3: |
rtgree01 | 0:7ec2509aa78c | 47 | request(ENGINE_RPM); |
rtgree01 | 0:7ec2509aa78c | 48 | break; |
rtgree01 | 0:7ec2509aa78c | 49 | |
rtgree01 | 0:7ec2509aa78c | 50 | case 4: |
rtgree01 | 0:7ec2509aa78c | 51 | request(ENGINE_COOLANT_TEMP); |
rtgree01 | 0:7ec2509aa78c | 52 | break; |
rtgree01 | 0:7ec2509aa78c | 53 | |
rtgree01 | 0:7ec2509aa78c | 54 | case 5: |
rtgree01 | 0:7ec2509aa78c | 55 | request(THROTTLE); |
rtgree01 | 0:7ec2509aa78c | 56 | break; |
rtgree01 | 0:7ec2509aa78c | 57 | |
rtgree01 | 0:7ec2509aa78c | 58 | case 6: |
rtgree01 | 0:7ec2509aa78c | 59 | request(O2_VOLTAGE); |
rtgree01 | 0:7ec2509aa78c | 60 | mode = 0; |
rtgree01 | 0:7ec2509aa78c | 61 | break; |
rtgree01 | 0:7ec2509aa78c | 62 | } |
rtgree01 | 0:7ec2509aa78c | 63 | } |
rtgree01 | 0:7ec2509aa78c | 64 | } |
rtgree01 | 0:7ec2509aa78c | 65 | |
rtgree01 | 0:7ec2509aa78c | 66 | void OBDII::request(unsigned char pid) { |
rtgree01 | 0:7ec2509aa78c | 67 | char can_msg[8]; |
rtgree01 | 0:7ec2509aa78c | 68 | |
rtgree01 | 0:7ec2509aa78c | 69 | can_msg[0] = 0x02; |
rtgree01 | 0:7ec2509aa78c | 70 | can_msg[1] = 0x01; |
rtgree01 | 0:7ec2509aa78c | 71 | can_msg[2] = pid; |
rtgree01 | 0:7ec2509aa78c | 72 | can_msg[3] = 0; |
rtgree01 | 0:7ec2509aa78c | 73 | can_msg[4] = 0; |
rtgree01 | 0:7ec2509aa78c | 74 | can_msg[5] = 0; |
rtgree01 | 0:7ec2509aa78c | 75 | can_msg[6] = 0; |
rtgree01 | 0:7ec2509aa78c | 76 | can_msg[7] = 0; |
rtgree01 | 0:7ec2509aa78c | 77 | |
rtgree01 | 0:7ec2509aa78c | 78 | if (can->write(CANMessage(PID_REQUEST, can_msg, 8))) { |
rtgree01 | 0:7ec2509aa78c | 79 | } |
rtgree01 | 0:7ec2509aa78c | 80 | |
rtgree01 | 0:7ec2509aa78c | 81 | done = false; |
rtgree01 | 0:7ec2509aa78c | 82 | } |
rtgree01 | 0:7ec2509aa78c | 83 | |
rtgree01 | 0:7ec2509aa78c | 84 | void OBDII::EnhancedRequest(unsigned short pid) { |
rtgree01 | 0:7ec2509aa78c | 85 | char can_msg[8]; |
rtgree01 | 0:7ec2509aa78c | 86 | |
rtgree01 | 0:7ec2509aa78c | 87 | can_msg[0] = 0x03; |
rtgree01 | 0:7ec2509aa78c | 88 | can_msg[1] = 0x22; |
rtgree01 | 0:7ec2509aa78c | 89 | can_msg[2] = (unsigned char)((pid &0xFF00) >> 8); |
rtgree01 | 0:7ec2509aa78c | 90 | can_msg[3] = (unsigned char)((pid &0x00FF)); |
rtgree01 | 0:7ec2509aa78c | 91 | can_msg[4] = 0; |
rtgree01 | 0:7ec2509aa78c | 92 | can_msg[5] = 0; |
rtgree01 | 0:7ec2509aa78c | 93 | can_msg[6] = 0; |
rtgree01 | 0:7ec2509aa78c | 94 | can_msg[7] = 0; |
rtgree01 | 0:7ec2509aa78c | 95 | |
rtgree01 | 0:7ec2509aa78c | 96 | if (can->write(CANMessage(PID_ENHANCED_REQUEST, can_msg, 8))) { |
rtgree01 | 0:7ec2509aa78c | 97 | } |
rtgree01 | 0:7ec2509aa78c | 98 | |
rtgree01 | 0:7ec2509aa78c | 99 | done = false; |
rtgree01 | 0:7ec2509aa78c | 100 | } |
rtgree01 | 0:7ec2509aa78c | 101 | |
rtgree01 | 0:7ec2509aa78c | 102 | void OBDII::readCAN() |
rtgree01 | 0:7ec2509aa78c | 103 | { |
rtgree01 | 0:7ec2509aa78c | 104 | CANMessage can_MsgRx; |
rtgree01 | 0:7ec2509aa78c | 105 | |
rtgree01 | 0:7ec2509aa78c | 106 | while (can->read(can_MsgRx)) |
rtgree01 | 0:7ec2509aa78c | 107 | { |
rtgree01 | 0:7ec2509aa78c | 108 | if (can_MsgRx.id == PID_REPLY) |
rtgree01 | 0:7ec2509aa78c | 109 | { |
rtgree01 | 0:7ec2509aa78c | 110 | done = true; |
rtgree01 | 0:7ec2509aa78c | 111 | |
rtgree01 | 0:7ec2509aa78c | 112 | if (can_MsgRx.data[0] == 3) |
rtgree01 | 0:7ec2509aa78c | 113 | { |
rtgree01 | 0:7ec2509aa78c | 114 | switch (can_MsgRx.data[2]) |
rtgree01 | 0:7ec2509aa78c | 115 | { |
rtgree01 | 0:7ec2509aa78c | 116 | case ENGINE_RPM: |
rtgree01 | 0:7ec2509aa78c | 117 | data.rpm = (int)(((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/4); |
rtgree01 | 0:7ec2509aa78c | 118 | printf("OBD RPM = %d\n\r", data.rpm); |
rtgree01 | 0:7ec2509aa78c | 119 | break; |
rtgree01 | 0:7ec2509aa78c | 120 | |
rtgree01 | 0:7ec2509aa78c | 121 | case ENGINE_COOLANT_TEMP: |
rtgree01 | 0:7ec2509aa78c | 122 | data.coolantTemp = (int)(can_MsgRx.data[3] * 0.621371192); |
rtgree01 | 0:7ec2509aa78c | 123 | printf("OBD Coolant Temp = %d\n\r", data.coolantTemp); |
rtgree01 | 0:7ec2509aa78c | 124 | break; |
rtgree01 | 0:7ec2509aa78c | 125 | |
rtgree01 | 0:7ec2509aa78c | 126 | case MAF_SENSOR: |
rtgree01 | 0:7ec2509aa78c | 127 | data.mafSensor = (int)(((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/100); |
rtgree01 | 0:7ec2509aa78c | 128 | printf("OBD MAF Sensor = %d\n\r", data.mafSensor); |
rtgree01 | 0:7ec2509aa78c | 129 | break; |
rtgree01 | 0:7ec2509aa78c | 130 | |
rtgree01 | 0:7ec2509aa78c | 131 | case O2_VOLTAGE: |
rtgree01 | 0:7ec2509aa78c | 132 | data.o2Voltage = (int)(can_MsgRx.data[3]*0.005); |
rtgree01 | 0:7ec2509aa78c | 133 | printf("OBD O2 Voltage = %d\n\r", data.o2Voltage); |
rtgree01 | 0:7ec2509aa78c | 134 | break; |
rtgree01 | 0:7ec2509aa78c | 135 | |
rtgree01 | 0:7ec2509aa78c | 136 | case THROTTLE: // |
rtgree01 | 0:7ec2509aa78c | 137 | data.throttle = (int) ((can_MsgRx.data[3]*100)/255); |
rtgree01 | 0:7ec2509aa78c | 138 | printf("OBD Throttle = %d\n\r", data.throttle); |
rtgree01 | 0:7ec2509aa78c | 139 | break; |
rtgree01 | 0:7ec2509aa78c | 140 | |
rtgree01 | 0:7ec2509aa78c | 141 | case VEHICLE_SPEED: |
rtgree01 | 0:7ec2509aa78c | 142 | data.speed = (int)can_MsgRx.data[3]; |
rtgree01 | 0:7ec2509aa78c | 143 | printf("OBD Speed = %d\n\r", data.speed); |
rtgree01 | 0:7ec2509aa78c | 144 | break; |
rtgree01 | 0:7ec2509aa78c | 145 | |
rtgree01 | 0:7ec2509aa78c | 146 | case FUEL_LEVEL: |
rtgree01 | 0:7ec2509aa78c | 147 | data.fuel = 100 * can_MsgRx.data[3] / 255; |
rtgree01 | 0:7ec2509aa78c | 148 | printf("OBD Fuel = %d\n\r", data.fuel); |
rtgree01 | 0:7ec2509aa78c | 149 | break; |
rtgree01 | 0:7ec2509aa78c | 150 | } |
rtgree01 | 0:7ec2509aa78c | 151 | } |
rtgree01 | 0:7ec2509aa78c | 152 | else if (can_MsgRx.data[0] == 4) |
rtgree01 | 0:7ec2509aa78c | 153 | { |
rtgree01 | 0:7ec2509aa78c | 154 | switch (can_MsgRx.data[2]) |
rtgree01 | 0:7ec2509aa78c | 155 | { |
rtgree01 | 0:7ec2509aa78c | 156 | case 0x0040: |
rtgree01 | 0:7ec2509aa78c | 157 | break; |
rtgree01 | 0:7ec2509aa78c | 158 | } |
rtgree01 | 0:7ec2509aa78c | 159 | } |
rtgree01 | 0:7ec2509aa78c | 160 | |
rtgree01 | 0:7ec2509aa78c | 161 | HostSock->SendTo(statusHost, sizeof(ecu_info), (char *)&data); |
rtgree01 | 0:7ec2509aa78c | 162 | } |
rtgree01 | 0:7ec2509aa78c | 163 | } |
rtgree01 | 0:7ec2509aa78c | 164 | |
rtgree01 | 0:7ec2509aa78c | 165 | if ((data.mafSensor != -1) && (data.speed != -1)) { |
rtgree01 | 0:7ec2509aa78c | 166 | float mph = 0.621371192 * data.speed; |
rtgree01 | 0:7ec2509aa78c | 167 | data.mpg = mph / (data.mafSensor * 0.0804988); |
rtgree01 | 0:7ec2509aa78c | 168 | |
rtgree01 | 0:7ec2509aa78c | 169 | printf("Current MPG = %f\n\r", data.mpg); |
rtgree01 | 0:7ec2509aa78c | 170 | } |
rtgree01 | 0:7ec2509aa78c | 171 | } |
rtgree01 | 0:7ec2509aa78c | 172 | |
rtgree01 | 0:7ec2509aa78c | 173 | void OBDII::ReceivedData(int socketStatus, int len, char *msg) |
rtgree01 | 0:7ec2509aa78c | 174 | { |
rtgree01 | 0:7ec2509aa78c | 175 | |
rtgree01 | 0:7ec2509aa78c | 176 | } |