A project similar to http://mbed.org/users/lhiggs/code/UM6_IMU_AHRS_2012/, where I'm trying to log data from a UM6 (CH Robotics orientation sensor) and a GPS transceiver to an sd card. I've adapted LHiggs code to include ModGPS. For sum reason a soon as I pick up a gps signal the UM6 data freezes i.e. the time and gps signals continue to print out but the UM6 signals fixes on a single value.

Dependencies:   MODGPS MODSERIAL SDFileSystem mbed

Revision:
9:7dcfa24d5e7a
Parent:
8:0ce247da6370
Child:
10:d96e068f3595
--- a/main.cpp	Mon May 27 17:22:36 2013 +0000
+++ b/main.cpp	Thu May 30 13:32:54 2013 +0000
@@ -6,22 +6,17 @@
 
 
 //------------ system and interface setup ----------------------------//
-//////////////////////////////////////LocalFileSystem local("local");  // sets up local file on mbed
 MODSERIAL pc(USBTX, USBRX);  // sets up serial connection to pc terminal
 
 //------------ Hardware setup ----------------------------------------//
-DigitalOut pc_led(LED1);    // LED1 = PC SERIAL
-DigitalOut uart_led(LED2);  // LED2 = UM6 SERIAL
-DigitalOut log_led(LED3);    // debug LED
-DigitalIn enable(p10);    // enable signal for logging data to file
+DigitalOut pc_led(LED1);               // LED1 = PC SERIAL
+DigitalOut uart_led(LED2);             // LED2 = UM6 SERIAL
+DigitalOut log_led(LED3);              // debug LED
+DigitalOut debug_led(LED4);            // debug LED
+DigitalIn enable(p10);                 // enable logging pin
+DigitalOut sync(p11);                  // sychronization (with CAN logger) pin  
 SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board
 
