Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed
ecu_reader.cpp
00001 #include "mbed.h" 00002 #include "ecu_reader.h" 00003 #include "globals.h" 00004 // Use a timer to see if things take too long 00005 Timer CANTimer; 00006 namespace mbed { 00007 ecu_reader::ecu_reader(int can_speed) { 00008 can2.frequency(can_speed); 00009 } 00010 00011 #define TIMEOUT 1000 00012 unsigned char ecu_reader::request(unsigned char pid, char *buffer, char *buffer2, char *buffer3, char *buffer4) { 00013 led1 = 1; 00014 char can_msg[8]; 00015 float engine_data; 00016 can_msg[0] = 0x02; 00017 can_msg[1] = 0x01; 00018 can_msg[2] = pid; 00019 can_msg[3] = 0; 00020 can_msg[4] = 0; 00021 can_msg[5] = 0; 00022 can_msg[6] = 0; 00023 can_msg[7] = 0; 00024 00025 if (pid==VIN_MACRO) { 00026 can_msg[1] = 0x9; 00027 can_msg[2] = 0x2; 00028 } 00029 00030 if (can2.write(CANMessage(PID_REQUEST, can_msg, 8))) { 00031 pc.printf("*********Request write passed*********\n\r"); 00032 } else { 00033 pc.printf("*********Request write failed*********\n\r"); 00034 } 00035 00036 led1 = 0; 00037 CANTimer.reset(); 00038 CANTimer.start(); 00039 00040 while (CANTimer.read_ms() < TIMEOUT) { 00041 00042 if (can2.read(can_MsgRx, 0)) { 00043 if (((can_MsgRx.id == PID_REPLY) && can_MsgRx.data[2] == pid)) { //(can_MsgRx.id == PID_REPLY) && 00044 pc.printf("Valid OBD-II PID reply\n\r"); 00045 /* Details from http://en.wikipedia.org/wiki/OBD-II_PIDs */ 00046 switch (can_MsgRx.data[2]) { /* Details from http://en.wikipedia.org/wiki/OBD-II_PIDs */ 00047 case PID_0_20: // PID 0-20 Supported 00048 PID020 = ((can_MsgRx.data[3] << 24) | (can_MsgRx.data[4] << 16) | (can_MsgRx.data[5] << 8) | (can_MsgRx.data[6])); 00049 break; 00050 case STATUS_DTC: { // bit encoded 00051 if (can_MsgRx.data[4] & 0x04) { //Compression Ignition (Diesel) 00052 if (can_MsgRx.data[3] & 0x80) { //MIL Light on 00053 engine_data = (can_MsgRx.data[3] - 128); 00054 sprintf(buffer,"MIL ON, %d DTCs", (int) engine_data); 00055 } else { //MIL Light off 00056 engine_data = (can_MsgRx.data[3]); 00057 sprintf(buffer,"MIL OFF, %d DTCs", (int) engine_data); 00058 } 00059 // Diesel C and D bytes (can_MsgRx.data[5] and can_MsgRx.data[6]) 00060 // Test available Test incomplete 00061 // Catalyst C0 D0 00062 // Heated Catalyst C1 D1 00063 // Evap System C2 D2 00064 // Secondary Air C3 D3 00065 // A/C Refrigerant C4 D4 00066 // O2 Sensor C5 D5 00067 // O2 Sensor Heater C6 D6 00068 // EGR System C7 D7 00069 } else { //Spark Ignition (Gasoline) 00070 if (can_MsgRx.data[3] & 0x80) { //MIL Light on 00071 engine_data = (can_MsgRx.data[3] - 128); 00072 sprintf(buffer,"MIL ON, %d DTCs", (int) engine_data); 00073 } else { //MIL Light off 00074 engine_data = (can_MsgRx.data[3]); 00075 sprintf(buffer,"MIL OFF, %d DTCs", (int) engine_data); 00076 } 00077 // Gasoline C and D bytes (can_MsgRx.data[5] and can_MsgRx.data[6]) 00078 // Test available Test incomplete 00079 // NMHC Catalyst C0 D0 00080 // NOx/SCR Monitoring C1 D1 00081 // Boost Pressure C3 D3 00082 // Exhaust Gas Sensor C5 D5 00083 // Particulate Filter C6 D6 00084 // EGR and/or VVT/VTEC C7 D7 00085 } 00086 // Common Tests between Gas and Diesel Engines, byte B (can_MsgRx.data[4]) 00087 // Test available Test incomplete 00088 // Misfire B0 B4 00089 // Fuel System B1 B5 00090 // Components B2 B6 00091 break; 00092 } 00093 case FREEZE_DTC: // Locks in Diagnostic trouble Codes 00094 break; 00095 case FUEL_SYS_STATUS: // bit encoded 00096 //This tells us the warmup status of the engine. Only 1 bit should be set 00097 engine_data = can_MsgRx.data[3]; 00098 if (((int) engine_data) & 0x01) { // Open loop - Engine warmup 00099 sprintf(buffer,"Open Loop - Warmup"); 00100 } 00101 if (((int) engine_data) & 0x02) { // Closed Loop - O2 Sensor feedback 00102 sprintf(buffer,"Closed Loop - Normal"); 00103 } 00104 if (((int) engine_data) & 0x04) { // Open loop, 00105 sprintf(buffer,"Open Loop-Load/Decel"); 00106 } 00107 if (((int) engine_data) & 0x08) { // Open loop - system failure 00108 sprintf(buffer,"Open Loop - FAILURE"); 00109 } 00110 if (((int) engine_data) & 0x10) { // Closed Loop - O2 Sensor feedback failure 00111 sprintf(buffer,"Closed Loop - O2Fail"); 00112 } 00113 if ((((int) engine_data) & 0x20) | (((int) engine_data) & 0x40) | (((int) engine_data) & 0x80)) { //These shouldnt be on, assume Proprietary status 00114 sprintf(buffer,"Unsupported Status"); 00115 } 00116 break; 00117 case ENGINE_LOAD: // A*100/255 00118 engine_data = (can_MsgRx.data[3]*100)/255; 00119 sprintf(buffer,"%d %% ",(int) engine_data); 00120 break; 00121 case ENGINE_COOLANT_TEMP: // A-40 [degree C] 00122 engine_data = can_MsgRx.data[3] - 40; 00123 sprintf(buffer,"%d",(int) engine_data); 00124 break; 00125 case ST_FUEL_TRIM_1: // (A-128)*100/128 00126 engine_data = ((can_MsgRx.data[3]-128)*(100/128)); 00127 sprintf(buffer,"%d %% ", (int) engine_data); 00128 break; 00129 case LT_FUEL_TRIM_1: // (A-128)*100/128 00130 engine_data = ((can_MsgRx.data[3]-128)*(100/128)); 00131 sprintf(buffer,"%d %% ", (int) engine_data); 00132 break; 00133 case ST_FUEL_TRIM_2: // (A-128)*100/128 00134 engine_data = ((can_MsgRx.data[3]-128)*(100/128)); 00135 sprintf(buffer,"%d %% ", (int) engine_data); 00136 break; 00137 case LT_FUEL_TRIM_2: // (A-128)*100/128 00138 engine_data = ((can_MsgRx.data[3]-128)*(100/128)); 00139 sprintf(buffer,"%d %% ", (int) engine_data); 00140 break; 00141 case FUEL_PRESSURE: // A*3 00142 engine_data = (can_MsgRx.data[3]*3); 00143 sprintf(buffer,"%d kPa",(int) engine_data); 00144 break; 00145 case INTAKE_PRESSURE: // A 00146 engine_data = can_MsgRx.data[3]; 00147 sprintf(buffer,"%d kPa",(int) engine_data); 00148 break; 00149 case ENGINE_RPM: // ((A*256)+B)/4 [RPM] 00150 engine_data = ((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/4; 00151 //sprintf(buffer,"%d rpm ",(int) engine_data); 00152 sprintf(buffer,"%d",(int) engine_data); 00153 break; 00154 case VEHICLE_SPEED: // A [km/h] 00155 engine_data = can_MsgRx.data[3]; 00156 sprintf(buffer,"%d",(int) engine_data); 00157 break; 00158 case TIMING_ADVANCE: // A/2 - 64 00159 engine_data = (can_MsgRx.data[3]/2) - 64; 00160 sprintf(buffer,"%d Deg",(int) engine_data); 00161 break; 00162 case INTAKE_TEMP: // A - 40 00163 engine_data = (can_MsgRx.data[3] - 40); 00164 sprintf(buffer,"%d DegC",(int) engine_data); 00165 break; 00166 case MAF_SENSOR: // ((256*A)+B) / 100 [g/s] 00167 engine_data = ((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/100; 00168 sprintf(buffer,"%d g/s",(int) engine_data); 00169 break; 00170 case THROTTLE: // A*100/255 00171 engine_data = (can_MsgRx.data[3]*100)/255; 00172 sprintf(buffer,"%d %% ",(int) engine_data); 00173 break; 00174 case COMMANDED_SEC_AIR: // bit encoded 00175 engine_data = can_MsgRx.data[3]; 00176 if (((int) engine_data) & 0x01) { //Upstream of Catalytic Converter 00177 sprintf(buffer,"Upstream of Cat."); 00178 } 00179 if (((int) engine_data) & 0x02) { //Downstream of Catalytic Converter 00180 sprintf(buffer,"Downstream of Cat."); 00181 } 00182 if (((int) engine_data) & 0x04) { //From outside atmosphere or off 00183 sprintf(buffer,"Off"); 00184 } 00185 break; 00186 case O2_SENS_PRES: { // A [A0..A3] == Bank 1, [A4..A7] == Bank 2 00187 engine_data = (can_MsgRx.data[3]); //Check # of O2 sensors present by masking individual bits and counting 00188 int o2pres = 0; 00189 if (((int) engine_data) & 0x01) { // Bank 1 Sensor 1 00190 o2pres++; 00191 } 00192 if (((int) engine_data) & 0x02) { // Bank 1 Sensor 2 00193 o2pres++; 00194 } 00195 if (((int) engine_data) & 0x04) { // Bank 1 Sensor 3 00196 o2pres++; 00197 } 00198 if (((int) engine_data) & 0x08) { // Bank 1 Sensor 4 00199 o2pres++; 00200 } 00201 if (((int) engine_data) & 0x10) { // Bank 2 Sensor 1 00202 o2pres++; 00203 } 00204 if (((int) engine_data) & 0x20) { // Bank 2 Sensor 2 00205 o2pres++; 00206 } 00207 if (((int) engine_data) & 0x40) { // Bank 2 Sensor 3 00208 o2pres++; 00209 } 00210 if (((int) engine_data) & 0x80) { // Bank 2 Sensor 4 00211 o2pres++; 00212 } 00213 sprintf(buffer,"%d Present",(int) o2pres); 00214 break; 00215 } 00216 case O2_B1S1_VOLTAGE: // A/200, (B-128) * 100/128 00217 engine_data = (can_MsgRx.data[3]/200); 00218 sprintf(buffer,"%d V ",(int) engine_data); //Raw O2 Voltage 00219 if (can_MsgRx.data[4] & 0xFF) { 00220 sprintf(buffer,"Not Present"); 00221 } else { 00222 engine_data = ((can_MsgRx.data[4]-128)*(100/128)); 00223 sprintf(buffer2,"%d %% ",(int) engine_data); //Calculated lean/rich 00224 } 00225 break; 00226 case O2_B1S2_VOLTAGE: // 00227 engine_data = (can_MsgRx.data[3]/200); 00228 sprintf(buffer,"%d V ",(int) engine_data); 00229 if (can_MsgRx.data[4] & 0xFF) { 00230 sprintf(buffer,"Not Present"); 00231 } else { 00232 engine_data = ((can_MsgRx.data[4]-128)*(100/128)); 00233 sprintf(buffer2,"%d %% ",(int) engine_data); 00234 } 00235 break; 00236 case O2_B1S3_VOLTAGE: // 00237 engine_data = (can_MsgRx.data[3]/200); 00238 sprintf(buffer,"%d V ",(int) engine_data); 00239 if (can_MsgRx.data[4] & 0xFF) { 00240 sprintf(buffer,"Not Present"); 00241 } else { 00242 engine_data = ((can_MsgRx.data[4]-128)*(100/128)); 00243 sprintf(buffer2,"%d %% ",(int) engine_data); 00244 } 00245 break; 00246 case O2_B1S4_VOLTAGE: // 00247 engine_data = (can_MsgRx.data[3]/200); 00248 sprintf(buffer,"%d V ",(int) engine_data); 00249 if (can_MsgRx.data[4] & 0xFF) { 00250 sprintf(buffer,"Not Present"); 00251 } else { 00252 engine_data = ((can_MsgRx.data[4]-128)*(100/128)); 00253 sprintf(buffer2,"%d %% ",(int) engine_data); 00254 } 00255 break; 00256 case O2_B2S1_VOLTAGE: // 00257 engine_data = (can_MsgRx.data[3]/200); 00258 sprintf(buffer,"%d V ",(int) engine_data); 00259 if (can_MsgRx.data[4] & 0xFF) { 00260 sprintf(buffer,"Not Present"); 00261 } else { 00262 engine_data = ((can_MsgRx.data[4]-128)*(100/128)); 00263 sprintf(buffer2,"%d %% ",(int) engine_data); 00264 } 00265 break; 00266 case O2_B2S2_VOLTAGE: // 00267 engine_data = (can_MsgRx.data[3]/200); 00268 sprintf(buffer,"%d V ",(int) engine_data); 00269 if (can_MsgRx.data[4] & 0xFF) { 00270 sprintf(buffer,"Not Present"); 00271 } else { 00272 engine_data = ((can_MsgRx.data[4]-128)*(100/128)); 00273 sprintf(buffer2,"%d %% ",(int) engine_data); 00274 } 00275 break; 00276 case O2_B2S3_VOLTAGE: { // 00277 engine_data = (can_MsgRx.data[3]/200); 00278 sprintf(buffer,"%d V ",(int) engine_data); 00279 if (can_MsgRx.data[4] & 0xFF) { 00280 sprintf(buffer,"Not Present"); 00281 } else { 00282 engine_data = ((can_MsgRx.data[4]-128)*(100/128)); 00283 sprintf(buffer2,"%d %% ",(int) engine_data); 00284 } 00285 break; 00286 } 00287 case O2_B2S4_VOLTAGE: { // 00288 engine_data = (can_MsgRx.data[3]/200); 00289 sprintf(buffer,"%d V ",(int) engine_data); 00290 if (can_MsgRx.data[4] & 0xFF) { 00291 sprintf(buffer,"Not Present"); 00292 } else { 00293 engine_data = ((can_MsgRx.data[4]-128)*(100/128)); 00294 sprintf(buffer2,"%d %% ",(int) engine_data); 00295 } 00296 break; 00297 } 00298 case OBDII_STANDARDS: { //bit encoded NOT DONE 00299 engine_data = can_MsgRx.data[3]; 00300 if (((int) engine_data) & 0x0D) { //JOBD, EOBD, and OBD II 00301 sprintf(buffer,"JOBD,EOBD,OBDII"); 00302 } 00303 if (((int) engine_data) & 0x0C) { //JOBD and EOBD 00304 sprintf(buffer,"JOBD,EOBD"); 00305 } 00306 if (((int) engine_data) & 0x0B) { //JOBD and OBDII 00307 sprintf(buffer,"JOBD,OBDII"); 00308 } 00309 if (((int) engine_data) & 0x0A) { //JOBD 00310 sprintf(buffer,"JOBD"); 00311 } 00312 if (((int) engine_data) & 0x09) { //EOBD, OBD, and OBD II 00313 sprintf(buffer,"EOBD,OBDI,OBDII"); 00314 } 00315 if (((int) engine_data) & 0x08) { //EOBD and OBD 00316 sprintf(buffer,"EOBD,OBDI"); 00317 } 00318 if (((int) engine_data) & 0x07) { //EOBD and OBDII 00319 sprintf(buffer,"EOBD,OBDII"); 00320 } 00321 if (((int) engine_data) & 0x06) { //EOBD 00322 sprintf(buffer,"EOBD"); 00323 } 00324 if (((int) engine_data) & 0x05) { //Not meant to comply with any OBD standard 00325 sprintf(buffer,"No Compliance"); 00326 } 00327 if (((int) engine_data) & 0x04) { //OBDI 00328 sprintf(buffer,"OBDI"); 00329 } 00330 if (((int) engine_data) & 0x03) { //OBD and OBDII 00331 sprintf(buffer,"OBDI,OBDII"); 00332 } 00333 if (((int) engine_data) & 0x02) { //OBD and defined by the EPA 00334 sprintf(buffer,"OBD"); 00335 } 00336 if (((int) engine_data) & 0x01) { //OBD-II as defined by CARB 00337 sprintf(buffer,"OBDII"); 00338 } 00339 sprintf(buffer,"ERROR"); 00340 break; 00341 } 00342 case O2_SENS_PRES_ALT: { //******************* 00343 engine_data = (can_MsgRx.data[3]); //Check # of O2 sensors present by masking individual bits and counting 00344 int o2presalt = 0; 00345 if (((int) engine_data) & 0x01) { // Bank 1 Sensor 1 00346 o2presalt++; 00347 } 00348 if (((int) engine_data) & 0x02) { // Bank 1 Sensor 2 00349 o2presalt++; 00350 } 00351 if (((int) engine_data) & 0x04) { // Bank 2 Sensor 1 00352 o2presalt++; 00353 } 00354 if (((int) engine_data) & 0x08) { // Bank 2 Sensor 2 00355 o2presalt++; 00356 } 00357 if (((int) engine_data) & 0x10) { // Bank 3 Sensor 1 00358 o2presalt++; 00359 } 00360 if (((int) engine_data) & 0x20) { // Bank 3 Sensor 2 00361 o2presalt++; 00362 } 00363 if (((int) engine_data) & 0x40) { // Bank 4 Sensor 1 00364 o2presalt++; 00365 } 00366 if (((int) engine_data) & 0x80) { // Bank 4 Sensor 2 00367 o2presalt++; 00368 } 00369 sprintf(buffer,"%d Present",(int) o2presalt); 00370 break; 00371 } 00372 case AUX_IN_STATUS: { // A (A0 == PTO Active) 00373 engine_data = can_MsgRx.data[3]; 00374 if (((int) engine_data) & 0x01) { 00375 sprintf(buffer,"PTO Active"); 00376 } else { 00377 sprintf(buffer,"PTO Inactive"); 00378 } 00379 break; 00380 } 00381 case ENGINE_RUNTIME: // (A*256)+B 00382 engine_data = (can_MsgRx.data[3]*256)+(can_MsgRx.data[4]); 00383 sprintf(buffer,"%d Sec",(int) engine_data); 00384 break; 00385 case PID_21_40: // bit encoded NOT DONE 00386 PID2140 = ((can_MsgRx.data[3] << 24) | (can_MsgRx.data[4] << 16) | (can_MsgRx.data[5] << 8) | (can_MsgRx.data[6])); 00387 break; 00388 case DIST_TRAVELED_MIL: // (A*256) + B 00389 engine_data = ((can_MsgRx.data[3] * 256) + can_MsgRx.data[4]); 00390 sprintf(buffer,"%d",(int) engine_data); 00391 break; 00392 case FUEL_RAIL_PRESSURE: // ((A*256)+B)*0.079 00393 engine_data = ((can_MsgRx.data[3] * 256)+can_MsgRx.data[4])*0.079; 00394 sprintf(buffer,"%d kPa",(int) engine_data); 00395 break; 00396 case FUEL_RAIL_PRES_ALT: // ((A*256)+B)*0.079 00397 engine_data = ((can_MsgRx.data[3] * 256) + can_MsgRx.data[4])*10; 00398 sprintf(buffer,"%d kPa",(int) engine_data); 00399 break; 00400 case O2S1_WR_LAMBDA_V: // ((A*256)+B)*2/65535 [ratio], ((C*256)+D)*8/65535 [V] 00401 engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535); 00402 sprintf(buffer,"Ratio: %d",(int) engine_data); 00403 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535); 00404 sprintf(buffer2,"%d V",(int) engine_data); 00405 break; 00406 case O2S2_WR_LAMBDA_V: // 00407 engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535); 00408 sprintf(buffer,"Ratio: %d",(int) engine_data); 00409 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535); 00410 sprintf(buffer2,"%d V",(int) engine_data); 00411 break; 00412 case O2S3_WR_LAMBDA_V: // 00413 engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535); 00414 sprintf(buffer,"Ratio: %d",(int) engine_data); 00415 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535); 00416 sprintf(buffer2,"%d V",(int) engine_data); 00417 break; 00418 case O2S4_WR_LAMBDA_V: // 00419 engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535); 00420 sprintf(buffer,"Ratio: %d",(int) engine_data); 00421 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535); 00422 sprintf(buffer2,"%d V",(int) engine_data); 00423 break; 00424 case O2S5_WR_LAMBDA_V: // 00425 engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535); 00426 sprintf(buffer,"Ratio: %d",(int) engine_data); 00427 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535); 00428 sprintf(buffer2,"%d V",(int) engine_data); 00429 break; 00430 case O2S6_WR_LAMBDA_V: // 00431 engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535); 00432 sprintf(buffer,"Ratio: %d",(int) engine_data); 00433 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535); 00434 sprintf(buffer2,"%d V",(int) engine_data); 00435 break; 00436 case O2S7_WR_LAMBDA_V: // 00437 engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535); 00438 sprintf(buffer,"Ratio: %d",(int) engine_data); 00439 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535); 00440 sprintf(buffer2,"%d V",(int) engine_data); 00441 break; 00442 case O2S8_WR_LAMBDA_V: // 00443 engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*2)/65535); 00444 sprintf(buffer,"Ratio: %d",(int) engine_data); 00445 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])*8)/65535); 00446 sprintf(buffer2,"%d V",(int) engine_data); 00447 break; 00448 case COMMANDED_EGR: // 100*A/255 00449 engine_data = (can_MsgRx.data[3]*100/255); 00450 sprintf(buffer,"%d %%",(int) engine_data); 00451 break; 00452 case EGR_ERROR: // (A-128)*100/128 00453 engine_data = ((can_MsgRx.data[3]-128)*(100/128)); 00454 sprintf(buffer,"%d %%",(int) engine_data); 00455 break; 00456 case COMMANDED_EVAP_P: // 100*A/255 [%] 00457 engine_data = ((can_MsgRx.data[3]*100)/255); 00458 sprintf(buffer,"%d %%",(int) engine_data); 00459 break; 00460 case FUEL_LEVEL: //100*A/255 00461 engine_data = ((100*can_MsgRx.data[3])/255); 00462 sprintf(buffer,"%d %%",(int) engine_data); 00463 break; 00464 case WARMUPS_SINCE_CLR: //A 00465 engine_data = (can_MsgRx.data[3]); 00466 sprintf(buffer,"%d Warmups",(int) engine_data); 00467 break; 00468 case DIST_SINCE_CLR: //A*256+B [km] 00469 engine_data = ((can_MsgRx.data[3]*256)+can_MsgRx.data[4]); 00470 sprintf(buffer,"%d",(int) engine_data); 00471 break; 00472 case EVAP_PRESSURE: //((A*256)+B)/4 00473 engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/4); 00474 sprintf(buffer,"%d Pa",(int) engine_data); //Yes it's in pascals 00475 break; 00476 case BAROMETRIC_PRESSURE: //A 00477 engine_data = can_MsgRx.data[3]; 00478 sprintf(buffer,"%d kPa",(int) engine_data); 00479 break; 00480 case O2S1_WR_LAMBDA_I: //((A*256)+B)/32,768 [Ratio], ((C*256)+D)/256 - 128 [mA] 00481 engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768); 00482 sprintf(buffer,"Ratio: %d",(int) engine_data); 00483 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128); 00484 sprintf(buffer2,"%d mA",(int) engine_data); 00485 break; 00486 case O2S2_WR_LAMBDA_I: 00487 engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768); 00488 sprintf(buffer,"Ratio: %d",(int) engine_data); 00489 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128); 00490 sprintf(buffer2,"%d mA",(int) engine_data); 00491 break; 00492 case O2S3_WR_LAMBDA_I: 00493 engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768); 00494 sprintf(buffer,"Ratio: %d",(int) engine_data); 00495 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128); 00496 sprintf(buffer2,"%d mA",(int) engine_data); 00497 break; 00498 case O2S4_WR_LAMBDA_I: 00499 engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768); 00500 sprintf(buffer,"Ratio: %d",(int) engine_data); 00501 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128); 00502 sprintf(buffer2,"%d mA",(int) engine_data); 00503 break; 00504 case O2S5_WR_LAMBDA_I: 00505 engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768); 00506 sprintf(buffer,"Ratio: %d",(int) engine_data); 00507 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128); 00508 sprintf(buffer2,"%d mA",(int) engine_data); 00509 break; 00510 case O2S6_WR_LAMBDA_I: 00511 engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768); 00512 sprintf(buffer,"Ratio: %d",(int) engine_data); 00513 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128); 00514 sprintf(buffer2,"%d mA",(int) engine_data); 00515 break; 00516 case O2S7_WR_LAMBDA_I: 00517 engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768); 00518 sprintf(buffer,"Ratio: %d",(int) engine_data); 00519 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128); 00520 sprintf(buffer2,"%d mA",(int) engine_data); 00521 break; 00522 case O2S8_WR_LAMBDA_I: 00523 engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768); 00524 sprintf(buffer,"Ratio: %d",(int) engine_data); 00525 engine_data = ((((can_MsgRx.data[5]*256)+can_MsgRx.data[6])/256)-128); 00526 sprintf(buffer2,"%d mA",(int) engine_data); 00527 break; 00528 case CAT_TEMP_B1S1: //((A*256)+B)/10 - 40 [DegC] 00529 engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/10)-40); 00530 sprintf(buffer,"%d DegC",(int) engine_data); 00531 break; 00532 case CAT_TEMP_B1S2: 00533 engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/10)-40); 00534 sprintf(buffer,"%d DegC",(int) engine_data); 00535 break; 00536 case CAT_TEMP_B2S1: 00537 engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/10)-40); 00538 sprintf(buffer,"%d DegC",(int) engine_data); 00539 break; 00540 case CAT_TEMP_B2S2: 00541 engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/10)-40); 00542 sprintf(buffer,"%d DegC",(int) engine_data); 00543 break; 00544 case PID_41_60: //bit encoded NOT DONE 00545 PID4160 = ((can_MsgRx.data[3] << 24) | (can_MsgRx.data[4] << 16) | (can_MsgRx.data[5] << 8) | (can_MsgRx.data[6])); 00546 break; 00547 case MONITOR_STATUS: // bit encoded 00548 //LUT: (Uses multiple bytes) A7..0 always 0 00549 // Test enabled Test Incomplete 00550 // Misfire B0 B4 00551 // Fuel System B1 B5 00552 // Components B2 B6 00553 // Reserved B3 B7 00554 // Catalyst C0 D0 00555 // Heated Catalyst C1 D1 00556 // Evap System C2 D2 00557 // Sec. Ait system C3 D3 00558 // A/C Refrigerant C4 D4 00559 // O2 Sensor C5 D5 00560 // O2 Sensor Heater C6 D6 00561 // EGR System C7 D7 00562 break; 00563 case ECU_VOLTAGE: //((A*256)+B)/1000 [V] 00564 engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/1000); 00565 sprintf(buffer,"%d V",(int) engine_data); 00566 break; 00567 case ABSOLUTE_LOAD: //((A*256)+B)*100/255 [%] 00568 engine_data = ((((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*100)/255); 00569 sprintf(buffer,"%d %%",(int) engine_data); 00570 break; 00571 case COMMANDED_EQUIV_R: //((A*256)+B)/32768 [Ratio] 00572 engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])/32768); 00573 sprintf(buffer,"Ratio %d",(int) engine_data); 00574 break; 00575 case REL_THROTTLE_POS: // A*100/255 [%] 00576 engine_data = ((can_MsgRx.data[3]*100)/255); 00577 sprintf(buffer,"%d %%",(int) engine_data); 00578 break; 00579 case AMB_AIR_TEMP: // A-40 [DegC] 00580 engine_data = (can_MsgRx.data[3]-40); 00581 sprintf(buffer,"%d DegC",(int) engine_data); 00582 break; 00583 case ABS_THROTTLE_POS_B: // A*100/255 [%] 00584 engine_data = ((can_MsgRx.data[3]*100)/255); 00585 sprintf(buffer,"%d %%",(int) engine_data); 00586 break; 00587 case ABS_THROTTLE_POS_C: // A*100/255 [%] 00588 engine_data = ((can_MsgRx.data[3]*100)/255); 00589 sprintf(buffer,"%d %%",(int) engine_data); 00590 break; 00591 case ACCEL_POS_D: // A*100/255 [%] 00592 engine_data = ((can_MsgRx.data[3]*100)/255); 00593 sprintf(buffer,"%d %%",(int) engine_data); 00594 break; 00595 case ACCEL_POS_E: // A*100/255 [%] 00596 engine_data = ((can_MsgRx.data[3]*100)/255); 00597 sprintf(buffer,"%d %%",(int) engine_data); 00598 break; 00599 case ACCEL_POS_F: // A*100/255 [%] 00600 engine_data = ((can_MsgRx.data[3]*100)/255); 00601 sprintf(buffer,"%d %%",(int) engine_data); 00602 break; 00603 case COMMANDED_THROTTLE: //A*100/255 [%] 00604 engine_data = ((can_MsgRx.data[3]*100)/255); 00605 sprintf(buffer,"%d %%",(int) engine_data); 00606 break; 00607 case TIME_RUN_WITH_MIL: //(A*256)+B [minutes] 00608 engine_data = ((can_MsgRx.data[3]*256)/(can_MsgRx.data[4])); 00609 sprintf(buffer,"%d Mins",(int) engine_data); 00610 break; 00611 case TIME_SINCE_CLR: //(A*256)+B [minutes] 00612 engine_data = ((can_MsgRx.data[3]*256)/(can_MsgRx.data[4])); 00613 sprintf(buffer,"%d Mins",(int) engine_data); 00614 break; 00615 case MAX_R_O2_VI_PRES: //A,B,C,D*10 [Ratio,V,mA,kPa] 00616 engine_data = can_MsgRx.data[3]; 00617 sprintf(buffer,"Ratio: %d",(int) engine_data); 00618 engine_data = can_MsgRx.data[4]; 00619 sprintf(buffer,"%d V",(int) engine_data); 00620 engine_data = can_MsgRx.data[5]; 00621 sprintf(buffer,"%d mA",(int) engine_data); 00622 engine_data = (can_MsgRx.data[6]*10); 00623 sprintf(buffer,"%d kPa",(int) engine_data); 00624 break; 00625 case MAX_AIRFLOW_MAF: //A*10 [g/s] 00626 engine_data = (can_MsgRx.data[3]*10); 00627 sprintf(buffer,"%d g/s",(int) engine_data); 00628 break; 00629 case FUEL_TYPE: // USE LUT NOT DONE 00630 break; 00631 case ETHANOL_PERCENT: //A*100/255 [%] 00632 engine_data = ((can_MsgRx.data[3]*100)/255); 00633 sprintf(buffer,"%d %%",(int) engine_data); 00634 break; 00635 case ABS_EVAP_SYS_PRES: //1/200 per bit [kPa] ----NOT DONE---- 00636 break; 00637 case EVAP_SYS_PRES: // (A*256)+B - 32768 [Pa] 00638 engine_data = ((can_MsgRx.data[3]*256)+can_MsgRx.data[4]-32768); 00639 sprintf(buffer,"%d Pa",(int) engine_data); 00640 break; 00641 case ST_O2_TRIM_B1B3: // ((A-128)*100/128 (B-128)*100/128 [%] 00642 engine_data = ((can_MsgRx.data[3]-128)*(100/128)); 00643 sprintf(buffer,"%d %%",(int) engine_data); 00644 engine_data = ((can_MsgRx.data[4]-128)*(100/128)); 00645 sprintf(buffer,"%d %%",(int) engine_data); 00646 break; 00647 case LT_O2_TRIM_B1B3: 00648 engine_data = ((can_MsgRx.data[3]-128)*(100/128)); 00649 sprintf(buffer,"%d %%",(int) engine_data); 00650 engine_data = ((can_MsgRx.data[4]-128)*(100/128)); 00651 sprintf(buffer,"%d %%",(int) engine_data); 00652 break; 00653 case ST_02_TRIM_B2B4: 00654 engine_data = ((can_MsgRx.data[3]-128)*(100/128)); 00655 sprintf(buffer,"%d %%",(int) engine_data); 00656 engine_data = ((can_MsgRx.data[4]-128)*(100/128)); 00657 sprintf(buffer,"%d %%",(int) engine_data); 00658 break; 00659 case LT_O2_TRIM_B2B4: 00660 engine_data = ((can_MsgRx.data[3]-128)*(100/128)); 00661 sprintf(buffer,"%d %%",(int) engine_data); 00662 engine_data = ((can_MsgRx.data[4]-128)*(100/128)); 00663 sprintf(buffer,"%d %%",(int) engine_data); 00664 break; 00665 case ABS_FUEL_RAIL_PRES: //((A*256)+B)*10 [kPa] 00666 engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*10); 00667 sprintf(buffer,"%d kPa",(int) engine_data); 00668 break; 00669 case REL_ACCEL_POS: //A*100/255 [%] 00670 engine_data = ((can_MsgRx.data[3]*100)/255); 00671 sprintf(buffer,"%d %%",(int) engine_data); 00672 break; 00673 case HYBRID_BATT_PCT: //A*100/255 [%] 00674 engine_data = ((can_MsgRx.data[3]*100)/255); 00675 sprintf(buffer,"%d %%",(int) engine_data); 00676 break; 00677 case ENGINE_OIL_TEMP: //A-40 [DegC] 00678 engine_data = (can_MsgRx.data[3]-40); 00679 sprintf(buffer,"%d DegC",(int) engine_data); 00680 break; 00681 case FUEL_TIMING: //(38655-((A*256)+B))/128 00682 engine_data = ((38655 - ((can_MsgRx.data[3]*256)+can_MsgRx.data[4]))/128); 00683 sprintf(buffer,"%d Deg",(int) engine_data); 00684 break; 00685 case FUEL_RATE: //((A*256)+B)*0.05 00686 engine_data = (((can_MsgRx.data[3]*256)+can_MsgRx.data[4])*0.05); 00687 sprintf(buffer,"%d L/m",(int) engine_data); 00688 break; 00689 case EMISSIONS_STANDARD: //bit encoded ----NOT DONE---- 00690 break; 00691 case DEMANDED_TORQUE: //A-125 [%] 00692 engine_data = (can_MsgRx.data[3]-125); 00693 sprintf(buffer,"%d %%",(int) engine_data); 00694 break; 00695 case ACTUAL_TORQUE: //A-125 [%] 00696 engine_data = (can_MsgRx.data[3]-125); 00697 sprintf(buffer,"%d %%",(int) engine_data); 00698 break; 00699 case REFERENCE_TORQUE: //A*256+b [Nm] 00700 engine_data = ((can_MsgRx.data[3]*256)+can_MsgRx.data[4]); 00701 sprintf(buffer,"%d Nm",(int) engine_data); 00702 break; 00703 case ENGINE_PCT_TORQUE: //A-125 idle, B-125 pt 1, C-125, D-125 00704 engine_data = (can_MsgRx.data[3]); 00705 sprintf(buffer,"%d %% - Idle",(int) engine_data); 00706 engine_data = (can_MsgRx.data[4]); 00707 sprintf(buffer2,"%d %% - Point 1",(int) engine_data); 00708 engine_data = (can_MsgRx.data[5]); 00709 sprintf(buffer3,"%d %% - Point 2",(int) engine_data); 00710 engine_data = (can_MsgRx.data[6]); 00711 sprintf(buffer4,"%d %% - Point 3",(int) engine_data); 00712 break; 00713 case AUX_IO_SUPPORTED: //Bit encoded ----NOT DONE---- 00714 break; 00715 case P_MAF_SENSOR: 00716 sprintf(buffer,"Not supported"); 00717 break; 00718 case P_ENGINE_COOLANT_T: 00719 sprintf(buffer,"Not supported"); 00720 break; 00721 case P_INTAKE_TEMP: 00722 sprintf(buffer,"Not supported"); 00723 break; 00724 case P_COMMANDED_EGR: 00725 sprintf(buffer,"Not supported"); 00726 break; 00727 case P_COMMANDED_INTAKE: 00728 sprintf(buffer,"Not supported"); 00729 break; 00730 case P_EGR_TEMP: 00731 sprintf(buffer,"Not supported"); 00732 break; 00733 case P_COMMANDED_THROT: 00734 sprintf(buffer,"Not supported"); 00735 break; 00736 case P_FUEL_PRESSURE: 00737 sprintf(buffer,"Not supported"); 00738 break; 00739 case P_FUEL_INJ_PRES: 00740 sprintf(buffer,"Not supported"); 00741 break; 00742 case P_TURBO_PRESSURE: 00743 sprintf(buffer,"Not supported"); 00744 break; 00745 case P_BOOST_PRES_CONT: 00746 sprintf(buffer,"Not supported"); 00747 break; 00748 case P_VGT_CONTROL: 00749 sprintf(buffer,"Not supported"); 00750 break; 00751 case P_WASTEGATE_CONT: 00752 sprintf(buffer,"Not supported"); 00753 break; 00754 case P_EXHAUST_PRESSURE: 00755 sprintf(buffer,"Not supported"); 00756 break; 00757 case P_TURBO_RPM: 00758 sprintf(buffer,"Not supported"); 00759 break; 00760 case P_TURBO_TEMP1: 00761 sprintf(buffer,"Not supported"); 00762 break; 00763 case P_TURBO_TEMP2: 00764 sprintf(buffer,"Not supported"); 00765 break; 00766 case P_CACT: 00767 sprintf(buffer,"Not supported"); 00768 break; 00769 case P_EGT_B1: 00770 sprintf(buffer,"Not supported"); 00771 break; 00772 case P_EGT_B2: 00773 sprintf(buffer,"Not supported"); 00774 break; 00775 case P_DPF1: 00776 sprintf(buffer,"Not supported"); 00777 break; 00778 case P_DPF2: 00779 sprintf(buffer,"Not supported"); 00780 break; 00781 case P_DPF_TEMP: 00782 sprintf(buffer,"Not supported"); 00783 break; 00784 case P_NOX_NTE_STATUS: 00785 sprintf(buffer,"Not supported"); 00786 break; 00787 case P_PM_NTE_STATUS: 00788 sprintf(buffer,"Not supported"); 00789 break; 00790 case P_ENGINE_RUNTUME: 00791 sprintf(buffer,"Not supported"); 00792 break; 00793 case P_ENGINE_AECD_1: 00794 sprintf(buffer,"Not supported"); 00795 break; 00796 case P_ENGINE_AECD_2: 00797 sprintf(buffer,"Not supported"); 00798 break; 00799 case P_NOX_SENSOR: 00800 sprintf(buffer,"Not supported"); 00801 break; 00802 case P_MANIFOLD_TEMP: 00803 sprintf(buffer,"Not supported"); 00804 break; 00805 case P_NOX_SYSTEM: 00806 sprintf(buffer,"Not supported"); 00807 break; 00808 case P_PM_SENSOR: 00809 sprintf(buffer,"Not supported"); 00810 break; 00811 case P_IN_MANIF_TEMP: 00812 sprintf(buffer,"Not supported"); 00813 break; 00814 00815 }// End Switch (PID) 00816 return 1; 00817 }// End If Valid Reply 00818 }// End If Read CAN Message 00819 } 00820 pc.printf("CANBus Timeout -- "); 00821 return 0; 00822 } 00823 }
Generated on Wed Jul 13 2022 21:41:21 by
1.7.2