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