Annotation of embedaddon/ntp/libparse/clk_wharton.c, revision 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>