📄 refclock_parse.c
字号:
*/static intlocal_setcs( struct parseunit *parse, parsectl_t *tcl ){ return parse_setcs(tcl, &parse->parseio);}/*-------------------------------------------------- * local getfmt */static intlocal_getfmt( struct parseunit *parse, parsectl_t *tcl ){ return parse_getfmt(tcl, &parse->parseio);}/*-------------------------------------------------- * local setfmt */static intlocal_setfmt( struct parseunit *parse, parsectl_t *tcl ){ return parse_setfmt(tcl, &parse->parseio);}/*-------------------------------------------------- * local timecode */static intlocal_timecode( struct parseunit *parse, parsectl_t *tcl ){ return parse_timecode(tcl, &parse->parseio);}/*-------------------------------------------------- * local input */static intlocal_input( struct recvbuf *rbufp ){ struct parseunit *parse = (struct parseunit *)((void *)rbufp->recv_srcclock); int count; unsigned char *s; timestamp_t ts; if (!parse->peer) return 0; /* * eat all characters, parsing then and feeding complete samples */ count = rbufp->recv_length; s = (unsigned char *)rbufp->recv_buffer; ts.fp = rbufp->recv_time; while (count--) { if (parse_ioread(&parse->parseio, (unsigned int)(*s++), &ts)) { struct recvbuf buf; /* * got something good to eat */ if (!PARSE_PPS(parse->parseio.parse_dtime.parse_state)) {#ifdef HAVE_PPSAPI if (parse->flags & PARSE_PPSCLOCK) { struct timespec pps_timeout; pps_info_t pps_info; pps_timeout.tv_sec = 0; pps_timeout.tv_nsec = 0; if (time_pps_fetch(parse->ppshandle, PPS_TSFMT_TSPEC, &pps_info, &pps_timeout) == 0) { if (pps_info.assert_sequence + pps_info.clear_sequence != parse->ppsserial) { double dtemp; struct timespec pts; /* * add PPS time stamp if available via ppsclock module * and not supplied already. */ if (parse->flags & PARSE_CLEAR) pts = pps_info.clear_timestamp; else pts = pps_info.assert_timestamp; parse->parseio.parse_dtime.parse_ptime.fp.l_ui = pts.tv_sec + JAN_1970; dtemp = pts.tv_nsec / 1e9; if (dtemp < 0.) { dtemp += 1; parse->parseio.parse_dtime.parse_ptime.fp.l_ui--; } if (dtemp > 1.) { dtemp -= 1; parse->parseio.parse_dtime.parse_ptime.fp.l_ui++; } parse->parseio.parse_dtime.parse_ptime.fp.l_uf = dtemp * FRAC; parse->parseio.parse_dtime.parse_state |= PARSEB_PPS|PARSEB_S_PPS;#ifdef DEBUG if (debug > 3) { printf( "parse: local_receive: fd %d PPSAPI seq %ld - PPS %s\n", rbufp->fd, (long)pps_info.assert_sequence + (long)pps_info.clear_sequence, lfptoa(&parse->parseio.parse_dtime.parse_ptime.fp, 6)); }#endif }#ifdef DEBUG else { if (debug > 3) { printf( "parse: local_receive: fd %d PPSAPI seq assert %ld, seq clear %ld - NO PPS event\n", rbufp->fd, (long)pps_info.assert_sequence, (long)pps_info.clear_sequence); } }#endif parse->ppsserial = pps_info.assert_sequence + pps_info.clear_sequence; }#ifdef DEBUG else { if (debug > 3) { printf( "parse: local_receive: fd %d PPSAPI time_pps_fetch errno = %d\n", rbufp->fd, errno); } }#endif }#else#ifdef TIOCDCDTIMESTAMP struct timeval dcd_time; if (ioctl(rbufp->fd, TIOCDCDTIMESTAMP, &dcd_time) != -1) { l_fp tstmp; TVTOTS(&dcd_time, &tstmp); tstmp.l_ui += JAN_1970; L_SUB(&ts.fp, &tstmp); if (ts.fp.l_ui == 0) {#ifdef DEBUG if (debug) { printf( "parse: local_receive: fd %d DCDTIMESTAMP %s\n", rbufp->fd, lfptoa(&tstmp, 6)); printf(" sigio %s\n", lfptoa(&ts.fp, 6)); }#endif parse->parseio.parse_dtime.parse_ptime.fp = tstmp; parse->parseio.parse_dtime.parse_state |= PARSEB_PPS|PARSEB_S_PPS; } }#else /* TIOCDCDTIMESTAMP */#if defined(HAVE_STRUCT_PPSCLOCKEV) && (defined(HAVE_CIOGETEV) || defined(HAVE_TIOCGPPSEV)) if (parse->flags & PARSE_PPSCLOCK) { l_fp tts; struct ppsclockev ev;#ifdef HAVE_CIOGETEV if (ioctl(parse->generic->io.fd, CIOGETEV, (caddr_t)&ev) == 0)#endif#ifdef HAVE_TIOCGPPSEV if (ioctl(parse->generic->io.fd, TIOCGPPSEV, (caddr_t)&ev) == 0)#endif { if (ev.serial != parse->ppsserial) { /* * add PPS time stamp if available via ppsclock module * and not supplied already. */ if (!buftvtots((const char *)&ev.tv, &tts)) { ERR(ERR_BADDATA) msyslog(LOG_ERR,"parse: local_receive: timestamp conversion error (buftvtots) (ppsclockev.tv)"); } else { parse->parseio.parse_dtime.parse_ptime.fp = tts; parse->parseio.parse_dtime.parse_state |= PARSEB_PPS|PARSEB_S_PPS; } } parse->ppsserial = ev.serial; } }#endif#endif /* TIOCDCDTIMESTAMP */#endif /* HAVE_PPSAPI */ } if (count) { /* simulate receive */ memmove((caddr_t)buf.recv_buffer, (caddr_t)&parse->parseio.parse_dtime, sizeof(parsetime_t)); parse_iodone(&parse->parseio); buf.recv_length = sizeof(parsetime_t); buf.recv_time = rbufp->recv_time; buf.srcadr = rbufp->srcadr; buf.dstadr = rbufp->dstadr; buf.fd = rbufp->fd; buf.next = 0; buf.X_from_where = rbufp->X_from_where; rbufp->receiver(&buf); } else { memmove((caddr_t)rbufp->recv_buffer, (caddr_t)&parse->parseio.parse_dtime, sizeof(parsetime_t)); parse_iodone(&parse->parseio); rbufp->recv_length = sizeof(parsetime_t); return 1; /* got something & in place return */ } } } return 0; /* nothing to pass up */}/*-------------------------------------------------- * local receive */static voidlocal_receive( struct recvbuf *rbufp ){ struct parseunit *parse = (struct parseunit *)((void *)rbufp->recv_srcclock); parsetime_t parsetime; if (!parse->peer) return; if (rbufp->recv_length != sizeof(parsetime_t)) { ERR(ERR_BADIO) msyslog(LOG_ERR,"PARSE receiver #%d: local_receive: bad size (got %d expected %d)", CLK_UNIT(parse->peer), rbufp->recv_length, (int)sizeof(parsetime_t)); parse_event(parse, CEVNT_BADREPLY); return; } clear_err(parse, ERR_BADIO); memmove((caddr_t)&parsetime, (caddr_t)rbufp->recv_buffer, sizeof(parsetime_t));#ifdef DEBUG if (debug > 3) { printf("PARSE receiver #%d: status %06x, state %08x, time(fp) %lx.%08lx, stime(fp) %lx.%08lx, ptime(fp) %lx.%08lx\n", CLK_UNIT(parse->peer), (unsigned int)parsetime.parse_status, (unsigned int)parsetime.parse_state, (unsigned long)parsetime.parse_time.fp.l_ui, (unsigned long)parsetime.parse_time.fp.l_uf, (unsigned long)parsetime.parse_stime.fp.l_ui, (unsigned long)parsetime.parse_stime.fp.l_uf, (unsigned long)parsetime.parse_ptime.fp.l_ui, (unsigned long)parsetime.parse_ptime.fp.l_uf); }#endif parse_process(parse, &parsetime);}/*-------------------------------------------------- * init_iobinding - find and initialize lower layers */static bind_t *init_iobinding( struct parseunit *parse ){ bind_t *b = io_bindings; while (b->bd_description != (char *)0) { if ((*b->bd_init)(parse)) { return b; } b++; } return (bind_t *)0;}/**=========================================================================== ** support routines **//*-------------------------------------------------- * convert a flag field to a string */static char *parsestate( u_long lstate, char *buffer, int size ){ static struct bits { u_long bit; const char *name; } flagstrings[] = { { PARSEB_ANNOUNCE, "DST SWITCH WARNING" }, { PARSEB_POWERUP, "NOT SYNCHRONIZED" }, { PARSEB_NOSYNC, "TIME CODE NOT CONFIRMED" }, { PARSEB_DST, "DST" }, { PARSEB_UTC, "UTC DISPLAY" }, { PARSEB_LEAPADD, "LEAP ADD WARNING" }, { PARSEB_LEAPDEL, "LEAP DELETE WARNING" }, { PARSEB_LEAPSECOND, "LEAP SECOND" }, { PARSEB_ALTERNATE, "ALTERNATE ANTENNA" }, { PARSEB_TIMECODE, "TIME CODE" }, { PARSEB_PPS, "PPS" }, { PARSEB_POSITION, "POSITION" }, { 0 } }; static struct sbits { u_long bit; const char *name; } sflagstrings[] = { { PARSEB_S_LEAP, "LEAP INDICATION" }, { PARSEB_S_PPS, "PPS SIGNAL" }, { PARSEB_S_ANTENNA, "ANTENNA" }, { PARSEB_S_POSITION, "POSITION" }, { 0 } }; int i; char *s, *t; *buffer = '\0'; s = t = buffer; i = 0; while (flagstrings[i].bit) { if (flagstrings[i].bit & lstate) { if (s != t) strncpy(t, "; ", BUFFER_SIZES(buffer, t, size)); strncat(t, flagstrings[i].name, BUFFER_SIZES(buffer, t, size)); t += strlen(t); } i++; } if (lstate & (PARSEB_S_LEAP|PARSEB_S_ANTENNA|PARSEB_S_PPS|PARSEB_S_POSITION)) { if (s != t) strncpy(t, "; ", BUFFER_SIZES(buffer, t, size)); t += strlen(t); strncpy(t, "(", BUFFER_SIZES(buffer, t, size)); s = t = t + strlen(t); i = 0; while (sflagstrings[i].bit) { if (sflagstrings[i].bit & lstate) { if (t != s) { strncpy(t, "; ", BUFFER_SIZES(buffer, t, size)); t += 2; } strncpy(t, sflagstrings[i].name, BUFFER_SIZES(buffer, t, size)); t += strlen(t); } i++; } strncpy(t, ")", BUFFER_SIZES(buffer, t, size)); } return buffer;}/*-------------------------------------------------- * convert a status flag field to a string */static char *parsestatus( u_long lstate, char *buffer, int size ){ static struct bits { u_long bit; const char *name; } flagstrings[] = { { CVT_OK, "CONVERSION SUCCESSFUL" }, { CVT_NONE, "NO CONVERSION" }, { CVT_FAIL, "CONVERSION FAILED" }, { CVT_BADFMT, "ILLEGAL FORMAT" }, { CVT_BADDATE, "DATE ILLEGAL" }, { CVT_BADTIME, "TIME ILLEGAL" }, { CVT_ADDITIONAL, "ADDITIONAL DATA" }, { 0 } }; int i; *buffer = '\0'; i = 0; while (flagstrings[i].bit) { if (flagstrings[i].bit & lstate) { if (buffer[0]) strncat(buffer, "; ", size); strncat(buffer, flagstrings[i].name, size); } i++; } return buffer;}/*-------------------------------------------------- * convert a clock status flag field to a string */static const char *clockstatus( u_long lstate ){ static char buffer[20]; static struct status { u_long value; const char *name; } flagstrings[] = { { CEVNT_NOMINAL, "NOMINAL" }, { CEVNT_TIMEOUT, "NO RESPONSE" }, { CEVNT_BADREPLY,"BAD FORMAT" }, { CEVNT_FAULT, "FAULT" }, { CEVNT_PROP, "PROPAGATION DELAY" }, { CEVNT_BADDATE, "ILLEGAL DAT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -