154359Sroberto#ifdef HAVE_CONFIG_H 254359Sroberto# include <config.h> 354359Sroberto#endif 454359Sroberto 554359Sroberto#if defined(REFCLOCK) && defined(CLOCK_PARSE) && defined(CLOCK_COMPUTIME) 654359Sroberto/* 7182007Sroberto * /src/NTP/ntp4-dev/libparse/clk_computime.c,v 4.10 2005/04/16 17:32:10 kardel RELEASE_20050508_A 854359Sroberto * 9182007Sroberto * clk_computime.c,v 4.10 2005/04/16 17:32:10 kardel RELEASE_20050508_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 * 17182007Sroberto * Copyright (c) 1995-2005 by Frank Kardel <kardel <AT> ntp.org> 18182007Sroberto * Copyright (c) 1989-1994 by Frank Kardel, Friedrich-Alexander Universit�t Erlangen-N�rnberg, Germany 19182007Sroberto * 20182007Sroberto * Redistribution and use in source and binary forms, with or without 21182007Sroberto * modification, are permitted provided that the following conditions 22182007Sroberto * are met: 23182007Sroberto * 1. Redistributions of source code must retain the above copyright 24182007Sroberto * notice, this list of conditions and the following disclaimer. 25182007Sroberto * 2. Redistributions in binary form must reproduce the above copyright 26182007Sroberto * notice, this list of conditions and the following disclaimer in the 27182007Sroberto * documentation and/or other materials provided with the distribution. 28182007Sroberto * 3. Neither the name of the author nor the names of its contributors 29182007Sroberto * may be used to endorse or promote products derived from this software 30182007Sroberto * without specific prior written permission. 31182007Sroberto * 32182007Sroberto * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 33182007Sroberto * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 34182007Sroberto * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 35182007Sroberto * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 36182007Sroberto * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37182007Sroberto * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38182007Sroberto * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39182007Sroberto * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 40182007Sroberto * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 41182007Sroberto * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 42182007Sroberto * SUCH DAMAGE. 43182007Sroberto * 4454359Sroberto */ 4554359Sroberto 4654359Sroberto#include "ntp_fp.h" 4754359Sroberto#include "ntp_unixtime.h" 4854359Sroberto#include "ntp_calendar.h" 4954359Sroberto#include "ntp_stdlib.h" 5054359Sroberto 5154359Sroberto#include "parse.h" 5254359Sroberto 5354359Sroberto#ifndef PARSESTREAM 5454359Sroberto#include <stdio.h> 5554359Sroberto#else 5654359Sroberto#include "sys/parsestreams.h" 5754359Srobertoextern void printf P((const char *, ...)); 5854359Sroberto#endif 5954359Sroberto 6054359Sroberto/* 6154359Sroberto * The Computime receiver sends a datagram in the following format every minute 6254359Sroberto * 6354359Sroberto * Timestamp T:YY:MM:MD:WD:HH:MM:SSCRLF 6454359Sroberto * Pos 0123456789012345678901 2 3 6554359Sroberto * 0000000000111111111122 2 2 6654359Sroberto * Parse T: : : : : : : rn 6754359Sroberto * 6854359Sroberto * T Startcharacter "T" specifies start of the timestamp 6954359Sroberto * YY Year MM Month 1-12 7054359Sroberto * MD Day of the month 7154359Sroberto * WD Day of week 7254359Sroberto * HH Hour 7354359Sroberto * MM Minute 7454359Sroberto * SS Second 7554359Sroberto * CR Carriage return 7654359Sroberto * LF Linefeed 7754359Sroberto * 7854359Sroberto */ 7954359Sroberto 8054359Srobertostatic struct format computime_fmt = 8154359Sroberto{ 8254359Sroberto { 8354359Sroberto {8, 2}, {5, 2}, {2, 2}, /* day, month, year */ 8454359Sroberto {14, 2}, {17, 2}, {20, 2}, /* hour, minute, second */ 8554359Sroberto {11, 2}, /* dayofweek, */ 8654359Sroberto }, 8754359Sroberto (const unsigned char *)"T: : : : : : : \r\n", 8854359Sroberto 0 8954359Sroberto}; 9054359Sroberto 9154359Srobertostatic u_long cvt_computime P((unsigned char *, int, struct format *, clocktime_t *, void *)); 9254359Srobertostatic unsigned long inp_computime P((parse_t *, unsigned int, timestamp_t *)); 9354359Sroberto 9454359Srobertoclockformat_t clock_computime = 9554359Sroberto{ 9654359Sroberto inp_computime, /* Computime input handling */ 9754359Sroberto cvt_computime, /* Computime conversion */ 9854359Sroberto 0, /* no PPS monitoring */ 9954359Sroberto (void *)&computime_fmt, /* conversion configuration */ 10054359Sroberto "Diem's Computime Radio Clock", /* Computime Radio Clock */ 10154359Sroberto 24, /* string buffer */ 10254359Sroberto 0 /* no private data (complete pakets) */ 10354359Sroberto}; 10454359Sroberto 10554359Sroberto/* 10654359Sroberto * cvt_computime 10754359Sroberto * 10854359Sroberto * convert simple type format 10954359Sroberto */ 11054359Srobertostatic u_long 11154359Srobertocvt_computime( 11254359Sroberto unsigned char *buffer, 11354359Sroberto int size, 11454359Sroberto struct format *format, 11554359Sroberto clocktime_t *clock_time, 11654359Sroberto void *local 11754359Sroberto ) 11854359Sroberto{ 11954359Sroberto 12054359Sroberto if (!Strok(buffer, format->fixed_string)) { 12154359Sroberto return CVT_NONE; 12254359Sroberto } else { 12354359Sroberto if (Stoi(&buffer[format->field_offsets[O_DAY].offset], &clock_time->day, 12454359Sroberto format->field_offsets[O_DAY].length) || 12554359Sroberto Stoi(&buffer[format->field_offsets[O_MONTH].offset], &clock_time->month, 12654359Sroberto format->field_offsets[O_MONTH].length) || 12754359Sroberto Stoi(&buffer[format->field_offsets[O_YEAR].offset], &clock_time->year, 12854359Sroberto format->field_offsets[O_YEAR].length) || 12954359Sroberto Stoi(&buffer[format->field_offsets[O_HOUR].offset], &clock_time->hour, 13054359Sroberto format->field_offsets[O_HOUR].length) || 13154359Sroberto Stoi(&buffer[format->field_offsets[O_MIN].offset], &clock_time->minute, 13254359Sroberto format->field_offsets[O_MIN].length) || 13354359Sroberto Stoi(&buffer[format->field_offsets[O_SEC].offset], &clock_time->second, 13454359Sroberto format->field_offsets[O_SEC].length)) { 13554359Sroberto return CVT_FAIL | CVT_BADFMT; 13654359Sroberto } else { 13754359Sroberto 13854359Sroberto clock_time->flags = 0; 13954359Sroberto clock_time->utcoffset = 0; /* We have UTC time */ 14054359Sroberto 14154359Sroberto return CVT_OK; 14254359Sroberto } 14354359Sroberto } 14454359Sroberto} 14554359Sroberto 14654359Sroberto/* 14754359Sroberto * inp_computime 14854359Sroberto * 14954359Sroberto * grep data from input stream 15054359Sroberto */ 15154359Srobertostatic u_long 15254359Srobertoinp_computime( 15354359Sroberto parse_t *parseio, 15454359Sroberto unsigned int ch, 15554359Sroberto timestamp_t *tstamp 15654359Sroberto ) 15754359Sroberto{ 15854359Sroberto unsigned int rtc; 15954359Sroberto 16082498Sroberto parseprintf(DD_PARSE, ("inp_computime(0x%lx, 0x%x, ...)\n", (long)parseio, ch)); 16154359Sroberto 16254359Sroberto switch (ch) 16354359Sroberto { 16454359Sroberto case 'T': 16554359Sroberto parseprintf(DD_PARSE, ("inp_computime: START seen\n")); 16654359Sroberto 16754359Sroberto parseio->parse_index = 1; 16854359Sroberto parseio->parse_data[0] = ch; 16954359Sroberto parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */ 17054359Sroberto return PARSE_INP_SKIP; 17154359Sroberto 17254359Sroberto case '\n': 17354359Sroberto parseprintf(DD_PARSE, ("inp_computime: END seen\n")); 17454359Sroberto if ((rtc = parse_addchar(parseio, ch)) == PARSE_INP_SKIP) 17554359Sroberto return parse_end(parseio); 17654359Sroberto else 17754359Sroberto return rtc; 17854359Sroberto 17954359Sroberto default: 18054359Sroberto return parse_addchar(parseio, ch); 18154359Sroberto } 18254359Sroberto} 18354359Sroberto 18454359Sroberto#else /* not (REFCLOCK && CLOCK_PARSE && CLOCK_COMPUTIME) */ 18554359Srobertoint clk_computime_bs; 18654359Sroberto#endif /* not (REFCLOCK && CLOCK_PARSE && CLOCK_COMPUTIME) */ 18754359Sroberto 18854359Sroberto/* 18954359Sroberto * clk_computime.c,v 190182007Sroberto * Revision 4.10 2005/04/16 17:32:10 kardel 191182007Sroberto * update copyright 192182007Sroberto * 193182007Sroberto * Revision 4.9 2004/11/14 15:29:41 kardel 194182007Sroberto * support PPSAPI, upgrade Copyright to Berkeley style 195182007Sroberto * 19656746Sroberto * Revision 4.6 1999/11/28 09:13:49 kardel 19756746Sroberto * RECON_4_0_98F 19856746Sroberto * 19954359Sroberto * Revision 4.5 1998/06/14 21:09:34 kardel 20054359Sroberto * Sun acc cleanup 20154359Sroberto * 20254359Sroberto * Revision 4.4 1998/06/13 12:00:38 kardel 20354359Sroberto * fix SYSV clock name clash 20454359Sroberto * 20554359Sroberto * Revision 4.3 1998/06/12 15:22:26 kardel 20654359Sroberto * fix prototypes 20754359Sroberto * 20854359Sroberto * Revision 4.2 1998/06/12 09:13:24 kardel 20954359Sroberto * conditional compile macros fixed 21054359Sroberto * printf prototype 21154359Sroberto * 21254359Sroberto * Revision 4.1 1998/05/24 09:39:51 kardel 21354359Sroberto * implementation of the new IO handling model 21454359Sroberto * 21554359Sroberto * Revision 4.0 1998/04/10 19:45:27 kardel 21654359Sroberto * Start 4.0 release version numbering 21754359Sroberto * 21854359Sroberto * from V3 1.8 log info deleted 1998/04/11 kardel 21954359Sroberto */ 220