xref: /freebsd/contrib/ntp/libparse/clk_computime.c (revision a151a66c2a1c722d095dfdd6a06d8acd74a03253)
1c0b746e5SOllivier Robert #ifdef HAVE_CONFIG_H
2c0b746e5SOllivier Robert # include <config.h>
3c0b746e5SOllivier Robert #endif
4c0b746e5SOllivier Robert 
5c0b746e5SOllivier Robert #if defined(REFCLOCK) && defined(CLOCK_PARSE) && defined(CLOCK_COMPUTIME)
6c0b746e5SOllivier Robert /*
7a151a66cSOllivier Robert  * /src/NTP/ntp-4/libparse/clk_computime.c,v 4.6 1999/11/28 09:13:49 kardel RELEASE_19991128_A
8c0b746e5SOllivier Robert  *
9a151a66cSOllivier Robert  * clk_computime.c,v 4.6 1999/11/28 09:13:49 kardel RELEASE_19991128_A
10c0b746e5SOllivier Robert  *
11c0b746e5SOllivier Robert  * Supports Diem's Computime Radio Clock
12c0b746e5SOllivier Robert  *
13c0b746e5SOllivier Robert  * Used the Meinberg clock as a template for Diem's Computime Radio Clock
14c0b746e5SOllivier Robert  *
15c0b746e5SOllivier Robert  * adapted by Alois Camenzind <alois.camenzind@ubs.ch>
16c0b746e5SOllivier Robert  *
17c0b746e5SOllivier Robert  * Copyright (C) 1992-1998 by Frank Kardel
18c0b746e5SOllivier Robert  * Friedrich-Alexander Universit�t Erlangen-N�rnberg, Germany
19c0b746e5SOllivier Robert  *
20c0b746e5SOllivier Robert  * This program is distributed in the hope that it will be useful, but WITHOUT
21c0b746e5SOllivier Robert  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
22c0b746e5SOllivier Robert  * FITNESS FOR A PARTICULAR PURPOSE.
23c0b746e5SOllivier Robert  *
24c0b746e5SOllivier Robert  */
25c0b746e5SOllivier Robert 
26c0b746e5SOllivier Robert 
27c0b746e5SOllivier Robert #include <sys/types.h>
28c0b746e5SOllivier Robert #include <sys/time.h>
29c0b746e5SOllivier Robert 
30c0b746e5SOllivier Robert #include "ntp_fp.h"
31c0b746e5SOllivier Robert #include "ntp_unixtime.h"
32c0b746e5SOllivier Robert #include "ntp_calendar.h"
33c0b746e5SOllivier Robert #include "ntp_stdlib.h"
34c0b746e5SOllivier Robert 
35c0b746e5SOllivier Robert #include "parse.h"
36c0b746e5SOllivier Robert 
37c0b746e5SOllivier Robert #ifndef PARSESTREAM
38c0b746e5SOllivier Robert #include <stdio.h>
39c0b746e5SOllivier Robert #else
40c0b746e5SOllivier Robert #include "sys/parsestreams.h"
41c0b746e5SOllivier Robert extern void printf P((const char *, ...));
42c0b746e5SOllivier Robert #endif
43c0b746e5SOllivier Robert 
44c0b746e5SOllivier Robert /*
45c0b746e5SOllivier Robert  * The Computime receiver sends a datagram in the following format every minute
46c0b746e5SOllivier Robert  *
47c0b746e5SOllivier Robert  * Timestamp	T:YY:MM:MD:WD:HH:MM:SSCRLF
48c0b746e5SOllivier Robert  * Pos          0123456789012345678901 2 3
49c0b746e5SOllivier Robert  *              0000000000111111111122 2 2
50c0b746e5SOllivier Robert  * Parse        T:  :  :  :  :  :  :  rn
51c0b746e5SOllivier Robert  *
52c0b746e5SOllivier Robert  * T	Startcharacter "T" specifies start of the timestamp
53c0b746e5SOllivier Robert  * YY	Year MM	Month 1-12
54c0b746e5SOllivier Robert  * MD	Day of the month
55c0b746e5SOllivier Robert  * WD	Day of week
56c0b746e5SOllivier Robert  * HH	Hour
57c0b746e5SOllivier Robert  * MM   Minute
58c0b746e5SOllivier Robert  * SS   Second
59c0b746e5SOllivier Robert  * CR   Carriage return
60c0b746e5SOllivier Robert  * LF   Linefeed
61c0b746e5SOllivier Robert  *
62c0b746e5SOllivier Robert  */
63c0b746e5SOllivier Robert 
64c0b746e5SOllivier Robert static struct format computime_fmt =
65c0b746e5SOllivier Robert {
66c0b746e5SOllivier Robert 	{
67c0b746e5SOllivier Robert 		{8, 2},  {5,  2}, {2,  2},	/* day, month, year */
68c0b746e5SOllivier Robert 		{14, 2}, {17, 2}, {20, 2},	/* hour, minute, second */
69c0b746e5SOllivier Robert 		{11, 2},                        /* dayofweek,  */
70c0b746e5SOllivier Robert 	},
71c0b746e5SOllivier Robert 	(const unsigned char *)"T:  :  :  :  :  :  :  \r\n",
72c0b746e5SOllivier Robert 	0
73c0b746e5SOllivier Robert };
74c0b746e5SOllivier Robert 
75c0b746e5SOllivier Robert static u_long cvt_computime P((unsigned char *, int, struct format *, clocktime_t *, void *));
76c0b746e5SOllivier Robert static unsigned long inp_computime P((parse_t *, unsigned int, timestamp_t *));
77c0b746e5SOllivier Robert 
78c0b746e5SOllivier Robert clockformat_t   clock_computime =
79c0b746e5SOllivier Robert {
80c0b746e5SOllivier Robert 	inp_computime,		/* Computime input handling */
81c0b746e5SOllivier Robert 	cvt_computime,		/* Computime conversion */
82c0b746e5SOllivier Robert 	0,			/* no PPS monitoring */
83c0b746e5SOllivier Robert 	(void *)&computime_fmt,	/* conversion configuration */
84c0b746e5SOllivier Robert 	"Diem's Computime Radio Clock",	/* Computime Radio Clock */
85c0b746e5SOllivier Robert 	24,			/* string buffer */
86c0b746e5SOllivier Robert 	0			/* no private data (complete pakets) */
87c0b746e5SOllivier Robert };
88c0b746e5SOllivier Robert 
89c0b746e5SOllivier Robert /*
90c0b746e5SOllivier Robert  * cvt_computime
91c0b746e5SOllivier Robert  *
92c0b746e5SOllivier Robert  * convert simple type format
93c0b746e5SOllivier Robert  */
94c0b746e5SOllivier Robert static          u_long
95c0b746e5SOllivier Robert cvt_computime(
96c0b746e5SOllivier Robert 	unsigned char *buffer,
97c0b746e5SOllivier Robert 	int            size,
98c0b746e5SOllivier Robert 	struct format *format,
99c0b746e5SOllivier Robert 	clocktime_t   *clock_time,
100c0b746e5SOllivier Robert 	void          *local
101c0b746e5SOllivier Robert 	)
102c0b746e5SOllivier Robert {
103c0b746e5SOllivier Robert 
104c0b746e5SOllivier Robert 	if (!Strok(buffer, format->fixed_string)) {
105c0b746e5SOllivier Robert 		return CVT_NONE;
106c0b746e5SOllivier Robert 	} else {
107c0b746e5SOllivier Robert 		if (Stoi(&buffer[format->field_offsets[O_DAY].offset], &clock_time->day,
108c0b746e5SOllivier Robert 			 format->field_offsets[O_DAY].length) ||
109c0b746e5SOllivier Robert 		    Stoi(&buffer[format->field_offsets[O_MONTH].offset], &clock_time->month,
110c0b746e5SOllivier Robert 			 format->field_offsets[O_MONTH].length) ||
111c0b746e5SOllivier Robert 		    Stoi(&buffer[format->field_offsets[O_YEAR].offset], &clock_time->year,
112c0b746e5SOllivier Robert 			 format->field_offsets[O_YEAR].length) ||
113c0b746e5SOllivier Robert 		    Stoi(&buffer[format->field_offsets[O_HOUR].offset], &clock_time->hour,
114c0b746e5SOllivier Robert 			 format->field_offsets[O_HOUR].length) ||
115c0b746e5SOllivier Robert 		    Stoi(&buffer[format->field_offsets[O_MIN].offset], &clock_time->minute,
116c0b746e5SOllivier Robert 			 format->field_offsets[O_MIN].length) ||
117c0b746e5SOllivier Robert 		    Stoi(&buffer[format->field_offsets[O_SEC].offset], &clock_time->second,
118c0b746e5SOllivier Robert 			 format->field_offsets[O_SEC].length)) {
119c0b746e5SOllivier Robert 			return CVT_FAIL | CVT_BADFMT;
120c0b746e5SOllivier Robert 		} else {
121c0b746e5SOllivier Robert 
122c0b746e5SOllivier Robert 			clock_time->flags = 0;
123c0b746e5SOllivier Robert 			clock_time->utcoffset = 0;	/* We have UTC time */
124c0b746e5SOllivier Robert 
125c0b746e5SOllivier Robert 			return CVT_OK;
126c0b746e5SOllivier Robert 		}
127c0b746e5SOllivier Robert 	}
128c0b746e5SOllivier Robert }
129c0b746e5SOllivier Robert 
130c0b746e5SOllivier Robert /*
131c0b746e5SOllivier Robert  * inp_computime
132c0b746e5SOllivier Robert  *
133c0b746e5SOllivier Robert  * grep data from input stream
134c0b746e5SOllivier Robert  */
135c0b746e5SOllivier Robert static u_long
136c0b746e5SOllivier Robert inp_computime(
137c0b746e5SOllivier Robert 	      parse_t      *parseio,
138c0b746e5SOllivier Robert 	      unsigned int  ch,
139c0b746e5SOllivier Robert 	      timestamp_t  *tstamp
140c0b746e5SOllivier Robert 	      )
141c0b746e5SOllivier Robert {
142c0b746e5SOllivier Robert 	unsigned int rtc;
143c0b746e5SOllivier Robert 
144c0b746e5SOllivier Robert 	parseprintf(DD_PARSE, ("inp_computime(0x%x, 0x%x, ...)\n", (int)parseio, (int)ch));
145c0b746e5SOllivier Robert 
146c0b746e5SOllivier Robert 	switch (ch)
147c0b746e5SOllivier Robert 	{
148c0b746e5SOllivier Robert 	case 'T':
149c0b746e5SOllivier Robert 		parseprintf(DD_PARSE, ("inp_computime: START seen\n"));
150c0b746e5SOllivier Robert 
151c0b746e5SOllivier Robert 		parseio->parse_index = 1;
152c0b746e5SOllivier Robert 		parseio->parse_data[0] = ch;
153c0b746e5SOllivier Robert 		parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */
154c0b746e5SOllivier Robert 		return PARSE_INP_SKIP;
155c0b746e5SOllivier Robert 
156c0b746e5SOllivier Robert 	case '\n':
157c0b746e5SOllivier Robert 		parseprintf(DD_PARSE, ("inp_computime: END seen\n"));
158c0b746e5SOllivier Robert 		if ((rtc = parse_addchar(parseio, ch)) == PARSE_INP_SKIP)
159c0b746e5SOllivier Robert 			return parse_end(parseio);
160c0b746e5SOllivier Robert 		else
161c0b746e5SOllivier Robert 			return rtc;
162c0b746e5SOllivier Robert 
163c0b746e5SOllivier Robert 	default:
164c0b746e5SOllivier Robert 		return parse_addchar(parseio, ch);
165c0b746e5SOllivier Robert 	}
166c0b746e5SOllivier Robert }
167c0b746e5SOllivier Robert 
168c0b746e5SOllivier Robert #else /* not (REFCLOCK && CLOCK_PARSE && CLOCK_COMPUTIME) */
169c0b746e5SOllivier Robert int clk_computime_bs;
170c0b746e5SOllivier Robert #endif /* not (REFCLOCK && CLOCK_PARSE && CLOCK_COMPUTIME) */
171c0b746e5SOllivier Robert 
172c0b746e5SOllivier Robert /*
173c0b746e5SOllivier Robert  * clk_computime.c,v
174a151a66cSOllivier Robert  * Revision 4.6  1999/11/28 09:13:49  kardel
175a151a66cSOllivier Robert  * RECON_4_0_98F
176a151a66cSOllivier Robert  *
177c0b746e5SOllivier Robert  * Revision 4.5  1998/06/14 21:09:34  kardel
178c0b746e5SOllivier Robert  * Sun acc cleanup
179c0b746e5SOllivier Robert  *
180c0b746e5SOllivier Robert  * Revision 4.4  1998/06/13 12:00:38  kardel
181c0b746e5SOllivier Robert  * fix SYSV clock name clash
182c0b746e5SOllivier Robert  *
183c0b746e5SOllivier Robert  * Revision 4.3  1998/06/12 15:22:26  kardel
184c0b746e5SOllivier Robert  * fix prototypes
185c0b746e5SOllivier Robert  *
186c0b746e5SOllivier Robert  * Revision 4.2  1998/06/12 09:13:24  kardel
187c0b746e5SOllivier Robert  * conditional compile macros fixed
188c0b746e5SOllivier Robert  * printf prototype
189c0b746e5SOllivier Robert  *
190c0b746e5SOllivier Robert  * Revision 4.1  1998/05/24 09:39:51  kardel
191c0b746e5SOllivier Robert  * implementation of the new IO handling model
192c0b746e5SOllivier Robert  *
193c0b746e5SOllivier Robert  * Revision 4.0  1998/04/10 19:45:27  kardel
194c0b746e5SOllivier Robert  * Start 4.0 release version numbering
195c0b746e5SOllivier Robert  *
196c0b746e5SOllivier Robert  * from V3 1.8 log info deleted 1998/04/11 kardel
197c0b746e5SOllivier Robert  */
198