[Git][NTPsec/ntpsec][master] ntpd/refclock_trimble.c: Remove tabs, Single line /* comments to //
Hal Murray (@hal.murray)
gitlab at mg.gitlab.com
Thu Aug 6 19:02:05 UTC 2026
Hal Murray pushed to branch master at NTPsec / ntpsec
Commits:
96d607cb by Gary E. Miller at 2026-08-06T11:58:16-07:00
ntpd/refclock_trimble.c: Remove tabs, Single line /* comments to //
- - - - -
1 changed file:
- ntpd/refclock_trimble.c
Changes:
=====================================
ntpd/refclock_trimble.c
=====================================
@@ -41,34 +41,34 @@
/*
* GPS Definitions
*/
-#define DESCRIPTION "Trimble Palisade/Thunderbolt/Acutime/Resolution SMT/ACE/Copernicus GPSes" /* Long name */
-#define NAME "TRIMBLE" /* shortname */
-#define PRECISION (-20) /* precision assumed (about 1 us) */
-#define REFID "GPS\0" /* reference ID */
-#define TRMB_MINPOLL 4 /* 16 seconds */
-#define TRMB_MAXPOLL 5 /* 32 seconds */
-#define MIN_SAMPLES 7 /* minimum number of samples in the median filter to allow a poll */
+#define DESCRIPTION "Trimble Palisade/Thunderbolt/Acutime/Resolution SMT/ACE/Copernicus GPSes" // Long name
+#define NAME "TRIMBLE" // shortname
+#define PRECISION (-20) // precision assumed (about 1 us)
+#define REFID "GPS\0" // reference ID
+#define TRMB_MINPOLL 4 // 16 seconds
+#define TRMB_MAXPOLL 5 // 32 seconds
+#define MIN_SAMPLES 7 // minimum number of samples in the median filter to allow a poll
/*
* I/O Definitions
*/
#ifndef ENABLE_CLASSIC_MODE
-#define DEVICE "/dev/trimble%d" /* device name and unit */
+#define DEVICE "/dev/trimble%d" // device name and unit
#else
-#define DEVICE "/dev/palisade%d" /* device name and unit */
+#define DEVICE "/dev/palisade%d" // device name and unit
#endif
-#define SPEED232 B9600 /* uart speed (9600 baud) */
-#define SPEED232COP B38400 /* uart speed for Copernicus II (38400 baud) */
+#define SPEED232 B9600 // uart speed (9600 baud)
+#define SPEED232COP B38400 // uart speed for Copernicus II (38400 baud)
-/* parse consts */
-#define RMAX 172 /* TSIP packet 0x58 can be 172 bytes */
+// parse consts
+#define RMAX 172 // TSIP packet 0x58 can be 172 bytes
#define DLE 0x10
#define ETX 0x03
#define MSG_TSIP 0
#define MSG_PRAECIS 1
-#define SPSTAT_LEN 34 /* length of reply from Praecis SPSTAT message */
+#define SPSTAT_LEN 34 // length of reply from Praecis SPSTAT message
-/* parse states */
+// parse states
#define TSIP_PARSED_EMPTY 0
#define TSIP_PARSED_FULL 1
#define TSIP_PARSED_DLE_1 2
@@ -77,12 +77,12 @@
#define TSIP_PARSED_ASCII 5
#define TSIP_PARSED_PARITY 6
-#define mb(_X_) (up->rpt_buf[(_X_ + 1)]) /* shortcut for buffer access */
+#define mb(_X_) (up->rpt_buf[(_X_ + 1)]) // shortcut for buffer access
-/* Conversion Definitions */
+// Conversion Definitions
#ifdef DEBUG
-# define GPS_PI (3.1415926535898)
-# define R2D (180.0/GPS_PI)
+# define GPS_PI (3.1415926535898)
+# define R2D (180.0/GPS_PI)
#endif
/*
@@ -91,126 +91,126 @@
*/
struct packettx
{
- short size;
- uint8_t *data;
+ short size;
+ uint8_t *data;
};
/*
* Trimble unit control structure.
*/
struct trimble_unit {
- short unit; /* NTP refclock unit number */
- bool got_pkt; /* decoded a packet this poll */
- bool got_time; /* got a time packet this poll */
- int samples; /* samples in filter this poll */
- unsigned char UTC_flags; /* UTC & leap second flag */
- unsigned char trk_status; /* reported tracking status */
- char rpt_status; /* TSIP Parser State */
- size_t rpt_cnt; /* TSIP packet length so far */
- unsigned char rpt_buf[RMAX]; /* packet assembly buffer */
- int type; /* Clock mode type */
- bool use_event; /* receiver has event input */
- bool event_reply; /* response to event input has been received */
- int MCR; /* modem control register value at startup */
- bool parity_chk; /* enable parity checking */
- l_fp p_recv_time; /* timestamp of last received packet */
- unsigned int week; /* GPS week number */
- unsigned long int TOW; /* GPS time of week */
- int UTC_offset; /* GPS-UTC offset */
- struct calendar date; /* calendar to avoid leap early announce */
- unsigned int build_week; /* GPS week number of ntpd build date */
+ short unit; // NTP refclock unit number
+ bool got_pkt; // decoded a packet this poll
+ bool got_time; // got a time packet this poll
+ int samples; // samples in filter this poll
+ unsigned char UTC_flags; // UTC & leap second flag
+ unsigned char trk_status; // reported tracking status
+ char rpt_status; // TSIP Parser State
+ size_t rpt_cnt; // TSIP packet length so far
+ unsigned char rpt_buf[RMAX]; // packet assembly buffer
+ int type; // Clock mode type
+ bool use_event; // receiver has event input
+ bool event_reply; // response to event input has been received
+ int MCR; // modem control register value at startup
+ bool parity_chk; // enable parity checking
+ l_fp p_recv_time; // timestamp of last received packet
+ unsigned int week; // GPS week number
+ unsigned long int TOW; // GPS time of week
+ int UTC_offset; // GPS-UTC offset
+ struct calendar date; // calendar to avoid leap early announce
+ unsigned int build_week; // GPS week number of ntpd build date
};
/*
* Function prototypes
*/
-static bool trimble_start (int, struct peer *);
-static void trimble_poll (int, struct peer *);
-static void trimble_timer (int, struct peer *);
-static void trimble_io (struct recvbuf *);
-static void trimble_receive (struct peer *, int);
-static bool TSIP_decode (struct peer *);
-static void HW_poll (struct refclockproc *);
-static float getsgl (uint8_t *);
-static double getdbl (uint8_t *);
-static int16_t gets16 (uint8_t *);
-static uint16_t getu16 (uint8_t *);
-static uint32_t getu32 (uint8_t *);
-static void sendcmd (struct packettx *buffer, int c);
-static void sendsupercmd (struct packettx *buffer, int c1, int c2);
-static void sendbyte (struct packettx *buffer, int b);
-static void sendint (struct packettx *buffer, int a);
-static int sendetx (struct packettx *buffer, int fd);
-static void init_thunderbolt (int fd);
-static void init_resolution_smt (int fd);
+static bool trimble_start (int, struct peer *);
+static void trimble_poll (int, struct peer *);
+static void trimble_timer (int, struct peer *);
+static void trimble_io (struct recvbuf *);
+static void trimble_receive (struct peer *, int);
+static bool TSIP_decode (struct peer *);
+static void HW_poll (struct refclockproc *);
+static float getsgl (uint8_t *);
+static double getdbl (uint8_t *);
+static int16_t gets16 (uint8_t *);
+static uint16_t getu16 (uint8_t *);
+static uint32_t getu32 (uint8_t *);
+static void sendcmd (struct packettx *buffer, int c);
+static void sendsupercmd (struct packettx *buffer, int c1, int c2);
+static void sendbyte (struct packettx *buffer, int b);
+static void sendint (struct packettx *buffer, int a);
+static int sendetx (struct packettx *buffer, int fd);
+static void init_thunderbolt (int fd);
+static void init_resolution_smt (int fd);
#define PAL_TSTATS 14
#ifdef DEBUG
static const char tracking_status[PAL_TSTATS+1][16] = {
- "Doing Fixes", "Good 1SV", "Approx. 1SV", "Need Time", "Need INIT",
- "PDOP too High", "Bad 1SV", "0SV Usable", "1SV Usable", "2SV Usable",
- "3SV Usable", "No Integrity", "Diff Corr", "Overdet Clock", "Invalid"};
+ "Doing Fixes", "Good 1SV", "Approx. 1SV", "Need Time", "Need INIT",
+ "PDOP too High", "Bad 1SV", "0SV Usable", "1SV Usable", "2SV Usable",
+ "3SV Usable", "No Integrity", "Diff Corr", "Overdet Clock", "Invalid"};
#endif
static const bool tracking_status_usable[PAL_TSTATS+1] = {
- true, true, false, false, false,
- false, false, false, false, false,
- false, false, false, true, false};
+ true, true, false, false, false,
+ false, false, false, false, false,
+ false, false, false, true, false};
-#define TB_DECOD_STATS 16 /* convert TB decoding status to tracking_status */
+#define TB_DECOD_STATS 16 // convert TB decoding status to tracking_status
static const unsigned int tb_decod_conv[TB_DECOD_STATS+1] = {
- 0, 3, 14, 5, 14, 14, 14, 14, 7, 8, 9, 10, 6, 14, 14, 14, 11};
+ 0, 3, 14, 5, 14, 14, 14, 14, 7, 8, 9, 10, 6, 14, 14, 14, 11};
#define TB_DISC_MODES 7
#ifdef DEBUG
static const char tb_disc_mode[TB_DISC_MODES+1][16] = {
- "normal", "power-up", "auto holdover", "manual holdover",
- "recovery", "unknown", "disabled", "invalid"};
+ "normal", "power-up", "auto holdover", "manual holdover",
+ "recovery", "unknown", "disabled", "invalid"};
#endif
static const bool tb_disc_in_holdover[TB_DISC_MODES+1] = {
- false, false, true, true,
- false, false, false, false};
+ false, false, true, true,
+ false, false, false, false};
/*
* Transfer vector
*/
struct refclock refclock_trimble = {
- NAME, /* basename of driver */
- trimble_start, /* start up driver */
- NULL, /* shut down driver in the standard way */
- trimble_poll, /* transmit poll message */
- NULL, /* control - not used */
- NULL, /* initialize driver (not used) */
- trimble_timer /* called at 1Hz by mainloop */
+ NAME, // basename of driver
+ trimble_start, // start up driver
+ NULL, // shut down driver in the standard way
+ trimble_poll, // transmit poll message
+ NULL, // control - not used
+ NULL, // initialize driver (not used)
+ trimble_timer // called at 1Hz by mainloop
};
-/* Extract the clock type from the mode setting */
+// Extract the clock type from the mode setting
#define CLK_TYPE(x) ((int)(((x)->cfg.mode) & 0x7F))
-/* Supported clock types */
-#define CLK_PALISADE 0 /* Trimble Palisade */
-#define CLK_PRAECIS 1 /* Endrun Technologies Praecis */
-#define CLK_THUNDERBOLT 2 /* Trimble Thunderbolt GPS Receiver */
-#define CLK_ACUTIME 3 /* Trimble Acutime Gold */
-#define CLK_RESOLUTIONSMT 5 /* Trimble Resolution SMT Receivers */
-#define CLK_ACE 6 /* Trimble ACE III */
-#define CLK_COPERNICUS 7 /* Trimble Copernicus II */
+// Supported clock types
+#define CLK_PALISADE 0 // Trimble Palisade
+#define CLK_PRAECIS 1 // Endrun Technologies Praecis
+#define CLK_THUNDERBOLT 2 // Trimble Thunderbolt GPS Receiver
+#define CLK_ACUTIME 3 // Trimble Acutime Gold
+#define CLK_RESOLUTIONSMT 5 // Trimble Resolution SMT Receivers
+#define CLK_ACE 6 // Trimble ACE III
+#define CLK_COPERNICUS 7 // Trimble Copernicus II
-/* packet 8f-ad UTC flags */
-#define UTC_AVAILABLE 0x01
-#define LEAP_SCHEDULED 0x10
+// packet 8f-ad UTC flags
+#define UTC_AVAILABLE 0x01
+#define LEAP_SCHEDULED 0x10
/*
* sendcmd - Build data packet for sending
*/
static void
sendcmd (
- struct packettx *buffer,
- int c
- )
+ struct packettx *buffer,
+ int c
+ )
{
- *buffer->data = DLE;
- *(buffer->data + 1) = (unsigned char)c;
- buffer->size = 2;
+ *buffer->data = DLE;
+ *(buffer->data + 1) = (unsigned char)c;
+ buffer->size = 2;
}
/*
@@ -218,15 +218,15 @@ sendcmd (
*/
static void
sendsupercmd (
- struct packettx *buffer,
- int c1,
- int c2
- )
+ struct packettx *buffer,
+ int c1,
+ int c2
+ )
{
- *buffer->data = DLE;
- *(buffer->data + 1) = (unsigned char)c1;
- *(buffer->data + 2) = (unsigned char)c2;
- buffer->size = 3;
+ *buffer->data = DLE;
+ *(buffer->data + 1) = (unsigned char)c1;
+ *(buffer->data + 2) = (unsigned char)c2;
+ buffer->size = 3;
}
/*
@@ -234,14 +234,14 @@ sendsupercmd (
*/
static void
sendbyte (
- struct packettx *buffer,
- int b
- )
+ struct packettx *buffer,
+ int b
+ )
{
- if (b == DLE) {
- *(buffer->data+buffer->size++) = DLE;
- }
- *(buffer->data+buffer->size++) = (unsigned char)b;
+ if (b == DLE) {
+ *(buffer->data+buffer->size++) = DLE;
+ }
+ *(buffer->data+buffer->size++) = (unsigned char)b;
}
/*
@@ -249,12 +249,12 @@ sendbyte (
*/
static void
sendint (
- struct packettx *buffer,
- int a
- )
+ struct packettx *buffer,
+ int a
+ )
{
- sendbyte(buffer, (unsigned char)((a>>8) & 0xff));
- sendbyte(buffer, (unsigned char)(a & 0xff));
+ sendbyte(buffer, (unsigned char)((a>>8) & 0xff));
+ sendbyte(buffer, (unsigned char)(a & 0xff));
}
/*
@@ -262,77 +262,77 @@ sendint (
*/
static int
sendetx (
- struct packettx *buffer,
- int fd
- )
+ struct packettx *buffer,
+ int fd
+ )
{
- ssize_t result;
+ ssize_t result;
- *(buffer->data+buffer->size++) = DLE;
- *(buffer->data+buffer->size++) = ETX;
- result = write(fd, buffer->data, (size_t)buffer->size);
+ *(buffer->data+buffer->size++) = DLE;
+ *(buffer->data+buffer->size++) = ETX;
+ result = write(fd, buffer->data, (size_t)buffer->size);
- if (result != -1)
- return (result);
- else
- return (-1);
+ if (result != -1)
+ return (result);
+ else
+ return (-1);
}
/*
* init_thunderbolt - Prepares Thunderbolt receiver to be used with
- * NTP (also taken from Markus Prosch).
+ * NTP (also taken from Markus Prosch).
*/
static void
init_thunderbolt (
- int fd
- )
+ int fd
+ )
{
- struct packettx tx;
- uint8_t tx_data[10];
+ struct packettx tx;
+ uint8_t tx_data[10];
- tx.size = 0;
- tx.data = tx_data;
+ tx.size = 0;
+ tx.data = tx_data;
- /* set UTC time */
- sendsupercmd (&tx, 0x8E, 0xA2);
- sendbyte (&tx, 0x3);
- sendetx (&tx, fd);
+ // set UTC time
+ sendsupercmd (&tx, 0x8E, 0xA2);
+ sendbyte (&tx, 0x3);
+ sendetx (&tx, fd);
- /* activate packets 0x8F-AB and 0x8F-AC */
- sendsupercmd (&tx, 0x8E, 0xA5);
- sendint (&tx, 0x5);
- sendetx (&tx, fd);
+ // activate packets 0x8F-AB and 0x8F-AC
+ sendsupercmd (&tx, 0x8E, 0xA5);
+ sendint (&tx, 0x5);
+ sendetx (&tx, fd);
}
/*
* init_resolution_smt - Prepares Resolution SMT receiver to be used with
- * NTP (also taken from Markus Prosch).
+ * NTP (also taken from Markus Prosch).
*/
static void
init_resolution_smt (
- int fd
- )
+ int fd
+ )
{
- struct packettx tx;
- uint8_t tx_data[10];
-
- tx.size = 0;
- tx.data = tx_data;
-
- /* set UTC time */
- sendsupercmd (&tx, 0x8E, 0xA2);
- sendbyte (&tx, 0x3);
- sendetx (&tx, fd);
-
- /* squelch PPS output unless locked to at least one satellite */
- sendsupercmd (&tx, 0x8E, 0x4E);
- sendbyte (&tx, 0x3);
- sendetx (&tx, fd);
-
- /* activate packets 0x8F-AB and 0x8F-AC */
- sendsupercmd (&tx, 0x8E, 0xA5);
- sendint (&tx, 0x5);
- sendetx (&tx, fd);
+ struct packettx tx;
+ uint8_t tx_data[10];
+
+ tx.size = 0;
+ tx.data = tx_data;
+
+ // set UTC time
+ sendsupercmd (&tx, 0x8E, 0xA2);
+ sendbyte (&tx, 0x3);
+ sendetx (&tx, fd);
+
+ // squelch PPS output unless locked to at least one satellite
+ sendsupercmd (&tx, 0x8E, 0x4E);
+ sendbyte (&tx, 0x3);
+ sendetx (&tx, fd);
+
+ // activate packets 0x8F-AB and 0x8F-AC
+ sendsupercmd (&tx, 0x8E, 0xA5);
+ sendint (&tx, 0x5);
+ sendetx (&tx, fd);
}
/*
@@ -340,230 +340,230 @@ init_resolution_smt (
*/
static bool
trimble_start (
- int unit,
- struct peer *peer
- )
+ int unit,
+ struct peer *peer
+ )
{
- struct trimble_unit *up;
- struct refclockproc *pp;
- int fd;
- struct termios tio;
- speed_t desired_speed;
- struct calendar build_date;
- unsigned int cflag, iflag;
- char device[20], *path;
-
- pp = peer->procptr;
- pp->clockname = NAME;
-
- /* Open serial port. */
- if (peer->cfg.path)
- path = peer->cfg.path;
- else
- {
- int rcode;
- snprintf(device, sizeof(device), DEVICE, unit);
-
- /* build a path */
- rcode = snprintf(device, sizeof(device), DEVICE, unit);
- if ( 0 > rcode ) {
- /* failed, set to NUL */
- device[0] = '\0';
- }
- path = device;
+ struct trimble_unit *up;
+ struct refclockproc *pp;
+ int fd;
+ struct termios tio;
+ speed_t desired_speed;
+ struct calendar build_date;
+ unsigned int cflag, iflag;
+ char device[20], *path;
+
+ pp = peer->procptr;
+ pp->clockname = NAME;
+
+ // Open serial port.
+ if (peer->cfg.path)
+ path = peer->cfg.path;
+ else
+ {
+ int rcode;
+ snprintf(device, sizeof(device), DEVICE, unit);
+
+ // build a path
+ rcode = snprintf(device, sizeof(device), DEVICE, unit);
+ if ( 0 > rcode ) {
+ // failed, set to NUL
+ device[0] = '\0';
+ }
+ path = device;
+ }
+ fd = refclock_open(path,
+ peer->cfg.baud ? peer->cfg.baud :
+ (CLK_TYPE(peer) == CLK_COPERNICUS) ? SPEED232COP : SPEED232,
+ LDISC_RAW);
+ if (0 > fd) {
+ msyslog(LOG_ERR, "REFCLOCK: %s Trimble device open(%s) failed",
+ refclock_name(peer), path);
+ // coverity[leaked_handle]
+ return false;
+ }
+
+ LOGIF(CLOCKINFO, (LOG_NOTICE, "%s open at %s",
+ refclock_name(peer), path));
+
+ if (tcgetattr(fd, &tio) < 0) {
+ msyslog(LOG_ERR, "REFCLOCK: %s tcgetattr failed: %s",
+ refclock_name(peer), strerror(errno));
+ close(fd);
+ return false;
+ }
+
+ // Allocate and initialize unit structure
+ up = emalloc_zero(sizeof(*up));
+
+ up->type = CLK_TYPE(peer);
+ up->parity_chk = true;
+ up->use_event = true;
+ pp->disp = 1000 * S_PER_NS; // extra ~500ns for serial port delay
+
+ switch (up->type) {
+ case CLK_PALISADE:
+ msyslog(LOG_NOTICE, "REFCLOCK: %s Palisade mode enabled",
+ refclock_name(peer));
+ break;
+ case CLK_PRAECIS:
+ msyslog(LOG_NOTICE, "REFCLOCK: %s Praecis mode enabled",
+ refclock_name(peer));
+ // account for distance to tower
+ pp->disp = .00002;
+ break;
+ case CLK_THUNDERBOLT:
+ msyslog(LOG_NOTICE, "REFCLOCK: %s Thunderbolt mode enabled",
+ refclock_name(peer));
+ up->parity_chk = false;
+ up->use_event = false;
+ /*
+ * packet transmission delay varies from 9ms to 32ms depending
+ * on the number of SVs the receiver is attempting to track
+ */
+ pp->disp = .023;
+ break;
+ case CLK_ACUTIME:
+ msyslog(LOG_NOTICE, "REFCLOCK: %s Acutime Gold mode enabled",
+ refclock_name(peer));
+ break;
+ case CLK_RESOLUTIONSMT:
+ msyslog(LOG_NOTICE, "REFCLOCK: %s Resolution SMT mode enabled",
+ refclock_name(peer));
+ up->use_event = false;
+ break;
+ case CLK_ACE:
+ msyslog(LOG_NOTICE, "REFCLOCK: %s ACE III mode enabled",
+ refclock_name(peer));
+ break;
+ case CLK_COPERNICUS:
+ msyslog(LOG_NOTICE, "REFCLOCK: %s Copernicus II mode enabled",
+ refclock_name(peer));
+ up->use_event = false;
+ up->parity_chk = false;
+ break;
+ default:
+ msyslog(LOG_NOTICE, "REFCLOCK: %s mode unknown",
+ refclock_name(peer));
+ close(fd);
+ free(up);
+ return false;
+ }
+ tio.c_cflag = (CS8|CLOCAL|CREAD);
+ tio.c_iflag &= (unsigned)~ICRNL;
+ if (up->parity_chk) {
+ tio.c_cflag |= (PARENB|PARODD);
+ tio.c_iflag &= (unsigned)~IGNPAR;
+ tio.c_iflag |= (INPCK|PARMRK);
+ }
+ cflag = tio.c_cflag;
+ iflag = tio.c_iflag;
+ if (tcsetattr(fd, TCSANOW, &tio) == -1 || tcgetattr(fd, &tio) == -1 ||
+ tio.c_cflag != cflag || tio.c_iflag != iflag) {
+ msyslog(LOG_ERR, "REFCLOCK: %s tcsetattr failed: wanted cflag 0x%x got 0x%x, wanted iflag 0x%x got 0x%x, return: %s",
+ refclock_name(peer), cflag, (unsigned int)tio.c_cflag,
+ iflag, (unsigned int)tio.c_iflag, strerror(errno));
+ close(fd);
+ free(up);
+ return false;
+ }
+ /*
+ * On some OS's, the calls to tcsetattr and tcgetattr above reset the baud
+ * rate to 0 as a side effect. Surprisingly, this doesn't appear to affect
+ * the operation of devices running at 9600 baud but it certainly does
+ * affect the 38400 baud Copernicus II.
+ * As a workaround, apply the baud rate once more here.
+ */
+ desired_speed = peer->cfg.baud ? peer->cfg.baud :
+ (CLK_TYPE(peer) == CLK_COPERNICUS) ? SPEED232COP : SPEED232;
+ if (cfsetispeed(&tio, desired_speed) == -1 || cfsetospeed(&tio, desired_speed) == -1 ||
+ tcsetattr(fd, TCSANOW, &tio) == -1) {
+ msyslog(LOG_ERR, "REFCLOCK: %s: failed to set device baud rate",
+ refclock_name(peer));
+ close(fd);
+ free(up);
+ return false;
+ }
+
+ if (up->use_event && (up->type != CLK_ACE)) {
+ /*
+ * The width of the RTS pulse must be either less than 5us or
+ * greater than 600ms or the Acutime 2000 may try to switch its
+ * port A baud rate because of "Auto-DGPS". The Praecis will
+ * produce unstable timestamps (-7us instead of +-40ns offsets)
+ * when pulse width is more than a few us and less than 100us.
+ * Palisade minimum puse width is specified as 1us. To satisfy
+ * these constraints the RTS pin is idled with a positive
+ * voltage and pulsed negative.
+ */
+ if (ioctl(fd, TIOCMGET, &up->MCR) < 0) {
+ msyslog(LOG_ERR, "REFCLOCK: %s TIOCMGET failed: %s",
+ refclock_name(peer), strerror(errno));
+ close(fd);
+ free(up);
+ return false;
+ }
+ up->MCR |= TIOCM_RTS;
+ if (ioctl(fd, TIOCMSET, &up->MCR) < 0 ||
+ !(up->MCR & TIOCM_RTS)) {
+ msyslog(LOG_ERR, "REFCLOCK: %s TIOCMSET failed: MCR=0x%x, return=%s",
+ refclock_name(peer), (unsigned int)up->MCR, strerror(errno));
+ close(fd);
+ free(up);
+ return false;
+ }
+ }
+ pp->io.clock_recv = trimble_io;
+ pp->io.srcclock = peer;
+ pp->io.datalen = 0;
+ pp->io.fd = fd;
+ if (!io_addclock(&pp->io)) {
+ msyslog(LOG_ERR, "%s io_addclock failed", refclock_name(peer));
+ close(fd);
+ pp->io.fd = -1;
+ free(up);
+ return false;
+ }
+
+ // Initialize miscellaneous variables
+ pp->unitptr = up;
+ pp->clockdesc = DESCRIPTION;
+
+ peer->precision = PRECISION;
+ peer->sstclktype = CTL_SST_TS_UHF;
+ peer->cfg.minpoll = TRMB_MINPOLL;
+ peer->cfg.maxpoll = TRMB_MAXPOLL;
+ memcpy((char *)&pp->refid, REFID, REFIDLEN);
+
+ up->unit = (short) unit;
+ up->rpt_status = TSIP_PARSED_EMPTY;
+ up->rpt_cnt = 0;
+
+ if (ntpcal_get_build_date(&build_date)) {
+ caltogps(&build_date, 0, &up->build_week, NULL);
+ up->build_week -= 2; // timezone, UTC offset, build machine clock
+ } else {
+ up->build_week = 0;
+ }
+ if (up->build_week < MIN_BUILD_GPSWEEK || up->build_week > MAX_BUILD_GPSWEEK) {
+ msyslog(LOG_ERR,
+ "REFCLOCK: %s ntpcal_get_build_date() failed: %u",
+ refclock_name(peer), up->build_week);
+ close(fd);
+ pp->io.fd = -1;
+ free(up);
+ return false;
+ }
+
+ if (up->type == CLK_THUNDERBOLT) {
+ init_thunderbolt(fd);
}
- fd = refclock_open(path,
- peer->cfg.baud ? peer->cfg.baud :
- (CLK_TYPE(peer) == CLK_COPERNICUS) ? SPEED232COP : SPEED232,
- LDISC_RAW);
- if (0 > fd) {
- msyslog(LOG_ERR, "REFCLOCK: %s Trimble device open(%s) failed",
- refclock_name(peer), path);
- /* coverity[leaked_handle] */
- return false;
- }
-
- LOGIF(CLOCKINFO, (LOG_NOTICE, "%s open at %s",
- refclock_name(peer), path));
-
- if (tcgetattr(fd, &tio) < 0) {
- msyslog(LOG_ERR, "REFCLOCK: %s tcgetattr failed: %s",
- refclock_name(peer), strerror(errno));
- close(fd);
- return false;
- }
-
- /* Allocate and initialize unit structure */
- up = emalloc_zero(sizeof(*up));
-
- up->type = CLK_TYPE(peer);
- up->parity_chk = true;
- up->use_event = true;
- pp->disp = 1000 * S_PER_NS; /* extra ~500ns for serial port delay */
-
- switch (up->type) {
- case CLK_PALISADE:
- msyslog(LOG_NOTICE, "REFCLOCK: %s Palisade mode enabled",
- refclock_name(peer));
- break;
- case CLK_PRAECIS:
- msyslog(LOG_NOTICE, "REFCLOCK: %s Praecis mode enabled",
- refclock_name(peer));
- /* account for distance to tower */
- pp->disp = .00002;
- break;
- case CLK_THUNDERBOLT:
- msyslog(LOG_NOTICE, "REFCLOCK: %s Thunderbolt mode enabled",
- refclock_name(peer));
- up->parity_chk = false;
- up->use_event = false;
- /*
- * packet transmission delay varies from 9ms to 32ms depending
- * on the number of SVs the receiver is attempting to track
- */
- pp->disp = .023;
- break;
- case CLK_ACUTIME:
- msyslog(LOG_NOTICE, "REFCLOCK: %s Acutime Gold mode enabled",
- refclock_name(peer));
- break;
- case CLK_RESOLUTIONSMT:
- msyslog(LOG_NOTICE, "REFCLOCK: %s Resolution SMT mode enabled",
- refclock_name(peer));
- up->use_event = false;
- break;
- case CLK_ACE:
- msyslog(LOG_NOTICE, "REFCLOCK: %s ACE III mode enabled",
- refclock_name(peer));
- break;
- case CLK_COPERNICUS:
- msyslog(LOG_NOTICE, "REFCLOCK: %s Copernicus II mode enabled",
- refclock_name(peer));
- up->use_event = false;
- up->parity_chk = false;
- break;
- default:
- msyslog(LOG_NOTICE, "REFCLOCK: %s mode unknown",
- refclock_name(peer));
- close(fd);
- free(up);
- return false;
- }
- tio.c_cflag = (CS8|CLOCAL|CREAD);
- tio.c_iflag &= (unsigned)~ICRNL;
- if (up->parity_chk) {
- tio.c_cflag |= (PARENB|PARODD);
- tio.c_iflag &= (unsigned)~IGNPAR;
- tio.c_iflag |= (INPCK|PARMRK);
- }
- cflag = tio.c_cflag;
- iflag = tio.c_iflag;
- if (tcsetattr(fd, TCSANOW, &tio) == -1 || tcgetattr(fd, &tio) == -1 ||
- tio.c_cflag != cflag || tio.c_iflag != iflag) {
- msyslog(LOG_ERR, "REFCLOCK: %s tcsetattr failed: wanted cflag 0x%x got 0x%x, wanted iflag 0x%x got 0x%x, return: %s",
- refclock_name(peer), cflag, (unsigned int)tio.c_cflag,
- iflag, (unsigned int)tio.c_iflag, strerror(errno));
- close(fd);
- free(up);
- return false;
- }
- /*
- * On some OS's, the calls to tcsetattr and tcgetattr above reset the baud
- * rate to 0 as a side effect. Surprisingly, this doesn't appear to affect
- * the operation of devices running at 9600 baud but it certainly does
- * affect the 38400 baud Copernicus II.
- * As a workaround, apply the baud rate once more here.
- */
- desired_speed = peer->cfg.baud ? peer->cfg.baud :
- (CLK_TYPE(peer) == CLK_COPERNICUS) ? SPEED232COP : SPEED232;
- if (cfsetispeed(&tio, desired_speed) == -1 || cfsetospeed(&tio, desired_speed) == -1 ||
- tcsetattr(fd, TCSANOW, &tio) == -1) {
- msyslog(LOG_ERR, "REFCLOCK: %s: failed to set device baud rate",
- refclock_name(peer));
- close(fd);
- free(up);
- return false;
- }
-
- if (up->use_event && (up->type != CLK_ACE)) {
- /*
- * The width of the RTS pulse must be either less than 5us or
- * greater than 600ms or the Acutime 2000 may try to switch its
- * port A baud rate because of "Auto-DGPS". The Praecis will
- * produce unstable timestamps (-7us instead of +-40ns offsets)
- * when pulse width is more than a few us and less than 100us.
- * Palisade minimum puse width is specified as 1us. To satisfy
- * these constraints the RTS pin is idled with a positive
- * voltage and pulsed negative.
- */
- if (ioctl(fd, TIOCMGET, &up->MCR) < 0) {
- msyslog(LOG_ERR, "REFCLOCK: %s TIOCMGET failed: %s",
- refclock_name(peer), strerror(errno));
- close(fd);
- free(up);
- return false;
- }
- up->MCR |= TIOCM_RTS;
- if (ioctl(fd, TIOCMSET, &up->MCR) < 0 ||
- !(up->MCR & TIOCM_RTS)) {
- msyslog(LOG_ERR, "REFCLOCK: %s TIOCMSET failed: MCR=0x%x, return=%s",
- refclock_name(peer), (unsigned int)up->MCR, strerror(errno));
- close(fd);
- free(up);
- return false;
- }
- }
- pp->io.clock_recv = trimble_io;
- pp->io.srcclock = peer;
- pp->io.datalen = 0;
- pp->io.fd = fd;
- if (!io_addclock(&pp->io)) {
- msyslog(LOG_ERR, "%s io_addclock failed", refclock_name(peer));
- close(fd);
- pp->io.fd = -1;
- free(up);
- return false;
- }
-
- /* Initialize miscellaneous variables */
- pp->unitptr = up;
- pp->clockdesc = DESCRIPTION;
-
- peer->precision = PRECISION;
- peer->sstclktype = CTL_SST_TS_UHF;
- peer->cfg.minpoll = TRMB_MINPOLL;
- peer->cfg.maxpoll = TRMB_MAXPOLL;
- memcpy((char *)&pp->refid, REFID, REFIDLEN);
-
- up->unit = (short) unit;
- up->rpt_status = TSIP_PARSED_EMPTY;
- up->rpt_cnt = 0;
-
- if (ntpcal_get_build_date(&build_date)) {
- caltogps(&build_date, 0, &up->build_week, NULL);
- up->build_week -= 2; /* timezone, UTC offset, build machine clock */
- } else {
- up->build_week = 0;
- }
- if (up->build_week < MIN_BUILD_GPSWEEK || up->build_week > MAX_BUILD_GPSWEEK) {
- msyslog(LOG_ERR,
- "REFCLOCK: %s ntpcal_get_build_date() failed: %u",
- refclock_name(peer), up->build_week);
- close(fd);
- pp->io.fd = -1;
- free(up);
- return false;
- }
-
- if (up->type == CLK_THUNDERBOLT) {
- init_thunderbolt(fd);
- }
-
- if (up->type == CLK_RESOLUTIONSMT) {
- init_resolution_smt(fd);
- }
-
- return true;
+
+ if (up->type == CLK_RESOLUTIONSMT) {
+ init_resolution_smt(fd);
+ }
+
+ return true;
}
/*
@@ -571,400 +571,400 @@ trimble_start (
*/
static bool
TSIP_decode (
- struct peer *peer
- )
+ struct peer *peer
+ )
{
- unsigned char id, decod_stat, disc_mode, timing_flags;
- long secint;
- double secs, secfrac;
- unsigned short event, m_alarms;
- uint32_t holdover_t;
- float TOWfloat;
- uint32_t lastrec_frac;
-
- struct trimble_unit *up;
- struct refclockproc *pp;
-
- pp = peer->procptr;
- up = pp->unitptr;
- id = (unsigned char)up->rpt_buf[0];
-
- if (id == 0x8f) {
- /* Superpackets */
- event = getu16(&mb(1));
- if ((up->type != CLK_THUNDERBOLT) && (up->type != CLK_RESOLUTIONSMT) && !event)
- /* ignore auto-report */
- return false;
-
- switch (mb(0) & 0xff) {
- case 0x0B:
- /*
- * comprehensive time packet: sent after 8f-ad from
- * Palisade and Acutime
- */
- if (up->rpt_cnt != 74) {
- DPRINT(1, ("TSIP_decode: unit %d: 8f-0b packet length is not 74 (%d)\n",
- up->unit, (int)up->rpt_cnt));
- refclock_report(peer, CEVNT_BADREPLY);
- return false;
- }
- up->got_time = true;
+ unsigned char id, decod_stat, disc_mode, timing_flags;
+ long secint;
+ double secs, secfrac;
+ unsigned short event, m_alarms;
+ uint32_t holdover_t;
+ float TOWfloat;
+ uint32_t lastrec_frac;
+
+ struct trimble_unit *up;
+ struct refclockproc *pp;
+
+ pp = peer->procptr;
+ up = pp->unitptr;
+ id = (unsigned char)up->rpt_buf[0];
+
+ if (id == 0x8f) {
+ // Superpackets
+ event = getu16(&mb(1));
+ if ((up->type != CLK_THUNDERBOLT) && (up->type != CLK_RESOLUTIONSMT) && !event)
+ // ignore auto-report
+ return false;
+
+ switch (mb(0) & 0xff) {
+ case 0x0B:
+ /*
+ * comprehensive time packet: sent after 8f-ad from
+ * Palisade and Acutime
+ */
+ if (up->rpt_cnt != 74) {
+ DPRINT(1, ("TSIP_decode: unit %d: 8f-0b packet length is not 74 (%d)\n",
+ up->unit, (int)up->rpt_cnt));
+ refclock_report(peer, CEVNT_BADREPLY);
+ return false;
+ }
+ up->got_time = true;
#ifdef DEBUG
- if (debug > 1) { /* SPECIAL DEBUG */
- int st, ts;
- double lat, lon, alt;
- lat = getdbl(&mb(42)) * R2D;
- lon = getdbl(&mb(50)) * R2D;
- alt = getdbl(&mb(58));
-
- printf("TSIP_decode: unit %d: Latitude: %03.4f Longitude: %03.4f Alt: %05.2f m\n",
- up->unit, lat,lon,alt);
- printf("TSIP_decode: unit %d: Sats:",
- up->unit);
- for (st = 66, ts = 0; st <= 73; st++)
- if (mb(st)) {
- if (mb(st) > 0) ts++;
- printf(" %02d", mb(st));
- }
- printf(" : Tracking %d\n", ts);
- }
+ if (debug > 1) { // SPECIAL DEBUG
+ int st, ts;
+ double lat, lon, alt;
+ lat = getdbl(&mb(42)) * R2D;
+ lon = getdbl(&mb(50)) * R2D;
+ alt = getdbl(&mb(58));
+
+ printf("TSIP_decode: unit %d: Latitude: %03.4f Longitude: %03.4f Alt: %05.2f m\n",
+ up->unit, lat,lon,alt);
+ printf("TSIP_decode: unit %d: Sats:",
+ up->unit);
+ for (st = 66, ts = 0; st <= 73; st++)
+ if (mb(st)) {
+ if (mb(st) > 0) ts++;
+ printf(" %02d", mb(st));
+ }
+ printf(" : Tracking %d\n", ts);
+ }
#endif
- if (!tracking_status_usable[up->trk_status]) {
- DPRINT(1, ("TSIP_decode: unit %d: unusable tracking status: %s\n",
- up->unit,
- tracking_status[up->trk_status]));
- return false;
- }
- up->UTC_offset = gets16(&mb(16));
- if (!(up->UTC_flags & UTC_AVAILABLE) ||
- (up->UTC_offset == 0)) {
- pp->leap = LEAP_NOTINSYNC;
- DPRINT(1, ("TSIP_decode: unit %d: UTC data not available\n",
- up->unit));
- return false;
- }
-
- secs = getdbl(&mb(3));
- secint = (long) secs;
- secfrac = secs - secint; /* 0.0 <= secfrac < 1.0 */
-
- pp->nsec = (long) (secfrac * NS_PER_S);
-
- secint %= SECSPERDAY; /* Only care about today */
- up->date.hour = (int)(secint / SECSPERHR);
- secint %= SECSPERHR;
- up->date.minute = (int)(secint / 60);
- secint %= 60;
- up->date.second = secint % 60;
- up->date.monthday = mb(11);
- up->date.month = mb(12);
- up->date.year = getu16(&mb(13));
- up->date.yearday = 0;
- caltogps(&up->date, up->UTC_offset, &up->week, &up->TOW);
- gpsweekadj(&up->week, up->build_week);
- gpstocal(up->week, up->TOW, up->UTC_offset, &up->date);
-
- if ((up->UTC_flags & LEAP_SCHEDULED) &&
- /* Avoid early announce: https://bugs.ntp.org/2773 */
- (6 == up->date.month || 12 == up->date.month))
- pp->leap = LEAP_ADDSECOND;
- else
- pp->leap = LEAP_NOWARNING;
-
- DPRINT(2, ("TSIP_decode: unit %d: 8f-0b #%d %02d:%02d:%02d.%09ld %02d/%02d/%04d UTC %d\n tracking status: %s\n",
- up->unit, event, up->date.hour, up->date.minute,
- up->date.second, pp->nsec, up->date.month,
- up->date.monthday, up->date.year,
- up->UTC_offset, tracking_status[up->trk_status]));
-
- /* don't reuse UTC flags or tracking status */
- up->UTC_flags = 0;
- up->trk_status = PAL_TSTATS;
- return true;
- break;
-
- case 0xAD:
- /*
- * primary UTC time packet: first packet sent after PPS
- * from Palisade, Acutime, and Praecis
- */
- if (up->rpt_cnt != 22) {
- DPRINT(1, ("TSIP_decode: unit %d: 8f-ad packet length is not 22 (%d)\n",
- up->unit, (int)up->rpt_cnt));
- refclock_report(peer, CEVNT_BADREPLY);
- return false;
- }
-
- /* flags checked in 8f-0b for Palisade and Acutime */
- up->trk_status = mb(18);
- if (up->trk_status > PAL_TSTATS) {
- up->trk_status = PAL_TSTATS;
+ if (!tracking_status_usable[up->trk_status]) {
+ DPRINT(1, ("TSIP_decode: unit %d: unusable tracking status: %s\n",
+ up->unit,
+ tracking_status[up->trk_status]));
+ return false;
+ }
+ up->UTC_offset = gets16(&mb(16));
+ if (!(up->UTC_flags & UTC_AVAILABLE) ||
+ (up->UTC_offset == 0)) {
+ pp->leap = LEAP_NOTINSYNC;
+ DPRINT(1, ("TSIP_decode: unit %d: UTC data not available\n",
+ up->unit));
+ return false;
+ }
+
+ secs = getdbl(&mb(3));
+ secint = (long) secs;
+ secfrac = secs - secint; // 0.0 <= secfrac < 1.0
+
+ pp->nsec = (long) (secfrac * NS_PER_S);
+
+ secint %= SECSPERDAY; // Only care about today
+ up->date.hour = (int)(secint / SECSPERHR);
+ secint %= SECSPERHR;
+ up->date.minute = (int)(secint / 60);
+ secint %= 60;
+ up->date.second = secint % 60;
+ up->date.monthday = mb(11);
+ up->date.month = mb(12);
+ up->date.year = getu16(&mb(13));
+ up->date.yearday = 0;
+ caltogps(&up->date, up->UTC_offset, &up->week, &up->TOW);
+ gpsweekadj(&up->week, up->build_week);
+ gpstocal(up->week, up->TOW, up->UTC_offset, &up->date);
+
+ if ((up->UTC_flags & LEAP_SCHEDULED) &&
+ // Avoid early announce: https://bugs.ntp.org/2773
+ (6 == up->date.month || 12 == up->date.month))
+ pp->leap = LEAP_ADDSECOND;
+ else
+ pp->leap = LEAP_NOWARNING;
+
+ DPRINT(2, ("TSIP_decode: unit %d: 8f-0b #%d %02d:%02d:%02d.%09ld %02d/%02d/%04d UTC %d\n tracking status: %s\n",
+ up->unit, event, up->date.hour, up->date.minute,
+ up->date.second, pp->nsec, up->date.month,
+ up->date.monthday, up->date.year,
+ up->UTC_offset, tracking_status[up->trk_status]));
+
+ // don't reuse UTC flags or tracking status
+ up->UTC_flags = 0;
+ up->trk_status = PAL_TSTATS;
+ return true;
+ break;
+
+ case 0xAD:
+ /*
+ * primary UTC time packet: first packet sent after PPS
+ * from Palisade, Acutime, and Praecis
+ */
+ if (up->rpt_cnt != 22) {
+ DPRINT(1, ("TSIP_decode: unit %d: 8f-ad packet length is not 22 (%d)\n",
+ up->unit, (int)up->rpt_cnt));
+ refclock_report(peer, CEVNT_BADREPLY);
+ return false;
+ }
+
+ // flags checked in 8f-0b for Palisade and Acutime
+ up->trk_status = mb(18);
+ if (up->trk_status > PAL_TSTATS) {
+ up->trk_status = PAL_TSTATS;
}
- up->UTC_flags = mb(19);
-
- /* get timecode from 8f-0b except with Praecis */
- if (up->type != CLK_PRAECIS)
- return false;
-
- if (!tracking_status_usable[up->trk_status]) {
- DPRINT(1, ("TSIP_decode: unit %d: unusable tracking status: %s\n",
- up->unit,
- tracking_status[up->trk_status]));
- return false;
- }
- if (!(up->UTC_flags & UTC_AVAILABLE)) {
- pp->leap = LEAP_NOTINSYNC;
- DPRINT(1, ("TSIP_decode: unit %d: UTC data not available\n",
- up->unit));
- return false;
- }
-
- pp->nsec = (long) (getdbl(&mb(3)) * NS_PER_S);
- up->date.year = getu16(&mb(16));
- up->date.hour = mb(11);
- up->date.minute = mb(12);
- up->date.second = mb(13);
- up->date.month = mb(15);
- up->date.monthday = mb(14);
- caltogps(&up->date, 0, &up->week, &up->TOW);
- gpsweekadj(&up->week, up->build_week);
- gpstocal(up->week, up->TOW, 0, &up->date);
-
- if ((up->UTC_flags & LEAP_SCHEDULED) &&
- /* Avoid early announce: https://bugs.ntp.org/2773 */
- (6 == up->date.month || 12 == up->date.month))
- pp->leap = LEAP_ADDSECOND;
- else
- pp->leap = LEAP_NOWARNING;
-
- DPRINT(2, ("TSIP_decode: unit %d: 8f-ad #%d %02d:%02d:%02d.%09ld %02d/%02d/%04d UTC 0x%02x\n tracking status: %s\n",
- up->unit, event, up->date.hour, up->date.minute,
- up->date.second, pp->nsec, up->date.month,
- up->date.monthday, up->date.year,
- up->UTC_flags, tracking_status[up->trk_status]));
- return true;
- break;
-
- case 0xAC:
- /*
- * supplemental timing packet: sent after 8f-ab from
- * Thunderbolt and Resolution SMT
- */
- if (up->rpt_cnt != 68) {
- DPRINT(1, ("TSIP_decode: unit %d: 8f-ac packet length is not 68 (%d)\n",
- up->unit, (int)up->rpt_cnt));
- refclock_report(peer, CEVNT_BADREPLY);
- return false;
- }
- up->got_time = true;
+ up->UTC_flags = mb(19);
+
+ // get timecode from 8f-0b except with Praecis
+ if (up->type != CLK_PRAECIS)
+ return false;
+
+ if (!tracking_status_usable[up->trk_status]) {
+ DPRINT(1, ("TSIP_decode: unit %d: unusable tracking status: %s\n",
+ up->unit,
+ tracking_status[up->trk_status]));
+ return false;
+ }
+ if (!(up->UTC_flags & UTC_AVAILABLE)) {
+ pp->leap = LEAP_NOTINSYNC;
+ DPRINT(1, ("TSIP_decode: unit %d: UTC data not available\n",
+ up->unit));
+ return false;
+ }
+
+ pp->nsec = (long) (getdbl(&mb(3)) * NS_PER_S);
+ up->date.year = getu16(&mb(16));
+ up->date.hour = mb(11);
+ up->date.minute = mb(12);
+ up->date.second = mb(13);
+ up->date.month = mb(15);
+ up->date.monthday = mb(14);
+ caltogps(&up->date, 0, &up->week, &up->TOW);
+ gpsweekadj(&up->week, up->build_week);
+ gpstocal(up->week, up->TOW, 0, &up->date);
+
+ if ((up->UTC_flags & LEAP_SCHEDULED) &&
+ // Avoid early announce: https://bugs.ntp.org/2773
+ (6 == up->date.month || 12 == up->date.month))
+ pp->leap = LEAP_ADDSECOND;
+ else
+ pp->leap = LEAP_NOWARNING;
+
+ DPRINT(2, ("TSIP_decode: unit %d: 8f-ad #%d %02d:%02d:%02d.%09ld %02d/%02d/%04d UTC 0x%02x\n tracking status: %s\n",
+ up->unit, event, up->date.hour, up->date.minute,
+ up->date.second, pp->nsec, up->date.month,
+ up->date.monthday, up->date.year,
+ up->UTC_flags, tracking_status[up->trk_status]));
+ return true;
+ break;
+
+ case 0xAC:
+ /*
+ * supplemental timing packet: sent after 8f-ab from
+ * Thunderbolt and Resolution SMT
+ */
+ if (up->rpt_cnt != 68) {
+ DPRINT(1, ("TSIP_decode: unit %d: 8f-ac packet length is not 68 (%d)\n",
+ up->unit, (int)up->rpt_cnt));
+ refclock_report(peer, CEVNT_BADREPLY);
+ return false;
+ }
+ up->got_time = true;
#ifdef DEBUG
- if (debug > 1) { /* SPECIAL DEBUG */
- double lat, lon, alt;
- lat = getdbl(&mb(36)) * R2D;
- lon = getdbl(&mb(44)) * R2D;
- alt = getdbl(&mb(52));
- printf("TSIP_decode: unit %d: Latitude: %03.4f Longitude: %03.4f Alt: %05.2f m\n",
- up->unit, lat,lon,alt);
- }
+ if (debug > 1) { // SPECIAL DEBUG
+ double lat, lon, alt;
+ lat = getdbl(&mb(36)) * R2D;
+ lon = getdbl(&mb(44)) * R2D;
+ alt = getdbl(&mb(52));
+ printf("TSIP_decode: unit %d: Latitude: %03.4f Longitude: %03.4f Alt: %05.2f m\n",
+ up->unit, lat,lon,alt);
+ }
#endif
- decod_stat = mb(12);
- if (decod_stat > TB_DECOD_STATS) {
- decod_stat = TB_DECOD_STATS;
+ decod_stat = mb(12);
+ if (decod_stat > TB_DECOD_STATS) {
+ decod_stat = TB_DECOD_STATS;
}
- disc_mode = mb(2);
- if (disc_mode > TB_DISC_MODES) {
- disc_mode = TB_DISC_MODES;
+ disc_mode = mb(2);
+ if (disc_mode > TB_DISC_MODES) {
+ disc_mode = TB_DISC_MODES;
}
- DPRINT(2, ("TSIP_decode: unit %d: leap=%d decod.stat=%s disc.mode=%s\n",
- up->unit, pp->leap,
- tracking_status[tb_decod_conv[decod_stat]],
- tb_disc_mode[disc_mode]));
-
- m_alarms = getu16(&mb(10));
- if (m_alarms & 0x200) {
- DPRINT(1, ("TSIP_decode: unit %d: 'position questionable' flag is set,\n you must update the unit's stored position.\n",
- up->unit));
- return false;
- }
-
- holdover_t = getu32(&mb(4));
- if (!tracking_status_usable[tb_decod_conv[decod_stat]]) {
- if (pp->fudgetime2 < 0.5) {
- /* holdover not enabled */
- DPRINT(1, ("TSIP_decode: unit %d: decod.stat of '%s' is unusable\n",
- up->unit,
- tracking_status[tb_decod_conv[decod_stat]]));
- return false;
- }else if (tb_disc_in_holdover[disc_mode] &&
- holdover_t > pp->fudgetime2) {
- DPRINT(1, ("TSIP_decode: unit %d: unit in holdover (disc.mode=%s) with decod.stat of '%s' but holdover time of %us exceeds time2(%.fs)\n",
- up->unit,
- tb_disc_mode[disc_mode],
- tracking_status[tb_decod_conv[decod_stat]],
- holdover_t, pp->fudgetime2));
- return false;
- } else if (!tb_disc_in_holdover[disc_mode]) {
- DPRINT(1, ("TSIP_decode: unit %d: not in holdover (disc.mode=%s) and decod.stat of '%s' is unusable\n",
- up->unit, tb_disc_mode[disc_mode],
- tracking_status[tb_decod_conv[decod_stat]]));
- return false;
- }
- }
-
- if (up->UTC_flags != UTC_AVAILABLE)
- return false;
-
- gpsweekadj(&up->week, up->build_week);
- gpstocal(up->week, up->TOW, up->UTC_offset, &up->date);
- if ((m_alarms & 0x80) &&
- /* Avoid early announce: https://bugs.ntp.org/2773 */
- (6 == up->date.month || 12 == up->date.month) )
- pp->leap = LEAP_ADDSECOND; /* we ASSUME addsecond */
- else
- pp->leap = LEAP_NOWARNING;
-
- DPRINT(2, ("TSIP_decode: unit %d: 8f-ac TOW: %lu week: %u adj.t: %02d:%02d:%02d.0 %02d/%02d/%04d\n",
- up->unit, up->TOW, up->week,
- up->date.hour, up->date.minute, up->date.second,
- up->date.month, up->date.monthday, up->date.year));
- return true;
- break;
-
- case 0xAB:
- /*
- * primary timing packet: first packet sent after PPS
- * from Thunderbolt and Resolution SMT
- */
- if (up->rpt_cnt != 17) {
- DPRINT(1, ("TSIP_decode: unit %d: 8f-ab packet length is not 17 (%d)\n",
- up->unit, (int)up->rpt_cnt));
- refclock_report(peer, CEVNT_BADREPLY);
- return 0;
- }
- timing_flags = mb(9);
+ DPRINT(2, ("TSIP_decode: unit %d: leap=%d decod.stat=%s disc.mode=%s\n",
+ up->unit, pp->leap,
+ tracking_status[tb_decod_conv[decod_stat]],
+ tb_disc_mode[disc_mode]));
+
+ m_alarms = getu16(&mb(10));
+ if (m_alarms & 0x200) {
+ DPRINT(1, ("TSIP_decode: unit %d: 'position questionable' flag is set,\n you must update the unit's stored position.\n",
+ up->unit));
+ return false;
+ }
+
+ holdover_t = getu32(&mb(4));
+ if (!tracking_status_usable[tb_decod_conv[decod_stat]]) {
+ if (pp->fudgetime2 < 0.5) {
+ // holdover not enabled
+ DPRINT(1, ("TSIP_decode: unit %d: decod.stat of '%s' is unusable\n",
+ up->unit,
+ tracking_status[tb_decod_conv[decod_stat]]));
+ return false;
+ }else if (tb_disc_in_holdover[disc_mode] &&
+ holdover_t > pp->fudgetime2) {
+ DPRINT(1, ("TSIP_decode: unit %d: unit in holdover (disc.mode=%s) with decod.stat of '%s' but holdover time of %us exceeds time2(%.fs)\n",
+ up->unit,
+ tb_disc_mode[disc_mode],
+ tracking_status[tb_decod_conv[decod_stat]],
+ holdover_t, pp->fudgetime2));
+ return false;
+ } else if (!tb_disc_in_holdover[disc_mode]) {
+ DPRINT(1, ("TSIP_decode: unit %d: not in holdover (disc.mode=%s) and decod.stat of '%s' is unusable\n",
+ up->unit, tb_disc_mode[disc_mode],
+ tracking_status[tb_decod_conv[decod_stat]]));
+ return false;
+ }
+ }
+
+ if (up->UTC_flags != UTC_AVAILABLE)
+ return false;
+
+ gpsweekadj(&up->week, up->build_week);
+ gpstocal(up->week, up->TOW, up->UTC_offset, &up->date);
+ if ((m_alarms & 0x80) &&
+ // Avoid early announce: https://bugs.ntp.org/2773
+ (6 == up->date.month || 12 == up->date.month) )
+ pp->leap = LEAP_ADDSECOND; // we ASSUME addsecond
+ else
+ pp->leap = LEAP_NOWARNING;
+
+ DPRINT(2, ("TSIP_decode: unit %d: 8f-ac TOW: %lu week: %u adj.t: %02d:%02d:%02d.0 %02d/%02d/%04d\n",
+ up->unit, up->TOW, up->week,
+ up->date.hour, up->date.minute, up->date.second,
+ up->date.month, up->date.monthday, up->date.year));
+ return true;
+ break;
+
+ case 0xAB:
+ /*
+ * primary timing packet: first packet sent after PPS
+ * from Thunderbolt and Resolution SMT
+ */
+ if (up->rpt_cnt != 17) {
+ DPRINT(1, ("TSIP_decode: unit %d: 8f-ab packet length is not 17 (%d)\n",
+ up->unit, (int)up->rpt_cnt));
+ refclock_report(peer, CEVNT_BADREPLY);
+ return 0;
+ }
+ timing_flags = mb(9);
#ifdef DEBUG
- if (debug > 1) { /* SPECIAL DEBUG */
- printf("TSIP_decode: unit %d: timing flags:0x%02X=\n",
- up->unit, timing_flags);
- if (timing_flags & 0x08) {
- printf(" timecode aligned to GPS(UTC not avail.), PPS aligned to GPS(UTC not avail.)\n");
- } else {
- if (timing_flags & 0x01)
- printf(" timecode aligned to UTC, ");
- else
- printf(" timecode aligned to GPS(misconfigured), ");
- if (timing_flags & 0x02)
- printf("PPS aligned to UTC\n");
- else
- printf("PPS aligned to GPS(misconfigured)\n");
- }
- if (timing_flags & 0x04)
- printf(" time is NOT set, ");
- else
- printf(" time is set, ");
- if (timing_flags & 0x08)
- printf("UTC is NOT available, ");
- else
- printf("UTC is available, ");
- if (timing_flags & 0x10)
- printf("test-mode timesource(misconfigured)\n");
- else
- printf("satellite timesource\n");
- }
+ if (debug > 1) { // SPECIAL DEBUG
+ printf("TSIP_decode: unit %d: timing flags:0x%02X=\n",
+ up->unit, timing_flags);
+ if (timing_flags & 0x08) {
+ printf(" timecode aligned to GPS(UTC not avail.), PPS aligned to GPS(UTC not avail.)\n");
+ } else {
+ if (timing_flags & 0x01)
+ printf(" timecode aligned to UTC, ");
+ else
+ printf(" timecode aligned to GPS(misconfigured), ");
+ if (timing_flags & 0x02)
+ printf("PPS aligned to UTC\n");
+ else
+ printf("PPS aligned to GPS(misconfigured)\n");
+ }
+ if (timing_flags & 0x04)
+ printf(" time is NOT set, ");
+ else
+ printf(" time is set, ");
+ if (timing_flags & 0x08)
+ printf("UTC is NOT available, ");
+ else
+ printf("UTC is available, ");
+ if (timing_flags & 0x10)
+ printf("test-mode timesource(misconfigured)\n");
+ else
+ printf("satellite timesource\n");
+ }
#endif
- up->UTC_flags = 0;
- up->UTC_offset = gets16(&mb(7));
- if (timing_flags & 0x04 || timing_flags & 0x08 ||
- up->UTC_offset == 0) {
- DPRINT(1, ("TSIP_decode: unit %d: time not set or UTC offset unavailable\n",
- up->unit));
- return false;
- }
- /*
- * configuration is sent only at ntpd startup. if unit
- * loses power it will revert to the factory default
- * time alignment (GPS)
- */
- if (!(timing_flags & 0x01) || !(timing_flags & 0x02) ||
- (timing_flags & 0x10)) {
- DPRINT(1, ("TSIP_decode: unit %d: 8f-ab flags: not UTC time: unit is misconfigured (0x%02X)\n",
- up->unit, timing_flags));
- pp->leap = LEAP_NOTINSYNC;
- refclock_report(peer, CEVNT_BADTIME);
- return false;
- }
- up->TOW = getu32(&mb(1));
- up->week = getu16(&mb(5));
-
- pp->lastrec = up->p_recv_time;
- pp->nsec = 0;
- up->UTC_flags = UTC_AVAILABLE; /* flag for 8f-ac */
- return false;
- break;
-
- default:
- break;
- } /* switch */
- }
-
- else if (id == 0x41) {
- /*
- * GPS time packet from ACE III or Copernicus II receiver.
- * The ACE III issues these in response to a HW poll.
- * The Copernicus II receiver issues these by default once a second.
- */
- if ((up->type != CLK_ACE) && (up->type != CLK_COPERNICUS))
- return false;
-
- if (up->rpt_cnt != 10) {
- DPRINT(1, ("TSIP_decode: unit %d: 41 packet length is not 10 (%d)\n",
- up->unit, (int)up->rpt_cnt));
- refclock_report(peer, CEVNT_BADREPLY);
- return false;
- }
-
- /*
+ up->UTC_flags = 0;
+ up->UTC_offset = gets16(&mb(7));
+ if (timing_flags & 0x04 || timing_flags & 0x08 ||
+ up->UTC_offset == 0) {
+ DPRINT(1, ("TSIP_decode: unit %d: time not set or UTC offset unavailable\n",
+ up->unit));
+ return false;
+ }
+ /*
+ * configuration is sent only at ntpd startup. if unit
+ * loses power it will revert to the factory default
+ * time alignment (GPS)
+ */
+ if (!(timing_flags & 0x01) || !(timing_flags & 0x02) ||
+ (timing_flags & 0x10)) {
+ DPRINT(1, ("TSIP_decode: unit %d: 8f-ab flags: not UTC time: unit is misconfigured (0x%02X)\n",
+ up->unit, timing_flags));
+ pp->leap = LEAP_NOTINSYNC;
+ refclock_report(peer, CEVNT_BADTIME);
+ return false;
+ }
+ up->TOW = getu32(&mb(1));
+ up->week = getu16(&mb(5));
+
+ pp->lastrec = up->p_recv_time;
+ pp->nsec = 0;
+ up->UTC_flags = UTC_AVAILABLE; // flag for 8f-ac
+ return false;
+ break;
+
+ default:
+ break;
+ } // switch
+ }
+
+ else if (id == 0x41) {
+ /*
+ * GPS time packet from ACE III or Copernicus II receiver.
+ * The ACE III issues these in response to a HW poll.
+ * The Copernicus II receiver issues these by default once a second.
+ */
+ if ((up->type != CLK_ACE) && (up->type != CLK_COPERNICUS))
+ return false;
+
+ if (up->rpt_cnt != 10) {
+ DPRINT(1, ("TSIP_decode: unit %d: 41 packet length is not 10 (%d)\n",
+ up->unit, (int)up->rpt_cnt));
+ refclock_report(peer, CEVNT_BADREPLY);
+ return false;
+ }
+
+ /*
* A negative value of TOW indicates the receiver has not established the time.
- * This can occur even if UTC_offset is correct.
- */
- TOWfloat = getsgl(&mb(0));
- up->got_time = (TOWfloat >= 0);
- if (!up->got_time)
- return false;
- up->TOW = (unsigned long int)TOWfloat;
- up->week = getu16(&mb(4));
- up->UTC_offset = (int)getsgl(&mb(6));
- if (up->UTC_offset == 0) {
- DPRINT(1, ("TSIP_decode: unit %d: UTC data not available\n",
- up->unit));
- return false;
- }
-
- gpsweekadj(&up->week, up->build_week);
- gpstocal(up->week, up->TOW, up->UTC_offset, &up->date);
-
- /*
+ * This can occur even if UTC_offset is correct.
+ */
+ TOWfloat = getsgl(&mb(0));
+ up->got_time = (TOWfloat >= 0);
+ if (!up->got_time)
+ return false;
+ up->TOW = (unsigned long int)TOWfloat;
+ up->week = getu16(&mb(4));
+ up->UTC_offset = (int)getsgl(&mb(6));
+ if (up->UTC_offset == 0) {
+ DPRINT(1, ("TSIP_decode: unit %d: UTC data not available\n",
+ up->unit));
+ return false;
+ }
+
+ gpsweekadj(&up->week, up->build_week);
+ gpstocal(up->week, up->TOW, up->UTC_offset, &up->date);
+
+ /*
* The HW_poll occurs at 1Hz but with random phase w.r.t the system clock.
* If we are using polling, cancel out the random phase offset by setting
- * pp->nsec to the fractional part of lastrec.
- */
- if (up->use_event) {
- lastrec_frac = lfpfrac(pp->lastrec);
- secfrac = (double)lastrec_frac / FRAC;
- pp->nsec = (long) (secfrac * NS_PER_S);
- } else {
- pp->lastrec = up->p_recv_time;
- pp->nsec = 0;
- }
-
- DPRINT(2, ("TSIP_decode: unit %d: 41 TOW: %lu week: %u UTC %d adj.t: %02d:%02d:%02d.0 %02d/%02d/%04d\n",
- up->unit, up->TOW, up->week, up->UTC_offset,
- up->date.hour, up->date.minute, up->date.second,
- up->date.month, up->date.monthday, up->date.year));
- return true;
- }
-
- return false;
+ * pp->nsec to the fractional part of lastrec.
+ */
+ if (up->use_event) {
+ lastrec_frac = lfpfrac(pp->lastrec);
+ secfrac = (double)lastrec_frac / FRAC;
+ pp->nsec = (long) (secfrac * NS_PER_S);
+ } else {
+ pp->lastrec = up->p_recv_time;
+ pp->nsec = 0;
+ }
+
+ DPRINT(2, ("TSIP_decode: unit %d: 41 TOW: %lu week: %u UTC %d adj.t: %02d:%02d:%02d.0 %02d/%02d/%04d\n",
+ up->unit, up->TOW, up->week, up->UTC_offset,
+ up->date.hour, up->date.minute, up->date.second,
+ up->date.month, up->date.monthday, up->date.year));
+ return true;
+ }
+
+ return false;
}
/*
@@ -972,63 +972,63 @@ TSIP_decode (
*/
static void
trimble_receive (
- struct peer * peer,
- int type
- )
+ struct peer * peer,
+ int type
+ )
{
- struct trimble_unit *up;
- struct refclockproc *pp;
-
- /* Initialize pointers and read the timecode and timestamp. */
- pp = peer->procptr;
- up = pp->unitptr;
-
- /*
- * Wait for fudge flags to initialize. Also, startup may have caused
- * a spurious edge, so wait for first HW_poll()
- */
- if (pp->polls < 1)
- return;
-
- up->got_pkt = true;
- if (MSG_TSIP == type) {
- if (!TSIP_decode(peer))
- return;
- } else {
- if (SPSTAT_LEN == up->rpt_cnt &&
- up->rpt_buf[up->rpt_cnt - 1] == '\r') {
- up->rpt_buf[up->rpt_cnt - 1] = '\0';
- record_clock_stats(peer, (char *) up->rpt_buf);
- }
- return;
- }
-
- /* add sample to filter */
- /*
+ struct trimble_unit *up;
+ struct refclockproc *pp;
+
+ // Initialize pointers and read the timecode and timestamp.
+ pp = peer->procptr;
+ up = pp->unitptr;
+
+ /*
+ * Wait for fudge flags to initialize. Also, startup may have caused
+ * a spurious edge, so wait for first HW_poll()
+ */
+ if (pp->polls < 1)
+ return;
+
+ up->got_pkt = true;
+ if (MSG_TSIP == type) {
+ if (!TSIP_decode(peer))
+ return;
+ } else {
+ if (SPSTAT_LEN == up->rpt_cnt &&
+ up->rpt_buf[up->rpt_cnt - 1] == '\r') {
+ up->rpt_buf[up->rpt_cnt - 1] = '\0';
+ record_clock_stats(peer, (char *) up->rpt_buf);
+ }
+ return;
+ }
+
+ // add sample to filter
+ /*
* The ACE III receiver periodically outputs 0x41 packets by itself,
* i.e. in addition to those output in response to a poll command.
- * When this happens, two 0x41 packets with the same contents will be
- * received back to back. Only process the first of these.
- */
- if (!((up->type == CLK_ACE) && up->event_reply)) {
- pp->lastref = pp->lastrec;
- pp->year = up->date.year;
- pp->yday = up->date.yearday;
- pp->hour = up->date.hour;
- pp->minute = up->date.minute;
- pp->second = up->date.second;
- DPRINT(2, ("trimble_receive: unit %d: %4d %03d %02d:%02d:%02d.%09ld\n",
- up->unit, pp->year, pp->yday, pp->hour, pp->minute,
- pp->second, pp->nsec));
- if (!refclock_process(pp)) {
- refclock_report(peer, CEVNT_BADTIME);
- DPRINT(1, ("trimble_receive: unit %d: refclock_process failed!\n",
- up->unit));
- return;
- }
- up->samples++;
- up->event_reply = true;
- }
+ * When this happens, two 0x41 packets with the same contents will be
+ * received back to back. Only process the first of these.
+ */
+ if (!((up->type == CLK_ACE) && up->event_reply)) {
+ pp->lastref = pp->lastrec;
+ pp->year = up->date.year;
+ pp->yday = up->date.yearday;
+ pp->hour = up->date.hour;
+ pp->minute = up->date.minute;
+ pp->second = up->date.second;
+ DPRINT(2, ("trimble_receive: unit %d: %4d %03d %02d:%02d:%02d.%09ld\n",
+ up->unit, pp->year, pp->yday, pp->hour, pp->minute,
+ pp->second, pp->nsec));
+ if (!refclock_process(pp)) {
+ refclock_report(peer, CEVNT_BADTIME);
+ DPRINT(1, ("trimble_receive: unit %d: refclock_process failed!\n",
+ up->unit));
+ return;
+ }
+ up->samples++;
+ up->event_reply = true;
+ }
}
/*
@@ -1036,69 +1036,69 @@ trimble_receive (
*/
static void
trimble_poll (
- int unit,
- struct peer *peer
- )
+ int unit,
+ struct peer *peer
+ )
{
- struct trimble_unit *up;
- struct refclockproc *pp;
- int cl;
- bool err;
-
- UNUSED_ARG(unit);
-
- pp = peer->procptr;
- up = pp->unitptr;
-
- /* samples are not taken until second poll */
- if (++pp->polls < 2)
- return;
-
- /* check status for the previous poll interval */
- err = (up->samples < MIN_SAMPLES);
- if (err) {
- refclock_report(peer, CEVNT_TIMEOUT);
- if (!up->got_pkt) {
- DPRINT(1, ("trimble_poll: unit %d: no packets found\n",
- up->unit));
- } else if (!up->got_time) {
- DPRINT(1, ("trimble_poll: unit %d: packet(s) found but none were usable.\nVerify unit isn't connected to Port B and flag3 is correct for Palisade/Acutime\n",
- up->unit));
- } else {
- DPRINT(1, ("trimble_poll: unit %d: not enough samples (%d, min %d), skipping poll\n",
- up->unit, up->samples, MIN_SAMPLES));
- pp->codeproc = pp->coderecv; /* reset filter */
- }
- }
- up->got_time = false;
- up->got_pkt = false;
- up->samples = 0;
- if (err)
- return;
-
- /* ask Praecis for its signal status */
- if(up->type == CLK_PRAECIS) {
- if(write(peer->procptr->io.fd,"SPSTAT\r\n",8) < 0)
- msyslog(LOG_ERR, "REFCLOCK: %s write: %s:",
- refclock_name(peer), strerror(errno));
- }
-
- /* record clockstats */
- cl = snprintf(pp->a_lastcode, sizeof(pp->a_lastcode),
- "%4d %03d %02d:%02d:%02d.%09ld",
- pp->year, pp->yday, pp->hour,pp->minute, pp->second, pp->nsec);
- pp->lencode = (cl < (int)sizeof(pp->a_lastcode)) ? cl : 0;
- record_clock_stats(peer, pp->a_lastcode);
-
- DPRINT(2, ("trimble_poll: unit %d: %s\n",
- up->unit, prettydate(pp->lastrec)));
-
- if (pp->hour == 0 && up->week > up->build_week + 1000)
- msyslog(LOG_WARNING, "REFCLOCK: %s current GPS week number (%u) is more than 1000 weeks past ntpd's build date (%u), please update",
- refclock_name(peer), up->week, up->build_week);
-
- /* process samples in filter */
- refclock_receive(peer);
+ struct trimble_unit *up;
+ struct refclockproc *pp;
+ int cl;
+ bool err;
+
+ UNUSED_ARG(unit);
+
+ pp = peer->procptr;
+ up = pp->unitptr;
+
+ // samples are not taken until second poll
+ if (++pp->polls < 2)
+ return;
+
+ // check status for the previous poll interval
+ err = (up->samples < MIN_SAMPLES);
+ if (err) {
+ refclock_report(peer, CEVNT_TIMEOUT);
+ if (!up->got_pkt) {
+ DPRINT(1, ("trimble_poll: unit %d: no packets found\n",
+ up->unit));
+ } else if (!up->got_time) {
+ DPRINT(1, ("trimble_poll: unit %d: packet(s) found but none were usable.\nVerify unit isn't connected to Port B and flag3 is correct for Palisade/Acutime\n",
+ up->unit));
+ } else {
+ DPRINT(1, ("trimble_poll: unit %d: not enough samples (%d, min %d), skipping poll\n",
+ up->unit, up->samples, MIN_SAMPLES));
+ pp->codeproc = pp->coderecv; // reset filter
+ }
+ }
+ up->got_time = false;
+ up->got_pkt = false;
+ up->samples = 0;
+ if (err)
+ return;
+
+ // ask Praecis for its signal status
+ if(up->type == CLK_PRAECIS) {
+ if(write(peer->procptr->io.fd,"SPSTAT\r\n",8) < 0)
+ msyslog(LOG_ERR, "REFCLOCK: %s write: %s:",
+ refclock_name(peer), strerror(errno));
+ }
+
+ // record clockstats
+ cl = snprintf(pp->a_lastcode, sizeof(pp->a_lastcode),
+ "%4d %03d %02d:%02d:%02d.%09ld",
+ pp->year, pp->yday, pp->hour,pp->minute, pp->second, pp->nsec);
+ pp->lencode = (cl < (int)sizeof(pp->a_lastcode)) ? cl : 0;
+ record_clock_stats(peer, pp->a_lastcode);
+
+ DPRINT(2, ("trimble_poll: unit %d: %s\n",
+ up->unit, prettydate(pp->lastrec)));
+
+ if (pp->hour == 0 && up->week > up->build_week + 1000)
+ msyslog(LOG_WARNING, "REFCLOCK: %s current GPS week number (%u) is more than 1000 weeks past ntpd's build date (%u), please update",
+ refclock_name(peer), up->week, up->build_week);
+
+ // process samples in filter
+ refclock_receive(peer);
}
/*
@@ -1106,112 +1106,112 @@ trimble_poll (
*/
static void
trimble_io (
- struct recvbuf *rbufp
- )
+ struct recvbuf *rbufp
+ )
{
- struct trimble_unit *up;
- struct refclockproc *pp;
- struct peer *peer;
-
- char * c, * d;
-
- peer = rbufp->recv_peer;
- pp = peer->procptr;
- up = pp->unitptr;
-
- c = (char *) &rbufp->recv_buffer;
- d = c + rbufp->recv_length;
-
- while (c != d) {
- switch (up->rpt_status) {
- case TSIP_PARSED_DLE_1:
- switch (*c)
- {
- case 0:
- case DLE:
- case ETX:
- up->rpt_status = TSIP_PARSED_EMPTY;
- break;
-
- default:
- up->rpt_status = TSIP_PARSED_DATA;
- /* save packet ID */
- up->rpt_buf[0] = *c;
- /* save packet receive time */
- up->p_recv_time = rbufp->recv_time;
- break;
- }
- break;
-
- case TSIP_PARSED_DATA:
- if (*c == DLE) {
- up->rpt_status = TSIP_PARSED_DLE_2;
- } else if (up->parity_chk && *c == '\377')
- up->rpt_status = TSIP_PARSED_PARITY;
- else
- mb(up->rpt_cnt++) = *c;
- break;
-
- case TSIP_PARSED_PARITY:
- if (*c == '\377') {
- up->rpt_status = TSIP_PARSED_DATA;
- mb(up->rpt_cnt++) = *c;
- } else {
- msyslog(LOG_ERR, "REFCLOCK: %s: detected serial parity error or receive buffer overflow",
- refclock_name(peer));
- up->rpt_status = TSIP_PARSED_EMPTY;
- }
- break;
-
- case TSIP_PARSED_DLE_2:
- if (*c == DLE) {
- up->rpt_status = TSIP_PARSED_DATA;
- mb(up->rpt_cnt++) = *c;
- } else if (*c == ETX) {
- up->rpt_status = TSIP_PARSED_FULL;
- trimble_receive(peer, MSG_TSIP);
- } else {
- /* error: start new report packet */
- up->rpt_status = TSIP_PARSED_DLE_1;
- up->rpt_buf[0] = *c;
- }
- break;
-
- case TSIP_PARSED_ASCII:
- if (*c == '\n') {
- mb(up->rpt_cnt++) = *c;
- up->rpt_status = TSIP_PARSED_FULL;
- trimble_receive(peer, MSG_PRAECIS);
- } else if (up->parity_chk && *c == '\377') {
- up->rpt_status = TSIP_PARSED_PARITY;
- } else {
- mb(up->rpt_cnt++) = *c;
- }
- break;
-
- case TSIP_PARSED_FULL:
- case TSIP_PARSED_EMPTY:
- default:
- up->rpt_cnt = 0;
- if (*c == DLE) {
- up->rpt_status = TSIP_PARSED_DLE_1;
- } else if (up->type == CLK_PRAECIS && NULL != strchr("6L789ADTP", *c)) {
- /* Praecis command reply */
- up->rpt_buf[0] = *c;
- up->rpt_status = TSIP_PARSED_ASCII;
- } else {
- up->rpt_status = TSIP_PARSED_EMPTY;
- }
- break;
- }
- c++;
- if (up->rpt_cnt > RMAX - 2) {/* additional byte for ID */
- up->rpt_status = TSIP_PARSED_EMPTY;
- DPRINT(1, ("trimble_io: unit %d: oversize serial message (%luB) 0x%02x discarded\n",
- up->unit, (unsigned long)up->rpt_cnt,
- (uint8_t)up->rpt_buf[0]));
- }
- } /* while chars in buffer */
+ struct trimble_unit *up;
+ struct refclockproc *pp;
+ struct peer *peer;
+
+ char * c, * d;
+
+ peer = rbufp->recv_peer;
+ pp = peer->procptr;
+ up = pp->unitptr;
+
+ c = (char *) &rbufp->recv_buffer;
+ d = c + rbufp->recv_length;
+
+ while (c != d) {
+ switch (up->rpt_status) {
+ case TSIP_PARSED_DLE_1:
+ switch (*c)
+ {
+ case 0:
+ case DLE:
+ case ETX:
+ up->rpt_status = TSIP_PARSED_EMPTY;
+ break;
+
+ default:
+ up->rpt_status = TSIP_PARSED_DATA;
+ // save packet ID
+ up->rpt_buf[0] = *c;
+ // save packet receive time
+ up->p_recv_time = rbufp->recv_time;
+ break;
+ }
+ break;
+
+ case TSIP_PARSED_DATA:
+ if (*c == DLE) {
+ up->rpt_status = TSIP_PARSED_DLE_2;
+ } else if (up->parity_chk && *c == '\377')
+ up->rpt_status = TSIP_PARSED_PARITY;
+ else
+ mb(up->rpt_cnt++) = *c;
+ break;
+
+ case TSIP_PARSED_PARITY:
+ if (*c == '\377') {
+ up->rpt_status = TSIP_PARSED_DATA;
+ mb(up->rpt_cnt++) = *c;
+ } else {
+ msyslog(LOG_ERR, "REFCLOCK: %s: detected serial parity error or receive buffer overflow",
+ refclock_name(peer));
+ up->rpt_status = TSIP_PARSED_EMPTY;
+ }
+ break;
+
+ case TSIP_PARSED_DLE_2:
+ if (*c == DLE) {
+ up->rpt_status = TSIP_PARSED_DATA;
+ mb(up->rpt_cnt++) = *c;
+ } else if (*c == ETX) {
+ up->rpt_status = TSIP_PARSED_FULL;
+ trimble_receive(peer, MSG_TSIP);
+ } else {
+ // error: start new report packet
+ up->rpt_status = TSIP_PARSED_DLE_1;
+ up->rpt_buf[0] = *c;
+ }
+ break;
+
+ case TSIP_PARSED_ASCII:
+ if (*c == '\n') {
+ mb(up->rpt_cnt++) = *c;
+ up->rpt_status = TSIP_PARSED_FULL;
+ trimble_receive(peer, MSG_PRAECIS);
+ } else if (up->parity_chk && *c == '\377') {
+ up->rpt_status = TSIP_PARSED_PARITY;
+ } else {
+ mb(up->rpt_cnt++) = *c;
+ }
+ break;
+
+ case TSIP_PARSED_FULL:
+ case TSIP_PARSED_EMPTY:
+ default:
+ up->rpt_cnt = 0;
+ if (*c == DLE) {
+ up->rpt_status = TSIP_PARSED_DLE_1;
+ } else if (up->type == CLK_PRAECIS && NULL != strchr("6L789ADTP", *c)) {
+ // Praecis command reply
+ up->rpt_buf[0] = *c;
+ up->rpt_status = TSIP_PARSED_ASCII;
+ } else {
+ up->rpt_status = TSIP_PARSED_EMPTY;
+ }
+ break;
+ }
+ c++;
+ if (up->rpt_cnt > RMAX - 2) { // additional byte for ID
+ up->rpt_status = TSIP_PARSED_EMPTY;
+ DPRINT(1, ("trimble_io: unit %d: oversize serial message (%luB) 0x%02x discarded\n",
+ up->unit, (unsigned long)up->rpt_cnt,
+ (uint8_t)up->rpt_buf[0]));
+ }
+ } // while chars in buffer
}
/*
@@ -1219,20 +1219,20 @@ trimble_io (
*/
static void
trimble_timer(
- int unit,
- struct peer * peer
- )
+ int unit,
+ struct peer * peer
+ )
{
- struct trimble_unit *up;
- struct refclockproc *pp;
+ struct trimble_unit *up;
+ struct refclockproc *pp;
- UNUSED_ARG(unit);
+ UNUSED_ARG(unit);
- pp = peer->procptr;
- up = pp->unitptr;
+ pp = peer->procptr;
+ up = pp->unitptr;
- if (up->use_event)
- HW_poll(pp);
+ if (up->use_event)
+ HW_poll(pp);
}
/*
@@ -1240,46 +1240,46 @@ trimble_timer(
*/
static void
HW_poll (
- struct refclockproc * pp
- )
+ struct refclockproc * pp
+ )
{
- struct trimble_unit *up;
- static const struct timespec ts = {0, 13 * NS_PER_MS};
-
- up = pp->unitptr;
-
- struct packettx tx;
- uint8_t tx_data[10];
- if (up->type == CLK_ACE) {
- /* Poll ACE III by sending a 0x21 command */
- tx.size = 0;
- tx.data = tx_data;
- sendcmd (&tx, 0x21);
- sendetx (&tx, pp->io.fd);
- } else {
- /* Edge trigger */
- if (pp->sloppyclockflag & CLK_FLAG3) {
- IGNORE(write (pp->io.fd, "", 1));
- } else {
- up->MCR &= ~TIOCM_RTS; /* set RTS low from high idle state */
- IGNORE(ioctl(pp->io.fd, TIOCMSET, &up->MCR));
-
- /*
- * The Acutime 2000 will occasionally transmit with parity
- * errors if the low state is held for less than 1ms, and the
- * Praecis will produce unstable timestamps if the low state is
- * held for less than 12ms.
- */
- nanosleep(&ts, NULL);
-
- up->MCR |= TIOCM_RTS; /* make edge / restore idle */
- IGNORE(ioctl(pp->io.fd, TIOCMSET, &up->MCR));
- }
- }
- up->event_reply = 0;
-
- /* get timestamp after triggering since RAND_bytes is slow */
- get_systime(&pp->lastrec);
+ struct trimble_unit *up;
+ static const struct timespec ts = {0, 13 * NS_PER_MS};
+
+ up = pp->unitptr;
+
+ struct packettx tx;
+ uint8_t tx_data[10];
+ if (up->type == CLK_ACE) {
+ // Poll ACE III by sending a 0x21 command
+ tx.size = 0;
+ tx.data = tx_data;
+ sendcmd (&tx, 0x21);
+ sendetx (&tx, pp->io.fd);
+ } else {
+ // Edge trigger
+ if (pp->sloppyclockflag & CLK_FLAG3) {
+ IGNORE(write (pp->io.fd, "", 1));
+ } else {
+ up->MCR &= ~TIOCM_RTS; // set RTS low from high idle state
+ IGNORE(ioctl(pp->io.fd, TIOCMSET, &up->MCR));
+
+ /*
+ * The Acutime 2000 will occasionally transmit with parity
+ * errors if the low state is held for less than 1ms, and the
+ * Praecis will produce unstable timestamps if the low state is
+ * held for less than 12ms.
+ */
+ nanosleep(&ts, NULL);
+
+ up->MCR |= TIOCM_RTS; // make edge / restore idle
+ IGNORE(ioctl(pp->io.fd, TIOCMSET, &up->MCR));
+ }
+ }
+ up->event_reply = 0;
+
+ // get timestamp after triggering since RAND_bytes is slow
+ get_systime(&pp->lastrec);
}
/*
@@ -1287,29 +1287,29 @@ HW_poll (
*/
static float
getsgl (
- uint8_t *bp
- )
+ uint8_t *bp
+ )
{
#ifdef WORDS_BIGENDIAN
- float out;
+ float out;
- memcpy(&out, bp, sizeof(out));
- return out;
+ memcpy(&out, bp, sizeof(out));
+ return out;
#else
- union {
- uint8_t ch[4];
- uint32_t u32;
- } ui;
+ union {
+ uint8_t ch[4];
+ uint32_t u32;
+ } ui;
- union {
- float out;
- uint32_t u32;
- } uo;
+ union {
+ float out;
+ uint32_t u32;
+ } uo;
- memcpy(ui.ch, bp, sizeof(ui.ch));
- uo.u32 = ntohl(ui.u32);
+ memcpy(ui.ch, bp, sizeof(ui.ch));
+ uo.u32 = ntohl(ui.u32);
- return uo.out;
+ return uo.out;
#endif
}
@@ -1318,32 +1318,32 @@ getsgl (
*/
static double
getdbl (
- uint8_t *bp
- )
+ uint8_t *bp
+ )
{
#ifdef WORDS_BIGENDIAN
- double out;
+ double out;
- memcpy(&out, bp, sizeof(out));
- return out;
+ memcpy(&out, bp, sizeof(out));
+ return out;
#else
- union {
- uint8_t ch[8];
- uint32_t u32[2];
- } ui;
-
- union {
- double out;
- uint32_t u32[2];
- } uo;
-
- memcpy(ui.ch, bp, sizeof(ui.ch));
- /* least-significant 32 bits of double from swapped bp[4] to bp[7] */
- uo.u32[0] = ntohl(ui.u32[1]);
- /* most-significant 32 bits from swapped bp[0] to bp[3] */
- uo.u32[1] = ntohl(ui.u32[0]);
-
- return uo.out;
+ union {
+ uint8_t ch[8];
+ uint32_t u32[2];
+ } ui;
+
+ union {
+ double out;
+ uint32_t u32[2];
+ } uo;
+
+ memcpy(ui.ch, bp, sizeof(ui.ch));
+ // least-significant 32 bits of double from swapped bp[4] to bp[7]
+ uo.u32[0] = ntohl(ui.u32[1]);
+ // most-significant 32 bits from swapped bp[0] to bp[3]
+ uo.u32[1] = ntohl(ui.u32[0]);
+
+ return uo.out;
#endif
}
@@ -1352,13 +1352,13 @@ getdbl (
*/
static int16_t
gets16 (
- uint8_t *bp
- )
+ uint8_t *bp
+ )
{
- int16_t us;
+ int16_t us;
- memcpy(&us, bp, sizeof(us));
- return ntohs(us);
+ memcpy(&us, bp, sizeof(us));
+ return ntohs(us);
}
/*
@@ -1366,13 +1366,13 @@ gets16 (
*/
static uint16_t
getu16 (
- uint8_t *bp
- )
+ uint8_t *bp
+ )
{
- uint16_t us;
+ uint16_t us;
- memcpy(&us, bp, sizeof(us));
- return ntohs(us);
+ memcpy(&us, bp, sizeof(us));
+ return ntohs(us);
}
/*
@@ -1380,11 +1380,11 @@ getu16 (
*/
static uint32_t
getu32(
- uint8_t *bp
- )
+ uint8_t *bp
+ )
{
- uint32_t u32;
+ uint32_t u32;
- memcpy(&u32, bp, sizeof(u32));
- return ntohl(u32);
+ memcpy(&u32, bp, sizeof(u32));
+ return ntohl(u32);
}
View it on GitLab: https://gitlab.com/NTPsec/ntpsec/-/commit/96d607cb1d46703cf250f2a46aec12ae59029e71
--
View it on GitLab: https://gitlab.com/NTPsec/ntpsec/-/commit/96d607cb1d46703cf250f2a46aec12ae59029e71
You're receiving this email because of your account on gitlab.com. Manage all notifications: https://gitlab.com/-/profile/notifications | Help: https://gitlab.com/help
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ntpsec.org/pipermail/vc/attachments/20260806/de7a0099/attachment-0001.htm>
More information about the vc
mailing list