Annotation of embedaddon/ntp/libparse/clk_hopf6021.c, revision 1.1
1.1 ! misho 1: /*
! 2: * /src/NTP/ntp4-dev/libparse/clk_hopf6021.c,v 4.10 2004/11/14 15:29:41 kardel RELEASE_20050508_A
! 3: *
! 4: * clk_hopf6021.c,v 4.10 2004/11/14 15:29:41 kardel RELEASE_20050508_A
! 5: *
! 6: * Radiocode Clocks HOPF Funkuhr 6021 mit serieller Schnittstelle
! 7: * base code version from 24th Nov 1995 - history at end
! 8: *
! 9: * Created by F.Schnekenbuehl <frank@comsys.dofn.de> from clk_rcc8000.c
! 10: * Nortel DASA Network Systems GmbH, Department: ND250
! 11: * A Joint venture of Daimler-Benz Aerospace and Nortel
! 12: *
! 13: * This program is distributed in the hope that it will be useful,
! 14: * but WITHOUT ANY WARRANTY; without even the implied warranty of
! 15: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
! 16: *
! 17: */
! 18:
! 19: #ifdef HAVE_CONFIG_H
! 20: # include <config.h>
! 21: #endif
! 22:
! 23: #if defined(REFCLOCK) && defined(CLOCK_PARSE) && defined(CLOCK_HOPF6021)
! 24:
! 25: #include "ntp_fp.h"
! 26: #include "ntp_unixtime.h"
! 27: #include "ntp_calendar.h"
! 28: #include "ascii.h"
! 29:
! 30: #include "parse.h"
! 31:
! 32: #ifndef PARSESTREAM
! 33: #include "ntp_stdlib.h"
! 34: #include <stdio.h>
! 35: #else
! 36: #include "sys/parsestreams.h"
! 37: extern int printf (const char *, ...);
! 38: #endif
! 39:
! 40: /*
! 41: * hopf Funkuhr 6021
! 42: * used with 9600,8N1,
! 43: * UTC ueber serielle Schnittstelle
! 44: * Sekundenvorlauf ON
! 45: * ETX zum Sekundenvorlauf ON
! 46: * Datenstring 6021
! 47: * Ausgabe Uhrzeit und Datum
! 48: * Senden mit Steuerzeichen
! 49: * Senden sekuendlich
! 50: */
! 51:
! 52: /*
! 53: * Type 6021 Serial Output format
! 54: *
! 55: * 000000000011111111 / char
! 56: * 012345678901234567 \ position
! 57: * sABHHMMSSDDMMYYnre Actual
! 58: * C4110046231195 Parse
! 59: * s enr Check
! 60: *
! 61: * s = STX (0x02), e = ETX (0x03)
! 62: * n = NL (0x0A), r = CR (0x0D)
! 63: *
! 64: * A B - Status and weekday
! 65: *
! 66: * A - Status
! 67: *
! 68: * 8 4 2 1
! 69: * x x x 0 - no announcement
! 70: * x x x 1 - Summertime - wintertime - summertime announcement
! 71: * x x 0 x - Wintertime
! 72: * x x 1 x - Summertime
! 73: * 0 0 x x - Time/Date invalid
! 74: * 0 1 x x - Internal clock used
! 75: * 1 0 x x - Radio clock
! 76: * 1 1 x x - Radio clock highprecision
! 77: *
! 78: * B - 8 4 2 1
! 79: * 0 x x x - MESZ/MEZ
! 80: * 1 x x x - UTC
! 81: * x 0 0 1 - Monday
! 82: * x 0 1 0 - Tuesday
! 83: * x 0 1 1 - Wednesday
! 84: * x 1 0 0 - Thursday
! 85: * x 1 0 1 - Friday
! 86: * x 1 1 0 - Saturday
! 87: * x 1 1 1 - Sunday
! 88: */
! 89:
! 90: #define HOPF_DSTWARN 0x01 /* DST switch warning */
! 91: #define HOPF_DST 0x02 /* DST in effect */
! 92:
! 93: #define HOPF_MODE 0x0C /* operation mode mask */
! 94: #define HOPF_INVALID 0x00 /* no time code available */
! 95: #define HOPF_INTERNAL 0x04 /* internal clock */
! 96: #define HOPF_RADIO 0x08 /* radio clock */
! 97: #define HOPF_RADIOHP 0x0C /* high precision radio clock */
! 98:
! 99: #define HOPF_UTC 0x08 /* time code in UTC */
! 100: #define HOPF_WMASK 0x07 /* mask for weekday code */
! 101:
! 102: static struct format hopf6021_fmt =
! 103: {
! 104: {
! 105: { 9, 2 }, {11, 2}, { 13, 2}, /* Day, Month, Year */
! 106: { 3, 2 }, { 5, 2}, { 7, 2}, /* Hour, Minute, Second */
! 107: { 2, 1 }, { 1, 1}, { 0, 0}, /* Weekday, Flags, Zone */
! 108: /* ... */
! 109: },
! 110: (const unsigned char *)"\002 \n\r\003",
! 111: 0
! 112: };
! 113:
! 114: #define OFFS(x) format->field_offsets[(x)].offset
! 115: #define STOI(x, y) Stoi(&buffer[OFFS(x)], y, format->field_offsets[(x)].length)
! 116: #define hexval(x) (('0' <= (x) && (x) <= '9') ? (x) - '0' : \
! 117: ('a' <= (x) && (x) <= 'f') ? (x) - 'a' + 10 : \
! 118: ('A' <= (x) && (x) <= 'F') ? (x) - 'A' + 10 : \
! 119: -1)
! 120:
! 121: static unsigned long cvt_hopf6021 (unsigned char *, int, struct format *, clocktime_t *, void *);
! 122: static unsigned long inp_hopf6021 (parse_t *, unsigned int, timestamp_t *);
! 123:
! 124: clockformat_t clock_hopf6021 =
! 125: {
! 126: inp_hopf6021, /* HOPF 6021 input handling */
! 127: cvt_hopf6021, /* Radiocode clock conversion */
! 128: 0, /* no direct PPS monitoring */
! 129: (void *)&hopf6021_fmt, /* conversion configuration */
! 130: "hopf Funkuhr 6021", /* clock format name */
! 131: 19, /* string buffer */
! 132: 0 /* private data length, no private data */
! 133: };
! 134:
! 135: static unsigned long
! 136: cvt_hopf6021(
! 137: unsigned char *buffer,
! 138: int size,
! 139: struct format *format,
! 140: clocktime_t *clock_time,
! 141: void *local
! 142: )
! 143: {
! 144: unsigned char status,weekday;
! 145:
! 146: if (!Strok(buffer, format->fixed_string))
! 147: {
! 148: return CVT_NONE;
! 149: }
! 150:
! 151: if ( STOI(O_DAY, &clock_time->day) ||
! 152: STOI(O_MONTH, &clock_time->month) ||
! 153: STOI(O_YEAR, &clock_time->year) ||
! 154: STOI(O_HOUR, &clock_time->hour) ||
! 155: STOI(O_MIN, &clock_time->minute) ||
! 156: STOI(O_SEC, &clock_time->second)
! 157: )
! 158: {
! 159: return CVT_FAIL|CVT_BADFMT;
! 160: }
! 161:
! 162: clock_time->usecond = 0;
! 163: clock_time->utcoffset = 0;
! 164:
! 165: status = hexval(buffer[OFFS(O_FLAGS)]);
! 166: weekday= hexval(buffer[OFFS(O_WDAY)]);
! 167:
! 168: if ((status == 0xFF) || (weekday == 0xFF))
! 169: {
! 170: return CVT_FAIL|CVT_BADFMT;
! 171: }
! 172:
! 173: clock_time->flags = 0;
! 174:
! 175: if (weekday & HOPF_UTC)
! 176: {
! 177: clock_time->flags |= PARSEB_UTC;
! 178: }
! 179: else
! 180: {
! 181: if (status & HOPF_DST)
! 182: {
! 183: clock_time->flags |= PARSEB_DST;
! 184: clock_time->utcoffset = -2*60*60; /* MET DST */
! 185: }
! 186: else
! 187: {
! 188: clock_time->utcoffset = -1*60*60; /* MET */
! 189: }
! 190: }
! 191:
! 192: clock_time->flags |= (status & HOPF_DSTWARN) ? PARSEB_ANNOUNCE : 0;
! 193:
! 194: switch (status & HOPF_MODE)
! 195: {
! 196: case HOPF_INVALID: /* Time/Date invalid */
! 197: clock_time->flags |= PARSEB_POWERUP;
! 198: break;
! 199:
! 200: case HOPF_INTERNAL: /* internal clock */
! 201: clock_time->flags |= PARSEB_NOSYNC;
! 202: break;
! 203:
! 204: case HOPF_RADIO: /* Radio clock */
! 205: case HOPF_RADIOHP: /* Radio clock high precision */
! 206: break;
! 207:
! 208: default:
! 209: return CVT_FAIL|CVT_BADFMT;
! 210: }
! 211:
! 212: return CVT_OK;
! 213: }
! 214:
! 215: /*
! 216: * inp_hopf6021
! 217: *
! 218: * grep data from input stream
! 219: */
! 220: static u_long
! 221: inp_hopf6021(
! 222: parse_t *parseio,
! 223: unsigned int ch,
! 224: timestamp_t *tstamp
! 225: )
! 226: {
! 227: unsigned int rtc;
! 228:
! 229: parseprintf(DD_PARSE, ("inp_hopf6021(0x%lx, 0x%x, ...)\n", (long)parseio, ch));
! 230:
! 231: switch (ch)
! 232: {
! 233: case ETX:
! 234: parseprintf(DD_PARSE, ("inp_hopf6021: EOL seen\n"));
! 235: parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */
! 236: if ((rtc = parse_addchar(parseio, ch)) == PARSE_INP_SKIP)
! 237: return parse_end(parseio);
! 238: else
! 239: return rtc;
! 240:
! 241: default:
! 242: return parse_addchar(parseio, ch);
! 243: }
! 244: }
! 245:
! 246: #else /* not (REFCLOCK && CLOCK_PARSE && CLOCK_HOPF6021) */
! 247: int clk_hopf6021_bs;
! 248: #endif /* not (REFCLOCK && CLOCK_PARSE && CLOCK_HOPF6021) */
! 249:
! 250: /*
! 251: * History:
! 252: *
! 253: * clk_hopf6021.c,v
! 254: * Revision 4.10 2004/11/14 15:29:41 kardel
! 255: * support PPSAPI, upgrade Copyright to Berkeley style
! 256: *
! 257: * Revision 4.7 1999/11/28 09:13:49 kardel
! 258: * RECON_4_0_98F
! 259: *
! 260: * Revision 4.6 1998/11/15 20:27:57 kardel
! 261: * Release 4.0.73e13 reconcilation
! 262: *
! 263: * Revision 4.5 1998/06/14 21:09:35 kardel
! 264: * Sun acc cleanup
! 265: *
! 266: * Revision 4.4 1998/06/13 12:02:38 kardel
! 267: * fix SYSV clock name clash
! 268: *
! 269: * Revision 4.3 1998/06/12 15:22:27 kardel
! 270: * fix prototypes
! 271: *
! 272: * Revision 4.2 1998/06/12 09:13:25 kardel
! 273: * conditional compile macros fixed
! 274: * printf prototype
! 275: *
! 276: * Revision 4.1 1998/05/24 09:39:52 kardel
! 277: * implementation of the new IO handling model
! 278: *
! 279: * Revision 4.0 1998/04/10 19:45:29 kardel
! 280: * Start 4.0 release version numbering
! 281: *
! 282: * from V3 3.6 log info deleted 1998/04/11 kardel
! 283: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>