Lady Heather's Disciplined Oscillator Control Program

This program monitors and controls the operation of various GPS-disciplined frequency standards. Currently-supported models include the Trimble Thunderbolt, Thunderbolt-E, Nortel NTGS50AA series, Resolution-T, and Resolution SMT receivers.

Download Lady Heather V3.10 of June 18, 2012 (Windows setup program)

Download Lady Heather V4.00 (beta) of April 27, 2016 (Windows setup program)

Download Lady Heather V4.00 (beta) of April 27, 2016 (.zip archive with all source files)

Linux build instructions (readme.txt) for beta version

Note: After running the Windows setup program, the C++ sources and makefile will be installed in the same directory as the executable.

Copyright (C) 2008-2016 Mark S. Sims - all rights reserved
Permission granted for free noncommercial use and distribution
Win32 version and TCP/IP server by John Miles, KE5FX (
Allan deviation code adapted from Tom Van Baak's adev1.c
Temperature and oscillator control algorithms by Warren Sarkinson
Easter and moon-phase code from

Users of GPSDOs other than the Thunderbolt models should review the comment header in HEATHER.CPP for specific notes.

Command-line Options for Current Release (V3.XX)

Startup command line options should be placed on the TARGET line in the
Lady Heather program PROPERTIES or in the HEATHER.CFG file.  Most can also
be executed with the keyboard / command.  Valid startup command options are:

             /#               - use COM# instead of COM1 default (#=1..99)
             /0               - disable com port processing (if just reading a log file)
             /ip=addr[:port#] - connect to TSIP server instead of local COM port
             /a[=#]           - number of points to calc Adevs over (default=330000)
                                If 0,  then all adev calculations are disabled.
             /b[=#]           - set daylight savings time area (1=USA,2=EURO,3=AUST,4=NZ)
             /b=nth,start_day,month,nth,end_day,month,hour - set custom DST rule
                                day:0=Sun..6=Sat  month:1=Jan..12=Dec
                                nth>0 = from start of month  nth<0 = from end of month
             /c[=#]           - set Cable delay to # ns (default=77.03 ns (50 ft std coax))
             /c=#f              set Cable delay in feet of 0.66Vp coax
             /c=#m              set Cable delay in meters of 0.66Vp coax
             /d#              - show dates in calendar #)
                                A)fghan   haaB)     C)hinese  D)ruid   H)ebrew
                                I)slamic  J)ulian   K)urdish  M)jd    iN)dian
                                P)ersian  iS)o      T)zolkin  X)iuhpohualli  
                                maY)an    aZ)tec Tonalpohualli
             /e               - do not log message/time Errors and state changes
             /f               - start in Fullscreen mode
             /f[psak]         - toggle Pv,Static,Altitude,Kalman filter
             /g[#]            - toggle Graph enable (#= a,b,c,d,e,h,l,m,o,p,s,t,u,x,z)
                                (Adevs  Both map and adev tables  sat_Count  Dac  Errors
                                 Holdover  K(constallation changes)  L(hide Location)
                                 Map,no adev tables   Osc  Pps  R(RMS info)   Sound  Temperature
                                 Update/scroll plot continuously  Watch  X(dops)  Z(clock)
                                 j(el mask)  n(disable holiday greetings)
             /h=file          - read command line options from .CFG config file
             /i[=#]           - set plot Interval to # seconds (default=24 hour mode)
             /j[=#]           - set ADEV sample period to # seconds (default=10 seconds)
             /k               - disable Keyboard commands
             /kb              - disable Beeps
             /kc              - disable all writes to Config EEPROM
             /km              - disable mouse
             /kt              - disable Windows dialog/message timer
             /k[?=#]          - set temp control parameter '?'
             /l[=#]           - write Log file every # seconds (default=1)
             /lh              - don't write timestamp headers in the log file
             /m[=#]           - Multiply all plot scale factors by # (default is to double)
             /ma              - toggle Auto scaling
             /md[=#]          - set DAC plot scale factor (microvolts/divison)
             /mi              - invert pps and temperature plots
             /mo[=#]          - set OSC plot scale factor (parts per trillion/divison)
             /mp[=#]          - set PPS plot scale factor (nanoseconds/divison)
             /mt[=#]          - set TEMPERATURE plot scale factor (millidegrees/divison)
             /n=hh:mm:ss      - exit program at specified time (optional: /n=month/day/year)
             /na=hh:mm:ss     - sound alarm at specified time (optional: /n=month/day/year)
             /na=#?           - sound alarm every #s secs,  #m mins,  #h hours  #d=days
             /na=#?o          - sound alarm Once in #so secs,  #mo mins,  #ho hours  #d=days
             /nd=hh:mm:ss     - dump screen at specified time (optional: /n=month/day/year)
             /nd=#?           - dump screen every #s secs,  #m mins,  #h hours  #d=days
             /nd=#?o          - dump screen Once in #so secs,  #mo mins,  #ho hours  #d=days
             /nl=hh:mm:ss     - dump log at specified time (optional: /n=month/day/year)
             /nl=#?           - dump log every #s secs,  #m mins,  #h hours  #d=days
             /nl=#?o          - dump log Once in #so secs,  #mo mins,  #ho hours  #d=days
             /nt              - attempt to wake up Nortel NTGxxxx receivers
             /nx=hh:mm:ss     - exit program at specified time (optional: /n=month/day/year)
             /nx=#?o          - exit program in #s secs,  #m mins,  #h hours  #d=days
             /o[#]            - select ADEV type (#=A,H,M,T, O,P)
                                Adev  Hdev  Mdev  Tdev  O=all osc types  P=all pps types
             /p               - disable PPS output signal
             /q[=#]           - set size of plot Queue in seconds (default=30 days)
             /qf[=#]          - set max size of FFT (default=4096)
             /r[=file]        - Read file (default=TBOLT.LOG)
                                .LOG=log   .SCR=script   .LLA=lat/lon/altitude
                                .ADV=adev  .TIM=ti.exe time file
             /rt              - use Resolution-T serial port config (9600,8,O,1)
             /ss[=#]          - do Self Survey (# fixes,  default=2000)
             /sp[=#]          - do Precison Survey (# hours,  default/max=48)
             /sf              - enter 2D/3D fix mode and map fixes
             /t=#SSSSS/DDDDD  - show time at local time zone - #=gmt offset
                                SSSSS=standard time zone id   DDDDD=daylight time zone id
                                (note:  western hemisphere # is negative:  /T=-6CST/CDT)
             /ta              - show dates in European format.
             /tb=string       - set analog clock brand name.
             /tc              - show Celcius temperatures
             /td              - show DeLisle temperatures
             /te              - show Reaumur temperatures
             /tf              - show Fahrenheit temperatures
             /tg              - sync outputs to GPS Time (default is UTC time)
             /tj              - don't remove effects of tbolt firmware temperature smoothing
             /th[=#]          - chime clock mode.  Chimes # times per hour.
                                Tries to play \WINDOWS\MEDIA\HEATHER_CHIME.WAV,  else uses alarm sound.
             /th[=#H]         - cuckoo clock mode.  Sings .WAV files # times per hour.
                                Tries to play \WINDOWS\MEDIA\HEATHER_CHIME.WAV,  else uses alarm sound.
                                Chimes the hour number on the hour,  one chime at other times.
             /th[=#S]         - singing chime clock mode.  Sings .WAV files # times per hour.
                                Tries to play \WINDOWS\MEDIA\HEATHER_SONGxx.WAV (xx=minute)
             /tk              - show Kelvin temperatures
             /tm              - show altitude in meters
             /tn              - show Newton temperatures
             /to              - show Romer temperatures
             /tp              - show time as fraction of a day
             /tq              - show time as total seconds of the day
             /ts[odhm]        - set operating system time to UTC (once,daily,hourly,every minute)
             /tsa[=#]         - set operating system time to UTC anytime difference exceeds # msecs
             /tsx[=#]         - compensate for delay between 1PPS output and receiver timing message
                                Value is in milliseconds.  Default is a +45 millisecond delay
             /tt=#            - set active temp control setpoint to # degrees C
             /tu              - sync outputs to UTC Time (default is UTC time)
             /tw[=#]          - Sleep() for this many milliseconds when idle (default=10)
             /tx              - show osc values with eXponent (default is ppb/ppt)
             /t'              - show altitude in feet
             /t"              - use degrees.minutes.seconds for lat/lon
             /u               - toggle plot/adev queue Updates
             /vt              - Text only Video screen
             /vu              - Undersized (640x480) Video screen
             /vs              - Small (800x600) Video screen
             /vn              - Netbook (1000x540) Video screen
             /vm              - Medium (1024x768) Video screen (default)
             /vl              - Large (1280x1024) Video screen
             /vv              - Very large (1440x900) Video screen
             /vx              - eXtra large (1680x1050) Video screen
             /vh              - Huge (1920x1080) Video screen
             /vc=rowsXcols    - custom screen size (e.g. /vc=1200x800)
             /wa=file         - set log file name to Append to (default=TBOLT.LOG)
             /w=file          - set log file name to Write (default=TBOLT.LOG)
             /x[=#]           - set plot display data filter count (default=10)
             /y               - optimize plot grid for 24 hour display (/y /y = 12hr)
             /y=#             - set plot view time to # minutes/division
             /z[#][=val]      - toggle or set graph zero line ref value (#=d,o,p,t)
                                (D)ac volts  (O)sc   (P)ps ns  (T)temp deg
             /+               - sync PPS signal rising edge to time
             /-               - sync PPS signal falling edge to time
             /^               - sync OSC signal falling edge to time

Put .CFG file, if any, in directory containing heather.exe.

Remote Operation

In addition to the Thunderbolt's usual serial connection, Lady Heather can communicate with a remotely-located Thunderbolt using the /ip=addr[:port] command-line option. To enable remote access to your Thunderbolt, you'll need to connect a PC to both the Thunderbolt and your LAN or Internet gateway, then run Heather's TCP/IP server. This server is a Windows batch file, located at c:\program files\heather\serve.bat by default.

The server will allow up to eight instances of heather.exe to access your Thunderbolt at once. Each client instance can access all of Heather's supervisory and control functions, just as if it were connected directly to the Thunderbolt.

As an example:

	Start... Run cmd.exe
	cd "\program files\heather"
	serve com1
... will launch the server, allowing network access to a Thunderbolt at COM1. The server's startup banner will include the PC's TCP/IP host address; e.g.:
        Lady Heather's Control Server V0.90 of Dec  6 2009            John Miles, KE5FX
        Press ESC to terminate                              

[12/6/2009 1:36:53 PM] Initializing host "jmcore", address, Windows Sockets V1.1 (WinSock 2.0)
You can now launch Heather with a command or Windows shortcut such as the following:
	heather /ip=
This will work from any Windows PC on your LAN, including the one running the server if desired. If you want to access the Thunderbolt from a PC on the Internet at large, you'll need to open port 45000 in your cable/DSL modem or NAT gateway and associate it with the host located at (in this case).

When providing access to multiple Thunderbolts on one PC, you'll need to specify different port numbers for each device's server instance. To continue the example, a server launched with

        serve com1 /port=40000
could be accessed with
        heather /ip=

Hints and Kinks


Source code compilable with most versions of MSVC from VS6 to current Visual Studio .NET release, including the free Microsoft Visual Studio Express package.
No warranties, expressed or implied, are offered with this program.
Use at your own risk!