📄 refclock_parse.c
字号:
/* * Meinberg DCF PZF535/TCXO (FM/PZF) receiver */#define DCFPZF535_ROOTDELAY 0.0#define DCFPZF535_BASEDELAY 0.001968 /* 1.968ms +- 104us (oscilloscope) - relative to start (end of STX) */#define DCFPZF535_DESCRIPTION "Meinberg DCF PZF 535/509 / TCXO"#define DCFPZF535_MAXUNSYNC 60*60*12 /* only trust clock for 12 hours * @ 5e-8df/f we have accumulated * at most 2.16 ms (thus we move to * NTP synchronisation */#define DCFPZF535_SPEED MBG_SPEED#define DCFPZF535_CFLAG MBG_CFLAG#define DCFPZF535_IFLAG MBG_IFLAG#define DCFPZF535_OFLAG MBG_OFLAG#define DCFPZF535_LFLAG MBG_LFLAG#define DCFPZF535_SAMPLES 5#define DCFPZF535_KEEP 3#define DCFPZF535_FORMAT "Meinberg Standard"/* * Meinberg DCF PZF535/OCXO receiver */#define DCFPZF535OCXO_ROOTDELAY 0.0#define DCFPZF535OCXO_BASEDELAY 0.001968 /* 1.968ms +- 104us (oscilloscope) - relative to start (end of STX) */#define DCFPZF535OCXO_DESCRIPTION "Meinberg DCF PZF 535/509 / OCXO"#define DCFPZF535OCXO_MAXUNSYNC 60*60*96 /* only trust clock for 4 days * @ 5e-9df/f we have accumulated * at most an error of 1.73 ms * (thus we move to NTP synchronisation) */#define DCFPZF535OCXO_SPEED MBG_SPEED#define DCFPZF535OCXO_CFLAG MBG_CFLAG#define DCFPZF535OCXO_IFLAG MBG_IFLAG#define DCFPZF535OCXO_OFLAG MBG_OFLAG#define DCFPZF535OCXO_LFLAG MBG_LFLAG#define DCFPZF535OCXO_SAMPLES 5#define DCFPZF535OCXO_KEEP 3#define DCFPZF535OCXO_FORMAT "Meinberg Standard"/* * Meinberg GPS16X receiver */static void gps16x_message P((struct parseunit *, parsetime_t *));static int gps16x_poll_init P((struct parseunit *));#define GPS16X_ROOTDELAY 0.0 /* nothing here */#define GPS16X_BASEDELAY 0.001968 /* XXX to be fixed ! 1.968ms +- 104us (oscilloscope) - relative to start (end of STX) */#define GPS16X_DESCRIPTION "Meinberg GPS16x receiver"#define GPS16X_MAXUNSYNC 60*60*96 /* only trust clock for 4 days * @ 5e-9df/f we have accumulated * at most an error of 1.73 ms * (thus we move to NTP synchronisation) */#define GPS16X_SPEED B19200#define GPS16X_CFLAG (CS8|CREAD|CLOCAL|HUPCL)#define GPS16X_IFLAG (IGNBRK|IGNPAR)#define GPS16X_OFLAG MBG_OFLAG#define GPS16X_LFLAG MBG_LFLAG#define GPS16X_POLLRATE 6#define GPS16X_POLLCMD ""#define GPS16X_CMDSIZE 0static poll_info_t gps16x_pollinfo = { GPS16X_POLLRATE, GPS16X_POLLCMD, GPS16X_CMDSIZE };#define GPS16X_INIT gps16x_poll_init#define GPS16X_POLL 0#define GPS16X_END 0#define GPS16X_DATA ((void *)(&gps16x_pollinfo))#define GPS16X_MESSAGE gps16x_message#define GPS16X_ID GPS_ID#define GPS16X_FORMAT "Meinberg GPS Extended"#define GPS16X_SAMPLES 5#define GPS16X_KEEP 3/* * ELV DCF7000 Wallclock-Receiver/Switching Clock (Kit) * * This is really not the hottest clock - but before you have nothing ... */#define DCF7000_ROOTDELAY 0.0 /* 0 */#define DCF7000_BASEDELAY 0.405 /* slow blow */#define DCF7000_DESCRIPTION "ELV DCF7000"#define DCF7000_MAXUNSYNC (60*5) /* sorry - but it just was not build as a clock */#define DCF7000_SPEED (B9600)#define DCF7000_CFLAG (CS8|CREAD|PARENB|PARODD|CLOCAL|HUPCL)#define DCF7000_IFLAG (IGNBRK)#define DCF7000_OFLAG 0#define DCF7000_LFLAG 0#define DCF7000_SAMPLES 5#define DCF7000_KEEP 3#define DCF7000_FORMAT "ELV DCF7000"/* * Schmid DCF Receiver Kit * * When the WSDCF clock is operating optimally we want the primary clock * distance to come out at 300 ms. Thus, peer.distance in the WSDCF peer * structure is set to 290 ms and we compute delays which are at least * 10 ms long. The following are 290 ms and 10 ms expressed in u_fp format */#define WS_POLLRATE 1 /* every second - watch interdependency with poll routine */#define WS_POLLCMD "\163"#define WS_CMDSIZE 1static poll_info_t wsdcf_pollinfo = { WS_POLLRATE, WS_POLLCMD, WS_CMDSIZE };#define WSDCF_INIT poll_init#define WSDCF_POLL poll_dpoll#define WSDCF_END 0#define WSDCF_DATA ((void *)(&wsdcf_pollinfo))#define WSDCF_ROOTDELAY 0.0 /* 0 */#define WSDCF_BASEDELAY 0.010 /* ~ 10ms */#define WSDCF_DESCRIPTION "WS/DCF Receiver"#define WSDCF_FORMAT "Schmid"#define WSDCF_MAXUNSYNC (60*60) /* assume this beast hold at 1 h better than 2 ms XXX-must verify */#define WSDCF_SPEED (B1200)#define WSDCF_CFLAG (CS8|CREAD|CLOCAL)#define WSDCF_IFLAG 0#define WSDCF_OFLAG 0#define WSDCF_LFLAG 0#define WSDCF_SAMPLES 5#define WSDCF_KEEP 3/* * RAW DCF77 - input of DCF marks via RS232 - many variants */#define RAWDCF_FLAGS 0#define RAWDCF_ROOTDELAY 0.0 /* 0 */#define RAWDCF_BASEDELAY 0.258#define RAWDCF_FORMAT "RAW DCF77 Timecode"#define RAWDCF_MAXUNSYNC (0) /* sorry - its a true receiver - no signal - no time */#define RAWDCF_SPEED (B50)#ifdef NO_PARENB_IGNPAR /* Was: defined(SYS_IRIX4) || defined(SYS_IRIX5) *//* somehow doesn't grok PARENB & IGNPAR (mj) */# define RAWDCF_CFLAG (CS8|CREAD|CLOCAL)#else# define RAWDCF_CFLAG (CS8|CREAD|CLOCAL|PARENB)#endif#ifdef RAWDCF_NO_IGNPAR /* Was: defined(SYS_LINUX) && defined(CLOCK_RAWDCF) */# define RAWDCF_IFLAG 0#else# define RAWDCF_IFLAG (IGNPAR)#endif#define RAWDCF_OFLAG 0#define RAWDCF_LFLAG 0#define RAWDCF_SAMPLES 20#define RAWDCF_KEEP 12#define RAWDCF_INIT 0/* * RAW DCF variants *//* * Conrad receiver * * simplest (cheapest) DCF clock - e. g. DCF77 receiver by Conrad * (~40DM - roughly $30 ) followed by a level converter for RS232 */#define CONRAD_BASEDELAY 0.292 /* Conrad receiver @ 50 Baud on a Sun */#define CONRAD_DESCRIPTION "RAW DCF77 CODE (Conrad DCF77 receiver module)"/* * TimeBrick receiver */#define TIMEBRICK_BASEDELAY 0.210 /* TimeBrick @ 50 Baud on a Sun */#define TIMEBRICK_DESCRIPTION "RAW DCF77 CODE (TimeBrick)"/* * IGEL:clock receiver */#define IGELCLOCK_BASEDELAY 0.258 /* IGEL:clock receiver */#define IGELCLOCK_DESCRIPTION "RAW DCF77 CODE (IGEL:clock)"#define IGELCLOCK_SPEED (B1200)#define IGELCLOCK_CFLAG (CS8|CREAD|HUPCL|CLOCAL)/* * RAWDCF receivers that need to be powered from DTR * (like Expert mouse clock) */static int rawdcf_init_1 P((struct parseunit *));#define RAWDCFDTRSET_DESCRIPTION "RAW DCF77 CODE (DTR SET/RTS CLR)"#define RAWDCFDTRSET_INIT rawdcf_init_1/* * RAWDCF receivers that need to be powered from * DTR CLR and RTS SET */static int rawdcf_init_2 P((struct parseunit *));#define RAWDCFDTRCLRRTSSET_DESCRIPTION "RAW DCF77 CODE (DTR CLR/RTS SET)"#define RAWDCFDTRCLRRTSSET_INIT rawdcf_init_2/* * Trimble GPS receivers (TAIP and TSIP protocols) */#ifndef TRIM_POLLRATE#define TRIM_POLLRATE 0 /* only true direct polling */#endif#define TRIM_TAIPPOLLCMD ">SRM;FR_FLAG=F;EC_FLAG=F<>QTM<"#define TRIM_TAIPCMDSIZE (sizeof(TRIM_TAIPPOLLCMD)-1)static poll_info_t trimbletaip_pollinfo = { TRIM_POLLRATE, TRIM_TAIPPOLLCMD, TRIM_TAIPCMDSIZE };static int trimbletaip_init P((struct parseunit *));static void trimbletaip_event P((struct parseunit *, int));/* query time & UTC correction data */static char tsipquery[] = { DLE, 0x21, DLE, ETX, DLE, 0x2F, DLE, ETX };static poll_info_t trimbletsip_pollinfo = { TRIM_POLLRATE, tsipquery, sizeof(tsipquery) };static int trimbletsip_init P((struct parseunit *));static void trimbletsip_end P((struct parseunit *));static void trimbletsip_message P((struct parseunit *, parsetime_t *));static void trimbletsip_event P((struct parseunit *, int));#define TRIMBLETSIP_IDLE_TIME (300) /* 5 minutes silence at most */#define TRIMBLE_RESET_HOLDOFF TRIMBLETSIP_IDLE_TIME#define TRIMBLETAIP_SPEED (B4800)#define TRIMBLETAIP_CFLAG (CS8|CREAD|CLOCAL)#define TRIMBLETAIP_IFLAG (BRKINT|IGNPAR|ISTRIP|ICRNL|IXON)#define TRIMBLETAIP_OFLAG (OPOST|ONLCR)#define TRIMBLETAIP_LFLAG (0)#define TRIMBLETSIP_SPEED (B9600)#define TRIMBLETSIP_CFLAG (CS8|CLOCAL|CREAD|PARENB|PARODD)#define TRIMBLETSIP_IFLAG (IGNBRK)#define TRIMBLETSIP_OFLAG (0)#define TRIMBLETSIP_LFLAG (ICANON)#define TRIMBLETSIP_SAMPLES 5#define TRIMBLETSIP_KEEP 3#define TRIMBLETAIP_SAMPLES 5#define TRIMBLETAIP_KEEP 3#define TRIMBLETAIP_FLAGS (PARSE_F_PPSONSECOND)#define TRIMBLETSIP_FLAGS (TRIMBLETAIP_FLAGS)#define TRIMBLETAIP_POLL poll_dpoll#define TRIMBLETSIP_POLL poll_dpoll#define TRIMBLETAIP_INIT trimbletaip_init#define TRIMBLETSIP_INIT trimbletsip_init#define TRIMBLETAIP_EVENT trimbletaip_event #define TRIMBLETSIP_EVENT trimbletsip_event #define TRIMBLETSIP_MESSAGE trimbletsip_message#define TRIMBLETAIP_END 0#define TRIMBLETSIP_END trimbletsip_end#define TRIMBLETAIP_DATA ((void *)(&trimbletaip_pollinfo))#define TRIMBLETSIP_DATA ((void *)(&trimbletsip_pollinfo))#define TRIMBLETAIP_ID GPS_ID#define TRIMBLETSIP_ID GPS_ID#define TRIMBLETAIP_FORMAT "Trimble TAIP"#define TRIMBLETSIP_FORMAT "Trimble TSIP"#define TRIMBLETAIP_ROOTDELAY 0x0#define TRIMBLETSIP_ROOTDELAY 0x0#define TRIMBLETAIP_BASEDELAY 0.0#define TRIMBLETSIP_BASEDELAY 0.020 /* GPS time message latency */#define TRIMBLETAIP_DESCRIPTION "Trimble GPS (TAIP) receiver"#define TRIMBLETSIP_DESCRIPTION "Trimble GPS (TSIP) receiver"#define TRIMBLETAIP_MAXUNSYNC 0#define TRIMBLETSIP_MAXUNSYNC 0#define TRIMBLETAIP_EOL '<'/* * RadioCode Clocks RCC 800 receiver */#define RCC_POLLRATE 0 /* only true direct polling */#define RCC_POLLCMD "\r"#define RCC_CMDSIZE 1static poll_info_t rcc8000_pollinfo = { RCC_POLLRATE, RCC_POLLCMD, RCC_CMDSIZE };#define RCC8000_FLAGS 0#define RCC8000_POLL poll_dpoll#define RCC8000_INIT poll_init#define RCC8000_END 0#define RCC8000_DATA ((void *)(&rcc8000_pollinfo))#define RCC8000_ROOTDELAY 0.0#define RCC8000_BASEDELAY 0.0#define RCC8000_ID "MSF"#define RCC8000_DESCRIPTION "RCC 8000 MSF Receiver"#define RCC8000_FORMAT "Radiocode RCC8000"#define RCC8000_MAXUNSYNC (60*60) /* should be ok for an hour */#define RCC8000_SPEED (B2400)#define RCC8000_CFLAG (CS8|CREAD|CLOCAL)#define RCC8000_IFLAG (IGNBRK|IGNPAR)#define RCC8000_OFLAG 0#define RCC8000_LFLAG 0#define RCC8000_SAMPLES 5#define RCC8000_KEEP 3/* * Hopf Radio clock 6021 Format * */#define HOPF6021_ROOTDELAY 0.0#define HOPF6021_BASEDELAY 0.0#define HOPF6021_DESCRIPTION "HOPF 6021"#define HOPF6021_FORMAT "hopf Funkuhr 6021"#define HOPF6021_MAXUNSYNC (60*60) /* should be ok for an hour */#define HOPF6021_SPEED (B9600)#define HOPF6021_CFLAG (CS8|CREAD|CLOCAL)#define HOPF6021_IFLAG (IGNBRK|ISTRIP)#define HOPF6021_OFLAG 0#define HOPF6021_LFLAG 0#define HOPF6021_FLAGS 0#define HOPF6021_SAMPLES 5#define HOPF6021_KEEP 3/* * Diem's Computime Radio Clock Receiver */#define COMPUTIME_FLAGS 0#define COMPUTIME_ROOTDELAY 0.0#define COMPUTIME_BASEDELAY 0.0#define COMPUTIME_ID DCF_ID#define COMPUTIME_DESCRIPTION "Diem's Computime receiver"#define COMPUTIME_FORMAT "Diem's Computime Radio Clock"#define COMPUTIME_TYPE DCF_TYPE#define COMPUTIME_MAXUNSYNC (60*60) /* only trust clock for 1 hour */#define COMPUTIME_SPEED (B9600)#define COMPUTIME_CFLAG (CSTOPB|CS7|CREAD|CLOCAL)#define COMPUTIME_IFLAG (IGNBRK|IGNPAR|ISTRIP)#define COMPUTIME_OFLAG 0#define COMPUTIME_LFLAG 0#define COMPUTIME_SAMPLES 5#define COMPUTIME_KEEP 3/* * Varitext Radio Clock Receiver */#define VARITEXT_FLAGS 0#define VARITEXT_ROOTDELAY 0.0#define VARITEXT_BASEDELAY 0.0#define VARITEXT_ID "MSF"#define VARITEXT_DESCRIPTION "Varitext receiver"#define VARITEXT_FORMAT "Varitext Radio Clock"#define VARITEXT_TYPE DCF_TYPE#define VARITEXT_MAXUNSYNC (60*60) /* only trust clock for 1 hour */#define VARITEXT_SPEED (B9600)#define VARITEXT_CFLAG (CS7|CREAD|CLOCAL|PARENB|PARODD)#define VARITEXT_IFLAG (IGNPAR|IGNBRK|INPCK) /*|ISTRIP)*/#define VARITEXT_OFLAG 0#define VARITEXT_LFLAG 0#define VARITEXT_SAMPLES 32#define VARITEXT_KEEP 20static struct parse_clockinfo{ u_long cl_flags; /* operation flags (io modes) */ void (*cl_poll) P((struct parseunit *)); /* active poll routine */ int (*cl_init) P((struct parseunit *)); /* active poll init routine */ void (*cl_event) P((struct parseunit *, int)); /* special event handling (e.g. reset clock) */ void (*cl_end) P((struct parseunit *)); /* active poll end routine */ void (*cl_message) P((struct parseunit *, parsetime_t *)); /* process a lower layer message */ void *cl_data; /* local data area for "poll" mechanism */ double cl_rootdelay; /* rootdelay */ double cl_basedelay; /* current offset by which the RS232 time code is delayed from the actual time */ const char *cl_id; /* ID code */ const char *cl_description; /* device name */ const char *cl_format; /* fixed format */ u_char cl_type; /* clock type (ntp control) */ u_long cl_maxunsync; /* time to trust oscillator after losing synch */ u_long cl_speed; /* terminal input & output baudrate */ u_long cl_cflag; /* terminal control flags */ u_long cl_iflag; /* terminal input flags */ u_long cl_oflag; /* terminal output flags */ u_long cl_lflag; /* terminal local flags */ u_long cl_samples; /* samples for median filter */ u_long cl_keep; /* samples for median filter to keep */} parse_clockinfo[] ={ { /* mode 0 */ MBG_FLAGS, NO_POLL, NO_INIT, NO_EVENT, NO_END, NO_MESSAGE, NO_LCLDATA, DCFPZF535_ROOTDELAY, DCFPZF535_BASEDELAY, DCF_P_ID, DCFPZF535_DESCRIPTION, DCFPZF535_FORMAT, DCF_TYPE, DCFPZF535_MAXUNSYNC, DCFPZF535_SPEED, DCFPZF535_CFLAG, DCFPZF535_IFLAG, DCFPZF535_OFLAG, DCFPZF535_LFLAG, DCFPZF535_SAMPLES, DCFPZF535_KEEP }, { /* mode 1 */ MBG_FLAGS, NO_POLL, NO_INIT, NO_EVENT, NO_END, NO_MESSAGE, NO_LCLDATA, DCFPZF535OCXO_ROOTDELAY, DCFPZF535OCXO_BASEDELAY, DCF_P_ID, DCFPZF535OCXO_DESCRIPTION, DCFPZF535OCXO_FORMAT, DCF_TYPE, DCFPZF535OCXO_MAXUNSYNC, DCFPZF535OCXO_SPEED, DCFPZF535OCXO_CFLAG, DCFPZF535OCXO_IFLAG, DCFPZF535OCXO_OFLAG, DCFPZF535OCXO_LFLAG, DCFPZF535OCXO_SAMPLES, DCFPZF535OCXO_KEEP }, { /* mode 2 */ MBG_FLAGS, NO_POLL, NO_INIT, NO_EVENT, NO_END, NO_MESSAGE, NO_LCLDATA, DCFUA31_ROOTDELAY, DCFUA31_BASEDELAY, DCF_A_ID, DCFUA31_DESCRIPTION, DCFUA31_FORMAT, DCF_TYPE, DCFUA31_MAXUNSYNC, DCFUA31_SPEED, DCFUA31_CFLAG, DCFUA31_IFLAG, DCFUA31_OFLAG, DCFUA31_LFLAG, DCFUA31_SAMPLES, DCFUA31_KEEP }, { /* mode 3 */ MBG_FLAGS, NO_POLL, NO_INIT, NO_EVENT, NO_END, NO_MESSAGE, NO_LCLDATA, DCF7000_ROOTDELAY, DCF7000_BASEDELAY, DCF_A_ID, DCF7000_DESCRIPTION, DCF7000_FORMAT, DCF_TYPE, DCF7000_MAXUNSYNC, DCF7000_SPEED, DCF7000_CFLAG, DCF7000_IFLAG, DCF7000_OFLAG, DCF7000_LFLAG, DCF7000_SAMPLES, DCF7000_KEEP }, { /* mode 4 */ NO_CL_FLAGS, WSDCF_POLL, WSDCF_INIT, NO_EVENT, WSDCF_END, NO_MESSAGE, WSDCF_DATA, WSDCF_ROOTDELAY, WSDCF_BASEDELAY, DCF_A_ID, WSDCF_DESCRIPTION, WSDCF_FORMAT,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -