Program overview:
The p12mprogram consists of 1 main
programs with 3 cooperating threads:
- p12mMain.c : main program.
- p12mXfThr.c: thread that controls the 12meter (via
ethernet). Does ra,dec -> az,el once a second.
Xf=transformation
- p12mLogThr.c: does logging of stat info once a second..to
disc and broadcast packets.
- p12mIoThr.c: handles i/o between external user and
p12mProg. Passes requests on to p12mXfThr
p12mMain.c: main program
p12Main program flow is:
- process user options
- initialization:
- data structs: location, precession,nutation structs,
utcToUt1,
- get lock file to make sure just 1 copy of p12mProg
- connect to p12m telescope controller via ethernet
- initialize the aoQueues used for thread communication,
and io buffer free list
- Start threads:
- start p12mXfThr.c: thread that controls the 12meter,
does 1 sec ra,dec -> az el
- start p12mLogThr.c : logging thread. writes status
info to disk and network once a sec.. also error
messages
- start p12mIoThr.c: thread to handle external user
requests, and then pass the requests to p12mXfThr
- currently there can be a maximum of 5 io threads
active at one time.
- Enter main loop:
- wait (with timeout) for external user connect request:
- If signal present, goto cleanup ,exit
- the signal handler catches: SIGHUP,SIGINT,SIGTERM
- If connect request, start p12mIoThr for this
request. log in active ioThr table
- If timeout (no connect request) check if any
ioThreads have exited.. if so, do resource cleanup.
- cleanup:
- free up resources, clear lock file, exit.
A number of routines common to the other
threads are located in p12mProg.c
- sleepSecs: wait routine
- msgThrToThr, putNodeQ, getNodeQ: thread to thread
communication
- For interthread communication aoQueues are used.
- p12mXfThr and p12mLogThr both have input queues based
on aoQueues.
- the queue is a linked list of nodes with a semaphore
protecting access.
- timeDifSec: compute time differences between 2 times
- dbgOut: output debugging info
- messageLxxxx : send warning, error messages from threads
to syslog
Miscellaneous details:
- Linux time (secs from 1970) is used to track many times.
- This get around the wrapping at midnite or years.
- The program was originally written to use the 12meter
track array option..
- you send time stamped az,el positions ahead of time to
the controller.
- It uses the previous and next points to compute a
velocity.
- This caused large accelerations, de accelerations at
the end of a cross strip (more info).
- The program was then switched to use ramp mode.
- We control the position with az,el positions (we
don't use the ra,dec option of the 12m controller)
- We run the controller in utc time (rather than ut1). Ut1
difference is taken in account when converting from ra,dec
to az,del.
- At each 1 sec tick
- the ra,dec is converted to az,el for curtime
(including offsets and rates)
- the ra,dec is converted to az,el for curTime +1 sec in
future (including offsets and rates)
- The starting position, timestamp, and velocity will be
sent to the p12m controller where is will be acted
on immediately
- The trajectory will continue with the specified
velocity until a new ramp value is received (on the
next second).
- The IoThr occasionally wants status info that is stored in
the xfThr status blocks during the 1 sec tick processing (to
send back to the requester).
- Rather than go through the cmdQueue for request, reply..
ioThr can access info in the XfThr struct in a read only
mode:
- pxfI->tickI.secMidBusy is a
sentinel
- It is set to minus the current time when
xfThr starts to modify it's status block,
- It is set to plus the current time xfThr is done
- IoThr checks this flag. If negative, it will wait a few
millisecs and try again. This repeats till it gets the
data or times out.