File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / libparse / data_mbg.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years, 1 month ago) by misho
CVS tags: MAIN, HEAD
Initial revision

    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>