summaryrefslogtreecommitdiffstats
path: root/contrib/ntp/html/parsedata.htm
blob: a756079cefc2afe56d2f8bd78689a5d607b6fffe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML Strict//EN">
<TITLE>NTP PARSE clock data formats</TITLE>
<h1>NTP PARSE clock data formats</h1>

<p>The parse driver currently supports several clocks with different
query mechanisms. In order for you to find a sample that might be
similar to a clock you might want to integrate into parse i'll sum
up the major features of the clocks (this information is distributed
in the parse/clk_*.c and ntpd/refclock_parse.c files).

<hr>
<h2>Meinberg clocks</h2>
<pre>
Meinberg: start=&lt;STX&gt;, end=&lt;ETX&gt;, sync on start
      pattern="\2D:  .  .  ;T: ;U:  .  .  ;    \3"
      pattern="\2  .  .  ;  ;   :  :  ;        \3"
      pattern="\2  .  .  ;  ;   :  :  ;    :  ;        ;   .         .       "
</pre>
        <p>
	Meinberg is a german manufacturer of time code receivers. Those clocks
	have a pretty common output format in the stock version. In order to
	support NTP Meinberg was so kind to produce some special versions of
	the firmware for the use with NTP. So, if you are going to use a
	Meinberg clock please ask whether there is a special Uni Erlangen
	version.
	You can reach <A HREF="http://www.meinberg.de/">Meinberg</A> via the Web.
	Information can also be ordered via eMail from <A HREF="mailto: info@meinberg.de">info@meinberg.de</A>

	<p>
	General characteristics:
	<br>
	Meinberg clocks primarily output pulse per second and a describing
	ASCII string. This string can be produced in two modes. either upon
	the reception of a question mark or every second. NTP uses the latter
	mechanism. The DCF77 variants have a pretty good relationship between
	RS232 time code and the PPS signal while the GPS receiver has no fixed
	timeing between the datagram and the pulse (you need to use PPS with
	GPS!) on DCF77 you might get away without the PPS signal.
	<pre>
	The preferred tty setting for Meinberg is:
		CFLAG		(B9600|CS7|PARENB|CREAD|HUPCL)
		IFLAG		(IGNBRK|IGNPAR|ISTRIP)
		OFLAG		0
		LFLAG		0
        </pre>
	<pre>
	The tty setting for Meinberg GPS 166/167 receivers is:
		CFLAG		(B19200|CS8|PARENB|CREAD|HUPCL)
		IFLAG		(IGNBRK|IGNPAR|ISTRIP)
		OFLAG		0
		LFLAG		0
        </pre>

	<p>
	The clock is run at datagram once per second.
	Stock dataformat is:
	<pre>
    &lt;STX&gt;D:&lt;dd&gt;.&lt;mm&gt;.&lt;yy&gt;;T:&lt;w&gt;;U:&lt;hh&gt;:&lt;mm&gt;:&lt;ss&gt;;&lt;S&gt;&lt;F&gt;&lt;D&gt;&lt;A&gt;&lt;ETX&gt;
pos:  0  00 00 0 00 0 11 111 1 111 12 2 22 2 22 2 2  2  3  3   3
      1  23 45 6 78 9 01 234 5 678 90 1 23 4 56 7 8  9  0  1   2

&lt;STX&gt;           = '\002' ASCII start of text
&lt;ETX&gt;           = '\003' ASCII end of text
&lt;dd&gt;,&lt;mm&gt;,&lt;yy&gt;  = day, month, year(2 digits!!)
&lt;w&gt;             = day of week (sunday= 0)
&lt;hh&gt;,&lt;mm&gt;,&lt;ss&gt;  = hour, minute, second
&lt;S&gt;             = '#' if never synced since powerup else ' ' for DCF U/A 31
                  '#' if not PZF sychronisation available else ' ' for PZF 535
&lt;F&gt;             = '*' if time comes from internal quartz else ' '
&lt;D&gt;             = 'S' if daylight saving time is active else ' '
&lt;D&gt;             = 'U' if UTC time code is deliverd else ' '
&lt;A&gt;             = '!' during the hour preceeding an daylight saving time
                      start/end change
