Lines Matching +full:- +full:- +full:format
2 …* /src/NTP/REPOSITORY/ntp4-dev/libparse/clk_meinberg.c,v 4.12.2.1 2005/09/25 10:22:35 kardel RELEA…
8 * Copyright (c) 1995-2015 by Frank Kardel <kardel <AT> ntp.org>
9 …* Copyright (c) 1989-1994 by Frank Kardel, Friedrich-Alexander Universitaet Erlangen-Nuernberg, Ge…
67 * (Standard Format)
90 * Extended data format (PZFUERL for PZF type clocks)
113 * For very old devices you must get the Uni-Erlangen firmware for the GPS receiver support
115 * With newer GPS receiver types the Uni Erlangen string format can be configured at the device.
117 …* <STX><dd>.<mm>.<yy>; <w>; <hh>:<mm>:<ss>; <+/-><00:00>; <U><S><F><D><A><L><R><L>; <position.…
129 * <+/->,<00:00> = offset to UTC
144 /*--------------------------------------------------------------*/
152 /* Output: -- */
155 /*+-------------------------------------------------------------*/
179 headerp->cmd = (GPS_CMD) get_lsb_short(bufpp); in get_mbg_header()
180 headerp->len = get_lsb_uint16(bufpp); in get_mbg_header()
181 headerp->data_csum = (CSUM) get_lsb_short(bufpp); in get_mbg_header()
182 headerp->hdr_csum = (CSUM) get_lsb_short(bufpp); in get_mbg_header()
185 static struct format meinberg_fmt[] =
196 { /* special extended FAU Erlangen extended format */
205 { /* special extended FAU Erlangen GPS format */
240 "Meinberg Standard", /* Meinberg simple format - beware */
249 "Meinberg Extended", /* Meinberg enhanced format */
258 "Meinberg GPS Extended", /* Meinberg FAU GPS format */
267 * convert simple type format
273 struct format *unused, in cvt_meinberg()
278 struct format *format; in cvt_meinberg() local
281 * select automagically correct data format in cvt_meinberg()
285 format = &meinberg_fmt[0]; in cvt_meinberg()
291 format = &meinberg_fmt[1]; in cvt_meinberg()
302 if (Stoi(&buffer[format->field_offsets[O_DAY].offset], &clock_time->day, in cvt_meinberg()
303 format->field_offsets[O_DAY].length) || in cvt_meinberg()
304 Stoi(&buffer[format->field_offsets[O_MONTH].offset], &clock_time->month, in cvt_meinberg()
305 format->field_offsets[O_MONTH].length) || in cvt_meinberg()
306 Stoi(&buffer[format->field_offsets[O_YEAR].offset], &clock_time->year, in cvt_meinberg()
307 format->field_offsets[O_YEAR].length) || in cvt_meinberg()
308 Stoi(&buffer[format->field_offsets[O_HOUR].offset], &clock_time->hour, in cvt_meinberg()
309 format->field_offsets[O_HOUR].length) || in cvt_meinberg()
310 Stoi(&buffer[format->field_offsets[O_MIN].offset], &clock_time->minute, in cvt_meinberg()
311 format->field_offsets[O_MIN].length) || in cvt_meinberg()
312 Stoi(&buffer[format->field_offsets[O_SEC].offset], &clock_time->second, in cvt_meinberg()
313 format->field_offsets[O_SEC].length)) in cvt_meinberg()
319 unsigned char *f = &buffer[format->field_offsets[O_FLAGS].offset]; in cvt_meinberg()
321 clock_time->usecond = 0; in cvt_meinberg()
322 clock_time->flags = PARSEB_S_LEAP; in cvt_meinberg()
324 if (clock_time->second == 60) in cvt_meinberg()
325 clock_time->flags |= PARSEB_LEAPSECOND; in cvt_meinberg()
328 * in the extended timecode format we have also the in cvt_meinberg()
334 if ((format->flags & MBG_EXTENDED) && (f[-1] == 'U')) in cvt_meinberg()
339 clock_time->utcoffset = 0; /* UTC */ in cvt_meinberg()
340 clock_time->flags |= PARSEB_UTC; in cvt_meinberg()
346 * or we have the old time code format, where we do not in cvt_meinberg()
349 * ROMS !!!! The new ROMS have 'U' at the ZONE field - good. in cvt_meinberg()
351 switch (buffer[format->field_offsets[O_ZONE].offset]) in cvt_meinberg()
354 clock_time->utcoffset = -1*60*60; /* MET */ in cvt_meinberg()
358 clock_time->utcoffset = -2*60*60; /* MED */ in cvt_meinberg()
365 clock_time->utcoffset = 0; /* UTC */ in cvt_meinberg()
366 clock_time->flags |= PARSEB_UTC; in cvt_meinberg()
377 if (buffer[format->field_offsets[O_ZONE].offset] == 'S') in cvt_meinberg()
378 clock_time->flags |= PARSEB_DST; in cvt_meinberg()
381 clock_time->flags |= PARSEB_POWERUP; in cvt_meinberg()
384 clock_time->flags |= PARSEB_NOSYNC; in cvt_meinberg()
387 clock_time->flags |= PARSEB_ANNOUNCE; in cvt_meinberg()
391 * 'a' code not confirmed - earth is not in cvt_meinberg()
395 clock_time->flags |= PARSEB_LEAPADD; in cvt_meinberg()
398 clock_time->flags |= PARSEB_LEAPDEL; in cvt_meinberg()
401 if (format->flags & MBG_EXTENDED) in cvt_meinberg()
403 clock_time->flags |= PARSEB_S_CALLBIT; in cvt_meinberg()
406 * DCF77 does not encode the direction - in cvt_meinberg()
407 * so we take the current default - in cvt_meinberg()
410 clock_time->flags &= ~PARSEB_LEAPDEL; in cvt_meinberg()
413 clock_time->flags |= PARSEB_LEAPADD; in cvt_meinberg()
416 clock_time->flags |= PARSEB_CALLBIT; in cvt_meinberg()
444 parseio->parse_index = 1; in mbg_input()
445 parseio->parse_data[0] = ch; in mbg_input()
446 parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */ in mbg_input()
465 * convert Meinberg GPS format
471 struct format *format, in cvt_mgps() argument
476 if (!Strok(buffer, format->fixed_string)) in cvt_mgps()
478 return cvt_meinberg(buffer, size, format, clock_time, local); in cvt_mgps()
482 if (Stoi(&buffer[format->field_offsets[O_DAY].offset], &clock_time->day, in cvt_mgps()
483 format->field_offsets[O_DAY].length) || in cvt_mgps()
484 Stoi(&buffer[format->field_offsets[O_MONTH].offset], &clock_time->month, in cvt_mgps()
485 format->field_offsets[O_MONTH].length) || in cvt_mgps()
486 Stoi(&buffer[format->field_offsets[O_YEAR].offset], &clock_time->year, in cvt_mgps()
487 format->field_offsets[O_YEAR].length) || in cvt_mgps()
488 Stoi(&buffer[format->field_offsets[O_HOUR].offset], &clock_time->hour, in cvt_mgps()
489 format->field_offsets[O_HOUR].length) || in cvt_mgps()
490 Stoi(&buffer[format->field_offsets[O_MIN].offset], &clock_time->minute, in cvt_mgps()
491 format->field_offsets[O_MIN].length) || in cvt_mgps()
492 Stoi(&buffer[format->field_offsets[O_SEC].offset], &clock_time->second, in cvt_mgps()
493 format->field_offsets[O_SEC].length)) in cvt_mgps()
500 unsigned char *f = &buffer[format->field_offsets[O_FLAGS].offset]; in cvt_mgps()
502 clock_time->flags = PARSEB_S_LEAP|PARSEB_S_POSITION; in cvt_mgps()
504 clock_time->usecond = 0; in cvt_mgps()
509 if (Stoi(&buffer[format->field_offsets[O_UTCHOFFSET].offset], &h, in cvt_mgps()
510 format->field_offsets[O_UTCHOFFSET].length)) in cvt_mgps()
516 if (Stoi(&buffer[format->field_offsets[O_UTCMOFFSET].offset], &clock_time->utcoffset, in cvt_mgps()
517 format->field_offsets[O_UTCMOFFSET].length)) in cvt_mgps()
522 clock_time->utcoffset += TIMES60(h); in cvt_mgps()
523 clock_time->utcoffset = TIMES60(clock_time->utcoffset); in cvt_mgps()
525 if (buffer[format->field_offsets[O_UTCSOFFSET].offset] != '-') in cvt_mgps()
527 clock_time->utcoffset = -clock_time->utcoffset; in cvt_mgps()
534 if (buffer[format->field_offsets[O_ZONE].offset] == 'S') in cvt_mgps()
535 clock_time->flags |= PARSEB_DST; in cvt_mgps()
537 if (clock_time->utcoffset == 0) in cvt_mgps()
538 clock_time->flags |= PARSEB_UTC; in cvt_mgps()
541 * no sv's seen - no time & position in cvt_mgps()
544 clock_time->flags |= PARSEB_POWERUP; in cvt_mgps()
547 * at least one sv seen - time (for last position) in cvt_mgps()
550 clock_time->flags |= PARSEB_NOSYNC; in cvt_mgps()
552 if (!(clock_time->flags & PARSEB_POWERUP)) in cvt_mgps()
553 clock_time->flags |= PARSEB_POSITION; in cvt_mgps()
559 clock_time->flags |= PARSEB_ANNOUNCE; in cvt_mgps()
563 * 'a' code not confirmed - earth is not in cvt_mgps()
567 clock_time->flags |= PARSEB_LEAPADD; in cvt_mgps()
570 clock_time->flags |= PARSEB_LEAPDEL; in cvt_mgps()
579 if ((f[6] == 'L') || (clock_time->second == 60)) in cvt_mgps()
580 clock_time->flags |= PARSEB_LEAPSECOND; in cvt_mgps()
603 msg_buf = (struct msg_buf *)parseio->parse_pdata; in gps_input()
610 if ( msg_buf->phase == MBG_NONE ) in gps_input()
617 msg_buf->len = sizeof( header ); /* prepare to receive msg header */ in gps_input()
618 msg_buf->phase = MBG_HEADER; /* receiving header */ in gps_input()
624 msg_buf->len = 0; in gps_input()
625 msg_buf->phase = MBG_STRING; /* prepare to receive ASCII ETX delimited message */ in gps_input()
626 parseio->parse_index = 1; in gps_input()
627 parseio->parse_data[0] = ch; in gps_input()
634 parseio->parse_dtime.parse_msglen = 1; /* reset buffer pointer */ in gps_input()
635 parseio->parse_dtime.parse_msg[0] = ch; /* fill in first character */ in gps_input()
636 parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */ in gps_input()
643 if ((msg_buf->phase == MBG_STRING) && in gps_input()
644 (parseio->parse_index < parseio->parse_dsize)) in gps_input()
645 parseio->parse_data[parseio->parse_index++] = ch; in gps_input()
647 parseio->parse_dtime.parse_msg[parseio->parse_dtime.parse_msglen++] = ch; in gps_input()
649 if (parseio->parse_dtime.parse_msglen > sizeof(parseio->parse_dtime.parse_msg)) in gps_input()
651 msg_buf->phase = MBG_NONE; /* buffer overflow - discard */ in gps_input()
652 parseio->parse_data[parseio->parse_index] = '\0'; in gps_input()
653 memcpy(parseio->parse_ldata, parseio->parse_data, (unsigned)(parseio->parse_index+1)); in gps_input()
654 parseio->parse_ldsize = parseio->parse_index; in gps_input()
658 switch (msg_buf->phase) in gps_input()
662 msg_buf->len--; in gps_input()
664 if ( msg_buf->len ) /* transfer not complete */ in gps_input()
667 …parseprintf(DD_PARSE, ("gps_input: %s complete\n", (msg_buf->phase == MBG_DATA) ? "data" : "header… in gps_input()
672 if ((ch == ETX) || (parseio->parse_index >= parseio->parse_dsize)) in gps_input()
674 msg_buf->phase = MBG_NONE; in gps_input()
676 parseio->parse_data[parseio->parse_index] = '\0'; in gps_input()
677 memcpy(parseio->parse_ldata, parseio->parse_data, (unsigned)(parseio->parse_index+1)); in gps_input()
678 parseio->parse_ldsize = parseio->parse_index; in gps_input()
679 parseio->parse_index = 0; in gps_input()
690 if ( msg_buf->phase == MBG_HEADER ) in gps_input()
692 unsigned char *datap = parseio->parse_dtime.parse_msg + 1; in gps_input()
701 … calc_csum = mbg_csum( (unsigned char *) parseio->parse_dtime.parse_msg + 1, (unsigned short)6 ); in gps_input()
706 …(int)calc_csum, (int)mbg_csum( (unsigned char *) parseio->parse_dtime.parse_msg, (unsigned short)6… in gps_input()
708 msg_buf->phase = MBG_NONE; /* back to hunting mode */ in gps_input()
709 return PARSE_INP_DATA; /* invalid header checksum received - pass up for detection */ in gps_input()
713 …(header.len >= (sizeof (parseio->parse_dtime.parse_msg) - sizeof(header) - 1))) /* blows anything … in gps_input()
715 msg_buf->phase = MBG_NONE; /* back to hunting mode */ in gps_input()
721 msg_buf->len = header.len;/* save number of bytes to wait for */ in gps_input()
722 msg_buf->phase = MBG_DATA; /* flag header already complete */ in gps_input()
731 msg_buf->phase = MBG_NONE; /* back to hunting mode */ in gps_input()
779 * from V3 3.23 - log info deleted 1998/04/11 kardel