1132451Sroberto/*
2132451Sroberto
3132451SrobertoTry to run this program to see what the PPS-API finds. You give it the
4132451Srobertodevice as argument and you may have to modify the pp.mode = BLA assignment.
5132451Sroberto
6132451SrobertoPoul-Henning
7132451Sroberto
8132451Sroberto*/
9132451Sroberto
10132451Sroberto#include <stdio.h>
11132451Sroberto#include <errno.h>
12132451Sroberto#include <fcntl.h>
13132451Sroberto#include <err.h>
14132451Sroberto#include <sys/types.h>
15132451Sroberto#include <time.h>
16132451Sroberto#include <sys/timepps.h>
17132451Sroberto#include <sys/termios.h>
18132451Sroberto
19132451Sroberto#define timespecsub(vvp, uvp)                                           \
20132451Sroberto        do {                                                            \
21132451Sroberto                (vvp)->tv_sec -= (uvp)->tv_sec;                         \
22132451Sroberto                (vvp)->tv_nsec -= (uvp)->tv_nsec;                       \
23132451Sroberto                if ((vvp)->tv_nsec < 0) {                               \
24132451Sroberto                        (vvp)->tv_sec--;                                \
25132451Sroberto                        (vvp)->tv_nsec += 1000000000;                   \
26132451Sroberto                }                                                       \
27132451Sroberto        } while (0)
28132451Sroberto
29132451Sroberto
30132451Srobertovoid
31132451SrobertoChew(struct timespec *tsa, struct timespec *tsc, unsigned sa, unsigned sc)
32132451Sroberto{
33132451Sroberto	static int idx;
34132451Sroberto	struct timespec ts;
35132451Sroberto
36132451Sroberto	printf("%d.%09d ", tsa->tv_sec, tsa->tv_nsec);
37132451Sroberto	printf("%d.%09d ", tsc->tv_sec, tsc->tv_nsec);
38132451Sroberto	printf("%u %u ", sa, sc);
39132451Sroberto
40132451Sroberto	ts = *tsc;
41132451Sroberto	timespecsub(&ts,tsa);
42132451Sroberto	printf("%.9f ", ts.tv_sec + ts.tv_nsec / 1e9);
43132451Sroberto	printf("\n");
44132451Sroberto	fflush(stdout);
45132451Sroberto}
46132451Sroberto
47132451Srobertoint
48132451Srobertomain(int argc, char **argv)
49132451Sroberto{
50132451Sroberto	int fd;
51132451Sroberto	pps_info_t pi;
52132451Sroberto	pps_params_t pp;
53132451Sroberto	pps_handle_t ph;
54132451Sroberto	int i, mode;
55132451Sroberto	u_int olda, oldc;
56132451Sroberto	double d = 0;
57132451Sroberto	struct timespec to;
58132451Sroberto
59132451Sroberto	if (argc < 2)
60132451Sroberto		argv[1] = "/dev/cuaa1";
61132451Sroberto	setbuf(stdout, 0);
62132451Sroberto	fd = open(argv[1], O_RDONLY);
63132451Sroberto	if (fd < 0)
64132451Sroberto		err(1, argv[1]);
65132451Sroberto	i = time_pps_create(fd, &ph);
66132451Sroberto	if (i < 0)
67132451Sroberto		err(1, "time_pps_create");
68132451Sroberto
69132451Sroberto	i = time_pps_getcap(ph, &mode);
70132451Sroberto	if (i < 0)
71132451Sroberto		err(1, "time_pps_getcap");
72132451Sroberto
73132451Sroberto	pp.mode = PPS_CAPTUREASSERT | PPS_ECHOASSERT;
74132451Sroberto	pp.mode = PPS_CAPTUREBOTH;
75132451Sroberto	/* pp.mode = PPS_CAPTUREASSERT; */
76132451Sroberto
77132451Sroberto	i = time_pps_setparams(ph, &pp);
78132451Sroberto	if (i < 0)
79132451Sroberto		err(1, "time_pps_setparams");
80132451Sroberto
81132451Sroberto	while (1) {
82132451Sroberto		to.tv_nsec = 0;
83132451Sroberto		to.tv_sec = 0;
84132451Sroberto		i = time_pps_fetch(ph, PPS_TSFMT_TSPEC, &pi, &to);
85132451Sroberto		if (i < 0)
86132451Sroberto			err(1, "time_pps_fetch");
87132451Sroberto		if (olda == pi.assert_sequence &&
88132451Sroberto		    oldc == pi.clear_sequence) {
89132451Sroberto			usleep(10000);
90132451Sroberto			continue;
91132451Sroberto		}
92132451Sroberto
93132451Sroberto		Chew(&pi.assert_timestamp, &pi.clear_timestamp,
94132451Sroberto			pi.assert_sequence, pi.clear_sequence);
95132451Sroberto		olda = pi.assert_sequence;
96132451Sroberto		oldc = pi.clear_sequence;
97132451Sroberto	}
98132451Sroberto
99132451Sroberto	return(0);
100132451Sroberto}
101