[LinuxPPS] assert/clear

clemens at dwf.com clemens at dwf.com
Mon Jul 19 22:15:34 CEST 2010


> I was recently asking for advice about using an oncore, progress is
> being made, thanks to Reg and Remco.
> But I see another more basic problem. I see asserts incrementing, but
> not my clears (i.e. it stays the same). How can an asserts be seen
> without a clear between each one?
> 
No problem.
It has to do with the arguments to the time_pps_setparams call in your 
piece of code.
There are three possibilities, CAPTURECLEAR, CAPTUREASSERT and CAPTUREBOTH.
The code you have is obviously setting CAPTUREASSERT, so you are not seeing the
CLEAR events.

If this is NTP, then the ONCORE driver sets this option based on the ASSERT/CLEAR
statement in your ntp.oncore.0.

If this is something like my ppsapitest8.c (which I include below) or Rodolfo's 
equivalent, then the call sets this arg to both.  Give the code below a try.

---
                                        Reg.Clemens
                                        reg at dwf.com

-------------

#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <err.h>
#include <sys/types.h>
#include <time.h>
#include <timepps.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <termios.h>
#include <errno.h>
#include <sys/ioctl.h>

/* PPSAPI test */

void exit();

int
main(int argc, char **argv)
{
        int i, fd2, mode, fd1, ldisc;
        char Msg[200];
        struct stat stat1, stat2;
        u_int olda, oldc;
        pps_info_t pi;
        pps_params_t pp;
        pps_handle_t ph;
        char    *serial, *pps;

        olda = oldc = 0;
        if (argc != 3) {
                fprintf (stderr, "USAGE: <serial tty> <pps>\n");
                exit(1);
        }

        serial = argv[1];
        pps = argv[2];

        if ((fd1=open(serial, B9600, O_RDWR))< 0) {
                fprintf(stderr, "Cant open %s, error = %d\n", serial, fd1);
                perror("aa");
                exit(1);
        }

        i = ioctl(fd1, TIOCGETD, &ldisc);
        fprintf (stderr, "See TIOCGETD, i = %d, ldisc = %d\n", i, ldisc);
        /* can I stat a N_PPS ??? */

        i = stat (serial, &stat1);
        fprintf(stderr, "stat returns %d\n", i);

#define N_PPS 18
        fprintf(stderr, ">>>> Inside ifdef\n");
        /* linuxPPS specific Code */

        stat2.st_dev = stat2.st_ino = -1;
        ldisc = N_PPS;
fprintf(stderr, "Before IOCTL\n");
        if (ioctl(fd1, TIOCSETD, &ldisc)) {

                /* here could not set the line discipline, treat as tty */

                sprintf(Msg, "unable to set line discipline \"%d\" for device %s\n", ldisc, serial);
                fprintf(stderr, Msg);
                fprintf(stderr, "hope it's ok\n");
        }

fprintf(stderr, "After IOCTL\n");
        sleep(5);

        if ((fd2=open(pps, O_RDWR)) < 0) {
                fprintf(stderr, "Can't open fd2 (%s)\n", pps);
                exit(1);
        }

fprintf (stderr, "fd2 = %d\n", fd2);
        if ((i = time_pps_create(fd2, &ph)) < 0) {
                fprintf(stderr, "create returns %d\n", i);
                fprintf(stderr, "FAIL: time_pps_create\n");
                exit(1);
        }

/***************************************/

        if ((i = time_pps_getcap(ph, &mode)) < 0) {
                printf("FAIL: getcap %d\n", i);
                exit(1);
        }

        printf("getcap says 0x%x\n", mode);

/***************************************/
                perror("getparams:");
                exit (1);
        }

        printf("getparam is 0x%x\n", pp.mode);

/***************************************/

        mode =        PPS_CAPTURECLEAR ;     /* */
        pp.mode = mode;

        printf("set mode to 0x%x\n", pp.mode);

        if ((i = time_pps_setparams(ph, &pp)) <0) {
                printf("time_pps_setparams\n");
                perror("setparams:");
                exit (1);
        }

        if ((i = time_pps_getparams(ph, &pp)) <0) {
                printf("time_pps_getparams\n");
                perror("getparams:");
                exit (1);
        }

        printf("getparam is 0x%x\n", pp.mode);

/***************************************/

        mode =        PPS_CAPTUREBOTH  ;     /* */
        pp.mode = mode;

        printf("set mode to 0x%x\n", pp.mode);

        if ((i = time_pps_setparams(ph, &pp)) <0) {
                printf("time_pps_setparams\n");
                perror("setparams:");
                exit (1);
        }

        if ((i = time_pps_getparams(ph, &pp)) <0) {
                printf("time_pps_getparams\n");
                perror("getparams:");
                exit (1);
        }

        printf("getparam is 0x%x\n", pp.mode);

/***************************************/
                exit (1);
        }

        if ((i = time_pps_getparams(ph, &pp)) <0) {
                printf("time_pps_getparams\n");
                perror("getparams:");
                exit (1);
        }

        printf("getparam is 0x%x\n", pp.mode);

/***************************************/
        printf("Enter loop\n\n");

        while (1) {
                i = time_pps_fetch(ph, PPS_TSFMT_TSPEC, &pi, NULL);
                if (i < 0) {
                        err(1, "time_pps_fetch");
                        perror("fetch:");
                }

                if (olda != pi.assert_sequence || oldc != pi.clear_sequence) {
                        if ((i = time_pps_getparams(ph, &pp)) <0) {
                                printf("time_pps_getparams\n");
                                perror("getparams:");
                                exit (1);
                        }
                        printf("getparam is 0x%x\n", pp.mode);
                        printf("getparam assert is %ld  %07ld\n", pp.assert_offset.tv_sec, pp.assert
_offset.tv_nsec);
                        printf("getparam clear  is %ld  %07ld\n", pp.clear_offset.tv_sec, pp.clear_o
ffset.tv_nsec);

                        printf("A: %lu.%09ld #%lu     C: %lu.%09ld #%lu\n",
                            pi.assert_timestamp.tv_sec,
                            pi.assert_timestamp.tv_nsec,
                            pi.assert_sequence,

                            pi.clear_timestamp.tv_sec,
                            pi.clear_timestamp.tv_nsec,
                            pi.clear_sequence);

                        olda = pi.assert_sequence;
                        oldc = pi.clear_sequence;
                }
        }

        exit(0);
}


---




More information about the LinuxPPS mailing list