[Git][NTPsec/ntpsec][master] neoclock4x driver removed.

Eric S. Raymond gitlab at mg.gitlab.com
Thu Aug 15 21:34:21 UTC 2019



Eric S. Raymond pushed to branch master at NTPsec / ntpsec


Commits:
bea33b6e by Eric S. Raymond at 2019-08-15T21:33:46Z
neoclock4x driver removed.

- - - - -


7 changed files:

- docs/copyright.adoc
- − docs/driver_neoclock.adoc
- docs/refclock.adoc
- include/ntp_refclock.h
- ntpd/refclock_conf.c
- − ntpd/refclock_neoclock.c
- wafhelpers/refclock.py


Changes:

=====================================
docs/copyright.adoc
=====================================
@@ -116,8 +116,6 @@ as authors of this work.
   <jhay at icomtek.csir.co.za>] IPv6 support and testing
 * mailto:davehart at davehart.com[Dave Hart <davehart at davehart.com>]
   General maintenance
-* mailto:neoclock4x at linum.com[Claas Hilbrecht
-  <neoclock4x at linum.com>] NeoClock4X clock driver
 * mailto:glenn at herald.usask.ca[Glenn Hollinger
   <glenn at herald.usask.ca>] GOES clock driver (removed in NTPsec)
 * mailto:jbj at chatham.usdesign.com[Jeff Johnson


=====================================
docs/driver_neoclock.adoc deleted
=====================================
@@ -1,102 +0,0 @@
-= NeoClock4X - DCF77 / TDF serial line receiver
-include::html.include[]
-
-== Synopsis
-
-["verse",subs="normal"]
-Name: neoclock
-Reference ID: neol
-Serial Port: /dev/neoclock4x-u
-
-image:pic/neoclock4x.gif[float="right",link="http://www.linum.com"]
-
-== Warning
-
-This driver reports only two-digit years, and is thus reliant on the
-system clock to be near correct before samples will be processed
-properly. You will not be able to use it to run autonomously, nor will
-it reliably recover from a trashed or zeroed system clock.
-
-== Description
-
-The refclock_neoclock4x driver supports the NeoClock4X receiver
-available from http://www.linum.com[Linum Software GmbH]. The receiver
-is available as a http://www.dcf77.de[DCF77] or TDF receiver. Both
-receivers have the same output string. For more information about the
-NeoClock4X receiver please visit http://www.linux-funkuhr.de.
-
-== Driver Options
-
-link:clockopt.html[+time1+ time]::
-   Specifies the time offset calibration factor with the default value of
-   0.16958333 seconds. This offset is used  to correct serial line and
-   operating system delays incurred in capturing time stamps. If you want
-   to fudge the +time1+ offset *ALWAYS* add a value of 0.16958333. This is
-   necessary to compensate for the delay that is caused by transmitting the
-   timestamp at 2400 Baud. If you want to compensate the delay that the
-   DCF77 or TDF radio signal takes to travel to your site simply add the
-   needed millisecond delay to the given value. Note that the time here is
-   given in seconds.
-+
-Default setting is 0.16958333 seconds.
-
-link:clockopt.html[+time2+ time]::
-   Not used by this driver.
-
-link:clockopt.html[+flag1 {0 | 1}+]::
-   When set to 1 the driver will feed ntp with timestamps even if the radio
-   signal is lost. In this case an internal backup clock generates the
-   timestamps. This is ok as long as the receiver is synced once since the
-   receiver is able to keep time for a long period.
-+
-Default setting is 0 = don't synchronize to CMOS clock.
-
-link:clockopt.html[+flag2 {0 | 1}+]::
-   You can allow the NeoClock4X driver to use the quartz clock even if it
-   is never synchronized to a radio clock. This is usually not a good idea
-   if you want preceise timestamps since the CMOS clock is maybe not
-   adjusted to a dst status change. So *PLEASE* switch this only on if you
-   now what you're doing.
-+
-Default setting is 0 = don't synchronize to unsynchronized CMOS clock.
-
-link:clockopt.html[+flag3 {0 | 1}+]::
-   Not used by this driver.
-
-link:clockopt.html[+flag4 {0 | 1}+]::
-   It is recommended to allow extensive logging while you setup the
-   NeoClock4X receiver. If you activate flag4 every received data is
-   logged. You should turn off flag4 as soon as the clock works as expected
-   to reduce logfile cluttering.
-+
-Default setting is 0 = don't log received data and converted utc time.
-
-+subtype+::
-   Not used by this driver.
-
-+mode+::
-   Not used by this driver.
-
-+path+ 'filename'::
-  Overrides the default device path.
-
-+ppspath+ 'filename'::
-  Not used by this driver.
-
-+baud+ 'number'::
-  Overrides the default baud rate.
-
-== Configuration Example
-
-----------------------------------------------------------------------------
-refclock neoclock
-----------------------------------------------------------------------------
-
-== Author
-
-Please send any comments or question to
-mailto:neoclock4 at linum.com[neoclock4x at linum.com].
-
-'''''
-
-include::includes/footer.adoc[]


=====================================
docs/refclock.adoc
=====================================
@@ -176,7 +176,6 @@ the 6021 in the generic parse driver.
 |link:driver_oncore.html[oncore]        | D2 | Motorola UT Oncore GPS
 |link:driver_jjy.html[jjy]              | T  | JJY Receivers
 |link:driver_zyfer.html[zyfer]          | -  | Zyfer GPStarplus Receiver
-|link:driver_neoclock.html[neoclock]    | D2 | NeoClock4X DCF77 / TDF Receiver
 |link:driver_gpsd.html[gpsd]            | T  | GPSD client protocol
 |====================================================================
 


=====================================
include/ntp_refclock.h
=====================================
@@ -239,12 +239,6 @@ extern	struct refclock	refclock_modem;
 #define refclock_modem	refclock_none
 #endif
 
-#ifdef CLOCK_NEOCLOCK
-extern	struct refclock	refclock_neoclock4x;
-#else
-#define	refclock_neoclock4x	refclock_none
-#endif
-
 #ifdef CLOCK_NMEA
 extern	struct refclock refclock_nmea;
 #else


=====================================
ntpd/refclock_conf.c
=====================================
@@ -78,7 +78,7 @@ struct refclock * const refclock_conf[] = {
 	&refclock_none,		/* 41 was: REFCLK_TT560 */
 	&refclock_zyfer,	/* 42 REFCLK_ZYFER */
 	&refclock_none,		/* 43 was: REFCLK_RIPENCC */
-	&refclock_neoclock4x,	/* 44 REFCLK_NEOCLOCK4X */
+	&refclock_none,		/* 44 was: REFCLK_NEOCLOCK4X */
 	&refclock_none, 	/* 45 was: REFCLK_TSYNCPCI */
 	&refclock_gpsdjson	/* 46 REFCLK_GPSDJSON */
 };


=====================================
ntpd/refclock_neoclock.c deleted
=====================================
@@ -1,1057 +0,0 @@
-/*
- *
- * Refclock_neoclock4x.c
- * - NeoClock4X driver for DCF77 or FIA Timecode
- *
- * Date: 2009-12-04 v1.16
- *
- * see http://www.linum.com/redir/jump/id=neoclock4x&action=redir
- * for details about the NeoClock4X device
- *
- */
-
-#include "config.h"
-#include <unistd.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <termios.h>
-#include <sys/ioctl.h>
-#include <ctype.h>
-
-#include "ntpd.h"
-#include "ntp_io.h"
-#include "ntp_refclock.h"
-#include "ntp_stdlib.h"
-#include "timespecops.h"
-#include "ntp_calendar.h"	/* for SECSPERHR */
-
-#define NAME		"NEOCLOCK"
-#define DESCRIPTION	"NeoClock4X"
-
-/*
- * WARNING: This driver depends on the system clock for year
- * disambiguation.  It will thus not be usable for recovery if the
- * system clock is trashed.
- *
- * If you want the driver for whatever reason to not use
- * the TX line to send anything to your NeoClock4X
- * device you must tell the NTP refclock driver which
- * firmware you NeoClock4X device uses.
- *
- * If you want to enable this feature change the "#if 0"
- * line to "#if 1" and make sure that the defined firmware
- * matches the firmware off your NeoClock4X receiver!
- *
- */
-
-#if 0
-#define NEOCLOCK4X_FIRMWARE                NEOCLOCK4X_FIRMWARE_VERSION_A
-#endif
-
-#if defined(NEOCLOCK4X_FIRMWARE)
-/* at this time only firmware version A is known */
-# define NEOCLOCK4X_FIRMWARE_VERSION_A      'A'
-#endif
-
-#define NEOCLOCK4X_TIMECODELEN 37
-
-#define NEOCLOCK4X_OFFSET_SERIAL            3
-#define NEOCLOCK4X_OFFSET_RADIOSIGNAL       9
-#define NEOCLOCK4X_OFFSET_DAY              12
-#define NEOCLOCK4X_OFFSET_MONTH            14
-#define NEOCLOCK4X_OFFSET_YEAR             16
-#define NEOCLOCK4X_OFFSET_HOUR             18
-#define NEOCLOCK4X_OFFSET_MINUTE           20
-#define NEOCLOCK4X_OFFSET_SECOND           22
-#define NEOCLOCK4X_OFFSET_HSEC             24
-/* #define NEOCLOCK4X_OFFSET_DOW              26  UNUSED */
-#define NEOCLOCK4X_OFFSET_TIMESOURCE       28
-#define NEOCLOCK4X_OFFSET_DSTSTATUS        29
-#define NEOCLOCK4X_OFFSET_QUARZSTATUS      30
-#define NEOCLOCK4X_OFFSET_ANTENNA1         31
-#define NEOCLOCK4X_OFFSET_ANTENNA2         33
-#define NEOCLOCK4X_OFFSET_CRC              35
-
-#define NEOCLOCK4X_DRIVER_VERSION          "1.16 (2009-12-04)"
-
-#define NSEC_TO_MILLI                      1000000
-
-struct neoclock4x_unit {
-  l_fp	laststamp;	/* last receive timestamp */
-  short	unit;		/* NTP refclock unit number */
-  unsigned long polled;	/* flag to detect noreplies */
-  char	leap_status;	/* leap second flag */
-  bool	recvnow;
-
-  char  firmware[80];
-  char  firmwaretag;
-  char  serial[7];
-  char  radiosignal[4];
-  char  timesource;
-  char  dststatus;
-  char  quarzstatus;
-  int   antenna1;
-  int   antenna2;
-  int   utc_year;
-  int   utc_month;
-  int   utc_day;
-  int   utc_hour;
-  int   utc_minute;
-  int   utc_second;
-  int   utc_msec;
-};
-
-static	bool	neoclock4x_start	(int, struct peer *);
-static	void	neoclock4x_shutdown	(struct refclockproc *);
-static	void	neoclock4x_receive	(struct recvbuf *);
-static	void	neoclock4x_poll		(int, struct peer *);
-static	void	neoclock4x_control	(int, const struct refclockstat *, struct refclockstat *, struct peer *);
-
-static int	neol_atoi_len		(const char str[], int *, int);
-static int	neol_hexatoi_len	(const char str[], int *, int);
-static void	neol_jdn_to_ymd		(unsigned long, int *, int *, int *);
-static void	neol_localtime		(unsigned long, int* , int*, int*, int*, int*, int*);
-static unsigned long neol_mktime	(int, int, int, int, int, int);
-#if !defined(NEOCLOCK4X_FIRMWARE)
-static int	neol_query_firmware	(int, int, char *, size_t);
-static bool	neol_check_firmware	(int, const char*, char *);
-#endif
-
-struct refclock refclock_neoclock4x = {
-  NAME,			/* basename of driver */
-  neoclock4x_start,	/* start up driver */
-  neoclock4x_shutdown,	/* shut down driver */
-  neoclock4x_poll,	/* transmit poll message */
-  neoclock4x_control,	/* device control */
-  NULL,			/* initialize driver (not used) */
-  NULL,			/* tiner - not used */
-};
-
-static bool
-neoclock4x_start(int unit,
-		 struct peer *peer)
-{
-  struct neoclock4x_unit *up;
-  struct refclockproc *pp;
-  int fd;
-  char dev[20];
-  int sl232;
-  struct termios termsettings;
-
-  (void) snprintf(dev, sizeof(dev)-1, "/dev/neoclock4x-%d", unit);
-
-  /* LDISC_STD, LDISC_RAW
-   * Open serial port. Use CLK line discipline, if available.
-   */
-  fd = refclock_open(peer->cfg.path ? peer->cfg.path : dev,
-		     peer->cfg.baud ? peer->cfg.baud : B2400,
-		     LDISC_STD);
-  if(fd <= 0)
-    {
-      /* coverity[leaked_handle] */
-      return false;
-    }
-
-#if 1
-  if(tcgetattr(fd, &termsettings) < 0)
-    {
-      msyslog(LOG_CRIT, "REFCLOCK: NeoClock4X(%d): (tcgetattr) can't query serial port settings: %s", unit, strerror(errno));
-      (void) close(fd);
-      return false;
-    }
-
-  /* 2400 Baud 8N2 */
-  termsettings.c_iflag = IGNBRK | IGNPAR | ICRNL;
-  termsettings.c_oflag = 0;
-  termsettings.c_cflag = CS8 | CSTOPB | CLOCAL | CREAD;
-  (void)cfsetispeed(&termsettings, (unsigned int)B2400);
-  (void)cfsetospeed(&termsettings, (unsigned int)B2400);
-
-  if(tcsetattr(fd, TCSANOW, &termsettings) < 0)
-    {
-      msyslog(LOG_CRIT, "REFCLOCK: NeoClock4X(%d): (tcsetattr) can't set serial port 2400 8N2: %s", unit, strerror(errno));
-      (void) close(fd);
-      return false;
-    }
-
-#else
-  if(tcgetattr(fd, &termsettings) < 0)
-    {
-      msyslog(LOG_CRIT, "REFCLOCK: NeoClock4X(%d): (tcgetattr) can't query serial port settings: %s", unit, strerror(errno));
-      (void) close(fd);
-      return false;
-    }
-
-  /* 2400 Baud 8N2 */
-  termsettings.c_cflag &= ~PARENB;
-  termsettings.c_cflag |= CSTOPB;
-  termsettings.c_cflag &= ~CSIZE;
-  termsettings.c_cflag |= CS8;
-
-  if(tcsetattr(fd, TCSANOW, &termsettings) < 0)
-    {
-      msyslog(LOG_CRIT, "REFCLOCK: NeoClock4X(%d): (tcsetattr) can't set serial port 2400 8N2: %s", unit, strerror(errno));
-      (void) close(fd);
-      return false;
-    }
-#endif
-
-#if defined(TIOCMSET) && (defined(TIOCM_RTS) || defined(CIOCM_RTS))
-  /* turn on RTS, and DTR for power supply */
-  /* NeoClock4x is powered from serial line */
-  if(ioctl(fd, TIOCMGET, (void *)&sl232) == -1)
-    {
-      msyslog(LOG_CRIT, "REFCLOCK: NeoClock4X(%d): can't query RTS/DTR state: %s", unit, strerror(errno));
-      (void) close(fd);
-      return false;
-    }
-#ifdef TIOCM_RTS
-  sl232 = sl232 | TIOCM_DTR | TIOCM_RTS;	/* turn on RTS, and DTR for power supply */
-#else
-  sl232 = sl232 | CIOCM_DTR | CIOCM_RTS;	/* turn on RTS, and DTR for power supply */
-#endif
-  if(ioctl(fd, TIOCMSET, (void *)&sl232) == -1)
-    {
-      msyslog(LOG_CRIT, "REFCLOCK: NeoClock4X(%d): can't set RTS/DTR to power neoclock4x: %s", unit, strerror(errno));
-      (void) close(fd);
-      return false;
-    }
-#else
-  msyslog(LOG_EMERG, "REFCLOCK: NeoClock4X(%d): don't know how to set DTR/RTS to power NeoClock4X with this OS!",
-	  unit);
-  (void) close(fd);
-  return false;
-#endif
-
-  up = (struct neoclock4x_unit *) emalloc(sizeof(struct neoclock4x_unit));
-  if(!(up))
-    {
-      msyslog(LOG_ERR, "REFCLOCK: NeoClock4X(%d): can't allocate memory for: %s",unit, strerror(errno));
-      (void) close(fd);
-      return false;
-    }
-
-  memset((char *)up, 0, sizeof(struct neoclock4x_unit));
-  pp = peer->procptr;
-  pp->clockname = NAME;
-  pp->clockdesc = DESCRIPTION;
-  pp->unitptr = up;
-  pp->io.clock_recv = neoclock4x_receive;
-  pp->io.srcclock = peer;
-  pp->io.datalen = 0;
-  pp->io.fd = fd;
-  /*
-   * no fudge time is given by user!
-   * use 169.583333 ms to compensate the serial line delay
-   * formula is:
-   * 2400 Baud / 11 bit = 218.18 characters per second
-   *  (NeoClock4X timecode len)
-   */
-  pp->fudgetime1 = (NEOCLOCK4X_TIMECODELEN * 11) / 2400.0;
-
-  /*
-   * Initialize miscellaneous variables
-   */
-  peer->precision = -10;
-  memcpy((char *)&pp->refid, "neol", REFIDLEN);
-  peer->sstclktype = CTL_SST_TS_UHF;
-
-  up->leap_status = 0;
-  up->unit = (short)unit;
-  strlcpy(up->firmware, "?", sizeof(up->firmware));
-  up->firmwaretag = '?';
-  strlcpy(up->serial, "?", sizeof(up->serial));
-  strlcpy(up->radiosignal, "?", sizeof(up->radiosignal));
-  up->timesource  = '?';
-  up->dststatus   = '?';
-  up->quarzstatus = '?';
-  up->antenna1    = -1;
-  up->antenna2    = -1;
-  up->utc_year    = 0;
-  up->utc_month   = 0;
-  up->utc_day     = 0;
-  up->utc_hour    = 0;
-  up->utc_minute  = 0;
-  up->utc_second  = 0;
-  up->utc_msec    = 0;
-
-#if defined(NEOCLOCK4X_FIRMWARE)
-#if NEOCLOCK4X_FIRMWARE == NEOCLOCK4X_FIRMWARE_VERSION_A
-  strlcpy(up->firmware, "(c) 2002 NEOL S.A. FRANCE / L0.01 NDF:A:* (compile time)",
-	  sizeof(up->firmware));
-  up->firmwaretag = 'A';
-#else
-  msyslog(LOG_EMERG, "REFCLOCK: NeoClock4X(%d): unknown firmware defined at compile time for NeoClock4X",
-	  unit);
-  (void) close(fd);
-  pp->io.fd = -1;
-  free(pp->unitptr);
-  pp->unitptr = NULL;
-  return false;
-#endif
-#else
-  for(int tries = 0; tries < 5; tries++)
-    {
-      NLOG(NLOG_CLOCKINFO)
-	msyslog(LOG_INFO, "REFCLOCK: NeoClock4X(%d): checking NeoClock4X firmware version (%d/5)", unit, tries);
-      /* wait 3 seconds for receiver to power up */
-      sleep(3);
-      if(neol_query_firmware(pp->io.fd, up->unit, up->firmware, sizeof(up->firmware)))
-	{
-	  break;
-	}
-    }
-
-  /* can I handle this firmware version? */
-  if(!neol_check_firmware(up->unit, up->firmware, &up->firmwaretag))
-    {
-      (void) close(fd);
-      pp->io.fd = -1;
-      free(pp->unitptr);
-      pp->unitptr = NULL;
-      return false;
-    }
-#endif
-
-  if(!io_addclock(&pp->io))
-    {
-      msyslog(LOG_ERR, "REFCLOCK: NeoClock4X(%d): error add peer to ntpd: %s", unit, strerror(errno));
-      (void) close(fd);
-      pp->io.fd = -1;
-      free(pp->unitptr);
-      pp->unitptr = NULL;
-      return false;
-    }
-
-  NLOG(NLOG_CLOCKINFO)
-    msyslog(LOG_INFO, "REFCLOCK: NeoClock4X(%d): receiver setup successful done", unit);
-
-  return true;
-}
-
-static void
-neoclock4x_shutdown(
-		   struct refclockproc *pp)
-{
-    struct neoclock4x_unit *up;
-    int sl232;
-
-    if (pp != NULL)
-    {
-	up = pp->unitptr;
-	if(up != NULL)
-	{
-	    if(-1 !=  pp->io.fd)
-	    {
-#if defined(TIOCMSET) && (defined(TIOCM_RTS) || defined(CIOCM_RTS))
-		/* turn on RTS, and DTR for power supply */
-		/* NeoClock4x is powered from serial line */
-		if(ioctl(pp->io.fd, TIOCMGET, (void *)&sl232) == -1)
-		{
-		    msyslog(LOG_CRIT, "REFCLOCK: NeoClock4X(%d): can't query RTS/DTR state: %s",
-			    pp->refclkunit, strerror(errno));
-		}
-#ifdef TIOCM_RTS
-		/* turn on RTS, and DTR for power supply */
-		sl232 &= ~(TIOCM_DTR | TIOCM_RTS);
-#else
-		/* turn on RTS, and DTR for power supply */
-		sl232 &= ~(CIOCM_DTR | CIOCM_RTS);
-#endif
-		if(ioctl(pp->io.fd, TIOCMSET, (void *)&sl232) == -1)
-		{
-		    msyslog(LOG_CRIT, "REFCLOCK: NeoClock4X(%d): can't set RTS/DTR to power neoclock4x: %s",
-			    pp->refclkunit, strerror(errno));
-		}
-#endif
-		io_closeclock(&pp->io);
-	    }
-	    free(up);
-	    pp->unitptr = NULL;
-	}
-
-	msyslog(LOG_ERR, "REFCLOCK: NeoClock4X(%d): shutdown", pp->refclkunit);
-
-	NLOG(NLOG_CLOCKINFO)
-	    msyslog(LOG_INFO, "REFCLOCK: NeoClock4X(%d): receiver shutdown done", pp->refclkunit);
-    }
-}
-
-static void
-neoclock4x_receive(struct recvbuf *rbufp)
-{
-  struct neoclock4x_unit *up;
-  struct refclockproc *pp;
-  struct peer *peer;
-  unsigned long calc_utc;
-  int day;
-  int month;	/* ddd conversion */
-  int dsec;
-  unsigned char calc_chksum;
-  int recv_chksum;
-
-  peer = rbufp->recv_peer;
-  pp = peer->procptr;
-  up = pp->unitptr;
-
-  /* wait till poll interval is reached */
-  if (!up->recvnow)
-    return;
-
-  /* reset poll interval flag */
-  up->recvnow = false;
-
-  /* read last received timecode */
-  pp->lencode = refclock_gtlin(rbufp, pp->a_lastcode, BMAX, &pp->lastrec);
-  pp->leap = LEAP_NOWARNING;
-
-  if(NEOCLOCK4X_TIMECODELEN != pp->lencode)
-    {
-      NLOG(NLOG_CLOCKEVENT)
-	msyslog(LOG_WARNING, "REFCLOCK: NeoClock4X(%d): received data has invalid length, expected %d bytes, received %d bytes: %s",
-		up->unit, NEOCLOCK4X_TIMECODELEN, pp->lencode, pp->a_lastcode);
-      refclock_report(peer, CEVNT_BADREPLY);
-      return;
-    }
-
-  neol_hexatoi_len(&pp->a_lastcode[NEOCLOCK4X_OFFSET_CRC], &recv_chksum, 2);
-
-  /* calculate checksum */
-  calc_chksum = 0;
-  for(int c = 0; c < NEOCLOCK4X_OFFSET_CRC; c++)
-    {
-      calc_chksum += pp->a_lastcode[c];
-    }
-  if(recv_chksum != calc_chksum)
-    {
-      NLOG(NLOG_CLOCKEVENT)
-	msyslog(LOG_WARNING, "REFCLOCK: NeoClock4X(%d): received data has invalid chksum: %s",
-		up->unit, pp->a_lastcode);
-      refclock_report(peer, CEVNT_BADREPLY);
-      return;
-    }
-
-  /* Allow synchronization even is quartz clock is
-   * never initialized.
-   * WARNING: This is dangerous!
-   */
-  up->quarzstatus = pp->a_lastcode[NEOCLOCK4X_OFFSET_QUARZSTATUS];
-  if(0==(pp->sloppyclockflag & CLK_FLAG2))
-    {
-      if('I' != up->quarzstatus)
-	{
-	  NLOG(NLOG_CLOCKEVENT)
-	    msyslog(LOG_NOTICE, "REFCLOCK: NeoClock4X(%d): quartz clock is not initialized: %s",
-		    up->unit, pp->a_lastcode);
-	  pp->leap = LEAP_NOTINSYNC;
-	  refclock_report(peer, CEVNT_BADDATE);
-	  return;
-	}
-    }
-  if('I' != up->quarzstatus)
-    {
-      NLOG(NLOG_CLOCKEVENT)
-	msyslog(LOG_NOTICE, "REFCLOCK: NeoClock4X(%d): using uninitialized quartz clock for time synchronization: %s",
-		up->unit, pp->a_lastcode);
-    }
-
-  /*
-   * If NeoClock4X is not synchronized to a radio clock
-   * check if we're allowed to synchronize with the quartz
-   * clock.
-   */
-  up->timesource = pp->a_lastcode[NEOCLOCK4X_OFFSET_TIMESOURCE];
-  if(0==(pp->sloppyclockflag & CLK_FLAG2))
-    {
-      if('A' != up->timesource)
-	{
-	  /* not allowed to sync with quartz clock */
-	  if(0==(pp->sloppyclockflag & CLK_FLAG1))
-	    {
-	      refclock_report(peer, CEVNT_BADTIME);
-	      pp->leap = LEAP_NOTINSYNC;
-	      return;
-	    }
-	}
-    }
-
-  /* this should only used when first install is done */
-  if(pp->sloppyclockflag & CLK_FLAG4)
-    {
-      msyslog(LOG_DEBUG, "REFCLOCK: NeoClock4X(%d): received data: %s",
-	      up->unit, pp->a_lastcode);
-    }
-
-  /* 123456789012345678901234567890123456789012345 */
-  /* S/N123456DCF1004021010001202ASX1213CR\r\n */
-
-  neol_atoi_len(&pp->a_lastcode[NEOCLOCK4X_OFFSET_YEAR], &pp->year, 2);
-  neol_atoi_len(&pp->a_lastcode[NEOCLOCK4X_OFFSET_MONTH], &month, 2);
-  neol_atoi_len(&pp->a_lastcode[NEOCLOCK4X_OFFSET_DAY], &day, 2);
-  neol_atoi_len(&pp->a_lastcode[NEOCLOCK4X_OFFSET_HOUR], &pp->hour, 2);
-  neol_atoi_len(&pp->a_lastcode[NEOCLOCK4X_OFFSET_MINUTE], &pp->minute, 2);
-  neol_atoi_len(&pp->a_lastcode[NEOCLOCK4X_OFFSET_SECOND], &pp->second, 2);
-  neol_atoi_len(&pp->a_lastcode[NEOCLOCK4X_OFFSET_HSEC], &dsec, 2);
-  pp->nsec = dsec * 10 * NSEC_TO_MILLI; /* convert 1/100s from neoclock to nanoseconds */
-
-  memcpy(up->radiosignal, &pp->a_lastcode[NEOCLOCK4X_OFFSET_RADIOSIGNAL], 3);
-  up->radiosignal[3] = 0;
-  memcpy(up->serial, &pp->a_lastcode[NEOCLOCK4X_OFFSET_SERIAL], 6);
-  up->serial[6] = 0;
-  up->dststatus = pp->a_lastcode[NEOCLOCK4X_OFFSET_DSTSTATUS];
-  neol_hexatoi_len(&pp->a_lastcode[NEOCLOCK4X_OFFSET_ANTENNA1], &up->antenna1, 2);
-  neol_hexatoi_len(&pp->a_lastcode[NEOCLOCK4X_OFFSET_ANTENNA2], &up->antenna2, 2);
-
-  /*
-    Validate received values at least enough to prevent internal
-    array-bounds problems, etc.
-  */
-  if((pp->hour < 0) || (pp->hour > 23) ||
-     (pp->minute < 0) || (pp->minute > 59) ||
-     (pp->second < 0) || (pp->second > 60) /*Allow for leap seconds.*/ ||
-     (day < 1) || (day > 31) ||
-     (month < 1) || (month > 12) ||
-     (pp->year < 0) || (pp->year > 99)) {
-    /* Data out of range. */
-    NLOG(NLOG_CLOCKEVENT)
-      msyslog(LOG_WARNING, "REFCLOCK: NeoClock4X(%d): date/time out of range: %s",
-	      up->unit, pp->a_lastcode);
-    refclock_report(peer, CEVNT_BADDATE);
-    return;
-  }
-
-  /* Year-2000 check not needed anymore. Same problem
-   * will arise at 2099 but what should we do...?
-   *
-   * wrap 2-digit date into 4-digit
-   *
-   * if(pp->year < YEAR_PIVOT)
-   * {
-   *   pp->year += 100;
-   * }
-  */
-  pp->year += 2000;
-
-  /* adjust NeoClock4X local time to UTC */
-  calc_utc = neol_mktime(pp->year, month, day, pp->hour, pp->minute, pp->second);
-  calc_utc -= SECSPERHR;
-  /* adjust NeoClock4X daylight saving time if needed */
-  if('S' == up->dststatus)
-    calc_utc -= SECSPERHR;
-  neol_localtime(calc_utc, &pp->year, &month, &day, &pp->hour, &pp->minute, &pp->second);
-
-  /*
-    some preparations
-  */
-  pp->day = ymd2yd(pp->year, month, day);
-  pp->leap = 0;
-
-  if(pp->sloppyclockflag & CLK_FLAG4)
-    {
-      msyslog(LOG_DEBUG, "REFCLOCK: NeoClock4X(%d): calculated UTC date/time: %04d-%02d-%02d %02d:%02d:%02d.%03ld",
-	      up->unit,
-	      pp->year, month, day,
-	      pp->hour, pp->minute, pp->second,
-              pp->nsec/NSEC_TO_MILLI
-              );
-    }
-
-  up->utc_year   = pp->year;
-  up->utc_month  = month;
-  up->utc_day    = day;
-  up->utc_hour   = pp->hour;
-  up->utc_minute = pp->minute;
-  up->utc_second = pp->second;
-  up->utc_msec   = (int)pp->nsec/NSEC_TO_MILLI;
-
-  if(!refclock_process(pp))
-    {
-      NLOG(NLOG_CLOCKEVENT)
-	msyslog(LOG_WARNING, "REFCLOCK: NeoClock4X(%d): refclock_process failed!", up->unit);
-      refclock_report(peer, CEVNT_FAULT);
-      return;
-    }
-  refclock_receive(peer);
-
-  /* report good status */
-  refclock_report(peer, CEVNT_NOMINAL);
-
-  record_clock_stats(peer, pp->a_lastcode);
-}
-
-static void
-neoclock4x_poll(int unit,
-		struct peer *peer)
-{
-  struct neoclock4x_unit *up;
-  struct refclockproc *pp;
-
-  UNUSED_ARG(unit);
-
-  pp = peer->procptr;
-  up = pp->unitptr;
-
-  pp->polls++;
-  up->recvnow = true;
-}
-
-static void
-neoclock4x_control(int unit,
-		   const struct refclockstat *in,
-		   struct refclockstat *out,
-		   struct peer *peer)
-{
-  struct neoclock4x_unit *up;
-  struct refclockproc *pp;
-
-  if(NULL == peer)
-    {
-      msyslog(LOG_ERR, "REFCLOCK: NeoClock4X(%d): control: unit invalid/inactive", unit);
-      return;
-    }
-
-  pp = peer->procptr;
-  if(NULL == pp)
-    {
-      msyslog(LOG_ERR, "REFCLOCK: NeoClock4X(%d): control: unit invalid/inactive", unit);
-      return;
-    }
-
-  up = pp->unitptr;
-  if(NULL == up)
-    {
-      msyslog(LOG_ERR, "REFCLOCK: NeoClock4X(%d): control: unit invalid/inactive", unit);
-      return;
-    }
-
-  if(NULL != in)
-    {
-      /* check to see if a user supplied time offset is given */
-      if(in->haveflags & CLK_HAVETIME1)
-	{
-	  pp->fudgetime1 = in->fudgetime1;
-	  NLOG(NLOG_CLOCKINFO)
-	    msyslog(LOG_NOTICE, "REFCLOCK: NeoClock4X(%d): using fudgetime1 with %0.5fs from ntp.conf.",
-		    unit, pp->fudgetime1);
-	}
-
-      /* notify */
-      if(pp->sloppyclockflag & CLK_FLAG1)
-	{
-	  NLOG(NLOG_CLOCKINFO)
-	    msyslog(LOG_NOTICE, "REFCLOCK: NeoClock4X(%d): quartz clock is used to synchronize time if radio clock has no reception.", unit);
-	}
-      else
-	{
-	  NLOG(NLOG_CLOCKINFO)
-	    msyslog(LOG_NOTICE, "REFCLOCK: NeoClock4X(%d): time is only adjusted with radio signal reception.", unit);
-	}
-    }
-
-  if(NULL != out)
-    {
-      char *tt;
-      char tmpbuf[80];
-
-      out->kv_list = (struct ctl_var *)0;
-
-      snprintf(tmpbuf, sizeof(tmpbuf)-1,
-	       "%04d-%02d-%02d %02d:%02d:%02d.%03d",
-	       up->utc_year, up->utc_month, up->utc_day,
-	       up->utc_hour, up->utc_minute, up->utc_second,
-	       up->utc_msec);
-      tt = add_var(&out->kv_list, sizeof(tmpbuf)+20, RO|DEF);
-      snprintf(tt, sizeof(tmpbuf)+20, "calc_utc=\"%s\"", tmpbuf);
-
-#define MAXINTSIZE	20	/* max % of decimal digits in integer */
-#define S_RADIOSIGNAL	sizeof(up->radiosignal) + 15
-      tt = add_var(&out->kv_list, S_RADIOSIGNAL+1, RO|DEF);
-      snprintf(tt, S_RADIOSIGNAL, "radiosignal=\"%s\"", up->radiosignal);
-#undef S_RADIOSIGNAL
-#define S_ANTENNA1	MAXINTSIZE + 12
-      tt = add_var(&out->kv_list, S_ANTENNA1+1, RO|DEF);
-      snprintf(tt, S_ANTENNA1, "antenna1=\"%d\"", up->antenna1);
-#undef S_ANTENNA1
-#define S_ANTENNA2	MAXINTSIZE + 12
-      tt = add_var(&out->kv_list, S_ANTENNA2+1, RO|DEF);
-      snprintf(tt, S_ANTENNA2, "antenna2=\"%d\"", up->antenna2);
-#undef S_ANTENNA2
-      tt = add_var(&out->kv_list, 40, RO|DEF);
-      if('A' == up->timesource)
-	snprintf(tt, 39, "timesource=\"radio\"");
-      else if('C' == up->timesource)
-	snprintf(tt, 39, "timesource=\"quartz\"");
-      else
-	snprintf(tt, 39, "timesource=\"unknown\"");
-      tt = add_var(&out->kv_list, 40, RO|DEF);
-      if('I' == up->quarzstatus)
-	snprintf(tt, 39, "quartzstatus=\"synchronized\"");
-      else if('X' == up->quarzstatus)
-        snprintf(tt, 39, "quartzstatus=\"not synchronized\"");
-      else
-	snprintf(tt, 39, "quartzstatus=\"unknown\"");
-      tt = add_var(&out->kv_list, 40, RO|DEF);
-      if('S' == up->dststatus)
-        snprintf(tt, 39, "dststatus=\"summer\"");
-      else if('W' == up->dststatus)
-        snprintf(tt, 39, "dststatus=\"winter\"");
-      else
-        snprintf(tt, 39, "dststatus=\"unknown\"");
-#define S_FIRMWARE	sizeof(up->firmware) + 13
-      tt = add_var(&out->kv_list, S_FIRMWARE+1, RO|DEF);
-      snprintf(tt, S_FIRMWARE, "firmware=\"%s\"", up->firmware);
-#undef S_FIRMWARE
-#define S_FIRMWARETAG	sizeof(up->firmware) + 15
-      tt = add_var(&out->kv_list, S_FIRMWARETAG+1, RO|DEF);
-      snprintf(tt, S_FIRMWARETAG, "firmwaretag=\"%c\"", up->firmwaretag);
-#undef S_FIRMWARETAG
-      tt = add_var(&out->kv_list, 80, RO|DEF);
-      snprintf(tt, 79, "driver version=\"%s\"", NEOCLOCK4X_DRIVER_VERSION);
-#define S_SERIAL	sizeof(up->serial) + 16
-      tt = add_var(&out->kv_list, S_SERIAL+1, RO|DEF);
-      snprintf(tt, S_SERIAL, "serialnumber=\"%s\"", up->serial);
-#undef S_SERIAL
-#undef MAXINTSIZE
-    }
-}
-
-static int
-neol_hexatoi_len(const char str[],
-		 int *result,
-		 int maxlen)
-{
-  int hexdigit;
-  int n = 0;
-
-  for(int i = 0; isxdigit((unsigned char)str[i]) && i < maxlen; i++)
-    {
-      hexdigit = isdigit((unsigned char)str[i]) ? toupper((unsigned char)str[i]) - '0' : toupper((unsigned char)str[i]) - 'A' + 10;
-      n = 16 * n + hexdigit;
-    }
-  *result = n;
-  return (n);
-}
-
-static int
-neol_atoi_len(const char str[],
-		  int *result,
-		  int maxlen)
-{
-  int digit;
-  int n = 0;
-
-  for(int i = 0; isdigit((unsigned char)str[i]) && i < maxlen; i++)
-    {
-      digit = str[i] - '0';
-      n = 10 * n + digit;
-    }
-  *result = n;
-  return (n);
-}
-
-/* Converts Gregorian date to seconds since 1970-01-01 00:00:00.
- * Assumes input in normal date format, i.e. 1980-12-31 23:59:59
- * => year=1980, mon=12, day=31, hour=23, min=59, sec=59.
- *
- * [For the Julian calendar (which was used in Russia before 1917,
- * Britain & colonies before 1752, anywhere else before 1582,
- * and is still in use by some communities) leave out the
- * -year/100+year/400 terms, and add 10.]
- *
- * This algorithm was first published by Gauss (I think).
- *
- * WARNING: this function will overflow on 2106-02-07 06:28:16 on
- * machines were long is 32-bit! (However, as time_t is signed, we
- * will already get problems at other places on 2038-01-19 03:14:08)
- */
-static unsigned long
-neol_mktime(int year,
-	    int mon,
-	    int day,
-	    int hour,
-	    int min,
-	    int sec)
-{
-  if (0 >= (int) (mon -= 2)) {    /* 1..12 . 11,12,1..10 */
-    mon += 12;      /* Puts Feb last since it has leap day */
-    year -= 1;
-  }
-  return (((
-            (unsigned long)(year/4 - year/100 + year/400 + 367*mon/12 + day) +
-            (unsigned int)year*365 - 719499
-            )*24 + (unsigned int)hour /* now have hours */
-           )*60 + (unsigned int)min /* now have minutes */
-          )*60 + (unsigned int)sec; /* finally seconds */
-}
-
-static void
-neol_localtime(unsigned long utc,
-	       int* year,
-	       int* month,
-	       int* day,
-	       int* hour,
-	       int* min,
-	       int* sec)
-{
-  *sec = (int)(utc % 60);
-  utc /= 60;
-  *min = (int)(utc % 60);
-  utc /= 60;
-  *hour = (int)(utc % 24);
-  utc /= 24;
-
-  /*             JDN Date 1/1/1970 */
-  neol_jdn_to_ymd(utc + 2440588L, year, month, day);
-}
-
-static void
-neol_jdn_to_ymd(unsigned long jdn,
-		int *yy,
-		int *mm,
-		int *dd)
-{
-  unsigned long x, z, m, d, y;
-  unsigned long daysPer400Years = 146097UL;
-  unsigned long fudgedDaysPer4000Years = 1460970UL + 31UL;
-
-  x = jdn + 68569UL;
-  z = 4UL * x / daysPer400Years;
-  x = x - (daysPer400Years * z + 3UL) / 4UL;
-  y = 4000UL * (x + 1) / fudgedDaysPer4000Years;
-  x = x - 1461UL * y / 4UL + 31UL;
-  m = 80UL * x / 2447UL;
-  d = x - 2447UL * m / 80UL;
-  x = m / 11UL;
-  m = m + 2UL - 12UL * x;
-  y = 100UL * (z - 49UL) + y + x;
-
-  *yy = (int)y;
-  *mm = (int)m;
-  *dd = (int)d;
-}
-
-#if !defined(NEOCLOCK4X_FIRMWARE)
-static int
-neol_query_firmware(int fd,
-		    int unit,
-		    char *firmware,
-		    size_t maxlen)
-{
-  char tmpbuf[256];
-  size_t len;
-  int lastsearch;
-  unsigned char c;
-  bool last_c_was_crlf;
-  bool last_crlf_conv_len;
-  bool init;
-  int read_errors;
-  bool flag = false;
-  int chars_read;
-
-  /* wait a little bit */
-  sleep(1);
-  if(-1 != write(fd, "V", 1))
-    {
-      /* wait a little bit */
-      sleep(1);
-      memset(tmpbuf, 0x00, sizeof(tmpbuf));
-
-      len = 0;
-      lastsearch = 0;
-      last_c_was_crlf = false;
-      last_crlf_conv_len = 0;
-      init = true;
-      read_errors = 0;
-      chars_read = 0;
-      for(;;)
-	{
-	  if(read_errors > 5)
-	    {
-	      msyslog(LOG_ERR, "REFCLOCK: NeoClock4X(%d): can't read firmware version (timeout)", unit);
-	      strlcpy(tmpbuf, "unknown due to timeout", sizeof(tmpbuf));
-	      break;
-	    }
-          if(chars_read > 500)
-            {
-	      msyslog(LOG_ERR, "REFCLOCK: NeoClock4X(%d): can't read firmware version (garbage)", unit);
-	      strlcpy(tmpbuf, "unknown due to garbage input", sizeof(tmpbuf));
-	      break;
-            }
-	  if(-1 == read(fd, &c, 1))
-	    {
-              if(EAGAIN != errno)
-                {
-                  msyslog(LOG_DEBUG, "NeoClock4x(%d): read: %s", unit, strerror(errno));
-                  read_errors++;
-                }
-              else
-                {
-                  sleep(1);
-                }
-	      continue;
-	    }
-          else
-            {
-              chars_read++;
-            }
-
-	  if(init)
-	    {
-	      if(0xA9 != c) /* wait for (c) char in input stream */
-		continue;
-
-	      strlcpy(tmpbuf, "(c)", sizeof(tmpbuf));
-	      len = 3;
-	      init = false;
-	      continue;
-	    }
-
-#if 0
-	  msyslog(LOG_NOTICE, "REFCLOCK: NeoClock4X(%d): firmware %c = %02Xh", unit, c, c);
-#endif
-
-	  if(0x0A == c || 0x0D == c)
-	    {
-	      if(last_c_was_crlf)
-		{
-		  char *ptr;
-		  ptr = strstr(&tmpbuf[lastsearch], "S/N");
-		  if(NULL != ptr)
-		    {
-		      tmpbuf[last_crlf_conv_len] = 0;
-		      flag = true;
-		      break;
-		    }
-		  /* convert \n to / */
-		  last_crlf_conv_len = len;
-		  tmpbuf[len++] = ' ';
-		  tmpbuf[len++] = '/';
-		  tmpbuf[len++] = ' ';
-		  lastsearch = (int)len;
-		}
-	      last_c_was_crlf = true;
-	    }
-	  else
-	    {
-	      last_c_was_crlf = false;
-	      if(0x00 != c)
-		tmpbuf[len++] = (char) c;
-	    }
-	  tmpbuf[len] = '\0';
-	  if (len > sizeof(tmpbuf)-5)
-	    break;
-	}
-    }
-  else
-    {
-      msyslog(LOG_ERR, "REFCLOCK: NeoClock4X(%d): can't query firmware version", unit);
-      strlcpy(tmpbuf, "unknown error", sizeof(tmpbuf));
-    }
-  if (strlcpy(firmware, tmpbuf, maxlen) >= maxlen)
-    strlcpy(firmware, "buffer too small", maxlen);
-
-  if(flag)
-    {
-      NLOG(NLOG_CLOCKINFO)
-	msyslog(LOG_INFO, "REFCLOCK: NeoClock4X(%d): firmware version: %s", unit, firmware);
-
-      if(strstr(firmware, "/R2"))
-	{
-	  msyslog(LOG_INFO, "REFCLOCK: NeoClock4X(%d): Your NeoClock4X uses the new R2 firmware release. Please note the changed LED behaviour.", unit);
-	}
-
-    }
-
-  return (flag);
-}
-
-static bool
-neol_check_firmware(int unit,
-                    const char *firmware,
-                    char *firmwaretag)
-{
-  char *ptr;
-
-  *firmwaretag = '?';
-  ptr = strstr(firmware, "NDF:");
-  if(NULL != ptr)
-    {
-      if((strlen(firmware) - strlen(ptr)) >= 7)
-        {
-          if(':' == *(ptr+5) && '*' == *(ptr+6))
-            *firmwaretag = *(ptr+4);
-        }
-    }
-
-  if('A' != *firmwaretag)
-    {
-      msyslog(LOG_CRIT, "REFCLOCK: NeoClock4X(%d): firmware version \"%c\" not supported with this driver version!", unit, *firmwaretag);
-      return false;
-    }
-
-  return true;
-}
-#endif
-
-/*
- * History:
- * refclock_neoclock4x.c
- *
- * 2002/04/27 cjh
- * Revision 1.0  first release
- *
- * 2002/07/15 cjh
- * preparing for bitkeeper reposity
- *
- * 2002/09/09 cjh
- * Revision 1.1
- * - don't assume sprintf returns an int anymore
- * - change the way the firmware version is read
- * - some customers would like to put a device called
- *   data diode to the NeoClock4X device to disable
- *   the write line. We need to now the firmware
- *   version even in this case. We made a compile time
- *   definition in this case. The code was previously
- *   only available on request.
- *
- * 2003/01/08 cjh
- * Revision 1.11
- * - changing xprinf to xnprinf to avoid buffer overflows
- * - change some logic
- * - fixed memory leaks if drivers can't initialize
- *
- * 2003/01/10 cjh
- * Revision 1.12
- * - replaced ldiv
- * - add code to support FreeBSD
- *
- * 2003/07/07 cjh
- * Revision 1.13
- * - fix reporting of clock status
- *   changes. previously a bad clock
- *   status was never reset.
- *
- * 2004/04/07 cjh
- * Revision 1.14
- * - open serial port in a way
- *   AIX and some other OS can
- *   handle much better
- *
- * 2006/01/11 cjh
- * Revision 1.15
- * - remove some unused #ifdefs
- * - fix nsec calculation, closes #499
- *
- * 2009/12/04 cjh
- * Revision 1.16
- * - change license to ntp COPYRIGHT notice. This should allow Debian
- *   to add this refclock driver in further releases.
- * - detect R2 hardware
- *
- */
-
-
-
-
-
-


=====================================
wafhelpers/refclock.py
=====================================
@@ -95,12 +95,6 @@ refclock_map = {
         "file":     "zyfer"
     },
 
-    "neoclock": {
-        "descr":    "NeoClock4X - DCF77 / TDF serial line",
-        "define":   "CLOCK_NEOCLOCK",
-        "file":     "neoclock"
-    },
-
     "gpsd": {
         "descr":    "GPSD NG client protocol",
         "define":   "CLOCK_GPSDJSON",



View it on GitLab: https://gitlab.com/NTPsec/ntpsec/commit/bea33b6e8aa518513f7e0ad2e8b687f182685ae9

-- 
View it on GitLab: https://gitlab.com/NTPsec/ntpsec/commit/bea33b6e8aa518513f7e0ad2e8b687f182685ae9
You're receiving this email because of your account on gitlab.com.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ntpsec.org/pipermail/vc/attachments/20190815/2e8a4f9b/attachment-0001.htm>


More information about the vc mailing list