From 59d15e014f006e6551a85e1592f127d6b9a5b703 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 4 Mar 2022 13:01:14 +0000 Subject: [PATCH 1/2] Resolve issue #125 . Update Epoch and LS examples. --- .../Example24_GetUnixEpochAndMicros.ino | 36 ++++++------- .../Example28_GetLeapSecondInfo.ino | 52 +++++++++++-------- src/SparkFun_u-blox_GNSS_Arduino_Library.cpp | 52 +++++++++---------- src/SparkFun_u-blox_GNSS_Arduino_Library.h | 22 +++++--- 4 files changed, 90 insertions(+), 72 deletions(-) diff --git a/examples/Example24_GetUnixEpochAndMicros/Example24_GetUnixEpochAndMicros.ino b/examples/Example24_GetUnixEpochAndMicros/Example24_GetUnixEpochAndMicros.ino index 8080f1a..de53a8d 100644 --- a/examples/Example24_GetUnixEpochAndMicros/Example24_GetUnixEpochAndMicros.ino +++ b/examples/Example24_GetUnixEpochAndMicros/Example24_GetUnixEpochAndMicros.ino @@ -54,7 +54,7 @@ void setup() myGNSS.setI2COutput(COM_TYPE_UBX); //Set the I2C port to output UBX only (turn off NMEA noise) //myGNSS.saveConfiguration(); //Optional: Save the current settings to flash and BBR - Serial.println("Compare Unix Epoch given with reference one from https://www.epochconverter.com/"); + Serial.println(F("Compare Unix Epoch given with reference one from https://www.epochconverter.com/")); } @@ -70,48 +70,48 @@ void loop() uint32_t us; //microseconds returned by getUnixEpoch() uint32_t epoch = myGNSS.getUnixEpoch(); - Serial.print("Unix Epoch rounded: "); + Serial.print(F("Unix Epoch rounded: ")); Serial.print(epoch, DEC); epoch = myGNSS.getUnixEpoch(us); - Serial.print(" Exact Unix Epoch: "); + Serial.print(F(" Exact Unix Epoch: ")); Serial.print(epoch, DEC); - Serial.print(" micros: "); + Serial.print(F(" micros: ")); Serial.println(us, DEC); Serial.print(myGNSS.getYear()); - Serial.print("-"); + Serial.print(F("-")); Serial.print(myGNSS.getMonth()); - Serial.print("-"); + Serial.print(F("-")); Serial.print(myGNSS.getDay()); - Serial.print(" "); + Serial.print(F(" ")); Serial.print(myGNSS.getHour()); - Serial.print(":"); + Serial.print(F(":")); Serial.print(myGNSS.getMinute()); - Serial.print(":"); + Serial.print(F(":")); Serial.print(myGNSS.getSecond()); - Serial.print(" Time is "); + Serial.print(F(" Time is ")); if (myGNSS.getTimeFullyResolved() == false) { - Serial.print("not fully resolved but "); + Serial.print(F("not fully resolved but ")); } else { - Serial.print("fully resolved and "); + Serial.print(F("fully resolved and ")); } if (myGNSS.getTimeValid() == false) { - Serial.print("not "); + Serial.print(F("not ")); } - Serial.print("valid "); + Serial.print(F("valid ")); if (myGNSS.getConfirmedTime() == false) { - Serial.print("but not "); + Serial.print(F("but not ")); } else { - Serial.print("and "); + Serial.print(F("and ")); } - Serial.print("confirmed"); + Serial.print(F("confirmed")); byte SIV = myGNSS.getSIV(); Serial.print(F(" SIV: ")); Serial.println(SIV); } -} \ No newline at end of file +} diff --git a/examples/Example28_GetLeapSecondInfo/Example28_GetLeapSecondInfo.ino b/examples/Example28_GetLeapSecondInfo/Example28_GetLeapSecondInfo.ino index a96f27c..e0f1cc9 100644 --- a/examples/Example28_GetLeapSecondInfo/Example28_GetLeapSecondInfo.ino +++ b/examples/Example28_GetLeapSecondInfo/Example28_GetLeapSecondInfo.ino @@ -59,7 +59,7 @@ void setup() myGNSS.setI2COutput(COM_TYPE_UBX); //Set the I2C port to output UBX only (turn off NMEA noise) myGNSS.saveConfiguration(); //Optional: Save the current settings to flash and BBR - Serial.println("Compare Unix Epoch given with reference one from https://www.epochconverter.com/"); + Serial.println(F("Compare Unix Epoch given with reference one from https://www.epochconverter.com/")); } @@ -75,69 +75,77 @@ void loop() uint32_t us; //microseconds returned by getUnixEpoch() uint32_t epoch = myGNSS.getUnixEpoch(); - Serial.print("Unix Epoch rounded: "); + Serial.print(F("Unix Epoch rounded: ")); Serial.print(epoch, DEC); epoch = myGNSS.getUnixEpoch(us); - Serial.print(" Exact Unix Epoch: "); + Serial.print(F(" Exact Unix Epoch: ")); Serial.print(epoch, DEC); - Serial.print(" micros: "); + Serial.print(F(" micros: ")); Serial.println(us, DEC); int32_t timeToLeapSecEvent; ntp_LI_e leapIndicator = (ntp_LI_e)myGNSS.getLeapIndicator(timeToLeapSecEvent); - Serial.print("NTP LI: "); + Serial.print(F("NTP LI: ")); Serial.print(leapIndicator, DEC); switch (leapIndicator){ case LI_NO_WARNING: - Serial.print(" - No event scheduled"); + Serial.print(F(" - No event scheduled")); break; case LI_LAST_MINUTE_61_SEC: - Serial.print(" - last minute will end at 23:60"); + Serial.print(F(" - last minute will end at 23:60")); break; case LI_LAST_MINUTE_59_SEC: - Serial.print(" - last minute will end at 23:58"); + Serial.print(F(" - last minute will end at 23:58")); break; case LI_ALARM_CONDITION: default: - Serial.print(" - Unknown (clock not synchronized)"); + Serial.print(F(" - Unknown (clock not synchronized)")); break; } - Serial.print(". Time to the next leap second event: "); - Serial.println(timeToLeapSecEvent, DEC); + if (timeToLeapSecEvent < 0) + { + Serial.print(F(". Time since the last leap second event: ")); + Serial.println(timeToLeapSecEvent * -1, DEC); + } + else + { + Serial.print(F(". Time to the next leap second event: ")); + Serial.println(timeToLeapSecEvent, DEC); + } sfe_ublox_ls_src_e leapSecSource; - Serial.print("Leap seconds since GPS Epoch (Jan 6th, 1980): "); + Serial.print(F("Leap seconds since GPS Epoch (Jan 6th, 1980): ")); Serial.print(myGNSS.getCurrentLeapSeconds(leapSecSource), DEC); switch (leapSecSource){ case SFE_UBLOX_LS_SRC_DEFAULT: - Serial.print(" - hardcoded"); + Serial.print(F(" - hardcoded")); break; case SFE_UBLOX_LS_SRC_GLONASS: - Serial.print(" - derived from GPS and GLONASS time difference"); + Serial.print(F(" - derived from GPS and GLONASS time difference")); break; case SFE_UBLOX_LS_SRC_GPS: - Serial.print(" - according to GPS"); + Serial.print(F(" - according to GPS")); break; case SFE_UBLOX_LS_SRC_SBAS: - Serial.print(" - according to SBAS"); + Serial.print(F(" - according to SBAS")); break; case SFE_UBLOX_LS_SRC_BEIDOU: - Serial.print(" - according to BeiDou"); + Serial.print(F(" - according to BeiDou")); break; case SFE_UBLOX_LS_SRC_GALILEO: - Serial.print(" - according to Galileo"); + Serial.print(F(" - according to Galileo")); break; case SFE_UBLOX_LS_SRC_AIDED: - Serial.print(" - last minute will end at 23:58"); + Serial.print(F(" - last minute will end at 23:58")); break; case SFE_UBLOX_LS_SRC_CONFIGURED: - Serial.print(" - as configured)"); + Serial.print(F(" - as configured)")); break; case SFE_UBLOX_LS_SRC_UNKNOWN: default: - Serial.print(" - source unknown"); + Serial.print(F(" - source unknown")); break; } Serial.println(); } Serial.println(); -} \ No newline at end of file +} diff --git a/src/SparkFun_u-blox_GNSS_Arduino_Library.cpp b/src/SparkFun_u-blox_GNSS_Arduino_Library.cpp index 2254708..fb13a48 100644 --- a/src/SparkFun_u-blox_GNSS_Arduino_Library.cpp +++ b/src/SparkFun_u-blox_GNSS_Arduino_Library.cpp @@ -16102,7 +16102,7 @@ int32_t SFE_UBLOX_GNSS::getNanosecond(uint16_t maxWait) return (packetUBXNAVPVT->data.nano); } -// Get the current Unix epoch time rounded up to the nearest second +// Get the current Unix epoch time rounded to the nearest second uint32_t SFE_UBLOX_GNSS::getUnixEpoch(uint16_t maxWait) { if (packetUBXNAVPVT == NULL) @@ -16119,16 +16119,16 @@ uint32_t SFE_UBLOX_GNSS::getUnixEpoch(uint16_t maxWait) packetUBXNAVPVT->moduleQueried.moduleQueried1.bits.min = false; packetUBXNAVPVT->moduleQueried.moduleQueried1.bits.sec = false; packetUBXNAVPVT->moduleQueried.moduleQueried1.bits.all = false; - // assemble time elements into time_t - credits to Thomas Roell @ https://github.com/GrumpyOldPizza - uint32_t t = ((((((((uint32_t)packetUBXNAVPVT->data.year - 1970) * 365) + ((((uint32_t)packetUBXNAVPVT->data.year - 1970) + 3) / 4)) + - DAYS_SINCE_MONTH[((uint32_t)packetUBXNAVPVT->data.year - 1970) & 3][(uint32_t)packetUBXNAVPVT->data.month] + - ((uint32_t)packetUBXNAVPVT->data.day - 1)) * - 24 + - (uint32_t)packetUBXNAVPVT->data.hour) * - 60 + - (uint32_t)packetUBXNAVPVT->data.min) * - 60 + - (uint32_t)packetUBXNAVPVT->data.sec); + uint32_t t = SFE_UBLOX_DAYS_FROM_1970_TO_2020; // Jan 1st 2020 as days from Jan 1st 1970 + t += (uint32_t)SFE_UBLOX_DAYS_SINCE_2020[packetUBXNAVPVT->data.year - 2020]; // Add on the number of days since 2020 + t += (uint32_t)SFE_UBLOX_DAYS_SINCE_MONTH[packetUBXNAVPVT->data.year % 4 == 0 ? 0 : 1][packetUBXNAVPVT->data.month - 1]; // Add on the number of days since Jan 1st + t += (uint32_t)packetUBXNAVPVT->data.day - 1; // Add on the number of days since the 1st of the month + t *= 24; // Convert to hours + t += (uint32_t)packetUBXNAVPVT->data.hour; // Add on the hour + t *= 60; // Convert to minutes + t += (uint32_t)packetUBXNAVPVT->data.min; // Add on the minute + t *= 60; // Convert to seconds + t += (uint32_t)packetUBXNAVPVT->data.sec; // Add on the second return t; } @@ -16150,23 +16150,23 @@ uint32_t SFE_UBLOX_GNSS::getUnixEpoch(uint32_t µsecond, uint16_t maxWait) packetUBXNAVPVT->moduleQueried.moduleQueried1.bits.sec = false; packetUBXNAVPVT->moduleQueried.moduleQueried1.bits.nano = false; packetUBXNAVPVT->moduleQueried.moduleQueried1.bits.all = false; - // assemble time elements into time_t - credits to Thomas Roell @ https://github.com/GrumpyOldPizza - uint32_t t = ((((((((uint32_t)packetUBXNAVPVT->data.year - 1970) * 365) + ((((uint32_t)packetUBXNAVPVT->data.year - 1970) + 3) / 4)) + - DAYS_SINCE_MONTH[((uint32_t)packetUBXNAVPVT->data.year - 1970) & 3][(uint32_t)packetUBXNAVPVT->data.month] + - ((uint32_t)packetUBXNAVPVT->data.day - 1)) * - 24 + - (uint32_t)packetUBXNAVPVT->data.hour) * - 60 + - (uint32_t)packetUBXNAVPVT->data.min) * - 60 + - (uint32_t)packetUBXNAVPVT->data.sec); - int32_t us = packetUBXNAVPVT->data.nano / 1000; - microsecond = (uint32_t)us; - // adjust t if nano is negative + uint32_t t = SFE_UBLOX_DAYS_FROM_1970_TO_2020; // Jan 1st 2020 as days from Jan 1st 1970 + t += (uint32_t)SFE_UBLOX_DAYS_SINCE_2020[packetUBXNAVPVT->data.year - 2020]; // Add on the number of days since 2020 + t += (uint32_t)SFE_UBLOX_DAYS_SINCE_MONTH[packetUBXNAVPVT->data.year % 4 == 0 ? 0 : 1][packetUBXNAVPVT->data.month - 1]; // Add on the number of days since Jan 1st + t += (uint32_t)packetUBXNAVPVT->data.day - 1; // Add on the number of days since the 1st of the month + t *= 24; // Convert to hours + t += (uint32_t)packetUBXNAVPVT->data.hour; // Add on the hour + t *= 60; // Convert to minutes + t += (uint32_t)packetUBXNAVPVT->data.min; // Add on the minute + t *= 60; // Convert to seconds + t += (uint32_t)packetUBXNAVPVT->data.sec; // Add on the second + int32_t us = packetUBXNAVPVT->data.nano / 1000; // Convert nanos to micros + microsecond = (uint32_t)us; // Could be -ve! + // Adjust t if nano is negative if (us < 0) { - microsecond = (uint32_t)(us + 1000000); - t--; + microsecond = (uint32_t)(us + 1000000); // Make nano +ve + t--; // Decrement t by 1 second } return t; } diff --git a/src/SparkFun_u-blox_GNSS_Arduino_Library.h b/src/SparkFun_u-blox_GNSS_Arduino_Library.h index 414d8de..e81d7d0 100644 --- a/src/SparkFun_u-blox_GNSS_Arduino_Library.h +++ b/src/SparkFun_u-blox_GNSS_Arduino_Library.h @@ -622,12 +622,22 @@ typedef struct bool moduleQueried; } moduleSWVersion_t; -const uint16_t DAYS_SINCE_MONTH[4][16] = - { - {0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 335, 335, 335}, - {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 334, 334, 334}, - {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 334, 334, 334}, - {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 334, 334, 334}, +const uint32_t SFE_UBLOX_DAYS_FROM_1970_TO_2020 = 18262; // Jan 1st 2020 Epoch = 1577836800 seconds +const uint16_t SFE_UBLOX_DAYS_SINCE_2020[80] = +{ + 0, 366, 731, 1096, 1461, 1827, 2192, 2557, 2922, 3288, + 3653, 4018, 4383, 4749, 5114, 5479, 5844, 6210, 6575, 6940, + 7305, 7671, 8036, 8401, 8766, 9132, 9497, 9862, 10227, 10593, + 10958, 11323, 11688, 12054, 12419, 12784, 13149, 13515, 13880, 14245, + 14610, 14976, 15341, 15706, 16071, 16437, 16802, 17167, 17532, 17898, + 18263, 18628, 18993, 19359, 19724, 20089, 20454, 20820, 21185, 21550, + 21915, 22281, 22646, 23011, 23376, 23742, 24107, 24472, 24837, 25203, + 25568, 25933, 26298, 26664, 27029, 27394, 27759, 28125, 28490, 28855 +}; +const uint16_t SFE_UBLOX_DAYS_SINCE_MONTH[2][12] = +{ + {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}, // Leap Year (Year % 4 == 0) + {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334} // Normal Year }; class SFE_UBLOX_GNSS From cf47a928959c62f4d988073901084c962437e81a Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 7 Mar 2022 08:32:09 +0000 Subject: [PATCH 2/2] v2.2.5 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index 3aa8aaa..c8350b1 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=SparkFun u-blox GNSS Arduino Library -version=2.2.4 +version=2.2.5 author=SparkFun Electronics maintainer=SparkFun Electronics sentence=Library for I2C, Serial and SPI Communication with u-blox GNSS modules