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