&lt;A&gt;             = 'A' if a leap second is announced
</pre>

	<pre>
        &lt;STX&gt;&lt;dd&gt;.&lt;mm&gt;.&lt;yy&gt;; &lt;w&gt;; &lt;hh&gt;:&lt;mm&gt;:&lt;ss&gt;; &lt;U&gt;&lt;S&gt;&lt;F&gt;&lt;D&gt;&lt;A&gt;&lt;L&gt;&lt;R&gt;&lt;ETX&gt;
    pos:  0   00 0 00 0 00 11 1 11 11 1 11 2 22 22 2  2  2  2  2  3  3   3
          1   23 4 56 7 89 01 2 34 56 7 89 0 12 34 5  6  7  8  9  0  1   2
    &lt;STX&gt;           = '\002' ASCII start of text
    &lt;ETX&gt;           = '\003' ASCII end of text
    &lt;dd&gt;,&lt;mm&gt;,&lt;yy&gt;  = day, month, year(2 digits!!)
    &lt;w&gt;             = day of week (sunday= 0)
    &lt;hh&gt;,&lt;mm&gt;,&lt;ss&gt;  = hour, minute, second
    &lt;U&gt;             = 'U' UTC time display
    &lt;S&gt;             = '#' if never synced since powerup else ' ' for DCF U/A 31
                      '#' if not PZF sychronisation available else ' ' for PZF 535
    &lt;F&gt;             = '*' if time comes from internal quartz else ' '
    &lt;D&gt;             = 'S' if daylight saving time is active else ' '
    &lt;A&gt;             = '!' during the hour preceeding an daylight saving time
                          start/end change
    &lt;L&gt;             = 'A' LEAP second announcement
    &lt;R&gt;             = 'R' alternate antenna
</pre>
<p>Meinberg GPS166 receiver
<br>
    You must get the Uni-Erlangen firmware for the GPS receiver support
    to work to full satisfaction !
<pre>
        &lt;STX&gt;&lt;dd&gt;.&lt;mm&gt;.&lt;yy&gt;; &lt;w&gt;; &lt;hh&gt;:&lt;mm&gt;:&lt;ss&gt;; &lt;+/-&gt;&lt;00:00&gt;; &lt;U&gt;&lt;S&gt;&lt;F&gt;&lt;D&gt;&lt;A&gt;&lt;L&gt;&lt;R&gt;&lt;L&gt;; &lt;position...&gt;&lt;ETX&gt;
 *
           000000000111111111122222222223333333333444444444455555555556666666
           123456789012345678901234567890123456789012345678901234567890123456
        \x0209.07.93; 5; 08:48:26; +00:00;        ; 49.5736N  11.0280E  373m\x03
 *
    
    &lt;STX&gt;           = '\002' ASCII start of text
    &lt;ETX&gt;           = '\003' ASCII end of text
    &lt;dd&gt;,&lt;mm&gt;,&lt;yy&gt;  = day, month, year(2 digits!!)
    &lt;w&gt;             = day of week (sunday= 0)
    &lt;hh&gt;,&lt;mm&gt;,&lt;ss&gt;  = hour, minute, second
    &lt;+/-&gt;,&lt;00:00&gt;   = offset to UTC
    &lt;S&gt;             = '#' if never synced since powerup else ' ' for DCF U/A 31
                      '#' if not PZF sychronisation available else ' ' for PZF 535
    &lt;U&gt;             = 'U' UTC time display
    &lt;F&gt;             = '*' if time comes from internal quartz else ' '
    &lt;D&gt;             = 'S' if daylight saving time is active else ' '
    &lt;A&gt;             = '!' during the hour preceeding an daylight saving time
                          start/end change
    &lt;L&gt;             = 'A' LEAP second announcement
    &lt;R&gt;             = 'R' alternate antenna (reminiscent of PZF535) usually ' '
    &lt;L&gt;		   = 'L' on 23:59:60
</pre>

<p>For the Meinberg parse look into clock_meinberg.c

<br>
<h2>Raw DCF77 Data via serial line</h2>
<p>RAWDCF: end=TIMEOUT&gt;1.5s, sync each char (any char),generate psuedo time
            codes, fixed format
<p>
    direct DCF77 code input

    <p>In Europe it is relatively easy/cheap the receive the german time code
    transmitter DCF77. The simplest version to process its signal is to
    feed the 100/200ms pulse of the demodulated AM signal via a level
    converter to an RS232 port at 50Baud. parse/clk_rawdcf.c holds all
    necessary decoding logic for the time code which is transmitted each
    minute for one minute. A bit of the time code is sent once a second.

<pre>
	The preferred tty setting is:
		CFLAG           (B50|CS8|CREAD|CLOCAL)
		IFLAG		0
		OFLAG		0
 		LFLAG		0
</pre>

<h2>DCF77 raw time code</h2>


