Skip to content

Commit c879fb8

Browse files
authored
Merge pull request #8 from sparkfun/release_candidate
Update Release candidate
2 parents c97f192 + 039004e commit c879fb8

File tree

5 files changed

+257
-21
lines changed

5 files changed

+257
-21
lines changed

examples/Data_Logging/DataLoggingExample6_NMEA/DataLoggingExample6_NMEA.ino

+3-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,9 @@ void setup()
144144
myGNSS.enableNMEAMessage(UBX_NMEA_GGA, COM_PORT_I2C, 1); // Ensure the GxGGA (Global positioning system fix data) message is enabled. Send every measurement.
145145
myGNSS.enableNMEAMessage(UBX_NMEA_GSA, COM_PORT_I2C, 1); // Ensure the GxGSA (GNSS DOP and Active satellites) message is enabled. Send every measurement.
146146
myGNSS.enableNMEAMessage(UBX_NMEA_GSV, COM_PORT_I2C, 1); // Ensure the GxGSV (GNSS satellites in view) message is enabled. Send every measurement.
147-
myGNSS.logNMEA(); // Enable NMEA logging
147+
148+
myGNSS.setNMEALoggingMask(SFE_UBLOX_FILTER_NMEA_ALL); // Enable logging of all enabled NMEA messages
149+
//myGNSS.setNMEALoggingMask(SFE_UBLOX_FILTER_NMEA_GGA | SFE_UBLOX_FILTER_NMEA_GSA); // Or we can, for example, log only GxGGA & GxGSA and ignore GxGSV
148150

149151
Serial.println(F("Press any key to stop logging."));
150152

examples/Example2_NMEAParsing/Example2_NMEAParsing.ino

+7-3
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ void setup()
4545
Serial.println(F("u-blox GNSS not detected at default I2C address. Please check wiring. Freezing."));
4646
while (1);
4747
}
48+
49+
myGNSS.setProcessNMEAMask(SFE_UBLOX_FILTER_NMEA_ALL); // Make sure the library is passing all NMEA messages to processNMEA
50+
51+
myGNSS.setProcessNMEAMask(SFE_UBLOX_FILTER_NMEA_GGA); // Or, we can be kind to MicroNMEA and _only_ pass the GGA messages to it
4852
}
4953

5054
void loop()
@@ -60,12 +64,12 @@ void loop()
6064
Serial.println(latitude_mdeg / 1000000., 6);
6165
Serial.print("Longitude (deg): ");
6266
Serial.println(longitude_mdeg / 1000000., 6);
67+
68+
nmea.clear(); // Clear the MicroNMEA storage to make sure we are getting fresh data
6369
}
6470
else
6571
{
66-
Serial.print("No Fix - ");
67-
Serial.print("Num. satellites: ");
68-
Serial.println(nmea.getNumSatellites());
72+
Serial.println("Waiting for fresh data");
6973
}
7074

7175
delay(250); //Don't pound too hard on the I2C bus

keywords.txt

+29-1
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,10 @@ initPacketUBXHNRPVT KEYWORD2
382382
flushHNRPVT KEYWORD2
383383
logHNRPVT KEYWORD2
384384

385-
logNMEA KEYWORD2
385+
setNMEALoggingMask KEYWORD2
386+
getNMEALoggingMask KEYWORD2
387+
setProcessNMEAMask KEYWORD2
388+
getProcessNMEAMask KEYWORD2
386389

387390
setNavigationFrequency KEYWORD2
388391
getNavigationFrequency KEYWORD2
@@ -546,16 +549,41 @@ UBX_NMEA_GLQ LITERAL1
546549
UBX_NMEA_GNQ LITERAL1
547550
UBX_NMEA_GNS LITERAL1
548551
UBX_NMEA_GPQ LITERAL1
552+
UBX_NMEA_GQQ LITERAL1
549553
UBX_NMEA_GRS LITERAL1
550554
UBX_NMEA_GSA LITERAL1
551555
UBX_NMEA_GST LITERAL1
552556
UBX_NMEA_GSV LITERAL1
557+
UBX_NMEA_RLM LITERAL1
553558
UBX_NMEA_RMC LITERAL1
554559
UBX_NMEA_TXT LITERAL1
555560
UBX_NMEA_VLW LITERAL1
556561
UBX_NMEA_VTG LITERAL1
557562
UBX_NMEA_ZDA LITERAL1
558563

