Dependencies:   FatFileSystem mbed GPS TextLCD

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 
00005 
00006 // Use a timer to see if things take too long
00007 Timer CANTimer;  
00008 namespace mbed { 
00009 
00010 
00011 ecu_reader::ecu_reader(int can_speed)
00012 {
00013     can2.frequency(can_speed);
00014 }
00015 
00016 
00017 #define TIMEOUT 200
00018 unsigned char ecu_reader::request(unsigned char pid,  char *buffer)
00019 {
00020     char can_msg[8];
00021     float engine_data;
00022         
00023     led1 = 1;
00024   
00025     can_msg[0] = 0x02;  
00026     can_msg[1] = 0x01;
00027     can_msg[2] = pid;  
00028     can_msg[3] = 0;
00029     can_msg[4] = 0;  
00030     can_msg[5] = 0;
00031     can_msg[6] = 0;  
00032     can_msg[7] = 0;
00033 
00034    if (can2.write(CANMessage(PID_REQUEST, can_msg, 8))) {
00035          
00036     }
00037    
00038    led1 = 0;
00039    CANTimer.reset();
00040    CANTimer.start();
00041    
00042    while(CANTimer.read_ms() < TIMEOUT) {
00043    
00044    if (can2.read(can_MsgRx)) {
00045                
00046         if((can_MsgRx.id == PID_REPLY) && (can_MsgRx.data[2] == pid))
00047         { 
00048                         switch(can_MsgRx.data[2])
00049                         {   /* Details from http://en.wikipedia.org/wiki/OBD-II_PIDs */
00050                             case ENGINE_RPM:              //   ((A*256)+B)/4    [RPM]
00051                                 engine_data =  ((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/4;
00052                                 sprintf(buffer,"%d rpm ",(int) engine_data);
00053                                 break;
00054                             
00055                             case ENGINE_COOLANT_TEMP:     //     A-40              [degree C]
00056                                 engine_data =  can_MsgRx.data[3] - 40;
00057                                 sprintf(buffer,"%d degC ",(int) engine_data);
00058                             
00059                             break;
00060                             
00061                             case VEHICLE_SPEED:         // A                  [km]
00062                                 engine_data =  can_MsgRx.data[3];
00063                                 sprintf(buffer,"%d km ",(int) engine_data);
00064                             
00065                             break;
00066 
00067                             case MAF_SENSOR:               // ((256*A)+B) / 100  [g/s]
00068                                 engine_data =  ((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/100;
00069                                 sprintf(buffer,"%d g/s",(int) engine_data);
00070                             
00071                             break;
00072 
00073                             case O2_VOLTAGE:            // A * 0.005   (B-128) * 100/128 (if B==0xFF, sensor is not used in trim calc)
00074                                 engine_data = can_MsgRx.data[3]*0.005;
00075                                 sprintf(buffer,"%d v ",(int) engine_data);
00076      
00077                             case THROTTLE:            //
00078                                 engine_data = (can_MsgRx.data[3]*100)/255;
00079                                 sprintf(buffer,"%d %% ",(int) engine_data);
00080                              
00081                             
00082                             break;
00083                         }
00084         
00085                 return 1;
00086         
00087          }
00088 
00089    }
00090    }
00091 
00092      return 0;
00093   
00094 
00095 
00096 
00097 }
00098 } // namespace mbed