PPS-Client  1.4.0
Client for synchronizing the system clock to a GPS PPS source
pps-client.h
Go to the documentation of this file.
1 
22 #ifndef PPS_CLIENT_OLD_PPS_CLIENT_H_
23 #define PPS_CLIENT_OLD_PPS_CLIENT_H_
24 
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <time.h>
28 #include <unistd.h>
29 #include <pthread.h>
30 #include <signal.h>
31 #include <string.h>
32 #include <sys/stat.h>
33 #include <fcntl.h>
34 #include <sys/timex.h>
35 #include <math.h>
36 #include <sys/types.h>
37 #include <errno.h>
38 #include <poll.h>
39 #include <sys/mman.h>
40 
41 #define PTHREAD_STACK_REQUIRED 16384
42 #define USECS_PER_SEC 1000000
43 #define SECS_PER_MINUTE 60
44 #define SECS_PER_5_MIN 300
45 #define SECS_PER_10_MIN 600
46 #define SECS_PER_HOUR 3600
47 #define SECS_PER_DAY 86400
48 #define NUM_5_MIN_INTERVALS 288
49 #define FIVE_MINUTES 5
50 #define PER_MINUTE (1.0 / (double)SECS_PER_MINUTE)
51 #define SETTLE_TIME (2 * SECS_PER_10_MIN)
52 #define INV_GAIN_1 1
53 #define INV_GAIN_0 4
54 #define INTEGRAL_GAIN 0.63212
55 #define SHOW_INTRPT_DATA_INTVL 6
56 #define INV_DELAY_SAMPLES_PER_MIN (1.0 / (double)SECS_PER_MINUTE)
57 #define FREQDIFF_INTRVL 5
58 
59 #define OFFSETFIFO_LEN 80
60 #define NUM_INTEGRALS 10
61 #define PER_NUM_INTEGRALS (1.0 / (double)NUM_INTEGRALS)
62 
63 #define ADJTIMEX_SCALE 65536.0
64 
65 #define INTERRUPT_LATENCY 6
66 
67 #define RAW_ERROR_ZERO 20
68 #define MIN_PEAK_RATIO 0.05
69 #define MAX_VALLEY_RATIO 0.99
70 #define RAW_ERROR_DECAY 0.98851
71 
72 #define INTERRUPT_LOST 15
73 
74 #define MAX_SERVERS 4
75 #define CHECK_TIME 1024
76 #define BLOCK_FOR_10 10
77 #define BLOCK_FOR_3 3
78 #define CHECK_TIME_SERIAL 600
79 
80 #define MAX_SPIKES 30
81 
82 #define NOISE_FACTOR 0.354
83 #define NOISE_LEVEL_MIN 4
84 #define SLEW_LEN 10
85 #define SLEW_MAX 65
86 
87 #define MAX_LINE_LEN 50
88 #define STRBUF_SZ 500
89 #define LOGBUF_SZ 500
90 #define MSGBUF_SZ 500
91 #define SNTP_MSG_SZ 200
92 #define CONFIG_FILE_SZ 10000
93 
94 #define NUM_PARAMS 5
95 #define ERROR_DISTRIB_LEN 121
96 #define JITTER_DISTRIB_LEN 121
97 #define INTRPT_DISTRIB_LEN 121
98 
99 #define HARD_LIMIT_NONE 32768
100 #define HARD_LIMIT_1024 1024
101 #define HARD_LIMIT_4 4
102 #define HARD_LIMIT_1 1
103 #define HARD_LIMIT_05 0.5
104 
105 #define HIGH 1
106 #define LOW 0
107 
108 #define MAX_CONFIGS 32
109 
110 #define ERROR_DISTRIB 1 // Configuration file Keys
111 #define ALERT_PPS_LOST 2
112 #define JITTER_DISTRIB 4
113 #define CALIBRATE 8
114 #define INTERRUPT_DISTRIB 16
115 #define SYSDELAY_DISTRIB 32
116 #define EXIT_LOST_PPS 64
117 #define PPS_GPIO 128
118 #define OUTPUT_GPIO 256
119 #define INTRPT_GPIO 512
120 #define SNTP 1024
121 #define SERIAL 2048
122 #define SERIAL_PORT 4096
123 
124 /*
125  * Struct for passing arguments to and from threads
126  * querying time servers.
127  */
129  pthread_t *tid;
130  pthread_attr_t attr;
133  char **ntp_server;
134  char *serialPort;
135  char *buf;
137  char *strbuf;
138  char *logbuf;
139  bool *threadIsBusy;
140  int rv;
141 };
142 
143 /*
144  * Struct for program-wide global variables.
145  */
146 struct G {
147  int ppsGPIO;
150 
151  bool isVerbose;
152 
154 
155  unsigned int seq_num;
156 
158  unsigned int activeCount;
159 
163 
164  struct timeval t;
166 
167  int tm[6];
168 
169  int t_now;
170  int t_count;
171  double t_mono_now;
172  double t_mono_last;
173  double zeroAccum;
174 
177  unsigned int intrptCount;
178  double delayMedian;
179  int sysDelay;
180 
182  int rawError;
183 
188 
190 
194  unsigned int ppsCount;
195 
197 
201 
202  double slewAccum;
204  double avgSlew;
205  bool slewIsLow;
206 
207  int zeroError;
208  int hardLimit;
211  struct timex t3;
212 
213  double avgCorrection;
217 
219  double avgIntegral;
221 
223 
224  double integralGain;
226  double freqOffset;
227 
229 
230  char linuxVersion[20];
231 
234  char logbuf[LOGBUF_SZ];
235  char msgbuf[MSGBUF_SZ];
236  char savebuf[MSGBUF_SZ];
237  char strbuf[STRBUF_SZ];
238  char *configVals[MAX_CONFIGS];
239 
240  bool exit_requested;
241  bool exitOnLostPPS;
242  bool exit_loop;
243 
244  bool doCalibration;
245  bool doNTPsettime;
246 
247  bool doSerialsettime;
248  int blockDetectClockChange;
249 
250  int serialTimeError;
251 
252  int recIndex;
253  int recIndex2;
254 
255  time_t pps_t_sec;
256  int pps_t_usec;
257 
258  unsigned int config_select;
259 
260  int intervalCount;
261 
262  int jitter;
263 
264  int seq_numRec[SECS_PER_10_MIN];
265 
266  double lastFreqOffset;
267  double freqOffsetSum;
268  double freqOffsetDiff[FREQDIFF_INTRVL];
269 
270  unsigned int lastActiveCount;
271 
272  double intrptErrorDistrib[ERROR_DISTRIB_LEN];
273 
274  int intrptDistrib[NUM_PARAMS][INTRPT_DISTRIB_LEN];
275  int delayLabel[NUM_PARAMS];
276 
277  int interruptDistrib[INTRPT_DISTRIB_LEN];
278  int interruptCount;
279 
280  int sysDelayDistrib[INTRPT_DISTRIB_LEN];
281  int sysDelayCount;
282 
283  int jitterDistrib[JITTER_DISTRIB_LEN];
284  int jitterCount;
285 
286  int errorDistrib[ERROR_DISTRIB_LEN];
287  int errorCount;
288  int queryCount;
289 
290  double freqAllanDev[NUM_5_MIN_INTERVALS];
291  double freqOffsetRec[NUM_5_MIN_INTERVALS];
292  double freqOffsetRec2[SECS_PER_10_MIN];
293  __time_t timestampRec[NUM_5_MIN_INTERVALS];
294  int offsetRec[SECS_PER_10_MIN];
295  char serialPort[50];
296  char configBuf[CONFIG_FILE_SZ];
300 };
301 
307 time_t getServerTime(const char *, int, char *, char *);
311 int waitForNTPServers(void);
312 
316 
321 struct saveFileData {
322  const char *label;
323  void *array;
324  const char *filename;
325  int arrayLen;
326  int arrayType;
327  int arrayZero;
328 };
329 
330 int sysCommand(const char *);
331 void initFileLocalData(void);
332 void initSerialLocalData(void);
333 void bufferStatusMsg(const char *);
334 int writeStatusStrings(void);
335 bool ppsIsRunning(void);
336 int writeFileMsgToLog(const char *);
337 int writeFileMsgToLogbuf(const char *, char *);
338 void writeToLog(char *);
339 pid_t getChildPID(void);
340 int createPIDfile(void);
341 int readConfigFile(void);
342 void writeOffsets(void);
343 void writeTimestamp(double);
344 void writeSysDelay(void);
345 int bufferStateParams(void);
346 int disableNTP(void);
347 int enableNTP(void);
348 int open_logerr(const char*, int);
349 int read_logerr(int fd, char *, int, const char *);
350 void writeInterruptDistribFile(void);
351 int processFiles(void);
352 bool isEnabled(int);
353 bool isDisabled(int);
354 void writeSysdelayDistribFile(void);
355 void showStatusEachSecond(void);
356 struct timespec setSyncDelay(int, int);
357 int accessDaemon(int argc, char *argv[]);
358 int driver_load(int, int, int);
359 void driver_unload(void);
360 void buildErrorDistrib(int);
361 void buildJitterDistrib(int);
362 void TERMhandler(int);
363 void HUPhandler(int);
364 void buildInterruptDistrib(int);
365 void buildInterruptJitterDistrib(int);
366 void buildSysDelayDistrib(int);
367 void recordFrequencyVars(void);
368 void recordOffsets(int timeCorrection);
369 bool configHasValue(int, char *[], void *);
370 int getDriverGPIOvals(void);
371 void writeToLogNoTimestamp(char *);
372 int getTimeErrorOverSerial(int *);
376 #endif /* PPS_CLIENT_OLD_PPS_CLIENT_H_ */
void writeToLog(char *logbuf)
Definition: pps-files.cpp:247
double slewAccum
Accumulates G.rawError in getTimeSlew() and is used to determine G.avgSlew.
Definition: pps-client.h:202
bool doReadSerial
Flag to read serial messages from serial port.
Definition: pps-client.h:136
void buildInterruptDistrib(int intrptDelay)
Definition: pps-files.cpp:2137
#define OFFSETFIFO_LEN
Length of G.correctionFifo which contains the data used to generate G.avgCorrection.
Definition: pps-client.h:59
char * logbuf
Space for returned log messages.
Definition: pps-client.h:138
void recordOffsets(int timeCorrection)
Definition: pps-files.cpp:2231
bool isControlling
Set "true" by getAcquireState() when the control loop can begin to control the system clock frequency...
Definition: pps-client.h:157
void showStatusEachSecond(void)
Definition: pps-files.cpp:1767
void recordFrequencyVars(void)
Definition: pps-files.cpp:2185
int tm[6]
Returns the interrupt calibration reception and response times from the PPS-Client device driver...
Definition: pps-client.h:167
struct timex t3
Passes G.timeCorrection to the system function adjtimex() in makeTimeCorrection().
Definition: pps-client.h:211
double freqOffset
System clock frequency correction calculated as G.integralTimeCorrection * G.integralGain.
Definition: pps-client.h:226
#define MSGBUF_SZ
Definition: pps-client.h:90
#define INTRPT_DISTRIB_LEN
Definition: pps-client.h:97
#define SECS_PER_10_MIN
Definition: pps-client.h:45
double integral[NUM_INTEGRALS]
Array of integrals constructed by makeAverageIntegral().
Definition: pps-client.h:218
bool ppsIsRunning(void)
Definition: pps-files.cpp:475
double t_mono_now
Current monotonic count of passing seconds.
Definition: pps-client.h:171
void writeTimestamp(double timestamp)
Definition: pps-files.cpp:1179
double integralTimeCorrection
Integral or average integral of G.timeCorrection returned by getIntegral();.
Definition: pps-client.h:225
unsigned int ppsCount
Advancing count of G.rawErrorDistrib[] entries made by detectDelayPeak().
Definition: pps-client.h:194
int rawError
Set equal to G.interruptTime - G.sysDelay in makeTimeCorrection().
Definition: pps-client.h:182
void freeSNTPThreads(timeCheckParams *tcp)
Definition: pps-sntp.cpp:456
bool configHasValue(int config_val, void *value)
Definition: pps-files.cpp:550
#define JITTER_DISTRIB_LEN
Definition: pps-client.h:96
bool interruptLost
Set "true" when a PPS interrupt time fails to be received.
Definition: pps-client.h:161
bool isEnabled(int key)
Definition: pps-files.cpp:159
int zeroError
The controller error resulting from removing jitter noise from G.rawError in removeNoise().
Definition: pps-client.h:207
unsigned int activeCount
Advancing count of controller cycles once G.isControlling is "true".
Definition: pps-client.h:158
char linuxVersion[20]
Array for recording the Linux version.
Definition: pps-client.h:230
void makeSNTPTimeQuery(timeCheckParams *tcp)
Definition: pps-sntp.cpp:341
pid_t getChildPID(void)
Definition: pps-files.cpp:447
int integralCount
Counts the integrals formed over the last 10 controller cycles and signals when all integrals in G...
Definition: pps-client.h:220
int correctionAccum
Accumulates G.timeCorrection values from G.correctionFifo in getAverageCorrection() in order to gener...
Definition: pps-client.h:216
double avgSlew
Average slew value determined by getTimeSlew() from the average of G.slewAccum each time G...
Definition: pps-client.h:204
int serverIndex
Identifying index from the list of active SNTP servers.
Definition: pps-client.h:131
int disableNTP(void)
Definition: pps-files.cpp:1462
int sysCommand(const char *cmd)
Definition: pps-files.cpp:89
int read_logerr(int fd, char *buf, int sz, const char *filename)
Definition: pps-files.cpp:347
void buildSysDelayDistrib(int sysDelay)
Definition: pps-files.cpp:2161
double avgCorrection
A one-minute rolling average of G.timeCorrection values generated by getAverageCorrection().
Definition: pps-client.h:213
unsigned int intrptCount
Advancing count of intrptErrorDistrib[] entries made by detectDelayPeak().
Definition: pps-client.h:177
int writeFileMsgToLogbuf(const char *filename, char *logbuf)
Definition: pps-files.cpp:393
char * strbuf
Space for messages and query strings.
Definition: pps-client.h:137
int rv
Return value of thread.
Definition: pps-client.h:140
void writeSysDelay(void)
Definition: pps-files.cpp:1157
int consensusTimeError
Consensus value of whole-second time corrections for DST or leap seconds from Internet SNTP servers...
Definition: pps-client.h:228
void HUPhandler(int sig)
Definition: pps-files.cpp:2101
int timeCorrection
Time correction value constructed in makeTimeCorrection() by dividing G.zeroError by G...
Definition: pps-client.h:210
int * serverTimeDiff
Time difference between local time and server time.
Definition: pps-client.h:132
#define NUM_INTEGRALS
Number of integrals used by makeAverageIntegral() to calculate the one minute clock frequency correct...
Definition: pps-client.h:60
int processFiles(void)
Definition: pps-files.cpp:1086
int accessDaemon(int argc, char *argv[])
Definition: pps-files.cpp:1989
int allocInitializeSerialThread(timeCheckParams *tcp)
Definition: pps-serial.cpp:423
double avgIntegral
One-minute average of the integrals in G.integral[].
Definition: pps-client.h:219
#define CONFIG_FILE_SZ
Definition: pps-client.h:92
bool configWasRead
True if pps-client.conf was read at least once.
Definition: pps-client.h:153
int correctionFifo[OFFSETFIFO_LEN]
Contains the G.timeCorrection values from over the previous 60 seconds.
Definition: pps-client.h:214
double delayMedian
Median of G.intrptDelay values calculated in getInterruptDelay().
Definition: pps-client.h:178
void TERMhandler(int sig)
Definition: pps-files.cpp:2088
bool isVerbose
Enables continuous printing of PPS-Client status params when "true".
Definition: pps-client.h:151
#define LOGBUF_SZ
Definition: pps-client.h:89
#define NUM_PARAMS
Definition: pps-client.h:94
void writeSysdelayDistribFile(void)
Definition: pps-files.cpp:890
void buildErrorDistrib(int timeCorrection)
Definition: pps-files.cpp:2043
bool slewIsLow
Set to "true" in getAcquireState() when G.avgSlew is less than SLEW_MAX. This is a precondition for g...
Definition: pps-client.h:205
int getDriverGPIOvals(void)
Definition: pps-files.cpp:575
int nIntrptDelaySpikes
Definition: pps-client.h:196
#define MAX_CONFIGS
Definition: pps-client.h:108
void writeOffsets(const char *filename)
Definition: pps-files.cpp:931
int correctionFifo_idx
Advances G.correctionFifo on each controller cycle in integralIsReady() which returns "true" every 60...
Definition: pps-client.h:222
#define STRBUF_SZ
Definition: pps-client.h:88
void freeSerialThread(timeCheckParams *tcp)
Definition: pps-serial.cpp:473
#define ERROR_DISTRIB_LEN
Definition: pps-client.h:95
#define NUM_5_MIN_INTERVALS
Number of five minute intervals in 24 hours.
Definition: pps-client.h:48
int slewAccum_cnt
Count of the number of times G.rawError has been summed into G.slewAccum.
Definition: pps-client.h:203
int readConfigFile(void)
Definition: pps-files.cpp:626
int sysDelayShift
Assigned from G.delayShift and subtracted from G.rawError in correctDelayPeak() when a delay shift oc...
Definition: pps-client.h:185
pthread_attr_t attr
Thread attribute object.
Definition: pps-client.h:130
int noiseLevel
PPS time delay value beyond which a delay is defined to be a delay spike.
Definition: pps-client.h:198
int bufferStateParams(void)
Definition: pps-files.cpp:1291
bool isDelaySpike
Set "true" by detectDelaySpike() when G.rawError exceeds G.noiseLevel.
Definition: pps-client.h:200
int enableNTP(void)
Definition: pps-files.cpp:1527
unsigned int seq_num
Advancing count of the number of PPS interrupt timings that have been received.
Definition: pps-client.h:155
int t_count
Whole seconds counted at the time of G.t_now.
Definition: pps-client.h:170
int writeFileMsgToLog(const char *filename)
Definition: pps-files.cpp:437
int allocNTPServerList(timeCheckParams *tcp)
Definition: pps-sntp.cpp:58
double rawErrorDistrib[ERROR_DISTRIB_LEN]
The distribution used to detect a delay shift in detectDelayPeak().
Definition: pps-client.h:192
int delayShift
Interval of a delay shift when one is detected by detectDelayPeak().
Definition: pps-client.h:184
char * serialPort
The serial port filename when serial time is used.
Definition: pps-client.h:134
time_t getServerTime(const char *server, int id, char *strbuf, char *logbuf)
Definition: pps-sntp.cpp:119
Struct for passing arguments to and from threads querying SNTP time servers or GPS receivers...
Definition: pps-client.h:128
int intrptDelay
Value of the interrupt delay calibration measurement received from the PPS-Client device driver...
Definition: pps-client.h:175
int sysDelay
Definition: pps-client.h:179
int invProportionalGain
Controller proportional gain configured inversely to use as an int divisor.
Definition: pps-client.h:209
bool * threadIsBusy
True while thread is waiting for or processing a time query.
Definition: pps-client.h:139
int nDelaySpikes
Current count of continuous delay spikes made by detectDelaySpike().
Definition: pps-client.h:199
Struct for program-wide global variables showing those important to the controller.
Definition: pps-client.h:146
void driver_unload()
Definition: pps-files.cpp:1733
bool isDisabled(int key)
Definition: pps-files.cpp:173
int outputGPIO
The calibrate GPIO output number read from pps-client.conf and passed to the driver.
Definition: pps-client.h:148
void writeToLogNoTimestamp(char *logbuf)
Definition: pps-files.cpp:215
int t_now
Whole seconds of current time reported by gettimeofday().
Definition: pps-client.h:169
int intrptError
Set equal to "intrptDelay - sysDelay" in getInterruptDelay().
Definition: pps-client.h:176
int allocInitializeSNTPThreads(timeCheckParams *tcp)
Definition: pps-sntp.cpp:416
double t_mono_last
Last recorded monotonic count used to determine a lost PPS update.
Definition: pps-client.h:172
int open_logerr(const char *filename, int flags)
Definition: pps-files.cpp:366
int makeSerialTimeQuery(timeCheckParams *tcp)
Definition: pps-serial.cpp:365
char * buf
Space for the active SNTP server list.
Definition: pps-client.h:135
int createPIDfile(void)
Definition: pps-files.cpp:515
int interruptLossCount
Records the number of consecutive lost PPS interrupt times.
Definition: pps-client.h:162
int delayPeakLen
Counts the length of a delay peak that is being corrected in correctDelayPeak().
Definition: pps-client.h:186
struct timeval t
Time of system response to the PPS interrupt. Received from the PPS-Client device driver...
Definition: pps-client.h:164
int hardLimit
An adaptive limit value determined by setHardLimit() and applied to G.rawError by clampJitter() as th...
Definition: pps-client.h:208
void buildJitterDistrib(int rawError)
Definition: pps-files.cpp:2067
#define FREQDIFF_INTRVL
The number of minutes between Allan deviation samples of system clock frequency correction.
Definition: pps-client.h:57
int disableDelayCount
Definition: pps-client.h:189
struct timespec setSyncDelay(int timeAt, int fracSec)
Definition: pps-client.cpp:937
bool disableDelayShift
Suspends delay shift correction in correctDelayPeak() when G.delayPeakLen exceeds MAX_SPIKES...
Definition: pps-client.h:187
int writeStatusStrings(void)
Definition: pps-files.cpp:316
int correctionFifoCount
Signals that G.correctionFifo contains a full count of G.timeCorrection values.
Definition: pps-client.h:215
int intrptGPIO
The calibrate GPIO interrupt number read from pps-client.conf and passed to the driver.
Definition: pps-client.h:149
int driver_load(int ppsGPIO, int outputGPIO, int intrptGPIO)
Definition: pps-files.cpp:1668
int ppsGPIO
The PPS GPIO interrupt number read from pps-client.conf and passed to the driver. ...
Definition: pps-client.h:147
double zeroAccum
Accumulator to test nearness to zero in isNearZero()
Definition: pps-client.h:173
bool interruptReceived
Set "true" when makeTimeCorrection() processes an interrupt time from the PPS-Client device driver...
Definition: pps-client.h:160
int delayMinIdx
If a delay shift occurs, the minimum value preceding the delay peak in rawErrorDistrib[].
Definition: pps-client.h:193
char ** ntp_server
The active SNTP server list when SNTP is used.
Definition: pps-client.h:133
void bufferStatusMsg(const char *msg)
Definition: pps-files.cpp:290
int interruptTime
Fractional second part of G.t received from PPS-Client device driver.
Definition: pps-client.h:165
double integralGain
Current controller integral gain.
Definition: pps-client.h:224
void initFileLocalData(void)
Definition: pps-files.cpp:85
pthread_t * tid
Thread id.
Definition: pps-client.h:129