windows-nt/Source/XPSP1/NT/base/cluster/timeserv/inc/tsconfig.h
2020-09-26 16:20:57 +08:00

211 lines
7.5 KiB
C

#ifndef __TSCONFIG_H
#define __TSCONFIG_H
#ifndef BASEONLY
#define BASEONLY 0
#endif
//note to builders: the VERBOSE (and PING/P5_DEBUG/TESTHILO/CHICO/NOVELL, etc)
// should be commented out for test & release builds!
//#define VERBOSE //for potentially interesting messages to Doug & Arnold (developers)
//#define TAPI //for using TAPI (won't work without TAPI32.DLL) - not done
//#define NOVELL //for playing around with time from Netware (won't work without two DLLs)
//#define CHICO //for trying to make things work on Windows 95 (if so, compile m ust be on x86)
//#define PING //for testing Internet delay to NIST, uses ICMP
//#define ENUM //enumerates all timesources on the network (don't include)
//#define PERF //for using QueryPerformanceFrequency/Counter
//#define P5_DEBUG //for toying around with Pentium's RDTSC instruction (10ns co unter)
//#define TESTHILO //loops so that GC-100x sub-tenths (et al) can be compared to bc620AT and adjusted
//#define AEC //for AEC-BOX code (doesn't find BREAK reliably, so not normally b uilt)
// #define TRUETIME //for TrueTime format, not tested yet
#define KENR //for CMOS
#ifdef P5_DEBUG
#define rdtsc __asm __emit 0x0F __asm __emit 0x31 //the RDTSC instruction
DWORD hi32, lo32; //where we'll put edx & eax
DWORD hi32temp, lo32temp;
#define P5START __asm {\
__asm push edx\
rdtsc\
__asm mov hi32temp,edx\
__asm pop edx\
__asm mov lo32temp,eax\
}
#define P5END __asm {\
__asm push edx\
rdtsc\
__asm mov hi32,edx\
__asm pop edx\
__asm mov lo32,eax\
}\
printf("66MHz RDTSC diff=%.7fs\n",((float)hi32*65536*65536+lo32-((float)hi32temp*65536*65536+lo32temp))*1/66666666.7);\
printf("166MHz RDTSC diff=%.7fs\n",((float)hi32*65536*65536+lo32-((float)hi32temp*65536*65536+lo32temp))*1/166666666.7);//display
#else //if not P5_DEBUG, we want these to be blank
#define P5START
#define P5END
#endif
#define rollover() if (++nt.wSecond >59) {nt.wSecond=0; if (++nt.wMinute >59) {nt.wMinute=0; if (++nt.wHour>23) fTimeFailed = TRUE;}}
//note unfortunately the above rollover routine will skip any leap second, but i t would be so rare anyway...
#define MAXTYPE 32 // please maintain this
#define NZ 31 // for New Nealand
#define RCC 30//for Radiocode Clocks MSF, etc
#define CMOS 29//for CMOS RTC
#define TTPC16 28//for board level PC-SG2
#define PC03XT 27//for old board from Bancomm
#define TTK 26//for Kinemetrics style
#define TTTL3 25//for TL-3 WWV
#define MOBATIME 24//for IF482 Mobaline/RS232 DCF77 receiver
#define PCLTC 23//for AEC PC-LTC/IOR (what about VITC?)
#define AECBOX 22//AEC-BOX 1/2/10/20 for VITC, etc
#define AMDAT 21//for ADC-60 MSF/DCF77 receiver
#ifdef NOVELL
#define NETWARE 20
#endif
#define HP 19 //for 58503A Time and Frequency Reference Receiver or 59551A - not tested well
#define ATOMIC 18 //for 1PPS only
#define NMEA 17
#define SPECTRACOM 16
#define BC630AT 15
#define NTP 14
#define MOTOROLA 13
#define ROCKWELL 12
#define TRIMBLE 11
#define EUROPE 10
#define COMPUTIME 9
#define NRCBBC 8
#define BC620AT 7
#define GC1001 6
#define GC1000 5
#define USNO 4
#define NISTACTS 3
#define INTERNET 2
//
// N.B. The order of the following two must remain as is and these must be the
// lowest numbered types. So keepa ya hands offa this.
//
#define PRIMARY 1
#define SECONDARY 0
#define DEFAULT_TYPE 0xFFFF
#define SERVICE 1
#define ANALYSIS 2
#if 1
#define LOCAL FALSE
#define MODEM FALSE
#define RECEIVER FALSE
#else
#define LOCAL (type==GC1000)||((type==BC620AT)&&bclocal)||(type==COMPUTIME)||(uselocal)||(type==AMDAT)||(type==MOBATIME)||(type==CMOS)
#define MODEM (type==NISTACTS)||(type==USNO)||(type==NRCBBC)||(type==EUROPE)||(type==COMPUTIME)||(type==NZ)
#define RECEIVER (type==SPECTRACOM)||(type==HP)||(type==MOTOROLA)||(type==GC1000)||(type==GC1001)||(type==ROCKWELL)||(type==TRIMBLE)||(type==AMDAT)||(type==NMEA)||(type==AECBOX)||(type==MOBATIME)||(type==TTTL3)||(type==RCC)||(type==TTK)
#endif
#define NETWORKTYPE(type) \
((type == NTP) || (type == PRIMARY) || (type == SECONDARY))
#define JITTER_LIMIT 50
#define NextSkewX(x) x++
#define ModSkew(x) (x % SKEWHISTORYSIZE)
#define SECTION TEXT("timeserv")
#define PROFILE TEXT("timeserv.ini")
#define DEFAULT(x) x.element[0].key
#define CLUSTER_PERIOD 0xFFFC
#define BIDAILY_PERIOD 0xFFFF
#define TRIDAILY_PERIOD 0xFFFE
#define WEEKLY_PERIOD 0xFFFD
#define SPECIAL_PERIOD_FLOOR 0xFFFC
#if BASEONLY == 0
#define LegalType(x) (x < MAXTYPE)
#else
#define LegalType(x) ((x == PRIMARY) \
|| \
(x == SECONDARY) \
|| \
(x == NTP))
#endif
#define MAX_THREADS_IN_SERVER 8
#define TSKEY TEXT("SYSTEM\\CurrentControlSet\\Services\\TimeServ\\Parameters")
#define SECOND_TICKS (1000L)
#define MINUTE_TICKS (60 * SECOND_TICKS)
#define HOUR_TICKS (60 * MINUTE_TICKS)
#define DAY_TICKS (24 * HOUR_TICKS)
#define MAXBACKSLEW (3 * MINUTE_TICKS) // max back correction allowed
#define CLUSTERSHORTINTERVAL (45 * MINUTE_TICKS)
#define CLUSTERLONGHOURS (8)
#define CLUSTERLONGINTERVAL (CLUSTERLONGHOURS * HOUR_TICKS)
//
// ERRORPART is the minimum contribution that the inherent clock frequency
// is allowed to introduce. This is used as a multiplier of the clock
// frequency to be the floor for the clock error to which a skew correction
// can be applied. In other words, if F is the number of ms per clock tick,
// then the minimum clockerror that can be used is:
// F * 2 * ERRORPART
// The 2 is used to compensate for two clocks.
//
// If you change the value, please update the following explanation:
//
// The number 7 was chosen to give the best resolution for the "cluster"
// mode. In this mode, we wish to do a "quick", around 3 hours, slew analysis
// to ensure that the clocks are reasonably close. The value 7 means
// that a three hour sample must produce an error > 140 ms in order for
// skew correction to happen. This is the equivalent of almost 1.2 secs/day
// of error. Then we wish to lapse into a "long" cycle, namely 8 hours,
// before sampling. A 1.2 sec/day error sampled each 8 hours allows for
// 400 ms of observed error, or just within the bounds of 1/2 sec of skew
// among the cluster systems. Using 7 means we are tolerating 1 part in
// 7 of error, or around 15%. It's not great, but it's probably good
// enough.\
//
// Note also that 140 is very close to 1/2 of the minimum clock correction
// applied over 8 hours. The correction of 1 part is about 296 ms over
// 8 hours. 1/2 of that is about 148 ms. So, using 7 not only provides
// a good management of measurement error, it also is very close
// to the minimum skew correction it makes sense to apply. What this
// says is that in a cycle of 8 hours or more, the filter based on
// ERRORPART is probably unnecessary, hence it exists principally
// for catching errors over smaller measurement intervals. And that
// is the intent.
//
#define ERRORPART 7
#define ERRORMINIMUM(x) (x * 2 * ERRORPART)
//
// N.B. Another factor to consider is that one tick of the system clock, or
// 100 ns, adjustment produces a change of 864 ms/day. So, in principle,
// any adjustement for a skew of less than 864 ms a day is unstable and will
// produce precesion. Of course, by changing the adjustment periodically,
// it is possible to get two clocks that disagree by less than 864 ms/day
// to come into better agreement, but it requires a constant adjustment
// of at least one of the clocks.
//
#define MAXSKEWCORRECT 30000 // max ms/day error we will correct.
#define MAXERRORTOALLOW 500 // keep it within this
#endif // TSCONGIF