2 * /src/NTP/REPOSITORY/ntp4-dev/libparse/data_mbg.c,v 4.8 2006/06/22 18:40:01 kardel RELEASE_20060622_A
4 * data_mbg.c,v 4.8 2006/06/22 18:40:01 kardel RELEASE_20060622_A
6 * $Created: Sun Jul 20 12:08:14 1997 $
8 * Copyright (c) 1997-2005 by Frank Kardel <kardel <AT> ntp.org>
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of the author nor the names of its contributors
19 * may be used to endorse or promote products derived from this software
20 * without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 #include "ntp_string.h"
43 #include "ntp_types.h"
44 #include "ntp_stdlib.h"
46 #include "ntp_calendar.h"
47 #include "mbg_gps166.h"
49 #include "ieee754io.h"
51 static void get_mbg_tzname (unsigned char **, char *);
52 static void mbg_time_status_str (char **, unsigned int, int);
54 #if 0 /* no actual floats on Meinberg binary interface */
55 static offsets_t mbg_float = { 1, 0, 3, 2, 0, 0, 0, 0 }; /* byte order for meinberg floats */
57 static offsets_t mbg_double = { 1, 0, 3, 2, 5, 4, 7, 6 }; /* byte order for meinberg doubles */
58 static int32 rad2deg_i = 57;
59 static u_int32 rad2deg_f = 0x4BB834C7; /* 57.2957795131 == 180/PI */
63 unsigned char **bufpp,
67 put_lsb_short(bufpp, headerp->cmd);
68 put_lsb_short(bufpp, headerp->len);
69 put_lsb_short(bufpp, headerp->data_csum);
70 put_lsb_short(bufpp, headerp->hdr_csum);
75 unsigned char **bufpp,
79 sw_revp->code = get_lsb_uint16(bufpp);
80 memcpy(sw_revp->name, *bufpp, sizeof(sw_revp->name));
81 *bufpp += sizeof(sw_revp->name);
86 unsigned char **bufpp,
90 ascii_msgp->csum = (CSUM) get_lsb_short(bufpp);
91 ascii_msgp->valid = get_lsb_int16(bufpp);
92 memcpy(ascii_msgp->s, *bufpp, sizeof(ascii_msgp->s));
93 *bufpp += sizeof(ascii_msgp->s);
98 unsigned char **bufpp,
102 *svnop = (SVNO) get_lsb_short(bufpp);
107 unsigned char **bufpp,
111 *healthp = (HEALTH) get_lsb_short(bufpp);
116 unsigned char **bufpp,
120 *cfgp = (CFG) get_lsb_short(bufpp);
125 unsigned char **bufpp,
129 tgpsp->wn = get_lsb_uint16(bufpp);
130 tgpsp->sec = get_lsb_long(bufpp);
131 tgpsp->tick = get_lsb_long(bufpp);
136 unsigned char **buffpp,
140 tmp->year = get_lsb_int16(buffpp);
141 tmp->month = *(*buffpp)++;
142 tmp->mday = *(*buffpp)++;
143 tmp->yday = get_lsb_int16(buffpp);
144 tmp->wday = *(*buffpp)++;
145 tmp->hour = *(*buffpp)++;
146 tmp->min = *(*buffpp)++;
147 tmp->sec = *(*buffpp)++;
148 tmp->frac = get_lsb_long(buffpp);
149 tmp->offs_from_utc = get_lsb_long(buffpp);
150 tmp->status = get_lsb_uint16(buffpp);
155 unsigned char **buffpp,
159 ttmp->channel = get_lsb_int16(buffpp);
160 get_mbg_tgps(buffpp, &ttmp->t);
161 get_mbg_tm(buffpp, &ttmp->tm);
166 unsigned char **buffpp,
170 synthp->freq = get_lsb_int16(buffpp);
171 synthp->range = get_lsb_int16(buffpp);
172 synthp->phase = get_lsb_int16(buffpp);
177 unsigned char **buffpp,
181 strlcpy(tznamep, (char *)*buffpp, sizeof(TZ_NAME));
182 *buffpp += sizeof(TZ_NAME);
187 unsigned char **buffpp,
191 tzdlp->offs = get_lsb_long(buffpp);
192 tzdlp->offs_dl = get_lsb_long(buffpp);
193 get_mbg_tm(buffpp, &tzdlp->tm_on);
194 get_mbg_tm(buffpp, &tzdlp->tm_off);
195 get_mbg_tzname(buffpp, (char *)tzdlp->name[0]);
196 get_mbg_tzname(buffpp, (char *)tzdlp->name[1]);
201 unsigned char **buffpp,
205 antinfop->status = get_lsb_int16(buffpp);
206 get_mbg_tm(buffpp, &antinfop->tm_disconn);
207 get_mbg_tm(buffpp, &antinfop->tm_reconn);
208 antinfop->delta_t = get_lsb_long(buffpp);
220 int flag; /* bit flag */
221 const char *string; /* bit name */
224 { TM_UTC, "UTC CORR" },
225 { TM_LOCAL, "LOCAL TIME" },
226 { TM_DL_ANN, "DST WARN" },
227 { TM_DL_ENB, "DST" },
228 { TM_LS_ANN, "LEAP WARN" },
229 { TM_LS_ENB, "LEAP SEC" },
240 for (s = states; s->flag; s++)
242 if (s->flag & status)
246 strlcpy(p, ", ", size - (p - start));
249 strlcpy(p, s->string, size - (p - start));
267 snprintf(*buffpp, size, "%04d-%02d-%02d %02d:%02d:%02d.%07ld (%c%02d%02d) ",
268 tmp->year, tmp->month, tmp->mday,
269 tmp->hour, tmp->min, tmp->sec, (long) tmp->frac,
270 (tmp->offs_from_utc < 0) ? '-' : '+',
271 abs((int)tmp->offs_from_utc) / 3600,
272 (abs((int)tmp->offs_from_utc) / 60) % 60);
273 *buffpp += strlen(*buffpp);
276 mbg_time_status_str(buffpp, tmp->status, size - (*buffpp - s));
286 snprintf(*buffpp, size, "week %d + %ld days + %ld.%07ld sec",
287 tgpsp->wn, (long) tgpsp->sec / SECSPERDAY,
288 (long) tgpsp->sec % SECSPERDAY, (long) tgpsp->tick);
289 *buffpp += strlen(*buffpp);
294 unsigned char **buffpp,
300 cfghp->csum = (CSUM) get_lsb_short(buffpp);
301 cfghp->valid = get_lsb_int16(buffpp);
302 get_mbg_tgps(buffpp, &cfghp->tot_51);
303 get_mbg_tgps(buffpp, &cfghp->tot_63);
304 get_mbg_tgps(buffpp, &cfghp->t0a);
306 for (i = 0; i < N_SVNO_GPS; i++)
308 get_mbg_cfg(buffpp, &cfghp->cfg[i]);
311 for (i = 0; i < N_SVNO_GPS; i++)
313 get_mbg_health(buffpp, &cfghp->health[i]);
319 unsigned char **buffpp,
323 utcp->csum = (CSUM) get_lsb_short(buffpp);
324 utcp->valid = get_lsb_int16(buffpp);
326 get_mbg_tgps(buffpp, &utcp->t0t);
328 if (fetch_ieee754(buffpp, IEEE_DOUBLE, &utcp->A0, mbg_double) != IEEE_OK)
333 if (fetch_ieee754(buffpp, IEEE_DOUBLE, &utcp->A1, mbg_double) != IEEE_OK)
338 utcp->WNlsf = get_lsb_uint16(buffpp);
339 utcp->DNt = get_lsb_int16(buffpp);
340 utcp->delta_tls = *(*buffpp)++;
341 utcp->delta_tlsf = *(*buffpp)++;
346 unsigned char **buffpp,
352 for (i = LAT; i <= ALT; i++)
354 if (fetch_ieee754(buffpp, IEEE_DOUBLE, &lla[i], mbg_double) != IEEE_OK)
360 { /* convert to degrees (* 180/PI) */
361 mfp_mul(&lla[i].l_i, &lla[i].l_uf, lla[i].l_i, lla[i].l_uf, rad2deg_i, rad2deg_f);
368 unsigned char **buffpp,
374 for (i = XP; i <= ZP; i++)
376 if (fetch_ieee754(buffpp, IEEE_DOUBLE, &xyz[i], mbg_double) != IEEE_OK)
385 unsigned char **buffpp,
391 comparamp->baud_rate = get_lsb_long(buffpp);
392 for (i = 0; i < sizeof(comparamp->framing); i++)
394 comparamp->framing[i] = *(*buffpp)++;
396 comparamp->handshake = get_lsb_int16(buffpp);
401 unsigned char **buffpp,
402 PORT_PARM *portparamp
407 for (i = 0; i < DEFAULT_N_COM; i++)
409 get_mbg_comparam(buffpp, &portparamp->com[i]);
411 for (i = 0; i < DEFAULT_N_COM; i++)
413 portparamp->mode[i] = *(*buffpp)++;
417 #define FETCH_DOUBLE(src, addr) \
418 if (fetch_ieee754(src, IEEE_DOUBLE, addr, mbg_double) != IEEE_OK) \
425 unsigned char ** buffpp,
429 ephp->csum = (CSUM) get_lsb_short(buffpp);
430 ephp->valid = get_lsb_int16(buffpp);
432 ephp->health = (HEALTH) get_lsb_short(buffpp);
433 ephp->IODC = (IOD) get_lsb_short(buffpp);
434 ephp->IODE2 = (IOD) get_lsb_short(buffpp);
435 ephp->IODE3 = (IOD) get_lsb_short(buffpp);
437 get_mbg_tgps(buffpp, &ephp->tt);
438 get_mbg_tgps(buffpp, &ephp->t0c);
439 get_mbg_tgps(buffpp, &ephp->t0e);
441 FETCH_DOUBLE(buffpp, &ephp->sqrt_A);
442 FETCH_DOUBLE(buffpp, &ephp->e);
443 FETCH_DOUBLE(buffpp, &ephp->M0);
444 FETCH_DOUBLE(buffpp, &ephp->omega);
445 FETCH_DOUBLE(buffpp, &ephp->OMEGA0);
446 FETCH_DOUBLE(buffpp, &ephp->OMEGADOT);
447 FETCH_DOUBLE(buffpp, &ephp->deltan);
448 FETCH_DOUBLE(buffpp, &ephp->i0);
449 FETCH_DOUBLE(buffpp, &ephp->idot);
450 FETCH_DOUBLE(buffpp, &ephp->crc);
451 FETCH_DOUBLE(buffpp, &ephp->crs);
452 FETCH_DOUBLE(buffpp, &ephp->cuc);
453 FETCH_DOUBLE(buffpp, &ephp->cus);
454 FETCH_DOUBLE(buffpp, &ephp->cic);
455 FETCH_DOUBLE(buffpp, &ephp->cis);
457 FETCH_DOUBLE(buffpp, &ephp->af0);
458 FETCH_DOUBLE(buffpp, &ephp->af1);
459 FETCH_DOUBLE(buffpp, &ephp->af2);
460 FETCH_DOUBLE(buffpp, &ephp->tgd);
462 ephp->URA = get_lsb_uint16(buffpp);
464 ephp->L2code = *(*buffpp)++;
465 ephp->L2flag = *(*buffpp)++;
470 unsigned char **buffpp,
474 almp->csum = (CSUM) get_lsb_short(buffpp);
475 almp->valid = get_lsb_int16(buffpp);
477 almp->health = (HEALTH) get_lsb_short(buffpp);
478 get_mbg_tgps(buffpp, &almp->t0a);
481 FETCH_DOUBLE(buffpp, &almp->sqrt_A);
482 FETCH_DOUBLE(buffpp, &almp->e);
484 FETCH_DOUBLE(buffpp, &almp->M0);
485 FETCH_DOUBLE(buffpp, &almp->omega);
486 FETCH_DOUBLE(buffpp, &almp->OMEGA0);
487 FETCH_DOUBLE(buffpp, &almp->OMEGADOT);
488 FETCH_DOUBLE(buffpp, &almp->deltai);
489 FETCH_DOUBLE(buffpp, &almp->af0);
490 FETCH_DOUBLE(buffpp, &almp->af1);
495 unsigned char **buffpp,
499 ionop->csum = (CSUM) get_lsb_short(buffpp);
500 ionop->valid = get_lsb_int16(buffpp);
502 FETCH_DOUBLE(buffpp, &ionop->alpha_0);
503 FETCH_DOUBLE(buffpp, &ionop->alpha_1);
504 FETCH_DOUBLE(buffpp, &ionop->alpha_2);
505 FETCH_DOUBLE(buffpp, &ionop->alpha_3);
507 FETCH_DOUBLE(buffpp, &ionop->beta_0);
508 FETCH_DOUBLE(buffpp, &ionop->beta_1);
509 FETCH_DOUBLE(buffpp, &ionop->beta_2);
510 FETCH_DOUBLE(buffpp, &ionop->beta_3);
515 * Revision 4.8 2006/06/22 18:40:01 kardel
516 * clean up signedness (gcc 4)
518 * Revision 4.7 2005/10/07 22:11:10 kardel
519 * bounded buffer implementation
521 * Revision 4.6.2.1 2005/09/25 10:23:06 kardel
522 * support bounded buffers
524 * Revision 4.6 2005/04/16 17:32:10 kardel
527 * Revision 4.5 2004/11/14 15:29:41 kardel
528 * support PPSAPI, upgrade Copyright to Berkeley style
530 * Revision 4.3 1999/02/21 12:17:42 kardel
531 * 4.91f reconcilation
533 * Revision 4.2 1998/06/14 21:09:39 kardel
536 * Revision 4.1 1998/05/24 08:02:06 kardel
537 * trimmed version log
539 * Revision 4.0 1998/04/10 19:45:33 kardel
540 * Start 4.0 release version numbering