Annotation of embedaddon/ntp/libparse/data_mbg.c, revision 1.1.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>