Annotation of embedaddon/ntp/util/pps-api.c, revision 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>