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