<p>From "Zur Zeit", Physikalisch-Technische Bundesanstalt (PTB), Braunschweig
und Berlin, März 1989
<br>
<pre>
	Timecode transmission:

	AM:

	time marks are send every second except for the second before the
	next minute mark
	time marks consist of a reduction of transmitter power to 25%
	of the nominal level
	the falling edge is the time indication (on time)
	time marks of a 100ms duration constitute a logical 0
	time marks of a 200ms duration constitute a logical 1

	FM:

	see the spec. (basically a (non-)inverted psuedo random phase shift)

	Encoding:

	Second	Contents
	0  - 10	AM: free, FM: 0
	11 - 14	free
	15		R     - alternate antenna
	16		A1    - expect zone change (1 hour before)
	17 - 18	Z1,Z2 - time zone
		 0  0 illegal
		 0  1 MEZ  (MET)
		 1  0 MESZ (MED, MET DST)
		 1  1 illegal
	19		A2    - expect leap insertion/deletion (1 hour before)
	20		S     - start of time code (1)
	21 - 24	M1    - BCD (lsb first) Minutes
	25 - 27	M10   - BCD (lsb first) 10 Minutes
	28		P1    - Minute Parity (even)
	29 - 32	H1    - BCD (lsb first) Hours
	33 - 34      H10   - BCD (lsb first) 10 Hours
	35		P2    - Hour Parity (even)
	36 - 39	D1    - BCD (lsb first) Days
	40 - 41	D10   - BCD (lsb first) 10 Days
	42 - 44	DW    - BCD (lsb first) day of week (1: Monday -> 7: Sunday)
	45 - 49	MO    - BCD (lsb first) Month
	50           MO0   - 10 Months
	51 - 53	Y1    - BCD (lsb first) Years
	54 - 57	Y10   - BCD (lsb first) 10 Years
	58 		P3    - Date Parity (even)
	59		      - usually missing (minute indication), except for leap insertion
</pre>

<hr>
<h2>Schmid clock</h2>

<p>
	Schmid clock: needs poll, binary input, end='\xFC', sync start

	<p>
	The Schmid clock is a DCF77 receiver that sends a binary
	time code at the reception of a flag byte. The contents
	if the flag byte determined the time code format. The
	binary time code is delimited by the byte 0xFC.
<PRE>
	TTY setup is:
		CFLAG		(B1200|CS8|CREAD|CLOCAL)
		IFLAG		0
		OFLAG		0
 		LFLAG		0

</PRE>


<p>	The command to Schmid's DCF77 clock is a single byte; each bit
	allows the user to select some part of the time string, as follows (the
	output for the lsb is sent first).
	
<pre>
	Bit 0:	time in MEZ, 4 bytes *binary, not BCD*; hh.mm.ss.tenths
	Bit 1:	date 3 bytes *binary, not BCD: dd.mm.yy
	Bit 2:	week day, 1 byte (unused here)
	Bit 3:	time zone, 1 byte, 0=MET, 1=MEST. (unused here)
	Bit 4:	clock status, 1 byte,	0=time invalid,
					1=time from crystal backup,
					3=time from DCF77
	Bit 5:	transmitter status, 1 byte,
					bit 0: backup antenna
					bit 1: time zone change within 1h
					bit 3,2: TZ 01=MEST, 10=MET
					bit 4: leap second will be
						added within one hour
					bits 5-7: Zero
	Bit 6:	time in backup mode, units of 5 minutes (unused here)
</pre>

<hr>
<h2>Trimble SV6 ASCII time code (TAIP)</h2>

<p>
	Trimble SV6: needs poll, ascii timecode, start='&gt;', end='&lt;',
                     query='&gt;QTM&lt;', eol='&lt;'

<p>     Trimble SV6 is a GPS receiver with PPS output. It needs to be polled.
	It also need a special tty mode setup (EOL='&lt;').
<pre>
	TTY setup is:
		CFLAG            (B4800|CS8|CREAD)
		IFLAG            (BRKINT|IGNPAR|ISTRIP|ICRNL|IXON)
		OFLAG            (OPOST|ONLCR)
		LFLAG            (ICANON|ECHOK)

	Special flags are:
		PARSE_F_PPSPPS	    - use CIOGETEV for PPS time stamping
		PARSE_F_PPSONSECOND - the time code is not related to
				      the PPS pulse (so use the time code
				      only for the second epoch)

	Timecode
	0000000000111111111122222222223333333	/ char
	0123456789012345678901234567890123456	\ posn
	&gt;RTMhhmmssdddDDMMYYYYoodnnvrrrrr;*xx&lt;	Actual
	----33445566600112222BB7__-_____--99-	Parse
	&gt;RTM                      1     ;*  &lt; 	Check
