Coverage Report

Created: 2026-02-26 06:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ntp-dev/include/ntp_calgps.h
Line
Count
Source
1
/*
2
 * ntp_calgps.h - calendar for GPS/GNSS based clocks
3
 *
4
 * Written by Juergen Perlinger (perlinger@ntp.org) for the NTP project.
5
 * The contents of 'html/copyright.html' apply.
6
 *
7
 * --------------------------------------------------------------------
8
 *
9
 * This module implements stuff often used with GPS/GNSS receivers
10
 */
11
#ifndef NTP_CALGPS_H
12
#define NTP_CALGPS_H
13
14
#include <time.h>
15
16
#include "ntp_types.h"
17
#include "ntp_fp.h"
18
#include "ntp_calendar.h"
19
20
/* GPS week calendar (extended weeks)
21
 * We use weeks based on 1899-31-12, which was the last Sunday before
22
 * the begin of the NTP epoch. (Which is equivalent to saying 1900-01-01
23
 * was a Monday...)
24
 *
25
 * We simply pre-calculate the offsets and cycle shifts for the real GPS
26
 * calendar, which starts at 1980-01-06, to simplyfy some expressions.
27
 *
28
 * This has a fringe benefit that should not be overlooked: Since week zero
29
 * is around 1900, and we should never have to deal with dates before
30
 * 1970 or 1980, a week number of zero can be easily used to indicate
31
 * an invalid week time stamp.
32
 */
33
0
#define GPSNTP_WSHIFT 4175  /* weeks 1899-31-12 --> 1980-01-06 */
34
#define GPSNTP_WCYCLE   79  /* above, modulo 1024 */
35
0
#define GPSNTP_DSHIFT    1  /* day number of 1900-01-01 in week */
36
37
struct gpsdatum {
38
  uint32_t weeks;   /* weeks since GPS epoch  */
39
  int32_t  wsecs;   /* seconds since week start */
40
  uint32_t frac;    /* fractional seconds   */
41
};
42
typedef struct gpsdatum TGpsDatum;
43
typedef struct gpsdatum const TcGpsDatum;
44
45
/* NTP date/time in split representation */
46
struct ntpdatum {
47
  uint32_t days;    /* since NTP epoch    */
48
  int32_t  secs;    /* since midnight, denorm is ok */
49
  uint32_t frac;    /* fractional seconds   */
50
};
51
typedef struct ntpdatum TNtpDatum;
52
typedef struct ntpdatum const TcNtpDatum;
53
54
/*
55
 * GPS week/sec calendar functions
56
 *
57
 * see the implementation for details, especially the
58
 * 'gpscal_from_weektime{1,2}()'
59
 */
60
61
extern TGpsDatum
62
gpscal_fix_gps_era(TcGpsDatum *);
63
64
extern void
65
gpscal_add_offset(TGpsDatum *datum, l_fp offset);
66
67
extern TGpsDatum
68
gpscal_from_calendar_ex(TcCivilDate*, l_fp fofs, int/*BOOL*/ warp);
69
70
static inline TGpsDatum
71
0
gpscal_from_calendar(TcCivilDate *pCiv, l_fp fofs) {
72
0
    return gpscal_from_calendar_ex(pCiv, fofs, TRUE);
73
0
}
Unexecuted instantiation: refclock_nmea.c:gpscal_from_calendar
Unexecuted instantiation: refclock_palisade.c:gpscal_from_calendar
Unexecuted instantiation: refclock_zyfer.c:gpscal_from_calendar
Unexecuted instantiation: ntp_calgps.c:gpscal_from_calendar
74
75
extern TGpsDatum  /* see source for semantic of the 'fofs' value! */
76
gpscal_from_gpsweek(uint16_t w, int32_t s, l_fp fofs);
77
78
extern TGpsDatum
79
gpscal_from_weektime1(int32_t wsecs, l_fp fofs, l_fp pivot);
80
81
extern TGpsDatum
82
gpscal_from_weektime2(int32_t wsecs, l_fp fofs, TcGpsDatum *pivot);
83
84
extern void
85
gpscal_to_calendar(TCivilDate*, TcGpsDatum*);
86
87
extern TGpsDatum
88
gpscal_from_gpsntp(TcNtpDatum*);
89
90
extern l_fp
91
ntpfp_from_gpsdatum(TcGpsDatum *);
92
93
/*
94
 * NTP day/sec calendar functions
95
 *
96
 * see the implementation for details, especially the
97
 * 'gpscal_from_daytime{1,2}()'
98
 */