564+
SFE_UBLOX_FILTER_NMEA_ALL LITERAL1
565+
SFE_UBLOX_FILTER_NMEA_DTM LITERAL1
566+
SFE_UBLOX_FILTER_NMEA_GAQ LITERAL1
567+
SFE_UBLOX_FILTER_NMEA_GBQ LITERAL1
568+
SFE_UBLOX_FILTER_NMEA_GBS LITERAL1
569+
SFE_UBLOX_FILTER_NMEA_GGA LITERAL1
570+
SFE_UBLOX_FILTER_NMEA_GLL LITERAL1
571+
SFE_UBLOX_FILTER_NMEA_GLQ LITERAL1
572+
SFE_UBLOX_FILTER_NMEA_GNQ LITERAL1
573+
SFE_UBLOX_FILTER_NMEA_GNS LITERAL1
574+
SFE_UBLOX_FILTER_NMEA_GPQ LITERAL1
575+
SFE_UBLOX_FILTER_NMEA_GQQ LITERAL1
576+
SFE_UBLOX_FILTER_NMEA_GRS LITERAL1
577+
SFE_UBLOX_FILTER_NMEA_GSA LITERAL1
578+
SFE_UBLOX_FILTER_NMEA_GST LITERAL1
579+
SFE_UBLOX_FILTER_NMEA_GSV LITERAL1
580+
SFE_UBLOX_FILTER_NMEA_RLM LITERAL1
581+
SFE_UBLOX_FILTER_NMEA_RMC LITERAL1
582+
SFE_UBLOX_FILTER_NMEA_TXT LITERAL1
583+
SFE_UBLOX_FILTER_NMEA_VLW LITERAL1
584+
SFE_UBLOX_FILTER_NMEA_VTG LITERAL1
585+
SFE_UBLOX_FILTER_NMEA_ZDA LITERAL1
586+
559587
UBX_NAV_ATT LITERAL1
560588
UBX_NAV_CLOCK LITERAL1
561589
UBX_NAV_DOP LITERAL1

src/SparkFun_u-blox_GNSS_Arduino_Library.cpp

+135-9
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ SFE_UBLOX_GNSS::SFE_UBLOX_GNSS(void)
5050
pinMode((uint8_t)debugPin, OUTPUT);
5151
digitalWrite((uint8_t)debugPin, HIGH);
5252
}
53+
54+
_logNMEA.all = 0; // Default to passing no NMEA messages to the file buffer
55+
_processNMEA.all = SFE_UBLOX_FILTER_NMEA_ALL; // Default to passing all NMEA messages to processNMEA
5356
}
5457

