diff options
author | roberto <roberto@FreeBSD.org> | 2004-07-20 15:01:56 +0000 |
---|---|---|
committer | roberto <roberto@FreeBSD.org> | 2004-07-20 15:01:56 +0000 |
commit | 118e757284cbb8fc4f43a713e892b41504b50a5f (patch) | |
tree | 528d12dda44ebdc3ffcc38050f159ac553a69c17 /contrib/ntp/ntpd/refclock_palisade.c | |
parent | a85d9ae25e8e8696677bc30feb6eaf7fc150e529 (diff) | |
download | FreeBSD-src-118e757284cbb8fc4f43a713e892b41504b50a5f.zip FreeBSD-src-118e757284cbb8fc4f43a713e892b41504b50a5f.tar.gz |
Virgin import of ntpd 4.2.0
Diffstat (limited to 'contrib/ntp/ntpd/refclock_palisade.c')
-rw-r--r-- | contrib/ntp/ntpd/refclock_palisade.c | 87 |
1 files changed, 79 insertions, 8 deletions
diff --git a/contrib/ntp/ntpd/refclock_palisade.c b/contrib/ntp/ntpd/refclock_palisade.c index 4b36b78..897221b 100644 --- a/contrib/ntp/ntpd/refclock_palisade.c +++ b/contrib/ntp/ntpd/refclock_palisade.c @@ -56,6 +56,11 @@ #include "config.h" #endif +#if defined(SYS_WINNT) +#undef close +#define close closesocket +#endif + #if defined(REFCLOCK) && (defined(PALISADE) || defined(CLOCK_PALISADE)) #include "refclock_palisade.h" @@ -88,6 +93,16 @@ struct refclock refclock_palisade = { int day_of_year P((char *dt)); +/* Extract the clock type from the mode setting */ +#define CLK_TYPE(x) ((int)(((x)->ttl) & 0x7F)) + +/* Supported clock types */ +#define CLK_TRIMBLE 0 /* Trimble Palisade */ +#define CLK_PRAECIS 1 /* Endrun Technologies Praecis */ + +int praecis_msg; +static void praecis_parse(struct recvbuf *rbufp, struct peer *peer); + /* * palisade_start - open the devices and initialize data for processing */ @@ -195,6 +210,19 @@ palisade_start ( memset((char *)up, 0, sizeof(struct palisade_unit)); + up->type = CLK_TYPE(peer); + switch (up->type) { + case CLK_TRIMBLE: + /* Normal mode, do nothing */ + break; + case CLK_PRAECIS: + msyslog(LOG_NOTICE, "Palisade(%d) Praecis mode enabled\n",unit); + break; + default: + msyslog(LOG_NOTICE, "Palisade(%d) mode unknown\n",unit); + break; + } + pp = peer->procptr; pp->io.clock_recv = palisade_io; pp->io.srcclock = (caddr_t)peer; @@ -335,7 +363,10 @@ TSIP_decode ( return 0; } - if (up->rpt_buf[0] == (char) 0x8f) { + /* + * We cast both to u_char to as 0x8f uses the sign bit on a char + */ + if ((u_char) up->rpt_buf[0] == (u_char) 0x8f) { /* * Superpackets */ @@ -385,7 +416,7 @@ if (debug > 1) { secint = (long) secs; secfrac = secs - secint; /* 0.0 <= secfrac < 1.0 */ - pp->usec = (long) (secfrac * 1000000); + pp->nsec = (long) (secfrac * 1000000000); secint %= 86400; /* Only care about today */ pp->hour = secint / 3600; @@ -402,7 +433,7 @@ if (debug > 1) { if (debug > 1) printf("TSIP_decode: unit %d: %02X #%d %02d:%02d:%02d.%06ld %02d/%02d/%04d UTC %02d\n", up->unit, mb(0) & 0xff, event, pp->hour, pp->minute, - pp->second, pp->usec, mb(12), mb(11), pp->year, GPS_UTC_Offset); + pp->second, pp->nsec, mb(12), mb(11), pp->year, GPS_UTC_Offset); #endif /* Only use this packet when no * 8F-AD's are being received @@ -463,7 +494,7 @@ if (debug > 1) { return 0; } - pp->usec = (long) (getdbl((u_char *) &mb(3)) * 1000000); + pp->nsec = (long) (getdbl((u_char *) &mb(3)) * 1000000); if ((pp->day = day_of_year(&mb(14))) < 0) break; @@ -476,7 +507,7 @@ if (debug > 1) { if (debug > 1) printf("TSIP_decode: unit %d: %02X #%d %02d:%02d:%02d.%06ld %02d/%02d/%04d UTC %02x %s\n", up->unit, mb(0) & 0xff, event, pp->hour, pp->minute, - pp->second, pp->usec, mb(15), mb(14), pp->year, + pp->second, pp->nsec, mb(15), mb(14), pp->year, mb(19), *Tracking_Status[st]); #endif return 1; @@ -534,7 +565,7 @@ palisade_receive ( printf( "palisade_receive: unit %d: %4d %03d %02d:%02d:%02d.%06ld\n", up->unit, pp->year, pp->day, pp->hour, pp->minute, - pp->second, pp->usec); + pp->second, pp->nsec); #endif /* @@ -544,7 +575,7 @@ palisade_receive ( */ (void) sprintf(pp->a_lastcode,"%4d %03d %02d:%02d:%02d.%06ld", - pp->year,pp->day,pp->hour,pp->minute, pp->second,pp->usec); + pp->year,pp->day,pp->hour,pp->minute, pp->second,pp->nsec); pp->lencode = 24; #ifdef PALISADE @@ -571,7 +602,7 @@ palisade_receive ( printf("palisade_receive: unit %d: %s\n", up->unit, prettydate(&pp->lastrec)); #endif - + pp->lastref = pp->lastrec; refclock_receive(peer #ifdef PALISADE , &pp->offset, 0, pp->dispersion, @@ -620,10 +651,43 @@ palisade_poll ( if (pp->sloppyclockflag & CLK_FLAG2) return; /* using synchronous packet input */ + if(up->type == CLK_PRAECIS) { + if(write(peer->procptr->io.fd,"SPSTAT\r\n",8) < 0) + msyslog(LOG_ERR, "Palisade(%d) write: %m:",unit); + else { + praecis_msg = 1; + return; + } + } + if (HW_poll(pp) < 0) refclock_report(peer, CEVNT_FAULT); } +static void +praecis_parse(struct recvbuf *rbufp, struct peer *peer) +{ + static char buf[100]; + static int p = 0; + struct refclockproc *pp; + + pp = peer->procptr; + + memcpy(buf+p,rbufp->recv_space.X_recv_buffer, rbufp->recv_length); + p += rbufp->recv_length; + + if(buf[p-2] == '\r' && buf[p-1] == '\n') { + buf[p-2] = '\0'; + record_clock_stats(&peer->srcadr, buf); + + p = 0; + praecis_msg = 0; + + if (HW_poll(pp) < 0) + refclock_report(peer, CEVNT_FAULT); + + } +} static void palisade_io ( @@ -649,6 +713,13 @@ palisade_io ( pp = peer->procptr; up = (struct palisade_unit *)pp->unitptr; + if(up->type == CLK_PRAECIS) { + if(praecis_msg) { + praecis_parse(rbufp,peer); + return; + } + } + c = (char *) &rbufp->recv_space; d = c + rbufp->recv_length; |