clk_computime.c revision 82498
154359Sroberto#ifdef HAVE_CONFIG_H 254359Sroberto# include <config.h> 354359Sroberto#endif 454359Sroberto 554359Sroberto#if defined(REFCLOCK) && defined(CLOCK_PARSE) && defined(CLOCK_COMPUTIME) 654359Sroberto/* 756746Sroberto * /src/NTP/ntp-4/libparse/clk_computime.c,v 4.6 1999/11/28 09:13:49 kardel RELEASE_19991128_A 854359Sroberto * 956746Sroberto * clk_computime.c,v 4.6 1999/11/28 09:13:49 kardel RELEASE_19991128_A 1054359Sroberto * 1154359Sroberto * Supports Diem's Computime Radio Clock 1254359Sroberto * 1354359Sroberto * Used the Meinberg clock as a template for Diem's Computime Radio Clock 1454359Sroberto * 1554359Sroberto * adapted by Alois Camenzind <alois.camenzind@ubs.ch> 1654359Sroberto * 1754359Sroberto * Copyright (C) 1992-1998 by Frank Kardel 1854359Sroberto * Friedrich-Alexander Universit�t Erlangen-N�rnberg, Germany 1954359Sroberto * 2054359Sroberto * This program is distributed in the hope that it will be useful, but WITHOUT 2154359Sroberto * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 2254359Sroberto * FITNESS FOR A PARTICULAR PURPOSE. 2354359Sroberto * 2454359Sroberto */ 2554359Sroberto 2654359Sroberto#include "ntp_fp.h" 2754359Sroberto#include "ntp_unixtime.h" 2854359Sroberto#include "ntp_calendar.h" 2954359Sroberto#include "ntp_stdlib.h" 3054359Sroberto 3154359Sroberto#include "parse.h" 3254359Sroberto 3354359Sroberto#ifndef PARSESTREAM 3454359Sroberto#include <stdio.h> 3554359Sroberto#else 3654359Sroberto#include "sys/parsestreams.h" 3754359Srobertoextern void printf P((const char *, ...)); 3854359Sroberto#endif 3954359Sroberto 4054359Sroberto/* 4154359Sroberto * The Computime receiver sends a datagram in the following format every minute 4254359Sroberto * 4354359Sroberto * Timestamp T:YY:MM:MD:WD:HH:MM:SSCRLF 4454359Sroberto * Pos 0123456789012345678901 2 3 4554359Sroberto * 0000000000111111111122 2 2 4654359Sroberto * Parse T: : : : : : : rn 4754359Sroberto * 4854359Sroberto * T Startcharacter "T" specifies start of the timestamp 4954359Sroberto * YY Year MM Month 1-12 5054359Sroberto * MD Day of the month 5154359Sroberto * WD Day of week 5254359Sroberto * HH Hour 5354359Sroberto * MM Minute 5454359Sroberto * SS Second 5554359Sroberto * CR Carriage return 5654359Sroberto * LF Linefeed 5754359Sroberto * 5854359Sroberto */ 5954359Sroberto 6054359Srobertostatic struct format computime_fmt = 6154359Sroberto{ 6254359Sroberto { 6354359Sroberto {8, 2}, {5, 2}, {2, 2}, /* day, month, year */ 6454359Sroberto {14, 2}, {17, 2}, {20, 2}, /* hour, minute, second */ 6554359Sroberto {11, 2}, /* dayofweek, */ 6654359Sroberto }, 6754359Sroberto (const unsigned char *)"T: : : : : : : \r\n", 6854359Sroberto 0 6954359Sroberto}; 7054359Sroberto 7154359Srobertostatic u_long cvt_computime P((unsigned char *, int, struct format *, clocktime_t *, void *)); 7254359Srobertostatic unsigned long inp_computime P((parse_t *, unsigned int, timestamp_t *)); 7354359Sroberto 7454359Srobertoclockformat_t clock_computime = 7554359Sroberto{ 7654359Sroberto inp_computime, /* Computime input handling */ 7754359Sroberto cvt_computime, /* Computime conversion */ 7854359Sroberto 0, /* no PPS monitoring */ 7954359Sroberto (void *)&computime_fmt, /* conversion configuration */ 8054359Sroberto "Diem's Computime Radio Clock", /* Computime Radio Clock */ 8154359Sroberto 24, /* string buffer */ 8254359Sroberto 0 /* no private data (complete pakets) */ 8354359Sroberto}; 8454359Sroberto 8554359Sroberto/* 8654359Sroberto * cvt_computime 8754359Sroberto * 8854359Sroberto * convert simple type format 8954359Sroberto */ 9054359Srobertostatic u_long 9154359Srobertocvt_computime( 9254359Sroberto unsigned char *buffer, 9354359Sroberto int size, 9454359Sroberto struct format *format, 9554359Sroberto clocktime_t *clock_time, 9654359Sroberto void *local 9754359Sroberto ) 9854359Sroberto{ 9954359Sroberto 10054359Sroberto if (!Strok(buffer, format->fixed_string)) { 10154359Sroberto return CVT_NONE; 10254359Sroberto } else { 10354359Sroberto if (Stoi(&buffer[format->field_offsets[O_DAY].offset], &clock_time->day, 10454359Sroberto format->field_offsets[O_DAY].length) || 10554359Sroberto Stoi(&buffer[format->field_offsets[O_MONTH].offset], &clock_time->month, 10654359Sroberto format->field_offsets[O_MONTH].length) || 10754359Sroberto Stoi(&buffer[format->field_offsets[O_YEAR].offset], &clock_time->year, 10854359Sroberto format->field_offsets[O_YEAR].length) || 10954359Sroberto Stoi(&buffer[format->field_offsets[O_HOUR].offset], &clock_time->hour, 11054359Sroberto format->field_offsets[O_HOUR].length) || 11154359Sroberto Stoi(&buffer[format->field_offsets[O_MIN].offset], &clock_time->minute, 11254359Sroberto format->field_offsets[O_MIN].length) || 11354359Sroberto Stoi(&buffer[format->field_offsets[O_SEC].offset], &clock_time->second, 11454359Sroberto format->field_offsets[O_SEC].length)) { 11554359Sroberto return CVT_FAIL | CVT_BADFMT; 11654359Sroberto } else { 11754359Sroberto 11854359Sroberto clock_time->flags = 0; 11954359Sroberto clock_time->utcoffset = 0; /* We have UTC time */ 12054359Sroberto 12154359Sroberto return CVT_OK; 12254359Sroberto } 12354359Sroberto } 12454359Sroberto} 12554359Sroberto 12654359Sroberto/* 12754359Sroberto * inp_computime 12854359Sroberto * 12954359Sroberto * grep data from input stream 13054359Sroberto */ 13154359Srobertostatic u_long 13254359Srobertoinp_computime( 13354359Sroberto parse_t *parseio, 13454359Sroberto unsigned int ch, 13554359Sroberto timestamp_t *tstamp 13654359Sroberto ) 13754359Sroberto{ 13854359Sroberto unsigned int rtc; 13954359Sroberto 14082498Sroberto parseprintf(DD_PARSE, ("inp_computime(0x%lx, 0x%x, ...)\n", (long)parseio, ch)); 14154359Sroberto 14254359Sroberto switch (ch) 14354359Sroberto { 14454359Sroberto case 'T': 14554359Sroberto parseprintf(DD_PARSE, ("inp_computime: START seen\n")); 14654359Sroberto 14754359Sroberto parseio->parse_index = 1; 14854359Sroberto parseio->parse_data[0] = ch; 14954359Sroberto parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */ 15054359Sroberto return PARSE_INP_SKIP; 15154359Sroberto 15254359Sroberto case '\n': 15354359Sroberto parseprintf(DD_PARSE, ("inp_computime: END seen\n")); 15454359Sroberto if ((rtc = parse_addchar(parseio, ch)) == PARSE_INP_SKIP) 15554359Sroberto return parse_end(parseio); 15654359Sroberto else 15754359Sroberto return rtc; 15854359Sroberto 15954359Sroberto default: 16054359Sroberto return parse_addchar(parseio, ch); 16154359Sroberto } 16254359Sroberto} 16354359Sroberto 16454359Sroberto#else /* not (REFCLOCK && CLOCK_PARSE && CLOCK_COMPUTIME) */ 16554359Srobertoint clk_computime_bs; 16654359Sroberto#endif /* not (REFCLOCK && CLOCK_PARSE && CLOCK_COMPUTIME) */ 16754359Sroberto 16854359Sroberto/* 16954359Sroberto * clk_computime.c,v 17056746Sroberto * Revision 4.6 1999/11/28 09:13:49 kardel 17156746Sroberto * RECON_4_0_98F 17256746Sroberto * 17354359Sroberto * Revision 4.5 1998/06/14 21:09:34 kardel 17454359Sroberto * Sun acc cleanup 17554359Sroberto * 17654359Sroberto * Revision 4.4 1998/06/13 12:00:38 kardel 17754359Sroberto * fix SYSV clock name clash 17854359Sroberto * 17954359Sroberto * Revision 4.3 1998/06/12 15:22:26 kardel 18054359Sroberto * fix prototypes 18154359Sroberto * 18254359Sroberto * Revision 4.2 1998/06/12 09:13:24 kardel 18354359Sroberto * conditional compile macros fixed 18454359Sroberto * printf prototype 18554359Sroberto * 18654359Sroberto * Revision 4.1 1998/05/24 09:39:51 kardel 18754359Sroberto * implementation of the new IO handling model 18854359Sroberto * 18954359Sroberto * Revision 4.0 1998/04/10 19:45:27 kardel 19054359Sroberto * Start 4.0 release version numbering 19154359Sroberto * 19254359Sroberto * from V3 1.8 log info deleted 1998/04/11 kardel 19354359Sroberto */ 194