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