data_mbg.c revision ef64b99e8412f2273dd2e8b3291c2f78ffc4667f
1/*
2 * /src/NTP/ntp-4/libparse/data_mbg.c,v 4.3 1999/02/21 12:17:42 kardel RELEASE_19990228_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
22static void get_mbg_tzname P((unsigned char **, char *));
23static void mbg_time_status_str P((unsigned char **, unsigned int));
24
25#if 0				/* no actual floats on Meinberg binary interface */
26static offsets_t mbg_float  = { 1, 0, 3, 2, 0, 0, 0, 0 }; /* byte order for meinberg floats */
27#endif
28static offsets_t mbg_double = { 1, 0, 3, 2, 5, 4, 7, 6 }; /* byte order for meinberg doubles */
29static int32   rad2deg_i = 57;
30static u_int32 rad2deg_f = 0x4BB834C7; /* 57.2957795131 == 180/PI */
31
32void
33put_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
44void
45get_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
55void
56get_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
67void
68get_mbg_svno(
69	unsigned char **bufpp,
70	SVNO *svnop
71	)
72{
73  *svnop = get_lsb_short(bufpp);
74}
75
76void
77get_mbg_health(
78	unsigned char **bufpp,
79	HEALTH *healthp
80	)
81{
82  *healthp = get_lsb_short(bufpp);
83}
84
85void
86get_mbg_cfg(
87	unsigned char **bufpp,
88	CFG *cfgp
89	)
90{
91  *cfgp = get_lsb_short(bufpp);
92}
93
94void
95get_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
105void
106get_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
124void
125get_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
135void
136get_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
146static void
147get_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
156void
157get_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
170void
171get_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
182static void
183mbg_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
227void
228mbg_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
243void
244mbg_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
255void
256get_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
280void
281get_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
307void
308get_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
329void
330get_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
346static void
347get_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
362void
363get_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
386void
387get_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
431void
432get_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
456void
457get_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