Annotation of embedaddon/ntp/libparse/clk_schmid.c, revision 1.1.1.1
1.1 misho 1: /*
2: * /src/NTP/ntp4-dev/libparse/clk_schmid.c,v 4.9 2005/04/16 17:32:10 kardel RELEASE_20050508_A
3: *
4: * clk_schmid.c,v 4.9 2005/04/16 17:32:10 kardel RELEASE_20050508_A
5: *
6: * Schmid clock support
7: * based on information and testing from Adam W. Feigin et. al (Swisstime iis.ethz.ch)
8: *
9: * Copyright (c) 1995-2005 by Frank Kardel <kardel <AT> ntp.org>
10: * Copyright (c) 1989-1994 by Frank Kardel, Friedrich-Alexander Universität Erlangen-Nürnberg, Germany
11: *
12: * Redistribution and use in source and binary forms, with or without
13: * modification, are permitted provided that the following conditions
14: * are met:
15: * 1. Redistributions of source code must retain the above copyright
16: * notice, this list of conditions and the following disclaimer.
17: * 2. Redistributions in binary form must reproduce the above copyright
18: * notice, this list of conditions and the following disclaimer in the
19: * documentation and/or other materials provided with the distribution.
20: * 3. Neither the name of the author nor the names of its contributors
21: * may be used to endorse or promote products derived from this software
22: * without specific prior written permission.
23: *
24: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
25: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
28: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34: * SUCH DAMAGE.
35: *
36: */
37:
38: #if HAVE_CONFIG_H
39: # include <config.h>
40: #endif
41:
42: #if defined(REFCLOCK) && defined(CLOCK_PARSE) && defined(CLOCK_SCHMID)
43:
44: #include "ntp_fp.h"
45: #include "ntp_unixtime.h"
46: #include "ntp_calendar.h"
47:
48: #include "parse.h"
49:
50: #ifndef PARSESTREAM
51: #include "ntp_stdlib.h"
52: #include <stdio.h>
53: #else
54: #include "sys/parsestreams.h"
55: extern int printf (const char *, ...);
56: #endif
57:
58: /*
59: * Description courtesy of Adam W. Feigin et. al (Swisstime iis.ethz.ch)
60: *
61: * The command to Schmid's DCF77 clock is a single byte; each bit
62: * allows the user to select some part of the time string, as follows (the
63: * output for the lsb is sent first).
64: *
65: * Bit 0: time in MEZ, 4 bytes *binary, not BCD*; hh.mm.ss.tenths
66: * Bit 1: date 3 bytes *binary, not BCD: dd.mm.yy
67: * Bit 2: week day, 1 byte (unused here)
68: * Bit 3: time zone, 1 byte, 0=MET, 1=MEST. (unused here)
69: * Bit 4: clock status, 1 byte, 0=time invalid,
70: * 1=time from crystal backup,
71: * 3=time from DCF77
72: * Bit 5: transmitter status, 1 byte,
73: * bit 0: backup antenna
74: * bit 1: time zone change within 1h
75: * bit 3,2: TZ 01=MEST, 10=MET
76: * bit 4: leap second will be
77: * added within one hour
78: * bits 5-7: Zero
79: * Bit 6: time in backup mode, units of 5 minutes (unused here)
80: *
81: */
82: #define WS_TIME 0x01
83: #define WS_SIGNAL 0x02
84:
85: #define WS_ALTERNATE 0x01
86: #define WS_ANNOUNCE 0x02
87: #define WS_TZ 0x0c
88: #define WS_MET 0x08
89: #define WS_MEST 0x04
90: #define WS_LEAP 0x10
91:
92: static u_long cvt_schmid (unsigned char *, int, struct format *, clocktime_t *, void *);
93: static unsigned long inp_schmid (parse_t *, unsigned int, timestamp_t *);
94:
95: clockformat_t clock_schmid =
96: {
97: inp_schmid, /* no input handling */
98: cvt_schmid, /* Schmid conversion */
99: 0, /* not direct PPS monitoring */
100: 0, /* conversion configuration */
101: "Schmid", /* Schmid receiver */
102: 12, /* binary data buffer */
103: 0, /* no private data (complete messages) */
104: };
105:
106:
107: static u_long
108: cvt_schmid(
109: unsigned char *buffer,
110: int size,
111: struct format *format,
112: clocktime_t *clock_time,
113: void *local
114: )
115: {
116: if ((size != 11) || (buffer[10] != (unsigned char)'\375'))
117: {
118: return CVT_NONE;
119: }
120: else
121: {
122: if (buffer[0] > 23 || buffer[1] > 59 || buffer[2] > 59 || buffer[3] > 9) /* Time */
123: {
124: return CVT_FAIL|CVT_BADTIME;
125: }
126: else
127: if (buffer[4] < 1 || buffer[4] > 31 || buffer[5] < 1 || buffer[5] > 12
128: || buffer[6] > 99)
129: {
130: return CVT_FAIL|CVT_BADDATE;
131: }
132: else
133: {
134: clock_time->hour = buffer[0];
135: clock_time->minute = buffer[1];
136: clock_time->second = buffer[2];
137: clock_time->usecond = buffer[3] * 100000;
138: clock_time->day = buffer[4];
139: clock_time->month = buffer[5];
140: clock_time->year = buffer[6];
141:
142: clock_time->flags = 0;
143:
144: switch (buffer[8] & WS_TZ)
145: {
146: case WS_MET:
147: clock_time->utcoffset = -1*60*60;
148: break;
149:
150: case WS_MEST:
151: clock_time->utcoffset = -2*60*60;
152: clock_time->flags |= PARSEB_DST;
153: break;
154:
155: default:
156: return CVT_FAIL|CVT_BADFMT;
157: }
158:
159: if (!(buffer[7] & WS_TIME))
160: {
161: clock_time->flags |= PARSEB_POWERUP;
162: }
163:
164: if (!(buffer[7] & WS_SIGNAL))
165: {
166: clock_time->flags |= PARSEB_NOSYNC;
167: }
168:
169: if (buffer[7] & WS_SIGNAL)
170: {
171: if (buffer[8] & WS_ALTERNATE)
172: {
173: clock_time->flags |= PARSEB_ALTERNATE;
174: }
175:
176: if (buffer[8] & WS_ANNOUNCE)
177: {
178: clock_time->flags |= PARSEB_ANNOUNCE;
179: }
180:
181: if (buffer[8] & WS_LEAP)
182: {
183: clock_time->flags |= PARSEB_LEAPADD; /* default: DCF77 data format deficiency */
184: }
185: }
186:
187: clock_time->flags |= PARSEB_S_LEAP|PARSEB_S_ANTENNA;
188:
189: return CVT_OK;
190: }
191: }
192: }
193:
194: /*
195: * inp_schmid
196: *
197: * grep data from input stream
198: */
199: static u_long
200: inp_schmid(
201: parse_t *parseio,
202: unsigned int ch,
203: timestamp_t *tstamp
204: )
205: {
206: unsigned int rtc;
207:
208: parseprintf(DD_PARSE, ("inp_schmid(0x%lx, 0x%x, ...)\n", (long)parseio, ch));
209:
210: switch (ch)
211: {
212: case 0xFD: /* */
213: parseprintf(DD_PARSE, ("mbg_input: ETX seen\n"));
214: if ((rtc = parse_addchar(parseio, ch)) == PARSE_INP_SKIP)
215: return parse_end(parseio);
216: else
217: return rtc;
218:
219: default:
220: return parse_addchar(parseio, ch);
221: }
222: }
223:
224: #else /* not (REFCLOCK && CLOCK_PARSE && CLOCK_SCHMID) */
225: int clk_schmid_bs;
226: #endif /* not (REFCLOCK && CLOCK_PARSE && CLOCK_SCHMID) */
227:
228: /*
229: * History:
230: *
231: * clk_schmid.c,v
232: * Revision 4.9 2005/04/16 17:32:10 kardel
233: * update copyright
234: *
235: * Revision 4.8 2004/11/14 15:29:41 kardel
236: * support PPSAPI, upgrade Copyright to Berkeley style
237: *
238: * Revision 4.5 1999/11/28 09:13:51 kardel
239: * RECON_4_0_98F
240: *
241: * Revision 4.4 1998/06/13 12:06:03 kardel
242: * fix SYSV clock name clash
243: *
244: * Revision 4.3 1998/06/12 15:22:29 kardel
245: * fix prototypes
246: *
247: * Revision 4.2 1998/06/12 09:13:26 kardel
248: * conditional compile macros fixed
249: * printf prototype
250: *
251: * Revision 4.1 1998/05/24 09:39:53 kardel
252: * implementation of the new IO handling model
253: *
254: * Revision 4.0 1998/04/10 19:45:31 kardel
255: * Start 4.0 release version numbering
256: *
257: * from V3 3.22 log info deleted 1998/04/11 kardel
258: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>