OBD II see: https://os.mbed.com/users/okini3939/notebook/obd2-can-bus/

Dependencies:   OBD2 mbed

Committer:
okini3939
Date:
Wed Dec 20 07:21:57 2017 +0000
Revision:
0:c6f40de7ab86
1st build;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:c6f40de7ab86 1 #include "mbed.h"
okini3939 0:c6f40de7ab86 2 #include "ecu_reader.h"
okini3939 0:c6f40de7ab86 3
okini3939 0:c6f40de7ab86 4 extern Serial pc;
okini3939 0:c6f40de7ab86 5
okini3939 0:c6f40de7ab86 6 // Use a timer to see if things take too long
okini3939 0:c6f40de7ab86 7 namespace mbed {
okini3939 0:c6f40de7ab86 8
okini3939 0:c6f40de7ab86 9
okini3939 0:c6f40de7ab86 10 ecu_reader::ecu_reader(PinName rd, PinName td, int can_speed) : can2(rd, td)
okini3939 0:c6f40de7ab86 11 {
okini3939 0:c6f40de7ab86 12 can2.frequency(can_speed);
okini3939 0:c6f40de7ab86 13 }
okini3939 0:c6f40de7ab86 14
okini3939 0:c6f40de7ab86 15
okini3939 0:c6f40de7ab86 16 #define TIMEOUT 200
okini3939 0:c6f40de7ab86 17 unsigned char ecu_reader::request(unsigned char pid, float *engine_data)
okini3939 0:c6f40de7ab86 18 {
okini3939 0:c6f40de7ab86 19 char can_msg[8];
okini3939 0:c6f40de7ab86 20 // float *engine_data;
okini3939 0:c6f40de7ab86 21
okini3939 0:c6f40de7ab86 22 // led1 = 1;
okini3939 0:c6f40de7ab86 23
okini3939 0:c6f40de7ab86 24 can_msg[0] = 0x02;
okini3939 0:c6f40de7ab86 25 can_msg[1] = 0x01;
okini3939 0:c6f40de7ab86 26 can_msg[2] = pid;
okini3939 0:c6f40de7ab86 27 can_msg[3] = 0;
okini3939 0:c6f40de7ab86 28 can_msg[4] = 0;
okini3939 0:c6f40de7ab86 29 can_msg[5] = 0;
okini3939 0:c6f40de7ab86 30 can_msg[6] = 0;
okini3939 0:c6f40de7ab86 31 can_msg[7] = 0;
okini3939 0:c6f40de7ab86 32
okini3939 0:c6f40de7ab86 33 if (! can2.write(CANMessage(PID_REQUEST, can_msg, 8))) {
okini3939 0:c6f40de7ab86 34 pc.printf("*********Request write failed*********\n\r");
okini3939 0:c6f40de7ab86 35 }
okini3939 0:c6f40de7ab86 36
okini3939 0:c6f40de7ab86 37 CANTimer.reset();
okini3939 0:c6f40de7ab86 38 CANTimer.start();
okini3939 0:c6f40de7ab86 39
okini3939 0:c6f40de7ab86 40 while (CANTimer.read_ms() < TIMEOUT) {
okini3939 0:c6f40de7ab86 41
okini3939 0:c6f40de7ab86 42 if (can2.read(can_MsgRx)) {
okini3939 0:c6f40de7ab86 43 pc.printf("CANTimer.read_ms(): %dms\r\n", CANTimer.read_ms());
okini3939 0:c6f40de7ab86 44 //print message id
okini3939 0:c6f40de7ab86 45 pc.printf("can_MsgRx.id: %x\r\n", can_MsgRx.id);
okini3939 0:c6f40de7ab86 46 //print length of message
okini3939 0:c6f40de7ab86 47 pc.printf("Hex: can_MsgRx.len: %x\r\n", can_MsgRx.len);
okini3939 0:c6f40de7ab86 48 //print data[2] and PID
okini3939 0:c6f40de7ab86 49 pc.printf("can_MsgRx.data[2]: %x, pid: %x\r\n", can_MsgRx.data[2], pid);
okini3939 0:c6f40de7ab86 50
okini3939 0:c6f40de7ab86 51 for (int i = 0; i < (int)can_MsgRx.len; i++) {
okini3939 0:c6f40de7ab86 52 pc.printf(" %02x", can_MsgRx.data[i]);
okini3939 0:c6f40de7ab86 53 }
okini3939 0:c6f40de7ab86 54 pc.printf("\r\n");
okini3939 0:c6f40de7ab86 55
okini3939 0:c6f40de7ab86 56 if ((can_MsgRx.id == PID_REPLY) && (can_MsgRx.data[2] == pid)) {
okini3939 0:c6f40de7ab86 57 CANTimer.stop();
okini3939 0:c6f40de7ab86 58 /* Details from http://en.wikipedia.org/wiki/OBD-II_PIDs */
okini3939 0:c6f40de7ab86 59 switch (can_MsgRx.data[2]) { /* Details from http://en.wikipedia.org/wiki/OBD-II_PIDs */
okini3939 0:c6f40de7ab86 60 case PID_0_20: // PID 0-20 Supported
okini3939 0:c6f40de7ab86 61 PID020 = ((can_MsgRx.data[3] << 24) | (can_MsgRx.data[4] << 16) | (can_MsgRx.data[5] << 8) | (can_MsgRx.data[6]));
okini3939 0:c6f40de7ab86 62 break;
okini3939 0:c6f40de7ab86 63 case STATUS_DTC: { // bit encoded
okini3939 0:c6f40de7ab86 64 if (can_MsgRx.data[4] & 0x04) { //Compression Ignition (Diesel)
okini3939 0:c6f40de7ab86 65 if (can_MsgRx.data[3] & 0x80) { //MIL Light on
okini3939 0:c6f40de7ab86 66 *engine_data = (can_MsgRx.data[3] - 128);
okini3939 0:c6f40de7ab86 67 //sprintf(buffer,"MIL ON, %d DTCs", (int) *engine_data);
okini3939 0:c6f40de7ab86 68 } else { //MIL Light off
okini3939 0:c6f40de7ab86 69 *engine_data = (can_MsgRx.data[3]);
okini3939 0:c6f40de7ab86 70 //sprintf(buffer,"MIL OFF, %d DTCs", (int) *engine_data);
okini3939 0:c6f40de7ab86 71 }
okini3939 0:c6f40de7ab86 72 // Diesel C and D bytes (can_MsgRx.data[5] and can_MsgRx.data[6])
okini3939 0:c6f40de7ab86 73 // Test available Test incomplete
okini3939 0:c6f40de7ab86 74 // Catalyst C0 D0
okini3939 0:c6f40de7ab86 75 // Heated Catalyst C1 D1
okini3939 0:c6f40de7ab86 76 // Evap System C2 D2
okini3939 0:c6f40de7ab86 77 // Secondary Air C3 D3
okini3939 0:c6f40de7ab86 78 // A/C Refrigerant C4 D4
okini3939 0:c6f40de7ab86 79 // O2 Sensor C5 D5
okini3939 0:c6f40de7ab86 80 // O2 Sensor Heater C6 D6
okini3939 0:c6f40de7ab86 81 // EGR System C7 D7
okini3939 0:c6f40de7ab86 82 } else { //Spark Ignition (Gasoline)
okini3939 0:c6f40de7ab86 83 if (can_MsgRx.data[3] & 0x80) { //MIL Light on
okini3939 0:c6f40de7ab86 84 *engine_data = (can_MsgRx.data[3] - 128);
okini3939 0:c6f40de7ab86 85 //sprintf(buffer,"MIL ON, %d DTCs", (int) *engine_data);
okini3939 0:c6f40de7ab86 86 } else { //MIL Light off
okini3939 0:c6f40de7ab86 87 *engine_data = (can_MsgRx.data[3]);
okini3939 0:c6f40de7ab86 88 //sprintf(buffer,"MIL OFF, %d DTCs", (int) *engine_data);
okini3939 0:c6f40de7ab86 89 }
okini3939 0:c6f40de7ab86 90 // Gasoline C and D bytes (can_MsgRx.data[5] and can_MsgRx.data[6])
okini3939 0:c6f40de7ab86 91 // Test available Test incomplete
okini3939 0:c6f40de7ab86 92 // NMHC Catalyst C0 D0
okini3939 0:c6f40de7ab86 93 // NOx/SCR Monitoring C1 D1
okini3939 0:c6f40de7ab86 94 // Boost Pressure C3 D3
okini3939 0:c6f40de7ab86 95 // Exhaust Gas Sensor C5 D5
okini3939 0:c6f40de7ab86 96 // Particulate Filter C6 D6
okini3939 0:c6f40de7ab86 97 // EGR and/or VVT/VTEC C7 D7
okini3939 0:c6f40de7ab86 98 }
okini3939 0:c6f40de7ab86 99 // Common Tests between Gas and Diesel Engines, byte B (can_MsgRx.data[4])
okini3939 0:c6f40de7ab86 100 // Test available Test incomplete
okini3939 0:c6f40de7ab86 101 // Misfire B0 B4
okini3939 0:c6f40de7ab86 102 // Fuel System B1 B5
okini3939 0:c6f40de7ab86 103 // Components B2 B6
okini3939 0:c6f40de7ab86 104 break;
okini3939 0:c6f40de7ab86 105 }
okini3939 0:c6f40de7ab86 106 case FREEZE_DTC: // Locks in Diagnostic trouble Codes
okini3939 0:c6f40de7ab86 107 break;
okini3939 0:c6f40de7ab86 108 case FUEL_SYS_STATUS: // bit encoded
okini3939 0:c6f40de7ab86 109 //This tells us the warmup status of the engine. Only 1 bit should be set
okini3939 0:c6f40de7ab86 110 *engine_data = can_MsgRx.data[3];
okini3939 0:c6f40de7ab86 111 if (((int) *engine_data) & 0x01) { // Open loop - Engine warmup
okini3939 0:c6f40de7ab86 112 //sprintf(buffer,"Open Loop - Warmup");
okini3939 0:c6f40de7ab86 113 }
okini3939 0:c6f40de7ab86 114 if (((int) *engine_data) & 0x02) { // Closed Loop - O2 Sensor feedback
okini3939 0:c6f40de7ab86 115 //sprintf(buffer,"Closed Loop - Normal");
okini3939 0:c6f40de7ab86 116 }
okini3939 0:c6f40de7ab86 117 if (((int) *engine_data) & 0x04) { // Open loop,
okini3939 0:c6f40de7ab86 118 //sprintf(buffer,"Open Loop-Load/Decel");
okini3939 0:c6f40de7ab86 119 }
okini3939 0:c6f40de7ab86 120 if (((int) *engine_data) & 0x08) { // Open loop - system failure
okini3939 0:c6f40de7ab86 121 //sprintf(buffer,"Open Loop - FAILURE");
okini3939 0:c6f40de7ab86 122 }
okini3939 0:c6f40de7ab86 123 if (((int) *engine_data) & 0x10) { // Closed Loop - O2 Sensor feedback failure
okini3939 0:c6f40de7ab86 124 //sprintf(buffer,"Closed Loop - O2Fail");
okini3939 0:c6f40de7ab86 125 }
okini3939 0:c6f40de7ab86 126 if ((((int) *engine_data) & 0x20) | (((int) *engine_data) & 0x40) | (((int) *engine_data) & 0x80)) { //These shouldnt be on, assume Proprietary status
okini3939 0:c6f40de7ab86 127 //sprintf(buffer,"Unsupported Status");
okini3939 0:c6f40de7ab86 128 }
okini3939 0:c6f40de7ab86 129 break;
okini3939 0:c6f40de7ab86 130 case ENGINE_LOAD: // A*100/255
okini3939 0:c6f40de7ab86 131 *engine_data = (can_MsgRx.data[3]*100)/255;
okini3939 0:c6f40de7ab86 132 //sprintf(buffer,"%d %% ",(int) *engine_data);
okini3939 0:c6f40de7ab86 133 break;
okini3939 0:c6f40de7ab86 134 case ENGINE_COOLANT_TEMP: // A-40 [degree C]
okini3939 0:c6f40de7ab86 135 *engine_data = can_MsgRx.data[3] - 40;
okini3939 0:c6f40de7ab86 136 //sprintf(buffer,"%d degC ",(int) *engine_data);
okini3939 0:c6f40de7ab86 137 break;
okini3939 0:c6f40de7ab86 138 case ST_FUEL_TRIM_1: // (A-128)*100/128
okini3939 0:c6f40de7ab86 139 *engine_data = ((can_MsgRx.data[3]-128)*(100/128));
okini3939 0:c6f40de7ab86 140 //sprintf(buffer,"%d %% ", (int) *engine_data);
okini3939 0:c6f40de7ab86 141 break;
okini3939 0:c6f40de7ab86 142 case LT_FUEL_TRIM_1: // (A-128)*100/128
okini3939 0:c6f40de7ab86 143 *engine_data = ((can_MsgRx.data[3]-128)*(100/128));
okini3939 0:c6f40de7ab86 144 //sprintf(buffer,"%d %% ", (int) *engine_data);
okini3939 0:c6f40de7ab86 145 break;
okini3939 0:c6f40de7ab86 146 case ST_FUEL_TRIM_2: // (A-128)*100/128
okini3939 0:c6f40de7ab86 147 *engine_data = ((can_MsgRx.data[3]-128)*(100/128));
okini3939 0:c6f40de7ab86 148 //sprintf(buffer,"%d %% ", (int) *engine_data);
okini3939 0:c6f40de7ab86 149 break;
okini3939 0:c6f40de7ab86 150 case LT_FUEL_TRIM_2: // (A-128)*100/128
okini3939 0:c6f40de7ab86 151 *engine_data = ((can_MsgRx.data[3]-128)*(100/128));
okini3939 0:c6f40de7ab86 152 //sprintf(buffer,"%d %% ", (int) *engine_data);
okini3939 0:c6f40de7ab86 153 break;
okini3939 0:c6f40de7ab86 154 case FUEL_PRESSURE: // A*3
okini3939 0:c6f40de7ab86 155 *engine_data = (can_MsgRx.data[3]*3);
okini3939 0:c6f40de7ab86 156 //sprintf(buffer,"%d kPa",(int) *engine_data);
okini3939 0:c6f40de7ab86 157 break;
okini3939 0:c6f40de7ab86 158 case INTAKE_PRESSURE: // A
okini3939 0:c6f40de7ab86 159 *engine_data = can_MsgRx.data[3];
okini3939 0:c6f40de7ab86 160 //sprintf(buffer,"%d kPa",(int) *engine_data);
okini3939 0:c6f40de7ab86 161 break;
okini3939 0:c6f40de7ab86 162 case ENGINE_RPM: // ((A*256)+B)/4 [RPM]
okini3939 0:c6f40de7ab86 163 *engine_data = ((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/4;
okini3939 0:c6f40de7ab86 164 //sprintf(buffer,"%d rpm ",(int) *engine_data);
okini3939 0:c6f40de7ab86 165 break;
okini3939 0:c6f40de7ab86 166 case VEHICLE_SPEED: // A [km]
okini3939 0:c6f40de7ab86 167 *engine_data = can_MsgRx.data[3];
okini3939 0:c6f40de7ab86 168 //sprintf(buffer,"%d km ",(int) *engine_data);
okini3939 0:c6f40de7ab86 169 break;
okini3939 0:c6f40de7ab86 170 case TIMING_ADVANCE: // A/2 - 64
okini3939 0:c6f40de7ab86 171 *engine_data = (can_MsgRx.data[3]/2) - 64;
okini3939 0:c6f40de7ab86 172 //sprintf(buffer,"%d Deg",(int) *engine_data);
okini3939 0:c6f40de7ab86 173 break;
okini3939 0:c6f40de7ab86 174 case INTAKE_TEMP: // A - 40
okini3939 0:c6f40de7ab86 175 *engine_data = (can_MsgRx.data[3] - 40);
okini3939 0:c6f40de7ab86 176 //sprintf(buffer,"%d DegC",(int) *engine_data);
okini3939 0:c6f40de7ab86 177 break;
okini3939 0:c6f40de7ab86 178 case MAF_SENSOR: // ((256*A)+B) / 100 [g/s]
okini3939 0:c6f40de7ab86 179 *engine_data = ((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/100;
okini3939 0:c6f40de7ab86 180 //sprintf(buffer,"%d g/s",(int) *engine_data);
okini3939 0:c6f40de7ab86 181 break;
okini3939 0:c6f40de7ab86 182 case THROTTLE: // A*100/255
okini3939 0:c6f40de7ab86 183 *engine_data = (can_MsgRx.data[3]*100)/255;
okini3939 0:c6f40de7ab86 184 //sprintf(buffer,"%d %% ",(int) *engine_data);
okini3939 0:c6f40de7ab86 185 break;
okini3939 0:c6f40de7ab86 186 case COMMANDED_SEC_AIR: // bit encoded
okini3939 0:c6f40de7ab86 187 *engine_data = can_MsgRx.data[3];
okini3939 0:c6f40de7ab86 188 if (((int) *engine_data) & 0x01) { //Upstream of Catalytic Converter
okini3939 0:c6f40de7ab86 189 //sprintf(buffer,"Upstream of Cat.");
okini3939 0:c6f40de7ab86 190 }
okini3939 0:c6f40de7ab86 191 if (((int) *engine_data) & 0x02) { //Downstream of Catalytic Converter
okini3939 0:c6f40de7ab86 192 //sprintf(buffer,"Downstream of Cat.");
okini3939 0:c6f40de7ab86 193 }
okini3939 0:c6f40de7ab86 194 if (((int) *engine_data) & 0x04) { //From outside atmosphere or off
okini3939 0:c6f40de7ab86 195 //sprintf(buffer,"Off");
okini3939 0:c6f40de7ab86 196 }
okini3939 0:c6f40de7ab86 197 break;
okini3939 0:c6f40de7ab86 198 case O2_SENS_PRES: { // A [A0..A3] == Bank 1, [A4..A7] == Bank 2
okini3939 0:c6f40de7ab86 199 *engine_data = (can_MsgRx.data[3]); //Check # of O2 sensors present by masking individual bits and counting
okini3939 0:c6f40de7ab86 200 int o2pres = 0;
okini3939 0:c6f40de7ab86 201 if (((int) *engine_data) & 0x01) { // Bank 1 Sensor 1
okini3939 0:c6f40de7ab86 202 o2pres++;
okini3939 0:c6f40de7ab86 203 }
okini3939 0:c6f40de7ab86 204 if (((int) *engine_data) & 0x02) { // Bank 1 Sensor 2
okini3939 0:c6f40de7ab86 205 o2pres++;
okini3939 0:c6f40de7ab86 206 }
okini3939 0:c6f40de7ab86 207 if (((int) *engine_data) & 0x04) { // Bank 1 Sensor 3
okini3939 0:c6f40de7ab86 208 o2pres++;
okini3939 0:c6f40de7ab86 209 }
okini3939 0:c6f40de7ab86 210 if (((int) *engine_data) & 0x08) { // Bank 1 Sensor 4
okini3939 0:c6f40de7ab86 211 o2pres++;
okini3939 0:c6f40de7ab86 212 }
okini3939 0:c6f40de7ab86 213 if (((int) *engine_data) & 0x10) { // Bank 2 Sensor 1
okini3939 0:c6f40de7ab86 214 o2pres++;
okini3939 0:c6f40de7ab86 215 }
okini3939 0:c6f40de7ab86 216 if (((int) *engine_data) & 0x20) { // Bank 2 Sensor 2
okini3939 0:c6f40de7ab86 217 o2pres++;
okini3939 0:c6f40de7ab86 218 }
okini3939 0:c6f40de7ab86 219 if (((int) *engine_data) & 0x40) { // Bank 2 Sensor 3
okini3939 0:c6f40de7ab86 220 o2pres++;
okini3939 0:c6f40de7ab86 221 }
okini3939 0:c6f40de7ab86 222 if (((int) *engine_data) & 0x80) { // Bank 2 Sensor 4
okini3939 0:c6f40de7ab86 223 o2pres++;
okini3939 0:c6f40de7ab86 224 }
okini3939 0:c6f40de7ab86 225 //sprintf(buffer,"%d Present",(int) o2pres);
okini3939 0:c6f40de7ab86 226 break;
okini3939 0:c6f40de7ab86 227 }
okini3939 0:c6f40de7ab86 228 case O2_B1S1_VOLTAGE: // A/200, (B-128) * 100/128
okini3939 0:c6f40de7ab86 229 *engine_data = (can_MsgRx.data[3]/200);
okini3939 0:c6f40de7ab86 230 //sprintf(buffer,"%d V ",(int) *engine_data); //Raw O2 Voltage
okini3939 0:c6f40de7ab86 231 if (can_MsgRx.data[4] & 0xFF) {
okini3939 0:c6f40de7ab86 232 //sprintf(buffer,"Not Present");
okini3939 0:c6f40de7ab86 233 } else {
okini3939 0:c6f40de7ab86 234 *engine_data = ((can_MsgRx.data[4]-128)*(100/128));
okini3939 0:c6f40de7ab86 235 //sprintf(buffer2,"%d %% ",(int) *engine_data); //Calculated lean/rich
okini3939 0:c6f40de7ab86 236 }
okini3939 0:c6f40de7ab86 237 break;
okini3939 0:c6f40de7ab86 238 case O2_B1S2_VOLTAGE: //
okini3939 0:c6f40de7ab86 239 *engine_data = (can_MsgRx.data[3]/200);
okini3939 0:c6f40de7ab86 240 //sprintf(buffer,"%d V ",(int) *engine_data);
okini3939 0:c6f40de7ab86 241 if (can_MsgRx.data[4] & 0xFF) {
okini3939 0:c6f40de7ab86 242 //sprintf(buffer,"Not Present");
okini3939 0:c6f40de7ab86 243 } else {
okini3939 0:c6f40de7ab86 244 *engine_data = ((can_MsgRx.data[4]-128)*(100/128));
okini3939 0:c6f40de7ab86 245 //sprintf(buffer2,"%d %% ",(int) *engine_data);
okini3939 0:c6f40de7ab86 246 }
okini3939 0:c6f40de7ab86 247 break;
okini3939 0:c6f40de7ab86 248 case O2_B1S3_VOLTAGE: //
okini3939 0:c6f40de7ab86 249 *engine_data = (can_MsgRx.data[3]/200);
okini3939 0:c6f40de7ab86 250 //sprintf(buffer,"%d V ",(int) *engine_data);
okini3939 0:c6f40de7ab86 251 if (can_MsgRx.data[4] & 0xFF) {
okini3939 0:c6f40de7ab86 252 //sprintf(buffer,"Not Present");
okini3939 0:c6f40de7ab86 253 } else {
okini3939 0:c6f40de7ab86 254 *engine_data = ((can_MsgRx.data[4]-128)*(100/128));
okini3939 0:c6f40de7ab86 255 //sprintf(buffer2,"%d %% ",(int) *engine_data);
okini3939 0:c6f40de7ab86 256 }
okini3939 0:c6f40de7ab86 257 break;
okini3939 0:c6f40de7ab86 258 case O2_B1S4_VOLTAGE: //
okini3939 0:c6f40de7ab86 259 *engine_data = (can_MsgRx.data[3]/200);
okini3939 0:c6f40de7ab86 260 //sprintf(buffer,"%d V ",(int) *engine_data);
okini3939 0:c6f40de7ab86 261 if (can_MsgRx.data[4] & 0xFF) {
okini3939 0:c6f40de7ab86 262 //sprintf(buffer,"Not Present");
okini3939 0:c6f40de7ab86 263 } else {
okini3939 0:c6f40de7ab86 264 *engine_data = ((can_MsgRx.data[4]-128)*(100/128));
okini3939 0:c6f40de7ab86 265 //sprintf(buffer2,"%d %% ",(int) *engine_data);
okini3939 0:c6f40de7ab86 266 }
okini3939 0:c6f40de7ab86 267 break;
okini3939 0:c6f40de7ab86 268 case O2_B2S1_VOLTAGE: //
okini3939 0:c6f40de7ab86 269 *engine_data = (can_MsgRx.data[3]/200);
okini3939 0:c6f40de7ab86 270 //sprintf(buffer,"%d V ",(int) *engine_data);
okini3939 0:c6f40de7ab86 271 if (can_MsgRx.data[4] & 0xFF) {
okini3939 0:c6f40de7ab86 272 //sprintf(buffer,"Not Present");
okini3939 0:c6f40de7ab86 273 } else {
okini3939 0:c6f40de7ab86 274 *engine_data = ((can_MsgRx.data[4]-128)*(100/128));
okini3939 0:c6f40de7ab86 275 //sprintf(buffer2,"%d %% ",(int) *engine_data);
okini3939 0:c6f40de7ab86 276 }
okini3939 0:c6f40de7ab86 277 break;
okini3939 0:c6f40de7ab86 278 case O2_B2S2_VOLTAGE: //
okini3939 0:c6f40de7ab86 279 *engine_data = (can_MsgRx.data[3]/200);
okini3939 0:c6f40de7ab86 280 //sprintf(buffer,"%d V ",(int) *engine_data);
okini3939 0:c6f40de7ab86 281 if (can_MsgRx.data[4] & 0xFF) {
okini3939 0:c6f40de7ab86 282 //sprintf(buffer,"Not Present");
okini3939 0:c6f40de7ab86 283 } else {
okini3939 0:c6f40de7ab86 284 *engine_data = ((can_MsgRx.data[4]-128)*(100/128));
okini3939 0:c6f40de7ab86 285 //sprintf(buffer2,"%d %% ",(int) *engine_data);
okini3939 0:c6f40de7ab86 286 }
okini3939 0:c6f40de7ab86 287 break;
okini3939 0:c6f40de7ab86 288 case O2_B2S3_VOLTAGE: { //
okini3939 0:c6f40de7ab86 289 *engine_data = (can_MsgRx.data[3]/200);
okini3939 0:c6f40de7ab86 290 //sprintf(buffer,"%d V ",(int) *engine_data);
okini3939 0:c6f40de7ab86 291 if (can_MsgRx.data[4] & 0xFF) {
okini3939 0:c6f40de7ab86 292 //sprintf(buffer,"Not Present");
okini3939 0:c6f40de7ab86 293 } else {
okini3939 0:c6f40de7ab86 294 *engine_data = ((can_MsgRx.data[4]-128)*(100/128));
okini3939 0:c6f40de7ab86 295 //sprintf(buffer2,"%d %% ",(int) *engine_data);
okini3939 0:c6f40de7ab86 296 }
okini3939 0:c6f40de7ab86 297 break;
okini3939 0:c6f40de7ab86 298 }
okini3939 0:c6f40de7ab86 299 case O2_B2S4_VOLTAGE: { //
okini3939 0:c6f40de7ab86 300 *engine_data = (can_MsgRx.data[3]/200);
okini3939 0:c6f40de7ab86 301 //sprintf(buffer,"%d V ",(int) *engine_data);
okini3939 0:c6f40de7ab86 302 if (can_MsgRx.data[4] & 0xFF) {
okini3939 0:c6f40de7ab86 303 //sprintf(buffer,"Not Present");
okini3939 0:c6f40de7ab86 304 } else {
okini3939 0:c6f40de7ab86 305 *engine_data = ((can_MsgRx.data[4]-128)*(100/128));
okini3939 0:c6f40de7ab86 306 //sprintf(buffer2,"%d %% ",(int) *engine_data);
okini3939 0:c6f40de7ab86 307 }
okini3939 0:c6f40de7ab86 308 break;
okini3939 0:c6f40de7ab86 309 }
okini3939 0:c6f40de7ab86 310 case OBDII_STANDARDS: { //bit encoded NOT DONE
okini3939 0:c6f40de7ab86 311 *engine_data = can_MsgRx.data[3];
okini3939 0:c6f40de7ab86 312 if (((int) *engine_data) & 0x0D) { //JOBD, EOBD, and OBD II
okini3939 0:c6f40de7ab86 313 //sprintf(buffer,"JOBD,EOBD,OBDII");
okini3939 0:c6f40de7ab86 314 }
okini3939 0:c6f40de7ab86 315 if (((int) *engine_data) & 0x0C) { //JOBD and EOBD
okini3939 0:c6f40de7ab86 316 //sprintf(buffer,"JOBD,EOBD");
okini3939 0:c6f40de7ab86 317 }
okini3939 0:c6f40de7ab86 318 if (((int) *engine_data) & 0x0B) { //JOBD and OBDII
okini3939 0:c6f40de7ab86 319 //sprintf(buffer,"JOBD,OBDII");
okini3939 0:c6f40de7ab86 320 }
okini3939 0:c6f40de7ab86 321 if (((int) *engine_data) & 0x0A) { //JOBD
okini3939 0:c6f40de7ab86 322 //sprintf(buffer,"JOBD");
okini3939 0:c6f40de7ab86 323 }
okini3939 0:c6f40de7ab86 324 if (((int) *engine_data) & 0x09) { //EOBD, OBD, and OBD II
okini3939 0:c6f40de7ab86 325 //sprintf(buffer,"EOBD,OBDI,OBDII");
okini3939 0:c6f40de7ab86 326 }
okini3939 0:c6f40de7ab86 327 if (((int) *engine_data) & 0x08) { //EOBD and OBD
okini3939 0:c6f40de7ab86 328 //sprintf(buffer,"EOBD,OBDI");
okini3939 0:c6f40de7ab86 329 }
okini3939 0:c6f40de7ab86 330 if (((int) *engine_data) & 0x07) { //EOBD and OBDII
okini3939 0:c6f40de7ab86 331 //sprintf(buffer,"EOBD,OBDII");
okini3939 0:c6f40de7ab86 332 }
okini3939 0:c6f40de7ab86 333 if (((int) *engine_data) & 0x06) { //EOBD
okini3939 0:c6f40de7ab86 334 //sprintf(buffer,"EOBD");
okini3939 0:c6f40de7ab86 335 }
okini3939 0:c6f40de7ab86 336 if (((int) *engine_data) & 0x05) { //Not meant to comply with any OBD standard
okini3939 0:c6f40de7ab86 337 //sprintf(buffer,"No Compliance");
okini3939 0:c6f40de7ab86 338 }
okini3939 0:c6f40de7ab86 339 if (((int) *engine_data) & 0x04) { //OBDI
okini3939 0:c6f40de7ab86 340 //sprintf(buffer,"OBDI");
okini3939 0:c6f40de7ab86 341 }
okini3939 0:c6f40de7ab86 342 if (((int) *engine_data) & 0x03) { //OBD and OBDII
okini3939 0:c6f40de7ab86 343 //sprintf(buffer,"OBDI,OBDII");
okini3939 0:c6f40de7ab86 344 }
okini3939 0:c6f40de7ab86 345 if (((int) *engine_data) & 0x02) { //OBD and defined by the EPA
okini3939 0:c6f40de7ab86 346 //sprintf(buffer,"OBD");
okini3939 0:c6f40de7ab86 347 }
okini3939 0:c6f40de7ab86 348 if (((int) *engine_data) & 0x01) { //OBD-II as defined by CARB
okini3939 0:c6f40de7ab86 349 //sprintf(buffer,"OBDII");
okini3939 0:c6f40de7ab86 350 }
okini3939 0:c6f40de7ab86 351 //sprintf(buffer,"ERROR");
okini3939 0:c6f40de7ab86 352 break;
okini3939 0:c6f40de7ab86 353 }
okini3939 0:c6f40de7ab86 354 case O2_SENS_PRES_ALT: { //*******************
okini3939 0:c6f40de7ab86 355 *engine_data = (can_MsgRx.data[3]); //Check # of O2 sensors present by masking individual bits and counting
okini3939 0:c6f40de7ab86 356 int o2presalt = 0;
okini3939 0:c6f40de7ab86 357 if (((int) *engine_data) & 0x01) { // Bank 1 Sensor 1
okini3939 0:c6f40de7ab86 358 o2presalt++;
okini3939 0:c6f40de7ab86 359 }
okini3939 0:c6f40de7ab86 360 if (((int) *engine_data) & 0x02) { // Bank 1 Sensor 2
okini3939 0:c6f40de7ab86 361 o2presalt++;
okini3939 0:c6f40de7ab86 362 }
okini3939 0:c6f40de7ab86 363 if (((int) *engine_data) & 0x04) { // Bank 2 Sensor 1
okini3939 0:c6f40de7ab86 364 o2presalt++;
okini3939 0:c6f40de7ab86 365 }
okini3939 0:c6f40de7ab86 366 if (((int) *engine_data) & 0x08) { // Bank 2 Sensor 2
okini3939 0:c6f40de7ab86 367 o2presalt++;
okini3939 0:c6f40de7ab86 368 }
okini3939 0:c6f40de7ab86 369 if (((int) *engine_data) & 0x10) { // Bank 3 Sensor 1
okini3939 0:c6f40de7ab86 370 o2presalt++;
okini3939 0:c6f40de7ab86 371 }
okini3939 0:c6f40de7ab86 372 if (((int) *engine_data) & 0x20) { // Bank 3 Sensor 2
okini3939 0:c6f40de7ab86 373 o2presalt++;
okini3939 0:c6f40de7ab86 374 }
okini3939 0:c6f40de7ab86 375 if (((int) *engine_data) & 0x40) { // Bank 4 Sensor 1
okini3939 0:c6f40de7ab86 376 o2presalt++;
okini3939 0:c6f40de7ab86 377 }
okini3939 0:c6f40de7ab86 378 if (((int) *engine_data) & 0x80) { // Bank 4 Sensor 2
okini3939 0:c6f40de7ab86 379 o2presalt++;
okini3939 0:c6f40de7ab86 380 }
okini3939 0:c6f40de7ab86 381 //sprintf(buffer,"%d Present",(int) o2presalt);
okini3939 0:c6f40de7ab86 382 break;
okini3939 0:c6f40de7ab86 383 }
okini3939 0:c6f40de7ab86 384 case AUX_IN_STATUS: { // A (A0 == PTO Active)
okini3939 0:c6f40de7ab86 385 *engine_data = can_MsgRx.data[3];
okini3939 0:c6f40de7ab86 386 if (((int) *engine_data) & 0x01) {
okini3939 0:c6f40de7ab86 387 //sprintf(buffer,"PTO Active");
okini3939 0:c6f40de7ab86 388 } else {
okini3939 0:c6f40de7ab86 389 //sprintf(buffer,"PTO Inactive");
okini3939 0:c6f40de7ab86 390 }
okini3939 0:c6f40de7ab86 391 break;
okini3939 0:c6f40de7ab86 392 }
okini3939 0:c6f40de7ab86 393 case ENGINE_RUNTIME: // (A*256)+B
okini3939 0:c6f40de7ab86 394 *engine_data = (can_MsgRx.data[3]*256)+(can_MsgRx.data[4]);
okini3939 0:c6f40de7ab86 395 //sprintf(buffer,"%d Sec",(int) *engine_data);
okini3939 0:c6f40de7ab86 396 break;
okini3939 0:c6f40de7ab86 397 case PID_21_40: // bit encoded NOT DONE
okini3939 0:c6f40de7ab86 398 PID2140 = ((can_MsgRx.data[3] << 24) | (can_MsgRx.data[4] << 16) | (can_MsgRx.data[5] << 8) | (can_MsgRx.data[6]));
okini3939 0:c6f40de7ab86 399 break;
okini3939 0:c6f40de7ab86 400 case DIST_TRAVELED_MIL: // (A*256) + B
okini3939 0:c6f40de7ab86 401 *engine_data = ((can_MsgRx.data[3] * 256) + can_MsgRx.data[4]);
okini3939 0:c6f40de7ab86 402 //sprintf(buffer,"%d km",(int) *engine_data);
okini3939 0:c6f40de7ab86 403 break;
okini3939 0:c6f40de7ab86 404 case FUEL_RAIL_PRESSURE: // ((A*256)+B)*0.079
okini3939 0:c6f40de7ab86 405 *engine_data = ((can_MsgRx.data[3] * 256)+can_MsgRx.data[4])*0.079;
okini3939 0:c6f40de7ab86 406 //sprintf(buffer,"%d kPa",(int) *engine_data);
okini3939 0:c6f40de7ab86 407 break;
okini3939 0:c6f40de7ab86 408 case FUEL_RAIL_PRES_ALT: // ((A*256)+B)*0.079
okini3939 0:c6f40de7ab86 409 *engine_data = ((can_MsgRx.data[3] * 256) + can_MsgRx.data[4])*10;
okini3939 0:c6f40de7ab86 410 //sprintf(buffer,"%d kPa",(int) *engine_data);
okini3939 0:c6f40de7ab86 411 break;
okini3939 0:c6f40de7ab86 412 case O2S1_WR_LAMBDA_V: // ((A*256)+B)*2/65535 [ratio], ((C*256)+D)*8/65535 [V]
okini3939 0:c6f40de7ab86 413 *engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535);
okini3939 0:c6f40de7ab86 414 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 415 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535);
okini3939 0:c6f40de7ab86 416 //sprintf(buffer2,"%d V",(int) *engine_data);
okini3939 0:c6f40de7ab86 417 break;
okini3939 0:c6f40de7ab86 418 case O2S2_WR_LAMBDA_V: //
okini3939 0:c6f40de7ab86 419 *engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535);
okini3939 0:c6f40de7ab86 420 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 421 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535);
okini3939 0:c6f40de7ab86 422 //sprintf(buffer2,"%d V",(int) *engine_data);
okini3939 0:c6f40de7ab86 423 break;
okini3939 0:c6f40de7ab86 424 case O2S3_WR_LAMBDA_V: //
okini3939 0:c6f40de7ab86 425 *engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535);
okini3939 0:c6f40de7ab86 426 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 427 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535);
okini3939 0:c6f40de7ab86 428 //sprintf(buffer2,"%d V",(int) *engine_data);
okini3939 0:c6f40de7ab86 429 break;
okini3939 0:c6f40de7ab86 430 case O2S4_WR_LAMBDA_V: //
okini3939 0:c6f40de7ab86 431 *engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535);
okini3939 0:c6f40de7ab86 432 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 433 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535);
okini3939 0:c6f40de7ab86 434 //sprintf(buffer2,"%d V",(int) *engine_data);
okini3939 0:c6f40de7ab86 435 break;
okini3939 0:c6f40de7ab86 436 case O2S5_WR_LAMBDA_V: //
okini3939 0:c6f40de7ab86 437 *engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535);
okini3939 0:c6f40de7ab86 438 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 439 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535);
okini3939 0:c6f40de7ab86 440 //sprintf(buffer2,"%d V",(int) *engine_data);
okini3939 0:c6f40de7ab86 441 break;
okini3939 0:c6f40de7ab86 442 case O2S6_WR_LAMBDA_V: //
okini3939 0:c6f40de7ab86 443 *engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535);
okini3939 0:c6f40de7ab86 444 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 445 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535);
okini3939 0:c6f40de7ab86 446 //sprintf(buffer2,"%d V",(int) *engine_data);
okini3939 0:c6f40de7ab86 447 break;
okini3939 0:c6f40de7ab86 448 case O2S7_WR_LAMBDA_V: //
okini3939 0:c6f40de7ab86 449 *engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535);
okini3939 0:c6f40de7ab86 450 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 451 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535);
okini3939 0:c6f40de7ab86 452 //sprintf(buffer2,"%d V",(int) *engine_data);
okini3939 0:c6f40de7ab86 453 break;
okini3939 0:c6f40de7ab86 454 case O2S8_WR_LAMBDA_V: //
okini3939 0:c6f40de7ab86 455 *engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535);
okini3939 0:c6f40de7ab86 456 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 457 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535);
okini3939 0:c6f40de7ab86 458 //sprintf(buffer2,"%d V",(int) *engine_data);
okini3939 0:c6f40de7ab86 459 break;
okini3939 0:c6f40de7ab86 460 case COMMANDED_EGR: // 100*A/255
okini3939 0:c6f40de7ab86 461 *engine_data = (can_MsgRx.data[3]*100/255);
okini3939 0:c6f40de7ab86 462 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 463 break;
okini3939 0:c6f40de7ab86 464 case EGR_ERROR: // (A-128)*100/128
okini3939 0:c6f40de7ab86 465 *engine_data = ((can_MsgRx.data[3]-128)*(100/128));
okini3939 0:c6f40de7ab86 466 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 467 break;
okini3939 0:c6f40de7ab86 468 case COMMANDED_EVAP_P: // 100*A/255 [%]
okini3939 0:c6f40de7ab86 469 *engine_data = ((can_MsgRx.data[3]*100)/255);
okini3939 0:c6f40de7ab86 470 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 471 break;
okini3939 0:c6f40de7ab86 472 case FUEL_LEVEL: //100*A/255
okini3939 0:c6f40de7ab86 473 *engine_data = ((100*can_MsgRx.data[3])/255);
okini3939 0:c6f40de7ab86 474 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 475 break;
okini3939 0:c6f40de7ab86 476 case WARMUPS_SINCE_CLR: //A
okini3939 0:c6f40de7ab86 477 *engine_data = (can_MsgRx.data[3]);
okini3939 0:c6f40de7ab86 478 //sprintf(buffer,"%d Warmups",(int) *engine_data);
okini3939 0:c6f40de7ab86 479 break;
okini3939 0:c6f40de7ab86 480 case DIST_SINCE_CLR: //A*256+B [km]
okini3939 0:c6f40de7ab86 481 *engine_data = ((can_MsgRx.data[3]*256)+can_MsgRx.data[4]);
okini3939 0:c6f40de7ab86 482 //sprintf(buffer,"%d km",(int) *engine_data);
okini3939 0:c6f40de7ab86 483 break;
okini3939 0:c6f40de7ab86 484 case EVAP_PRESSURE: //((A*256)+B)/4
okini3939 0:c6f40de7ab86 485 *engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/4);
okini3939 0:c6f40de7ab86 486 //sprintf(buffer,"%d Pa",(int) *engine_data); //Yes it's in pascals
okini3939 0:c6f40de7ab86 487 break;
okini3939 0:c6f40de7ab86 488 case BAROMETRIC_PRESSURE: //A
okini3939 0:c6f40de7ab86 489 *engine_data = can_MsgRx.data[3];
okini3939 0:c6f40de7ab86 490 //sprintf(buffer,"%d kPa",(int) *engine_data);
okini3939 0:c6f40de7ab86 491 break;
okini3939 0:c6f40de7ab86 492 case O2S1_WR_LAMBDA_I: //((A*256)+B)/32,768 [Ratio], ((C*256)+D)/256 - 128 [mA]
okini3939 0:c6f40de7ab86 493 *engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768);
okini3939 0:c6f40de7ab86 494 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 495 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128);
okini3939 0:c6f40de7ab86 496 //sprintf(buffer2,"%d mA",(int) *engine_data);
okini3939 0:c6f40de7ab86 497 break;
okini3939 0:c6f40de7ab86 498 case O2S2_WR_LAMBDA_I:
okini3939 0:c6f40de7ab86 499 *engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768);
okini3939 0:c6f40de7ab86 500 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 501 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128);
okini3939 0:c6f40de7ab86 502 //sprintf(buffer2,"%d mA",(int) *engine_data);
okini3939 0:c6f40de7ab86 503 break;
okini3939 0:c6f40de7ab86 504 case O2S3_WR_LAMBDA_I:
okini3939 0:c6f40de7ab86 505 *engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768);
okini3939 0:c6f40de7ab86 506 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 507 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128);
okini3939 0:c6f40de7ab86 508 //sprintf(buffer2,"%d mA",(int) *engine_data);
okini3939 0:c6f40de7ab86 509 break;
okini3939 0:c6f40de7ab86 510 case O2S4_WR_LAMBDA_I:
okini3939 0:c6f40de7ab86 511 *engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768);
okini3939 0:c6f40de7ab86 512 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 513 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128);
okini3939 0:c6f40de7ab86 514 //sprintf(buffer2,"%d mA",(int) *engine_data);
okini3939 0:c6f40de7ab86 515 break;
okini3939 0:c6f40de7ab86 516 case O2S5_WR_LAMBDA_I:
okini3939 0:c6f40de7ab86 517 *engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768);
okini3939 0:c6f40de7ab86 518 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 519 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128);
okini3939 0:c6f40de7ab86 520 //sprintf(buffer2,"%d mA",(int) *engine_data);
okini3939 0:c6f40de7ab86 521 break;
okini3939 0:c6f40de7ab86 522 case O2S6_WR_LAMBDA_I:
okini3939 0:c6f40de7ab86 523 *engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768);
okini3939 0:c6f40de7ab86 524 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 525 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128);
okini3939 0:c6f40de7ab86 526 //sprintf(buffer2,"%d mA",(int) *engine_data);
okini3939 0:c6f40de7ab86 527 break;
okini3939 0:c6f40de7ab86 528 case O2S7_WR_LAMBDA_I:
okini3939 0:c6f40de7ab86 529 *engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768);
okini3939 0:c6f40de7ab86 530 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 531 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128);
okini3939 0:c6f40de7ab86 532 //sprintf(buffer2,"%d mA",(int) *engine_data);
okini3939 0:c6f40de7ab86 533 break;
okini3939 0:c6f40de7ab86 534 case O2S8_WR_LAMBDA_I:
okini3939 0:c6f40de7ab86 535 *engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768);
okini3939 0:c6f40de7ab86 536 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 537 *engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128);
okini3939 0:c6f40de7ab86 538 //sprintf(buffer2,"%d mA",(int) *engine_data);
okini3939 0:c6f40de7ab86 539 break;
okini3939 0:c6f40de7ab86 540 case CAT_TEMP_B1S1: //((A*256)+B)/10 - 40 [DegC]
okini3939 0:c6f40de7ab86 541 *engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/10)-40);
okini3939 0:c6f40de7ab86 542 //sprintf(buffer,"%d DegC",(int) *engine_data);
okini3939 0:c6f40de7ab86 543 break;
okini3939 0:c6f40de7ab86 544 case CAT_TEMP_B1S2:
okini3939 0:c6f40de7ab86 545 *engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/10)-40);
okini3939 0:c6f40de7ab86 546 //sprintf(buffer,"%d DegC",(int) *engine_data);
okini3939 0:c6f40de7ab86 547 break;
okini3939 0:c6f40de7ab86 548 case CAT_TEMP_B2S1:
okini3939 0:c6f40de7ab86 549 *engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/10)-40);
okini3939 0:c6f40de7ab86 550 //sprintf(buffer,"%d DegC",(int) *engine_data);
okini3939 0:c6f40de7ab86 551 break;
okini3939 0:c6f40de7ab86 552 case CAT_TEMP_B2S2:
okini3939 0:c6f40de7ab86 553 *engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/10)-40);
okini3939 0:c6f40de7ab86 554 //sprintf(buffer,"%d DegC",(int) *engine_data);
okini3939 0:c6f40de7ab86 555 break;
okini3939 0:c6f40de7ab86 556 case PID_41_60: //bit encoded NOT DONE
okini3939 0:c6f40de7ab86 557 PID4160 = ((can_MsgRx.data[3] << 24) | (can_MsgRx.data[4] << 16) | (can_MsgRx.data[5] << 8) | (can_MsgRx.data[6]));
okini3939 0:c6f40de7ab86 558 break;
okini3939 0:c6f40de7ab86 559 case MONITOR_STATUS: // bit encoded
okini3939 0:c6f40de7ab86 560 //LUT: (Uses multiple bytes) A7..0 always 0
okini3939 0:c6f40de7ab86 561 // Test enabled Test Incomplete
okini3939 0:c6f40de7ab86 562 // Misfire B0 B4
okini3939 0:c6f40de7ab86 563 // Fuel System B1 B5
okini3939 0:c6f40de7ab86 564 // Components B2 B6
okini3939 0:c6f40de7ab86 565 // Reserved B3 B7
okini3939 0:c6f40de7ab86 566 // Catalyst C0 D0
okini3939 0:c6f40de7ab86 567 // Heated Catalyst C1 D1
okini3939 0:c6f40de7ab86 568 // Evap System C2 D2
okini3939 0:c6f40de7ab86 569 // Sec. Ait system C3 D3
okini3939 0:c6f40de7ab86 570 // A/C Refrigerant C4 D4
okini3939 0:c6f40de7ab86 571 // O2 Sensor C5 D5
okini3939 0:c6f40de7ab86 572 // O2 Sensor Heater C6 D6
okini3939 0:c6f40de7ab86 573 // EGR System C7 D7
okini3939 0:c6f40de7ab86 574 break;
okini3939 0:c6f40de7ab86 575 case ECU_VOLTAGE: //((A*256)+B)/1000 [V]
okini3939 0:c6f40de7ab86 576 *engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/1000);
okini3939 0:c6f40de7ab86 577 //sprintf(buffer,"%d V",(int) *engine_data);
okini3939 0:c6f40de7ab86 578 break;
okini3939 0:c6f40de7ab86 579 case ABSOLUTE_LOAD: //((A*256)+B)*100/255 [%]
okini3939 0:c6f40de7ab86 580 *engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*100)/255);
okini3939 0:c6f40de7ab86 581 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 582 break;
okini3939 0:c6f40de7ab86 583 case COMMANDED_EQUIV_R: //((A*256)+B)/32768 [Ratio]
okini3939 0:c6f40de7ab86 584 *engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768);
okini3939 0:c6f40de7ab86 585 //sprintf(buffer,"Ratio %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 586 break;
okini3939 0:c6f40de7ab86 587 case REL_THROTTLE_POS: // A*100/255 [%]
okini3939 0:c6f40de7ab86 588 *engine_data = ((can_MsgRx.data[3]*100)/255);
okini3939 0:c6f40de7ab86 589 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 590 break;
okini3939 0:c6f40de7ab86 591 case AMB_AIR_TEMP: // A-40 [DegC]
okini3939 0:c6f40de7ab86 592 *engine_data = (can_MsgRx.data[3]-40);
okini3939 0:c6f40de7ab86 593 //sprintf(buffer,"%d DegC",(int) *engine_data);
okini3939 0:c6f40de7ab86 594 break;
okini3939 0:c6f40de7ab86 595 case ABS_THROTTLE_POS_B: // A*100/255 [%]
okini3939 0:c6f40de7ab86 596 *engine_data = ((can_MsgRx.data[3]*100)/255);
okini3939 0:c6f40de7ab86 597 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 598 break;
okini3939 0:c6f40de7ab86 599 case ABS_THROTTLE_POS_C: // A*100/255 [%]
okini3939 0:c6f40de7ab86 600 *engine_data = ((can_MsgRx.data[3]*100)/255);
okini3939 0:c6f40de7ab86 601 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 602 break;
okini3939 0:c6f40de7ab86 603 case ACCEL_POS_D: // A*100/255 [%]
okini3939 0:c6f40de7ab86 604 *engine_data = ((can_MsgRx.data[3]*100)/255);
okini3939 0:c6f40de7ab86 605 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 606 break;
okini3939 0:c6f40de7ab86 607 case ACCEL_POS_E: // A*100/255 [%]
okini3939 0:c6f40de7ab86 608 *engine_data = ((can_MsgRx.data[3]*100)/255);
okini3939 0:c6f40de7ab86 609 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 610 break;
okini3939 0:c6f40de7ab86 611 case ACCEL_POS_F: // A*100/255 [%]
okini3939 0:c6f40de7ab86 612 *engine_data = ((can_MsgRx.data[3]*100)/255);
okini3939 0:c6f40de7ab86 613 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 614 break;
okini3939 0:c6f40de7ab86 615 case COMMANDED_THROTTLE: //A*100/255 [%]
okini3939 0:c6f40de7ab86 616 *engine_data = ((can_MsgRx.data[3]*100)/255);
okini3939 0:c6f40de7ab86 617 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 618 break;
okini3939 0:c6f40de7ab86 619 case TIME_RUN_WITH_MIL: //(A*256)+B [minutes]
okini3939 0:c6f40de7ab86 620 *engine_data = ((can_MsgRx.data[3]*256)/(can_MsgRx.data[4]));
okini3939 0:c6f40de7ab86 621 //sprintf(buffer,"%d Mins",(int) *engine_data);
okini3939 0:c6f40de7ab86 622 break;
okini3939 0:c6f40de7ab86 623 case TIME_SINCE_CLR: //(A*256)+B [minutes]
okini3939 0:c6f40de7ab86 624 *engine_data = ((can_MsgRx.data[3]*256)/(can_MsgRx.data[4]));
okini3939 0:c6f40de7ab86 625 //sprintf(buffer,"%d Mins",(int) *engine_data);
okini3939 0:c6f40de7ab86 626 break;
okini3939 0:c6f40de7ab86 627 case MAX_R_O2_VI_PRES: //A,B,C,D*10 [Ratio,V,mA,kPa]
okini3939 0:c6f40de7ab86 628 *engine_data = can_MsgRx.data[3];
okini3939 0:c6f40de7ab86 629 //sprintf(buffer,"Ratio: %d",(int) *engine_data);
okini3939 0:c6f40de7ab86 630 *engine_data = can_MsgRx.data[4];
okini3939 0:c6f40de7ab86 631 //sprintf(buffer,"%d V",(int) *engine_data);
okini3939 0:c6f40de7ab86 632 *engine_data = can_MsgRx.data[5];
okini3939 0:c6f40de7ab86 633 //sprintf(buffer,"%d mA",(int) *engine_data);
okini3939 0:c6f40de7ab86 634 *engine_data = (can_MsgRx.data[6]*10);
okini3939 0:c6f40de7ab86 635 //sprintf(buffer,"%d kPa",(int) *engine_data);
okini3939 0:c6f40de7ab86 636 break;
okini3939 0:c6f40de7ab86 637 case MAX_AIRFLOW_MAF: //A*10 [g/s]
okini3939 0:c6f40de7ab86 638 *engine_data = (can_MsgRx.data[3]*10);
okini3939 0:c6f40de7ab86 639 //sprintf(buffer,"%d g/s",(int) *engine_data);
okini3939 0:c6f40de7ab86 640 break;
okini3939 0:c6f40de7ab86 641 case FUEL_TYPE: // USE LUT NOT DONE
okini3939 0:c6f40de7ab86 642 break;
okini3939 0:c6f40de7ab86 643 case ETHANOL_PERCENT: //A*100/255 [%]
okini3939 0:c6f40de7ab86 644 *engine_data = ((can_MsgRx.data[3]*100)/255);
okini3939 0:c6f40de7ab86 645 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 646 break;
okini3939 0:c6f40de7ab86 647 case ABS_EVAP_SYS_PRES: //1/200 per bit [kPa] ----NOT DONE----
okini3939 0:c6f40de7ab86 648 break;
okini3939 0:c6f40de7ab86 649 case EVAP_SYS_PRES: // (A*256)+B - 32768 [Pa]
okini3939 0:c6f40de7ab86 650 *engine_data = ((can_MsgRx.data[3]*256)+can_MsgRx.data[4]-32768);
okini3939 0:c6f40de7ab86 651 //sprintf(buffer,"%d Pa",(int) *engine_data);
okini3939 0:c6f40de7ab86 652 break;
okini3939 0:c6f40de7ab86 653 case ST_O2_TRIM_B1B3: // ((A-128)*100/128 (B-128)*100/128 [%]
okini3939 0:c6f40de7ab86 654 *engine_data = ((can_MsgRx.data[3]-128)*(100/128));
okini3939 0:c6f40de7ab86 655 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 656 *engine_data = ((can_MsgRx.data[4]-128)*(100/128));
okini3939 0:c6f40de7ab86 657 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 658 break;
okini3939 0:c6f40de7ab86 659 case LT_O2_TRIM_B1B3:
okini3939 0:c6f40de7ab86 660 *engine_data = ((can_MsgRx.data[3]-128)*(100/128));
okini3939 0:c6f40de7ab86 661 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 662 *engine_data = ((can_MsgRx.data[4]-128)*(100/128));
okini3939 0:c6f40de7ab86 663 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 664 break;
okini3939 0:c6f40de7ab86 665 case ST_02_TRIM_B2B4:
okini3939 0:c6f40de7ab86 666 *engine_data = ((can_MsgRx.data[3]-128)*(100/128));
okini3939 0:c6f40de7ab86 667 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 668 *engine_data = ((can_MsgRx.data[4]-128)*(100/128));
okini3939 0:c6f40de7ab86 669 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 670 break;
okini3939 0:c6f40de7ab86 671 case LT_O2_TRIM_B2B4:
okini3939 0:c6f40de7ab86 672 *engine_data = ((can_MsgRx.data[3]-128)*(100/128));
okini3939 0:c6f40de7ab86 673 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 674 *engine_data = ((can_MsgRx.data[4]-128)*(100/128));
okini3939 0:c6f40de7ab86 675 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 676 break;
okini3939 0:c6f40de7ab86 677 case ABS_FUEL_RAIL_PRES: //((A*256)+B)*10 [kPa]
okini3939 0:c6f40de7ab86 678 *engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*10);
okini3939 0:c6f40de7ab86 679 //sprintf(buffer,"%d kPa",(int) *engine_data);
okini3939 0:c6f40de7ab86 680 break;
okini3939 0:c6f40de7ab86 681 case REL_ACCEL_POS: //A*100/255 [%]
okini3939 0:c6f40de7ab86 682 *engine_data = ((can_MsgRx.data[3]*100)/255);
okini3939 0:c6f40de7ab86 683 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 684 break;
okini3939 0:c6f40de7ab86 685 case HYBRID_BATT_PCT: //A*100/255 [%]
okini3939 0:c6f40de7ab86 686 *engine_data = ((can_MsgRx.data[3]*100)/255);
okini3939 0:c6f40de7ab86 687 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 688 break;
okini3939 0:c6f40de7ab86 689 case ENGINE_OIL_TEMP: //A-40 [DegC]
okini3939 0:c6f40de7ab86 690 *engine_data = (can_MsgRx.data[3]-40);
okini3939 0:c6f40de7ab86 691 //sprintf(buffer,"%d DegC",(int) *engine_data);
okini3939 0:c6f40de7ab86 692 break;
okini3939 0:c6f40de7ab86 693 case FUEL_TIMING: //(38655-((A*256)+B))/128
okini3939 0:c6f40de7ab86 694 *engine_data = ((38655 - ((can_MsgRx.data[3]*256)+can_MsgRx.data[4]))/128);
okini3939 0:c6f40de7ab86 695 //sprintf(buffer,"%d Deg",(int) *engine_data);
okini3939 0:c6f40de7ab86 696 break;
okini3939 0:c6f40de7ab86 697 case FUEL_RATE: //((A*256)+B)*0.05
okini3939 0:c6f40de7ab86 698 *engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*0.05);
okini3939 0:c6f40de7ab86 699 //sprintf(buffer,"%d L/m",(int) *engine_data);
okini3939 0:c6f40de7ab86 700 break;
okini3939 0:c6f40de7ab86 701 case EMISSIONS_STANDARD: //bit encoded ----NOT DONE----
okini3939 0:c6f40de7ab86 702 break;
okini3939 0:c6f40de7ab86 703 case DEMANDED_TORQUE: //A-125 [%]
okini3939 0:c6f40de7ab86 704 *engine_data = (can_MsgRx.data[3]-125);
okini3939 0:c6f40de7ab86 705 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 706 break;
okini3939 0:c6f40de7ab86 707 case ACTUAL_TORQUE: //A-125 [%]
okini3939 0:c6f40de7ab86 708 *engine_data = (can_MsgRx.data[3]-125);
okini3939 0:c6f40de7ab86 709 //sprintf(buffer,"%d %%",(int) *engine_data);
okini3939 0:c6f40de7ab86 710 break;
okini3939 0:c6f40de7ab86 711 case REFERENCE_TORQUE: //A*256+b [Nm]
okini3939 0:c6f40de7ab86 712 *engine_data = ((can_MsgRx.data[3]*256)+can_MsgRx.data[4]);
okini3939 0:c6f40de7ab86 713 //sprintf(buffer,"%d Nm",(int) *engine_data);
okini3939 0:c6f40de7ab86 714 break;
okini3939 0:c6f40de7ab86 715 case ENGINE_PCT_TORQUE: //A-125 idle, B-125 pt 1, C-125, D-125
okini3939 0:c6f40de7ab86 716 *engine_data = (can_MsgRx.data[3]);
okini3939 0:c6f40de7ab86 717 //sprintf(buffer,"%d %% - Idle",(int) *engine_data);
okini3939 0:c6f40de7ab86 718 *engine_data = (can_MsgRx.data[4]);
okini3939 0:c6f40de7ab86 719 //sprintf(buffer2,"%d %% - Point 1",(int) *engine_data);
okini3939 0:c6f40de7ab86 720 *engine_data = (can_MsgRx.data[5]);
okini3939 0:c6f40de7ab86 721 //sprintf(buffer3,"%d %% - Point 2",(int) *engine_data);
okini3939 0:c6f40de7ab86 722 *engine_data = (can_MsgRx.data[6]);
okini3939 0:c6f40de7ab86 723 //sprintf(buffer4,"%d %% - Point 3",(int) *engine_data);
okini3939 0:c6f40de7ab86 724 break;
okini3939 0:c6f40de7ab86 725 case AUX_IO_SUPPORTED: //Bit encoded ----NOT DONE----
okini3939 0:c6f40de7ab86 726 break;
okini3939 0:c6f40de7ab86 727 case P_MAF_SENSOR:
okini3939 0:c6f40de7ab86 728 case P_ENGINE_COOLANT_T:
okini3939 0:c6f40de7ab86 729 case P_INTAKE_TEMP:
okini3939 0:c6f40de7ab86 730 case P_COMMANDED_EGR:
okini3939 0:c6f40de7ab86 731 case P_COMMANDED_INTAKE:
okini3939 0:c6f40de7ab86 732 case P_EGR_TEMP:
okini3939 0:c6f40de7ab86 733 case P_COMMANDED_THROT:
okini3939 0:c6f40de7ab86 734 case P_FUEL_PRESSURE:
okini3939 0:c6f40de7ab86 735 case P_FUEL_INJ_PRES:
okini3939 0:c6f40de7ab86 736 case P_TURBO_PRESSURE:
okini3939 0:c6f40de7ab86 737 case P_BOOST_PRES_CONT:
okini3939 0:c6f40de7ab86 738 case P_VGT_CONTROL:
okini3939 0:c6f40de7ab86 739 case P_WASTEGATE_CONT:
okini3939 0:c6f40de7ab86 740 case P_EXHAUST_PRESSURE:
okini3939 0:c6f40de7ab86 741 case P_TURBO_RPM:
okini3939 0:c6f40de7ab86 742 case P_TURBO_TEMP1:
okini3939 0:c6f40de7ab86 743 case P_TURBO_TEMP2:
okini3939 0:c6f40de7ab86 744 case P_CACT:
okini3939 0:c6f40de7ab86 745 case P_EGT_B1:
okini3939 0:c6f40de7ab86 746 case P_EGT_B2:
okini3939 0:c6f40de7ab86 747 case P_DPF1:
okini3939 0:c6f40de7ab86 748 case P_DPF2:
okini3939 0:c6f40de7ab86 749 case P_DPF_TEMP:
okini3939 0:c6f40de7ab86 750 case P_NOX_NTE_STATUS:
okini3939 0:c6f40de7ab86 751 case P_PM_NTE_STATUS:
okini3939 0:c6f40de7ab86 752 case P_ENGINE_RUNTUME:
okini3939 0:c6f40de7ab86 753 case P_ENGINE_AECD_1:
okini3939 0:c6f40de7ab86 754 case P_ENGINE_AECD_2:
okini3939 0:c6f40de7ab86 755 case P_NOX_SENSOR:
okini3939 0:c6f40de7ab86 756 case P_MANIFOLD_TEMP:
okini3939 0:c6f40de7ab86 757 case P_NOX_SYSTEM:
okini3939 0:c6f40de7ab86 758 case P_PM_SENSOR:
okini3939 0:c6f40de7ab86 759 case P_IN_MANIF_TEMP:
okini3939 0:c6f40de7ab86 760 //sprintf(buffer,"Not supported");
okini3939 0:c6f40de7ab86 761 break;
okini3939 0:c6f40de7ab86 762 } // switch
okini3939 0:c6f40de7ab86 763
okini3939 0:c6f40de7ab86 764 return 1;
okini3939 0:c6f40de7ab86 765
okini3939 0:c6f40de7ab86 766 } // if
okini3939 0:c6f40de7ab86 767
okini3939 0:c6f40de7ab86 768 } // if read
okini3939 0:c6f40de7ab86 769 } // while
okini3939 0:c6f40de7ab86 770
okini3939 0:c6f40de7ab86 771 return 0;
okini3939 0:c6f40de7ab86 772
okini3939 0:c6f40de7ab86 773
okini3939 0:c6f40de7ab86 774
okini3939 0:c6f40de7ab86 775
okini3939 0:c6f40de7ab86 776 }
okini3939 0:c6f40de7ab86 777 } // namespace mbed