1c0b746e5SOllivier Robert #ifdef HAVE_CONFIG_H 2c0b746e5SOllivier Robert # include <config.h> 3c0b746e5SOllivier Robert #endif 4c0b746e5SOllivier Robert 5c0b746e5SOllivier Robert #if defined(REFCLOCK) && defined(CLOCK_PARSE) && defined(CLOCK_COMPUTIME) 6c0b746e5SOllivier Robert /* 7a151a66cSOllivier Robert * /src/NTP/ntp-4/libparse/clk_computime.c,v 4.6 1999/11/28 09:13:49 kardel RELEASE_19991128_A 8c0b746e5SOllivier Robert * 9a151a66cSOllivier Robert * clk_computime.c,v 4.6 1999/11/28 09:13:49 kardel RELEASE_19991128_A 10c0b746e5SOllivier Robert * 11c0b746e5SOllivier Robert * Supports Diem's Computime Radio Clock 12c0b746e5SOllivier Robert * 13c0b746e5SOllivier Robert * Used the Meinberg clock as a template for Diem's Computime Radio Clock 14c0b746e5SOllivier Robert * 15c0b746e5SOllivier Robert * adapted by Alois Camenzind <alois.camenzind@ubs.ch> 16c0b746e5SOllivier Robert * 17c0b746e5SOllivier Robert * Copyright (C) 1992-1998 by Frank Kardel 18c0b746e5SOllivier Robert * Friedrich-Alexander Universit�t Erlangen-N�rnberg, Germany 19c0b746e5SOllivier Robert * 20c0b746e5SOllivier Robert * This program is distributed in the hope that it will be useful, but WITHOUT 21c0b746e5SOllivier Robert * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 22c0b746e5SOllivier Robert * FITNESS FOR A PARTICULAR PURPOSE. 23c0b746e5SOllivier Robert * 24c0b746e5SOllivier Robert */ 25c0b746e5SOllivier Robert 26c0b746e5SOllivier Robert 27c0b746e5SOllivier Robert #include <sys/types.h> 28c0b746e5SOllivier Robert #include <sys/time.h> 29c0b746e5SOllivier Robert 30c0b746e5SOllivier Robert #include "ntp_fp.h" 31c0b746e5SOllivier Robert #include "ntp_unixtime.h" 32c0b746e5SOllivier Robert #include "ntp_calendar.h" 33c0b746e5SOllivier Robert #include "ntp_stdlib.h" 34c0b746e5SOllivier Robert 35c0b746e5SOllivier Robert #include "parse.h" 36c0b746e5SOllivier Robert 37c0b746e5SOllivier Robert #ifndef PARSESTREAM 38c0b746e5SOllivier Robert #include <stdio.h> 39c0b746e5SOllivier Robert #else 40c0b746e5SOllivier Robert #include "sys/parsestreams.h" 41c0b746e5SOllivier Robert extern void printf P((const char *, ...)); 42c0b746e5SOllivier Robert #endif 43c0b746e5SOllivier Robert 44c0b746e5SOllivier Robert /* 45c0b746e5SOllivier Robert * The Computime receiver sends a datagram in the following format every minute 46c0b746e5SOllivier Robert * 47c0b746e5SOllivier Robert * Timestamp T:YY:MM:MD:WD:HH:MM:SSCRLF 48c0b746e5SOllivier Robert * Pos 0123456789012345678901 2 3 49c0b746e5SOllivier Robert * 0000000000111111111122 2 2 50c0b746e5SOllivier Robert * Parse T: : : : : : : rn 51c0b746e5SOllivier Robert * 52c0b746e5SOllivier Robert * T Startcharacter "T" specifies start of the timestamp 53c0b746e5SOllivier Robert * YY Year MM Month 1-12 54c0b746e5SOllivier Robert * MD Day of the month 55c0b746e5SOllivier Robert * WD Day of week 56c0b746e5SOllivier Robert * HH Hour 57c0b746e5SOllivier Robert * MM Minute 58c0b746e5SOllivier Robert * SS Second 59c0b746e5SOllivier Robert * CR Carriage return 60c0b746e5SOllivier Robert * LF Linefeed 61c0b746e5SOllivier Robert * 62c0b746e5SOllivier Robert */ 63c0b746e5SOllivier Robert 64c0b746e5SOllivier Robert static struct format computime_fmt = 65c0b746e5SOllivier Robert { 66c0b746e5SOllivier Robert { 67c0b746e5SOllivier Robert {8, 2}, {5, 2}, {2, 2}, /* day, month, year */ 68c0b746e5SOllivier Robert {14, 2}, {17, 2}, {20, 2}, /* hour, minute, second */ 69c0b746e5SOllivier Robert {11, 2}, /* dayofweek, */ 70c0b746e5SOllivier Robert }, 71c0b746e5SOllivier Robert (const unsigned char *)"T: : : : : : : \r\n", 72c0b746e5SOllivier Robert 0 73c0b746e5SOllivier Robert }; 74c0b746e5SOllivier Robert 75c0b746e5SOllivier Robert static u_long cvt_computime P((unsigned char *, int, struct format *, clocktime_t *, void *)); 76c0b746e5SOllivier Robert static unsigned long inp_computime P((parse_t *, unsigned int, timestamp_t *)); 77c0b746e5SOllivier Robert 78c0b746e5SOllivier Robert clockformat_t clock_computime = 79c0b746e5SOllivier Robert { 80c0b746e5SOllivier Robert inp_computime, /* Computime input handling */ 81c0b746e5SOllivier Robert cvt_computime, /* Computime conversion */ 82c0b746e5SOllivier Robert 0, /* no PPS monitoring */ 83c0b746e5SOllivier Robert (void *)&computime_fmt, /* conversion configuration */ 84c0b746e5SOllivier Robert "Diem's Computime Radio Clock", /* Computime Radio Clock */ 85c0b746e5SOllivier Robert 24, /* string buffer */ 86c0b746e5SOllivier Robert 0 /* no private data (complete pakets) */ 87c0b746e5SOllivier Robert }; 88c0b746e5SOllivier Robert 89c0b746e5SOllivier Robert /* 90c0b746e5SOllivier Robert * cvt_computime 91c0b746e5SOllivier Robert * 92c0b746e5SOllivier Robert * convert simple type format 93c0b746e5SOllivier Robert */ 94c0b746e5SOllivier Robert static u_long 95c0b746e5SOllivier Robert cvt_computime( 96c0b746e5SOllivier Robert unsigned char *buffer, 97c0b746e5SOllivier Robert int size, 98c0b746e5SOllivier Robert struct format *format, 99c0b746e5SOllivier Robert clocktime_t *clock_time, 100c0b746e5SOllivier Robert void *local 101c0b746e5SOllivier Robert ) 102c0b746e5SOllivier Robert { 103c0b746e5SOllivier Robert 104c0b746e5SOllivier Robert if (!Strok(buffer, format->fixed_string)) { 105c0b746e5SOllivier Robert return CVT_NONE; 106c0b746e5SOllivier Robert } else { 107c0b746e5SOllivier Robert if (Stoi(&buffer[format->field_offsets[O_DAY].offset], &clock_time->day, 108c0b746e5SOllivier Robert format->field_offsets[O_DAY].length) || 109c0b746e5SOllivier Robert Stoi(&buffer[format->field_offsets[O_MONTH].offset], &clock_time->month, 110c0b746e5SOllivier Robert format->field_offsets[O_MONTH].length) || 111c0b746e5SOllivier Robert Stoi(&buffer[format->field_offsets[O_YEAR].offset], &clock_time->year, 112c0b746e5SOllivier Robert format->field_offsets[O_YEAR].length) || 113c0b746e5SOllivier Robert Stoi(&buffer[format->field_offsets[O_HOUR].offset], &clock_time->hour, 114c0b746e5SOllivier Robert format->field_offsets[O_HOUR].length) || 115c0b746e5SOllivier Robert Stoi(&buffer[format->field_offsets[O_MIN].offset], &clock_time->minute, 116c0b746e5SOllivier Robert format->field_offsets[O_MIN].length) || 117c0b746e5SOllivier Robert Stoi(&buffer[format->field_offsets[O_SEC].offset], &clock_time->second, 118c0b746e5SOllivier Robert format->field_offsets[O_SEC].length)) { 119c0b746e5SOllivier Robert return CVT_FAIL | CVT_BADFMT; 120c0b746e5SOllivier Robert } else { 121c0b746e5SOllivier Robert 122c0b746e5SOllivier Robert clock_time->flags = 0; 123c0b746e5SOllivier Robert clock_time->utcoffset = 0; /* We have UTC time */ 124c0b746e5SOllivier Robert 125c0b746e5SOllivier Robert return CVT_OK; 126c0b746e5SOllivier Robert } 127c0b746e5SOllivier Robert } 128c0b746e5SOllivier Robert } 129c0b746e5SOllivier Robert 130c0b746e5SOllivier Robert /* 131c0b746e5SOllivier Robert * inp_computime 132c0b746e5SOllivier Robert * 133c0b746e5SOllivier Robert * grep data from input stream 134c0b746e5SOllivier Robert */ 135c0b746e5SOllivier Robert static u_long 136c0b746e5SOllivier Robert inp_computime( 137c0b746e5SOllivier Robert parse_t *parseio, 138c0b746e5SOllivier Robert unsigned int ch, 139c0b746e5SOllivier Robert timestamp_t *tstamp 140c0b746e5SOllivier Robert ) 141c0b746e5SOllivier Robert { 142c0b746e5SOllivier Robert unsigned int rtc; 143c0b746e5SOllivier Robert 144c0b746e5SOllivier Robert parseprintf(DD_PARSE, ("inp_computime(0x%x, 0x%x, ...)\n", (int)parseio, (int)ch)); 145c0b746e5SOllivier Robert 146c0b746e5SOllivier Robert switch (ch) 147c0b746e5SOllivier Robert { 148c0b746e5SOllivier Robert case 'T': 149c0b746e5SOllivier Robert parseprintf(DD_PARSE, ("inp_computime: START seen\n")); 150c0b746e5SOllivier Robert 151c0b746e5SOllivier Robert parseio->parse_index = 1; 152c0b746e5SOllivier Robert parseio->parse_data[0] = ch; 153c0b746e5SOllivier Robert parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */ 154c0b746e5SOllivier Robert return PARSE_INP_SKIP; 155c0b746e5SOllivier Robert 156c0b746e5SOllivier Robert case '\n': 157c0b746e5SOllivier Robert parseprintf(DD_PARSE, ("inp_computime: END seen\n")); 158c0b746e5SOllivier Robert if ((rtc = parse_addchar(parseio, ch)) == PARSE_INP_SKIP) 159c0b746e5SOllivier Robert return parse_end(parseio); 160c0b746e5SOllivier Robert else 161c0b746e5SOllivier Robert return rtc; 162c0b746e5SOllivier Robert 163c0b746e5SOllivier Robert default: 164c0b746e5SOllivier Robert return parse_addchar(parseio, ch); 165c0b746e5SOllivier Robert } 166c0b746e5SOllivier Robert } 167c0b746e5SOllivier Robert 168c0b746e5SOllivier Robert #else /* not (REFCLOCK && CLOCK_PARSE && CLOCK_COMPUTIME) */ 169c0b746e5SOllivier Robert int clk_computime_bs; 170c0b746e5SOllivier Robert #endif /* not (REFCLOCK && CLOCK_PARSE && CLOCK_COMPUTIME) */ 171c0b746e5SOllivier Robert 172c0b746e5SOllivier Robert /* 173c0b746e5SOllivier Robert * clk_computime.c,v 174a151a66cSOllivier Robert * Revision 4.6 1999/11/28 09:13:49 kardel 175a151a66cSOllivier Robert * RECON_4_0_98F 176a151a66cSOllivier Robert * 177c0b746e5SOllivier Robert * Revision 4.5 1998/06/14 21:09:34 kardel 178c0b746e5SOllivier Robert * Sun acc cleanup 179c0b746e5SOllivier Robert * 180c0b746e5SOllivier Robert * Revision 4.4 1998/06/13 12:00:38 kardel 181c0b746e5SOllivier Robert * fix SYSV clock name clash 182c0b746e5SOllivier Robert * 183c0b746e5SOllivier Robert * Revision 4.3 1998/06/12 15:22:26 kardel 184c0b746e5SOllivier Robert * fix prototypes 185c0b746e5SOllivier Robert * 186c0b746e5SOllivier Robert * Revision 4.2 1998/06/12 09:13:24 kardel 187c0b746e5SOllivier Robert * conditional compile macros fixed 188c0b746e5SOllivier Robert * printf prototype 189c0b746e5SOllivier Robert * 190c0b746e5SOllivier Robert * Revision 4.1 1998/05/24 09:39:51 kardel 191c0b746e5SOllivier Robert * implementation of the new IO handling model 192c0b746e5SOllivier Robert * 193c0b746e5SOllivier Robert * Revision 4.0 1998/04/10 19:45:27 kardel 194c0b746e5SOllivier Robert * Start 4.0 release version numbering 195c0b746e5SOllivier Robert * 196c0b746e5SOllivier Robert * from V3 1.8 log info deleted 1998/04/11 kardel 197c0b746e5SOllivier Robert */ 198