Annotation of embedaddon/ntp/libparse/clk_trimtaip.c, revision 1.1
1.1 ! misho 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>