summaryrefslogtreecommitdiffstats
path: root/contrib/ntp/ntpd/refclock_palisade.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ntp/ntpd/refclock_palisade.c')
-rw-r--r--contrib/ntp/ntpd/refclock_palisade.c87
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;
OpenPOWER on IntegriCloud