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

📄 refclock_ripencc.c

📁 网络时间协议NTP 源码 版本v4.2.0b 该源码用于linux平台下
💻 C
📖 第 1 页 / 共 5 页
字号:
			parseany(&rpt, peer);#endif /* TRIMBLE_OUTPUT_FUNC */			break;		}   		rpt.status = TSIP_PARSED_EMPTY;	}}/*  * All trimble functions that are directly referenced from driver code * (so not from parseany) */void cmd_0x1F (TSIPPKT *cmd)/* request software versions */{	cmd->len = 0;	cmd->code = 0x1F;}void cmd_0x26 (TSIPPKT *cmd)/* request receiver health */{	cmd->len = 0;	cmd->code = 0x26;}void cmd_0x2F (TSIPPKT *cmd)/* request UTC params */{	cmd->len = 0;	cmd->code = 0x2F;}void cmd_0x35s  (TSIPPKT *cmd, unsigned char pos_code, unsigned char vel_code,	unsigned char time_code, unsigned char opts_code)/* set serial I/O options */{	cmd->buf[0] = pos_code;	cmd->buf[1] = vel_code;	cmd->buf[2] = time_code;	cmd->buf[3] = opts_code;	cmd->len = 4;	cmd->code = 0x35;}void cmd_0x3C  (TSIPPKT *cmd, unsigned char sv_prn)/* request tracking status */{	cmd->buf[0] = sv_prn;	cmd->len = 1;	cmd->code = 0x3C;}void cmd_0x3Ds (TSIPPKT *cmd,	unsigned char baud_out, unsigned char baud_inp,   unsigned char char_code, unsigned char stopbitcode,   unsigned char output_mode, unsigned char input_mode)/* set Channel A configuration for dual-port operation */{	cmd->buf[0] = baud_out;		/* XMT baud rate */	cmd->buf[1] = baud_inp;		/* RCV baud rate */	cmd->buf[2] = char_code;	   /* parity and #bits per byte */	cmd->buf[3] = stopbitcode;	/* number of stop bits code */	cmd->buf[4] = output_mode;	/* Ch. A transmission mode */	cmd->buf[5] = input_mode;	/* Ch. A reception mode */	cmd->len = 6;	cmd->code = 0x3D;}/* query primary configuration */void cmd_0xBBq (TSIPPKT *cmd,	unsigned char subcode){	cmd->len = 1;	cmd->code = 0xBB;	cmd->buf[0] = subcode;}/**** Superpackets ****/void cmd_0x8E0Bq (TSIPPKT *cmd)/* 8E-0B to query 8F-0B controls */{	cmd->len = 1;	cmd->code = 0x8E;	cmd->buf[0] = 0x0B;}void cmd_0x8E41q (TSIPPKT *cmd)/* 8F-41 to query board serial number */{	cmd->len = 1;	cmd->code = 0x8E;	cmd->buf[0] = 0x41;}void cmd_0x8E42q (TSIPPKT *cmd)/* 8F-42 to query product serial number */{	cmd->len = 1;	cmd->code = 0x8E;	cmd->buf[0] = 0x42;}void cmd_0x8E4Aq (TSIPPKT *cmd)/* 8F-4A to query PPS parameters */{	cmd->len = 1;	cmd->code = 0x8E;	cmd->buf[0] = 0x4A;}/* set i/o options */void cmd_0x8E4As (TSIPPKT *cmd,	unsigned char PPSOnOff,	unsigned char TimeBase,	unsigned char Polarity,   double PPSOffset,   float Uncertainty){	cmd->len = 16;	cmd->code = 0x8E;	cmd->buf[0] = 0x4A;	cmd->buf[1] = PPSOnOff;	cmd->buf[2] = TimeBase;	cmd->buf[3] = Polarity;	bPutDouble (&PPSOffset, &cmd->buf[4]);	bPutFloat (&Uncertainty, &cmd->buf[12]);}void cmd_0x8E4Bq (TSIPPKT *cmd)/* 8F-4B query survey limit */{	cmd->len = 1;	cmd->code = 0x8E;	cmd->buf[0] = 0x4B;}/* poll for UTC superpacket */void cmd_0x8EADq (TSIPPKT *cmd)/* 8E-AD to query 8F-AD controls */{	cmd->len = 1;	cmd->code = 0x8E;	cmd->buf[0] = 0xAD;}/* all outomatic packet output off */void cmd_0x8E4Ds (TSIPPKT *cmd,	unsigned long AutoOutputMask){	cmd->len = 5;	cmd->code = 0x8E;	cmd->buf[0] = 0x4D;	bPutULong (&AutoOutputMask, &cmd->buf[1]);}/* for DOS machines, reverse order of bytes as they come through the * serial port. */#ifdef BYTESWAPstatic short bGetShort (unsigned char *bp){	short outval;   unsigned char *optr;   optr = (unsigned char*)&outval + 1;   *optr-- = *bp++;   *optr = *bp;	return outval;}#ifdef TRIMBLE_OUTPUT_FUNCstatic unsigned short bGetUShort (unsigned char *bp){	unsigned short outval;   unsigned char *optr;   optr = (unsigned char*)&outval + 1;   *optr-- = *bp++;   *optr = *bp;	return outval;}static long bGetLong (unsigned char *bp){	long outval;   unsigned char *optr;   optr = (unsigned char*)&outval + 3;   *optr-- = *bp++;   *optr-- = *bp++;   *optr-- = *bp++;   *optr = *bp;	return outval;}static unsigned long bGetULong (unsigned char *bp){	unsigned long outval;   unsigned char *optr;   optr = (unsigned char*)&outval + 3;   *optr-- = *bp++;   *optr-- = *bp++;   *optr-- = *bp++;   *optr = *bp;	return outval;}#endif /* TRIMBLE_OUTPUT_FUNC */static float bGetSingle (unsigned char *bp){	float outval;   unsigned char *optr;   optr = (unsigned char*)&outval + 3;   *optr-- = *bp++;   *optr-- = *bp++;   *optr-- = *bp++;   *optr = *bp;	return outval;}static double bGetDouble (unsigned char *bp){	double outval;   unsigned char *optr;   optr = (unsigned char*)&outval + 7;   *optr-- = *bp++;   *optr-- = *bp++;   *optr-- = *bp++;   *optr-- = *bp++;   *optr-- = *bp++;   *optr-- = *bp++;   *optr-- = *bp++;   *optr = *bp;	return outval;}#else /* not BYTESWAP */#define bGetShort(bp) 	(*(short*)(bp))#define bGetLong(bp) 	(*(long*)(bp))#define bGetULong(bp) 	(*(unsigned long*)(bp))#define bGetSingle(bp) 	(*(float*)(bp))#define bGetDouble(bp)	(*(double*)(bp))#endif /* BYTESWAP *//* * Byte-reversal is necessary for little-endian (Intel-based) machines. * TSIP streams are Big-endian (Motorola-based). */#ifdef BYTESWAPvoidbPutFloat (float *in, unsigned char *out){	unsigned char *inptr;   inptr = (unsigned char*)in + 3;   *out++ = *inptr--;   *out++ = *inptr--;   *out++ = *inptr--;   *out = *inptr;}static voidbPutULong (unsigned long *in, unsigned char *out){	unsigned char *inptr;   inptr = (unsigned char*)in + 3;   *out++ = *inptr--;   *out++ = *inptr--;   *out++ = *inptr--;   *out = *inptr;}static voidbPutDouble (double *in, unsigned char *out){	unsigned char *inptr;   inptr = (unsigned char*)in + 7;   *out++ = *inptr--;   *out++ = *inptr--;   *out++ = *inptr--;   *out++ = *inptr--;   *out++ = *inptr--;   *out++ = *inptr--;   *out++ = *inptr--;   *out = *inptr;}#else	/* not BYTESWAP */void bPutShort (short a, unsigned char *cmdbuf) {*(short*) cmdbuf = a;}void bPutULong (long a, unsigned char *cmdbuf) 	{*(long*) cmdbuf = a;}void bPutFloat (float a, unsigned char *cmdbuf) {*(float*) cmdbuf = a;}void bPutDouble (double a, unsigned char *cmdbuf){*(double*) cmdbuf = a;}#endif /* BYTESWAP *//* * Parse primary utc time packet * and fill refclock structure  * from results.  * * 0 = success * -1 = errors */static intparse0x8FAD(rpt, peer)	TSIPPKT *rpt;	struct peer *peer;	{	register struct refclockproc *pp;		register struct ripencc_unit *up;	unsigned day, month, year;	/* data derived from received timecode */	unsigned hour, minute, second;	unsigned char trackstat, utcflags;   	static char logbuf[1024];	/* logging string buffer */	int i;	unsigned char *buf;			buf = rpt->buf;	pp = peer->procptr;	if (rpt->len != 22) 		return (-1);		if (bGetShort(&buf[1]) != 0) {#ifdef DEBUG_NCC		if (debug) 			printf("parse0x8FAD: event count != 0\n");#endif /* DEBUG_NCC */		return(-1);	}	if (bGetDouble(&buf[3]) != 0.0) {#ifdef DEBUG_NCC		if (debug) 			printf("parse0x8FAD: fracsecs != 0\n");#endif /* DEBUG_NCC */		return(-1);	}	hour = (unsigned int) buf[11];	minute = (unsigned int) buf[12];	second = (unsigned int) buf[13];	day =		(unsigned int) buf[14];	month =		(unsigned int) buf[15];	year =		bGetShort(&buf[16]);	trackstat = buf[18];	utcflags = buf[19];	sprintf(logbuf, "U1 %d.%d.%d %02d:%02d:%02d %d %02x",		day, month, year, hour, minute, second, trackstat, utcflags);#ifdef DEBUG_NCC	if (debug)    		puts(logbuf);#endif /* DEBUG_NCC */	record_clock_stats(&peer->srcadr, logbuf);	if (!utcflags & UTCF_UTC_AVAIL)		return(-1);	/* poll for UTC parameters once and then if UTC flag changed */	up = (struct ripencc_unit *) pp->unitptr;	if (utcflags != up->utcflags) {		TSIPPKT spt; /* local structure for send packet */		cmd_0x2F (&spt); /* request UTC params */		ripencc_send(peer,spt);		up->utcflags = utcflags;	}		/*	 * If we hit the leap second, we choose to skip this sample	 * rather than rely on other code to be perfectly correct.	 * No offense, just defense ;-).	 */	if (second == 60)		return(-1);	/* now check and convert the time we received */	pp->year = year;	if (month < 1 || month > 12 || day < 1 || day > 31) 		return(-1);	if (pp->year % 4) {		if (day > day1tab[month - 1]) 			return(-1);		for (i = 0; i < month - 1; i++)			day += day1tab[i];	} else {		if (day > day2tab[month - 1]) 			return(-1);		for (i = 0; i < month - 1; i++)			day += day2tab[i];	}	pp->day = day;	pp->hour = hour;	pp->minute = minute;	pp-> second = second;	pp->nsec = 0;	if ((utcflags&UTCF_LEAP_PNDG) && up->leapdelta != 0) 		pp-> leap = (up->leapdelta > 0 ? LEAP_ADDSECOND : LEAP_DELSECOND); 	else		pp-> leap = LEAP_NOWARNING;  	return (0);}/* * Parse comprehensive time packet  * * 0 = success * -1 = errors */int parse0x8F0B(rpt, peer)	TSIPPKT *rpt;	struct peer *peer;	{	register struct refclockproc *pp;		unsigned day, month, year;	/* data derived from received timecode */	unsigned hour, minute, second;	unsigned utcoff;	unsigned char mode;	double  bias, rate;	float biasunc, rateunc;	double lat, lon, alt;	short lat_deg, lon_deg;	float lat_min, lon_min;	unsigned char north_south, east_west;	char sv[9];   	static char logbuf[1024];	/* logging string buffer */	unsigned char b;	int i;	unsigned char *buf;	double tow;			buf = rpt->buf;	pp = peer->procptr;	if (rpt->len != 74) 		return (-1);		if (bGetShort(&buf[1]) != 0)		return(-1);;	tow =  bGetDouble(&buf[3]);	if (tow == -1.0) {		return(-1);	}	else if ((tow >= 604800.0) || (tow < 0.0)) {		return(-1);	}	else	{		if (tow < 604799.9) tow = tow + .00000001;		second = (unsigned int) fmod(tow, 60.);		minute =  (unsigned int) fmod(tow/60., 60.);		hour = (unsigned int )fmod(tow / 3600., 24.);	} 	day =		(unsigned int) buf[11];	month =		(unsigned int) buf[12];	year =		bGetShort(&buf[13]);	mode =		buf[15];	utcoff =	bGetShort(&buf[16]);	bias = 		bGetDouble(&buf[18]) / GPS_C * 1e9;	/* ns */	rate = 		bGetDouble(&buf[26]) / GPS_C * 1e9;	/* ppb */ 	biasunc = 	bGetSingle(&buf[34]) / GPS_C * 1e9;	/* ns */	rateunc = 	bGetSingle(&buf[38]) / GPS_C * 1e9;	/* ppb */	lat = 		bGetDouble(&buf[42]) * R2D;	lon = 		bGetDouble(&buf[50]) * R2D;	alt = 		bGetDouble(&buf[58]);	if (lat < 0.0) {		north_south = 'S';		lat = -lat;	}	else {		north_south = 'N';	}	lat_deg = (short)lat;	lat_min = (lat - lat_deg) * 60.0;	if (lon < 0.0) {		east_west = 'W';		lon = -lon;	}	else {		east_west = 'E';	}

⌨️ 快捷键说明

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