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