5558
//Stop all automatic message processing. Free all used RAM
@@ -1020,6 +1023,7 @@ void SFE_UBLOX_GNSS::process(uint8_t incoming, ubxPacket *incomingUBX, uint8_t r
10201023
}
10211024
else if (incoming == '$')
10221025
{
1026+
nmeaByteCounter = 0; // Reset the NMEA byte counter
10231027
currentSentence = NMEA;
10241028
}
10251029
else if (incoming == 0xD3) //RTCM frames start with 0xD3
@@ -1241,20 +1245,127 @@ void SFE_UBLOX_GNSS::process(uint8_t incoming, ubxPacket *incomingUBX, uint8_t r
12411245
//Finally, increment the frame counter
12421246
ubxFrameCounter++;
12431247
}
1244-
else if (currentSentence == NMEA)
1248+
else if (currentSentence == NMEA) // Process incoming NMEA mesages. Selectively log if desired.
12451249
{
1246-
//If _logNMEA is true, attempt to store incoming in the file buffer
1247-
if (_logNMEA)
1248-
storeFileBytes(&incoming, 1);
1250+
if ((nmeaByteCounter == 0) && (incoming != '$'))
1251+
{
1252+
currentSentence = NONE; //Something went wrong. Reset. (Almost certainly redundant!)
1253+
}
1254+
else if ((nmeaByteCounter == 1) && (incoming != 'G'))
1255+
{
1256+
currentSentence = NONE; //Something went wrong. Reset.
1257+
}
1258+
else if ((nmeaByteCounter >= 0) && (nmeaByteCounter <= 5))
1259+
{
1260+
nmeaAddressField[nmeaByteCounter] = incoming; // Store the start character and NMEA address field
1261+
}
1262+
1263+
if (nmeaByteCounter == 5)
1264+
{
1265+
// We've just received the end of the address field. Check if it is selected for logging
1266+
if (logThisNMEA())
1267+
{
1268+
storeFileBytes(&nmeaAddressField[0], 6); // Add start character and address field to the file buffer
1269+
}
1270+
// Check if it should be passed to processNMEA
1271+
if (processThisNMEA())
1272+
{
1273+
processNMEA(nmeaAddressField[0]); //Process the start character and address field
1274+
processNMEA(nmeaAddressField[1]);
1275+
processNMEA(nmeaAddressField[2]);
1276+
processNMEA(nmeaAddressField[3]);
1277+
processNMEA(nmeaAddressField[4]);
1278+
processNMEA(nmeaAddressField[5]);
1279+
}
1280+
}
1281+
1282+
if ((nmeaByteCounter > 5) || (nmeaByteCounter < 0)) // Should we add incoming to the file buffer and/or pass it to processNMEA?
1283+
{
1284+
if (logThisNMEA())
1285+
storeFileBytes(&incoming, 1); // Add incoming to the file buffer
1286+
if (processThisNMEA())
1287+
processNMEA(incoming); // Pass incoming to processNMEA
1288+
}
12491289

1250-
processNMEA(incoming); //Process each NMEA character
1290+
if (incoming == '*')
1291+
nmeaByteCounter = -5; // We are expecting * plus two checksum bytes plus CR and LF
1292+
1293+
nmeaByteCounter++; // Increment the byte counter
1294+
1295+
if (nmeaByteCounter == maxNMEAByteCount) // Check if we have processed too many bytes
1296+
currentSentence = NONE; //Something went wrong. Reset.
1297+
1298+
if (nmeaByteCounter == 0) // Check if we are done
1299+
currentSentence = NONE; // All done!
12511300
}
12521301
else if (currentSentence == RTCM)
12531302
{
12541303
processRTCMframe(incoming); //Deal with RTCM bytes
12551304
}
12561305
}
12571306

