PageRenderTime 80ms CodeModel.GetById 59ms app.highlight 15ms RepoModel.GetById 1ms app.codeStats 0ms

/contrib/ntp/util/pps-api.c

https://bitbucket.org/freebsd/freebsd-head/
C | 100 lines | 77 code | 14 blank | 9 comment | 12 complexity | 7af591a0c1c1ee8e25bd759c2a704cea MD5 | raw file
  1/*
  2
  3Try to run this program to see what the PPS-API finds. You give it the
  4device as argument and you may have to modify the pp.mode = BLA assignment.
  5
  6Poul-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
 30void
 31Chew(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
 47int
 48main(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}