File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / libparse / clk_hopf6021.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    1: /*
    2:  * /src/NTP/ntp4-dev/libparse/clk_hopf6021.c,v 4.10 2004/11/14 15:29:41 kardel RELEASE_20050508_A
    3:  *
    4:  * clk_hopf6021.c,v 4.10 2004/11/14 15:29:41 kardel RELEASE_20050508_A
    5:  *
    6:  * Radiocode Clocks HOPF Funkuhr 6021 mit serieller Schnittstelle
    7:  * base code version from 24th Nov 1995 - history at end
    8:  *
    9:  * Created by F.Schnekenbuehl <frank@comsys.dofn.de> from clk_rcc8000.c
   10:  * Nortel DASA Network Systems GmbH, Department: ND250
   11:  * A Joint venture of Daimler-Benz Aerospace and Nortel
   12:  *
   13:  * This program is distributed in the hope that it will be useful,
   14:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   15:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
   16:  *
   17:  */
   18: 
   19: #ifdef HAVE_CONFIG_H
   20: # include <config.h>
   21: #endif
   22: 
   23: #if defined(REFCLOCK) && defined(CLOCK_PARSE) && defined(CLOCK_HOPF6021)
   24: 
   25: #include "ntp_fp.h"
   26: #include "ntp_unixtime.h"
   27: #include "ntp_calendar.h"
   28: #include "ascii.h"
   29: 
   30: #include "parse.h"
   31: 
   32: #ifndef PARSESTREAM
   33: #include "ntp_stdlib.h"
   34: #include <stdio.h>
   35: #else
   36: #include "sys/parsestreams.h"
   37: extern int printf (const char *, ...);
   38: #endif
   39: 
   40: /* 
   41:  * hopf Funkuhr 6021 
   42:  *      used with 9600,8N1,
   43:  *      UTC ueber serielle Schnittstelle 
   44:  *      Sekundenvorlauf ON
   45:  *      ETX zum Sekundenvorlauf ON
   46:  *      Datenstring 6021
   47:  *      Ausgabe Uhrzeit und Datum
   48:  *      Senden mit Steuerzeichen
   49:  *      Senden sekuendlich
   50:  */
   51: 
   52: /*
   53:  *  Type 6021 Serial Output format
   54:  *
   55:  *      000000000011111111 / char
   56:  *      012345678901234567 \ position
   57:  *      sABHHMMSSDDMMYYnre  Actual
   58:  *       C4110046231195     Parse
   59:  *      s              enr  Check
   60:  *
   61:  *  s = STX (0x02), e = ETX (0x03)
   62:  *  n = NL  (0x0A), r = CR  (0x0D)
   63:  *
   64:  *  A B - Status and weekday
   65:  *
   66:  *  A - Status
   67:  *
   68:  *      8 4 2 1
   69:  *      x x x 0  - no announcement
   70:  *      x x x 1  - Summertime - wintertime - summertime announcement
   71:  *      x x 0 x  - Wintertime
   72:  *      x x 1 x  - Summertime
   73:  *      0 0 x x  - Time/Date invalid
   74:  *      0 1 x x  - Internal clock used 
   75:  *      1 0 x x  - Radio clock
   76:  *      1 1 x x  - Radio clock highprecision
   77:  *
   78:  *  B - 8 4 2 1
   79:  *      0 x x x  - MESZ/MEZ
   80:  *      1 x x x  - UTC
   81:  *      x 0 0 1  - Monday
   82:  *      x 0 1 0  - Tuesday
   83:  *      x 0 1 1  - Wednesday
   84:  *      x 1 0 0  - Thursday
   85:  *      x 1 0 1  - Friday
   86:  *      x 1 1 0  - Saturday
   87:  *      x 1 1 1  - Sunday
   88:  */
   89: 
   90: #define HOPF_DSTWARN	0x01	/* DST switch warning */
   91: #define HOPF_DST	0x02	/* DST in effect */
   92: 
   93: #define HOPF_MODE	0x0C	/* operation mode mask */	
   94: #define  HOPF_INVALID	0x00	/* no time code available */
   95: #define  HOPF_INTERNAL	0x04	/* internal clock */
   96: #define  HOPF_RADIO	0x08	/* radio clock */	
   97: #define  HOPF_RADIOHP	0x0C	/* high precision radio clock */
   98: 
   99: #define HOPF_UTC	0x08	/* time code in UTC */
  100: #define HOPF_WMASK	0x07	/* mask for weekday code */
  101: 
  102: static struct format hopf6021_fmt =
  103: {
  104: 	{
  105: 		{  9, 2 }, {11, 2}, { 13, 2}, /* Day, Month, Year */ 
  106: 		{  3, 2 }, { 5, 2}, {  7, 2}, /* Hour, Minute, Second */ 
  107: 		{  2, 1 }, { 1, 1}, {  0, 0}, /* Weekday, Flags, Zone */
  108: 		/* ... */
  109: 	},
  110: 	(const unsigned char *)"\002              \n\r\003",
  111: 	0 
  112: };
  113: 
  114: #define OFFS(x) format->field_offsets[(x)].offset
  115: #define STOI(x, y) Stoi(&buffer[OFFS(x)], y, format->field_offsets[(x)].length)
  116: #define hexval(x) (('0' <= (x) && (x) <= '9') ? (x) - '0' : \
  117: 		   ('a' <= (x) && (x) <= 'f') ? (x) - 'a' + 10 : \
  118: 		   ('A' <= (x) && (x) <= 'F') ? (x) - 'A' + 10 : \
  119: 		   -1)
  120: 
  121: static unsigned long cvt_hopf6021 (unsigned char *, int, struct format *, clocktime_t *, void *);
  122: static unsigned long inp_hopf6021 (parse_t *, unsigned int, timestamp_t *);
  123: 
  124: clockformat_t clock_hopf6021 =
  125: {
  126:   inp_hopf6021,			/* HOPF 6021 input handling */
  127:   cvt_hopf6021,                 /* Radiocode clock conversion */
  128:   0,				/* no direct PPS monitoring */
  129:   (void *)&hopf6021_fmt,        /* conversion configuration */
  130:   "hopf Funkuhr 6021",          /* clock format name */
  131:   19,                           /* string buffer */
  132:   0                            /* private data length, no private data */
  133: };
  134: 
  135: static unsigned long
  136: cvt_hopf6021(
  137: 	     unsigned char *buffer,
  138: 	     int            size,
  139: 	     struct format *format,
  140: 	     clocktime_t   *clock_time,
  141: 	     void          *local
  142: 	     )
  143: {
  144: 	unsigned char status,weekday;
  145: 
  146: 	if (!Strok(buffer, format->fixed_string))
  147: 	{
  148: 		return CVT_NONE;
  149: 	}
  150: 
  151: 	if (  STOI(O_DAY,   &clock_time->day)    ||
  152: 	      STOI(O_MONTH, &clock_time->month)  ||
  153: 	      STOI(O_YEAR,  &clock_time->year)   ||
  154: 	      STOI(O_HOUR,  &clock_time->hour)   ||
  155: 	      STOI(O_MIN,   &clock_time->minute) ||
  156: 	      STOI(O_SEC,   &clock_time->second)
  157: 	      )
  158: 	{
  159: 		return CVT_FAIL|CVT_BADFMT;
  160: 	}
  161: 
  162: 	clock_time->usecond   = 0;
  163: 	clock_time->utcoffset = 0;
  164: 
  165: 	status = hexval(buffer[OFFS(O_FLAGS)]);
  166: 	weekday= hexval(buffer[OFFS(O_WDAY)]);
  167: 
  168: 	if ((status == 0xFF) || (weekday == 0xFF))
  169: 	{
  170: 		return CVT_FAIL|CVT_BADFMT;
  171: 	}
  172: 
  173: 	clock_time->flags  = 0;
  174: 
  175: 	if (weekday & HOPF_UTC)
  176: 	{
  177: 		clock_time->flags |= PARSEB_UTC;
  178: 	}
  179: 	else
  180: 	{
  181: 		if (status & HOPF_DST)
  182: 		{
  183: 			clock_time->flags     |= PARSEB_DST;
  184: 			clock_time->utcoffset  = -2*60*60; /* MET DST */
  185: 		}
  186: 		else
  187: 		{
  188: 			clock_time->utcoffset  = -1*60*60; /* MET */
  189: 		}
  190: 	}
  191: 
  192: 	clock_time->flags |= (status & HOPF_DSTWARN)  ? PARSEB_ANNOUNCE : 0;
  193: 
  194: 	switch (status & HOPF_MODE)
  195: 	{
  196: 	    case HOPF_INVALID:  /* Time/Date invalid */
  197: 		clock_time->flags |= PARSEB_POWERUP;
  198: 		break;
  199: 
  200: 	    case HOPF_INTERNAL: /* internal clock */
  201: 		clock_time->flags |= PARSEB_NOSYNC;
  202: 		break;
  203: 
  204: 	    case HOPF_RADIO:    /* Radio clock */
  205: 	    case HOPF_RADIOHP:  /* Radio clock high precision */
  206: 		break;
  207: 
  208: 	    default:
  209: 		return CVT_FAIL|CVT_BADFMT;
  210: 	}
  211: 
  212: 	return CVT_OK;
  213: }
  214: 
  215: /*
  216:  * inp_hopf6021
  217:  *
  218:  * grep data from input stream
  219:  */
  220: static u_long
  221: inp_hopf6021(
  222: 	     parse_t      *parseio,
  223: 	     unsigned int  ch,
  224: 	     timestamp_t  *tstamp
  225: 	  )
  226: {
  227: 	unsigned int rtc;
  228: 	
  229: 	parseprintf(DD_PARSE, ("inp_hopf6021(0x%lx, 0x%x, ...)\n", (long)parseio, ch));
  230: 	
  231: 	switch (ch)
  232: 	{
  233: 	case ETX:
  234: 		parseprintf(DD_PARSE, ("inp_hopf6021: EOL seen\n"));
  235: 		parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */
  236: 		if ((rtc = parse_addchar(parseio, ch)) == PARSE_INP_SKIP)
  237: 			return parse_end(parseio);
  238: 		else
  239: 			return rtc;
  240: 
  241: 	default:
  242: 		return parse_addchar(parseio, ch);
  243: 	}
  244: }
  245: 
  246: #else /* not (REFCLOCK && CLOCK_PARSE && CLOCK_HOPF6021) */
  247: int clk_hopf6021_bs;
  248: #endif /* not (REFCLOCK && CLOCK_PARSE && CLOCK_HOPF6021) */
  249: 
  250: /*
  251:  * History:
  252:  *
  253:  * clk_hopf6021.c,v
  254:  * Revision 4.10  2004/11/14 15:29:41  kardel
  255:  * support PPSAPI, upgrade Copyright to Berkeley style
  256:  *
  257:  * Revision 4.7  1999/11/28 09:13:49  kardel
  258:  * RECON_4_0_98F
  259:  *
  260:  * Revision 4.6  1998/11/15 20:27:57  kardel
  261:  * Release 4.0.73e13 reconcilation
  262:  *
  263:  * Revision 4.5  1998/06/14 21:09:35  kardel
  264:  * Sun acc cleanup
  265:  *
  266:  * Revision 4.4  1998/06/13 12:02:38  kardel
  267:  * fix SYSV clock name clash
  268:  *
  269:  * Revision 4.3  1998/06/12 15:22:27  kardel
  270:  * fix prototypes
  271:  *
  272:  * Revision 4.2  1998/06/12 09:13:25  kardel
  273:  * conditional compile macros fixed
  274:  * printf prototype
  275:  *
  276:  * Revision 4.1  1998/05/24 09:39:52  kardel
  277:  * implementation of the new IO handling model
  278:  *
  279:  * Revision 4.0  1998/04/10 19:45:29  kardel
  280:  * Start 4.0 release version numbering
  281:  *
  282:  * from V3 3.6 log info deleted 1998/04/11 kardel
  283:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>