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>