99
extern TNtpDatum
100
gpsntp_fix_gps_era(TcNtpDatum *);
101
102
extern void
103
gpsntp_add_offset(TNtpDatum *datum, l_fp offset);
104
105
extern TNtpDatum
106
gpsntp_from_calendar_ex(TcCivilDate*, l_fp fofs, int/*BOOL*/ warp);
107
108
static inline TNtpDatum
109
0
gpsntp_from_calendar(TcCivilDate * pCiv, l_fp fofs) {
110
0
  return gpsntp_from_calendar_ex(pCiv, fofs, TRUE);
111
0
}
Unexecuted instantiation: refclock_nmea.c:gpsntp_from_calendar
Unexecuted instantiation: refclock_palisade.c:gpsntp_from_calendar
Unexecuted instantiation: refclock_zyfer.c:gpsntp_from_calendar
Unexecuted instantiation: ntp_calgps.c:gpsntp_from_calendar
112
113
extern TNtpDatum
114
gpsntp_from_daytime1_ex(TcCivilDate *dt, l_fp fofs, l_fp pivot, int/*BOOL*/ warp);
115
116
static inline TNtpDatum
117
0
gpsntp_from_daytime1(TcCivilDate *dt, l_fp fofs, l_fp pivot) {
118
0
  return gpsntp_from_daytime1_ex(dt, fofs, pivot, TRUE);
119
0
}
Unexecuted instantiation: refclock_nmea.c:gpsntp_from_daytime1
Unexecuted instantiation: refclock_palisade.c:gpsntp_from_daytime1
Unexecuted instantiation: refclock_zyfer.c:gpsntp_from_daytime1
Unexecuted instantiation: ntp_calgps.c:gpsntp_from_daytime1
120
121
extern TNtpDatum
122
gpsntp_from_daytime2_ex(TcCivilDate *dt, l_fp fofs, TcNtpDatum *pivot, int/*BOOL*/ warp);
123
124
static inline TNtpDatum
125
0
gpsntp_from_daytime2(TcCivilDate *dt, l_fp fofs, TcNtpDatum *pivot) {
126
0
  return gpsntp_from_daytime2_ex(dt, fofs, pivot, TRUE);
127
0
}
Unexecuted instantiation: refclock_nmea.c:gpsntp_from_daytime2
Unexecuted instantiation: refclock_palisade.c:gpsntp_from_daytime2
Unexecuted instantiation: refclock_zyfer.c:gpsntp_from_daytime2
Unexecuted instantiation: ntp_calgps.c:gpsntp_from_daytime2
128
129
extern TNtpDatum
130
gpsntp_from_gpscal_ex(TcGpsDatum*, int/*BOOL*/ warp);
131
132
static inline TNtpDatum
133
0
gpsntp_from_gpscal(TcGpsDatum *wd) {
134
0
  return gpsntp_from_gpscal_ex(wd, FALSE);
135
0
}
Unexecuted instantiation: refclock_nmea.c:gpsntp_from_gpscal
Unexecuted instantiation: refclock_palisade.c:gpsntp_from_gpscal
Unexecuted instantiation: refclock_zyfer.c:gpsntp_from_gpscal
Unexecuted instantiation: ntp_calgps.c:gpsntp_from_gpscal
136
137
extern void
138
gpsntp_to_calendar(TCivilDate*, TcNtpDatum*);
139
140
extern l_fp
141
ntpfp_from_ntpdatum(TcNtpDatum*);
142
143
/*
144
 * Some helpers
145
 */
146
147
/* apply fudge to time stamp: *SUBTRACT* the given offset from an l_fp*/
148
extern l_fp
149
ntpfp_with_fudge(l_fp lfp, double ofs);
150
151
#endif /*!defined(NTP_CALGPS_H)*/