1307+
// PRIVATE: Return true if we should add this NMEA message to the file buffer for logging
1308+
boolean SFE_UBLOX_GNSS::logThisNMEA()
1309+
{
1310+
if (_logNMEA.bits.all == 1) return (true);
1311+
if ((nmeaAddressField[3] == 'D') && (nmeaAddressField[4] == 'T') && (nmeaAddressField[5] == 'M') && (_logNMEA.bits.UBX_NMEA_DTM == 1)) return (true);
1312+
if (nmeaAddressField[3] == 'G')
1313+
{
1314+
if ((nmeaAddressField[4] == 'A') && (nmeaAddressField[5] == 'Q') && (_logNMEA.bits.UBX_NMEA_GAQ == 1)) return (true);
1315+
if ((nmeaAddressField[4] == 'B') && (nmeaAddressField[5] == 'Q') && (_logNMEA.bits.UBX_NMEA_GBQ == 1)) return (true);
1316+
if ((nmeaAddressField[4] == 'B') && (nmeaAddressField[5] == 'S') && (_logNMEA.bits.UBX_NMEA_GBS == 1)) return (true);
1317+
if ((nmeaAddressField[4] == 'G') && (nmeaAddressField[5] == 'A') && (_logNMEA.bits.UBX_NMEA_GGA == 1)) return (true);
1318+
if ((nmeaAddressField[4] == 'L') && (nmeaAddressField[5] == 'L') && (_logNMEA.bits.UBX_NMEA_GLL == 1)) return (true);
1319+
if ((nmeaAddressField[4] == 'L') && (nmeaAddressField[5] == 'Q') && (_logNMEA.bits.UBX_NMEA_GLQ == 1)) return (true);
1320+
if ((nmeaAddressField[4] == 'N') && (nmeaAddressField[5] == 'Q') && (_logNMEA.bits.UBX_NMEA_GNQ == 1)) return (true);
1321+
if ((nmeaAddressField[4] == 'N') && (nmeaAddressField[5] == 'S') && (_logNMEA.bits.UBX_NMEA_GNS == 1)) return (true);
1322+
if ((nmeaAddressField[4] == 'P') && (nmeaAddressField[5] == 'Q') && (_logNMEA.bits.UBX_NMEA_GPQ == 1)) return (true);
1323+
if ((nmeaAddressField[4] == 'Q') && (nmeaAddressField[5] == 'Q') && (_logNMEA.bits.UBX_NMEA_GQQ == 1)) return (true);
1324+
if ((nmeaAddressField[4] == 'R') && (nmeaAddressField[5] == 'S') && (_logNMEA.bits.UBX_NMEA_GRS == 1)) return (true);
1325+
if ((nmeaAddressField[4] == 'S') && (nmeaAddressField[5] == 'A') && (_logNMEA.bits.UBX_NMEA_GSA == 1)) return (true);
1326+
if ((nmeaAddressField[4] == 'S') && (nmeaAddressField[5] == 'T') && (_logNMEA.bits.UBX_NMEA_GST == 1)) return (true);
1327+
if ((nmeaAddressField[4] == 'S') && (nmeaAddressField[5] == 'V') && (_logNMEA.bits.UBX_NMEA_GSV == 1)) return (true);
1328+
}
1329+
if ((nmeaAddressField[3] == 'R') && (nmeaAddressField[4] == 'L') && (nmeaAddressField[5] == 'M') && (_logNMEA.bits.UBX_NMEA_RLM == 1)) return (true);
1330+
if ((nmeaAddressField[3] == 'R') && (nmeaAddressField[4] == 'M') && (nmeaAddressField[5] == 'C') && (_logNMEA.bits.UBX_NMEA_RMC == 1)) return (true);
1331+
if ((nmeaAddressField[3] == 'T') && (nmeaAddressField[4] == 'X') && (nmeaAddressField[5] == 'T') && (_logNMEA.bits.UBX_NMEA_TXT == 1)) return (true);
1332+
if ((nmeaAddressField[3] == 'V') && (nmeaAddressField[4] == 'L') && (nmeaAddressField[5] == 'W') && (_logNMEA.bits.UBX_NMEA_VLW == 1)) return (true);
1333+
if ((nmeaAddressField[3] == 'V') && (nmeaAddressField[4] == 'T') && (nmeaAddressField[5] == 'G') && (_logNMEA.bits.UBX_NMEA_VTG == 1)) return (true);
1334+
if ((nmeaAddressField[3] == 'Z') && (nmeaAddressField[4] == 'D') && (nmeaAddressField[5] == 'A') && (_logNMEA.bits.UBX_NMEA_ZDA == 1)) return (true);
1335+
return (false);
1336+
}
1337+
1338+
// PRIVATE: Return true if we should pass this NMEA message to processNMEA
1339+
boolean SFE_UBLOX_GNSS::processThisNMEA()
1340+
{
1341+
if (_processNMEA.bits.all == 1) return (true);
1342+
if ((nmeaAddressField[3] == 'D') && (nmeaAddressField[4] == 'T') && (nmeaAddressField[5] == 'M') && (_processNMEA.bits.UBX_NMEA_DTM == 1)) return (true);
1343+
if (nmeaAddressField[3] == 'G')
1344+
{
1345+
if ((nmeaAddressField[4] == 'A') && (nmeaAddressField[5] == 'Q') && (_processNMEA.bits.UBX_NMEA_GAQ == 1)) return (true);
1346+
if ((nmeaAddressField[4] == 'B') && (nmeaAddressField[5] == 'Q') && (_processNMEA.bits.UBX_NMEA_GBQ == 1)) return (true);
1347+
if ((nmeaAddressField[4] == 'B') && (nmeaAddressField[5] == 'S') && (_processNMEA.bits.UBX_NMEA_GBS == 1)) return (true);
1348+
if ((nmeaAddressField[4] == 'G') && (nmeaAddressField[5] == 'A') && (_processNMEA.bits.UBX_NMEA_GGA == 1)) return (true);
1349+
if ((nmeaAddressField[4] == 'L') && (nmeaAddressField[5] == 'L') && (_processNMEA.bits.UBX_NMEA_GLL == 1)) return (true);
1350+
if ((nmeaAddressField[4] == 'L') && (nmeaAddressField[5] == 'Q') && (_processNMEA.bits.UBX_NMEA_GLQ == 1)) return (true);
1351+
if ((nmeaAddressField[4] == 'N') && (nmeaAddressField[5] == 'Q') && (_processNMEA.bits.UBX_NMEA_GNQ == 1)) return (true);
1352+
if ((nmeaAddressField[4] == 'N') && (nmeaAddressField[5] == 'S') && (_processNMEA.bits.UBX_NMEA_GNS == 1)) return (true);
1353+
if ((nmeaAddressField[4] == 'P') && (nmeaAddressField[5] == 'Q') && (_processNMEA.bits.UBX_NMEA_GPQ == 1)) return (true);
1354+
if ((nmeaAddressField[4] == 'Q') && (nmeaAddressField[5] == 'Q') && (_processNMEA.bits.UBX_NMEA_GQQ == 1)) return (true);
1355+
if ((nmeaAddressField[4] == 'R') && (nmeaAddressField[5] == 'S') && (_processNMEA.bits.UBX_NMEA_GRS == 1)) return (true);
1356+
if ((nmeaAddressField[4] == 'S') && (nmeaAddressField[5] == 'A') && (_processNMEA.bits.UBX_NMEA_GSA == 1)) return (true);
1357+
if ((nmeaAddressField[4] == 'S') && (nmeaAddressField[5] == 'T') && (_processNMEA.bits.UBX_NMEA_GST == 1)) return (true);
1358+
if ((nmeaAddressField[4] == 'S') && (nmeaAddressField[5] == 'V') && (_processNMEA.bits.UBX_NMEA_GSV == 1)) return (true);
1359+
}
1360+
if ((nmeaAddressField[3] == 'R') && (nmeaAddressField[4] == 'L') && (nmeaAddressField[5] == 'M') && (_processNMEA.bits.UBX_NMEA_RLM == 1)) return (true);
1361+
if ((nmeaAddressField[3] == 'R') && (nmeaAddressField[4] == 'M') && (nmeaAddressField[5] == 'C') && (_processNMEA.bits.UBX_NMEA_RMC == 1)) return (true);
1362+
if ((nmeaAddressField[3] == 'T') && (nmeaAddressField[4] == 'X') && (nmeaAddressField[5] == 'T') && (_processNMEA.bits.UBX_NMEA_TXT == 1)) return (true);
1363+
if ((nmeaAddressField[3] == 'V') && (nmeaAddressField[4] == 'L') && (nmeaAddressField[5] == 'W') && (_processNMEA.bits.UBX_NMEA_VLW == 1)) return (true);
1364+
if ((nmeaAddressField[3] == 'V') && (nmeaAddressField[4] == 'T') && (nmeaAddressField[5] == 'G') && (_processNMEA.bits.UBX_NMEA_VTG == 1)) return (true);
1365+
if ((nmeaAddressField[3] == 'Z') && (nmeaAddressField[4] == 'D') && (nmeaAddressField[5] == 'A') && (_processNMEA.bits.UBX_NMEA_ZDA == 1)) return (true);
1366+
return (false);
1367+
}
1368+
12581369
//This is the default or generic NMEA processor. We're only going to pipe the data to serial port so we can see it.
12591370
//User could overwrite this function to pipe characters to nmea.process(c) of tinyGPS or MicroNMEA
12601371
//Or user could pipe each character to a buffer, radio, etc.
@@ -9077,12 +9188,27 @@ void SFE_UBLOX_GNSS::logHNRPVT(boolean enabled)
90779188
packetUBXHNRPVT->automaticFlags.flags.bits.addToFileBuffer = (uint8_t)enabled;
90789189
}
90799190

