Annotation of embedaddon/ntp/libparse/clk_hopf6021.c, revision 1.1.1.1
1.1 misho 1: /*
2: * /src/NTP/ntp4-dev/libparse/clk_hopf6021.c,v 4.10 2004/11/14 15:29:41 kardel RELEASE_20050508_A
3: *
4: * clk_hopf6021.c,v 4.10 2004/11/14 15:29:41 kardel RELEASE_20050508_A
5: *
6: * Radiocode Clocks HOPF Funkuhr 6021 mit serieller Schnittstelle
7: * base code version from 24th Nov 1995 - history at end
8: *
9: * Created by F.Schnekenbuehl <frank@comsys.dofn.de> from clk_rcc8000.c
10: * Nortel DASA Network Systems GmbH, Department: ND250
11: * A Joint venture of Daimler-Benz Aerospace and Nortel
12: *
13: * This program is distributed in the hope that it will be useful,
14: * but WITHOUT ANY WARRANTY; without even the implied warranty of
15: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16: *
17: */
18:
19: #ifdef HAVE_CONFIG_H
20: # include <config.h>
21: #endif
22:
23: #if defined(REFCLOCK) && defined(CLOCK_PARSE) && defined(CLOCK_HOPF6021)
24:
25: #include "ntp_fp.h"
26: #include "ntp_unixtime.h"
27: #include "ntp_calendar.h"
28: #include "ascii.h"
29:
30: #include "parse.h"
31:
32: #ifndef PARSESTREAM
33: #include "ntp_stdlib.h"
34: #include <stdio.h>
35: #else
36: #include "sys/parsestreams.h"
37: extern int printf (const char *, ...);
38: #endif
39:
40: /*
41: * hopf Funkuhr 6021
42: * used with 9600,8N1,
43: * UTC ueber serielle Schnittstelle
44: * Sekundenvorlauf ON
45: * ETX zum Sekundenvorlauf ON
46: * Datenstring 6021
47: * Ausgabe Uhrzeit und Datum
48: * Senden mit Steuerzeichen
49: * Senden sekuendlich
50: */
51:
52: /*
53: * Type 6021 Serial Output format
54: *
55: * 000000000011111111 / char
56: * 012345678901234567 \ position
57: * sABHHMMSSDDMMYYnre Actual
58: * C4110046231195 Parse
59: * s enr Check
60: *
61: * s = STX (0x02), e = ETX (0x03)
62: * n = NL (0x0A), r = CR (0x0D)
63: *
64: * A B - Status and weekday
65: *
66: * A - Status
67: *
68: * 8 4 2 1
69: * x x x 0 - no announcement
70: * x x x 1 - Summertime - wintertime - summertime announcement
71: * x x 0 x - Wintertime
72: * x x 1 x - Summertime
73: * 0 0 x x - Time/Date invalid
74: * 0 1 x x - Internal clock used
75: * 1 0 x x - Radio clock
76: * 1 1 x x - Radio clock highprecision
77: *
78: * B - 8 4 2 1
79: * 0 x x x - MESZ/MEZ
80: * 1 x x x - UTC
81: * x 0 0 1 - Monday
82: * x 0 1 0 - Tuesday
83: * x 0 1 1 - Wednesday
84: * x 1 0 0 - Thursday
85: * x 1 0 1 - Friday
86: * x 1 1 0 - Saturday
87: * x 1 1 1 - Sunday
88: */
89:
90: #define HOPF_DSTWARN 0x01 /* DST switch warning */
91: #define HOPF_DST 0x02 /* DST in effect */
92:
93: #define HOPF_MODE 0x0C /* operation mode mask */
94: #define HOPF_INVALID 0x00 /* no time code available */
95: #define HOPF_INTERNAL 0x04 /* internal clock */
96: #define HOPF_RADIO 0x08 /* radio clock */
97: #define HOPF_RADIOHP 0x0C /* high precision radio clock */
98:
99: #define HOPF_UTC 0x08 /* time code in UTC */
100: #define HOPF_WMASK 0x07 /* mask for weekday code */
101:
102: static struct format hopf6021_fmt =
103: {
104: {
105: { 9, 2 }, {11, 2}, { 13, 2}, /* Day, Month, Year */
106: { 3, 2 }, { 5, 2}, { 7, 2}, /* Hour, Minute, Second */
107: { 2, 1 }, { 1, 1}, { 0, 0}, /* Weekday, Flags, Zone */
108: /* ... */
109: },
110: (const unsigned char *)"\002 \n\r\003",
111: 0
112: };
113:
114: #define OFFS(x) format->field_offsets[(x)].offset
115: #define STOI(x, y) Stoi(&buffer[OFFS(x)], y, format->field_offsets[(x)].length)
116: #define hexval(x) (('0' <= (x) && (x) <= '9') ? (x) - '0' : \
117: ('a' <= (x) && (x) <= 'f') ? (x) - 'a' + 10 : \
118: ('A' <= (x) && (x) <= 'F') ? (x) - 'A' + 10 : \
119: -1)
120:
121: static unsigned long cvt_hopf6021 (unsigned char *, int, struct format *, clocktime_t *, void *);
122: static unsigned long inp_hopf6021 (parse_t *, unsigned int, timestamp_t *);
123:
124: clockformat_t clock_hopf6021 =
125: {
126: inp_hopf6021, /* HOPF 6021 input handling */
127: cvt_hopf6021, /* Radiocode clock conversion */
128: 0, /* no direct PPS monitoring */
129: (void *)&hopf6021_fmt, /* conversion configuration */
130: "hopf Funkuhr 6021", /* clock format name */
131: 19, /* string buffer */
132: 0 /* private data length, no private data */
133: };
134:
135: static unsigned long
136: cvt_hopf6021(
137: unsigned char *buffer,
138: int size,
139: struct format *format,
140: clocktime_t *clock_time,
141: void *local
142: )
143: {
144: unsigned char status,weekday;
145:
146: if (!Strok(buffer, format->fixed_string))
147: {
148: return CVT_NONE;
149: }
150:
151: if ( STOI(O_DAY, &clock_time->day) ||
152: STOI(O_MONTH, &clock_time->month) ||
153: STOI(O_YEAR, &clock_time->year) ||
154: STOI(O_HOUR, &clock_time->hour) ||
155: STOI(O_MIN, &clock_time->minute) ||
156: STOI(O_SEC, &clock_time->second)
157: )
158: {
159: return CVT_FAIL|CVT_BADFMT;
160: }
161:
162: clock_time->usecond = 0;
163: clock_time->utcoffset = 0;
164:
165: status = hexval(buffer[OFFS(O_FLAGS)]);
166: weekday= hexval(buffer[OFFS(O_WDAY)]);
167:
168: if ((status == 0xFF) || (weekday == 0xFF))
169: {
170: return CVT_FAIL|CVT_BADFMT;
171: }
172:
173: clock_time->flags = 0;
174:
175: if (weekday & HOPF_UTC)
176: {
177: clock_time->flags |= PARSEB_UTC;
178: }
179: else
180: {
181: if (status & HOPF_DST)
182: {
183: clock_time->flags |= PARSEB_DST;
184: clock_time->utcoffset = -2*60*60; /* MET DST */
185: }
186: else
187: {
188: clock_time->utcoffset = -1*60*60; /* MET */
189: }
190: }
191:
192: clock_time->flags |= (status & HOPF_DSTWARN) ? PARSEB_ANNOUNCE : 0;
193:
194: switch (status & HOPF_MODE)
195: {
196: case HOPF_INVALID: /* Time/Date invalid */
197: clock_time->flags |= PARSEB_POWERUP;
198: break;
199:
200: case HOPF_INTERNAL: /* internal clock */
201: clock_time->flags |= PARSEB_NOSYNC;
202: break;
203:
204: case HOPF_RADIO: /* Radio clock */
205: case HOPF_RADIOHP: /* Radio clock high precision */
206: break;
207:
208: default:
209: return CVT_FAIL|CVT_BADFMT;
210: }
211:
212: return CVT_OK;
213: }
214:
215: /*
216: * inp_hopf6021
217: *
218: * grep data from input stream
219: */
220: static u_long
221: inp_hopf6021(
222: parse_t *parseio,
223: unsigned int ch,
224: timestamp_t *tstamp
225: )
226: {
227: unsigned int rtc;
228:
229: parseprintf(DD_PARSE, ("inp_hopf6021(0x%lx, 0x%x, ...)\n", (long)parseio, ch));
230:
231: switch (ch)
232: {
233: case ETX:
234: parseprintf(DD_PARSE, ("inp_hopf6021: EOL seen\n"));
235: parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */
236: if ((rtc = parse_addchar(parseio, ch)) == PARSE_INP_SKIP)
237: return parse_end(parseio);
238: else
239: return rtc;
240:
241: default:
242: return parse_addchar(parseio, ch);
243: }
244: }
245:
246: #else /* not (REFCLOCK && CLOCK_PARSE && CLOCK_HOPF6021) */
247: int clk_hopf6021_bs;
248: #endif /* not (REFCLOCK && CLOCK_PARSE && CLOCK_HOPF6021) */
249:
250: /*
251: * History:
252: *
253: * clk_hopf6021.c,v
254: * Revision 4.10 2004/11/14 15:29:41 kardel
255: * support PPSAPI, upgrade Copyright to Berkeley style
256: *
257: * Revision 4.7 1999/11/28 09:13:49 kardel
258: * RECON_4_0_98F
259: *
260: * Revision 4.6 1998/11/15 20:27:57 kardel
261: * Release 4.0.73e13 reconcilation
262: *
263: * Revision 4.5 1998/06/14 21:09:35 kardel
264: * Sun acc cleanup
265: *
266: * Revision 4.4 1998/06/13 12:02:38 kardel
267: * fix SYSV clock name clash
268: *
269: * Revision 4.3 1998/06/12 15:22:27 kardel
270: * fix prototypes
271: *
272: * Revision 4.2 1998/06/12 09:13:25 kardel
273: * conditional compile macros fixed
274: * printf prototype
275: *
276: * Revision 4.1 1998/05/24 09:39:52 kardel
277: * implementation of the new IO handling model
278: *
279: * Revision 4.0 1998/04/10 19:45:29 kardel
280: * Start 4.0 release version numbering
281: *
282: * from V3 3.6 log info deleted 1998/04/11 kardel
283: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>