forked from sparkfun/SparkFun_u-blox_GNSS_Arduino_Library
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathExample28_GetLeapSecondInfo.ino
143 lines (123 loc) · 4.99 KB
/
Example28_GetLeapSecondInfo.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
Getting leap second event info as SNTP Leap Indicator, time to a leap second event and the number of leap seconds since GPS epoch
By: UT2UH
Date: April 14th, 2021
License: MIT. See license file for more information but you can
basically do whatever you want with this code.
This example shows how to query a u-blox module for the leap second event info to cast to SNTP Leap Indicator enumeration.
We also turn off the NMEA output on the I2C port. This decreases the amount of I2C traffic dramatically.
Leave NMEA parsing behind. Now you can simply ask the module for the datums you want!
Feel like supporting open source hardware?
Buy a board from SparkFun!
ZED-F9P RTK2: https://www.sparkfun.com/products/15136
NEO-M8P RTK: https://www.sparkfun.com/products/15005
SAM-M8Q: https://www.sparkfun.com/products/15106
Hardware Connections:
Plug a Qwiic cable into the GNSS and a BlackBoard
If you don't have a platform with a Qwiic connection use the SparkFun Qwiic Breadboard Jumper (https://www.sparkfun.com/products/14425)
Open the serial monitor at 115200 baud to see the output
*/
#include <Wire.h> //Needed for I2C to GNSS
#include <SparkFun_u-blox_GNSS_Arduino_Library.h> //http://librarymanager/All#SparkFun_u-blox_GNSS
SFE_UBLOX_GNSS myGNSS;
typedef enum {
LI_NO_WARNING, //Time leaping not scheduled
LI_LAST_MINUTE_61_SEC, //Last minute has 61 seconds
LI_LAST_MINUTE_59_SEC, //Last minute has 59 seconds
LI_ALARM_CONDITION //The NTP server's clock not synchronized
} ntp_LI_e;
long lastTime = 0; //Simple local timer. Limits amount if I2C traffic to u-blox module.
void setup()
{
Serial.begin(115200);
while (!Serial)
; //Wait for user to open terminal
Serial.println("SparkFun u-blox Example");
Wire.begin();
if (myGNSS.begin() == false) //Connect to the u-blox module using Wire port
{
Serial.println(F("u-blox GNSS not detected at default I2C address. Please check wiring. Freezing."));
while (1)
;
}
// Uncomment the next line if you need to completely reset your module
//myGNSS.factoryDefault(); delay(5000); // Reset everything and wait while the module restarts
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/");
}
void loop()
{
//Query module only every second. Doing it more often will just cause I2C traffic.
//The module only responds when a new position is available
if (millis() - lastTime > 1000)
{
lastTime = millis(); //Update the timer
// getUnixEpoch marks the PVT data as stale so you will get Unix time and PVT time on alternate seconds
uint32_t us; //microseconds returned by getUnixEpoch()
uint32_t epoch = myGNSS.getUnixEpoch();
Serial.print("Unix Epoch rounded: ");
Serial.print(epoch, DEC);
epoch = myGNSS.getUnixEpoch(us);
Serial.print(" Exact Unix Epoch: ");
Serial.print(epoch, DEC);
Serial.print(" micros: ");
Serial.println(us, DEC);
int32_t timeToLeapSecEvent;
ntp_LI_e leapIndicator = (ntp_LI_e)myGNSS.getLeapIndicator(timeToLeapSecEvent);
Serial.print("NTP LI: ");
Serial.print(leapIndicator, DEC);
switch (leapIndicator){
case LI_NO_WARNING:
Serial.print(" - No event scheduled");
break;
case LI_LAST_MINUTE_61_SEC:
Serial.print(" - last minute will end at 23:60");
break;
case LI_LAST_MINUTE_59_SEC:
Serial.print(" - last minute will end at 23:58");
break;
case LI_ALARM_CONDITION:
default:
Serial.print(" - Unknown (clock not synchronized)");
break;
}
Serial.print(". 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(myGNSS.getCurrentLeapSeconds(leapSecSource), DEC);
switch (leapSecSource){
case SFE_UBLOX_LS_SRC_DEFAULT:
Serial.print(" - hardcoded");
break;
case SFE_UBLOX_LS_SRC_GLONASS:
Serial.print(" - derived from GPS and GLONASS time difference");
break;
case SFE_UBLOX_LS_SRC_GPS:
Serial.print(" - according to GPS");
break;
case SFE_UBLOX_LS_SRC_SBAS:
Serial.print(" - according to SBAS");
break;
case SFE_UBLOX_LS_SRC_BEIDOU:
Serial.print(" - according to BeiDou");
break;
case SFE_UBLOX_LS_SRC_GALILEO:
Serial.print(" - according to Galileo");
break;
case SFE_UBLOX_LS_SRC_AIDED:
Serial.print(" - last minute will end at 23:58");
break;
case SFE_UBLOX_LS_SRC_CONFIGURED:
Serial.print(" - as configured)");
break;
case SFE_UBLOX_LS_SRC_UNKNOWN:
default:
Serial.print(" - source unknown");
break;
}
Serial.println();
}
Serial.println();
}