Extremely simple OBDII library

Dependents:   DodgeRadioEmulatorv30

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?

UserRevisionLine numberNew 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 }