NMEA GPS receiver Bug fixes

Dependents:   Senet NAMote

Fork of lib_gps by wayne roberts

Committer:
shaunkrnelson
Date:
Wed Aug 02 11:07:18 2017 -0400
Revision:
13:9b6cd6eb808e
Parent:
12:f1b3d656125e
Update to latest lib_gps

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:0bd73064b7f6 1 #include "mbed.h"
dudmuck 0:0bd73064b7f6 2 #include "gps.h"
dudmuck 0:0bd73064b7f6 3
dudmuck 1:2f5fbb33ae8b 4 #define LAT_UNFIXED 0xaaaaa9
dudmuck 1:2f5fbb33ae8b 5 #define LONG_UNFIXED 0x355554e
dudmuck 1:2f5fbb33ae8b 6
dudmuck 0:0bd73064b7f6 7 const char NmeaDataTypeGPGGA[] = "GPGGA";
dudmuck 0:0bd73064b7f6 8 //const char NmeaDataTypeGPGSA[] = "GPGSA";
dudmuck 0:0bd73064b7f6 9 //const char NmeaDataTypeGPGSV[] = "GPGSV";
dudmuck 0:0bd73064b7f6 10 const char NmeaDataTypeGPRMC[] = "GPRMC";
dudmuck 0:0bd73064b7f6 11
dudmuck 0:0bd73064b7f6 12 /* Value used for the conversion of the position from DMS to decimal */
dudmuck 0:0bd73064b7f6 13 const int32_t MaxNorthPosition = 8388607; // 2^23 - 1
dudmuck 0:0bd73064b7f6 14 const int32_t MaxSouthPosition = 8388608; // -2^23
dudmuck 0:0bd73064b7f6 15 const int32_t MaxEastPosition = 8388607; // 2^23 - 1
dudmuck 0:0bd73064b7f6 16 const int32_t MaxWestPosition = 8388608; // -2^23
dudmuck 0:0bd73064b7f6 17
dudmuck 2:b531881123bf 18 //InterruptIn pps_pin(PC_5);
dudmuck 0:0bd73064b7f6 19
dudmuck 2:b531881123bf 20
dudmuck 2:b531881123bf 21 GPS::GPS(PinName uart_tx, PinName uart_rx, PinName en) : m_uart(uart_tx, uart_rx), m_en_pin(en)
dudmuck 0:0bd73064b7f6 22 {
dudmuck 1:2f5fbb33ae8b 23 have_fix = false;
shaunkrnelson 6:9dfe135334c9 24 uart_rx_count = 0;
dudmuck 1:2f5fbb33ae8b 25 }
dudmuck 0:0bd73064b7f6 26
dudmuck 0:0bd73064b7f6 27 GPS::~GPS()
dudmuck 0:0bd73064b7f6 28 {
dudmuck 0:0bd73064b7f6 29 }
dudmuck 0:0bd73064b7f6 30
dudmuck 2:b531881123bf 31 /*void GPS::pps()
dudmuck 0:0bd73064b7f6 32 {
dudmuck 0:0bd73064b7f6 33 pps_occurred = true;
dudmuck 2:b531881123bf 34 }*/
dudmuck 0:0bd73064b7f6 35
dudmuck 0:0bd73064b7f6 36 void GPS::on_uart_rx()
dudmuck 0:0bd73064b7f6 37 {
dudmuck 0:0bd73064b7f6 38 //uint8_t *len = &rx_buf_lens[rx_bufs_in_idx];
dudmuck 0:0bd73064b7f6 39 uint8_t len = rx_buf_lens[rx_bufs_in_idx];
dudmuck 0:0bd73064b7f6 40 char ch;
dudmuck 0:0bd73064b7f6 41
dudmuck 0:0bd73064b7f6 42 do {
dudmuck 2:b531881123bf 43 ch = m_uart.getc();
dudmuck 0:0bd73064b7f6 44
dudmuck 0:0bd73064b7f6 45 if (ch != '$') {
dudmuck 0:0bd73064b7f6 46 if (len < RX_BUF_SIZE) {
dudmuck 0:0bd73064b7f6 47 rx_bufs[rx_bufs_in_idx][len] = ch;
dudmuck 0:0bd73064b7f6 48 rx_buf_lens[rx_bufs_in_idx]++;
shaunkrnelson 6:9dfe135334c9 49 } else
shaunkrnelson 6:9dfe135334c9 50 printf("S");
shaunkrnelson 6:9dfe135334c9 51 } else if (len != 0) {
shaunkrnelson 6:9dfe135334c9 52 if(verbose)
shaunkrnelson 6:9dfe135334c9 53 printf("$ at %d\r\n", len);
shaunkrnelson 6:9dfe135334c9 54 }
dudmuck 0:0bd73064b7f6 55
dudmuck 0:0bd73064b7f6 56 if (ch == '\n') {
dudmuck 0:0bd73064b7f6 57 rx_bufs[rx_bufs_in_idx][len] = 0; // null terminate
shaunkrnelson 6:9dfe135334c9 58
shaunkrnelson 6:9dfe135334c9 59 #if 0
shaunkrnelson 6:9dfe135334c9 60 if(verbose)
shaunkrnelson 6:9dfe135334c9 61 {
shaunkrnelson 6:9dfe135334c9 62 printf("on_uart_rx: buf=%d, len=%d\r\n", rx_bufs_in_idx, len);
shaunkrnelson 6:9dfe135334c9 63 }
shaunkrnelson 6:9dfe135334c9 64 #endif
shaunkrnelson 6:9dfe135334c9 65
dudmuck 0:0bd73064b7f6 66 if (++rx_bufs_in_idx == NUM_RX_BUFS)
dudmuck 0:0bd73064b7f6 67 rx_bufs_in_idx = 0;
dudmuck 0:0bd73064b7f6 68 /* just let it overflow -- if (rx_bufs_in_idx == rx_bufs_out_idx)
dudmuck 0:0bd73064b7f6 69 printf("gps overflow\r\n");*/
dudmuck 0:0bd73064b7f6 70 rx_buf_lens[rx_bufs_in_idx] = 0;
shaunkrnelson 6:9dfe135334c9 71 uart_rx_count++;
dudmuck 0:0bd73064b7f6 72 }
dudmuck 2:b531881123bf 73 } while (m_uart.readable());
dudmuck 0:0bd73064b7f6 74 }
dudmuck 0:0bd73064b7f6 75
dudmuck 0:0bd73064b7f6 76 void GPS::init()
dudmuck 0:0bd73064b7f6 77 {
dudmuck 0:0bd73064b7f6 78 rx_bufs_in_idx = 0;
dudmuck 0:0bd73064b7f6 79 rx_buf_lens[rx_bufs_in_idx] = 0;
dudmuck 0:0bd73064b7f6 80 rx_bufs_out_idx = 0;
dudmuck 0:0bd73064b7f6 81
dudmuck 0:0bd73064b7f6 82 //gps_uart.baud(57600);
shaunkrnelson 11:caeed886e2ed 83 m_uart.attach(callback(this, &GPS::on_uart_rx));
dudmuck 2:b531881123bf 84 //pps_pin.rise(this, &GPS::pps);
dudmuck 0:0bd73064b7f6 85 }
dudmuck 0:0bd73064b7f6 86
dudmuck 0:0bd73064b7f6 87 void GPS::enable(bool en)
dudmuck 0:0bd73064b7f6 88 {
dudmuck 0:0bd73064b7f6 89 if (en) {
dudmuck 3:03d7275dc4fd 90 if (en_invert)
dudmuck 3:03d7275dc4fd 91 m_en_pin = 0;
dudmuck 3:03d7275dc4fd 92 else
dudmuck 3:03d7275dc4fd 93 m_en_pin = 1;
dudmuck 0:0bd73064b7f6 94 } else {
dudmuck 3:03d7275dc4fd 95 if (en_invert)
dudmuck 3:03d7275dc4fd 96 m_en_pin = 1;
dudmuck 3:03d7275dc4fd 97 else
dudmuck 3:03d7275dc4fd 98 m_en_pin = 0;
dudmuck 0:0bd73064b7f6 99 }
dudmuck 1:2f5fbb33ae8b 100
dudmuck 1:2f5fbb33ae8b 101 // reset current string index
dudmuck 1:2f5fbb33ae8b 102 rx_buf_lens[rx_bufs_in_idx] = 0;
dudmuck 0:0bd73064b7f6 103 }
dudmuck 0:0bd73064b7f6 104
dudmuck 0:0bd73064b7f6 105 bool GPS::enabled()
dudmuck 0:0bd73064b7f6 106 {
dudmuck 3:03d7275dc4fd 107 if (en_invert)
dudmuck 3:03d7275dc4fd 108 return !m_en_pin.read();
dudmuck 3:03d7275dc4fd 109 else
dudmuck 3:03d7275dc4fd 110 return m_en_pin.read();
dudmuck 0:0bd73064b7f6 111 }
dudmuck 0:0bd73064b7f6 112
dudmuck 0:0bd73064b7f6 113 /*char GPS::Nibble2HexChar( char a );
dudmuck 0:0bd73064b7f6 114 {
dudmuck 0:0bd73064b7f6 115 if( a < 10 )
dudmuck 0:0bd73064b7f6 116 {
dudmuck 0:0bd73064b7f6 117 return '0' + a;
dudmuck 0:0bd73064b7f6 118 }
dudmuck 0:0bd73064b7f6 119 else if( a < 16 )
dudmuck 0:0bd73064b7f6 120 {
dudmuck 0:0bd73064b7f6 121 return 'A' + ( a - 10 );
dudmuck 0:0bd73064b7f6 122 }
dudmuck 0:0bd73064b7f6 123 else
dudmuck 0:0bd73064b7f6 124 {
dudmuck 0:0bd73064b7f6 125 return '?';
dudmuck 0:0bd73064b7f6 126 }
dudmuck 0:0bd73064b7f6 127 }*/
dudmuck 0:0bd73064b7f6 128
dudmuck 0:0bd73064b7f6 129 int GPS::NmeaChecksum( char *nmeaStr, uint8_t nmeaStrSize, char * checksum )
dudmuck 0:0bd73064b7f6 130 {
dudmuck 0:0bd73064b7f6 131 int i = 0;
dudmuck 0:0bd73064b7f6 132 uint8_t checkNum = 0;
dudmuck 0:0bd73064b7f6 133
dudmuck 0:0bd73064b7f6 134 // Check input parameters
dudmuck 0:0bd73064b7f6 135 if( ( nmeaStr == NULL ) || ( checksum == NULL ) || ( nmeaStrSize <= 1 ) )
dudmuck 0:0bd73064b7f6 136 {
dudmuck 0:0bd73064b7f6 137 return -1;
dudmuck 0:0bd73064b7f6 138 }
dudmuck 0:0bd73064b7f6 139
dudmuck 0:0bd73064b7f6 140 // Skip the first '$' if necessary
dudmuck 0:0bd73064b7f6 141 if( nmeaStr[i] == '$' )
dudmuck 0:0bd73064b7f6 142 {
dudmuck 0:0bd73064b7f6 143 i += 1;
dudmuck 0:0bd73064b7f6 144 }
dudmuck 0:0bd73064b7f6 145
dudmuck 0:0bd73064b7f6 146 // XOR until '*' or max length is reached
dudmuck 0:0bd73064b7f6 147 while( nmeaStr[i] != '*' )
dudmuck 0:0bd73064b7f6 148 {
dudmuck 0:0bd73064b7f6 149 checkNum ^= nmeaStr[i];
dudmuck 0:0bd73064b7f6 150 i += 1;
dudmuck 0:0bd73064b7f6 151 if( i >= nmeaStrSize )
dudmuck 0:0bd73064b7f6 152 {
dudmuck 0:0bd73064b7f6 153 return -1;
dudmuck 0:0bd73064b7f6 154 }
dudmuck 0:0bd73064b7f6 155 }
dudmuck 0:0bd73064b7f6 156
dudmuck 0:0bd73064b7f6 157 // Convert checksum value to 2 hexadecimal characters
dudmuck 0:0bd73064b7f6 158 /*checksum[0] = Nibble2HexChar( checkNum / 16 ); // upper nibble
dudmuck 0:0bd73064b7f6 159 checksum[1] = Nibble2HexChar( checkNum % 16 ); // lower nibble
dudmuck 0:0bd73064b7f6 160 */
dudmuck 0:0bd73064b7f6 161 sprintf(checksum, "%02X", checkNum);
dudmuck 0:0bd73064b7f6 162
dudmuck 0:0bd73064b7f6 163 return i + 1;
dudmuck 0:0bd73064b7f6 164 }
dudmuck 0:0bd73064b7f6 165
dudmuck 0:0bd73064b7f6 166 bool GPS::NmeaValidateChecksum(int idx)
dudmuck 0:0bd73064b7f6 167 {
dudmuck 0:0bd73064b7f6 168 int checksumIndex;
dudmuck 0:0bd73064b7f6 169 char checksum[4];
dudmuck 0:0bd73064b7f6 170 char *NmeaString = rx_bufs[idx];
dudmuck 0:0bd73064b7f6 171
dudmuck 0:0bd73064b7f6 172 checksumIndex = NmeaChecksum( NmeaString, rx_buf_lens[idx], checksum );
dudmuck 0:0bd73064b7f6 173
dudmuck 0:0bd73064b7f6 174 // could we calculate a verification checksum ?
dudmuck 0:0bd73064b7f6 175 if( checksumIndex < 0 )
dudmuck 0:0bd73064b7f6 176 return false;
dudmuck 0:0bd73064b7f6 177
dudmuck 0:0bd73064b7f6 178 // check if there are enough char in the serial buffer to read checksum
dudmuck 0:0bd73064b7f6 179 if( checksumIndex >= ( rx_buf_lens[idx] - 2 ) )
dudmuck 0:0bd73064b7f6 180 return false;
dudmuck 0:0bd73064b7f6 181
dudmuck 0:0bd73064b7f6 182 // check the checksum
dudmuck 0:0bd73064b7f6 183 if( ( NmeaString[checksumIndex] == checksum[0] ) && ( NmeaString[checksumIndex + 1] == checksum[1] ) )
dudmuck 0:0bd73064b7f6 184 {
dudmuck 0:0bd73064b7f6 185 return true;
dudmuck 0:0bd73064b7f6 186 }
dudmuck 0:0bd73064b7f6 187 else
dudmuck 0:0bd73064b7f6 188 return false;
dudmuck 0:0bd73064b7f6 189 }
dudmuck 0:0bd73064b7f6 190
dudmuck 0:0bd73064b7f6 191 void GPS::ConvertPositionFromStringToNumerical( )
dudmuck 0:0bd73064b7f6 192 {
dudmuck 0:0bd73064b7f6 193 int i;
dudmuck 0:0bd73064b7f6 194
dudmuck 0:0bd73064b7f6 195 double valueTmp1;
dudmuck 0:0bd73064b7f6 196 double valueTmp2;
dudmuck 0:0bd73064b7f6 197 double valueTmp3;
dudmuck 0:0bd73064b7f6 198 double valueTmp4;
dudmuck 0:0bd73064b7f6 199
shaunkrnelson 6:9dfe135334c9 200
dudmuck 0:0bd73064b7f6 201 // Convert the latitude from ASCII to uint8_t values
dudmuck 0:0bd73064b7f6 202 for( i = 0 ; i < 10 ; i++ )
dudmuck 0:0bd73064b7f6 203 {
dudmuck 0:0bd73064b7f6 204 NmeaGpsData.NmeaLatitude[i] = NmeaGpsData.NmeaLatitude[i] & 0xF;
dudmuck 0:0bd73064b7f6 205 }
dudmuck 0:0bd73064b7f6 206 // Convert latitude from degree/minute/second (DMS) format into decimal
dudmuck 0:0bd73064b7f6 207 valueTmp1 = ( double )NmeaGpsData.NmeaLatitude[0] * 10.0 + ( double )NmeaGpsData.NmeaLatitude[1];
dudmuck 0:0bd73064b7f6 208 valueTmp2 = ( double )NmeaGpsData.NmeaLatitude[2] * 10.0 + ( double )NmeaGpsData.NmeaLatitude[3];
dudmuck 0:0bd73064b7f6 209 valueTmp3 = ( double )NmeaGpsData.NmeaLatitude[5] * 1000.0 + ( double )NmeaGpsData.NmeaLatitude[6] * 100.0 +
dudmuck 0:0bd73064b7f6 210 ( double )NmeaGpsData.NmeaLatitude[7] * 10.0 + ( double )NmeaGpsData.NmeaLatitude[8];
dudmuck 0:0bd73064b7f6 211
dudmuck 0:0bd73064b7f6 212 Latitude = valueTmp1 + ( ( valueTmp2 + ( valueTmp3 * 0.0001 ) ) / 60.0 );
dudmuck 0:0bd73064b7f6 213
dudmuck 0:0bd73064b7f6 214 if( NmeaGpsData.NmeaLatitudePole[0] == 'S' )
dudmuck 0:0bd73064b7f6 215 {
dudmuck 0:0bd73064b7f6 216 Latitude *= -1;
dudmuck 0:0bd73064b7f6 217 }
dudmuck 0:0bd73064b7f6 218
dudmuck 0:0bd73064b7f6 219 // Convert the longitude from ASCII to uint8_t values
dudmuck 0:0bd73064b7f6 220 for( i = 0 ; i < 10 ; i++ )
dudmuck 0:0bd73064b7f6 221 {
dudmuck 0:0bd73064b7f6 222 NmeaGpsData.NmeaLongitude[i] = NmeaGpsData.NmeaLongitude[i] & 0xF;
dudmuck 0:0bd73064b7f6 223 }
dudmuck 0:0bd73064b7f6 224 // Convert longitude from degree/minute/second (DMS) format into decimal
dudmuck 0:0bd73064b7f6 225 valueTmp1 = ( double )NmeaGpsData.NmeaLongitude[0] * 100.0 + ( double )NmeaGpsData.NmeaLongitude[1] * 10.0 + ( double )NmeaGpsData.NmeaLongitude[2];
dudmuck 0:0bd73064b7f6 226 valueTmp2 = ( double )NmeaGpsData.NmeaLongitude[3] * 10.0 + ( double )NmeaGpsData.NmeaLongitude[4];
dudmuck 0:0bd73064b7f6 227 valueTmp3 = ( double )NmeaGpsData.NmeaLongitude[6] * 1000.0 + ( double )NmeaGpsData.NmeaLongitude[7] * 100;
dudmuck 0:0bd73064b7f6 228 valueTmp4 = ( double )NmeaGpsData.NmeaLongitude[8] * 10.0 + ( double )NmeaGpsData.NmeaLongitude[9];
dudmuck 0:0bd73064b7f6 229
dudmuck 0:0bd73064b7f6 230 Longitude = valueTmp1 + ( valueTmp2 / 60.0 ) + ( ( ( valueTmp3 + valueTmp4 ) * 0.0001 ) / 60.0 );
dudmuck 0:0bd73064b7f6 231
dudmuck 0:0bd73064b7f6 232 if( NmeaGpsData.NmeaLongitudePole[0] == 'W' )
dudmuck 0:0bd73064b7f6 233 {
dudmuck 0:0bd73064b7f6 234 Longitude *= -1;
dudmuck 0:0bd73064b7f6 235 }
dudmuck 0:0bd73064b7f6 236
shaunkrnelson 13:9b6cd6eb808e 237 if(verbose)
shaunkrnelson 13:9b6cd6eb808e 238 printf("GPS: LAT=%f, LONG=%f\n", Latitude, Longitude);
dudmuck 0:0bd73064b7f6 239 }
dudmuck 0:0bd73064b7f6 240
dudmuck 0:0bd73064b7f6 241 void GPS::ConvertPositionIntoBinary( )
dudmuck 0:0bd73064b7f6 242 {
dudmuck 0:0bd73064b7f6 243 long double temp;
dudmuck 0:0bd73064b7f6 244
dudmuck 0:0bd73064b7f6 245 if( Latitude >= 0 ) // North
dudmuck 0:0bd73064b7f6 246 {
dudmuck 0:0bd73064b7f6 247 temp = Latitude * MaxNorthPosition;
dudmuck 0:0bd73064b7f6 248 LatitudeBinary = temp / 90;
dudmuck 0:0bd73064b7f6 249 }
dudmuck 0:0bd73064b7f6 250 else // South
dudmuck 0:0bd73064b7f6 251 {
dudmuck 0:0bd73064b7f6 252 temp = Latitude * MaxSouthPosition;
dudmuck 0:0bd73064b7f6 253 LatitudeBinary = temp / 90;
dudmuck 0:0bd73064b7f6 254 }
dudmuck 0:0bd73064b7f6 255
dudmuck 0:0bd73064b7f6 256 if( Longitude >= 0 ) // East
dudmuck 0:0bd73064b7f6 257 {
dudmuck 0:0bd73064b7f6 258 temp = Longitude * MaxEastPosition;
dudmuck 0:0bd73064b7f6 259 LongitudeBinary = temp / 180;
dudmuck 0:0bd73064b7f6 260 }
dudmuck 0:0bd73064b7f6 261 else // West
dudmuck 0:0bd73064b7f6 262 {
dudmuck 0:0bd73064b7f6 263 temp = Longitude * MaxWestPosition;
dudmuck 0:0bd73064b7f6 264 LongitudeBinary = temp / 180;
dudmuck 0:0bd73064b7f6 265 }
dudmuck 1:2f5fbb33ae8b 266
shaunkrnelson 13:9b6cd6eb808e 267 if ((LatitudeBinary == LAT_UNFIXED) || (LongitudeBinary == LONG_UNFIXED))
dudmuck 1:2f5fbb33ae8b 268 have_fix = false;
dudmuck 1:2f5fbb33ae8b 269 else
shaunkrnelson 7:44cb21f05dcc 270 {
shaunkrnelson 13:9b6cd6eb808e 271 LatitudeBinary &= 0xffffff;
shaunkrnelson 13:9b6cd6eb808e 272 LongitudeBinary &= 0xffffff;
shaunkrnelson 13:9b6cd6eb808e 273
dudmuck 1:2f5fbb33ae8b 274 have_fix = true;
shaunkrnelson 7:44cb21f05dcc 275 if(verbose == true)
shaunkrnelson 13:9b6cd6eb808e 276 printf("GPS: BLAT=%lx, BLONG=%lx\r\n", LatitudeBinary, LongitudeBinary);
shaunkrnelson 7:44cb21f05dcc 277 }
dudmuck 0:0bd73064b7f6 278 }
dudmuck 0:0bd73064b7f6 279
dudmuck 0:0bd73064b7f6 280 int GPS::ParseGPSData(int idx)
dudmuck 0:0bd73064b7f6 281 {
dudmuck 0:0bd73064b7f6 282 uint8_t i, j, fieldSize;
dudmuck 0:0bd73064b7f6 283 char *NmeaString;
dudmuck 0:0bd73064b7f6 284
dudmuck 0:0bd73064b7f6 285 if (NmeaValidateChecksum(idx) == false) {
dudmuck 0:0bd73064b7f6 286 return FAIL;
dudmuck 0:0bd73064b7f6 287 }
dudmuck 0:0bd73064b7f6 288
dudmuck 0:0bd73064b7f6 289 NmeaString = rx_bufs[idx];
dudmuck 1:2f5fbb33ae8b 290
dudmuck 1:2f5fbb33ae8b 291 if (NmeaString[0] == 'P' && NmeaString[1] == 'M' && NmeaString[2] == 'T' && NmeaString[3] == 'K') {
dudmuck 1:2f5fbb33ae8b 292 /* anything useful from PMTK packets? */
dudmuck 1:2f5fbb33ae8b 293 return SUCCESS;
dudmuck 1:2f5fbb33ae8b 294 }
dudmuck 1:2f5fbb33ae8b 295
dudmuck 0:0bd73064b7f6 296 fieldSize = 0;
dudmuck 0:0bd73064b7f6 297 i = 0;
dudmuck 0:0bd73064b7f6 298 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 299 {
dudmuck 0:0bd73064b7f6 300 if( fieldSize > 6 )
dudmuck 0:0bd73064b7f6 301 {
dudmuck 1:2f5fbb33ae8b 302 printf("gps parse:%s\r\n", NmeaString);
dudmuck 0:0bd73064b7f6 303 return FAIL;
dudmuck 0:0bd73064b7f6 304 }
dudmuck 0:0bd73064b7f6 305 }
dudmuck 0:0bd73064b7f6 306
dudmuck 0:0bd73064b7f6 307 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 308 {
dudmuck 0:0bd73064b7f6 309 NmeaGpsData.NmeaDataType[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 310 }
dudmuck 0:0bd73064b7f6 311 // Parse the GPGGA data
dudmuck 0:0bd73064b7f6 312 if( strncmp( ( const char* )NmeaGpsData.NmeaDataType, ( const char* )NmeaDataTypeGPGGA, 5 ) == 0 )
dudmuck 0:0bd73064b7f6 313 {
shaunkrnelson 7:44cb21f05dcc 314 if(verbose == true)
shaunkrnelson 7:44cb21f05dcc 315 printf("GPGAA: %s\r\n",NmeaString);
shaunkrnelson 7:44cb21f05dcc 316
dudmuck 0:0bd73064b7f6 317 // NmeaUtcTime
dudmuck 0:0bd73064b7f6 318 fieldSize = 0;
dudmuck 0:0bd73064b7f6 319 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 320 {
dudmuck 0:0bd73064b7f6 321 if( fieldSize > 11 )
dudmuck 0:0bd73064b7f6 322 {
dudmuck 0:0bd73064b7f6 323 return FAIL;
dudmuck 0:0bd73064b7f6 324 }
dudmuck 0:0bd73064b7f6 325 }
dudmuck 0:0bd73064b7f6 326 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 327 {
dudmuck 0:0bd73064b7f6 328 NmeaGpsData.NmeaUtcTime[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 329 }
dudmuck 0:0bd73064b7f6 330 // NmeaLatitude
dudmuck 0:0bd73064b7f6 331 fieldSize = 0;
dudmuck 0:0bd73064b7f6 332 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 333 {
dudmuck 0:0bd73064b7f6 334 if( fieldSize > 10 )
dudmuck 0:0bd73064b7f6 335 {
dudmuck 0:0bd73064b7f6 336 return FAIL;
dudmuck 0:0bd73064b7f6 337 }
dudmuck 0:0bd73064b7f6 338 }
shaunkrnelson 7:44cb21f05dcc 339 if(fieldSize <= 1)
shaunkrnelson 6:9dfe135334c9 340 return FAIL;
shaunkrnelson 6:9dfe135334c9 341
dudmuck 0:0bd73064b7f6 342 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 343 {
dudmuck 0:0bd73064b7f6 344 NmeaGpsData.NmeaLatitude[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 345 }
dudmuck 0:0bd73064b7f6 346 // NmeaLatitudePole
dudmuck 0:0bd73064b7f6 347 fieldSize = 0;
dudmuck 0:0bd73064b7f6 348 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 349 {
dudmuck 0:0bd73064b7f6 350 if( fieldSize > 2 )
dudmuck 0:0bd73064b7f6 351 {
dudmuck 0:0bd73064b7f6 352 return FAIL;
dudmuck 0:0bd73064b7f6 353 }
dudmuck 0:0bd73064b7f6 354 }
shaunkrnelson 6:9dfe135334c9 355
shaunkrnelson 7:44cb21f05dcc 356 if(fieldSize <= 1)
shaunkrnelson 6:9dfe135334c9 357 return FAIL;
dudmuck 0:0bd73064b7f6 358 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 359 {
dudmuck 0:0bd73064b7f6 360 NmeaGpsData.NmeaLatitudePole[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 361 }
dudmuck 0:0bd73064b7f6 362 // NmeaLongitude
dudmuck 0:0bd73064b7f6 363 fieldSize = 0;
dudmuck 0:0bd73064b7f6 364 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 365 {
dudmuck 0:0bd73064b7f6 366 if( fieldSize > 11 )
dudmuck 0:0bd73064b7f6 367 {
dudmuck 0:0bd73064b7f6 368 return FAIL;
dudmuck 0:0bd73064b7f6 369 }
dudmuck 0:0bd73064b7f6 370 }
shaunkrnelson 7:44cb21f05dcc 371 if(fieldSize <= 1)
shaunkrnelson 6:9dfe135334c9 372 return FAIL;
shaunkrnelson 6:9dfe135334c9 373
dudmuck 0:0bd73064b7f6 374 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 375 {
dudmuck 0:0bd73064b7f6 376 NmeaGpsData.NmeaLongitude[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 377 }
dudmuck 0:0bd73064b7f6 378 // NmeaLongitudePole
dudmuck 0:0bd73064b7f6 379 fieldSize = 0;
dudmuck 0:0bd73064b7f6 380 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 381 {
dudmuck 0:0bd73064b7f6 382 if( fieldSize > 2 )
dudmuck 0:0bd73064b7f6 383 {
dudmuck 0:0bd73064b7f6 384 return FAIL;
dudmuck 0:0bd73064b7f6 385 }
dudmuck 0:0bd73064b7f6 386 }
shaunkrnelson 6:9dfe135334c9 387
shaunkrnelson 7:44cb21f05dcc 388 if(fieldSize <= 1)
shaunkrnelson 6:9dfe135334c9 389 return FAIL;
dudmuck 0:0bd73064b7f6 390 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 391 {
dudmuck 0:0bd73064b7f6 392 NmeaGpsData.NmeaLongitudePole[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 393 }
dudmuck 0:0bd73064b7f6 394 // NmeaFixQuality
dudmuck 0:0bd73064b7f6 395 fieldSize = 0;
dudmuck 0:0bd73064b7f6 396 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 397 {
dudmuck 0:0bd73064b7f6 398 if( fieldSize > 2 )
dudmuck 0:0bd73064b7f6 399 {
dudmuck 0:0bd73064b7f6 400 return FAIL;
dudmuck 0:0bd73064b7f6 401 }
dudmuck 0:0bd73064b7f6 402 }
dudmuck 0:0bd73064b7f6 403 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 404 {
dudmuck 0:0bd73064b7f6 405 NmeaGpsData.NmeaFixQuality[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 406 }
dudmuck 0:0bd73064b7f6 407 // NmeaSatelliteTracked
dudmuck 0:0bd73064b7f6 408 fieldSize = 0;
dudmuck 0:0bd73064b7f6 409 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 410 {
dudmuck 0:0bd73064b7f6 411 if( fieldSize > 3 )
dudmuck 0:0bd73064b7f6 412 {
dudmuck 0:0bd73064b7f6 413 return FAIL;
dudmuck 0:0bd73064b7f6 414 }
dudmuck 0:0bd73064b7f6 415 }
dudmuck 0:0bd73064b7f6 416 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 417 {
dudmuck 0:0bd73064b7f6 418 NmeaGpsData.NmeaSatelliteTracked[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 419 }
dudmuck 0:0bd73064b7f6 420 // NmeaHorizontalDilution
dudmuck 0:0bd73064b7f6 421 fieldSize = 0;
dudmuck 0:0bd73064b7f6 422 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 423 {
dudmuck 0:0bd73064b7f6 424 if( fieldSize > 6 )
dudmuck 0:0bd73064b7f6 425 {
dudmuck 0:0bd73064b7f6 426 return FAIL;
dudmuck 0:0bd73064b7f6 427 }
dudmuck 0:0bd73064b7f6 428 }
dudmuck 0:0bd73064b7f6 429 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 430 {
dudmuck 0:0bd73064b7f6 431 NmeaGpsData.NmeaHorizontalDilution[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 432 }
dudmuck 0:0bd73064b7f6 433 // NmeaAltitude
dudmuck 0:0bd73064b7f6 434 fieldSize = 0;
dudmuck 0:0bd73064b7f6 435 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 436 {
dudmuck 0:0bd73064b7f6 437 if( fieldSize > 8 )
dudmuck 0:0bd73064b7f6 438 {
dudmuck 0:0bd73064b7f6 439 return FAIL;
dudmuck 0:0bd73064b7f6 440 }
dudmuck 0:0bd73064b7f6 441 }
dudmuck 0:0bd73064b7f6 442 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 443 {
dudmuck 0:0bd73064b7f6 444 NmeaGpsData.NmeaAltitude[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 445 }
dudmuck 0:0bd73064b7f6 446 // NmeaAltitudeUnit
dudmuck 0:0bd73064b7f6 447 fieldSize = 0;
dudmuck 0:0bd73064b7f6 448 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 449 {
dudmuck 0:0bd73064b7f6 450 if( fieldSize > 2 )
dudmuck 0:0bd73064b7f6 451 {
dudmuck 0:0bd73064b7f6 452 return FAIL;
dudmuck 0:0bd73064b7f6 453 }
dudmuck 0:0bd73064b7f6 454 }
dudmuck 0:0bd73064b7f6 455 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 456 {
dudmuck 0:0bd73064b7f6 457 NmeaGpsData.NmeaAltitudeUnit[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 458 }
dudmuck 0:0bd73064b7f6 459 // NmeaHeightGeoid
dudmuck 0:0bd73064b7f6 460 fieldSize = 0;
dudmuck 0:0bd73064b7f6 461 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 462 {
dudmuck 0:0bd73064b7f6 463 if( fieldSize > 8 )
dudmuck 0:0bd73064b7f6 464 {
dudmuck 0:0bd73064b7f6 465 return FAIL;
dudmuck 0:0bd73064b7f6 466 }
dudmuck 0:0bd73064b7f6 467 }
dudmuck 0:0bd73064b7f6 468 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 469 {
dudmuck 0:0bd73064b7f6 470 NmeaGpsData.NmeaHeightGeoid[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 471 }
dudmuck 0:0bd73064b7f6 472 // NmeaHeightGeoidUnit
dudmuck 0:0bd73064b7f6 473 fieldSize = 0;
dudmuck 0:0bd73064b7f6 474 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 475 {
dudmuck 0:0bd73064b7f6 476 if( fieldSize > 2 )
dudmuck 0:0bd73064b7f6 477 {
dudmuck 0:0bd73064b7f6 478 return FAIL;
dudmuck 0:0bd73064b7f6 479 }
dudmuck 0:0bd73064b7f6 480 }
dudmuck 0:0bd73064b7f6 481 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 482 {
dudmuck 0:0bd73064b7f6 483 NmeaGpsData.NmeaHeightGeoidUnit[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 484 }
dudmuck 0:0bd73064b7f6 485
dudmuck 0:0bd73064b7f6 486 //FormatGpsData( );
dudmuck 0:0bd73064b7f6 487 ConvertPositionFromStringToNumerical( );
dudmuck 0:0bd73064b7f6 488 ConvertPositionIntoBinary( );
dudmuck 0:0bd73064b7f6 489 return SUCCESS;
dudmuck 0:0bd73064b7f6 490 }
dudmuck 0:0bd73064b7f6 491 else if ( strncmp( ( const char* )NmeaGpsData.NmeaDataType, ( const char* )NmeaDataTypeGPRMC, 5 ) == 0 )
dudmuck 0:0bd73064b7f6 492 {
shaunkrnelson 7:44cb21f05dcc 493 if(verbose == true)
shaunkrnelson 7:44cb21f05dcc 494 printf("GPMRC: %s\r\n", NmeaString);
shaunkrnelson 7:44cb21f05dcc 495
dudmuck 0:0bd73064b7f6 496 // NmeaUtcTime
dudmuck 0:0bd73064b7f6 497 fieldSize = 0;
dudmuck 0:0bd73064b7f6 498 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 499 {
dudmuck 0:0bd73064b7f6 500 if( fieldSize > 11 )
dudmuck 0:0bd73064b7f6 501 {
dudmuck 0:0bd73064b7f6 502 return FAIL;
dudmuck 0:0bd73064b7f6 503 }
dudmuck 0:0bd73064b7f6 504 }
dudmuck 0:0bd73064b7f6 505 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 506 {
dudmuck 0:0bd73064b7f6 507 NmeaGpsData.NmeaUtcTime[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 508 }
dudmuck 0:0bd73064b7f6 509 // NmeaDataStatus
dudmuck 0:0bd73064b7f6 510 fieldSize = 0;
dudmuck 0:0bd73064b7f6 511 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 512 {
dudmuck 0:0bd73064b7f6 513 if( fieldSize > 2 )
dudmuck 0:0bd73064b7f6 514 {
dudmuck 0:0bd73064b7f6 515 return FAIL;
dudmuck 0:0bd73064b7f6 516 }
dudmuck 0:0bd73064b7f6 517 }
shaunkrnelson 7:44cb21f05dcc 518 if(fieldSize <= 1)
shaunkrnelson 6:9dfe135334c9 519 return FAIL;
dudmuck 0:0bd73064b7f6 520 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 521 {
dudmuck 0:0bd73064b7f6 522 NmeaGpsData.NmeaDataStatus[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 523 }
shaunkrnelson 6:9dfe135334c9 524
shaunkrnelson 6:9dfe135334c9 525 if(NmeaGpsData.NmeaDataStatus[0] != 'A')
shaunkrnelson 6:9dfe135334c9 526 return FAIL;
shaunkrnelson 6:9dfe135334c9 527 //
dudmuck 0:0bd73064b7f6 528 // NmeaLatitude
dudmuck 0:0bd73064b7f6 529 fieldSize = 0;
dudmuck 0:0bd73064b7f6 530 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 531 {
dudmuck 0:0bd73064b7f6 532 if( fieldSize > 10 )
dudmuck 0:0bd73064b7f6 533 {
dudmuck 0:0bd73064b7f6 534 return FAIL;
dudmuck 0:0bd73064b7f6 535 }
dudmuck 0:0bd73064b7f6 536 }
shaunkrnelson 6:9dfe135334c9 537
shaunkrnelson 7:44cb21f05dcc 538 if(fieldSize <= 1)
shaunkrnelson 6:9dfe135334c9 539 return FAIL;
shaunkrnelson 6:9dfe135334c9 540
dudmuck 0:0bd73064b7f6 541 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 542 {
dudmuck 0:0bd73064b7f6 543 NmeaGpsData.NmeaLatitude[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 544 }
dudmuck 0:0bd73064b7f6 545 // NmeaLatitudePole
dudmuck 0:0bd73064b7f6 546 fieldSize = 0;
dudmuck 0:0bd73064b7f6 547 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 548 {
dudmuck 0:0bd73064b7f6 549 if( fieldSize > 2 )
dudmuck 0:0bd73064b7f6 550 {
dudmuck 0:0bd73064b7f6 551 return FAIL;
dudmuck 0:0bd73064b7f6 552 }
dudmuck 0:0bd73064b7f6 553 }
shaunkrnelson 7:44cb21f05dcc 554 if(fieldSize <= 1)
shaunkrnelson 6:9dfe135334c9 555 return FAIL;
dudmuck 0:0bd73064b7f6 556 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 557 {
dudmuck 0:0bd73064b7f6 558 NmeaGpsData.NmeaLatitudePole[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 559 }
dudmuck 0:0bd73064b7f6 560 // NmeaLongitude
dudmuck 0:0bd73064b7f6 561 fieldSize = 0;
dudmuck 0:0bd73064b7f6 562 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 563 {
dudmuck 0:0bd73064b7f6 564 if( fieldSize > 11 )
dudmuck 0:0bd73064b7f6 565 {
dudmuck 0:0bd73064b7f6 566 return FAIL;
dudmuck 0:0bd73064b7f6 567 }
dudmuck 0:0bd73064b7f6 568 }
shaunkrnelson 7:44cb21f05dcc 569 if(fieldSize <= 1)
shaunkrnelson 6:9dfe135334c9 570 return FAIL;
dudmuck 0:0bd73064b7f6 571 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 572 {
dudmuck 0:0bd73064b7f6 573 NmeaGpsData.NmeaLongitude[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 574 }
dudmuck 0:0bd73064b7f6 575 // NmeaLongitudePole
dudmuck 0:0bd73064b7f6 576 fieldSize = 0;
dudmuck 0:0bd73064b7f6 577 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 578 {
dudmuck 0:0bd73064b7f6 579 if( fieldSize > 2 )
dudmuck 0:0bd73064b7f6 580 {
dudmuck 0:0bd73064b7f6 581 return FAIL;
dudmuck 0:0bd73064b7f6 582 }
dudmuck 0:0bd73064b7f6 583 }
shaunkrnelson 7:44cb21f05dcc 584 if(fieldSize <= 1)
shaunkrnelson 6:9dfe135334c9 585 return FAIL;
dudmuck 0:0bd73064b7f6 586 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 587 {
dudmuck 0:0bd73064b7f6 588 NmeaGpsData.NmeaLongitudePole[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 589 }
dudmuck 0:0bd73064b7f6 590 // NmeaSpeed
dudmuck 0:0bd73064b7f6 591 fieldSize = 0;
dudmuck 0:0bd73064b7f6 592 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 593 {
dudmuck 0:0bd73064b7f6 594 if( fieldSize > 8 )
dudmuck 0:0bd73064b7f6 595 {
dudmuck 0:0bd73064b7f6 596 return FAIL;
dudmuck 0:0bd73064b7f6 597 }
dudmuck 0:0bd73064b7f6 598 }
dudmuck 0:0bd73064b7f6 599 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 600 {
dudmuck 0:0bd73064b7f6 601 NmeaGpsData.NmeaSpeed[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 602 }
dudmuck 0:0bd73064b7f6 603 // NmeaDetectionAngle
dudmuck 0:0bd73064b7f6 604 fieldSize = 0;
dudmuck 0:0bd73064b7f6 605 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 606 {
dudmuck 0:0bd73064b7f6 607 if( fieldSize > 8 )
dudmuck 0:0bd73064b7f6 608 {
dudmuck 0:0bd73064b7f6 609 return FAIL;
dudmuck 0:0bd73064b7f6 610 }
dudmuck 0:0bd73064b7f6 611 }
dudmuck 0:0bd73064b7f6 612 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 613 {
dudmuck 0:0bd73064b7f6 614 NmeaGpsData.NmeaDetectionAngle[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 615 }
dudmuck 0:0bd73064b7f6 616 // NmeaDate
dudmuck 0:0bd73064b7f6 617 fieldSize = 0;
dudmuck 0:0bd73064b7f6 618 while( NmeaString[i + fieldSize++] != ',' )
dudmuck 0:0bd73064b7f6 619 {
dudmuck 0:0bd73064b7f6 620 if( fieldSize > 8 )
dudmuck 0:0bd73064b7f6 621 {
dudmuck 0:0bd73064b7f6 622 return FAIL;
dudmuck 0:0bd73064b7f6 623 }
dudmuck 0:0bd73064b7f6 624 }
dudmuck 0:0bd73064b7f6 625 for( j = 0; j < fieldSize; j++, i++ )
dudmuck 0:0bd73064b7f6 626 {
dudmuck 0:0bd73064b7f6 627 NmeaGpsData.NmeaDate[j] = NmeaString[i];
dudmuck 0:0bd73064b7f6 628 }
dudmuck 0:0bd73064b7f6 629
dudmuck 0:0bd73064b7f6 630 //FormatGpsData( );
dudmuck 0:0bd73064b7f6 631 ConvertPositionFromStringToNumerical( );
dudmuck 0:0bd73064b7f6 632 ConvertPositionIntoBinary( );
dudmuck 0:0bd73064b7f6 633 return SUCCESS;
dudmuck 0:0bd73064b7f6 634 }
dudmuck 0:0bd73064b7f6 635 else
dudmuck 0:0bd73064b7f6 636 {
dudmuck 0:0bd73064b7f6 637 return FAIL;
dudmuck 0:0bd73064b7f6 638 }
dudmuck 0:0bd73064b7f6 639 }
dudmuck 0:0bd73064b7f6 640
dudmuck 0:0bd73064b7f6 641 void GPS::service()
dudmuck 0:0bd73064b7f6 642 {
dudmuck 0:0bd73064b7f6 643 while (rx_bufs_in_idx != rx_bufs_out_idx) {
dudmuck 0:0bd73064b7f6 644 ParseGPSData(rx_bufs_out_idx);
dudmuck 0:0bd73064b7f6 645 if (++rx_bufs_out_idx == NUM_RX_BUFS)
dudmuck 0:0bd73064b7f6 646 rx_bufs_out_idx = 0;
dudmuck 0:0bd73064b7f6 647 }
dudmuck 0:0bd73064b7f6 648
dudmuck 2:b531881123bf 649 /*if (pps_occurred) {
dudmuck 0:0bd73064b7f6 650 pps_occurred = false;
dudmuck 0:0bd73064b7f6 651 if (verbose)
dudmuck 0:0bd73064b7f6 652 printf("gps:pps\r\n");
dudmuck 2:b531881123bf 653 }*/
dudmuck 0:0bd73064b7f6 654 }
dudmuck 0:0bd73064b7f6 655
dudmuck 0:0bd73064b7f6 656