diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 50cf690b8..ea41948d3 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -64,6 +64,7 @@ jobs: additional-libraries: | - name: lvgl version: 7.11.0 + - name: MicroNMEA additional-sketch-paths: | - libraries/PDM - libraries/doom @@ -80,6 +81,7 @@ jobs: - libraries/USBHOST - libraries/USBMSD/examples/AccessFlashAsUSBDisk - libraries/WiFi + - libraries/GSM - board: fqbn: arduino:mbed:nanorp2040connect additional-sketch-paths: | diff --git a/libraries/GSM/examples/GNSSClient/GNSSClient.ino b/libraries/GSM/examples/GNSSClient/GNSSClient.ino index ebf12fac2..e263e42ae 100644 --- a/libraries/GSM/examples/GNSSClient/GNSSClient.ino +++ b/libraries/GSM/examples/GNSSClient/GNSSClient.ino @@ -1,8 +1,6 @@ #include #include -REDIRECT_STDOUT_TO(Serial); - #include "arduino_secrets.h" char pin[] = SECRET_PIN; char apn[] = SECRET_APN; @@ -26,6 +24,8 @@ void setup() { } void loop() { + // Print out raw NMEA strings. + // For parsed output look at the MicroNMEA_integration example. if(GPS.available()){ Serial.print((char) GPS.read()); delay(1); diff --git a/libraries/GSM/examples/MicroNMEA_integration/MicroNMEA_integration.ino b/libraries/GSM/examples/MicroNMEA_integration/MicroNMEA_integration.ino index ef24ebd6c..abded32b2 100644 --- a/libraries/GSM/examples/MicroNMEA_integration/MicroNMEA_integration.ino +++ b/libraries/GSM/examples/MicroNMEA_integration/MicroNMEA_integration.ino @@ -1,92 +1,124 @@ +#include #include #include #include "arduino_secrets.h" -char pin[] = SECRET_PIN; -char apn[] = SECRET_APN; -char username[] = SECRET_USERNAME; -char pass[] = SECRET_PASSWORD; - -void mycallback(char * output); - -void setup() { - Serial.begin(115200); - while (!Serial) {} - //GSM.debug(Serial); - Serial.println("\nStarting connection to server..."); - GSM.begin(pin, apn, username, pass, CATNB); - Serial.println("\nStarting connection ..."); - - Serial.println("\nEnable GNSS Engine..."); - GSM.beginGNSS(mycallback); - GSM.startGNSS(); -} +constexpr auto pin { SECRET_PIN }; +constexpr auto apn { SECRET_APN }; +constexpr auto username { SECRET_USERNAME }; +constexpr auto pass { SECRET_PASSWORD }; char nmeaBuffer[100]; MicroNMEA nmea(nmeaBuffer, sizeof(nmeaBuffer)); -void loop() { - - delay(1000); - - // Output GPS information from previous second - Serial.print("Valid fix: "); - Serial.println(nmea.isValid() ? "yes" : "no"); - - if (nmea.isValid()) { - - Serial.print("Nav. system: "); - if (nmea.getNavSystem()) - Serial.println(nmea.getNavSystem()); - else - Serial.println("none"); - - Serial.print("Num. satellites: "); - Serial.println(nmea.getNumSatellites()); - - Serial.print("HDOP: "); - Serial.println(nmea.getHDOP() / 10., 1); - - Serial.print("Date/time: "); - Serial.print(nmea.getYear()); - Serial.print('-'); - Serial.print(int(nmea.getMonth())); - Serial.print('-'); - Serial.print(int(nmea.getDay())); - Serial.print('T'); - Serial.print(int(nmea.getHour())); - Serial.print(':'); - Serial.print(int(nmea.getMinute())); - Serial.print(':'); - Serial.println(int(nmea.getSecond())); - - long latitude_mdeg = nmea.getLatitude(); - long longitude_mdeg = nmea.getLongitude(); - Serial.print("Latitude (deg): "); - Serial.println(latitude_mdeg / 1000000., 6); - - Serial.print("Longitude (deg): "); - Serial.println(longitude_mdeg / 1000000., 6); - - long alt; - Serial.print("Altitude (m): "); - if (nmea.getAltitude(alt)) - Serial.println(alt / 1000., 3); - else - Serial.println("not available"); - - Serial.print("Speed: "); - Serial.println(nmea.getSpeed() / 1000., 3); - Serial.print("Course: "); - Serial.println(nmea.getCourse() / 1000., 3); - } +// Keep track of NMEA string processing +auto nmeaProcessStatus { false }; + +// Check for valid fix every checkValidInterval ms +constexpr unsigned long checkValidInterval { 5000 }; +unsigned long checkValidNow {}; + +void setup() +{ + Serial.begin(115200); + for (const auto timeout = millis() + 2500; !Serial && millis() < timeout; delay(250)) + ; + + // GSM.debug(Serial); + delay(1000); + + Serial.println("Starting Carrier Network registration"); + if (!GSM.begin(pin, apn, username, pass, CATNB)) { + Serial.println("The board was not able to register to the network..."); + // do nothing forevermore: + while (1) + ; + } + Serial.println("Enable GNSS Engine..."); + // GPS.begin() start and eanble the GNSS engine + GPS.begin(); + Serial.println("GNSS Engine enabled..."); + Serial.println("Waiting for a valid fix."); + + checkValidNow = millis(); } -void mycallback(char * output) +void loop() { - for (size_t i = 0; i < strlen(output); i++) { - nmea.process(output[i]); - } - nmea.process('\0'); - //Serial.println(output); + while (GPS.available()) { + char c = GPS.read(); + // process is true when a valid NMEA string has been processed + nmeaProcessStatus = nmea.process(c); + } + + if (nmeaProcessStatus && millis() > checkValidNow) { + checkValidNow = millis() + checkValidInterval; + + // Output GPS information from previous second + Serial.print("Valid fix: "); + Serial.println(nmea.isValid() ? "yes" : "no"); + + if (!nmea.isValid()) + return; + + String navSystem; + switch (nmea.getNavSystem()) { + case 'N': + navSystem = "GNSS"; + break; + case 'P': + navSystem = "GPS"; + break; + case 'L': + navSystem = "GLONASS"; + break; + case 'A': + navSystem = "Galileo"; + break; + default: + break; + } + Serial.print("Nav. system: "); + Serial.println(navSystem); + + Serial.print("Num. satellites: "); + Serial.println(nmea.getNumSatellites()); + + Serial.print("HDOP: "); + Serial.println(nmea.getHDOP() / 10., 1); + + Serial.print("Date/time: "); + Serial.print(nmea.getYear()); + Serial.print('-'); + Serial.print(int(nmea.getMonth())); + Serial.print('-'); + Serial.print(int(nmea.getDay())); + Serial.print('T'); + Serial.print(int(nmea.getHour())); + Serial.print(':'); + Serial.print(int(nmea.getMinute())); + Serial.print(':'); + Serial.println(int(nmea.getSecond())); + + long latitude_mdeg = nmea.getLatitude(); + long longitude_mdeg = nmea.getLongitude(); + Serial.print("Latitude (deg): "); + Serial.println(latitude_mdeg / 1000000., 6); + + Serial.print("Longitude (deg): "); + Serial.println(longitude_mdeg / 1000000., 6); + + long alt; + Serial.print("Altitude (m): "); + if (nmea.getAltitude(alt)) + Serial.println(alt / 1000., 3); + else + Serial.println("not available"); + + Serial.print("Speed: "); + Serial.println(nmea.getSpeed() / 1000., 3); + Serial.print("Course: "); + Serial.println(nmea.getCourse() / 1000., 3); + nmea.clear(); + } } diff --git a/portenta.variables b/portenta.variables index d94552160..41d068fb3 100644 --- a/portenta.variables +++ b/portenta.variables @@ -1,5 +1,5 @@ export FLAVOUR="portenta" export VARIANTS=("PORTENTA_H7_M7 PORTENTA_H7_M4") export FQBNS=("envie_m7 envie_m4") -export LIBRARIES=("doom Ethernet MRI Portenta_SDRAM SPI WiFi ea_malloc openamp_arduino Portenta_System ThreadDebug Himax_HM01B0 PDM Portenta_Video USBAudio KernelDebug Portenta_Audio RPC USBHID Wire Portenta_lvgl Portenta_Camera rpclib USBHOST mbed-memory-status Portenta_SDCARD Scheduler USBMSD SocketWrapper GSM") +export LIBRARIES=("doom Ethernet MRI Portenta_SDRAM SPI WiFi ea_malloc openamp_arduino Portenta_System ThreadDebug Himax_HM01B0 PDM Portenta_Video USBAudio KernelDebug Portenta_Audio RPC USBHID Wire Portenta_lvgl Portenta_Camera rpclib USBHOST mbed-memory-status Portenta_SDCARD Scheduler USBMSD SocketWrapper GSM GPS") export BOOTLOADERS=("PORTENTA_H7")