summaryrefslogtreecommitdiff
path: root/libparse/data_mbg.c
diff options
context:
space:
mode:
Diffstat (limited to 'libparse/data_mbg.c')
-rw-r--r--libparse/data_mbg.c542
1 files changed, 542 insertions, 0 deletions
diff --git a/libparse/data_mbg.c b/libparse/data_mbg.c
new file mode 100644
index 0000000000000..0b3808c8ba647
--- /dev/null
+++ b/libparse/data_mbg.c
@@ -0,0 +1,542 @@
+/*
+ * /src/NTP/REPOSITORY/ntp4-dev/libparse/data_mbg.c,v 4.8 2006/06/22 18:40:01 kardel RELEASE_20060622_A
+ *
+ * data_mbg.c,v 4.8 2006/06/22 18:40:01 kardel RELEASE_20060622_A
+ *
+ * $Created: Sun Jul 20 12:08:14 1997 $
+ *
+ * Copyright (c) 1997-2005 by Frank Kardel <kardel <AT> ntp.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the author nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <config.h>
+#ifdef PARSESTREAM
+#define NEED_BOPS
+#include "ntp_string.h"
+#else
+#include <stdio.h>
+#endif
+#include "ntp_types.h"
+#include "ntp_stdlib.h"
+#include "ntp_fp.h"
+#include "ntp_calendar.h"
+#include "mbg_gps166.h"
+#include "binio.h"
+#include "ieee754io.h"
+
+static void get_mbg_tzname (unsigned char **, char *);
+static void mbg_time_status_str (char **, unsigned int, int);
+
+#if 0 /* no actual floats on Meinberg binary interface */
+static offsets_t mbg_float = { 1, 0, 3, 2, 0, 0, 0, 0 }; /* byte order for meinberg floats */
+#endif
+static offsets_t mbg_double = { 1, 0, 3, 2, 5, 4, 7, 6 }; /* byte order for meinberg doubles */
+static int32 rad2deg_i = 57;
+static u_int32 rad2deg_f = 0x4BB834C7; /* 57.2957795131 == 180/PI */
+
+void
+put_mbg_header(
+ unsigned char **bufpp,
+ GPS_MSG_HDR *headerp
+ )
+{
+ put_lsb_short(bufpp, headerp->cmd);
+ put_lsb_short(bufpp, headerp->len);
+ put_lsb_short(bufpp, headerp->data_csum);
+ put_lsb_short(bufpp, headerp->hdr_csum);
+}
+
+void
+get_mbg_sw_rev(
+ unsigned char **bufpp,
+ SW_REV *sw_revp
+ )
+{
+ sw_revp->code = get_lsb_uint16(bufpp);
+ memcpy(sw_revp->name, *bufpp, sizeof(sw_revp->name));
+ *bufpp += sizeof(sw_revp->name);
+}
+
+void
+get_mbg_ascii_msg(
+ unsigned char **bufpp,
+ ASCII_MSG *ascii_msgp
+ )
+{
+ ascii_msgp->csum = (CSUM) get_lsb_short(bufpp);
+ ascii_msgp->valid = get_lsb_int16(bufpp);
+ memcpy(ascii_msgp->s, *bufpp, sizeof(ascii_msgp->s));
+ *bufpp += sizeof(ascii_msgp->s);
+}
+
+void
+get_mbg_svno(
+ unsigned char **bufpp,
+ SVNO *svnop
+ )
+{
+ *svnop = (SVNO) get_lsb_short(bufpp);
+}
+
+void
+get_mbg_health(
+ unsigned char **bufpp,
+ HEALTH *healthp
+ )
+{
+ *healthp = (HEALTH) get_lsb_short(bufpp);
+}
+
+void
+get_mbg_cfg(
+ unsigned char **bufpp,
+ CFG *cfgp
+ )
+{
+ *cfgp = (CFG) get_lsb_short(bufpp);
+}
+
+void
+get_mbg_tgps(
+ unsigned char **bufpp,
+ T_GPS *tgpsp
+ )
+{
+ tgpsp->wn = get_lsb_uint16(bufpp);
+ tgpsp->sec = get_lsb_long(bufpp);
+ tgpsp->tick = get_lsb_long(bufpp);
+}
+
+void
+get_mbg_tm(
+ unsigned char **buffpp,
+ TM_GPS *tmp
+ )
+{
+ tmp->year = get_lsb_int16(buffpp);
+ tmp->month = *(*buffpp)++;
+ tmp->mday = *(*buffpp)++;
+ tmp->yday = get_lsb_int16(buffpp);
+ tmp->wday = *(*buffpp)++;
+ tmp->hour = *(*buffpp)++;
+ tmp->min = *(*buffpp)++;
+ tmp->sec = *(*buffpp)++;
+ tmp->frac = get_lsb_long(buffpp);
+ tmp->offs_from_utc = get_lsb_long(buffpp);
+ tmp->status = get_lsb_uint16(buffpp);
+}
+
+void
+get_mbg_ttm(
+ unsigned char **buffpp,
+ TTM *ttmp
+ )
+{
+ ttmp->channel = get_lsb_int16(buffpp);
+ get_mbg_tgps(buffpp, &ttmp->t);
+ get_mbg_tm(buffpp, &ttmp->tm);
+}
+
+void
+get_mbg_synth(
+ unsigned char **buffpp,
+ SYNTH *synthp
+ )
+{
+ synthp->freq = get_lsb_int16(buffpp);
+ synthp->range = get_lsb_int16(buffpp);
+ synthp->phase = get_lsb_int16(buffpp);
+}
+
+static void
+get_mbg_tzname(
+ unsigned char **buffpp,
+ char *tznamep
+ )
+{
+ strlcpy(tznamep, (char *)*buffpp, sizeof(TZ_NAME));
+ *buffpp += sizeof(TZ_NAME);
+}
+
+void
+get_mbg_tzdl(
+ unsigned char **buffpp,
+ TZDL *tzdlp
+ )
+{
+ tzdlp->offs = get_lsb_long(buffpp);
+ tzdlp->offs_dl = get_lsb_long(buffpp);
+ get_mbg_tm(buffpp, &tzdlp->tm_on);
+ get_mbg_tm(buffpp, &tzdlp->tm_off);
+ get_mbg_tzname(buffpp, (char *)tzdlp->name[0]);
+ get_mbg_tzname(buffpp, (char *)tzdlp->name[1]);
+}
+
+void
+get_mbg_antinfo(
+ unsigned char **buffpp,
+ ANT_INFO *antinfop
+ )
+{
+ antinfop->status = get_lsb_int16(buffpp);
+ get_mbg_tm(buffpp, &antinfop->tm_disconn);
+ get_mbg_tm(buffpp, &antinfop->tm_reconn);
+ antinfop->delta_t = get_lsb_long(buffpp);
+}
+
+static void
+mbg_time_status_str(
+ char **buffpp,
+ unsigned int status,
+ int size
+ )
+{
+ static struct state
+ {
+ int flag; /* bit flag */
+ const char *string; /* bit name */
+ } states[] =
+ {
+ { TM_UTC, "UTC CORR" },
+ { TM_LOCAL, "LOCAL TIME" },
+ { TM_DL_ANN, "DST WARN" },
+ { TM_DL_ENB, "DST" },
+ { TM_LS_ANN, "LEAP WARN" },
+ { TM_LS_ENB, "LEAP SEC" },
+ { 0, "" }
+ };
+
+ if (status)
+ {
+ char *start, *p;
+ struct state *s;
+
+ start = p = *buffpp;
+
+ for (s = states; s->flag; s++)
+ {
+ if (s->flag & status)
+ {
+ if (p != *buffpp)
+ {
+ strlcpy(p, ", ", size - (p - start));
+ p += 2;
+ }
+ strlcpy(p, s->string, size - (p - start));
+ p += strlen(p);
+ }
+ }
+ *buffpp = p;
+ }
+}
+
+void
+mbg_tm_str(
+ char **buffpp,
+ TM_GPS *tmp,
+ int size,
+ int print_status
+ )
+{
+ char *s = *buffpp;
+
+ snprintf(*buffpp, size, "%04d-%02d-%02d %02d:%02d:%02d.%07ld (%c%02d%02d) ",
+ tmp->year, tmp->month, tmp->mday,
+ tmp->hour, tmp->min, tmp->sec, (long) tmp->frac,
+ (tmp->offs_from_utc < 0) ? '-' : '+',
+ abs((int)tmp->offs_from_utc) / 3600,
+ (abs((int)tmp->offs_from_utc) / 60) % 60);
+ *buffpp += strlen(*buffpp);
+
+ if (print_status)
+ mbg_time_status_str(buffpp, tmp->status, size - (*buffpp - s));
+}
+
+void
+mbg_tgps_str(
+ char **buffpp,
+ T_GPS *tgpsp,
+ int size
+ )
+{
+ snprintf(*buffpp, size, "week %d + %ld days + %ld.%07ld sec",
+ tgpsp->wn, (long) tgpsp->sec / SECSPERDAY,
+ (long) tgpsp->sec % SECSPERDAY, (long) tgpsp->tick);
+ *buffpp += strlen(*buffpp);
+}
+
+void
+get_mbg_cfgh(
+ unsigned char **buffpp,
+ CFGH *cfghp
+ )
+{
+ int i;
+
+ cfghp->csum = (CSUM) get_lsb_short(buffpp);
+ cfghp->valid = get_lsb_int16(buffpp);
+ get_mbg_tgps(buffpp, &cfghp->tot_51);
+ get_mbg_tgps(buffpp, &cfghp->tot_63);
+ get_mbg_tgps(buffpp, &cfghp->t0a);
+
+ for (i = 0; i < N_SVNO_GPS; i++)
+ {
+ get_mbg_cfg(buffpp, &cfghp->cfg[i]);
+ }
+
+ for (i = 0; i < N_SVNO_GPS; i++)
+ {
+ get_mbg_health(buffpp, &cfghp->health[i]);
+ }
+}
+
+void
+get_mbg_utc(
+ unsigned char **buffpp,
+ UTC *utcp
+ )
+{
+ utcp->csum = (CSUM) get_lsb_short(buffpp);
+ utcp->valid = get_lsb_int16(buffpp);
+
+ get_mbg_tgps(buffpp, &utcp->t0t);
+
+ if (fetch_ieee754(buffpp, IEEE_DOUBLE, &utcp->A0, mbg_double) != IEEE_OK)
+ {
+ L_CLR(&utcp->A0);
+ }
+
+ if (fetch_ieee754(buffpp, IEEE_DOUBLE, &utcp->A1, mbg_double) != IEEE_OK)
+ {
+ L_CLR(&utcp->A1);
+ }
+
+ utcp->WNlsf = get_lsb_uint16(buffpp);
+ utcp->DNt = get_lsb_int16(buffpp);
+ utcp->delta_tls = *(*buffpp)++;
+ utcp->delta_tlsf = *(*buffpp)++;
+}
+
+void
+get_mbg_lla(
+ unsigned char **buffpp,
+ LLA lla
+ )
+{
+ int i;
+
+ for (i = LAT; i <= ALT; i++)
+ {
+ if (fetch_ieee754(buffpp, IEEE_DOUBLE, &lla[i], mbg_double) != IEEE_OK)
+ {
+ L_CLR(&lla[i]);
+ }
+ else
+ if (i != ALT)
+ { /* convert to degrees (* 180/PI) */
+ mfp_mul(&lla[i].l_i, &lla[i].l_uf, lla[i].l_i, lla[i].l_uf, rad2deg_i, rad2deg_f);
+ }
+ }
+}
+
+void
+get_mbg_xyz(
+ unsigned char **buffpp,
+ XYZ xyz
+ )
+{
+ int i;
+
+ for (i = XP; i <= ZP; i++)
+ {
+ if (fetch_ieee754(buffpp, IEEE_DOUBLE, &xyz[i], mbg_double) != IEEE_OK)
+ {
+ L_CLR(&xyz[i]);
+ }
+ }
+}
+
+static void
+get_mbg_comparam(
+ unsigned char **buffpp,
+ COM_PARM *comparamp
+ )
+{
+ size_t i;
+
+ comparamp->baud_rate = get_lsb_long(buffpp);
+ for (i = 0; i < sizeof(comparamp->framing); i++)
+ {
+ comparamp->framing[i] = *(*buffpp)++;
+ }
+ comparamp->handshake = get_lsb_int16(buffpp);
+}
+
+void
+get_mbg_portparam(
+ unsigned char **buffpp,
+ PORT_PARM *portparamp
+ )
+{
+ int i;
+
+ for (i = 0; i < DEFAULT_N_COM; i++)
+ {
+ get_mbg_comparam(buffpp, &portparamp->com[i]);
+ }
+ for (i = 0; i < DEFAULT_N_COM; i++)
+ {
+ portparamp->mode[i] = *(*buffpp)++;
+ }
+}
+
+#define FETCH_DOUBLE(src, addr) \
+ if (fetch_ieee754(src, IEEE_DOUBLE, addr, mbg_double) != IEEE_OK) \
+ { \
+ L_CLR(addr); \
+ }
+
+void
+get_mbg_eph(
+ unsigned char ** buffpp,
+ EPH *ephp
+ )
+{
+ ephp->csum = (CSUM) get_lsb_short(buffpp);
+ ephp->valid = get_lsb_int16(buffpp);
+
+ ephp->health = (HEALTH) get_lsb_short(buffpp);
+ ephp->IODC = (IOD) get_lsb_short(buffpp);
+ ephp->IODE2 = (IOD) get_lsb_short(buffpp);
+ ephp->IODE3 = (IOD) get_lsb_short(buffpp);
+
+ get_mbg_tgps(buffpp, &ephp->tt);
+ get_mbg_tgps(buffpp, &ephp->t0c);
+ get_mbg_tgps(buffpp, &ephp->t0e);
+
+ FETCH_DOUBLE(buffpp, &ephp->sqrt_A);
+ FETCH_DOUBLE(buffpp, &ephp->e);
+ FETCH_DOUBLE(buffpp, &ephp->M0);
+ FETCH_DOUBLE(buffpp, &ephp->omega);
+ FETCH_DOUBLE(buffpp, &ephp->OMEGA0);
+ FETCH_DOUBLE(buffpp, &ephp->OMEGADOT);
+ FETCH_DOUBLE(buffpp, &ephp->deltan);
+ FETCH_DOUBLE(buffpp, &ephp->i0);
+ FETCH_DOUBLE(buffpp, &ephp->idot);
+ FETCH_DOUBLE(buffpp, &ephp->crc);
+ FETCH_DOUBLE(buffpp, &ephp->crs);
+ FETCH_DOUBLE(buffpp, &ephp->cuc);
+ FETCH_DOUBLE(buffpp, &ephp->cus);
+ FETCH_DOUBLE(buffpp, &ephp->cic);
+ FETCH_DOUBLE(buffpp, &ephp->cis);
+
+ FETCH_DOUBLE(buffpp, &ephp->af0);
+ FETCH_DOUBLE(buffpp, &ephp->af1);
+ FETCH_DOUBLE(buffpp, &ephp->af2);
+ FETCH_DOUBLE(buffpp, &ephp->tgd);
+
+ ephp->URA = get_lsb_uint16(buffpp);
+
+ ephp->L2code = *(*buffpp)++;
+ ephp->L2flag = *(*buffpp)++;
+}
+
+void
+get_mbg_alm(
+ unsigned char **buffpp,
+ ALM *almp
+ )
+{
+ almp->csum = (CSUM) get_lsb_short(buffpp);
+ almp->valid = get_lsb_int16(buffpp);
+
+ almp->health = (HEALTH) get_lsb_short(buffpp);
+ get_mbg_tgps(buffpp, &almp->t0a);
+
+
+ FETCH_DOUBLE(buffpp, &almp->sqrt_A);
+ FETCH_DOUBLE(buffpp, &almp->e);
+
+ FETCH_DOUBLE(buffpp, &almp->M0);
+ FETCH_DOUBLE(buffpp, &almp->omega);
+ FETCH_DOUBLE(buffpp, &almp->OMEGA0);
+ FETCH_DOUBLE(buffpp, &almp->OMEGADOT);
+ FETCH_DOUBLE(buffpp, &almp->deltai);
+ FETCH_DOUBLE(buffpp, &almp->af0);
+ FETCH_DOUBLE(buffpp, &almp->af1);
+}
+
+void
+get_mbg_iono(
+ unsigned char **buffpp,
+ IONO *ionop
+ )
+{
+ ionop->csum = (CSUM) get_lsb_short(buffpp);
+ ionop->valid = get_lsb_int16(buffpp);
+
+ FETCH_DOUBLE(buffpp, &ionop->alpha_0);
+ FETCH_DOUBLE(buffpp, &ionop->alpha_1);
+ FETCH_DOUBLE(buffpp, &ionop->alpha_2);
+ FETCH_DOUBLE(buffpp, &ionop->alpha_3);
+
+ FETCH_DOUBLE(buffpp, &ionop->beta_0);
+ FETCH_DOUBLE(buffpp, &ionop->beta_1);
+ FETCH_DOUBLE(buffpp, &ionop->beta_2);
+ FETCH_DOUBLE(buffpp, &ionop->beta_3);
+}
+
+/*
+ * data_mbg.c,v
+ * Revision 4.8 2006/06/22 18:40:01 kardel
+ * clean up signedness (gcc 4)
+ *
+ * Revision 4.7 2005/10/07 22:11:10 kardel
+ * bounded buffer implementation
+ *
+ * Revision 4.6.2.1 2005/09/25 10:23:06 kardel
+ * support bounded buffers
+ *
+ * Revision 4.6 2005/04/16 17:32:10 kardel
+ * update copyright
+ *
+ * Revision 4.5 2004/11/14 15:29:41 kardel
+ * support PPSAPI, upgrade Copyright to Berkeley style
+ *
+ * Revision 4.3 1999/02/21 12:17:42 kardel
+ * 4.91f reconcilation
+ *
+ * Revision 4.2 1998/06/14 21:09:39 kardel
+ * Sun acc cleanup
+ *
+ * Revision 4.1 1998/05/24 08:02:06 kardel
+ * trimmed version log
+ *
+ * Revision 4.0 1998/04/10 19:45:33 kardel
+ * Start 4.0 release version numbering
+ */
+