Annotation of embedaddon/ntp/libparse/clk_trimtaip.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * /src/NTP/ntp4-dev/libparse/clk_trimtaip.c,v 4.11 2005/04/16 17:32:10 kardel RELEASE_20050508_A
                      3:  *
                      4:  * clk_trimtaip.c,v 4.11 2005/04/16 17:32:10 kardel RELEASE_20050508_A
                      5:  *
                      6:  * Trimble SV6 clock support - several collected codepieces
                      7:  *
                      8:  * Copyright (c) 1995-2005 by Frank Kardel <kardel <AT> ntp.org>
                      9:  * Copyright (c) 1989-1994 by Frank Kardel, Friedrich-Alexander Universität Erlangen-Nürnberg, Germany
                     10:  *
                     11:  * Redistribution and use in source and binary forms, with or without
                     12:  * modification, are permitted provided that the following conditions
                     13:  * are met:
                     14:  * 1. Redistributions of source code must retain the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer.
                     16:  * 2. Redistributions in binary form must reproduce the above copyright
                     17:  *    notice, this list of conditions and the following disclaimer in the
                     18:  *    documentation and/or other materials provided with the distribution.
                     19:  * 3. Neither the name of the author nor the names of its contributors
                     20:  *    may be used to endorse or promote products derived from this software
                     21:  *    without specific prior written permission.
                     22:  *
                     23:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     24:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     25:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     26:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
                     27:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     28:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     29:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     30:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     31:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     32:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     33:  * SUCH DAMAGE.
                     34:  *
                     35:  */
                     36: 
                     37: #ifdef HAVE_CONFIG_H
                     38: # include <config.h>
                     39: #endif
                     40: 
                     41: #if defined(REFCLOCK) && defined(CLOCK_PARSE) && defined(CLOCK_TRIMTAIP)
                     42: 
                     43: #include "ntp_fp.h"
                     44: #include "ntp_unixtime.h"
                     45: #include "ntp_calendar.h"
                     46: 
                     47: #include "parse.h"
                     48: 
                     49: #ifndef PARSESTREAM
                     50: #include "ntp_stdlib.h"
                     51: #include <stdio.h>
                     52: #else
                     53: #include "sys/parsestreams.h"
                     54: extern int printf (const char *, ...);
                     55: #endif
                     56: 
                     57: /*     0000000000111111111122222222223333333   / char
                     58:  *     0123456789012345678901234567890123456   \ posn
                     59:  *     >RTMhhmmssdddDDMMYYYYoodnnvrrrrr;*xx<   Actual
                     60:  *     ----33445566600112222BB7__-_____--99-   Parse
                     61:  *     >RTM                      1     ;*  <", Check
                     62:  */
                     63: 
                     64: #define        hexval(x) (('0' <= (x) && (x) <= '9') ? (x) - '0' : \
                     65:                   ('a' <= (x) && (x) <= 'f') ? (x) - 'a' + 10 : \
                     66:                   ('A' <= (x) && (x) <= 'F') ? (x) - 'A' + 10 : \
                     67:                   -1)
                     68: #define        O_USEC          O_WDAY
                     69: #define        O_GPSFIX        O_FLAGS
                     70: #define        O_CHKSUM        O_UTCHOFFSET
                     71:      static struct format trimsv6_fmt =
                     72: { { { 13, 2 }, {15, 2}, { 17, 4}, /* Day, Month, Year */
                     73:     {  4, 2 }, { 6, 2}, {  8, 2}, /* Hour, Minute, Second */
                     74:     { 10, 3 }, {23, 1}, {  0, 0}, /* uSec, FIXes (WeekDAY, FLAGS, ZONE) */
                     75:     { 34, 2 }, { 0, 0}, { 21, 2}, /* cksum, -, utcS (UTC[HMS]OFFSET) */
                     76: },
                     77:   (const unsigned char *)">RTM                      1     ;*  <",
                     78:   0
                     79: };
                     80: 
                     81: static unsigned long cvt_trimtaip (unsigned char *, int, struct format *, clocktime_t *, void *);
                     82: static unsigned long inp_trimtaip (parse_t *, unsigned int, timestamp_t *);
                     83: 
                     84: clockformat_t clock_trimtaip =
                     85: {
                     86:   inp_trimtaip,                        /* no input handling */
                     87:   cvt_trimtaip,                        /* Trimble conversion */
                     88:   pps_one,                     /* easy PPS monitoring */
                     89:   (void *)&trimsv6_fmt,                /* conversion configuration */
                     90:   "Trimble TAIP",
                     91:   37,                          /* string buffer */
                     92:   0                            /* no private data */
                     93: };
                     94: 
                     95: static unsigned long
                     96: cvt_trimtaip(
                     97:             unsigned char *buffer,
                     98:             int            size,
                     99:             struct format *format,
                    100:             clocktime_t   *clock_time,
                    101:             void          *local
                    102:             )
                    103: {
                    104:        long gpsfix;
                    105:        u_char calc_csum = 0;
                    106:        long   recv_csum;
                    107:        int      i;
                    108: 
                    109:        if (!Strok(buffer, format->fixed_string)) return CVT_NONE;
                    110: #define        OFFS(x) format->field_offsets[(x)].offset
                    111: #define        STOI(x, y) \
                    112:        Stoi(&buffer[OFFS(x)], y, \
                    113:             format->field_offsets[(x)].length)
                    114:                if (    STOI(O_DAY,     &clock_time->day)       ||
                    115:                        STOI(O_MONTH,   &clock_time->month)     ||
                    116:                        STOI(O_YEAR,    &clock_time->year)      ||
                    117:                        STOI(O_HOUR,    &clock_time->hour)      ||
                    118:                        STOI(O_MIN,     &clock_time->minute)    ||
                    119:                        STOI(O_SEC,     &clock_time->second)    ||
                    120:                        STOI(O_USEC,    &clock_time->usecond)||
                    121:                        STOI(O_GPSFIX,  &gpsfix)
                    122:                        ) return CVT_FAIL|CVT_BADFMT;
                    123: 
                    124:        clock_time->usecond *= 1000;
                    125:        /* Check that the checksum is right */
                    126:        for (i=OFFS(O_CHKSUM)-1; i >= 0; i--) calc_csum ^= buffer[i];
                    127:        recv_csum =     (hexval(buffer[OFFS(O_CHKSUM)]) << 4) |
                    128:                hexval(buffer[OFFS(O_CHKSUM)+1]);
                    129:        if (recv_csum < 0) return CVT_FAIL|CVT_BADTIME;
                    130:        if (((u_char) recv_csum) != calc_csum) return CVT_FAIL|CVT_BADTIME;
                    131: 
                    132:        clock_time->utcoffset = 0;
                    133: 
                    134:        /* What should flags be set to ? */
                    135:        clock_time->flags = PARSEB_UTC;
                    136: 
                    137:        /* if the current GPS fix is 9 (unknown), reject */
                    138:        if (0 > gpsfix || gpsfix > 9) clock_time->flags |= PARSEB_POWERUP;
                    139: 
                    140:        return CVT_OK;
                    141: }
                    142: 
                    143: /*
                    144:  * inp_trimtaip
                    145:  *
                    146:  * grep data from input stream
                    147:  */
                    148: static u_long
                    149: inp_trimtaip(
                    150:             parse_t      *parseio,
                    151:             unsigned int  ch,
                    152:             timestamp_t  *tstamp
                    153:          )
                    154: {
                    155:        unsigned int rtc;
                    156:        
                    157:        parseprintf(DD_PARSE, ("inp_trimtaip(0x%lx, 0x%x, ...)\n", (long)parseio, ch));
                    158:        
                    159:        switch (ch)
                    160:        {
                    161:        case '>':
                    162:                parseprintf(DD_PARSE, ("inp_trimptaip: START seen\n"));
                    163:                
                    164:                parseio->parse_index = 1;
                    165:                parseio->parse_data[0] = ch;
                    166:                parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */
                    167:                return PARSE_INP_SKIP;
                    168:          
                    169:        case '<':
                    170:                parseprintf(DD_PARSE, ("inp_trimtaip: END seen\n"));
                    171:                if ((rtc = parse_addchar(parseio, ch)) == PARSE_INP_SKIP)
                    172:                        return parse_end(parseio);
                    173:                else
                    174:                        return rtc;
                    175: 
                    176: 
                    177:        default:
                    178:                return parse_addchar(parseio, ch);
                    179:        }
                    180: }
                    181: 
                    182: #else /* not (REFCLOCK && CLOCK_PARSE && CLOCK_TRIMTAIP) */
                    183: int clk_trimtaip_bs;
                    184: #endif /* not (REFCLOCK && CLOCK_PARSE && CLOCK_TRIMTAIP) */
                    185: 
                    186: /*
                    187:  * History:
                    188:  *
                    189:  * clk_trimtaip.c,v
                    190:  * Revision 4.11  2005/04/16 17:32:10  kardel
                    191:  * update copyright
                    192:  *
                    193:  * Revision 4.10  2004/11/14 15:29:41  kardel
                    194:  * support PPSAPI, upgrade Copyright to Berkeley style
                    195:  *
                    196:  * Revision 4.7  1999/11/28 09:13:51  kardel
                    197:  * RECON_4_0_98F
                    198:  *
                    199:  * Revision 4.6  1998/08/16 18:46:27  kardel
                    200:  * (clock_trimtaip =): changed format name
                    201:  *
                    202:  * Revision 4.5  1998/06/14 21:09:38  kardel
                    203:  * Sun acc cleanup
                    204:  *
                    205:  * Revision 4.4  1998/06/13 12:06:57  kardel
                    206:  * fix SYSV clock name clash
                    207:  *
                    208:  * Revision 4.3  1998/06/12 15:22:29  kardel
                    209:  * fix prototypes
                    210:  *
                    211:  * Revision 4.2  1998/06/12 09:13:26  kardel
                    212:  * conditional compile macros fixed
                    213:  * printf prototype
                    214:  *
                    215:  * Revision 4.1  1998/05/24 09:39:54  kardel
                    216:  * implementation of the new IO handling model
                    217:  *
                    218:  * Revision 4.0  1998/04/10 19:45:31  kardel
                    219:  * Start 4.0 release version numbering
                    220:  *
                    221:  * from V3 1.4 log info deleted 1998/04/11 kardel
                    222:  */
                    223: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>