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