📄 refclock_ripencc.c
字号:
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 + -