MRTKLIB 0.7.14
Modernized GNSS Positioning Library
Loading...
Searching...
No Matches
mrtk_time.c
Go to the documentation of this file.
1/*------------------------------------------------------------------------------
2 * mrtk_time.c : time and date functions
3 *
4 * Copyright (C) 2026 H.SHIONO (MRTKLIB Project)
5 * Copyright (C) 2023-2025 Cabinet Office, Japan
6 * Copyright (C) 2024-2025 Lighthouse Technology & Consulting Co. Ltd.
7 * Copyright (C) 2023-2025 Japan Aerospace Exploration Agency
8 * Copyright (C) 2023-2025 TOSHIBA ELECTRONIC TECHNOLOGIES CORPORATION
9 * Copyright (C) 2015- Mitsubishi Electric Corp.
10 * Copyright (C) 2014 Geospatial Information Authority of Japan
11 * Copyright (C) 2014 T.SUZUKI
12 * Copyright (C) 2007-2023 T.TAKASU
13 *
14 * SPDX-License-Identifier: BSD-2-Clause
15 *----------------------------------------------------------------------------*/
16/**
17 * @file mrtk_time.c
18 * @brief MRTKLIB Time Module — Implementation.
19 *
20 * All functions and static data in this file are cut-and-paste extractions
21 * from the legacy rtkcmn.c with zero algorithmic changes.
22 */
23
24#include "mrtklib/mrtk_time.h"
25
26#include <math.h>
27#include <stdio.h>
28#include <string.h>
29#include <sys/time.h>
30
31/*============================================================================
32 * Private Constants
33 *===========================================================================*/
34
35#ifndef PI
36#define PI 3.1415926535897932 /* pi */
37#endif
38
39#define MAXLEAPS 64 /* max number of leap seconds table */
40
41/** @brief GPS time reference epoch */
42static const double gpst0[] = {1980, 1, 6, 0, 0, 0};
43/** @brief Galileo system time reference epoch */
44static const double gst0[] = {1999, 8, 22, 0, 0, 0};
45/** @brief BeiDou time reference epoch */
46static const double bdt0[] = {2006, 1, 1, 0, 0, 0};
47
48/** @brief Leap seconds table (y,m,d,h,m,s,utc-gpst) */
49static double leaps[MAXLEAPS + 1][7] = {{2017, 1, 1, 0, 0, 0, -18},
50 {2015, 7, 1, 0, 0, 0, -17},
51 {2012, 7, 1, 0, 0, 0, -16},
52 {2009, 1, 1, 0, 0, 0, -15},
53 {2006, 1, 1, 0, 0, 0, -14},
54 {1999, 1, 1, 0, 0, 0, -13},
55 {1997, 7, 1, 0, 0, 0, -12},
56 {1996, 1, 1, 0, 0, 0, -11},
57 {1994, 7, 1, 0, 0, 0, -10},
58 {1993, 7, 1, 0, 0, 0, -9},
59 {1992, 7, 1, 0, 0, 0, -8},
60 {1991, 1, 1, 0, 0, 0, -7},
61 {1990, 1, 1, 0, 0, 0, -6},
62 {1988, 1, 1, 0, 0, 0, -5},
63 {1985, 7, 1, 0, 0, 0, -4},
64 {1983, 7, 1, 0, 0, 0, -3},
65 {1982, 7, 1, 0, 0, 0, -2},
66 {1981, 7, 1, 0, 0, 0, -1},
67 {0}};
68
69/*============================================================================
70 * Private Variables
71 *===========================================================================*/
72
73/** @brief Time offset (s) for timeget/timeset */
74static double timeoffset_ = 0.0;
75
76/*============================================================================
77 * Calendar / Epoch Conversions
78 *===========================================================================*/
79
80/* string to time --------------------------------------------------------------
81 * convert substring in string to gtime_t struct
82 * args : char *s I string ("... yyyy mm dd hh mm ss ...")
83 * int i,n I substring position and width
84 * gtime_t *t O gtime_t struct
85 * return : status (0:ok,0>:error)
86 *-----------------------------------------------------------------------------*/
87extern int str2time(const char* s, int i, int n, gtime_t* t) {
88 double ep[6];
89 char str[256], *p = str;
90
91 if (i < 0 || (int)strlen(s) < i || (int)sizeof(str) - 1 < i) {
92 return -1;
93 }
94 for (s += i; *s && --n >= 0;) {
95 *p++ = *s++;
96 }
97 *p = '\0';
98 if (sscanf(str, "%lf %lf %lf %lf %lf %lf", ep, ep + 1, ep + 2, ep + 3, ep + 4, ep + 5) < 6) {
99 return -1;
100 }
101 if (ep[0] < 100.0) {
102 ep[0] += ep[0] < 80.0 ? 2000.0 : 1900.0;
103 }
104 *t = epoch2time(ep);
105 return 0;
106}
107/* convert calendar day/time to time -------------------------------------------
108 * convert calendar day/time to gtime_t struct
109 * args : double *ep I day/time {year,month,day,hour,min,sec}
110 * return : gtime_t struct
111 * notes : proper in 1970-2037 or 1970-2099 (64bit time_t)
112 *-----------------------------------------------------------------------------*/
113extern gtime_t epoch2time(const double* ep) {
114 const int doy[] = {1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
115 gtime_t time = {0};
116 int days, sec, year = (int)ep[0], mon = (int)ep[1], day = (int)ep[2];
117
118 if (year < 1970 || 2099 < year || mon < 1 || 12 < mon) {
119 return time;
120 }
121
122 /* leap year if year%4==0 in 1901-2099 */
123 days = (year - 1970) * 365 + (year - 1969) / 4 + doy[mon - 1] + day - 2 + (year % 4 == 0 && mon >= 3 ? 1 : 0);
124 sec = (int)floor(ep[5]);
125 time.time = (time_t)days * 86400 + (int)ep[3] * 3600 + (int)ep[4] * 60 + sec;
126 time.sec = ep[5] - sec;
127 return time;
128}
129/* time to calendar day/time ---------------------------------------------------
130 * convert gtime_t struct to calendar day/time
131 * args : gtime_t t I gtime_t struct
132 * double *ep O day/time {year,month,day,hour,min,sec}
133 * return : none
134 * notes : proper in 1970-2037 or 1970-2099 (64bit time_t)
135 *-----------------------------------------------------------------------------*/
136extern void time2epoch(gtime_t t, double* ep) {
137 const int mday[] = {/* # of days in a month */
138 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
139 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
140 int days, sec, mon, day;
141
142 /* leap year if year%4==0 in 1901-2099 */
143 days = (int)(t.time / 86400);
144 sec = (int)(t.time - (time_t)days * 86400);
145 for (day = days % 1461, mon = 0; mon < 48; mon++) {
146 if (day >= mday[mon]) {
147 day -= mday[mon];
148 } else {
149 break;
150 }
151 }
152 ep[0] = 1970 + days / 1461 * 4 + mon / 12;
153 ep[1] = mon % 12 + 1;
154 ep[2] = day + 1;
155 ep[3] = sec / 3600;
156 ep[4] = sec % 3600 / 60;
157 ep[5] = sec % 60 + t.sec;
158}
159/* gps time to time ------------------------------------------------------------
160 * convert week and tow in gps time to gtime_t struct
161 * args : int week I week number in gps time
162 * double sec I time of week in gps time (s)
163 * return : gtime_t struct
164 *-----------------------------------------------------------------------------*/
165extern gtime_t gpst2time(int week, double sec) {
167
168 if (sec < -1E9 || 1E9 < sec) {
169 sec = 0.0;
170 }
171 t.time += (time_t)86400 * 7 * week + (int)sec;
172 t.sec = sec - (int)sec;
173 return t;
174}
175/* time to gps time ------------------------------------------------------------
176 * convert gtime_t struct to week and tow in gps time
177 * args : gtime_t t I gtime_t struct
178 * int *week IO week number in gps time (NULL: no output)
179 * return : time of week in gps time (s)
180 *-----------------------------------------------------------------------------*/
181extern double time2gpst(gtime_t t, int* week) {
183 time_t sec = t.time - t0.time;
184 int w = (int)(sec / (86400 * 7));
185
186 if (week) {
187 *week = w;
188 }
189 return (double)(sec - (double)w * 86400 * 7) + t.sec;
190}
191/* galileo system time to time -------------------------------------------------
192 * convert week and tow in galileo system time (gst) to gtime_t struct
193 * args : int week I week number in gst
194 * double sec I time of week in gst (s)
195 * return : gtime_t struct
196 *-----------------------------------------------------------------------------*/
197extern gtime_t gst2time(int week, double sec) {
199
200 if (sec < -1E9 || 1E9 < sec) {
201 sec = 0.0;
202 }
203 t.time += (time_t)86400 * 7 * week + (int)sec;
204 t.sec = sec - (int)sec;
205 return t;
206}
207/* time to galileo system time -------------------------------------------------
208 * convert gtime_t struct to week and tow in galileo system time (gst)
209 * args : gtime_t t I gtime_t struct
210 * int *week IO week number in gst (NULL: no output)
211 * return : time of week in gst (s)
212 *-----------------------------------------------------------------------------*/
213extern double time2gst(gtime_t t, int* week) {
214 gtime_t t0 = epoch2time(gst0);
215 time_t sec = t.time - t0.time;
216 int w = (int)(sec / (86400 * 7));
217
218 if (week) {
219 *week = w;
220 }
221 return (double)(sec - (double)w * 86400 * 7) + t.sec;
222}
223/* beidou time (bdt) to time ---------------------------------------------------
224 * convert week and tow in beidou time (bdt) to gtime_t struct
225 * args : int week I week number in bdt
226 * double sec I time of week in bdt (s)
227 * return : gtime_t struct
228 *-----------------------------------------------------------------------------*/
229extern gtime_t bdt2time(int week, double sec) {
231
232 if (sec < -1E9 || 1E9 < sec) {
233 sec = 0.0;
234 }
235 t.time += (time_t)86400 * 7 * week + (int)sec;
236 t.sec = sec - (int)sec;
237 return t;
238}
239/* time to beidouo time (bdt) --------------------------------------------------
240 * convert gtime_t struct to week and tow in beidou time (bdt)
241 * args : gtime_t t I gtime_t struct
242 * int *week IO week number in bdt (NULL: no output)
243 * return : time of week in bdt (s)
244 *-----------------------------------------------------------------------------*/
245extern double time2bdt(gtime_t t, int* week) {
246 gtime_t t0 = epoch2time(bdt0);
247 time_t sec = t.time - t0.time;
248 int w = (int)(sec / (86400 * 7));
249
250 if (week) {
251 *week = w;
252 }
253 return (double)(sec - (double)w * 86400 * 7) + t.sec;
254}
255/*============================================================================
256 * Time Arithmetic
257 *===========================================================================*/
258
259/* add time --------------------------------------------------------------------
260 * add time to gtime_t struct
261 * args : gtime_t t I gtime_t struct
262 * double sec I time to add (s)
263 * return : gtime_t struct (t+sec)
264 *-----------------------------------------------------------------------------*/
265extern gtime_t timeadd(gtime_t t, double sec) {
266 double tt;
267
268 t.sec += sec;
269 tt = floor(t.sec);
270 t.time += (int)tt;
271 t.sec -= tt;
272 return t;
273}
274/* time difference -------------------------------------------------------------
275 * difference between gtime_t structs
276 * args : gtime_t t1,t2 I gtime_t structs
277 * return : time difference (t1-t2) (s)
278 *-----------------------------------------------------------------------------*/
279extern double timediff(gtime_t t1, gtime_t t2) { return difftime(t1.time, t2.time) + t1.sec - t2.sec; }
280/*============================================================================
281 * System Clock and Utilities
282 *===========================================================================*/
283
284/* get current time in utc -----------------------------------------------------
285 * get current time in utc
286 * args : none
287 * return : current time in utc
288 *-----------------------------------------------------------------------------*/
289extern gtime_t timeget(void) {
290 gtime_t time;
291 double ep[6] = {0};
292 struct timeval tv;
293 struct tm* tt;
294
295 if (!gettimeofday(&tv, NULL) && (tt = gmtime(&tv.tv_sec))) {
296 ep[0] = tt->tm_year + 1900;
297 ep[1] = tt->tm_mon + 1;
298 ep[2] = tt->tm_mday;
299 ep[3] = tt->tm_hour;
300 ep[4] = tt->tm_min;
301 ep[5] = tt->tm_sec + tv.tv_usec * 1E-6;
302 }
303 time = epoch2time(ep);
304
305#ifdef CPUTIME_IN_GPST /* cputime operated in gpst */
306 time = gpst2utc(time);
307#endif
308 return timeadd(time, timeoffset_);
309}
310/* set current time in utc -----------------------------------------------------
311 * set current time in utc
312 * args : gtime_t I current time in utc
313 * return : none
314 * notes : just set time offset between cpu time and current time
315 * the time offset is reflected to only timeget()
316 * not reentrant
317 *-----------------------------------------------------------------------------*/
318extern void timeset(gtime_t t) { timeoffset_ += timediff(t, timeget()); }
319/* reset current time ----------------------------------------------------------
320 * reset current time
321 * args : none
322 * return : none
323 *-----------------------------------------------------------------------------*/
324extern void timereset(void) { timeoffset_ = 0.0; }
325/*============================================================================
326 * Leap-Second-Aware Conversions
327 *===========================================================================*/
328
329/* read leap seconds table by text -------------------------------------------*/
330static int read_leaps_text(FILE* fp) {
331 char buff[256], *p;
332 int i, n = 0, ep[6], ls;
333
334 rewind(fp);
335
336 while (fgets(buff, sizeof(buff), fp) && n < MAXLEAPS) {
337 if ((p = strchr(buff, '#'))) {
338 *p = '\0';
339 }
340 if (sscanf(buff, "%d %d %d %d %d %d %d", ep, ep + 1, ep + 2, ep + 3, ep + 4, ep + 5, &ls) < 7) {
341 continue;
342 }
343 for (i = 0; i < 6; i++) {
344 leaps[n][i] = ep[i];
345 }
346 leaps[n++][6] = ls;
347 }
348 return n;
349}
350/* read leap seconds table by usno -------------------------------------------*/
351static int read_leaps_usno(FILE* fp) {
352 static const char* months[] = {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
353 double jd, tai_utc;
354 char buff[256], month[32], ls[MAXLEAPS][7] = {{0}};
355 int i, j, y, m, d, n = 0;
356
357 rewind(fp);
358
359 while (fgets(buff, sizeof(buff), fp) && n < MAXLEAPS) {
360 if (sscanf(buff, "%d %s %d =JD %lf TAI-UTC= %lf", &y, month, &d, &jd, &tai_utc) < 5) {
361 continue;
362 }
363 if (y < 1980) {
364 continue;
365 }
366 for (m = 1; m <= 12; m++) {
367 if (!strcmp(months[m - 1], month)) {
368 break;
369 }
370 }
371 if (m >= 13) {
372 continue;
373 }
374 ls[n][0] = y;
375 ls[n][1] = m;
376 ls[n][2] = d;
377 ls[n++][6] = (char)(19.0 - tai_utc);
378 }
379 for (i = 0; i < n; i++) {
380 for (j = 0; j < 7; j++) {
381 leaps[i][j] = ls[n - i - 1][j];
382 }
383 }
384 return n;
385}
386/* read leap seconds table -----------------------------------------------------
387 * read leap seconds table
388 * args : char *file I leap seconds table file
389 * return : status (1:ok,0:error)
390 * notes : The leap second table should be as follows or leapsec.dat provided
391 * by USNO.
392 * (1) The records in the table file cosist of the following fields:
393 * year month day hour min sec UTC-GPST(s)
394 * (2) The date and time indicate the start UTC time for the UTC-GPST
395 * (3) The date and time should be descending order.
396 *-----------------------------------------------------------------------------*/
397extern int read_leaps(const char* file) {
398 FILE* fp;
399 int i, n;
400
401 if (!(fp = fopen(file, "r"))) {
402 return 0;
403 }
404
405 /* read leap seconds table by text or usno */
406 if (!(n = read_leaps_text(fp)) && !(n = read_leaps_usno(fp))) {
407 fclose(fp);
408 return 0;
409 }
410 for (i = 0; i < 7; i++) {
411 leaps[n][i] = 0.0;
412 }
413 fclose(fp);
414 return 1;
415}
416/* gpstime to utc --------------------------------------------------------------
417 * convert gpstime to utc considering leap seconds
418 * args : gtime_t t I time expressed in gpstime
419 * return : time expressed in utc
420 * notes : ignore slight time offset under 100 ns
421 *-----------------------------------------------------------------------------*/
423 gtime_t tu;
424 int i;
425
426 for (i = 0; leaps[i][0] > 0; i++) {
427 tu = timeadd(t, leaps[i][6]);
428 if (timediff(tu, epoch2time(leaps[i])) >= 0.0) {
429 return tu;
430 }
431 }
432 return t;
433}
434/* utc to gpstime --------------------------------------------------------------
435 * convert utc to gpstime considering leap seconds
436 * args : gtime_t t I time expressed in utc
437 * return : time expressed in gpstime
438 * notes : ignore slight time offset under 100 ns
439 *-----------------------------------------------------------------------------*/
441 int i;
442
443 for (i = 0; leaps[i][0] > 0; i++) {
444 if (timediff(t, epoch2time(leaps[i])) >= 0.0) {
445 return timeadd(t, -leaps[i][6]);
446 }
447 }
448 return t;
449}
450/* gpstime to bdt --------------------------------------------------------------
451 * convert gpstime to bdt (beidou navigation satellite system time)
452 * args : gtime_t t I time expressed in gpstime
453 * return : time expressed in bdt
454 * notes : ref [8] 3.3, 2006/1/1 00:00 BDT = 2006/1/1 00:00 UTC
455 * no leap seconds in BDT
456 * ignore slight time offset under 100 ns
457 *-----------------------------------------------------------------------------*/
458extern gtime_t gpst2bdt(gtime_t t) { return timeadd(t, -14.0); }
459/* bdt to gpstime --------------------------------------------------------------
460 * convert bdt (beidou navigation satellite system time) to gpstime
461 * args : gtime_t t I time expressed in bdt
462 * return : time expressed in gpstime
463 * notes : see gpst2bdt()
464 *-----------------------------------------------------------------------------*/
465extern gtime_t bdt2gpst(gtime_t t) { return timeadd(t, 14.0); }
466/*============================================================================
467 * Derived Time Quantities
468 *===========================================================================*/
469
470/* time to day and sec -------------------------------------------------------*/
471static double time2sec(gtime_t time, gtime_t* day) {
472 double ep[6], sec;
473 time2epoch(time, ep);
474 sec = ep[3] * 3600.0 + ep[4] * 60.0 + ep[5];
475 ep[3] = ep[4] = ep[5] = 0.0;
476 *day = epoch2time(ep);
477 return sec;
478}
479/* utc to gmst -----------------------------------------------------------------
480 * convert utc to gmst (Greenwich mean sidereal time)
481 * args : gtime_t t I time expressed in utc
482 * double ut1_utc I UT1-UTC (s)
483 * return : gmst (rad)
484 *-----------------------------------------------------------------------------*/
485extern double utc2gmst(gtime_t t, double ut1_utc) {
486 const double ep2000[] = {2000, 1, 1, 12, 0, 0};
487 gtime_t tut, tut0;
488 double ut, t1, t2, t3, gmst0, gmst;
489
490 tut = timeadd(t, ut1_utc);
491 ut = time2sec(tut, &tut0);
492 t1 = timediff(tut0, epoch2time(ep2000)) / 86400.0 / 36525.0;
493 t2 = t1 * t1;
494 t3 = t2 * t1;
495 gmst0 = 24110.54841 + 8640184.812866 * t1 + 0.093104 * t2 - 6.2E-6 * t3;
496 gmst = gmst0 + 1.002737909350795 * ut;
497
498 return fmod(gmst, 86400.0) * PI / 43200.0; /* 0 <= gmst <= 2*PI */
499}
500/* time to string --------------------------------------------------------------
501 * convert gtime_t struct to string
502 * args : gtime_t t I gtime_t struct
503 * char *s O string ("yyyy/mm/dd hh:mm:ss.ssss")
504 * int n I number of decimals
505 * return : none
506 *-----------------------------------------------------------------------------*/
507extern void time2str(gtime_t t, char* s, int n) {
508 double ep[6];
509
510 if (n < 0) {
511 n = 0;
512 } else if (n > 12) {
513 n = 12;
514 }
515 if (1.0 - t.sec < 0.5 / pow(10.0, n)) {
516 t.time++;
517 t.sec = 0.0;
518 }
519 time2epoch(t, ep);
520 sprintf(s, "%04.0f/%02.0f/%02.0f %02.0f:%02.0f:%0*.*f", ep[0], ep[1], ep[2], ep[3], ep[4], n <= 0 ? 2 : n + 3,
521 n <= 0 ? 0 : n, ep[5]);
522}
523/* get time string -------------------------------------------------------------
524 * get time string
525 * args : gtime_t t I gtime_t struct
526 * int n I number of decimals
527 * return : time string
528 * notes : not reentrant, do not use multiple in a function
529 *-----------------------------------------------------------------------------*/
530extern char* time_str(gtime_t t, int n) {
531 static char buff[64];
532 time2str(t, buff, n);
533 return buff;
534}
535/* time to day of year ---------------------------------------------------------
536 * convert time to day of year
537 * args : gtime_t t I gtime_t struct
538 * return : day of year (days)
539 *-----------------------------------------------------------------------------*/
540extern double time2doy(gtime_t t) {
541 double ep[6];
542
543 time2epoch(t, ep);
544 ep[1] = ep[2] = 1.0;
545 ep[3] = ep[4] = ep[5] = 0.0;
546 return timediff(t, epoch2time(ep)) / 86400.0 + 1.0;
547}
548/* adjust gps week number ------------------------------------------------------
549 * adjust gps week number using cpu time
550 * args : int week I not-adjusted gps week number (0-1023)
551 * return : adjusted gps week number
552 *-----------------------------------------------------------------------------*/
553extern int adjgpsweek(int week) {
554 int w;
555 (void)time2gpst(utc2gpst(timeget()), &w);
556 if (w < 1560) {
557 w = 1560; /* use 2009/12/1 if time is earlier than 2009/12/1 */
558 }
559 return week + (w - week + 1) / 1024 * 1024;
560}
561/* get tick time ---------------------------------------------------------------
562 * get current tick in ms
563 * args : none
564 * return : current tick in ms
565 *-----------------------------------------------------------------------------*/
566extern uint32_t tickget(void) {
567 struct timespec tp = {0};
568 struct timeval tv = {0};
569
570#ifdef CLOCK_MONOTONIC_RAW
571 /* linux kernel > 2.6.28 */
572 if (!clock_gettime(CLOCK_MONOTONIC_RAW, &tp)) {
573 return tp.tv_sec * 1000u + tp.tv_nsec / 1000000u;
574 } else {
575 gettimeofday(&tv, NULL);
576 return tv.tv_sec * 1000u + tv.tv_usec / 1000u;
577 }
578#else
579 gettimeofday(&tv, NULL);
580 return tv.tv_sec * 1000u + tv.tv_usec / 1000u;
581#endif
582}
583/* sleep ms --------------------------------------------------------------------
584 * sleep ms
585 * args : int ms I miliseconds to sleep (<0:no sleep)
586 * return : none
587 *-----------------------------------------------------------------------------*/
588extern void sleepms(int ms) {
589 struct timespec ts;
590 if (ms <= 0) {
591 return;
592 }
593 ts.tv_sec = (time_t)(ms / 1000);
594 ts.tv_nsec = (long)(ms % 1000 * 1000000);
595 nanosleep(&ts, NULL);
596}
#define PI
Definition mrtk_coords.c:35
gtime_t gst2time(int week, double sec)
Convert Galileo system time week/tow to gtime_t.
Definition mrtk_time.c:197
gtime_t bdt2time(int week, double sec)
Convert BeiDou time week/tow to gtime_t.
Definition mrtk_time.c:229
static double time2sec(gtime_t time, gtime_t *day)
Definition mrtk_time.c:471
static const double bdt0[]
BeiDou time reference epoch.
Definition mrtk_time.c:46
void sleepms(int ms)
Sleep for specified milliseconds.
Definition mrtk_time.c:588
gtime_t epoch2time(const double *ep)
Convert calendar day/time to gtime_t struct.
Definition mrtk_time.c:113
double utc2gmst(gtime_t t, double ut1_utc)
Convert UTC to Greenwich Mean Sidereal Time.
Definition mrtk_time.c:485
gtime_t gpst2time(int week, double sec)
Convert GPS week/tow to gtime_t.
Definition mrtk_time.c:165
void time2epoch(gtime_t t, double *ep)
Convert gtime_t struct to calendar day/time.
Definition mrtk_time.c:136
int read_leaps(const char *file)
Read leap seconds table from file.
Definition mrtk_time.c:397
gtime_t gpst2bdt(gtime_t t)
Convert GPS time to BeiDou time.
Definition mrtk_time.c:458
void time2str(gtime_t t, char *s, int n)
Convert gtime_t struct to string.
Definition mrtk_time.c:507
gtime_t gpst2utc(gtime_t t)
Convert GPS time to UTC considering leap seconds.
Definition mrtk_time.c:422
static int read_leaps_text(FILE *fp)
Definition mrtk_time.c:330
static int read_leaps_usno(FILE *fp)
Definition mrtk_time.c:351
double timediff(gtime_t t1, gtime_t t2)
Compute time difference (t1 - t2).
Definition mrtk_time.c:279
double time2gpst(gtime_t t, int *week)
Convert gtime_t to GPS week/tow.
Definition mrtk_time.c:181
double time2bdt(gtime_t t, int *week)
Convert gtime_t to BeiDou time week/tow.
Definition mrtk_time.c:245
double time2doy(gtime_t t)
Convert time to day of year.
Definition mrtk_time.c:540
static double leaps[64+1][7]
Leap seconds table (y,m,d,h,m,s,utc-gpst).
Definition mrtk_time.c:49
int adjgpsweek(int week)
Adjust GPS week number using CPU time.
Definition mrtk_time.c:553
gtime_t timeadd(gtime_t t, double sec)
Add seconds to gtime_t.
Definition mrtk_time.c:265
gtime_t bdt2gpst(gtime_t t)
Convert BeiDou time to GPS time.
Definition mrtk_time.c:465
char * time_str(gtime_t t, int n)
Get time string (not reentrant).
Definition mrtk_time.c:530
void timereset(void)
Reset time offset to zero.
Definition mrtk_time.c:324
void timeset(gtime_t t)
Set current time offset in UTC.
Definition mrtk_time.c:318
static const double gst0[]
Galileo system time reference epoch.
Definition mrtk_time.c:44
int str2time(const char *s, int i, int n, gtime_t *t)
Convert substring in string to gtime_t struct.
Definition mrtk_time.c:87
static double timeoffset_
Time offset (s) for timeget/timeset.
Definition mrtk_time.c:74
double time2gst(gtime_t t, int *week)
Convert gtime_t to Galileo system time week/tow.
Definition mrtk_time.c:213
static const double gpst0[]
GPS time reference epoch.
Definition mrtk_time.c:42
#define MAXLEAPS
Definition mrtk_time.c:39
gtime_t utc2gpst(gtime_t t)
Convert UTC to GPS time considering leap seconds.
Definition mrtk_time.c:440
gtime_t timeget(void)
Get current time in UTC.
Definition mrtk_time.c:289
uint32_t tickget(void)
Get current tick in milliseconds.
Definition mrtk_time.c:566
MRTKLIB Time Module — GNSS time types and conversion functions.
GNSS time representation.
Definition mrtk_time.h:49
double sec
Definition mrtk_time.h:51
time_t time
Definition mrtk_time.h:50