for Danillo
Dependencies: MBed_Adafruit-GPS-Library SDFileSystem mbed
realtimeQAM.cpp@2:abcf77d0e77d, 2014-12-11 (annotated)
- 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?
User | Revision | Line number | New 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 | } |