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>