Julie Freeman / Mbed 2 deprecated MbedDashboard

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ecu_reader.cpp Source File

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 }