File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / libparse / clk_trimtaip.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_trimtaip.c,v 4.11 2005/04/16 17:32:10 kardel RELEASE_20050508_A
    3:  *
    4:  * clk_trimtaip.c,v 4.11 2005/04/16 17:32:10 kardel RELEASE_20050508_A
    5:  *
    6:  * Trimble SV6 clock support - several collected codepieces
    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_TRIMTAIP)
   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: /*	0000000000111111111122222222223333333	/ char
   58:  *	0123456789012345678901234567890123456	\ posn
   59:  *	>RTMhhmmssdddDDMMYYYYoodnnvrrrrr;*xx<	Actual
   60:  *	----33445566600112222BB7__-_____--99-	Parse
   61:  *	>RTM                      1     ;*  <",	Check
   62:  */
   63: 
   64: #define	hexval(x) (('0' <= (x) && (x) <= '9') ? (x) - '0' : \
   65: 		   ('a' <= (x) && (x) <= 'f') ? (x) - 'a' + 10 : \
   66: 		   ('A' <= (x) && (x) <= 'F') ? (x) - 'A' + 10 : \
   67: 		   -1)
   68: #define	O_USEC		O_WDAY
   69: #define	O_GPSFIX	O_FLAGS
   70: #define	O_CHKSUM	O_UTCHOFFSET
   71:      static struct format trimsv6_fmt =
   72: { { { 13, 2 }, {15, 2}, { 17, 4}, /* Day, Month, Year */
   73:     {  4, 2 }, { 6, 2}, {  8, 2}, /* Hour, Minute, Second */
   74:     { 10, 3 }, {23, 1}, {  0, 0}, /* uSec, FIXes (WeekDAY, FLAGS, ZONE) */
   75:     { 34, 2 }, { 0, 0}, { 21, 2}, /* cksum, -, utcS (UTC[HMS]OFFSET) */
   76: },
   77:   (const unsigned char *)">RTM                      1     ;*  <",
   78:   0
   79: };
   80: 
   81: static unsigned long cvt_trimtaip (unsigned char *, int, struct format *, clocktime_t *, void *);
   82: static unsigned long inp_trimtaip (parse_t *, unsigned int, timestamp_t *);
   83: 
   84: clockformat_t clock_trimtaip =
   85: {
   86:   inp_trimtaip,			/* no input handling */
   87:   cvt_trimtaip,			/* Trimble conversion */
   88:   pps_one,			/* easy PPS monitoring */
   89:   (void *)&trimsv6_fmt,		/* conversion configuration */
   90:   "Trimble TAIP",
   91:   37,				/* string buffer */
   92:   0				/* no private data */
   93: };
   94: 
   95: static unsigned long
   96: cvt_trimtaip(
   97: 	     unsigned char *buffer,
   98: 	     int            size,
   99: 	     struct format *format,
  100: 	     clocktime_t   *clock_time,
  101: 	     void          *local
  102: 	     )
  103: {
  104: 	long gpsfix;
  105: 	u_char calc_csum = 0;
  106: 	long   recv_csum;
  107: 	int	 i;
  108: 
  109: 	if (!Strok(buffer, format->fixed_string)) return CVT_NONE;
  110: #define	OFFS(x) format->field_offsets[(x)].offset
  111: #define	STOI(x, y) \
  112: 	Stoi(&buffer[OFFS(x)], y, \
  113: 	     format->field_offsets[(x)].length)
  114: 		if (	STOI(O_DAY,	&clock_time->day)	||
  115: 			STOI(O_MONTH,	&clock_time->month)	||
  116: 			STOI(O_YEAR,	&clock_time->year)	||
  117: 			STOI(O_HOUR,	&clock_time->hour)	||
  118: 			STOI(O_MIN,	&clock_time->minute)	||
  119: 			STOI(O_SEC,	&clock_time->second)	||
  120: 			STOI(O_USEC,	&clock_time->usecond)||
  121: 			STOI(O_GPSFIX,	&gpsfix)
  122: 			) return CVT_FAIL|CVT_BADFMT;
  123: 
  124: 	clock_time->usecond *= 1000;
  125: 	/* Check that the checksum is right */
  126: 	for (i=OFFS(O_CHKSUM)-1; i >= 0; i--) calc_csum ^= buffer[i];
  127: 	recv_csum =	(hexval(buffer[OFFS(O_CHKSUM)]) << 4) |
  128: 		hexval(buffer[OFFS(O_CHKSUM)+1]);
  129: 	if (recv_csum < 0) return CVT_FAIL|CVT_BADTIME;
  130: 	if (((u_char) recv_csum) != calc_csum) return CVT_FAIL|CVT_BADTIME;
  131: 
  132: 	clock_time->utcoffset = 0;
  133: 
  134: 	/* What should flags be set to ? */
  135: 	clock_time->flags = PARSEB_UTC;
  136: 
  137: 	/* if the current GPS fix is 9 (unknown), reject */
  138: 	if (0 > gpsfix || gpsfix > 9) clock_time->flags |= PARSEB_POWERUP;
  139: 
  140: 	return CVT_OK;
  141: }
  142: 
  143: /*
  144:  * inp_trimtaip
  145:  *
  146:  * grep data from input stream
  147:  */
  148: static u_long
  149: inp_trimtaip(
  150: 	     parse_t      *parseio,
  151: 	     unsigned int  ch,
  152: 	     timestamp_t  *tstamp
  153: 	  )
  154: {
  155: 	unsigned int rtc;
  156: 	
  157: 	parseprintf(DD_PARSE, ("inp_trimtaip(0x%lx, 0x%x, ...)\n", (long)parseio, ch));
  158: 	
  159: 	switch (ch)
  160: 	{
  161: 	case '>':
  162: 		parseprintf(DD_PARSE, ("inp_trimptaip: START seen\n"));
  163: 		
  164: 		parseio->parse_index = 1;
  165: 		parseio->parse_data[0] = ch;
  166: 		parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */
  167: 		return PARSE_INP_SKIP;
  168: 	  
  169: 	case '<':
  170: 		parseprintf(DD_PARSE, ("inp_trimtaip: END seen\n"));
  171: 		if ((rtc = parse_addchar(parseio, ch)) == PARSE_INP_SKIP)
  172: 			return parse_end(parseio);
  173: 		else
  174: 			return rtc;
  175: 
  176: 
  177: 	default:
  178: 		return parse_addchar(parseio, ch);
  179: 	}
  180: }
  181: 
  182: #else /* not (REFCLOCK && CLOCK_PARSE && CLOCK_TRIMTAIP) */
  183: int clk_trimtaip_bs;
  184: #endif /* not (REFCLOCK && CLOCK_PARSE && CLOCK_TRIMTAIP) */
  185: 
  186: /*
  187:  * History:
  188:  *
  189:  * clk_trimtaip.c,v
  190:  * Revision 4.11  2005/04/16 17:32:10  kardel
  191:  * update copyright
  192:  *
  193:  * Revision 4.10  2004/11/14 15:29:41  kardel
  194:  * support PPSAPI, upgrade Copyright to Berkeley style
  195:  *
  196:  * Revision 4.7  1999/11/28 09:13:51  kardel
  197:  * RECON_4_0_98F
  198:  *
  199:  * Revision 4.6  1998/08/16 18:46:27  kardel
  200:  * (clock_trimtaip =): changed format name
  201:  *
  202:  * Revision 4.5  1998/06/14 21:09:38  kardel
  203:  * Sun acc cleanup
  204:  *
  205:  * Revision 4.4  1998/06/13 12:06:57  kardel
  206:  * fix SYSV clock name clash
  207:  *
  208:  * Revision 4.3  1998/06/12 15:22:29  kardel
  209:  * fix prototypes
  210:  *
  211:  * Revision 4.2  1998/06/12 09:13:26  kardel
  212:  * conditional compile macros fixed
  213:  * printf prototype
  214:  *
  215:  * Revision 4.1  1998/05/24 09:39:54  kardel
  216:  * implementation of the new IO handling model
  217:  *
  218:  * Revision 4.0  1998/04/10 19:45:31  kardel
  219:  * Start 4.0 release version numbering
  220:  *
  221:  * from V3 1.4 log info deleted 1998/04/11 kardel
  222:  */
  223: 

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