Annotation of embedaddon/ntp/libparse/clk_hopf6021.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * /src/NTP/ntp4-dev/libparse/clk_hopf6021.c,v 4.10 2004/11/14 15:29:41 kardel RELEASE_20050508_A
        !             3:  *
        !             4:  * clk_hopf6021.c,v 4.10 2004/11/14 15:29:41 kardel RELEASE_20050508_A
        !             5:  *
        !             6:  * Radiocode Clocks HOPF Funkuhr 6021 mit serieller Schnittstelle
        !             7:  * base code version from 24th Nov 1995 - history at end
        !             8:  *
        !             9:  * Created by F.Schnekenbuehl <frank@comsys.dofn.de> from clk_rcc8000.c
        !            10:  * Nortel DASA Network Systems GmbH, Department: ND250
        !            11:  * A Joint venture of Daimler-Benz Aerospace and Nortel
        !            12:  *
        !            13:  * This program is distributed in the hope that it will be useful,
        !            14:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            15:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
        !            16:  *
        !            17:  */
        !            18: 
        !            19: #ifdef HAVE_CONFIG_H
        !            20: # include <config.h>
        !            21: #endif
        !            22: 
        !            23: #if defined(REFCLOCK) && defined(CLOCK_PARSE) && defined(CLOCK_HOPF6021)
        !            24: 
        !            25: #include "ntp_fp.h"
        !            26: #include "ntp_unixtime.h"
        !            27: #include "ntp_calendar.h"
        !            28: #include "ascii.h"
        !            29: 
        !            30: #include "parse.h"
        !            31: 
        !            32: #ifndef PARSESTREAM
        !            33: #include "ntp_stdlib.h"
        !            34: #include <stdio.h>
        !            35: #else
        !            36: #include "sys/parsestreams.h"
        !            37: extern int printf (const char *, ...);
        !            38: #endif
        !            39: 
        !            40: /* 
        !            41:  * hopf Funkuhr 6021 
        !            42:  *      used with 9600,8N1,
        !            43:  *      UTC ueber serielle Schnittstelle 
        !            44:  *      Sekundenvorlauf ON
        !            45:  *      ETX zum Sekundenvorlauf ON
        !            46:  *      Datenstring 6021
        !            47:  *      Ausgabe Uhrzeit und Datum
        !            48:  *      Senden mit Steuerzeichen
        !            49:  *      Senden sekuendlich
        !            50:  */
        !            51: 
        !            52: /*
        !            53:  *  Type 6021 Serial Output format
        !            54:  *
        !            55:  *      000000000011111111 / char
        !            56:  *      012345678901234567 \ position
        !            57:  *      sABHHMMSSDDMMYYnre  Actual
        !            58:  *       C4110046231195     Parse
        !            59:  *      s              enr  Check
        !            60:  *
        !            61:  *  s = STX (0x02), e = ETX (0x03)
        !            62:  *  n = NL  (0x0A), r = CR  (0x0D)
        !            63:  *
        !            64:  *  A B - Status and weekday
        !            65:  *
        !            66:  *  A - Status
        !            67:  *
        !            68:  *      8 4 2 1
        !            69:  *      x x x 0  - no announcement
        !            70:  *      x x x 1  - Summertime - wintertime - summertime announcement
        !            71:  *      x x 0 x  - Wintertime
        !            72:  *      x x 1 x  - Summertime
        !            73:  *      0 0 x x  - Time/Date invalid
        !            74:  *      0 1 x x  - Internal clock used 
        !            75:  *      1 0 x x  - Radio clock
        !            76:  *      1 1 x x  - Radio clock highprecision
        !            77:  *
        !            78:  *  B - 8 4 2 1
        !            79:  *      0 x x x  - MESZ/MEZ
        !            80:  *      1 x x x  - UTC
        !            81:  *      x 0 0 1  - Monday
        !            82:  *      x 0 1 0  - Tuesday
        !            83:  *      x 0 1 1  - Wednesday
        !            84:  *      x 1 0 0  - Thursday
        !            85:  *      x 1 0 1  - Friday
        !            86:  *      x 1 1 0  - Saturday
        !            87:  *      x 1 1 1  - Sunday
        !            88:  */
        !            89: 
        !            90: #define HOPF_DSTWARN   0x01    /* DST switch warning */
        !            91: #define HOPF_DST       0x02    /* DST in effect */
        !            92: 
        !            93: #define HOPF_MODE      0x0C    /* operation mode mask */       
        !            94: #define  HOPF_INVALID  0x00    /* no time code available */
        !            95: #define  HOPF_INTERNAL 0x04    /* internal clock */
        !            96: #define  HOPF_RADIO    0x08    /* radio clock */       
        !            97: #define  HOPF_RADIOHP  0x0C    /* high precision radio clock */
        !            98: 
        !            99: #define HOPF_UTC       0x08    /* time code in UTC */
        !           100: #define HOPF_WMASK     0x07    /* mask for weekday code */
        !           101: 
        !           102: static struct format hopf6021_fmt =
        !           103: {
        !           104:        {
        !           105:                {  9, 2 }, {11, 2}, { 13, 2}, /* Day, Month, Year */ 
        !           106:                {  3, 2 }, { 5, 2}, {  7, 2}, /* Hour, Minute, Second */ 
        !           107:                {  2, 1 }, { 1, 1}, {  0, 0}, /* Weekday, Flags, Zone */
        !           108:                /* ... */
        !           109:        },
        !           110:        (const unsigned char *)"\002              \n\r\003",
        !           111:        0 
        !           112: };
        !           113: 
        !           114: #define OFFS(x) format->field_offsets[(x)].offset
        !           115: #define STOI(x, y) Stoi(&buffer[OFFS(x)], y, format->field_offsets[(x)].length)
        !           116: #define hexval(x) (('0' <= (x) && (x) <= '9') ? (x) - '0' : \
        !           117:                   ('a' <= (x) && (x) <= 'f') ? (x) - 'a' + 10 : \
        !           118:                   ('A' <= (x) && (x) <= 'F') ? (x) - 'A' + 10 : \
        !           119:                   -1)
        !           120: 
        !           121: static unsigned long cvt_hopf6021 (unsigned char *, int, struct format *, clocktime_t *, void *);
        !           122: static unsigned long inp_hopf6021 (parse_t *, unsigned int, timestamp_t *);
        !           123: 
        !           124: clockformat_t clock_hopf6021 =
        !           125: {
        !           126:   inp_hopf6021,                        /* HOPF 6021 input handling */
        !           127:   cvt_hopf6021,                 /* Radiocode clock conversion */
        !           128:   0,                           /* no direct PPS monitoring */
        !           129:   (void *)&hopf6021_fmt,        /* conversion configuration */
        !           130:   "hopf Funkuhr 6021",          /* clock format name */
        !           131:   19,                           /* string buffer */
        !           132:   0                            /* private data length, no private data */
        !           133: };
        !           134: 
        !           135: static unsigned long
        !           136: cvt_hopf6021(
        !           137:             unsigned char *buffer,
        !           138:             int            size,
        !           139:             struct format *format,
        !           140:             clocktime_t   *clock_time,
        !           141:             void          *local
        !           142:             )
        !           143: {
        !           144:        unsigned char status,weekday;
        !           145: 
        !           146:        if (!Strok(buffer, format->fixed_string))
        !           147:        {
        !           148:                return CVT_NONE;
        !           149:        }
        !           150: 
        !           151:        if (  STOI(O_DAY,   &clock_time->day)    ||
        !           152:              STOI(O_MONTH, &clock_time->month)  ||
        !           153:              STOI(O_YEAR,  &clock_time->year)   ||
        !           154:              STOI(O_HOUR,  &clock_time->hour)   ||
        !           155:              STOI(O_MIN,   &clock_time->minute) ||
        !           156:              STOI(O_SEC,   &clock_time->second)
        !           157:              )
        !           158:        {
        !           159:                return CVT_FAIL|CVT_BADFMT;
        !           160:        }
        !           161: 
        !           162:        clock_time->usecond   = 0;
        !           163:        clock_time->utcoffset = 0;
        !           164: 
        !           165:        status = hexval(buffer[OFFS(O_FLAGS)]);
        !           166:        weekday= hexval(buffer[OFFS(O_WDAY)]);
        !           167: 
        !           168:        if ((status == 0xFF) || (weekday == 0xFF))
        !           169:        {
        !           170:                return CVT_FAIL|CVT_BADFMT;
        !           171:        }
        !           172: 
        !           173:        clock_time->flags  = 0;
        !           174: 
        !           175:        if (weekday & HOPF_UTC)
        !           176:        {
        !           177:                clock_time->flags |= PARSEB_UTC;
        !           178:        }
        !           179:        else
        !           180:        {
        !           181:                if (status & HOPF_DST)
        !           182:                {
        !           183:                        clock_time->flags     |= PARSEB_DST;
        !           184:                        clock_time->utcoffset  = -2*60*60; /* MET DST */
        !           185:                }
        !           186:                else
        !           187:                {
        !           188:                        clock_time->utcoffset  = -1*60*60; /* MET */
        !           189:                }
        !           190:        }
        !           191: 
        !           192:        clock_time->flags |= (status & HOPF_DSTWARN)  ? PARSEB_ANNOUNCE : 0;
        !           193: 
        !           194:        switch (status & HOPF_MODE)
        !           195:        {
        !           196:            case HOPF_INVALID:  /* Time/Date invalid */
        !           197:                clock_time->flags |= PARSEB_POWERUP;
        !           198:                break;
        !           199: 
        !           200:            case HOPF_INTERNAL: /* internal clock */
        !           201:                clock_time->flags |= PARSEB_NOSYNC;
        !           202:                break;
        !           203: 
        !           204:            case HOPF_RADIO:    /* Radio clock */
        !           205:            case HOPF_RADIOHP:  /* Radio clock high precision */
        !           206:                break;
        !           207: 
        !           208:            default:
        !           209:                return CVT_FAIL|CVT_BADFMT;
        !           210:        }
        !           211: 
        !           212:        return CVT_OK;
        !           213: }
        !           214: 
        !           215: /*
        !           216:  * inp_hopf6021
        !           217:  *
        !           218:  * grep data from input stream
        !           219:  */
        !           220: static u_long
        !           221: inp_hopf6021(
        !           222:             parse_t      *parseio,
        !           223:             unsigned int  ch,
        !           224:             timestamp_t  *tstamp
        !           225:          )
        !           226: {
        !           227:        unsigned int rtc;
        !           228:        
        !           229:        parseprintf(DD_PARSE, ("inp_hopf6021(0x%lx, 0x%x, ...)\n", (long)parseio, ch));
        !           230:        
        !           231:        switch (ch)
        !           232:        {
        !           233:        case ETX:
        !           234:                parseprintf(DD_PARSE, ("inp_hopf6021: EOL seen\n"));
        !           235:                parseio->parse_dtime.parse_stime = *tstamp; /* collect timestamp */
        !           236:                if ((rtc = parse_addchar(parseio, ch)) == PARSE_INP_SKIP)
        !           237:                        return parse_end(parseio);
        !           238:                else
        !           239:                        return rtc;
        !           240: 
        !           241:        default:
        !           242:                return parse_addchar(parseio, ch);
        !           243:        }
        !           244: }
        !           245: 
        !           246: #else /* not (REFCLOCK && CLOCK_PARSE && CLOCK_HOPF6021) */
        !           247: int clk_hopf6021_bs;
        !           248: #endif /* not (REFCLOCK && CLOCK_PARSE && CLOCK_HOPF6021) */
        !           249: 
        !           250: /*
        !           251:  * History:
        !           252:  *
        !           253:  * clk_hopf6021.c,v
        !           254:  * Revision 4.10  2004/11/14 15:29:41  kardel
        !           255:  * support PPSAPI, upgrade Copyright to Berkeley style
        !           256:  *
        !           257:  * Revision 4.7  1999/11/28 09:13:49  kardel
        !           258:  * RECON_4_0_98F
        !           259:  *
        !           260:  * Revision 4.6  1998/11/15 20:27:57  kardel
        !           261:  * Release 4.0.73e13 reconcilation
        !           262:  *
        !           263:  * Revision 4.5  1998/06/14 21:09:35  kardel
        !           264:  * Sun acc cleanup
        !           265:  *
        !           266:  * Revision 4.4  1998/06/13 12:02:38  kardel
        !           267:  * fix SYSV clock name clash
        !           268:  *
        !           269:  * Revision 4.3  1998/06/12 15:22:27  kardel
        !           270:  * fix prototypes
        !           271:  *
        !           272:  * Revision 4.2  1998/06/12 09:13:25  kardel
        !           273:  * conditional compile macros fixed
        !           274:  * printf prototype
        !           275:  *
        !           276:  * Revision 4.1  1998/05/24 09:39:52  kardel
        !           277:  * implementation of the new IO handling model
        !           278:  *
        !           279:  * Revision 4.0  1998/04/10 19:45:29  kardel
        !           280:  * Start 4.0 release version numbering
        !           281:  *
        !           282:  * from V3 3.6 log info deleted 1998/04/11 kardel
        !           283:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>