File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / libparse / clk_dcf7000.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_dcf7000.c,v 4.10 2005/04/16 17:32:10 kardel RELEASE_20050508_A
    3:  *  
    4:  * clk_dcf7000.c,v 4.10 2005/04/16 17:32:10 kardel RELEASE_20050508_A
    5:  *
    6:  * ELV DCF7000 module
    7:  *
    8:  * Copyright (c) 1995-2005 by Frank Kardel <kardel <AT> ntp.org>
    9:  * Copyright (c) 1989-1994 by Frank Kardel, Friedrich-Alexander Universität Erlangen-Nürnberg, Germany
   10:  *
   11:  * Redistribution and use in source and binary forms, with or without
   12:  * modification, are permitted provided that the following conditions
   13:  * are met:
   14:  * 1. Redistributions of source code must retain the above copyright
   15:  *    notice, this list of conditions and the following disclaimer.
   16:  * 2. Redistributions in binary form must reproduce the above copyright
   17:  *    notice, this list of conditions and the following disclaimer in the
   18:  *    documentation and/or other materials provided with the distribution.
   19:  * 3. Neither the name of the author nor the names of its contributors
   20:  *    may be used to endorse or promote products derived from this software
   21:  *    without specific prior written permission.
   22:  *
   23:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   24:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   25:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   26:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   27:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   28:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   29:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   30:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   31:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   32:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   33:  * SUCH DAMAGE.
   34:  *
   35:  */
   36: 
   37: #ifdef HAVE_CONFIG_H
   38: # include <config.h>
   39: #endif
   40: 
   41: #if defined(REFCLOCK) && defined(CLOCK_PARSE) && defined(CLOCK_DCF7000)
   42: 
   43: #include "ntp_fp.h"
   44: #include "ntp_unixtime.h"
   45: #include "ntp_calendar.h"
   46: 
   47: #include "parse.h"
   48: 
   49: #ifndef PARSESTREAM
   50: #include "ntp_stdlib.h"
   51: #include <stdio.h>
   52: #else
   53: #include "sys/parsestreams.h"
   54: extern int printf (const char *, ...);
   55: #endif
   56: 
   57: static struct format dcf7000_fmt =
   58: {				/* ELV DCF7000 */
   59: 	{
   60: 		{  6, 2}, {  3, 2}, {  0, 2},
   61: 		{ 12, 2}, { 15, 2}, { 18, 2},
   62: 		{  9, 2}, { 21, 2},
   63: 	},
   64: 	(const unsigned char *)"  -  -  -  -  -  -  -  \r",
   65: 	0
   66: };    
   67: static u_long cvt_dcf7000 (unsigned char *, int, struct format *, clocktime_t *, void *);
   68: static unsigned long inp_dcf7000 (parse_t *, unsigned int, timestamp_t *);
   69: 
   70: clockformat_t clock_dcf7000 =
   71: {
   72:   inp_dcf7000,			/* DCF7000 input handling */
   73:   cvt_dcf7000,			/* ELV DCF77 conversion */
   74:   0,				/* no direct PPS monitoring */
   75:   (void *)&dcf7000_fmt,		/* conversion configuration */
   76:   "ELV DCF7000",		/* ELV clock */
   77:   24,				/* string buffer */
   78:   0				/* no private data (complete pakets) */
   79: };
   80: 
   81: /*
   82:  * cvt_dcf7000
   83:  *
   84:  * convert dcf7000 type format
   85:  */
   86: static u_long
   87: cvt_dcf7000(
   88: 	    unsigned char *buffer,
   89: 	    int            size,
   90: 	    struct format *format,
   91: 	    clocktime_t   *clock_time,
   92: 	    void          *local
   93: 	    )
   94: {
   95: 	if (!Strok(buffer, format->fixed_string))
   96: 	{
   97: 		return CVT_NONE;
   98: 	}
   99: 	else
  100: 	{
  101: 		if (Stoi(&buffer[format->field_offsets[O_DAY].offset], &clock_time->day,
  102: 			 format->field_offsets[O_DAY].length) ||
  103: 		    Stoi(&buffer[format->field_offsets[O_MONTH].offset], &clock_time->month,
  104: 			 format->field_offsets[O_MONTH].length) ||
  105: 		    Stoi(&buffer[format->field_offsets[O_YEAR].offset], &clock_time->year,
  106: 			 format->field_offsets[O_YEAR].length) ||
  107: 		    Stoi(&buffer[format->field_offsets[O_HOUR].offset], &clock_time->hour,
  108: 			 format->field_offsets[O_HOUR].length) ||
  109: 		    Stoi(&buffer[format->field_offsets[O_MIN].offset], &clock_time->minute,
  110: 			 format->field_offsets[O_MIN].length) ||
  111: 		    Stoi(&buffer[format->field_offsets[O_SEC].offset], &clock_time->second,
  112: 			 format->field_offsets[O_SEC].length))
  113: 		{
  114: 			return CVT_FAIL|CVT_BADFMT;
  115: 		}
  116: 		else
  117: 		{
  118: 			unsigned char *f = &buffer[format->field_offsets[O_FLAGS].offset];
  119: 			long flags;
  120: 	  
  121: 			clock_time->flags = 0;
  122: 			clock_time->usecond = 0;
  123: 
  124: 			if (Stoi(f, &flags, format->field_offsets[O_FLAGS].length))
  125: 			{
  126: 				return CVT_FAIL|CVT_BADFMT;
  127: 			}
  128: 			else
  129: 			{
  130: 				if (flags & 0x1)
  131: 				    clock_time->utcoffset = -2*60*60;
  132: 				else
  133: 				    clock_time->utcoffset = -1*60*60;
  134: 
  135: 				if (flags & 0x2)
  136: 				    clock_time->flags |= PARSEB_ANNOUNCE;
  137: 
  138: 				if (flags & 0x4)
  139: 				    clock_time->flags |= PARSEB_NOSYNC;
  140: 			}
  141: 			return CVT_OK;
  142: 		}
  143: 	}
  144: }
  145: 
  146: /*
  147:  * inp_dcf700
  148:  *
  149:  * grep data from input stream
  150:  */
  151: static u_long
  152: inp_dcf7000(
  153: 	  parse_t      *parseio,
  154: 	  unsigned int  ch,
  155: 	  timestamp_t  *tstamp
  156: 	  )
  157: {
  158: 	unsigned int rtc;
  159: 	
  160: 	parseprintf(DD_PARSE, ("inp_dcf7000(0x%lx, 0x%x, ...)\n", (long)parseio, ch));
  161: 	
  162: 	switch (ch)
  163: 	{
  164: 	case '\r':
  165: 		parseprintf(DD_PARSE, ("inp_dcf7000: EOL seen\n"));
  166: 		parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */
  167: 		if ((rtc = parse_addchar(parseio, ch)) == PARSE_INP_SKIP)
  168: 			return parse_end(parseio);
  169: 		else
  170: 			return rtc;
  171: 
  172: 	default:
  173: 		return parse_addchar(parseio, ch);
  174: 	}
  175: }
  176: 
  177: #else /* not (REFCLOCK && CLOCK_PARSE && CLOCK_DCF7000) */
  178: int clk_dcf7000_bs;
  179: #endif /* not (REFCLOCK && CLOCK_PARSE && CLOCK_DCF7000) */
  180: 
  181: /*
  182:  * History:
  183:  *
  184:  * clk_dcf7000.c,v
  185:  * Revision 4.10  2005/04/16 17:32:10  kardel
  186:  * update copyright
  187:  *
  188:  * Revision 4.9  2004/11/14 15:29:41  kardel
  189:  * support PPSAPI, upgrade Copyright to Berkeley style
  190:  *
  191:  * Revision 4.6  1999/11/28 09:13:49  kardel
  192:  * RECON_4_0_98F
  193:  *
  194:  * Revision 4.5  1998/06/14 21:09:34  kardel
  195:  * Sun acc cleanup
  196:  *
  197:  * Revision 4.4  1998/06/13 12:01:59  kardel
  198:  * fix SYSV clock name clash
  199:  *
  200:  * Revision 4.3  1998/06/12 15:22:27  kardel
  201:  * fix prototypes
  202:  *
  203:  * Revision 4.2  1998/06/12 09:13:24  kardel
  204:  * conditional compile macros fixed
  205:  * printf prototype
  206:  *
  207:  * Revision 4.1  1998/05/24 09:39:51  kardel
  208:  * implementation of the new IO handling model
  209:  *
  210:  * Revision 4.0  1998/04/10 19:45:28  kardel
  211:  * Start 4.0 release version numbering
  212:  *
  213:  * from V3 3.18 log info deleted 1998/04/11 kardel
  214:  */

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