Sergeh Vartanian
/
ecu_reader
Final Report
Fork of ecu_reader by
Diff: main.cpp
- Revision:
- 6:dae9630af6e3
- Parent:
- 3:05bb8f0bd7a4
--- a/main.cpp Tue Aug 28 13:16:46 2012 +0000 +++ b/main.cpp Mon Oct 27 02:46:55 2014 +0000 @@ -1,88 +1,150 @@ -/* - -mbed Can-Bus demo - -This program is to demonstrate the CAN-bus capability of the mbed module. - -http://www.skpang.co.uk/catalog/product_info.php?products_id=741 - -v1.0 July 2010 - -******************************************************************************** - -WARNING: Use at your own risk, sadly this software comes with no guarantees. -This software is provided 'free' and in good faith, but the author does not -accept liability for any damage arising from its use. - -******************************************************************************** - - -*/ #include "mbed.h" #include "ecu_reader.h" #include "globals.h" #include "TextLCD.h" -#include "GPS.h" -#include "SDFileSystem.h" - -GPS gps(p28, p27); -TextLCD lcd(p18, p19, p20, p17, p16, p15, p14); // rs, rw, e, d0, d1, d2, d3 -SDFileSystem sd(p5, p6, p7, p13, "sd"); +#include <stdio.h> +#include <string> +//#include "SDFileSystem.h" -DigitalIn click(p21); // Joystick inputs -DigitalIn right(p22); -DigitalIn down(p23); -DigitalIn left(p24); -DigitalIn up(p25); +TextLCD lcd(p26, p25, p24, p23, p22, p20, p19, TextLCD::LCD20x4);//(p18, p19, p20, p17, p16, p15, p14); // rs, rw, e, d0, d1, d2, d3 +//SDFileSystem sd(p5, p6, p7, p13, "sd"); + Serial pc(USBTX, USBRX); +DigitalIn enable(p8); + +Serial xbee1(p9, p10); //Creates a variable for serial comunication through pin 9 and 10 +DigitalOut rst1(p11); //Digital reset for the XBee, 200ns for reset ecu_reader obdii(CANSPEED_500); //Create object and set CAN speed -void gps_demo(void); -void sd_demo(void); +//void sd_demo(void); + +void Rx_interrupt() { + float rx_data[8]; + int first_byte[8]; + int second_byte[8]; + char buffer[30]; + if (can2.read(can_MsgRx)){ + //xbee1.printf("\n\rPackets Received:\n\r"); + + if((can_MsgRx.id == Filter1) || (can_MsgRx.id == Filter1) || (can_MsgRx.id == Filter2) || (can_MsgRx.id == Filter3) || (can_MsgRx.id == Filter4) || (can_MsgRx.id == Filter5) || (can_MsgRx.id == Filter6) + || (can_MsgRx.id == Filter7) || (can_MsgRx.id == Filter8) || (can_MsgRx.id == Filter9) || (can_MsgRx.id == Filtera) || (can_MsgRx.id == Filterb) || (can_MsgRx.id == Filterc)){ + //xbee1.printf("\n\rIgnored\n\r"); + } + + else{ + for (int z = 0; z < 8; z++){ + rx_data[z] = (can_MsgRx.data[z]); + if (rx_data[z] > 15){ + first_byte[z] = rx_data[z]/16; + second_byte[z] = (int)(rx_data[z])%16;} + else { + first_byte[z] = 0; + second_byte[z] = rx_data[z]; + }} + + sprintf(buffer,"\n\r%d, %d, %d, %d, %d, %d, %d, %d", (int) rx_data[0],(int) rx_data[1],(int) rx_data[2],(int) rx_data[3],(int) rx_data[4],(int) rx_data[5],(int) rx_data[6],(int) rx_data[7] ); + xbee1.printf(buffer, "\n\r"); + sprintf(buffer,"%d%d %d%d %d%d %d%d %d%d %d%d %d%d %d%d", (int) first_byte[0],(int) second_byte[0],(int) first_byte[1],(int) second_byte[1],(int) first_byte[2],(int) second_byte[2],(int) first_byte[3],(int) second_byte[3], + (int) first_byte[4],(int) second_byte[4],(int) first_byte[5],(int) second_byte[5],(int) first_byte[6],(int) second_byte[6],(int) first_byte[7],(int) second_byte[7]); + xbee1.printf(buffer); + xbee1.printf("\n\r"); + } + } + } int main() { - pc.baud(115200); - char buffer[20]; + + int Mod1 = 0; + int Mod2 = 0; + + rst1 = 0; //Set reset pin to 0 + wait_ms(1);//Wait at least one millisecond + rst1 = 1;//Set reset pin to 1 + wait_ms(1); - //Enable Pullup - click.mode(PullUp); - right.mode(PullUp); - down.mode(PullUp); - left.mode(PullUp); - up.mode(PullUp); + //pc.baud(115200); + // xbee1.baud(9600); + xbee1.baud(115200); //set serial baurd rate, need to configure the xbees to 115200 manually + char buffer[30]; - printf("ECU Reader \n"); - lcd.locate(0,0); // Set LCD cursor position - lcd.printf("CAN-Bus demo"); + // xbee1.printf("ECU Reader \n"); + // lcd.locate(0,0); // Set LCD cursor position + // lcd.printf("ECU Malicious Attack"); - lcd.locate(0,1); - lcd.printf("www.skpang.co.uk"); + // lcd.locate(0,1); + // lcd.printf(" UCLA EE202A"); + + can2.attach(&Rx_interrupt);//, CAN::RxIrq ); //need to figure this out /////// - pc.printf("\n\rCAN-bus demo..."); - - wait(3); - lcd.cls(); - lcd.printf("Use joystick"); + xbee1.printf("\n\rECU Malicious Attack\n\rUCLA EE202A\n\r"); + //wait(3); + //lcd.cls(); + // lcd.locate(0,2); + //lcd.printf("Use joystick"); - lcd.locate(0,1); - lcd.printf("U-CAN:D-GPS:L-SD"); - - pc.printf("\nU-CAN:D-GPS:L-SD"); + // lcd.locate(0,3); + // lcd.printf(" Push BTN1 to Start"); + int can_bus_speed = 500000; + + xbee1.printf("\n\r\n\rSelect CAN BUS Frequency\n\r0: 125Kbps\n\r1: 250Kbps\n\r2: 500Kbps\n\r3: 1Mbps\n\r "); + + while(1){ + if (xbee1.readable()){ + + char c_freq = xbee1.getc(); + + if (c_freq == '0'){ + can_bus_speed = 125000; + break;} + if (c_freq == '1'){ + can_bus_speed = 25000; + break;} + if (c_freq == '2'){ + can_bus_speed = 500000; + break;} + if (c_freq == '3'){ + can_bus_speed = 1000000; + break;} + + } + } + + can2.frequency(can_bus_speed); + + xbee1.printf("\n\rPush BTN1 to Start\n\r"); while(1) // Wait until option is selected by the joystick { - - if(down == 0) gps_demo(); - if(left == 0) sd_demo(); - - if(up == 0) break; + + if(enable == 0) break; } - lcd.cls(); + wait(1); + // lcd.cls(); + + xbee1.printf("\n\r\n\rSelect Mode of Operation:\n\r\n\r0: PID Reading (RPM, Air Intake Temp., Fuel Pressure, and Etc...)\n\r1: Transmit and Receive CAN Packets\n\r"); + + while (1) + { + if (xbee1.readable()) { + char c1 = xbee1.getc(); + if (c1 == '0'){ + Mod1 = 1; + xbee1.printf("\n\rPID Mode Selected!\n\r"); + break; } + if (c1 == '1'){ + Mod2 = 1; + xbee1.printf("\n\rCAN Packet Communication Mode Selected!\n\r"); + break;} + } + } while(1) { // Main CAN loop + + if (Mod1 == 1){ + led2 = 1; wait(0.1); led2 = 0; @@ -92,85 +154,192 @@ { lcd.locate(0,0); lcd.printf(buffer); - pc.printf(buffer); + xbee1.printf(buffer); + xbee1.printf("\n\r"); } if(obdii.request(ENGINE_COOLANT_TEMP,buffer) == 1) { lcd.locate(9,0); lcd.printf(buffer); + xbee1.printf(buffer); + xbee1.printf("\n\r"); } if(obdii.request(VEHICLE_SPEED,buffer) == 1) { lcd.locate(0,1); lcd.printf(buffer); + xbee1.printf(buffer); + xbee1.printf("\n\r"); } if(obdii.request(THROTTLE,buffer) ==1 ) { lcd.locate(9,1); - lcd.printf(buffer); + lcd.printf(buffer); + xbee1.printf(buffer); + xbee1.printf("\n\r"); } - } -} - -void gps_demo(void) -{ - lcd.cls(); - lcd.printf("GPS demo"); - lcd.locate(0,1); - lcd.printf("Waiting for lock"); - - wait(3); - lcd.cls(); - - while(1) + if(obdii.request(AIR_INTAKE_TEMP,buffer) ==1 ) + { + lcd.locate(0,2); + lcd.printf(buffer); + xbee1.printf(buffer); + xbee1.printf("\n\r"); + } + + if(obdii.request(FUEL_PRESSURE,buffer) ==1 ) + { + lcd.locate(9,2); + lcd.printf(buffer); + xbee1.printf(buffer); + xbee1.printf("\n\r"); + } + } + + else if (Mod2 == 1){ + led4 = 1; + wait(0.1); + led4 = 0; + wait(0.1); + float rx_data[8]; + int first_byte[8]; + int second_byte[8]; + + int packet1 = 0; + int packet2 = 0; + int packet3 = 0; + int packet4 = 0; + int receive0 = 0; + + char can_bus_msg[8]; + +xbee1.printf("\n\r\n\rSelect Type of Packet to Transmit:\n\r\n\ra: Flow Control\n\rb: Tester Present\n\rc: Enhanced Diagnostics\n\rd: Security Access: Request Seed\n\re: Sniff Packets"); + + + while (1) { - if(gps.sample()) { - lcd.cls(); - lcd.printf("Long:%f", gps.longitude); - lcd.locate(0,1); - lcd.printf("Lat:%f", gps.latitude); - pc.printf("I'm at %f, %f\n", gps.longitude, gps.latitude); - } else { - pc.printf("Oh Dear! No lock :(\n"); - lcd.cls(); - lcd.printf("Waiting for lock"); - + if (xbee1.readable()) { + char c = xbee1.getc(); + if (c == 'a'){ + packet1 = 1; + xbee1.printf("\n\rFlow Control Packet Selected!\n\r"); + break; } + if (c == 'b'){ + packet2 = 1; + xbee1.printf("\n\rTester Present Packet Selected!\n\r"); + break;} + if (c == 'e'){ + receive0 = 1; + xbee1.printf("\n\rRead Filtered Packets!\n\r"); + break;} + if (c == 'c'){ + packet3 = 1; + xbee1.printf("\n\rEnhanced Diagnostics Packet Selected!\n\r"); + break;} + + if (c == 'd'){ + packet4 = 1; + xbee1.printf("\n\rRequest Seed Packet Selected!\n\r"); + break;} } } - -} - -void sd_demo(void) -{ - lcd.cls(); - printf("\nSD demo"); - lcd.printf("SD demo"); - wait(2); - lcd.cls(); + + if (packet1) { //flow control packet + + can_bus_msg[0] = 0x30; //0x30 Clear To Send, 0x31 Wait + can_bus_msg[1] = 0; //Block Size, 0 -> Don't wait, send as many frames as are in the message + can_bus_msg[2] = 0; //Separation Time -> 0 -> Send As Fast As Possible, 101-255 are viable numbers + can_bus_msg[3] = 0; //Don't Care + can_bus_msg[4] = 0; //Don't Care + can_bus_msg[5] = 0; //Don't Care + can_bus_msg[6] = 0; //Don't Care + can_bus_msg[7] = 0; //Don't Care + + can2.write(CANMessage(Ext_Diag, can_bus_msg, 8)); //7E0 Extension Diag. TX + packet1 = 0; + + } + + else if (packet2) { + + can_bus_msg[0] = 0x02; + can_bus_msg[1] = 0x3E; + can_bus_msg[2] = 0x02; + can_bus_msg[3] = 0; + can_bus_msg[4] = 0; + can_bus_msg[5] = 0; + can_bus_msg[6] = 0; + can_bus_msg[7] = 0; + + can2.write(CANMessage(Ext_Diag, can_bus_msg, 8)); //7E0 Extension Diag. TX + packet2 = 0; + } - FILE *fp = fopen("/sd/sdtest2.txt", "w"); - if(fp == NULL) { - lcd.cls(); - lcd.printf("Could not open file for write\n"); - pc.printf("\nCould not open file for write"); - } - fprintf(fp, "Hello fun SD Card World! testing 1234"); - fclose(fp); - lcd.locate(0,1); - lcd.printf("Writtern to SD card"); - pc.printf("\nWrittern to SD card"); + else if (packet3) { + + can_bus_msg[0] = 0x02; + can_bus_msg[1] = 0x10; + can_bus_msg[2] = 0x82; + can_bus_msg[3] = 0; + can_bus_msg[4] = 0; + can_bus_msg[5] = 0; + can_bus_msg[6] = 0; + can_bus_msg[7] = 0; + + can2.write(CANMessage(Ext_Diag, can_bus_msg, 8)); //7E0 Extension Diag. TX + packet3 = 0; + } + else if (packet4) { + + can_bus_msg[0] = 0x02; + can_bus_msg[1] = 0x27; + can_bus_msg[2] = 0x01; + can_bus_msg[3] = 0; + can_bus_msg[4] = 0; + can_bus_msg[5] = 0; + can_bus_msg[6] = 0; + can_bus_msg[7] = 0; + + can2.write(CANMessage(Ext_Diag, can_bus_msg, 8)); //7E0 Extension Diag. TX + packet3 = 0; + } + + else if (receive0) { - while(1) - { - led2 = 1; - wait(0.1); - led2 = 0; - wait(0.1); - - } - -} + if (can2.read(can_MsgRx)){ + + if((can_MsgRx.id == Filter1) || (can_MsgRx.id == Filter1) || (can_MsgRx.id == Filter2) || (can_MsgRx.id == Filter3) || (can_MsgRx.id == Filter4) || (can_MsgRx.id == Filter5) || (can_MsgRx.id == Filter6) + || (can_MsgRx.id == Filter7) || (can_MsgRx.id == Filter8) || (can_MsgRx.id == Filter9) || (can_MsgRx.id == Filtera) || (can_MsgRx.id == Filterb) || (can_MsgRx.id == Filterc)){ + xbee1.printf("\n\rIgnored\n\r"); + } + + else{ + for (int z = 0; z < 8; z++){ + rx_data[z] = (can_MsgRx.data[z]); + if (rx_data[z] > 15){ + first_byte[z] = rx_data[z]/16; + second_byte[z] = (int)(rx_data[z])%16;} + else { + first_byte[z] = 0; + second_byte[z] = rx_data[z]; + }} + + sprintf(buffer,"%d, %d, %d, %d, %d, %d, %d, %d", (int) rx_data[0],(int) rx_data[1],(int) rx_data[2],(int) rx_data[3],(int) rx_data[4],(int) rx_data[5],(int) rx_data[6],(int) rx_data[7] ); + xbee1.printf(buffer); + xbee1.printf("\n\r"); + sprintf(buffer,"%d%d %d%d %d%d %d%d %d%d %d%d %d%d %d%d", (int) first_byte[0],(int) second_byte[0],(int) first_byte[1],(int) second_byte[1],(int) first_byte[2],(int) second_byte[2],(int) first_byte[3],(int) second_byte[3], + (int) first_byte[4],(int) second_byte[4],(int) first_byte[5],(int) second_byte[5],(int) first_byte[6],(int) second_byte[6],(int) first_byte[7],(int) second_byte[7]); + xbee1.printf(buffer); + xbee1.printf("\n\r"); + } + } + + } + } // end else + } //end while +}//end main + +