KAT MFL
/
Baja_Brains_6
main.cpp
- Committer:
- G02_KAT
- Date:
- 2012-02-16
- Revision:
- 0:c6ed639a9fae
File content as of revision 0:c6ed639a9fae:
#include "mbed.h" #include "MSCFileSystem.h" class Watchdog { public: void kick(float s) { LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 LPC_WDT->WDTC = s * (float)clk; LPC_WDT->WDMOD = 0x3; // Enabled and Reset kick(); } void kick() { LPC_WDT->WDFEED = 0xAA; LPC_WDT->WDFEED = 0x55; } }; //Declare interrupt pin InterruptIn killSwitch(p21); //USB Setup DigitalOut USBSelect(p24); //Stopwatch timer Timer toothTime; Timer loopTime; //Watchdog Watchdog wdt; //Battery Level Input AnalogIn battery(p20); //Indicator Lights DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); CANMessage msg; //Analog Mux AnalogIn analogIn(p15); //AnalogOut analogOut (p18); DigitalOut enA (p10); BusOut selectAnalog (p11,p12,p13,p14); //Digital Mux DigitalIn digitalIn (p16); //DigitalOut digitalOut (p17); DigitalOut enD (p5); BusOut selectDigital (p6,p7,p8,p9); //CAN communication CAN can1 (p30,p29); DigitalOut canEn (p26); //Variables int gearH, gearL, gearR, gearPos, fuel1, fuel2, fuel3, fuel4, fuel5, fuelLev; int teethMotor, teethB; int dataCollectTime; int count, i,j,x,y; int variable=0; int timeCAN = 0; int TIME_CAN_MAX = 1000; double x1, y1, z1, x2, y2, z2; double temp, clutch,vBatt, vBattery, batteryVoltage; double susp1, susp2, susp3, susp4; double circumfB,diameter, backSpeed, frontSpeed, rpmMotor, motorRPM; double timeA, timeout1, timeLoop; char filename[64]; char date[32]; char time1[32]; char time2[32]; char time3[32]; char dataCAN[8]; char batLev, gearPosition, fuelLevel, rpm_motor, temperature, wheelSpeed; //Interrupt Routine void trigger() { FILE *fp = fopen(filename, "a+"); //open file and add to it if(fp){ fprintf(fp,"%s,%d,%d,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f \n",time3, gearPos,fuelLev,backSpeed,frontSpeed,motorRPM,x1,y1,z1,x2,y2,z2,temp,clutch,batteryVoltage); fclose(fp); } wait(5); //wait for power to turn off } void countTeeth(){ count = 8; timeout1 = 1; toothTime.start(); x = digitalIn.read(); y = digitalIn.read(); while(count > 0 & toothTime.read() < timeout1){ if (x != y){ count--; x=y; } y = digitalIn.read(); } timeA = toothTime.read(); } //Polling Routine void Polling(){ //Speed 1 - back wheel diameter = 0.58; //in kilometers teethB = 4; selectDigital = 12; wait_us(0.05); countTeeth(); if(timeA > timeout1){ backSpeed = 0; //car not moving!!! }else{ backSpeed = (1/timeA)*3.14*diameter*3.6; //km/hr } toothTime.reset(); //Reverse Gear selectDigital = 0; wait_us(0.05); gearR = digitalIn.read(); //Low Gear selectDigital = 1; wait_us(0.05); gearL = digitalIn.read(); //High Gear selectDigital = 2; wait_us(0.05); gearH = digitalIn.read(); //Fuel 5 selectDigital = 3; wait_us(0.05); fuel5 = digitalIn.read(); //Fuel 4 selectDigital = 4; wait_us(0.05); fuel4 = digitalIn.read(); //Fuel 3 selectDigital = 5; wait_us(0.05); fuel3 = digitalIn.read(); //Fuel 2 selectDigital = 6; wait_us(0.05); fuel2 = digitalIn.read(); //Fuel 1 selectDigital = 7; wait_us(0.05); fuel1 = digitalIn.read(); //Motor rpm circumfB = 0.58/1000; //in kilometers teethMotor = 12; selectDigital = 11; wait_us(0.05); countTeeth(); if(timeA > timeout1){ motorRPM = 0; //motor not moving!!! }else{ motorRPM = 60/(timeA*3); //rev/min } toothTime.reset(); //Clutch selectAnalog = 15; wait_us(0.05); clutch = analogIn.read(); //Accelerometer x1 selectAnalog = 0; wait_us(0.05); x1 = analogIn.read(); //Accelerometer y1 selectAnalog = 1; wait_us(0.05); y1 = analogIn.read(); //Accelerometer z1 selectAnalog = 2; wait_us(0.05); z1 = analogIn.read(); //Temperature (sig4) selectAnalog = 8; wait_us(0.05); temp = analogIn.read(); //Battery Level vBatt = battery.read(); /* //Suspension 1 selectAnalog = 11; wait_us(0.05); susp1 = analogIn.read(); //Suspension 2 selectAnalog = 12; wait_us(0.05); susp2 = analogIn.read(); //Suspension 3 selectAnalog = 13; wait_us(0.05); susp3 = analogIn.read(); //Suspension 4 selectAnalog = 14; wait_us(0.05); susp4 = analogIn.read(); */ } void translateData(){ //convert to gear gearPos = 0; // N if (gearL==0){ gearPos = 1; } if (gearH==0){ gearPos = 2; } if (gearR==0){ gearPos = 3; } //convert to fuel level 1-4 (1=Empty 5=Full) fuelLev = 5; //Full if (fuel1==1){ fuelLev = 4; } if (fuel2==1){ fuelLev = 3; } if (fuel3==1){ fuelLev = 2; } if (fuel4==1){ fuelLev = 1; } if (fuel5==1){ fuelLev = 0; //Empty } //convert battery voltage (82=10V & 100=15V) vBattery = vBatt * 100; if(vBattery < 82){ vBattery = 82; } batteryVoltage = vBatt * 14.8; //change battery % to volts //convert motor rpm 0-40 thousand rpm rpmMotor = motorRPM/100; //0-40 if(rpmMotor > 40){ rpmMotor = 40; } //convert wheel speed (0-150 km/hr) if(backSpeed > 150){ backSpeed = 150; } //convert temperature (0-180 degrees C) //convert clutch position //convert accelerometer values } void getCAN(){ //Request Data from Display while(!can1.read(msg) && (timeCAN < TIME_CAN_MAX) ){ timeCAN++;//wait until data is received } if(timeCAN < TIME_CAN_MAX){ variable = msg.data[0];//if data is received store (x2, y2, z2, frontSpeed) printf("CAN message received: %d, %d, %d, %d id:%d\r\n", variable, msg.data[1],msg.data[2],msg.data[3],msg.id); x2 = msg.data[1]; y2 = msg.data[2]; z2 = msg.data[3]; frontSpeed = msg.data[4]; }else{ printf("CAN message timeout\r\n"); x2 = NULL;//if no data timeout and store as null y2 = NULL; z2 = NULL; frontSpeed = NULL; } timeCAN = 0; } //Send data to Display void sendCAN(){ //Cast to char batLev = (char) vBattery; //82-100 gearPosition = (char) gearPos; //0-3 fuelLevel = (char) fuelLev; //0-5 rpm_motor = (char) rpmMotor; //0-40 temperature = (char) temp; //0-180 wheelSpeed = (char) backSpeed; //0-150 char dataCAN[8] = {rpm_motor,fuelLevel,gearPosition,batLev,temperature, wheelSpeed,0,0}; //send data to display (gearPos, fuelLev, backSpeed, rpmMotor, batLev, temp) if (can1.write(CANMessage(0xFF01FF, dataCAN, 8, CANData, CANExtended))){ //CAN message sent }else{ //CAN message not sent } timeLoop = loopTime.read(); j--; wait(0.1); } //*****************************************************************Main Program************************************************************************************************* int main() { wdt.kick(5.0); killSwitch.rise(&trigger); loopTime.start(); USBSelect = 0; //enable USB channel 1 enA = 1; //enable analog mux enD = 1; //enable digital mux canEn = 0; //enable CAN can1.frequency(250000); //Set Time and Date //*****DO THIS THE FIRST TIME ONLY!******** //set_time(1328382900); //seconds since Jan. 1, 1970 - use Unix Time Converter http://www.epochconverter.com/ //started on Feb. 4, 2012 at 19:15:00 while(1){ //while forever //Create File time_t seconds = time(NULL); strftime(time1, 32, "%H_%M_%S", localtime(&seconds)); strftime(date, 32, "%m/%d/%y", localtime(&seconds)); sprintf(filename, "/fs/%s.csv", time1); MSCFileSystem fs("fs"); FILE *fp = fopen(filename, "w"); if(fp){ fprintf(fp,"Date(MM/DD/YY): %s \n", date); strftime(time2, 32, "%H:%M:%S", localtime(&seconds)); fprintf(fp,"Start Time: %s \n", time2); fprintf(fp,"Time, Gear Position, Fuel Level,Back Wheel Speed(km/h),Front Wheel Speed(km/h),Motor RPM,x1,y1,z1,x2,y2,z2,Temperature(C),Clutch Position(cm),Battery(V) \n"); fclose(fp); }else{//no USB } i=100; //print to USB file 100 times before opening a new file while(i > 0){ //Get a CAN message getCAN(); //Get sensor data Polling(); //Translate raw sensor data translateData(); //Print to USB if(fp != NULL){ FILE *fp = fopen("/fs/data.csv", "a+"); time_t seconds = time(NULL); strftime(time3, 32, "%H:%M:%S", localtime(&seconds)); fprintf(fp,"%s,%d,%d,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f \n",time3, gearPos,fuelLev,backSpeed,frontSpeed,motorRPM,x1,y1,z1,x2,y2,z2,temp,clutch,batteryVoltage); fclose(fp); fp = NULL; }else{//no USB } //Send a CAN message sendCAN(); i--; } //close while i loop timeLoop = loopTime.read(); loopTime.reset(); wdt.kick(); }//close forever while loop }//close main