Dependencies: FatFileSystem mbed GPS TextLCD
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
Generated on Fri Jul 15 2022 13:02:58 by 1.7.2