xref: /freebsd/contrib/ntp/libparse/data_mbg.c (revision 9336e0699bda8a301cd2bfa37106b6ec5e32012e)
1 /*
2  * /src/NTP/ntp-4/libparse/data_mbg.c,v 4.3 1999/02/21 12:17:42 kardel RELEASE_19991128_A
3  *
4  * $Created: Sun Jul 20 12:08:14 1997 $
5  *
6  * Copyright (C) 1997, 1998 by Frank Kardel
7  */
8 
9 #ifdef PARSESTREAM
10 #define NEED_BOPS
11 #include "ntp_string.h"
12 #else
13 #include <stdio.h>
14 #endif
15 #include "ntp_types.h"
16 #include "ntp_stdlib.h"
17 #include "ntp_fp.h"
18 #include "mbg_gps166.h"
19 #include "binio.h"
20 #include "ieee754io.h"
21 
22 static void get_mbg_tzname P((unsigned char **, char *));
23 static void mbg_time_status_str P((unsigned char **, unsigned int));
24 
25 #if 0				/* no actual floats on Meinberg binary interface */
26 static offsets_t mbg_float  = { 1, 0, 3, 2, 0, 0, 0, 0 }; /* byte order for meinberg floats */
27 #endif
28 static offsets_t mbg_double = { 1, 0, 3, 2, 5, 4, 7, 6 }; /* byte order for meinberg doubles */
29 static int32   rad2deg_i = 57;
30 static u_int32 rad2deg_f = 0x4BB834C7; /* 57.2957795131 == 180/PI */
31 
32 void
33 put_mbg_header(
34 	unsigned char **bufpp,
35 	GPS_MSG_HDR *headerp
36 	)
37 {
38   put_lsb_short(bufpp, headerp->gps_cmd);
39   put_lsb_short(bufpp, headerp->gps_len);
40   put_lsb_short(bufpp, headerp->gps_data_csum);
41   put_lsb_short(bufpp, headerp->gps_hdr_csum);
42 }
43 
44 void
45 get_mbg_sw_rev(
46 	unsigned char **bufpp,
47 	SW_REV *sw_revp
48 	)
49 {
50   sw_revp->code = get_lsb_short(bufpp);
51   memcpy(sw_revp->name, *bufpp, sizeof(sw_revp->name));
52   *bufpp += sizeof(sw_revp->name);
53 }
54 
55 void
56 get_mbg_ascii_msg(
57 	unsigned char **bufpp,
58 	ASCII_MSG *ascii_msgp
59 	)
60 {
61   ascii_msgp->csum  = get_lsb_short(bufpp);
62   ascii_msgp->valid = get_lsb_short(bufpp);
63   memcpy(ascii_msgp->s, *bufpp, sizeof(ascii_msgp->s));
64   *bufpp += sizeof(ascii_msgp->s);
65 }
66 
67 void
68 get_mbg_svno(
69 	unsigned char **bufpp,
70 	SVNO *svnop
71 	)
72 {
73   *svnop = get_lsb_short(bufpp);
74 }
75 
76 void
77 get_mbg_health(
78 	unsigned char **bufpp,
79 	HEALTH *healthp
80 	)
81 {
82   *healthp = get_lsb_short(bufpp);
83 }
84 
85 void
86 get_mbg_cfg(
87 	unsigned char **bufpp,
88 	CFG *cfgp
89 	)
90 {
91   *cfgp = get_lsb_short(bufpp);
92 }
93 
94 void
95 get_mbg_tgps(
96 	unsigned char **bufpp,
97 	T_GPS *tgpsp
98 	)
99 {
100   tgpsp->wn = get_lsb_short(bufpp);
101   tgpsp->sec = get_lsb_long(bufpp);
102   tgpsp->tick = get_lsb_long(bufpp);
103 }
104 
105 void
106 get_mbg_tm(
107 	unsigned char **buffpp,
108 	TM *tmp
109 	)
110 {
111   tmp->year = get_lsb_short(buffpp);
112   tmp->month = *(*buffpp)++;
113   tmp->mday  = *(*buffpp)++;
114   tmp->yday  = get_lsb_short(buffpp);
115   tmp->wday  = *(*buffpp)++;
116   tmp->hour  = *(*buffpp)++;
117   tmp->minute = *(*buffpp)++;
118   tmp->second = *(*buffpp)++;
119   tmp->frac  = get_lsb_long(buffpp);
120   tmp->offs_from_utc = get_lsb_long(buffpp);
121   tmp->status= get_lsb_short(buffpp);
122 }
123 
124 void
125 get_mbg_ttm(
126 	unsigned char **buffpp,
127 	TTM *ttmp
128 	)
129 {
130   ttmp->channel = get_lsb_short(buffpp);
131   get_mbg_tgps(buffpp, &ttmp->t);
132   get_mbg_tm(buffpp, &ttmp->tm);
133 }
134 
135 void
136 get_mbg_synth(
137 	unsigned char **buffpp,
138 	SYNTH *synthp
139 	)
140 {
141   synthp->freq  = get_lsb_short(buffpp);
142   synthp->range = get_lsb_short(buffpp);
143   synthp->phase = get_lsb_short(buffpp);
144 }
145 
146 static void
147 get_mbg_tzname(
148 	unsigned char **buffpp,
149 	char *tznamep
150 	)
151 {
152   strncpy(tznamep, (char *)*buffpp, sizeof(TZ_NAME));
153   *buffpp += sizeof(TZ_NAME);
154 }
155 
156 void
157 get_mbg_tzdl(
158 	unsigned char **buffpp,
159 	TZDL *tzdlp
160 	)
161 {
162   tzdlp->offs = get_lsb_long(buffpp);
163   tzdlp->offs_dl = get_lsb_long(buffpp);
164   get_mbg_tm(buffpp, &tzdlp->tm_on);
165   get_mbg_tm(buffpp, &tzdlp->tm_off);
166   get_mbg_tzname(buffpp, (char *)tzdlp->name[0]);
167   get_mbg_tzname(buffpp, (char *)tzdlp->name[1]);
168 }
169 
170 void
171 get_mbg_antinfo(
172 	unsigned char **buffpp,
173 	ANT_INFO *antinfop
174 	)
175 {
176   antinfop->status = get_lsb_short(buffpp);
177   get_mbg_tm(buffpp, &antinfop->tm_disconn);
178   get_mbg_tm(buffpp, &antinfop->tm_reconn);
179   antinfop->delta_t = get_lsb_long(buffpp);
180 }
181 
182 static void
183 mbg_time_status_str(
184 	unsigned char **buffpp,
185 	unsigned int status
186 	)
187 {
188   static struct state
189     {
190       int         flag;		/* bit flag */
191       const char *string;	/* bit name */
192     } states[] =
193     {
194       { TM_UTC,    "UTC CORR" },
195       { TM_LOCAL,  "LOCAL TIME" },
196       { TM_DL_ANN, "DST WARN" },
197       { TM_DL_ENB, "DST" },
198       { TM_LS_ANN, "LEAP WARN" },
199       { TM_LS_ENB, "LEAP SEC" },
200       { 0, "" }
201     };
202 
203   if (status)
204     {
205       unsigned char *p;
206       struct state *s;
207 
208       p = *buffpp;
209 
210       for (s = states; s->flag; s++)
211 	{
212 	  if (s->flag & status)
213 	    {
214 	      if (p != *buffpp)
215 		{
216 		  *p++ = ',';
217 		  *p++ = ' ';
218 		}
219 	      strcpy((char *)p, s->string);
220 	      p += strlen((char *)p);
221 	    }
222 	}
223       *buffpp = p;
224     }
225 }
226 
227 void
228 mbg_tm_str(
229 	unsigned char **buffpp,
230 	TM *tmp
231 	)
232 {
233   sprintf((char *)*buffpp, "%04d-%02d-%02d %02d:%02d:%02d.%07ld (%c%02d%02d) ",
234 	  tmp->year, tmp->month, tmp->mday,
235 	  tmp->hour, tmp->minute, tmp->second, tmp->frac,
236 	  (tmp->offs_from_utc < 0) ? '-' : '+',
237 	  abs(tmp->offs_from_utc) / 3600,
238 	  (abs(tmp->offs_from_utc) / 60) % 60);
239   *buffpp += strlen((char *)*buffpp);
240   mbg_time_status_str(buffpp, tmp->status);
241 }
242 
243 void
244 mbg_tgps_str(
245 	unsigned char **buffpp,
246 	T_GPS *tgpsp
247 	)
248 {
249   sprintf((char *)*buffpp, "week %d + %ld days + %ld.%07ld sec",
250 	  tgpsp->wn, tgpsp->sec / 86400,
251 	  tgpsp->sec % 86400, tgpsp->tick);
252   *buffpp += strlen((char *)*buffpp);
253 }
254 
255 void
256 get_mbg_cfgh(
257 	unsigned char **buffpp,
258 	CFGH *cfghp
259 	)
260 {
261   int i;
262 
263   cfghp->csum = get_lsb_short(buffpp);
264   cfghp->valid = get_lsb_short(buffpp);
265   get_mbg_tgps(buffpp, &cfghp->tot_51);
266   get_mbg_tgps(buffpp, &cfghp->tot_63);
267   get_mbg_tgps(buffpp, &cfghp->t0a);
268 
269   for (i = MIN_SVNO; i <= MAX_SVNO; i++)
270     {
271       get_mbg_cfg(buffpp, &cfghp->cfg[i]);
272     }
273 
274   for (i = MIN_SVNO; i <= MAX_SVNO; i++)
275     {
276       get_mbg_health(buffpp, &cfghp->health[i]);
277     }
278 }
279 
280 void
281 get_mbg_utc(
282 	unsigned char **buffpp,
283 	UTC *utcp
284 	)
285 {
286   utcp->csum  = get_lsb_short(buffpp);
287   utcp->valid = get_lsb_short(buffpp);
288 
289   get_mbg_tgps(buffpp, &utcp->t0t);
290 
291   if (fetch_ieee754(buffpp, IEEE_DOUBLE, &utcp->A0, mbg_double) != IEEE_OK)
292     {
293       L_CLR(&utcp->A0);
294     }
295 
296   if (fetch_ieee754(buffpp, IEEE_DOUBLE, &utcp->A1, mbg_double) != IEEE_OK)
297     {
298       L_CLR(&utcp->A1);
299     }
300 
301   utcp->WNlsf      = get_lsb_short(buffpp);
302   utcp->DNt        = get_lsb_short(buffpp);
303   utcp->delta_tls  = *(*buffpp)++;
304   utcp->delta_tlsf = *(*buffpp)++;
305 }
306 
307 void
308 get_mbg_lla(
309 	unsigned char **buffpp,
310 	LLA lla
311 	)
312 {
313   int i;
314 
315   for (i = LAT; i <= ALT; i++)
316     {
317       if  (fetch_ieee754(buffpp, IEEE_DOUBLE, &lla[i], mbg_double) != IEEE_OK)
318 	{
319 	  L_CLR(&lla[i]);
320 	}
321       else
322 	if (i != ALT)
323 	  {			/* convert to degrees (* 180/PI) */
324 	    mfp_mul(&lla[i].l_i, &lla[i].l_uf, lla[i].l_i, lla[i].l_uf, rad2deg_i, rad2deg_f);
325 	  }
326     }
327 }
328 
329 void
330 get_mbg_xyz(
331 	unsigned char **buffpp,
332 	XYZ xyz
333 	)
334 {
335   int i;
336 
337   for (i = XP; i <= ZP; i++)
338     {
339       if  (fetch_ieee754(buffpp, IEEE_DOUBLE, &xyz[i], mbg_double) != IEEE_OK)
340 	{
341 	  L_CLR(&xyz[i]);
342 	}
343     }
344 }
345 
346 static void
347 get_mbg_comparam(
348 	unsigned char **buffpp,
349 	COM_PARM *comparamp
350 	)
351 {
352   int i;
353 
354   comparamp->baud_rate = get_lsb_long(buffpp);
355   for (i = 0; i < sizeof(comparamp->framing); i++)
356     {
357       comparamp->framing[i] = *(*buffpp)++;
358     }
359   comparamp->handshake = get_lsb_short(buffpp);
360 }
361 
362 void
363 get_mbg_portparam(
364 	unsigned char **buffpp,
365 	PORT_PARM *portparamp
366 	)
367 {
368   int i;
369 
370   for (i = 0; i < N_COM; i++)
371     {
372       get_mbg_comparam(buffpp, &portparamp->com[i]);
373     }
374   for (i = 0; i < N_COM; i++)
375     {
376       portparamp->mode[i] = *(*buffpp)++;
377     }
378 }
379 
380 #define FETCH_DOUBLE(src, addr)							\
381 	if  (fetch_ieee754(src, IEEE_DOUBLE, addr, mbg_double) != IEEE_OK)	\
382 	{									\
383 	  L_CLR(addr);								\
384 	}
385 
386 void
387 get_mbg_eph(
388 	unsigned char ** buffpp,
389 	EPH *ephp
390 	)
391 {
392   ephp->csum   = get_lsb_short(buffpp);
393   ephp->valid  = get_lsb_short(buffpp);
394 
395   ephp->health = get_lsb_short(buffpp);
396   ephp->IODC   = get_lsb_short(buffpp);
397   ephp->IODE2  = get_lsb_short(buffpp);
398   ephp->IODE3  = get_lsb_short(buffpp);
399 
400   get_mbg_tgps(buffpp, &ephp->tt);
401   get_mbg_tgps(buffpp, &ephp->t0c);
402   get_mbg_tgps(buffpp, &ephp->t0e);
403 
404   FETCH_DOUBLE(buffpp, &ephp->sqrt_A);
405   FETCH_DOUBLE(buffpp, &ephp->e);
406   FETCH_DOUBLE(buffpp, &ephp->M0);
407   FETCH_DOUBLE(buffpp, &ephp->omega);
408   FETCH_DOUBLE(buffpp, &ephp->OMEGA0);
409   FETCH_DOUBLE(buffpp, &ephp->OMEGADOT);
410   FETCH_DOUBLE(buffpp, &ephp->deltan);
411   FETCH_DOUBLE(buffpp, &ephp->i0);
412   FETCH_DOUBLE(buffpp, &ephp->idot);
413   FETCH_DOUBLE(buffpp, &ephp->crc);
414   FETCH_DOUBLE(buffpp, &ephp->crs);
415   FETCH_DOUBLE(buffpp, &ephp->cuc);
416   FETCH_DOUBLE(buffpp, &ephp->cus);
417   FETCH_DOUBLE(buffpp, &ephp->cic);
418   FETCH_DOUBLE(buffpp, &ephp->cis);
419 
420   FETCH_DOUBLE(buffpp, &ephp->af0);
421   FETCH_DOUBLE(buffpp, &ephp->af1);
422   FETCH_DOUBLE(buffpp, &ephp->af2);
423   FETCH_DOUBLE(buffpp, &ephp->tgd);
424 
425   ephp->URA = get_lsb_short(buffpp);
426 
427   ephp->L2code = *(*buffpp)++;
428   ephp->L2flag = *(*buffpp)++;
429 }
430 
431 void
432 get_mbg_alm(
433 	unsigned char **buffpp,
434 	ALM *almp
435 	)
436 {
437   almp->csum   = get_lsb_short(buffpp);
438   almp->valid  = get_lsb_short(buffpp);
439 
440   almp->health = get_lsb_short(buffpp);
441   get_mbg_tgps(buffpp, &almp->t0a);
442 
443 
444   FETCH_DOUBLE(buffpp, &almp->sqrt_A);
445   FETCH_DOUBLE(buffpp, &almp->e);
446 
447   FETCH_DOUBLE(buffpp, &almp->M0);
448   FETCH_DOUBLE(buffpp, &almp->omega);
449   FETCH_DOUBLE(buffpp, &almp->OMEGA0);
450   FETCH_DOUBLE(buffpp, &almp->OMEGADOT);
451   FETCH_DOUBLE(buffpp, &almp->deltai);
452   FETCH_DOUBLE(buffpp, &almp->af0);
453   FETCH_DOUBLE(buffpp, &almp->af1);
454 }
455 
456 void
457 get_mbg_iono(
458 	unsigned char **buffpp,
459 	IONO *ionop
460 	)
461 {
462   ionop->csum   = get_lsb_short(buffpp);
463   ionop->valid  = get_lsb_short(buffpp);
464 
465   FETCH_DOUBLE(buffpp, &ionop->alpha_0);
466   FETCH_DOUBLE(buffpp, &ionop->alpha_1);
467   FETCH_DOUBLE(buffpp, &ionop->alpha_2);
468   FETCH_DOUBLE(buffpp, &ionop->alpha_3);
469 
470   FETCH_DOUBLE(buffpp, &ionop->beta_0);
471   FETCH_DOUBLE(buffpp, &ionop->beta_1);
472   FETCH_DOUBLE(buffpp, &ionop->beta_2);
473   FETCH_DOUBLE(buffpp, &ionop->beta_3);
474 }
475 
476 /*
477  * data_mbg.c,v
478  * Revision 4.3  1999/02/21 12:17:42  kardel
479  * 4.91f reconcilation
480  *
481  * Revision 4.2  1998/06/14 21:09:39  kardel
482  * Sun acc cleanup
483  *
484  * Revision 4.1  1998/05/24 08:02:06  kardel
485  * trimmed version log
486  *
487  * Revision 4.0  1998/04/10 19:45:33  kardel
488  * Start 4.0 release version numbering
489  */
490 
491