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

1.1       misho       1: /*
                      2:  * /src/NTP/ntp4-dev/libparse/clk_wharton.c,v 4.2 2004/11/14 15:29:41 kardel RELEASE_20050508_A
                      3:  *  
                      4:  * clk_wharton.c,v 4.2 2004/11/14 15:29:41 kardel RELEASE_20050508_A
                      5:  *
                      6:  * From Philippe De Muyter <phdm@macqel.be>, 1999
                      7:  */
                      8: #ifdef HAVE_CONFIG_H
                      9: #include <config.h>
                     10: #endif
                     11: 
                     12: #if defined(REFCLOCK) && defined(CLOCK_PARSE) && defined(CLOCK_WHARTON_400A)
                     13: /*
                     14:  * Support for WHARTON 400A Series clock + 404.2 serial interface.
                     15:  *
                     16:  * Copyright (C) 1999, 2000 by Philippe De Muyter <phdm@macqel.be>
                     17:  * 
                     18:  * This program is distributed in the hope that it will be useful, but WITHOUT
                     19:  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
                     20:  * FITNESS FOR A PARTICULAR PURPOSE.
                     21:  * 
                     22:  */
                     23: 
                     24: #include "ntp_fp.h"
                     25: #include "ascii.h"
                     26: #include "parse.h"
                     27: 
                     28: #ifndef PARSESTREAM
                     29: #include "ntp_stdlib.h"
                     30: #include <stdio.h>
                     31: #else
                     32: #include "sys/parsestreams.h"
                     33: extern void printf (const char *, ...);
                     34: #endif
                     35: 
                     36: /*
                     37:  * In private e-mail alastair@wharton.co.uk said :
                     38:  * "If you are going to use the 400A and 404.2 system [for ntp] I recommend
                     39:  * that you set the 400A to output the message every second.  The start of
                     40:  * transmission of the first byte of the message is synchronised to the
                     41:  * second edge."
                     42:  * The WHARTON 400A Series is able to send date/time serial messages
                     43:  * in 7 output formats.  We use format 1 here because it is the shortest.
                     44:  * For use with this driver, the WHARTON 400A Series clock must be set-up
                     45:  * as follows :
                     46:  *                                     Programmable    Selected
                     47:  *                                     Option No       Option
                     48:  *     BST or CET display              3               9 or 11
                     49:  *     No external controller          7               0
                     50:  *     Serial Output Format 1          9               1
                     51:  *     Baud rate 9600 bps              10              96
                     52:  *     Bit length 8 bits               11              8
                     53:  *     Parity even                     12              E
                     54:  *
                     55:  * WHARTON 400A Series output format 1 is as follows :
                     56:  * 
                     57:  * Timestamp   STXssmmhhDDMMYYSETX
                     58:  * Pos         0  12345678901234
                     59:  *             0  00000000011111
                     60:  *
                     61:  *     STX     start transmission (ASCII 0x02)
                     62:  *     ETX     end transmission (ASCII 0x03)
                     63:  *     ss      Second expressed in reversed decimal (units then tens)
                     64:  *     mm      Minute expressed in reversed decimal
                     65:  *     hh      Hour expressed in reversed decimal
                     66:  *     DD      Day of month expressed in reversed decimal
                     67:  *     MM      Month expressed in reversed decimal (January is 1)
                     68:  *     YY      Year (without century) expressed in reversed decimal
                     69:  *     S       Status byte : 0x30 +
                     70:  *                     bit 0   0 = MSF source          1 = DCF source
                     71:  *                     bit 1   0 = Winter time         1 = Summer time
                     72:  *                     bit 2   0 = not synchronised    1 = synchronised
                     73:  *                     bit 3   0 = no early warning    1 = early warning
                     74:  * 
                     75:  */
                     76: 
                     77: /*
                     78:  * cvt_wharton_400a
                     79:  * 
                     80:  * convert simple type format
                     81:  */
                     82: static          u_long
                     83: cvt_wharton_400a(
                     84:        unsigned char *buffer,
                     85:        int            size,
                     86:        struct format *format,
                     87:        clocktime_t   *clock_time,
                     88:        void          *local
                     89:        )
                     90: {
                     91:        int     i;
                     92: 
                     93:        /* The given `size' includes a terminating null-character. */
                     94:        if (size != 16 || buffer[0] != STX || buffer[14] != ETX
                     95:            || buffer[13] < '0' || buffer[13] > ('0' + 0xf))
                     96:                return CVT_NONE;
                     97:        for (i = 1; i < 13; i += 1)
                     98:                if (buffer[i] < '0' || buffer[i] > '9')
                     99:                        return CVT_NONE;
                    100:        clock_time->second = (buffer[2] - '0') * 10 + buffer[1] - '0';
                    101:        clock_time->minute = (buffer[4] - '0') * 10 + buffer[3] - '0';
                    102:        clock_time->hour   = (buffer[6] - '0') * 10 + buffer[5] - '0';
                    103:        clock_time->day    = (buffer[8] - '0') * 10 + buffer[7] - '0';
                    104:        clock_time->month  = (buffer[10] - '0') * 10 + buffer[9] - '0';
                    105:        clock_time->year   = (buffer[12] - '0') * 10 + buffer[11] - '0';
                    106:        clock_time->usecond = 0;
                    107:        if (buffer[13] & 0x1) /* We have CET time */
                    108:                clock_time->utcoffset = -1*60*60;
                    109:        else            /* We have BST time */
                    110:                clock_time->utcoffset = 0;
                    111:        if (buffer[13] & 0x2) {
                    112:                clock_time->flags |= PARSEB_DST;
                    113:                clock_time->utcoffset += -1*60*60;
                    114:        }
                    115:        if (!(buffer[13] & 0x4))
                    116:                clock_time->flags |= PARSEB_NOSYNC;
                    117:        if (buffer[13] & 0x8)
                    118:                clock_time->flags |= PARSEB_ANNOUNCE;
                    119: 
                    120:        return CVT_OK;
                    121: }
                    122: 
                    123: /*
                    124:  * inp_wharton_400a
                    125:  *
                    126:  * grep data from input stream
                    127:  */
                    128: static u_long
                    129: inp_wharton_400a(
                    130:              parse_t      *parseio,
                    131:              unsigned int  ch,
                    132:              timestamp_t  *tstamp
                    133:              )
                    134: {
                    135:        unsigned int rtc;
                    136:        
                    137:        parseprintf(DD_PARSE, ("inp_wharton_400a(0x%lx, 0x%x, ...)\n", (long)parseio, ch));
                    138:        
                    139:        switch (ch)
                    140:        {
                    141:        case STX:
                    142:                parseprintf(DD_PARSE, ("inp_wharton_400a: STX seen\n"));
                    143:                
                    144:                parseio->parse_index = 1;
                    145:                parseio->parse_data[0] = ch;
                    146:                parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */
                    147:                return PARSE_INP_SKIP;
                    148:          
                    149:        case ETX:
                    150:                parseprintf(DD_PARSE, ("inp_wharton_400a: ETX seen\n"));
                    151:                if ((rtc = parse_addchar(parseio, ch)) == PARSE_INP_SKIP)
                    152:                        return parse_end(parseio);
                    153:                else
                    154:                        return rtc;
                    155: 
                    156:        default:
                    157:                return parse_addchar(parseio, ch);
                    158:        }
                    159: }
                    160: 
                    161: clockformat_t   clock_wharton_400a =
                    162: {
                    163:        inp_wharton_400a,       /* input handling function */
                    164:        cvt_wharton_400a,       /* conversion function */
                    165:        0,                      /* no PPS monitoring */
                    166:        0,                      /* conversion configuration */
                    167:        "WHARTON 400A Series clock Output Format 1",    /* String format name */
                    168:        15,                     /* string buffer */
                    169:        0                       /* no private data (complete pakets) */
                    170: };
                    171: 
                    172: #else /* not (REFCLOCK && CLOCK_PARSE && CLOCK_WHARTON_400A) */
                    173: int clk_wharton_400a_bs;
                    174: #endif /* not (REFCLOCK && CLOCK_PARSE && CLOCK_WHARTON_400A) */
                    175: 
                    176: /*
                    177:  * clk_wharton.c,v
                    178:  * Revision 4.1  1999/02/28 15:27:24  kardel
                    179:  * wharton clock integration
                    180:  *
                    181:  */

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