CAN-Bus ECU simulator. Only part of the SAE J1979 are implemented. Uses CAN-Bus demo board as hardware platform. http://skpang.co.uk/catalog/canbus-ecu-simulator-with-lpc1768-module-p-1400.html Useful for testing diagnostic tools.

Dependencies:   TextLCD mbed

Fork of ecu_reader by Sukkin Pang

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ecu_simulator.cpp Source File

ecu_simulator.cpp

00001 #include "mbed.h"
00002 #include "ecu_simulator.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_sim::ecu_sim(int can_speed)
00012 {
00013    can2.frequency(can_speed);
00014 }
00015 
00016 void ecu_sim::canspeed(int can_speed)
00017 {
00018     can2.frequency(can_speed);
00019 }
00020 
00021 
00022 
00023 #define TIMEOUT 200
00024 unsigned char ecu_sim::request(void)
00025 {
00026     char can_msg[8];
00027    
00028 
00029     
00030     
00031     if ((can2.read(can_MsgRx)) && (can_MsgRx.id == PID_REQUEST) ){
00032         led2 = 1;
00033         if(can_MsgRx.data[1] == MODE3) // Request trouble codes
00034         {
00035              if(ecu.dtc == false){
00036                  can_msg[0] = 0x02; 
00037                  can_msg[1] = MODE3_RESPONSE;    
00038                  can_msg[2] = 0x00;  
00039              }else{
00040                  can_msg[0] = 0x06; 
00041                  can_msg[1] = MODE3_RESPONSE;    
00042                  can_msg[2] = 0x02;  
00043                  can_msg[3] = 0x01;  
00044                  can_msg[4] = 0x00;                
00045                  can_msg[5] = 0x02;
00046                  can_msg[6] = 0x00;                
00047              }
00048              can2.write(CANMessage(PID_REPLY, can_msg, 8));
00049         }
00050 
00051         if(can_MsgRx.data[1] == MODE4) // Clear trouble codes, clear Check engine light
00052         {
00053             ecu.dtc = false;  
00054             led4 = 0;
00055             
00056             can_msg[0] = 0x00; 
00057             can_msg[1] = MODE4_RESPONSE;   
00058             can2.write(CANMessage(PID_REPLY, can_msg, 8)); 
00059         }
00060         
00061         if(can_MsgRx.data[1] == MODE1)
00062         {
00063             can_msg[1] = MODE1_RESPONSE;
00064             switch(can_MsgRx.data[2])
00065             {   /* Details from http://en.wikipedia.org/wiki/OBD-II_PIDs */
00066                 case PID_SUPPORTED:
00067                     can_msg[0] = 0x06;  
00068                     can_msg[2] = PID_SUPPORTED; 
00069                     can_msg[3] = 0xE8;
00070                     can_msg[4] = 0x19;
00071                     can_msg[5] = 0x30;
00072                     can_msg[6] = 0x12;
00073                     can_msg[5] = 0x00;
00074                     can2.write(CANMessage(PID_REPLY, can_msg, 8));    
00075                     
00076                     break;
00077                 
00078                 case MONITOR_STATUS:
00079                     can_msg[0] = 0x05;  
00080                     can_msg[2] = MONITOR_STATUS; 
00081                     
00082                     if(ecu.dtc == true) can_msg[3] = 0x82;
00083                         else can_msg[3] = 0x00;
00084                     
00085                     can_msg[4] = 0x07;
00086                     can_msg[5] = 0xFF;
00087                     can2.write(CANMessage(PID_REPLY, can_msg, 8));    
00088                     break;
00089                         
00090                 case ENGINE_RPM:              //   ((A*256)+B)/4    [RPM]
00091                     can_msg[0] = 0x04;  
00092                     can_msg[2] = ENGINE_RPM; 
00093                     can_msg[3] = (ecu.engine_rpm & 0xff00) >> 8;
00094                     can_msg[4] = ecu.engine_rpm & 0x00ff;
00095                     can2.write(CANMessage(PID_REPLY, can_msg, 8));              
00096                     break;
00097                                
00098                 case ENGINE_COOLANT_TEMP:     //     A-40              [degree C]
00099                     can_msg[0] = 0x03;  
00100                     can_msg[2] = ENGINE_COOLANT_TEMP; 
00101                     can_msg[3] = ecu.coolant_temp;
00102                     can2.write(CANMessage(PID_REPLY, can_msg, 8));
00103                     break;
00104                                
00105                 case VEHICLE_SPEED:         // A                  [km]
00106                     can_msg[0] = 0x03;  
00107                     can_msg[2] = VEHICLE_SPEED; 
00108                     can_msg[3] = ecu.vehicle_speed;
00109                     can2.write(CANMessage(PID_REPLY, can_msg, 8));
00110                     break;
00111     
00112                 case MAF_SENSOR:               // ((256*A)+B) / 100  [g/s]
00113                     can_msg[0] = 0x04;  
00114                     can_msg[2] = MAF_SENSOR; 
00115                     can_msg[3] = (ecu.maf_airflow & 0xff00) >> 8;
00116                     can_msg[4] =  ecu.maf_airflow & 0x00ff;
00117                     can2.write(CANMessage(PID_REPLY, can_msg, 8));                
00118                     break;
00119     
00120                 case O2_VOLTAGE:            // A * 0.005   (B-128) * 100/128 (if B==0xFF, sensor is not used in trim calc)
00121                     can_msg[0] = 0x04;  
00122                     can_msg[2] = O2_VOLTAGE; 
00123                     can_msg[3] = ecu.o2_voltage & 0x00ff;
00124                     can_msg[4] = (ecu.o2_voltage & 0xff00) >> 8;
00125                     can2.write(CANMessage(PID_REPLY, can_msg, 8));                
00126                     break;;
00127                    
00128                 case THROTTLE:            //
00129                     can_msg[0] = 0x03;  
00130                     can_msg[2] = THROTTLE; 
00131                     can_msg[3] = ecu.throttle_position;
00132                     can2.write(CANMessage(PID_REPLY, can_msg, 8));         
00133                     break;
00134               }//switch
00135         }
00136     
00137               
00138  
00139     pc.printf("\n\r%x %x %x %x %x %x %x %x %x",can_MsgRx.id,can_MsgRx.data[0],
00140                                            can_MsgRx.data[1],
00141                                            can_MsgRx.data[2],
00142                                            can_MsgRx.data[3],
00143                                            can_MsgRx.data[4],
00144                                            can_MsgRx.data[5],
00145                                            can_MsgRx.data[6],
00146                                            can_MsgRx.data[7]);
00147     led2 = 0;
00148    }
00149     
00150     return 0;
00151 
00152 }
00153 
00154    
00155 } // namespace mbed