for Danillo

Dependencies:   MBed_Adafruit-GPS-Library SDFileSystem mbed

Files at this revision

API Documentation at this revision

Comitter:
ncfronk
Date:
Sat Jan 17 19:12:28 2015 +0000
Parent:
2:abcf77d0e77d
Commit message:
publishing;

Changed in this revision

QAM.h Show annotated file Show diff for this revision Revisions of this file
realtimeQAM.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r abcf77d0e77d -r 0cc40383d016 QAM.h
--- a/QAM.h	Thu Dec 11 01:23:24 2014 +0000
+++ b/QAM.h	Sat Jan 17 19:12:28 2015 +0000
@@ -28,7 +28,7 @@
     int i, j;
     float out[SAMPLE_LENGTH] = {};
     
-    for( i = 0; i < SAMPLE_LENGTH; i++ )
+    for( i = NUM_TAPS; i < SAMPLE_LENGTH; i++ )
     {
         out[ i ] = 0.0;
         for( j = 0; j < NUM_TAPS; j++ ){
@@ -57,12 +57,7 @@
     return total/denom;
 }
 
-float qam_in(float *samples, float *sI, float *sQ, Serial *pc){
-    //print_array_serial(samples, SAMPLE_LENGTH, pc);
-    for(int i = 0; i < SAMPLE_LENGTH; i++){
-        sI[i] = samples[i]*cos(2*PI*CARRIER_FREQ*i*TIME_CONST);
-        sQ[i] = -samples[i]*sin(2*PI*CARRIER_FREQ*i*TIME_CONST);
-    }
+float qam_in(float *sI, float *sQ, Serial *pc){
     filter(sI, pc);
     filter(sQ, pc);
     return avg_QAM(sI, sQ, SAMPLE_LENGTH);
diff -r abcf77d0e77d -r 0cc40383d016 realtimeQAM.cpp
--- a/realtimeQAM.cpp	Thu Dec 11 01:23:24 2014 +0000
+++ b/realtimeQAM.cpp	Sat Jan 17 19:12:28 2015 +0000
@@ -7,10 +7,12 @@
 #include "QAM.h"
 #include "dataPoint.h"
 
-#define SAMPLE_LENGTH       2000 
+#define SAMPLE_LENGTH       1000 
 #define SAMPLE_RATE         10000
 #define SIN_LENGTH          500
 #define OUTAVG_LENGTH       100
+#define CARRIER_FREQ        220
+#define TIME_CONST          0.0001
 #define PI                  3.14159265
 
 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
@@ -35,14 +37,24 @@
 float sinWave[SIN_LENGTH] = {};
 int sinIndex = 0;
 
-float samplesLong[SAMPLE_LENGTH] = {};
-float samplesShort[SAMPLE_LENGTH] = {};
-float samplesRefLong[SAMPLE_LENGTH] = {};
-float samplesRefShort[SAMPLE_LENGTH] = {};
+float sLQ[SAMPLE_LENGTH] = {};
+float sLI[SAMPLE_LENGTH] = {};
+float sSQ[SAMPLE_LENGTH] = {};
+float sSI[SAMPLE_LENGTH] = {};
+float sRefLQ[SAMPLE_LENGTH] = {};
+float sRefLI[SAMPLE_LENGTH] = {};
+float sRefSQ[SAMPLE_LENGTH] = {};
+float sRefSI[SAMPLE_LENGTH] = {};
+
+float Iarray[SAMPLE_LENGTH] = {};
+float Qarray[SAMPLE_LENGTH] = {};
 int sampleIndex = 0;
-
-float sI[SAMPLE_LENGTH] = {};
-float sQ[SAMPLE_LENGTH] = {};
+float I = 0;
+float Q = 0;
+float lon = 0;
+float lonRef = 0;
+float shor = 0;
+float shorRef = 0;
 
 float decimateLong[4] = {};
 float decimateShort[4] = {};
@@ -53,6 +65,8 @@
 bool isSampling = true;
 int avgIndex = 0;
 
+char * timeDatestamp = "";
+
 
 void print_array(float *bar,int length, FILE *file){
     int i =0;
@@ -77,23 +91,43 @@
     return total/length;
 }
 
+void buildIQ(){
+    for(int i = 0; i < SAMPLE_LENGTH; i++){
+        Iarray[i] = cos(2*PI*CARRIER_FREQ*i*TIME_CONST);
+        Qarray[i] = -sin(2*PI*CARRIER_FREQ*i*TIME_CONST);
+    }
+}
+
 void tick_out(){
     if(isSampling){
-        samplesLong[sampleIndex] = AnLong.read();
-        samplesShort[sampleIndex] = AnShort.read();
-        samplesRefLong[sampleIndex] = AnRefLong.read();
-        samplesRefShort[sampleIndex] = AnRefShort.read();
-        sampleIndex++;
-        if(sampleIndex+1 > SAMPLE_LENGTH){
-            sampleIndex--;
-        }
-        //write
         dac0 = sinWave[sinIndex];
         sinIndex++;
         if((sinIndex+1) > sinRes){
             sinIndex = 0;
         }
         
+        lon = AnLong.read();
+        lonRef = AnRefLong.read();
+        shor = AnShort.read();
+        shorRef = AnRefShort.read();
+        
+        I = Iarray[sampleIndex];
+        Q = Qarray[sampleIndex];
+        sLI[sampleIndex] = lon*I;
+        sLQ[sampleIndex] = lon*Q;
+        sSI[sampleIndex] = shor*I;
+        sSQ[sampleIndex] = shor*Q;
+        sRefLI[sampleIndex] = lonRef*I;
+        sRefLQ[sampleIndex] = lonRef*Q;
+        sRefSI[sampleIndex] = shorRef*I;
+        sRefSQ[sampleIndex] = shorRef*Q;
+        
+        sampleIndex++;
+        if(sampleIndex+1 > SAMPLE_LENGTH){
+            sampleIndex--;
+        }
+        
+        
     }
 
 }
@@ -111,7 +145,7 @@
 }
 
 void print_values(){
-    fp = fopen("/sd/hello.txt", "r");
+    fp = fopen("/sd/data.txt", "r");
     if (fp != NULL) {
         fclose(fp);
         remove("/sd/hello.txt");
@@ -126,33 +160,23 @@
     fclose(fp);
 }
 
-//does not work right now
-bool run_gps(int refresh_Timer, Adafruit_GPS myGPS, int refresh_Time, char c){
-    c = myGPS.read();   //queries the GPS
-        
-     //if (c) { pc.printf("%c", c); } //this line will echo the GPS data if not paused
-       
-     //check if we recieved a new message from GPS, if so, attempt to parse it,
-     if ( myGPS.newNMEAreceived() ) {
-         if ( !myGPS.parse(myGPS.lastNMEA()) ) {
-             //continue;   
-         }    
-     }
-       
-     //check if enough time has passed to warrant printing GPS info to screen
-     //note if refresh_Time is too low or pc.baud is too low, GPS data may be lost during printing
-     if (refresh_Timer >= refresh_Time) {
-         //refresh_Timer.reset();
-         pc.printf("Time: %d:%d:%d.%u\n", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);   
-         pc.printf("Date: %d/%d/20%d\n", myGPS.day, myGPS.month, myGPS.year);
-         //pc.printf("Fix: %d\n", (int) myGPS.fix);
-         //pc.printf("Quality: %d\n", (int) myGPS.fixquality);
-         if (myGPS.fix) {
-             pc.printf("Location: %5.2f%c, %5.2f%c\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
-         }
-         return 1;
-     }
-     return 0;
+void save_point(char * c){
+    fp = fopen("/sd/data.txt", "r");
+    if (fp != NULL) {
+        fclose(fp);
+        remove("/sd/data.txt");
+        pc.printf("Remove an existing file with the same name \n");
+    }
+
+    printf("\nWriting data to the sd card \n");
+    fp = fopen("/sd/data.txt", "w");
+    if (fp == NULL) {
+        pc.printf("Unable to write the file \n");
+    } else {
+        fprintf(fp, c);
+        fprintf(fp, "\n");
+        fclose(fp);
+    }
 }
 
 int main(){
@@ -164,8 +188,9 @@
     Timer refresh_Timer; //sets up a timer for use in loop; how often do we print GPS info?
     Timer sampling_Toggle;
     Timer t; 
-    const int refresh_Time = 700; //refresh time in ms
-    const int toggle_Time = 1000;
+    const int refresh_Time = 1000; //refresh time in ms
+    const int sample_Time = 250;
+    const int filter_Time = 2000;
     
     myGPS.begin(9600);  //sets baud rate for GPS communication; note this may be changed via Adafruit_GPS::sendCommand(char *)
                         //a list of GPS commands is available at http://www.adafruit.com/datasheets/PMTK_A08.pdf
@@ -174,6 +199,8 @@
     myGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
     myGPS.sendCommand(PGCMD_ANTENNA);
     
+    buildIQ();
+    
     tick1.attach(&tick_out, 0.0001); // below 0.00005 the board can no longer output and read
     //tick2.attach(&print_values, 20);
     
@@ -189,23 +216,33 @@
     sampling_Toggle.start();
     
     while(1){        
-        if (sampling_Toggle.read_ms() >= toggle_Time) {
-            if(isSampling){
-                t.start();
-                filteredLongTemp = qam_in(samplesLong, sI, sQ, &pc);
-                filteredRefLongTemp = qam_in(samplesRefLong, sI, sQ, &pc);
-                filteredShortTemp = qam_in(samplesShort, sI, sQ, &pc);
-                filteredRefShortTemp = qam_in(samplesRefShort, sI, sQ, &pc);
-                t.stop();
-                pc.printf("Long = %f, longref = %f, Short = %f, shortref = %f in time = %f \n",filteredLongTemp, filteredRefLongTemp, filteredShortTemp, filteredRefShortTemp, t.read());
-                t.reset();
-            }else{
-                sampleIndex = 0;                
+        if(isSampling){
+            if (sampling_Toggle.read_ms() >= sample_Time) {
+                isSampling = false;
+                sampling_Toggle.reset();
+                
+                filteredLongTemp = qam_in(sLI, sLQ, &pc);
+                filteredRefLongTemp = qam_in(sRefLI, sRefLQ, &pc);
+                filteredShortTemp = qam_in(sSI, sSQ, &pc);
+                filteredRefShortTemp = qam_in(sRefSI, sRefSQ, &pc);
+                pc.printf("Long = %f,  Short = %f ",filteredLongTemp, filteredShortTemp);
+                
+                fp = fopen("/sd/data.txt", "w");
+                if (fp == NULL) {
+                    pc.printf("Unable to write the file \n");
+                } else {
+                    fprintf(fp,"Long = %f,  Short = %f ",filteredLongTemp/filteredRefShortTemp, filteredShortTemp/filteredRefShortTemp);
+                    fclose(fp);
+                }
             }
-            isSampling = !isSampling;
-            sampling_Toggle.reset();            
-        }
-        
+        }else{
+            if (sampling_Toggle.read_ms() >= filter_Time) {
+                isSampling = true;
+                sampling_Toggle.reset();
+                
+                sampleIndex = 0;
+            }                
+        } 
         
         if(!isSampling){  
             c = myGPS.read();   
@@ -219,11 +256,25 @@
             //note if refresh_Time is too low or pc.baud is too low, GPS data may be lost during printing
             if (refresh_Timer.read_ms() >= refresh_Time) {
                 refresh_Timer.reset();
-                //pc.printf("Time: %d:%d:%d.%u----", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);   
+                pc.printf("Time: %d:%d:%d.%u \n", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);
+                fp = fopen("/sd/data.txt", "w");
+                if (fp == NULL) {
+                    pc.printf("Unable to write the file \n");
+                } else {
+                    fprintf(fp,"Time: %d:%d:%d.%u \n", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);
+                    fclose(fp);
+                }   
                 if (myGPS.fix) {
-                    //pc.printf("Location: %5.2f%c, %5.2f%c\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
+                    pc.printf("Location: %5.2f%c, %5.2f%c\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
+                    fp = fopen("/sd/data.txt", "w");
+                    if (fp == NULL) {
+                        pc.printf("Unable to write the file \n");
+                    } else {
+                        fprintf(fp,"Location: %5.2f%c, %5.2f%c\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
+                        fclose(fp);
+                    }
                 }
             }
-        }        
+        }                  
     }
 }
\ No newline at end of file