</pre>

<hr>
<h2>ELV DCF7000</h2>
<p>
	ELV DCF7000: end='\r', pattern="  -  -  -  -  -  -  -  \r"
<p>
	The ELV DCF7000 is a cheap DCF77 receiver sending each second
	a time code (though not very precise!) delimited by '`r'
<pre>
	Timecode
	  YY-MM-DD-HH-MM-SS-FF\r

		FF&0x1	- DST
		FF&0x2	- DST switch warning
		FF&0x4  - unsynchronised
</pre>
<hr>
<h2>HOPF 6021 und Kompatible</h2>

<p>
 HOPF Funkuhr 6021 mit serieller Schnittstelle
 Created by F.Schnekenbuehl &lt;frank@comsys.dofn.de&gt; from clk_rcc8000.c
 Nortel DASA Network Systems GmbH, Department: ND250
 A Joint venture of Daimler-Benz Aerospace and Nortel.

<pre>
 hopf Funkuhr 6021 
      used with 9600,8N1,
      UTC via serial line
      "Sekundenvorlauf" ON
      ETX zum Sekundenvorlauf ON
      dataformat 6021
      output time and date
      transmit with control characters
      transmit evry second
 
  Type 6021 Serial Output format

      000000000011111111 / char
      012345678901234567 \ position
      sABHHMMSSDDMMYYnre  Actual
       C4110046231195     Parse
      s              enr  Check

  s = STX (0x02), e = ETX (0x03)
  n = NL  (0x0A), r = CR  (0x0D)

  A B - Status and weekday
 
  A - Status

      8 4 2 1
      x x x 0  - no announcement
      x x x 1  - Summertime - wintertime - summertime announcement
      x x 0 x  - Wintertime
      x x 1 x  - Summertime
      0 0 x x  - Time/Date invalid
      0 1 x x  - Internal clock used 
      1 0 x x  - Radio clock
      1 1 x x  - Radio clock highprecision

  B - 8 4 2 1
      0 x x x  - MESZ/MEZ
      1 x x x  - UTC
      x 0 0 1  - Monday
      x 0 1 0  - Tuesday
      x 0 1 1  - Wednesday
      x 1 0 0  - Thursday
      x 1 0 1  - Friday
      x 1 1 0  - Saturday
      x 1 1 1  - Sunday
</pre>
<hr>
<h2>Diem Computime Clock</h2>

<p>
   The Computime receiver sends a datagram in the following format every minute
<pre>   
   Timestamp	T:YY:MM:MD:WD:HH:MM:SSCRLF 
   Pos          0123456789012345678901 2 3
		0000000000111111111122 2 2
   Parse        T:  :  :  :  :  :  :  \r\n
   
   T	Startcharacter "T" specifies start of the timestamp 
   YY	Year MM	Month 1-12 
   MD	Day of the month 
   WD	Day of week 
   HH	Hour 
   MM   Minute 
   SS   Second
   CR   Carriage return 
   LF   Linefeed
</pre>   
<hr>
<h2>WHARTON 400A Series Clock with a 404.2 Serial interface</h2>

<p>
   The WHARTON 400A Series clock is able to send date/time serial messages
   in 7 output formats.  We use format 1 here because it is the shortest.
   We set up the clock to send a datagram every second.
   For use with this driver, the WHARTON 400A Series clock must be set-up
   as follows :
<pre>
  					Programmable	Selected
  					Option No	Option
	BST or CET display		3		9 or 11
	No external controller		7		0
	Serial Output Format 1		9		1
	Baud rate 9600 bps		10		96
	Bit length 8 bits		11		8
	Parity even			12		E
</pre>
   WHARTON 400A Series output format 1 is as follows :
<pre>
   Timestamp	STXssmmhhDDMMYYSETX
   Pos		0  12345678901234
  		0  00000000011111
  
   STX	start transmission (ASCII 0x02)
   ETX	end transmission (ASCII 0x03)
   ss	Second expressed in reversed decimal (units then tens)
   mm	Minute expressed in reversed decimal
   hh	Hour expressed in reversed decimal
   DD	Day of month expressed in reversed decimal
   MM	Month expressed in reversed decimal (January is 1)
   YY	Year (without century) expressed in reversed decimal
   S	Status byte : 0x30 +
		bit 0	0 = MSF source		1 = DCF source
		bit 1	0 = Winter time		1 = Summer time
		bit 2	0 = not synchronised	1 = synchronised
		bit 3	0 = no early warning	1 = early warning
</pre>
OpenPOWER on IntegriCloud