9080-
// ***** Helper Functions for NMEA Logging
9191+
// ***** Helper Functions for NMEA Logging / Processing
9192+
9193+
// Log selected NMEA messages to file buffer - if the messages are enabled and if the file buffer exists
9194+
// User needs to call setFileBufferSize before .begin
9195+
void SFE_UBLOX_GNSS::setNMEALoggingMask(uint32_t messages)
9196+
{
9197+
_logNMEA.all = messages;
9198+
}
9199+
uint32_t SFE_UBLOX_GNSS::getNMEALoggingMask()
9200+
{
9201+
return (_logNMEA.all);
9202+
}
90819203

9082-
//Log NMEA data in file buffer - if it exists! User needs to call setFileBufferSize before .begin
9083-
void SFE_UBLOX_GNSS::logNMEA(boolean enabled)
9204+
// Pass selected NMEA messages to processNMEA
9205+
void SFE_UBLOX_GNSS::setProcessNMEAMask(uint32_t messages)
9206+
{
9207+
_processNMEA.all = messages;
9208+
}
9209+
uint32_t SFE_UBLOX_GNSS::getProcessNMEAMask()
90849210
{
9085-
_logNMEA = enabled;
9211+
return (_processNMEA.all);
90869212
}
90879213

90889214
// ***** CFG RATE Helper Functions

0 commit comments

Comments
 (0)