Index: /trunk/Ohana/src/opihi/pcontrol/outline.txt
===================================================================
--- /trunk/Ohana/src/opihi/pcontrol/outline.txt	(revision 42968)
+++ /trunk/Ohana/src/opihi/pcontrol/outline.txt	(revision 42968)
@@ -0,0 +1,35 @@
+
+* top-level:
+
+  * main
+    * opihi
+      * general_init (lib.shell/startup.c)
+      * program_init (pcontrol/pcontrol.c.in)
+      	note: launches CheckSystem_Threaded 
+      - loop forever
+      	* opihi_readline
+	* multicommand
+
+
+* thread:
+  * CheckSystem_Threaded
+    * CheckBusyJobs
+    * CheckDoneJobs
+    * CheckKillJobs
+    * CheckRespHosts
+    * CheckDoneHosts
+    * CheckDownHosts
+    * CheckIdleHosts (4x, for each job stage: NEEDHOST, WANTHOST, ANYHOST, OLDWANT)
+    * CheckLiveHosts
+
+** Host Ops:
+   * AddHost
+     PutHost (ALLHOSTS)
+     PutHost (DOWN)
+
+   * StartHost
+     PutHost (IDLE) or PutHost (DOWN) [failure]
+
+   * CheckRespHost
+     
+   * CheckDown
Index: /trunk/Ohana/src/tools/src/psps_objid_to_radec.c
===================================================================
--- /trunk/Ohana/src/tools/src/psps_objid_to_radec.c	(revision 42968)
+++ /trunk/Ohana/src/tools/src/psps_objid_to_radec.c	(revision 42968)
@@ -0,0 +1,75 @@
+# include <ohana.h>
+# include <gfitsio.h>
+# include "inttypes.h"
+
+void usage ();
+uint64_t CreatePSPSObjectID(double ra, double dec);
+
+int main (int argc, char **argv) {
+
+  if (argc != 2) usage ();
+  char *input = argv[1];
+
+  FILE *f = fopen (input, "r");
+  if (f == (FILE *) NULL) {
+    fprintf (stderr, "can't open file %s\n", input);
+    exit (1);
+  }
+
+  double zh = 0.0083333;
+
+  long long int objid;
+
+  char name[128];
+  fscanf (f, "%s", name);
+
+  while (fscanf (f, "%lld", &objid) != EOF) {
+
+    long long int izone = objid / 10000000000000;
+
+    long long int p1 = izone * 10000000000000;
+
+    long long int rzone = (objid - p1) / 10000;
+
+    long long int p2 = rzone * 10000;
+
+    long long int zresid = objid - p1 - p2;
+
+    double ra = rzone / 1000000.0;
+    
+    double dec = (izone + zresid / 10000.0) * zh - 90.0;
+
+    // long long int objnew = CreatePSPSObjectID (ra, dec);
+
+    // int dID = objid - objnew;
+    
+    // fprintf (stderr, "%lld %lld %d %lld %09lld %04lld %10.6f %10.6f\n", objid, objnew, dID, izone, rzone, zresid, ra, dec);
+
+    fprintf (stdout, "%lld %10.6f %10.6f\n", objid, ra, dec);
+  }
+
+  exit (0);
+}
+
+void usage () {
+  fprintf (stderr, "USAGE: pspsconvert [-h] (table.fits) (outroot)\n");
+  exit (2);
+}
+
+    
+uint64_t
+CreatePSPSObjectID(double ra, double dec)
+{
+    double zh = 0.0083333;
+    double zid = (dec + 90.) / zh;             // 0 - 180*60*2 = 21600 < 15 bits
+    int izone = (int) floor(zid);
+    double zresid = zid -  ((float) izone);    // 0.0 - 1.0
+
+    uint64_t part1, part2, part3;
+    part1 = (uint64_t)( izone  * 10000000000000LL) ; // 10,000,000,000,000
+    part2 = ((uint64_t)(ra * 1000000.)) * 10000 ; // 0 - 360*1e6 = 3.6e8 (< 29 bits)
+    part3 = (int) (zresid * 10000.0) ; // 0 - 10000 (1 bit == 30/10000 arcsec) (< 14 bits)
+
+    return part1 + part2 + part3;
+}
+
