⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 refclock_ulink.c

📁 网络时间协议NTP 源码 版本v4.2.0b 该源码用于linux平台下
💻 C
📖 第 1 页 / 共 2 页
字号:
		    *   space  Space character (0x20)		    *   HH     Hours 00-23		    *   :      This is the REAL in sync indicator (: = insync)			    *   MM     Minutes 00-59		    *   :      : = in sync ? = NOT in sync		    *   SS     Seconds 00-59		    *   L      Leap second flag. Changes from space (0x20)		    *          to 'I' or 'D' during month preceding leap		    *          second adjustment. (I)nsert or (D)elete		    *   +5     UT1 correction (sign + digit ))		    */   		       if (sscanf(pp->a_lastcode,                           "%*2c %*2c%2c%*c%4d%*c%3d%*4c %2d%c%2d:%2d%c%*2c",   		          char_quality, &pp->year, &pp->day,                           &pp->hour, &syncchar, &pp->minute, &pp->second,                           &leapchar) == 8) {    		   			  if (char_quality[0] == '0') {   				quality = 0;   			  } else if (char_quality[0] == '0') {   				quality = (char_quality[1] & 0x0f);   			  } else  {   				quality = 99;   			  }   		          if (leapchar == 'I' ) leapchar = '+';   		          if (leapchar == 'D' ) leapchar = '-';		          /*		          #ifdef DEBUG		          if (debug) {		             printf("ulink: char_quality %c %c\n",                                     char_quality[0], char_quality[1]);			     printf("ulink: quality %d\n", quality);			     printf("ulink: syncchar %x\n", syncchar);			     printf("ulink: leapchar %x\n", leapchar);                          }                          #endif                          */                       }		                    }                     if(siglchar == SIGLCHAR33x) {                		   /*		    * We got a Model 33X decoder.		    * Timecode format from January 29, 2001 datasheet is:		    *   <CR><LF>S9+D 00 YYYY+DDDUTCS HH:MM:SSL+5		    *   S      WWVB decoder sync indicator. S for in-sync(?)		    *          or N for noisy signal.		    *   9+     RF signal level in S-units, 0-9 followed by		    *          a space (0x20). The space turns to '+' if the		    *          level is over 9.		    *   D      Data bit 0, 1, 2 (position mark), or		    *          3 (unknown).		    *   space  Space character (0x20)		    *   00     Hours since last good WWVB frame sync. Will 		    *          be 00-23 hrs, or '1d' to '7d'. Will be 'Lk'                    *          if currently in sync. 		    *   space  Space character (0x20)		    *   YYYY   Current year, 1990-2089		    *   +      Leap year indicator. '+' if a leap year,		    *          a space (0x20) if not.		    *   DDD    Day of year, 001 - 366.		    *   UTC    Timezone (always 'UTC').		    *   S      Daylight savings indicator		    *             S - standard time (STD) in effect		    *             O - during STD to DST day 0000-2400		    *             D - daylight savings time (DST) in effect		    *             I - during DST to STD day 0000-2400		    *   space  Space character (0x20)		    *   HH     Hours 00-23		    *   :      This is the REAL in sync indicator (: = insync)			    *   MM     Minutes 00-59		    *   :      : = in sync ? = NOT in sync		    *   SS     Seconds 00-59		    *   L      Leap second flag. Changes from space (0x20)		    *          to '+' or '-' during month preceding leap		    *          second adjustment.		    *   +5     UT1 correction (sign + digit ))		    */		       if (sscanf(pp->a_lastcode,                            "%*4c %2c %4d%*c%3d%*4c %2d%c%2d:%2d%c%*2c",		           char_quality, &pp->year, &pp->day,                            &pp->hour, &syncchar, &pp->minute, &pp->second,                            &leapchar) == 8) { 					   if (char_quality[0] == 'L') {				quality = 0;			   } else if (char_quality[0] == '0') {				quality = (char_quality[1] & 0x0f);			   } else  {				quality = 99;		           }	                           /*                           #ifdef DEBUG         		   if (debug) {         			printf("ulink: char_quality %c %c\n",                                         char_quality[0], char_quality[1]);         			printf("ulink: quality %d\n", quality);         			printf("ulink: syncchar %x\n", syncchar);         			printf("ulink: leapchar %x\n", leapchar);                           }                           #endif                           */		        }                    }		    break;		}		case LEN320:	        /*		 * Model 320 Decoder		 * The timecode format is:		 *		 *  <cr><lf>SQRYYYYDDD+HH:MM:SS.mmLT<cr>		 *		 * where:		 *		 * S = 'S' -- sync'd in last hour,		 *     '0'-'9' - hours x 10 since last update,		 *     '?' -- not in sync		 * Q = Number of correlating time-frames, from 0 to 5		 * R = 'R' -- reception in progress,		 *     'N' -- Noisy reception,		 *     ' ' -- standby mode		 * YYYY = year from 1990 to 2089		 * DDD = current day from 1 to 366		 * + = '+' if current year is a leap year, else ' '		 * HH = UTC hour 0 to 23		 * MM = Minutes of current hour from 0 to 59		 * SS = Seconds of current minute from 0 to 59		 * mm = 10's milliseconds of the current second from 00 to 99		 * L  = Leap second pending at end of month		 *     'I' = insert, 'D'= delete		 * T  = DST <-> STD transition indicators		 *        	 */		if (sscanf(pp->a_lastcode, "%c%1d%c%4d%3d%*c%2d:%2d:%2d.%2ld%c",	               &syncchar, &quality, &modechar, &pp->year, &pp->day,        	       &pp->hour, &pp->minute, &pp->second,			&pp->nsec, &leapchar) == 10) {		pp->nsec *= 10000000; /* M320 returns 10's of msecs */		if (leapchar == 'I' ) leapchar = '+';		if (leapchar == 'D' ) leapchar = '-';		if (syncchar != '?' ) syncchar = ':'; 		break;		}		default:		refclock_report(peer, CEVNT_BADREPLY);		return;	}	/*	 * Decode quality indicator	 * For the 325 & 33x series, the lower the number the "better" 	 * the time is. I used the dispersion as the measure of time 	 * quality. The quality indicator in the 320 is the number of 	 * correlating time frames (the more the better)	 */	/* 	 * The spec sheet for the 325 & 33x series states the clock will	 * maintain +/-0.002 seconds accuracy when locked to WWVB. This 	 * is indicated by 'Lk' in the quality portion of the incoming 	 * string. When not in lock, a drift of +/-0.015 seconds should 	 * be allowed for.	 * With the quality indicator decoding scheme above, the 'Lk' 	 * condition will produce a quality value of 0. If the quality 	 * indicator starts with '0' then the second character is the 	 * number of hours since we were last locked. If the first 	 * character is anything other than 'L' or '0' then we have been 	 * out of lock for more than 9 hours so we assume the worst and 	 * force a quality value that selects the 'default' maximum 	 * dispersion. The dispersion values below are what came with the	 * driver. They're not unreasonable so they've not been changed.	 */	if (pp->lencode == LEN33X) {		switch (quality) {			case 0 :				pp->disp=.002;				break;			case 1 :				pp->disp=.02;				break;			case 2 :				pp->disp=.04;				break;			case 3 :				pp->disp=.08;				break;			default:				pp->disp=MAXDISPERSE;				break;		}	} else {		switch (quality) {			case 5 :				pp->disp=.002;				break;			case 4 :				pp->disp=.02;				break;			case 3 :				pp->disp=.04;				break;			case 2 :				pp->disp=.08;				break;			case 1 :				pp->disp=.16;				break;			default:				pp->disp=MAXDISPERSE;				break;		}	}	/*	 * Decode synchronization, and leap characters. If	 * unsynchronized, set the leap bits accordingly and exit.	 * Otherwise, set the leap bits according to the leap character.	 */	if (syncchar != ':')		pp->leap = LEAP_NOTINSYNC;	else if (leapchar == '+')		pp->leap = LEAP_ADDSECOND;	else if (leapchar == '-')		pp->leap = LEAP_DELSECOND;	else		pp->leap = LEAP_NOWARNING;	/*	 * Process the new sample in the median filter and determine the	 * timecode timestamp.	 */	if (!refclock_process(pp)) {		refclock_report(peer, CEVNT_BADTIME);	}}/* * ulink_poll - called by the transmit procedure */static voidulink_poll(	int unit,	struct peer *peer	){        struct refclockproc *pp;        char pollchar;        pp = peer->procptr;        pollchar = 'T';	if (pp->sloppyclockflag & CLK_FLAG1) {	        if (write(pp->io.fd, &pollchar, 1) != 1)        	        refclock_report(peer, CEVNT_FAULT);        	else      	            pp->polls++;	}	else      	            pp->polls++;        if (peer->burst > 0)                return;        if (pp->coderecv == pp->codeproc) {                refclock_report(peer, CEVNT_TIMEOUT);                return;        }        pp->lastref = pp->lastrec;	refclock_receive(peer);	record_clock_stats(&peer->srcadr, pp->a_lastcode);        peer->burst = NSTAGE;}#elseint refclock_ulink_bs;#endif /* REFCLOCK */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -