for Danillo

Dependencies:   MBed_Adafruit-GPS-Library SDFileSystem mbed

Committer:
ncfronk
Date:
Thu Dec 11 01:23:24 2014 +0000
Revision:
2:abcf77d0e77d
Parent:
1:f5770d9636b4
Child:
3:0cc40383d016
working but too slow;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ncfronk 1:f5770d9636b4 1 #pragma once
ncfronk 0:37d4e78b2076 2 #include "mbed.h"
ncfronk 0:37d4e78b2076 3 #include "math.h"
ncfronk 1:f5770d9636b4 4 #include "MBed_Adafruit_GPS.h"
ncfronk 2:abcf77d0e77d 5 #include "SDFileSystem.h"
ncfronk 1:f5770d9636b4 6
ncfronk 1:f5770d9636b4 7 #include "QAM.h"
ncfronk 2:abcf77d0e77d 8 #include "dataPoint.h"
ncfronk 0:37d4e78b2076 9
ncfronk 2:abcf77d0e77d 10 #define SAMPLE_LENGTH 2000
ncfronk 2:abcf77d0e77d 11 #define SAMPLE_RATE 10000
ncfronk 0:37d4e78b2076 12 #define SIN_LENGTH 500
ncfronk 2:abcf77d0e77d 13 #define OUTAVG_LENGTH 100
ncfronk 1:f5770d9636b4 14 #define PI 3.14159265
ncfronk 2:abcf77d0e77d 15
ncfronk 2:abcf77d0e77d 16 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
ncfronk 2:abcf77d0e77d 17 FILE *fp;
ncfronk 2:abcf77d0e77d 18 char buffer[1024];
ncfronk 1:f5770d9636b4 19
ncfronk 1:f5770d9636b4 20 Serial * gps_Serial;
ncfronk 0:37d4e78b2076 21
ncfronk 0:37d4e78b2076 22 Ticker tick1;
ncfronk 0:37d4e78b2076 23 Ticker tick2;
ncfronk 1:f5770d9636b4 24 AnalogIn AnLong(A0);
ncfronk 1:f5770d9636b4 25 AnalogIn AnShort(A1);
ncfronk 2:abcf77d0e77d 26 AnalogIn AnRefLong(A2);
ncfronk 2:abcf77d0e77d 27 AnalogIn AnRefShort(A3);
ncfronk 0:37d4e78b2076 28 AnalogOut dac0(DAC0_OUT);
ncfronk 0:37d4e78b2076 29 DigitalOut led_red(LED_RED);
ncfronk 0:37d4e78b2076 30 Serial pc(USBTX, USBRX);
ncfronk 0:37d4e78b2076 31
ncfronk 2:abcf77d0e77d 32 int sinRes = (int)1/(CARRIER_FREQ*TIME_CONST);
ncfronk 0:37d4e78b2076 33 int freq = 1;
ncfronk 0:37d4e78b2076 34
ncfronk 0:37d4e78b2076 35 float sinWave[SIN_LENGTH] = {};
ncfronk 0:37d4e78b2076 36 int sinIndex = 0;
ncfronk 0:37d4e78b2076 37
ncfronk 1:f5770d9636b4 38 float samplesLong[SAMPLE_LENGTH] = {};
ncfronk 1:f5770d9636b4 39 float samplesShort[SAMPLE_LENGTH] = {};
ncfronk 2:abcf77d0e77d 40 float samplesRefLong[SAMPLE_LENGTH] = {};
ncfronk 2:abcf77d0e77d 41 float samplesRefShort[SAMPLE_LENGTH] = {};
ncfronk 0:37d4e78b2076 42 int sampleIndex = 0;
ncfronk 1:f5770d9636b4 43
ncfronk 0:37d4e78b2076 44 float sI[SAMPLE_LENGTH] = {};
ncfronk 0:37d4e78b2076 45 float sQ[SAMPLE_LENGTH] = {};
ncfronk 1:f5770d9636b4 46
ncfronk 2:abcf77d0e77d 47 float decimateLong[4] = {};
ncfronk 2:abcf77d0e77d 48 float decimateShort[4] = {};
ncfronk 2:abcf77d0e77d 49 float decimateRef[4] = {};
ncfronk 1:f5770d9636b4 50
ncfronk 1:f5770d9636b4 51 float totalAVG = 0;
ncfronk 0:37d4e78b2076 52
ncfronk 0:37d4e78b2076 53 bool isSampling = true;
ncfronk 0:37d4e78b2076 54 int avgIndex = 0;
ncfronk 0:37d4e78b2076 55
ncfronk 2:abcf77d0e77d 56
ncfronk 2:abcf77d0e77d 57 void print_array(float *bar,int length, FILE *file){
ncfronk 2:abcf77d0e77d 58 int i =0;
ncfronk 2:abcf77d0e77d 59 for(i = 0; i < length; i++){
ncfronk 2:abcf77d0e77d 60 fprintf(file, "%f, ", bar[i]);
ncfronk 2:abcf77d0e77d 61 }
ncfronk 2:abcf77d0e77d 62 }
ncfronk 2:abcf77d0e77d 63
ncfronk 2:abcf77d0e77d 64 void print_array_serial(float *bar,int length){
ncfronk 0:37d4e78b2076 65 int i =0;
ncfronk 1:f5770d9636b4 66 for(i = 0; i < length; i++){
ncfronk 0:37d4e78b2076 67 pc.printf("%f, ", bar[i]);
ncfronk 0:37d4e78b2076 68 }
ncfronk 2:abcf77d0e77d 69 }
ncfronk 2:abcf77d0e77d 70
ncfronk 2:abcf77d0e77d 71 float avg_array(float *array, int length){
ncfronk 2:abcf77d0e77d 72 int i = 0;
ncfronk 2:abcf77d0e77d 73 float total = 0;
ncfronk 2:abcf77d0e77d 74 for(i = 0; i < length; i++){
ncfronk 2:abcf77d0e77d 75 total += array[i];
ncfronk 2:abcf77d0e77d 76 }
ncfronk 2:abcf77d0e77d 77 return total/length;
ncfronk 0:37d4e78b2076 78 }
ncfronk 0:37d4e78b2076 79
ncfronk 0:37d4e78b2076 80 void tick_out(){
ncfronk 0:37d4e78b2076 81 if(isSampling){
ncfronk 1:f5770d9636b4 82 samplesLong[sampleIndex] = AnLong.read();
ncfronk 2:abcf77d0e77d 83 samplesShort[sampleIndex] = AnShort.read();
ncfronk 2:abcf77d0e77d 84 samplesRefLong[sampleIndex] = AnRefLong.read();
ncfronk 2:abcf77d0e77d 85 samplesRefShort[sampleIndex] = AnRefShort.read();
ncfronk 0:37d4e78b2076 86 sampleIndex++;
ncfronk 1:f5770d9636b4 87 if(sampleIndex+1 > SAMPLE_LENGTH){
ncfronk 2:abcf77d0e77d 88 sampleIndex--;
ncfronk 0:37d4e78b2076 89 }
ncfronk 0:37d4e78b2076 90 //write
ncfronk 0:37d4e78b2076 91 dac0 = sinWave[sinIndex];
ncfronk 0:37d4e78b2076 92 sinIndex++;
ncfronk 0:37d4e78b2076 93 if((sinIndex+1) > sinRes){
ncfronk 0:37d4e78b2076 94 sinIndex = 0;
ncfronk 0:37d4e78b2076 95 }
ncfronk 0:37d4e78b2076 96
ncfronk 0:37d4e78b2076 97 }
ncfronk 0:37d4e78b2076 98
ncfronk 0:37d4e78b2076 99 }
ncfronk 0:37d4e78b2076 100
ncfronk 0:37d4e78b2076 101 void create_sinWave(){
ncfronk 0:37d4e78b2076 102 int i = 0;
ncfronk 0:37d4e78b2076 103 for(i = 0; i < sinRes; i++){
ncfronk 2:abcf77d0e77d 104 sinWave[i] = 0.25 * sin(2.0*PI*i/sinRes) + 0.75;
ncfronk 0:37d4e78b2076 105 }
ncfronk 0:37d4e78b2076 106 }
ncfronk 0:37d4e78b2076 107
ncfronk 0:37d4e78b2076 108 void set_Values(int inFreq){
ncfronk 0:37d4e78b2076 109 freq = inFreq;
ncfronk 0:37d4e78b2076 110 create_sinWave();
ncfronk 0:37d4e78b2076 111 }
ncfronk 0:37d4e78b2076 112
ncfronk 0:37d4e78b2076 113 void print_values(){
ncfronk 2:abcf77d0e77d 114 fp = fopen("/sd/hello.txt", "r");
ncfronk 2:abcf77d0e77d 115 if (fp != NULL) {
ncfronk 2:abcf77d0e77d 116 fclose(fp);
ncfronk 2:abcf77d0e77d 117 remove("/sd/hello.txt");
ncfronk 2:abcf77d0e77d 118 pc.printf("Remove an existing file with the same name \n");
ncfronk 2:abcf77d0e77d 119 }
ncfronk 2:abcf77d0e77d 120
ncfronk 2:abcf77d0e77d 121 printf("\nWriting data to the sd card \n");
ncfronk 2:abcf77d0e77d 122 fp = fopen("/sd/hello.txt", "w");
ncfronk 2:abcf77d0e77d 123 if (fp == NULL) {
ncfronk 2:abcf77d0e77d 124 pc.printf("Unable to write the file \n");
ncfronk 2:abcf77d0e77d 125 }
ncfronk 2:abcf77d0e77d 126 fclose(fp);
ncfronk 2:abcf77d0e77d 127 }
ncfronk 2:abcf77d0e77d 128
ncfronk 2:abcf77d0e77d 129 //does not work right now
ncfronk 2:abcf77d0e77d 130 bool run_gps(int refresh_Timer, Adafruit_GPS myGPS, int refresh_Time, char c){
ncfronk 2:abcf77d0e77d 131 c = myGPS.read(); //queries the GPS
ncfronk 2:abcf77d0e77d 132
ncfronk 2:abcf77d0e77d 133 //if (c) { pc.printf("%c", c); } //this line will echo the GPS data if not paused
ncfronk 2:abcf77d0e77d 134
ncfronk 2:abcf77d0e77d 135 //check if we recieved a new message from GPS, if so, attempt to parse it,
ncfronk 2:abcf77d0e77d 136 if ( myGPS.newNMEAreceived() ) {
ncfronk 2:abcf77d0e77d 137 if ( !myGPS.parse(myGPS.lastNMEA()) ) {
ncfronk 2:abcf77d0e77d 138 //continue;
ncfronk 2:abcf77d0e77d 139 }
ncfronk 2:abcf77d0e77d 140 }
ncfronk 2:abcf77d0e77d 141
ncfronk 2:abcf77d0e77d 142 //check if enough time has passed to warrant printing GPS info to screen
ncfronk 2:abcf77d0e77d 143 //note if refresh_Time is too low or pc.baud is too low, GPS data may be lost during printing
ncfronk 2:abcf77d0e77d 144 if (refresh_Timer >= refresh_Time) {
ncfronk 2:abcf77d0e77d 145 //refresh_Timer.reset();
ncfronk 2:abcf77d0e77d 146 pc.printf("Time: %d:%d:%d.%u\n", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);
ncfronk 2:abcf77d0e77d 147 pc.printf("Date: %d/%d/20%d\n", myGPS.day, myGPS.month, myGPS.year);
ncfronk 2:abcf77d0e77d 148 //pc.printf("Fix: %d\n", (int) myGPS.fix);
ncfronk 2:abcf77d0e77d 149 //pc.printf("Quality: %d\n", (int) myGPS.fixquality);
ncfronk 2:abcf77d0e77d 150 if (myGPS.fix) {
ncfronk 2:abcf77d0e77d 151 pc.printf("Location: %5.2f%c, %5.2f%c\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
ncfronk 2:abcf77d0e77d 152 }
ncfronk 2:abcf77d0e77d 153 return 1;
ncfronk 2:abcf77d0e77d 154 }
ncfronk 2:abcf77d0e77d 155 return 0;
ncfronk 0:37d4e78b2076 156 }
ncfronk 0:37d4e78b2076 157
ncfronk 0:37d4e78b2076 158 int main(){
ncfronk 0:37d4e78b2076 159 pc.baud(115200);
ncfronk 0:37d4e78b2076 160
ncfronk 1:f5770d9636b4 161 gps_Serial = new Serial(D1,D0); //serial object for use w/ GPS
ncfronk 1:f5770d9636b4 162 Adafruit_GPS myGPS(gps_Serial); //object of Adafruit's GPS class
ncfronk 1:f5770d9636b4 163 char c; //when read via Adafruit_GPS::read(), the class returns single character stored here
ncfronk 1:f5770d9636b4 164 Timer refresh_Timer; //sets up a timer for use in loop; how often do we print GPS info?
ncfronk 2:abcf77d0e77d 165 Timer sampling_Toggle;
ncfronk 2:abcf77d0e77d 166 Timer t;
ncfronk 2:abcf77d0e77d 167 const int refresh_Time = 700; //refresh time in ms
ncfronk 2:abcf77d0e77d 168 const int toggle_Time = 1000;
ncfronk 1:f5770d9636b4 169
ncfronk 1:f5770d9636b4 170 myGPS.begin(9600); //sets baud rate for GPS communication; note this may be changed via Adafruit_GPS::sendCommand(char *)
ncfronk 1:f5770d9636b4 171 //a list of GPS commands is available at http://www.adafruit.com/datasheets/PMTK_A08.pdf
ncfronk 1:f5770d9636b4 172
ncfronk 1:f5770d9636b4 173 myGPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); //these commands are defined in MBed_Adafruit_GPS.h; a link is provided there for command creation
ncfronk 1:f5770d9636b4 174 myGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
ncfronk 1:f5770d9636b4 175 myGPS.sendCommand(PGCMD_ANTENNA);
ncfronk 1:f5770d9636b4 176
ncfronk 2:abcf77d0e77d 177 tick1.attach(&tick_out, 0.0001); // below 0.00005 the board can no longer output and read
ncfronk 0:37d4e78b2076 178 //tick2.attach(&print_values, 20);
ncfronk 0:37d4e78b2076 179
ncfronk 2:abcf77d0e77d 180 set_Values(220);
ncfronk 2:abcf77d0e77d 181 pc.printf("sinres = %i\n", sinRes);
ncfronk 0:37d4e78b2076 182
ncfronk 1:f5770d9636b4 183 float filteredLongTemp = 0;
ncfronk 1:f5770d9636b4 184 float filteredShortTemp = 0;
ncfronk 2:abcf77d0e77d 185 float filteredRefLongTemp = 0;
ncfronk 2:abcf77d0e77d 186 float filteredRefShortTemp = 0;
ncfronk 1:f5770d9636b4 187
ncfronk 2:abcf77d0e77d 188 refresh_Timer.start();
ncfronk 2:abcf77d0e77d 189 sampling_Toggle.start();
ncfronk 1:f5770d9636b4 190
ncfronk 2:abcf77d0e77d 191 while(1){
ncfronk 2:abcf77d0e77d 192 if (sampling_Toggle.read_ms() >= toggle_Time) {
ncfronk 2:abcf77d0e77d 193 if(isSampling){
ncfronk 2:abcf77d0e77d 194 t.start();
ncfronk 2:abcf77d0e77d 195 filteredLongTemp = qam_in(samplesLong, sI, sQ, &pc);
ncfronk 2:abcf77d0e77d 196 filteredRefLongTemp = qam_in(samplesRefLong, sI, sQ, &pc);
ncfronk 2:abcf77d0e77d 197 filteredShortTemp = qam_in(samplesShort, sI, sQ, &pc);
ncfronk 2:abcf77d0e77d 198 filteredRefShortTemp = qam_in(samplesRefShort, sI, sQ, &pc);
ncfronk 2:abcf77d0e77d 199 t.stop();
ncfronk 2:abcf77d0e77d 200 pc.printf("Long = %f, longref = %f, Short = %f, shortref = %f in time = %f \n",filteredLongTemp, filteredRefLongTemp, filteredShortTemp, filteredRefShortTemp, t.read());
ncfronk 2:abcf77d0e77d 201 t.reset();
ncfronk 2:abcf77d0e77d 202 }else{
ncfronk 2:abcf77d0e77d 203 sampleIndex = 0;
ncfronk 2:abcf77d0e77d 204 }
ncfronk 2:abcf77d0e77d 205 isSampling = !isSampling;
ncfronk 2:abcf77d0e77d 206 sampling_Toggle.reset();
ncfronk 1:f5770d9636b4 207 }
ncfronk 1:f5770d9636b4 208
ncfronk 2:abcf77d0e77d 209
ncfronk 2:abcf77d0e77d 210 if(!isSampling){
ncfronk 2:abcf77d0e77d 211 c = myGPS.read();
ncfronk 2:abcf77d0e77d 212 if ( myGPS.newNMEAreceived() ) {
ncfronk 2:abcf77d0e77d 213 if ( !myGPS.parse(myGPS.lastNMEA()) ) {
ncfronk 2:abcf77d0e77d 214 continue;
ncfronk 2:abcf77d0e77d 215 }
ncfronk 1:f5770d9636b4 216 }
ncfronk 2:abcf77d0e77d 217
ncfronk 2:abcf77d0e77d 218 //check if enough time has passed to warrant printing GPS info to screen
ncfronk 2:abcf77d0e77d 219 //note if refresh_Time is too low or pc.baud is too low, GPS data may be lost during printing
ncfronk 2:abcf77d0e77d 220 if (refresh_Timer.read_ms() >= refresh_Time) {
ncfronk 2:abcf77d0e77d 221 refresh_Timer.reset();
ncfronk 2:abcf77d0e77d 222 //pc.printf("Time: %d:%d:%d.%u----", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);
ncfronk 2:abcf77d0e77d 223 if (myGPS.fix) {
ncfronk 2:abcf77d0e77d 224 //pc.printf("Location: %5.2f%c, %5.2f%c\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
ncfronk 2:abcf77d0e77d 225 }
ncfronk 2:abcf77d0e77d 226 }
ncfronk 2:abcf77d0e77d 227 }
ncfronk 0:37d4e78b2076 228 }
ncfronk 0:37d4e78b2076 229 }