-
-//------------ variables setup ---------------------------------------//
-Ticker tick;
-Timer t;
-int flag=0;
-
 // interupt function for processing uart messages --------------------//
 void rxCallback(MODSERIAL_IRQ_INFO *q) {
     if (um6_uart.rxBufferGetCount() >=  MAX_PACKET_DATA) {
@@ -31,77 +26,100 @@
 }
 
 //------------ LogData interrupt function ----------------------------//
+int flag=0;
 void LogData() {
-            flag=1;
+            flag=1;     //interrupt sets flag that causes variables to be logged
 } 
 
 //============= Main Program =========================================//
 int main() {
-    pc.baud(115200);  // baud rate to pc interface
+    pc.baud(115200);       // baud rate to pc interface
     um6_uart.baud(115200); // baud rate to um6 interface
-
-    t.start(); // start log time
-
-    //---- call interrupt functions -------------------------//
+    Ticker tick;         
+    Timer t;  
+    
+    //---- call interrupt functions --------------------------//
     um6_uart.attach(&rxCallback, MODSERIAL::RxIrq); // attach interupt function to uart
     tick.attach(&LogData, 0.5); // attaches LogData function to 'tick' ticker interrupt every 0.5s
-    
-    //---------- setup sd card -----------------------------// 
-    mkdir("/sd/mydir", 0777);    
-    FILE *fp = fopen("/sd/mydir/log1.csv", "w");
-    if(fp == NULL) {
-        error("Could not open file for write\n");
-    }
-////////////////////////////    FILE *fp = fopen("/local/log1.csv", "w");
-    // print TEST signals to file, header
-//    fprintf(fp,"time(s),Yaw(deg),Accel(m/s2),GPS Speed(m/s) \r");
-    // print ALL signals to file, header
-    fprintf(fp, "time(s),Yaw(deg),Roll(deg),Pitch(deg),GyroX(deg/s),GyroY(deg/s),GyroZ(deg/s),AccelX(g),AccelY(g),AccelZ(g),GPScourse(deg),GPSspeed(m/s),Latitude(deg),Longitude(deg) \r");   // sends header to file
-        
+    t.start(); // start logging time        
+
+    //---------- setup sd card directory------------------------------// 
+    int FileNo = 0;
+    mkdir("/sd/log_data", 0777);  
 
-    //---- main while loop ----------------------------------// 
-    //--(interrupt sets flag that causes variables to be logged)
-    while(1) {
-            if(flag==1) {  
-                log_led=1;  // turns on LED3 to indicate logging               
-                float time=t.read();
-                float Yaw=data.Yaw;
-                float Roll=data.Roll;
-                float Pitch=data.Pitch;
-                float GyroX=data.Gyro_Proc_X;
-                float GyroY=data.Gyro_Proc_Y;
-                float GyroZ=data.Gyro_Proc_Z;
-                float AccelX=data.Accel_Proc_X;
-                float AccelY=data.Accel_Proc_Y;
-                float AccelZ=data.Accel_Proc_Z;
-                double GPSlong=data.GPS_long;        // currently I can get GPS longitude to out data
-                double GPSlat=data.GPS_lat;          // currently I can get GPS latitude to out data
-                float GPScourse=data.GPS_course;
-                float GPSspeed=data.GPS_speed;
-                
-                //----- print TEST signals to file -------------------//
-         //       fprintf(fp,"%.3f,%.2f,%.4f,%.2f \r",time,Yaw,AccelX,GPSspeed); 
-                pc.printf("time %.3f,Yaw %f, Speed %f, Lat %f, Long %f \n",time,Yaw,GPSspeed,GPSlat,GPSlong);
-              //  pc.printf("0x%08X, %f\n", *(int *)&GPSlong, GPSlong);
-
-                //----- print ALL signals to file --------------------//  
-                fprintf(fp, "%3.3f, %3.1f,%3.1f,%3.1f, %3.2f,%3.2f,%3.2f, %3.4f,%3.4f,%3.4f, %3.1f,%3.2f,%f,%f\r",time,Yaw,Roll,Pitch,GyroX,GyroY,GyroZ,AccelX,AccelY,AccelZ,GPScourse,GPSspeed,GPSlat,GPSlong);                             
-                flag=0; // recents LogData interrupt flag
-                pc_led = !pc_led;  // Lights LED1 when transmitting to PC screen   
-            }    // end if(flag=1) loop
-         
-            if(enable==0) {
-            break;             // breaks while loop if enable switched off
+    //---- main while loop -------------------------------------------// 
+    while(1) {            
+            //---- Setup file on SD card ----------------------------//
+            printf("Opening sd card\n");           
+            char buffer[50];
+            sprintf(buffer, "/sd/log_data/%i.csv", FileNo);
+            //****************************************************
+            // This is necessary for card to work when reconnected
+            // Initialise disk
+            sd.disk_initialize();
+            //****************************************************
+            // Open a file for write
+            FILE *fp = fopen(buffer, "w"); 
+            if(fp == NULL) {
+                error("Could not open file for write\n");
             }
+            //--- print TEST signals to file, header
+            //fprintf(fp,"time(s),Yaw(deg),Accel(m/s2),GPS Speed(m/s) \r");
+            //--- print ALL signals to file, header
+            fprintf(fp, "time(s),Yaw(deg),Roll(deg),Pitch(deg),GyroX(deg/s),GyroY(deg/s),GyroZ(deg/s),AccelX(g),AccelY(g),AccelZ(g),GPScourse(deg),GPSspeed(m/s),Latitude(deg),Longitude(deg) \r");   // sends header to file
+            
+            while (!pc.readable()) {  
+                    if(flag==1) {  
+                        log_led=1;  // turns on LED3 to indicate logging               
+                        float time=t.read();
+                        float Yaw=data.Yaw;
+                        float Roll=data.Roll;
+                        float Pitch=data.Pitch;
+                        float GyroX=data.Gyro_Proc_X;
+                        float GyroY=data.Gyro_Proc_Y;
+                        float GyroZ=data.Gyro_Proc_Z;
+                        float AccelX=data.Accel_Proc_X;
+                        float AccelY=data.Accel_Proc_Y;
+                        float AccelZ=data.Accel_Proc_Z;
+                        float GPSlong=data.GPS_long;        // currently not reading GPS longitude correctly
+                        float GPSlat=data.GPS_lat;                   // currently not reading GPS latitude correctly
+                        float GPScourse=data.GPS_course;
+                        float GPSspeed=data.GPS_speed;
+                        int32_t GPSlatR=data.GPS_lat_raw;
+                        
+                        //----- print TEST signals----------------------------//
+                       // fprintf(fp,"%.3f,%.2f,%.4f,%.2f \r",time,Yaw,AccelX,GPSspeed); 
+                        pc.printf("time %.3f,Yaw %f,Accel %f, Speed %f, Lat %f, Long %f, LatR %d \n",time,Yaw,AccelX,GPSspeed,GPSlat,GPSlong,GPSlatR);
+                        //pc.printf("time %.3f,Yaw %f,Accel %f, Speed %f \n",time,Yaw,AccelX,GPSspeed);
+                       // pc.printf("time %f,LongIn 0x%08X, LongOut %f\n",time,GPSlong,*(int *)&GPSlong);
+        
+                        //----- print ALL signals to file --------------------//  
+                        fprintf(fp, "%3.3f, %3.1f,%3.1f,%3.1f, %3.2f,%3.2f,%3.2f, %3.4f,%3.4f,%3.4f, %3.1f,%3.2f,%d,%f\r",time,Yaw,Roll,Pitch,GyroX,GyroY,GyroZ,AccelX,AccelY,AccelZ,GPScourse,GPSspeed,GPSlat,GPSlong);                             
+                        flag=0; // reset LogData interrupt flag
+                        pc_led = !pc_led;  // Lights LED1 when transmitting to PC screen   
+                    }    // end if(flag=1) loop
+                 
+                    if(enable==0) {
+                    break;     // breaks while loop if enable switched off
+                    }
+            } // end while(!pc.readable()) loop            
+            pc.printf(" Done. \n");     // prints 'done when logging is finished/enable switched off
+            log_led=0;                  // turns off LED logging is finished/enable switched off
+            wait(0.5);                  // debug wait for pc.printf      
+            fclose(fp);                 // closes log file
+            pc.getc();                  // Clear character from buffer
+            
+            while (!pc.readable()) {  // Wait for a key press to restart logging
+            };
+            pc.getc();            // Clear character from buffer
+            FileNo++;             // Increment file number     
     } // end while(1) loop
-    pc.printf(" done. \n");  // prints 'done when logging is finished/enable switched off
-    log_led=0;             // turns off LED logging is finished/enable switched off
-    wait(0.5);             // debug wait for pc.printf      
-    fclose(fp);            // closes log file
+ 
 } // end main() program
 
 
-/* opening a file BEFORE calling interrupts                         OK
+/* DEUBBING NOTES
+   opening a file BEFORE calling interrupts                         OK
    opening a file and print to it BEFORE calling interrupts         NOT OK (stops rest of program)
    open a (local) file and print to it AFTER calling interrupts     NOT OK (stops rest of program)
    open a (sd) file and print to it AFTER calling interrupts        OK