Revision:
0:c6ed639a9fae
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Feb 16 03:04:26 2012 +0000
@@ -0,0 +1,412 @@
+#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
\ No newline at end of file