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 P((unsigned char **, char *)); 50 static void mbg_time_status_str P((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 539