1 #ifdef HAVE_CONFIG_H 2 # include <config.h> 3 #endif 4 5 #if defined(REFCLOCK) && defined(CLOCK_PARSE) && defined(CLOCK_COMPUTIME) 6 /* 7 * /src/NTP/ntp4-dev/libparse/clk_computime.c,v 4.10 2005/04/16 17:32:10 kardel RELEASE_20050508_A 8 * 9 * clk_computime.c,v 4.10 2005/04/16 17:32:10 kardel RELEASE_20050508_A 10 * 11 * Supports Diem's Computime Radio Clock 12 * 13 * Used the Meinberg clock as a template for Diem's Computime Radio Clock 14 * 15 * adapted by Alois Camenzind <alois.camenzind@ubs.ch> 16 * 17 * Copyright (c) 1995-2005 by Frank Kardel <kardel <AT> ntp.org> 18 * Copyright (c) 1989-1994 by Frank Kardel, Friedrich-Alexander Universitaet Erlangen-Nuernberg, Germany 19 * 20 * Redistribution and use in source and binary forms, with or without 21 * modification, are permitted provided that the following conditions 22 * are met: 23 * 1. Redistributions of source code must retain the above copyright 24 * notice, this list of conditions and the following disclaimer. 25 * 2. Redistributions in binary form must reproduce the above copyright 26 * notice, this list of conditions and the following disclaimer in the 27 * documentation and/or other materials provided with the distribution. 28 * 3. Neither the name of the author nor the names of its contributors 29 * may be used to endorse or promote products derived from this software 30 * without specific prior written permission. 31 * 32 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 33 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 34 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 35 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 36 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 40 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 41 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 42 * SUCH DAMAGE. 43 * 44 */ 45 46 #include "ntp_fp.h" 47 #include "ntp_unixtime.h" 48 #include "ntp_calendar.h" 49 #include "ntp_stdlib.h" 50 51 #include "parse.h" 52 53 #ifndef PARSESTREAM 54 #include <stdio.h> 55 #else 56 #include "sys/parsestreams.h" 57 extern int printf (const char *, ...); 58 #endif 59 60 /* 61 * The Computime receiver sends a datagram in the following format every minute 62 * 63 * Timestamp T:YY:MM:MD:WD:HH:MM:SSCRLF 64 * Pos 0123456789012345678901 2 3 65 * 0000000000111111111122 2 2 66 * Parse T: : : : : : : rn 67 * 68 * T Startcharacter "T" specifies start of the timestamp 69 * YY Year MM Month 1-12 70 * MD Day of the month 71 * WD Day of week 72 * HH Hour 73 * MM Minute 74 * SS Second 75 * CR Carriage return 76 * LF Linefeed 77 * 78 */ 79 80 static struct format computime_fmt = 81 { 82 { 83 {8, 2}, {5, 2}, {2, 2}, /* day, month, year */ 84 {14, 2}, {17, 2}, {20, 2}, /* hour, minute, second */ 85 {11, 2}, /* dayofweek, */ 86 }, 87 (const unsigned char *)"T: : : : : : : \r\n", 88 0 89 }; 90 91 static parse_cvt_fnc_t cvt_computime; 92 static parse_inp_fnc_t inp_computime; 93 94 clockformat_t clock_computime = 95 { 96 inp_computime, /* Computime input handling */ 97 cvt_computime, /* Computime conversion */ 98 0, /* no PPS monitoring */ 99 (void *)&computime_fmt, /* conversion configuration */ 100 "Diem's Computime Radio Clock", /* Computime Radio Clock */ 101 24, /* string buffer */ 102 0 /* no private data (complete packets) */ 103 }; 104 105 /* 106 * parse_cvt_fnc_t cvt_computime 107 * 108 * convert simple type format 109 */ 110 static u_long 111 cvt_computime( 112 unsigned char *buffer, 113 int size, 114 struct format *format, 115 clocktime_t *clock_time, 116 void *local 117 ) 118 { 119 120 if (!Strok(buffer, format->fixed_string)) { 121 return CVT_NONE; 122 } else { 123 if (Stoi(&buffer[format->field_offsets[O_DAY].offset], &clock_time->day, 124 format->field_offsets[O_DAY].length) || 125 Stoi(&buffer[format->field_offsets[O_MONTH].offset], &clock_time->month, 126 format->field_offsets[O_MONTH].length) || 127 Stoi(&buffer[format->field_offsets[O_YEAR].offset], &clock_time->year, 128 format->field_offsets[O_YEAR].length) || 129 Stoi(&buffer[format->field_offsets[O_HOUR].offset], &clock_time->hour, 130 format->field_offsets[O_HOUR].length) || 131 Stoi(&buffer[format->field_offsets[O_MIN].offset], &clock_time->minute, 132 format->field_offsets[O_MIN].length) || 133 Stoi(&buffer[format->field_offsets[O_SEC].offset], &clock_time->second, 134 format->field_offsets[O_SEC].length)) { 135 return CVT_FAIL | CVT_BADFMT; 136 } else { 137 138 clock_time->flags = 0; 139 clock_time->utcoffset = 0; /* We have UTC time */ 140 141 return CVT_OK; 142 } 143 } 144 } 145 146 /* 147 * parse_inp_fnc_t inp_computime 148 * 149 * grab data from input stream 150 */ 151 static u_long 152 inp_computime( 153 parse_t *parseio, 154 char ch, 155 timestamp_t *tstamp 156 ) 157 { 158 unsigned int rtc; 159 160 parseprintf(DD_PARSE, ("inp_computime(0x%lx, 0x%x, ...)\n", (long)parseio, ch)); 161 162 switch (ch) 163 { 164 case 'T': 165 parseprintf(DD_PARSE, ("inp_computime: START seen\n")); 166 167 parseio->parse_index = 1; 168 parseio->parse_data[0] = ch; 169 parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */ 170 return PARSE_INP_SKIP; 171 172 case '\n': 173 parseprintf(DD_PARSE, ("inp_computime: END seen\n")); 174 if ((rtc = parse_addchar(parseio, ch)) == PARSE_INP_SKIP) 175 return parse_end(parseio); 176 else 177 return rtc; 178 179 default: 180 return parse_addchar(parseio, ch); 181 } 182 } 183 184 #else /* not (REFCLOCK && CLOCK_PARSE && CLOCK_COMPUTIME) */ 185 int clk_computime_bs; 186 #endif /* not (REFCLOCK && CLOCK_PARSE && CLOCK_COMPUTIME) */ 187 188 /* 189 * clk_computime.c,v 190 * Revision 4.10 2005/04/16 17:32:10 kardel 191 * update copyright 192 * 193 * Revision 4.9 2004/11/14 15:29:41 kardel 194 * support PPSAPI, upgrade Copyright to Berkeley style 195 * 196 * Revision 4.6 1999/11/28 09:13:49 kardel 197 * RECON_4_0_98F 198 * 199 * Revision 4.5 1998/06/14 21:09:34 kardel 200 * Sun acc cleanup 201 * 202 * Revision 4.4 1998/06/13 12:00:38 kardel 203 * fix SYSV clock name clash 204 * 205 * Revision 4.3 1998/06/12 15:22:26 kardel 206 * fix prototypes 207 * 208 * Revision 4.2 1998/06/12 09:13:24 kardel 209 * conditional compile macros fixed 210 * printf prototype 211 * 212 * Revision 4.1 1998/05/24 09:39:51 kardel 213 * implementation of the new IO handling model 214 * 215 * Revision 4.0 1998/04/10 19:45:27 kardel 216 * Start 4.0 release version numbering 217 * 218 * from V3 1.8 log info deleted 1998/04/11 kardel 219 */ 220