Annotation of embedaddon/ntp/ports/winnt/ntpd/refclock_trimbledc.c, revision 1.1.1.1
1.1 misho 1: #ifdef HAVE_CONFIG_H
2: #include "config.h"
3: #endif
4:
5: #if defined(REFCLOCK) && defined(CLOCK_TRIMBLEDC)
6:
7: #include "refclock_trimbledc.h"
8: extern int debug;
9:
10: static int trimbledc_start (int, struct peer *);
11: static void trimbledc_shutdown (int, struct peer *);
12: static void trimbledc_receive (struct recvbuf *);
13: static void trimbledc_poll (int, struct peer *);
14: static void trimbledc_io (char, int, unsigned char *, l_fp*, struct trimbledc_unit *);
15:
16:
17: /*
18: * Transfer vector
19: */
20: struct refclock refclock_trimbledc = {
21: trimbledc_start, /* start up driver */
22: trimbledc_shutdown, /* shut down driver */
23: trimbledc_poll, /* transmit poll message */
24: noentry, /* not used */
25: noentry, /* initialize driver (not used) */
26: noentry, /* not used */
27: NOFLAGS /* not used */
28: };
29:
30:
31: /*
32: * trimbledc_start - open the devices and initialize data for processing
33: */
34: static int
35: trimbledc_start (
36: int unit,
37: struct peer *peer
38: )
39: {
40: register struct trimbledc_unit *up;
41: struct refclockproc *pp;
42: int fd;
43: char gpsdev[20];
44:
45: struct termios tio;
46: #ifdef SYS_WINNT
47: (void) sprintf(gpsdev, DEVICE, unit);
48: #else
49: (void) sprintf(gpsdev, DEVICE, unit + 1);
50: #endif
51: /*
52: * Open serial port.
53: */
54: fd = refclock_open(gpsdev, SPEED232, LDISC_RAW);
55: if (fd == -1) {
56: msyslog(LOG_ERR,"Trimble (%d) start: open %s failed: %m",
57: unit, gpsdev);
58: return 0;
59: }
60:
61: msyslog(LOG_NOTICE, "Trimble (%d) fd: %d dev: %s", unit, fd, gpsdev);
62:
63: if (tcgetattr(fd, &tio) < 0) {
64: msyslog(LOG_ERR,
65: "Trimble (%d) tcgetattr(fd, &tio): %m",unit);
66: return (0);
67: }
68:
69: tio.c_cflag |= (PARENB|PARODD);
70: tio.c_iflag &= ~ICRNL;
71:
72: if (tcsetattr(fd, TCSANOW, &tio) == -1) {
73: msyslog(LOG_ERR, "Trimble (%d) tcsetattr(fd, &tio): %m",unit);
74: return 0;
75: }
76:
77: /*
78: * Allocate and initialize unit structure
79: */
80: if (!(up = (struct trimbledc_unit *)
81: emalloc(sizeof(struct trimbledc_unit)))) {
82: (void) close(fd);
83: return (0);
84: }
85: memset((char *)up, 0, sizeof(struct trimbledc_unit));
86:
87: pp = peer->procptr;
88: pp->io.clock_recv = trimbledc_receive;
89: pp->io.srcclock = (caddr_t)peer;
90: pp->io.datalen = 0;
91: pp->io.fd = fd;
92:
93: if (!io_addclock(&pp->io)) {
94: (void) close(fd);
95: free(up);
96: return (0);
97: }
98:
99: /*
100: * Initialize miscellaneous variables
101: */
102: pp->unitptr = (caddr_t)up;
103: pp->clockdesc = DESCRIPTION;
104:
105: peer->precision = PRECISION;
106: peer->sstclktype = CTL_SST_TS_UHF;
107: peer->minpoll = TRIMBLEDC_MINPOLL;
108: peer->maxpoll = TRIMBLEDC_MAXPOLL;
109: memcpy((char *)&pp->refid, REFID, 4);
110:
111: up->leap_status = 0;
112: up->unit = unit;
113: up->io_ptr[0] = up->io_ptr[1] = 0;
114:
115: return 1;
116: }
117:
118:
119: /*
120: * trimbledc_shutdown - shut down the clock
121: */
122: static void
123: trimbledc_shutdown (
124: int unit,
125: struct peer *peer
126: )
127: {
128: register struct trimbledc_unit *up;
129: struct refclockproc *pp;
130: pp = peer->procptr;
131: up = (struct trimbledc_unit *)pp->unitptr;
132: io_closeclock(&pp->io);
133: free(up);
134: }
135:
136:
137:
138: /*
139: * TSIP_decode - decode the TSIP data packets
140: */
141: static int
142: trimbledc_decode (
143: struct peer *peer
144: )
145: {
146: #ifdef DEBUG
147: double lat, lon, alt;
148: #endif
149: int st, ts;
150: long secint;
151: double secs;
152: double secfrac;
153: unsigned short event = 0;
154:
155: register struct trimbledc_unit *up;
156: struct refclockproc *pp;
157:
158: pp = peer->procptr;
159: up = (struct trimbledc_unit *)pp->unitptr;
160:
161: /*
162: * Check the time packet, decode its contents.
163: * If the timecode has invalid length or is not in
164: * proper format, declare bad format and exit.
165: */
166:
167: if (up->rpt_buf[0] ==0x41)
168: /* standard time packet - GPS time and GPS week number */
169: return 0;
170:
171:
172: refclock_report(peer, CEVNT_BADREPLY);
173: up->polled = -1;
174: #ifdef DEBUG
175: if (debug)
176: printf("TRIMBLEDC_decode: unit %d: bad packet %02x-%02x event %d len %d\n",
177: up->unit, up->rpt_buf[0] & 0xff, mb(0) & 0xff,
178: event, up->rpt_cnt);
179: #endif
180: return 0;
181: }
182:
183: /*
184: * trimbledc__receive - receive data from the serial interface
185: */
186:
187: static void
188: trimbledc_receive (
189: struct recvbuf *rbufp
190: )
191: {
192: register struct trimbledc_unit *up;
193: struct refclockproc *pp;
194: struct peer *peer;
195:
196: /*
197: * Initialize pointers and read the timecode and timestamp.
198: */
199: peer = (struct peer *)rbufp->recv_srcclock;
200: pp = peer->procptr;
201: up = (struct trimbledc_unit *)pp->unitptr;
202:
203:
204: for (;FALSE;) {
205: trimbledc_io(pp->sloppyclockflag & CLK_FLAG2, rbufp->recv_length,
206: &rbufp->recv_buffer, &pp->lastrec, up);
207:
208:
209:
210:
211: (void) sprintf(pp->a_lastcode,"%4d %03d %02d:%02d:%02d.%06ld",
212: pp->year,pp->day,pp->hour,pp->minute, pp->second,pp->usec);
213: pp->lencode = 24;
214:
215: if (!refclock_process(pp)) {
216: refclock_report(peer, CEVNT_BADTIME);
217:
218: #ifdef DEBUG
219: if (debug)
220: printf("trimbledc_receive: unit %d: refclock_process failed!\n",
221: up->unit);
222: #endif
223: continue;
224: }
225:
226: record_clock_stats(&peer->srcadr, pp->a_lastcode);
227:
228: #ifdef DEBUG
229: if (debug)
230: if (debug)
231: printf("trimbledc_receive: unit %d: %s\n",
232: up->unit, prettydate(&pp->lastrec));
233: #endif
234:
235: refclock_receive(peer);
236: }
237: }
238:
239:
240: /*
241: * trimbledc_poll - called by the transmit procedure
242: *
243: */
244: static void
245: trimbledc_poll (
246: int unit,
247: struct peer *peer
248: )
249: {
250: struct trimbledc_unit *up;
251: struct refclockproc *pp;
252:
253: pp = peer->procptr;
254: up = (struct trimbledc_unit *)pp->unitptr;
255:
256: pp->polls++;
257: if (up->polled > 0) /* last reply never arrived or error */
258: refclock_report(peer, CEVNT_TIMEOUT);
259:
260: up->polled = 2; /* synchronous packet + 1 event */
261:
262: #ifdef DEBUG
263: if (debug)
264: printf("trimbledc_poll: unit %d: polling %s\n", unit,
265: (pp->sloppyclockflag & CLK_FLAG2) ?
266: "synchronous packet" : "event");
267: #endif
268:
269: if (pp->sloppyclockflag & CLK_FLAG2)
270: return; /* using synchronous packet input */
271:
272: // if (HW_poll(pp) < 0)
273: refclock_report(peer, CEVNT_FAULT);
274: }
275:
276:
277: static void
278: trimbledc_io (
279: char noevents,
280: int buflen, /* bytes in buffer to process */
281: unsigned char *bufp, /* receive buffer */
282: l_fp* t_in, /* receive time stamp */
283: struct trimbledc_unit *up /* pointer to unit data structure */
284: )
285: {
286:
287: }
288:
289:
290:
291:
292: #endif /* REFCLOCK */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>