~ubuntu-branches/debian/squeeze/ntp/squeeze-201010051545

« back to all changes in this revision

Viewing changes to util/pps-api.c

  • Committer: Bazaar Package Importer
  • Author(s): Matt Zimmerman
  • Date: 2004-10-11 16:10:27 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20041011161027-icyjbji8ujym633o
Tags: 1:4.2.0a-10ubuntu2
Use ntp.ubuntulinux.org instead of pool.ntp.org

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
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
 
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
}