Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed WDT MODSERIAL BME280
main.cpp@4:c70ef089a3fd, 2017-03-02 (annotated)
- Committer:
- MAA
- Date:
- Thu Mar 02 14:04:56 2017 +0000
- Revision:
- 4:c70ef089a3fd
- Parent:
- 3:38eabaa92552
- Child:
- 5:11782a2008c2
Long and Lat calculation in decimal degrees implemented.; SPS file format begun.;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MAA | 0:b3313c5ffca3 | 1 | #include "main.h" |
MAA | 0:b3313c5ffca3 | 2 | |
MAA | 4:c70ef089a3fd | 3 | |
MAA | 0:b3313c5ffca3 | 4 | //Global GPS variables |
MAA | 0:b3313c5ffca3 | 5 | bool GPS_Data_Rdy = false; |
MAA | 0:b3313c5ffca3 | 6 | bool GPS_Data_Valid = false; |
MAA | 0:b3313c5ffca3 | 7 | bool GGA_Fix_Present = false; |
MAA | 0:b3313c5ffca3 | 8 | |
MAA | 0:b3313c5ffca3 | 9 | //global system variables,at the moment, only the currently always true "run variable" |
MAA | 0:b3313c5ffca3 | 10 | bool run = true; |
MAA | 0:b3313c5ffca3 | 11 | int writecount = 0; |
MAA | 0:b3313c5ffca3 | 12 | int dataRWComplete = 0; |
MAA | 0:b3313c5ffca3 | 13 | |
MAA | 0:b3313c5ffca3 | 14 | //global tmpGpsRxString |
MAA | 0:b3313c5ffca3 | 15 | char tmpGpsRxString[128]; |
MAA | 0:b3313c5ffca3 | 16 | |
MAA | 0:b3313c5ffca3 | 17 | |
MAA | 0:b3313c5ffca3 | 18 | int main(void){ |
MAA | 0:b3313c5ffca3 | 19 | |
MAA | 4:c70ef089a3fd | 20 | string currentFilename, nextFilename; |
MAA | 4:c70ef089a3fd | 21 | |
MAA | 0:b3313c5ffca3 | 22 | //Initializing string buffer for GPS data |
MAA | 0:b3313c5ffca3 | 23 | string GPS_String_Buff; |
MAA | 0:b3313c5ffca3 | 24 | GPS_String_Buff.resize(128); |
MAA | 0:b3313c5ffca3 | 25 | memset(tmpGpsRxString,'\0',128); |
MAA | 0:b3313c5ffca3 | 26 | |
MAA | 0:b3313c5ffca3 | 27 | //GPS communication init |
MAA | 0:b3313c5ffca3 | 28 | gps.baud(9600); |
MAA | 0:b3313c5ffca3 | 29 | gps.attach(&rxCallback, MODSERIAL::RxIrq); |
MAA | 0:b3313c5ffca3 | 30 | |
MAA | 2:39c4a85dc2a4 | 31 | //debug comm setup |
MAA | 0:b3313c5ffca3 | 32 | dbg.baud(115200); |
MAA | 0:b3313c5ffca3 | 33 | |
MAA | 0:b3313c5ffca3 | 34 | //setting up USB device |
MAA | 0:b3313c5ffca3 | 35 | USBHostMSD msd("usb"); |
MAA | 0:b3313c5ffca3 | 36 | |
MAA | 0:b3313c5ffca3 | 37 | while(!msd.connect()){ |
MAA | 0:b3313c5ffca3 | 38 | dbg.printf("Trying to connect to usb flash disk\r\n"); |
MAA | 0:b3313c5ffca3 | 39 | wait_ms(500); |
MAA | 0:b3313c5ffca3 | 40 | } |
MAA | 0:b3313c5ffca3 | 41 | |
MAA | 0:b3313c5ffca3 | 42 | //Opening a file on usb disk |
MAA | 4:c70ef089a3fd | 43 | FILE * fp = fopen("/usb/test1.sps", "w"); |
MAA | 2:39c4a85dc2a4 | 44 | fclose(fp); |
MAA | 4:c70ef089a3fd | 45 | wait_ms(100); |
MAA | 4:c70ef089a3fd | 46 | |
MAA | 4:c70ef089a3fd | 47 | fp = fopen("/usb/test1.sps", "a"); |
MAA | 4:c70ef089a3fd | 48 | wait_ms(100); |
MAA | 0:b3313c5ffca3 | 49 | |
MAA | 0:b3313c5ffca3 | 50 | //Start comms with the GPS, Enabling GPRMC and GPGGA |
MAA | 0:b3313c5ffca3 | 51 | gps.printf("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n"); |
MAA | 2:39c4a85dc2a4 | 52 | |
MAA | 2:39c4a85dc2a4 | 53 | //initializing watchdog |
MAA | 2:39c4a85dc2a4 | 54 | Watchdog wd; |
MAA | 2:39c4a85dc2a4 | 55 | wd.init(1.0); |
MAA | 2:39c4a85dc2a4 | 56 | |
MAA | 2:39c4a85dc2a4 | 57 | //initializing SPS generation |
MAA | 2:39c4a85dc2a4 | 58 | SPS spsGen; |
MAA | 2:39c4a85dc2a4 | 59 | |
MAA | 0:b3313c5ffca3 | 60 | //infinite loop |
MAA | 0:b3313c5ffca3 | 61 | while(run) { |
MAA | 0:b3313c5ffca3 | 62 | |
MAA | 0:b3313c5ffca3 | 63 | if(GPS_Data_Rdy){ |
MAA | 0:b3313c5ffca3 | 64 | |
MAA | 0:b3313c5ffca3 | 65 | gps.scanf("%s", &tmpGpsRxString); |
MAA | 0:b3313c5ffca3 | 66 | |
MAA | 0:b3313c5ffca3 | 67 | //copy c_string to string |
MAA | 0:b3313c5ffca3 | 68 | GPS_String_Buff.assign(tmpGpsRxString); |
MAA | 0:b3313c5ffca3 | 69 | |
MAA | 0:b3313c5ffca3 | 70 | //clear tmpRxBuffer |
MAA | 0:b3313c5ffca3 | 71 | memset(tmpGpsRxString,'\0',128); |
MAA | 0:b3313c5ffca3 | 72 | |
MAA | 0:b3313c5ffca3 | 73 | //printing GPS string buffer |
MAA | 0:b3313c5ffca3 | 74 | dbg.printf(GPS_String_Buff.c_str()); |
MAA | 0:b3313c5ffca3 | 75 | dbg.printf("\r\n"); |
MAA | 0:b3313c5ffca3 | 76 | //dbg.printf("Validating GPS data\r\n"); |
MAA | 0:b3313c5ffca3 | 77 | //Validate CRC |
MAA | 0:b3313c5ffca3 | 78 | GPS_Data_Valid = gpsNMEA.ValidateData(GPS_String_Buff, &dbg); |
MAA | 0:b3313c5ffca3 | 79 | |
MAA | 0:b3313c5ffca3 | 80 | //store valid string, either gga or rmc |
MAA | 0:b3313c5ffca3 | 81 | if(GPS_Data_Valid){ |
MAA | 2:39c4a85dc2a4 | 82 | gpsNMEA.StoreString(GPS_String_Buff/*, &dbg*/); |
MAA | 0:b3313c5ffca3 | 83 | } |
MAA | 0:b3313c5ffca3 | 84 | |
MAA | 2:39c4a85dc2a4 | 85 | GGA_Fix_Present = gpsNMEA.GGAFixVerification(); |
MAA | 0:b3313c5ffca3 | 86 | |
MAA | 0:b3313c5ffca3 | 87 | //Clearing RX buffer. |
MAA | 0:b3313c5ffca3 | 88 | //dbg.printf("Clearing Rx buffer, and flags... "); |
MAA | 0:b3313c5ffca3 | 89 | GPS_String_Buff = ""; |
MAA | 0:b3313c5ffca3 | 90 | GPS_String_Buff.resize(128); |
MAA | 0:b3313c5ffca3 | 91 | |
MAA | 3:38eabaa92552 | 92 | |
MAA | 4:c70ef089a3fd | 93 | //If gps fix is present, parse gps data |
MAA | 4:c70ef089a3fd | 94 | if(GGA_Fix_Present){ |
MAA | 4:c70ef089a3fd | 95 | //parse current date |
MAA | 4:c70ef089a3fd | 96 | gpsNMEA.ParseCurrentDateFromGPRMC(&dbg); |
MAA | 4:c70ef089a3fd | 97 | |
MAA | 4:c70ef089a3fd | 98 | //parse current time |
MAA | 4:c70ef089a3fd | 99 | gpsNMEA.ParseCurrentUTCFromGPRMC(&dbg); |
MAA | 2:39c4a85dc2a4 | 100 | |
MAA | 4:c70ef089a3fd | 101 | //parse gps coordinates |
MAA | 4:c70ef089a3fd | 102 | gpsNMEA.ParseCurrentLatitudeFromGPRMC(&dbg); |
MAA | 4:c70ef089a3fd | 103 | gpsNMEA.ParseCurrentLongitudeFromGPRMC(&dbg); |
MAA | 4:c70ef089a3fd | 104 | |
MAA | 4:c70ef089a3fd | 105 | |
MAA | 4:c70ef089a3fd | 106 | //write current data received data to file if gga fix is present. |
MAA | 4:c70ef089a3fd | 107 | if (fp != NULL) { |
MAA | 4:c70ef089a3fd | 108 | //dbg.printf("Writing to usb flash disk\r\n"); |
MAA | 4:c70ef089a3fd | 109 | writecount += 1; |
MAA | 4:c70ef089a3fd | 110 | fprintf(fp, gpsNMEA.currentGGAString.c_str()); |
MAA | 4:c70ef089a3fd | 111 | fprintf(fp, "\r\n"); |
MAA | 4:c70ef089a3fd | 112 | fprintf(fp, gpsNMEA.currentGPRMCString.c_str()); |
MAA | 4:c70ef089a3fd | 113 | fprintf(fp, "\r\n"); |
MAA | 4:c70ef089a3fd | 114 | } |
MAA | 3:38eabaa92552 | 115 | |
MAA | 4:c70ef089a3fd | 116 | if(fp == NULL){ |
MAA | 4:c70ef089a3fd | 117 | //Reopening a file on usb disk |
MAA | 4:c70ef089a3fd | 118 | FILE * fp = fopen("/usb/test1.txt", "a"); |
MAA | 4:c70ef089a3fd | 119 | } |
MAA | 2:39c4a85dc2a4 | 120 | |
MAA | 4:c70ef089a3fd | 121 | //Close file and reopen |
MAA | 4:c70ef089a3fd | 122 | if(writecount > 10){ |
MAA | 4:c70ef089a3fd | 123 | //dbg.printf("Closing file and reopening.\r\n"); |
MAA | 4:c70ef089a3fd | 124 | fclose(fp); |
MAA | 4:c70ef089a3fd | 125 | writecount = 0; |
MAA | 4:c70ef089a3fd | 126 | fp = fopen("/usb/test1.txt", "a"); |
MAA | 4:c70ef089a3fd | 127 | } |
MAA | 4:c70ef089a3fd | 128 | } |
MAA | 4:c70ef089a3fd | 129 | |
MAA | 0:b3313c5ffca3 | 130 | //clearing flags |
MAA | 0:b3313c5ffca3 | 131 | GPS_Data_Valid = false; |
MAA | 2:39c4a85dc2a4 | 132 | GPS_Data_Rdy = false; |
MAA | 2:39c4a85dc2a4 | 133 | |
MAA | 0:b3313c5ffca3 | 134 | } |
MAA | 0:b3313c5ffca3 | 135 | |
MAA | 0:b3313c5ffca3 | 136 | |
MAA | 0:b3313c5ffca3 | 137 | |
MAA | 0:b3313c5ffca3 | 138 | //If connection to USB flash disk is lost, reconnect to the flash disk |
MAA | 0:b3313c5ffca3 | 139 | if(!msd.connected()){ |
MAA | 0:b3313c5ffca3 | 140 | //reestablish usb connection |
MAA | 0:b3313c5ffca3 | 141 | while(!msd.connect()){ |
MAA | 0:b3313c5ffca3 | 142 | dbg.printf("Trying to reconnect to usb flash disk\r\n"); |
MAA | 0:b3313c5ffca3 | 143 | wait_ms(500); |
MAA | 0:b3313c5ffca3 | 144 | } |
MAA | 0:b3313c5ffca3 | 145 | |
MAA | 0:b3313c5ffca3 | 146 | //Reopening a file on usb disk |
MAA | 4:c70ef089a3fd | 147 | fp = fopen("/usb/test1.sps", "a"); |
MAA | 0:b3313c5ffca3 | 148 | |
MAA | 0:b3313c5ffca3 | 149 | } |
MAA | 0:b3313c5ffca3 | 150 | |
MAA | 2:39c4a85dc2a4 | 151 | |
MAA | 2:39c4a85dc2a4 | 152 | //kick / feed watchdog |
MAA | 2:39c4a85dc2a4 | 153 | wd.kick(); |
MAA | 2:39c4a85dc2a4 | 154 | |
MAA | 0:b3313c5ffca3 | 155 | } |
MAA | 0:b3313c5ffca3 | 156 | |
MAA | 0:b3313c5ffca3 | 157 | return 0; |
MAA | 0:b3313c5ffca3 | 158 | } |
MAA | 0:b3313c5ffca3 | 159 | |
MAA | 0:b3313c5ffca3 | 160 | //Thanks to MODSERIAL! |
MAA | 0:b3313c5ffca3 | 161 | // Called everytime a new character goes into |
MAA | 0:b3313c5ffca3 | 162 | // the RX buffer. Test that character for \n |
MAA | 0:b3313c5ffca3 | 163 | // Note, rxGetLastChar() gets the last char that |
MAA | 0:b3313c5ffca3 | 164 | // we received but it does NOT remove it from |
MAA | 0:b3313c5ffca3 | 165 | // the RX buffer. |
MAA | 0:b3313c5ffca3 | 166 | void rxCallback(MODSERIAL_IRQ_INFO *q) { |
MAA | 0:b3313c5ffca3 | 167 | MODSERIAL *serial = q->serial; |
MAA | 0:b3313c5ffca3 | 168 | if ( serial->rxGetLastChar() == '\n') { |
MAA | 0:b3313c5ffca3 | 169 | GPS_Data_Rdy = true; |
MAA | 0:b3313c5ffca3 | 170 | } |
MAA | 0:b3313c5ffca3 | 171 | } |