diff --git a/examples/GPS_HardwareSerial_Timing/GPS_HardwareSerial_Timing.ino b/examples/GPS_HardwareSerial_Timing/GPS_HardwareSerial_Timing.ino index 41ab240..de57086 100644 --- a/examples/GPS_HardwareSerial_Timing/GPS_HardwareSerial_Timing.ino +++ b/examples/GPS_HardwareSerial_Timing/GPS_HardwareSerial_Timing.ino @@ -34,9 +34,10 @@ Adafruit_GPS GPS(&GPSSerial); #ifdef NMEA_EXTENSIONS // Create another GPS object to hold the state of the boat, with no -// communications, so don't call Boat.begin() in setup. We will build some fake -// sentences from the Boat data to feed to GPS for testing. -Adafruit_GPS Boat(&GPSSerial); +// communications, so you don't need to call Boat.begin() in setup. +// We will build some fake sentences from the Boat data to feed to +// GPS for testing. +Adafruit_GPS Boat; #endif // Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console diff --git a/examples/NMEA_EXTENSIONS/NMEA_EXTENSIONS.ino b/examples/NMEA_EXTENSIONS/NMEA_EXTENSIONS.ino new file mode 100644 index 0000000..047bc11 --- /dev/null +++ b/examples/NMEA_EXTENSIONS/NMEA_EXTENSIONS.ino @@ -0,0 +1,143 @@ +/**************************************************************************/ +/*! + @file NMEA_EXTENSIONS.ino + + @section intro Introduction + + An Arduino sketch for testing the NMEA_EXTENSIONS to the library. Does + not require any GPS hardware. Boat is a data only object we can use to + represent the actual data and build sentences from. GPS is a data only + object that parses the sentences and saves the results, the same way you + would with a communicating GPS object + + Only some of the data values will have added history. Note that history + is stored as integers, scaled and offset from the float values to save + memory. The AWA (Apparent Wind Angle) is recorded as three components, + so that sin and cos parts can be accurately time averaged. onList() allows + testing sentences against a list to see if they should be passed on to + another listener, allowing your sketch to act as an NMEA multiplexer. + + Although it will just barely compile for an UNO with the NMEA_EXTENSIONS, + defining two GPS objects pushes the limits of the UNO data space and + should probably be avoided. + + @section author Author + + Written by Rick Sellens. + + @section license License + + CCBY license +*/ +/**************************************************************************/ +#include "Adafruit_GPS.h" +Adafruit_GPS GPS; // The results obtained from the instruments -- no comms +Adafruit_GPS Boat; // The state of the boat used to create some simulated sentences + +void setup() { + Serial.begin(115200); + while (!Serial && millis() < 10000); // Wait for monitor to be ready. + Serial.print("\n\nNMEA_EXTENSIONS Example v 0.1.1\n\n"); + #ifdef NMEA_EXTENSIONS + addHistory(&GPS); + #else + Serial.print("NMEA_EXTENSIONS not #defined, so there will be no action.\n"); + #endif +} + +char latestBoat[200] = ""; + +const char *senList[] = {"GGA", "GLL", "DBT", "HDM", "MWV", "ZZ"}; // sentence list +const char *passList[] = {"GGA", "DBT", "ZZ"}; // short list + +void loop() { + static unsigned long lastPrint = 0; + updateBoat(); + // stop keeping AWA history after 30 seconds, just as a demonstration + #ifdef NMEA_EXTENSIONS + if(millis() > 30000) GPS.removeHistory(NMEA_AWA); + #endif + if (millis() - lastPrint > 300 || lastPrint == 0) { + lastPrint = millis(); +#ifdef NMEA_EXTENSIONS + Serial.print("\nSentences built from Boat and parsed by GPS "); + Serial.print("(Only a few get passed on to the ST network.):\n\n"); + for (int i = 0;strncmp(senList[i],"ZZ",2);i++){ + if (GPS.parse(Boat.build(latestBoat, "II", senList[i]))){ + if (GPS.onList(latestBoat,passList)) + Serial.print("Pass to ST: "); + else Serial.print(" No Pass: "); + Serial.print(latestBoat); + } else { + Serial.print("Couldn't build and parse a "); + Serial.print(senList[i]); + Serial.print(" sentence, maybe because sprintf() doesn't work with %f."); + } + } + + Serial.print("\nSome of the resulting data stored in GPS:\n\n"); + GPS.showDataValue(NMEA_LAT); + GPS.showDataValue(NMEA_LON); + GPS.showDataValue(NMEA_AWA, 20); // show more history values, if history on + GPS.showDataValue(NMEA_AWA_SIN); + GPS.showDataValue(NMEA_AWA_COS); + GPS.showDataValue(NMEA_AWS); + GPS.showDataValue(NMEA_HDG); + GPS.showDataValue(NMEA_DEPTH); + + Serial.print("\nThe AWA is: "); + Serial.print(GPS.get(NMEA_AWA)); + Serial.print(" while the smoothed value is: "); + Serial.println(GPS.getSmoothed(NMEA_AWA)); + +#endif // NMEA_Extensions + } +} + +void updateBoat() { // Fill up the boat values with + // some test data to use in build() + nmea_float_t t = millis() / 1000.; + nmea_float_t theta = t / 100.; // slow + nmea_float_t gamma = theta * 10; // faster + + // add some data to the old Adafruit_GPS variables + Boat.latitude = 4400 + sin(theta) * 60; + Boat.lat = 'N'; + Boat.longitude = 7600 + cos(theta) * 60; + Boat.lon = 'W'; + Boat.fixquality = 2; + Boat.speed = 3 + sin(gamma); + Boat.hour = abs(cos(theta)) * 24; + Boat.minute = 30 + sin(theta / 2) * 30; + Boat.seconds = 30 + sin(gamma) * 30; + Boat.milliseconds = 500 + sin(gamma) * 500; + Boat.year = 1 + abs(sin(theta)) * 25; + Boat.month = 1 + abs(sin(gamma)) * 11; + Boat.day = 1 + abs(sin(gamma)) * 26; + Boat.satellites = abs(cos(gamma)) * 10; +#ifdef NMEA_EXTENSIONS + // add some data to the new NMEA data values + Boat.newDataValue(NMEA_AWS, 10 + cos(theta)); + Boat.newDataValue(NMEA_AWA, 180 * sin(gamma)); + Boat.newDataValue(NMEA_VTW, Boat.speed + cos(gamma) / 3); + Boat.newDataValue(NMEA_DEPTH, 10 + cos(gamma) * 5); + Boat.newDataValue(NMEA_HDG, 180 * sin(gamma) + 180); + Boat.newDataValue(NMEA_HDT, 180 * cos(gamma) + 180); + Boat.newDataValue(NMEA_VMG, sin(gamma) * 3); + Boat.newDataValue(NMEA_VMGWP, cos(gamma) * 5); +#endif // NMEA_EXTENSIONS +} + +#ifdef NMEA_EXTENSIONS +void addHistory(Adafruit_GPS *nmea) { + // Record integer history for HDOP, scaled by 10.0, offset by 0.0, + // every 15 seconds for the most recent 20 values. + nmea->initHistory(NMEA_HDOP, 10.0, 0.0, 15, 20); + nmea->initHistory(NMEA_COG, 10.0, 0.0, 1); + nmea->initHistory(NMEA_AWA, 10.0, 0.0, 1); + nmea->initHistory(NMEA_HDG, 10.0, 0.0, 3); + // Record pressure every 10 minutes, in Pa relative to 1 bar + nmea->initHistory(NMEA_BAROMETER, 1.0, -100000.0, 600); + nmea->initHistory(NMEA_DEPTH, 10.0, 0.0, 3); +} +#endif // NMEA_EXTENSIONS