📄 refclock_parse.c
字号:
DCF_TYPE, WSDCF_MAXUNSYNC, WSDCF_SPEED, WSDCF_CFLAG, WSDCF_IFLAG, WSDCF_OFLAG, WSDCF_LFLAG, WSDCF_SAMPLES, WSDCF_KEEP }, { /* mode 5 */ RAWDCF_FLAGS, NO_POLL, RAWDCF_INIT, NO_EVENT, NO_END, NO_MESSAGE, NO_LCLDATA, RAWDCF_ROOTDELAY, CONRAD_BASEDELAY, DCF_A_ID, CONRAD_DESCRIPTION, RAWDCF_FORMAT, DCF_TYPE, RAWDCF_MAXUNSYNC, RAWDCF_SPEED, RAWDCF_CFLAG, RAWDCF_IFLAG, RAWDCF_OFLAG, RAWDCF_LFLAG, RAWDCF_SAMPLES, RAWDCF_KEEP }, { /* mode 6 */ RAWDCF_FLAGS, NO_POLL, RAWDCF_INIT, NO_EVENT, NO_END, NO_MESSAGE, NO_LCLDATA, RAWDCF_ROOTDELAY, TIMEBRICK_BASEDELAY, DCF_A_ID, TIMEBRICK_DESCRIPTION, RAWDCF_FORMAT, DCF_TYPE, RAWDCF_MAXUNSYNC, RAWDCF_SPEED, RAWDCF_CFLAG, RAWDCF_IFLAG, RAWDCF_OFLAG, RAWDCF_LFLAG, RAWDCF_SAMPLES, RAWDCF_KEEP }, { /* mode 7 */ MBG_FLAGS, GPS16X_POLL, GPS16X_INIT, NO_EVENT, GPS16X_END, GPS16X_MESSAGE, GPS16X_DATA, GPS16X_ROOTDELAY, GPS16X_BASEDELAY, GPS16X_ID, GPS16X_DESCRIPTION, GPS16X_FORMAT, GPS_TYPE, GPS16X_MAXUNSYNC, GPS16X_SPEED, GPS16X_CFLAG, GPS16X_IFLAG, GPS16X_OFLAG, GPS16X_LFLAG, GPS16X_SAMPLES, GPS16X_KEEP }, { /* mode 8 */ RAWDCF_FLAGS, NO_POLL, NO_INIT, NO_EVENT, NO_END, NO_MESSAGE, NO_LCLDATA, RAWDCF_ROOTDELAY, IGELCLOCK_BASEDELAY, DCF_A_ID, IGELCLOCK_DESCRIPTION, RAWDCF_FORMAT, DCF_TYPE, RAWDCF_MAXUNSYNC, IGELCLOCK_SPEED, IGELCLOCK_CFLAG, RAWDCF_IFLAG, RAWDCF_OFLAG, RAWDCF_LFLAG, RAWDCF_SAMPLES, RAWDCF_KEEP }, { /* mode 9 */ TRIMBLETAIP_FLAGS,#if TRIM_POLLRATE /* DHD940515: Allow user config */ NO_POLL,#else TRIMBLETAIP_POLL,#endif TRIMBLETAIP_INIT, TRIMBLETAIP_EVENT, TRIMBLETAIP_END, NO_MESSAGE, TRIMBLETAIP_DATA, TRIMBLETAIP_ROOTDELAY, TRIMBLETAIP_BASEDELAY, TRIMBLETAIP_ID, TRIMBLETAIP_DESCRIPTION, TRIMBLETAIP_FORMAT, GPS_TYPE, TRIMBLETAIP_MAXUNSYNC, TRIMBLETAIP_SPEED, TRIMBLETAIP_CFLAG, TRIMBLETAIP_IFLAG, TRIMBLETAIP_OFLAG, TRIMBLETAIP_LFLAG, TRIMBLETAIP_SAMPLES, TRIMBLETAIP_KEEP }, { /* mode 10 */ TRIMBLETSIP_FLAGS,#if TRIM_POLLRATE /* DHD940515: Allow user config */ NO_POLL,#else TRIMBLETSIP_POLL,#endif TRIMBLETSIP_INIT, TRIMBLETSIP_EVENT, TRIMBLETSIP_END, TRIMBLETSIP_MESSAGE, TRIMBLETSIP_DATA, TRIMBLETSIP_ROOTDELAY, TRIMBLETSIP_BASEDELAY, TRIMBLETSIP_ID, TRIMBLETSIP_DESCRIPTION, TRIMBLETSIP_FORMAT, GPS_TYPE, TRIMBLETSIP_MAXUNSYNC, TRIMBLETSIP_SPEED, TRIMBLETSIP_CFLAG, TRIMBLETSIP_IFLAG, TRIMBLETSIP_OFLAG, TRIMBLETSIP_LFLAG, TRIMBLETSIP_SAMPLES, TRIMBLETSIP_KEEP }, { /* mode 11 */ NO_CL_FLAGS, RCC8000_POLL, RCC8000_INIT, NO_EVENT, RCC8000_END, NO_MESSAGE, RCC8000_DATA, RCC8000_ROOTDELAY, RCC8000_BASEDELAY, RCC8000_ID, RCC8000_DESCRIPTION, RCC8000_FORMAT, DCF_TYPE, RCC8000_MAXUNSYNC, RCC8000_SPEED, RCC8000_CFLAG, RCC8000_IFLAG, RCC8000_OFLAG, RCC8000_LFLAG, RCC8000_SAMPLES, RCC8000_KEEP }, { /* mode 12 */ HOPF6021_FLAGS, NO_POLL, NO_INIT, NO_EVENT, NO_END, NO_MESSAGE, NO_LCLDATA, HOPF6021_ROOTDELAY, HOPF6021_BASEDELAY, DCF_ID, HOPF6021_DESCRIPTION, HOPF6021_FORMAT, DCF_TYPE, HOPF6021_MAXUNSYNC, HOPF6021_SPEED, HOPF6021_CFLAG, HOPF6021_IFLAG, HOPF6021_OFLAG, HOPF6021_LFLAG, HOPF6021_SAMPLES, HOPF6021_KEEP }, { /* mode 13 */ COMPUTIME_FLAGS, NO_POLL, NO_INIT, NO_EVENT, NO_END, NO_MESSAGE, NO_LCLDATA, COMPUTIME_ROOTDELAY, COMPUTIME_BASEDELAY, COMPUTIME_ID, COMPUTIME_DESCRIPTION, COMPUTIME_FORMAT, COMPUTIME_TYPE, COMPUTIME_MAXUNSYNC, COMPUTIME_SPEED, COMPUTIME_CFLAG, COMPUTIME_IFLAG, COMPUTIME_OFLAG, COMPUTIME_LFLAG, COMPUTIME_SAMPLES, COMPUTIME_KEEP }, { /* mode 14 */ RAWDCF_FLAGS, NO_POLL, RAWDCFDTRSET_INIT, NO_EVENT, NO_END, NO_MESSAGE, NO_LCLDATA, RAWDCF_ROOTDELAY, RAWDCF_BASEDELAY, DCF_A_ID, RAWDCFDTRSET_DESCRIPTION, RAWDCF_FORMAT, DCF_TYPE, RAWDCF_MAXUNSYNC, RAWDCF_SPEED, RAWDCF_CFLAG, RAWDCF_IFLAG, RAWDCF_OFLAG, RAWDCF_LFLAG, RAWDCF_SAMPLES, RAWDCF_KEEP }, { /* mode 15 */ 0, /* operation flags (io modes) */ NO_POLL, /* active poll routine */ NO_INIT, /* active poll init routine */ NO_EVENT, /* special event handling (e.g. reset clock) */ NO_END, /* active poll end routine */ NO_MESSAGE, /* process a lower layer message */ NO_LCLDATA, /* local data area for "poll" mechanism */ 0, /* rootdelay */ 11.0 /* bits */ / 9600, /* current offset by which the RS232 time code is delayed from the actual time */ DCF_ID, /* ID code */ "WHARTON 400A Series clock", /* device name */ "WHARTON 400A Series clock Output Format 1", /* fixed format */ /* Must match a format-name in a libparse/clk_xxx.c file */ DCF_TYPE, /* clock type (ntp control) */ (1*60*60), /* time to trust oscillator after losing synch */ B9600, /* terminal input & output baudrate */ (CS8|CREAD|PARENB|CLOCAL|HUPCL),/* terminal control flags */ 0, /* terminal input flags */ 0, /* terminal output flags */ 0, /* terminal local flags */ 5, /* samples for median filter */ 3, /* samples for median filter to keep */ }, { /* mode 16 - RAWDCF RTS set, DTR clr */ RAWDCF_FLAGS, NO_POLL, RAWDCFDTRCLRRTSSET_INIT, NO_EVENT, NO_END, NO_MESSAGE, NO_LCLDATA, RAWDCF_ROOTDELAY, RAWDCF_BASEDELAY, DCF_A_ID, RAWDCFDTRCLRRTSSET_DESCRIPTION, RAWDCF_FORMAT, DCF_TYPE, RAWDCF_MAXUNSYNC, RAWDCF_SPEED, RAWDCF_CFLAG, RAWDCF_IFLAG, RAWDCF_OFLAG, RAWDCF_LFLAG, RAWDCF_SAMPLES, RAWDCF_KEEP }, { /* mode 17 */ VARITEXT_FLAGS, NO_POLL, NO_INIT, NO_EVENT, NO_END, NO_MESSAGE, NO_LCLDATA, VARITEXT_ROOTDELAY, VARITEXT_BASEDELAY, VARITEXT_ID, VARITEXT_DESCRIPTION, VARITEXT_FORMAT, VARITEXT_TYPE, VARITEXT_MAXUNSYNC, VARITEXT_SPEED, VARITEXT_CFLAG, VARITEXT_IFLAG, VARITEXT_OFLAG, VARITEXT_LFLAG, VARITEXT_SAMPLES, VARITEXT_KEEP }, { /* mode 18 */ MBG_FLAGS, NO_POLL, NO_INIT, NO_EVENT, GPS16X_END, GPS16X_MESSAGE, GPS16X_DATA, GPS16X_ROOTDELAY, GPS16X_BASEDELAY, GPS16X_ID, GPS16X_DESCRIPTION, GPS16X_FORMAT, GPS_TYPE, GPS16X_MAXUNSYNC, GPS16X_SPEED, GPS16X_CFLAG, GPS16X_IFLAG, GPS16X_OFLAG, GPS16X_LFLAG, GPS16X_SAMPLES, GPS16X_KEEP },};static int ncltypes = sizeof(parse_clockinfo) / sizeof(struct parse_clockinfo);#define CLK_REALTYPE(x) ((int)(((x)->ttl) & 0x7F))#define CLK_TYPE(x) ((CLK_REALTYPE(x) >= ncltypes) ? ~0 : CLK_REALTYPE(x))#define CLK_UNIT(x) ((int)REFCLOCKUNIT(&(x)->srcadr))#define CLK_PPS(x) (((x)->ttl) & 0x80)/* * Other constant stuff */#define PARSEHSREFID 0x7f7f08ff /* 127.127.8.255 refid for hi strata */#define PARSESTATISTICS (60*60) /* output state statistics every hour */static int notice = 0;#define PARSE_STATETIME(parse, i) ((parse->generic->currentstatus == i) ? parse->statetime[i] + current_time - parse->lastchange : parse->statetime[i])static void parse_event P((struct parseunit *, int));static void parse_process P((struct parseunit *, parsetime_t *));static void clear_err P((struct parseunit *, u_long));static int list_err P((struct parseunit *, u_long));static char * l_mktime P((u_long));/**=========================================================================== ** implementation error message regression module **/static voidclear_err( struct parseunit *parse, u_long lstate ){ if (lstate == ERR_ALL) { int i; for (i = 0; i < ERR_CNT; i++) { parse->errors[i].err_stage = err_tbl[i]; parse->errors[i].err_cnt = 0; parse->errors[i].err_last = 0; parse->errors[i].err_started = 0; parse->errors[i].err_suppressed = 0; } } else { parse->errors[lstate].err_stage = err_tbl[lstate]; parse->errors[lstate].err_cnt = 0; parse->errors[lstate].err_last = 0; parse->errors[lstate].err_started = 0; parse->errors[lstate].err_suppressed = 0; }}static intlist_err( struct parseunit *parse, u_long lstate ){ int do_it; struct errorinfo *err = &parse->errors[lstate]; if (err->err_started == 0) { err->err_started = current_time; } do_it = (current_time - err->err_last) >= err->err_stage->err_delay; if (do_it) err->err_cnt++; if (err->err_stage->err_count && (err->err_cnt >= err->err_stage->err_count)) { err->err_stage++; err->err_cnt = 0; } if (!err->err_cnt && do_it) msyslog(LOG_INFO, "PARSE receiver #%d: interval for following error message class is at least %s", CLK_UNIT(parse->peer), l_mktime(err->err_stage->err_delay)); if (!do_it) err->err_suppressed++; else err->err_last = current_time; if (do_it && err->err_suppressed) { msyslog(LOG_INFO, "PARSE receiver #%d: %ld message%s suppressed, error condition class persists for %s", CLK_UNIT(parse->peer), err->err_suppressed, (err->err_suppressed == 1) ? " was" : "s where", l_mktime(current_time - err->err_started)); err->err_suppressed = 0; } return do_it;}/*-------------------------------------------------- * mkreadable - make a printable ascii string (without * embedded quotes so that the ntpq protocol isn't * fooled */#ifndef isprint#define isprint(_X_) (((_X_) > 0x1F) && ((_X_) < 0x7F))#endifstatic char *mkreadable( char *buffer, long blen, const char *src, u_long srclen, int hex ){ char *b = buffer; char *endb = (char *)0; if (blen < 4) return (char *)0; /* don't bother with mini buffers */ endb = buffer + blen - 4; blen--; /* account for '\0' */ while (blen && srclen--) { if (!hex && /* no binary only */ (*src != '\\') && /* no plain \ */ (*src != '"') && /* no " */ isprint((int)*src)) /* only printables */ { /* they are easy... */ *buffer++ = *src++; blen--; } else { if (blen < 4)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -