Annotation of embedaddon/ntp/util/pps-api.c, revision 1.1.1.1

1.1       misho       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: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>