1 /*
2
3 Try to run this program to see what the PPS-API finds. You give it the
4 device as argument and you may have to modify the pp.mode = BLA assignment.
5
6 Poul-Henning
7
8 */
9
10 #include <stdio.h>
11 #include <errno.h>
12 #include <fcntl.h>
13 #include <err.h>
14 #include <sys/types.h>
15 #include <time.h>
16 #include <sys/timepps.h>
17 #include <sys/termios.h>
18
19 #define timespecsub(vvp, uvp) \
20 do { \
21 (vvp)->tv_sec -= (uvp)->tv_sec; \
22 (vvp)->tv_nsec -= (uvp)->tv_nsec; \
23 if ((vvp)->tv_nsec < 0) { \
24 (vvp)->tv_sec--; \
25 (vvp)->tv_nsec += 1000000000; \
26 } \
27 } while (0)
28
29
30 void
Chew(struct timespec * tsa,struct timespec * tsc,unsigned sa,unsigned sc)31 Chew(struct timespec *tsa, struct timespec *tsc, unsigned sa, unsigned sc)
32 {
33 static int idx;
34 struct timespec ts;
35
36 printf("%d.%09d ", tsa->tv_sec, tsa->tv_nsec);
37 printf("%d.%09d ", tsc->tv_sec, tsc->tv_nsec);
38 printf("%u %u ", sa, sc);
39
40 ts = *tsc;
41 timespecsub(&ts,tsa);
42 printf("%.9f ", ts.tv_sec + ts.tv_nsec / 1e9);
43 printf("\n");
44 fflush(stdout);
45 }
46
47 int
main(int argc,char ** argv)48 main(int argc, char **argv)
49 {
50 int fd;
51 pps_info_t pi;
52 pps_params_t pp;
53 pps_handle_t ph;
54 int i, mode;
55 u_int olda, oldc;
56 double d = 0;
57 struct timespec to;
58
59 if (argc < 2)
60 argv[1] = "/dev/cuaa1";
61 setbuf(stdout, 0);
62 fd = open(argv[1], O_RDONLY);
63 if (fd < 0)
64 err(1, argv[1]);
65 i = time_pps_create(fd, &ph);
66 if (i < 0)
67 err(1, "time_pps_create");
68
69 i = time_pps_getcap(ph, &mode);
70 if (i < 0)
71 err(1, "time_pps_getcap");
72
73 pp.mode = PPS_CAPTUREASSERT | PPS_ECHOASSERT;
74 pp.mode = PPS_CAPTUREBOTH;
75 /* pp.mode = PPS_CAPTUREASSERT; */
76
77 i = time_pps_setparams(ph, &pp);
78 if (i < 0)
79 err(1, "time_pps_setparams");
80
81 while (1) {
82 to.tv_nsec = 0;
83 to.tv_sec = 0;
84 i = time_pps_fetch(ph, PPS_TSFMT_TSPEC, &pi, &to);
85 if (i < 0)
86 err(1, "time_pps_fetch");
87 if (olda == pi.assert_sequence &&
88 oldc == pi.clear_sequence) {
89 usleep(10000);
90 continue;
91 }
92
93 Chew(&pi.assert_timestamp, &pi.clear_timestamp,
94 pi.assert_sequence, pi.clear_sequence);
95 olda = pi.assert_sequence;
96 oldc = pi.clear_sequence;
97 }
98
99 return(0);
100 }
101