Add telescope eod j2000 option (#48)

* Increase precision of telescope conversion constants.
* Add option to allow telescope to use either astrometric, J2000, or
  apparent coordinates at current epoch.

This work began from a request for a new feature from a user in South
Africa. We worked together both on the requirements and testing after I
sent him these changed files. I also tested against my telescope
simulator and both of us agreed these changes work well.

Along the way we discovered one tiny source of error was in these two
values used for the conversion of dec in degrees and RA in hours to
radians, so I computed them to insane accuracy and pasted them in. Now
that particular limitation will never appear again :-)
This commit is contained in:
pidloop 2021-12-14 19:34:56 -07:00 committed by Brandon Rhodes
parent 82796f75f8
commit 23fa71ba9f
2 changed files with 52 additions and 31 deletions

View File

@ -219,21 +219,22 @@ String fallbacks[] = {
"XEphem*INDIConfig*EDBValue.value: Mount.GOTOedb.edb",
"XEphem*INDIConfig*EnableEDB.set: False",
"XEphem*INDIConfig*EnableRADec.set: False",
"XEphem*INDIConfig*TelEOD.set: False",
"XEphem*INDIConfig*GotoDecOffset.value: 0",
"XEphem*INDIConfig*GotoDecSlope.value: .0174532925",
"XEphem*INDIConfig*GotoDecSlope.value: .01745329251994329576",
"XEphem*INDIConfig*GotoDecValue.value: Telescope.SetRADec2K.Dec",
"XEphem*INDIConfig*GotoRAOffset.value: 0",
"XEphem*INDIConfig*GotoRASlope.value: .2617993875",
"XEphem*INDIConfig*GotoRASlope.value: .26179938779914943653",
"XEphem*INDIConfig*GotoRAValue.value: Telescope.SetRADec2K.RA",
"XEphem*INDIConfig*Host.value: localhost",
"XEphem*INDIConfig*JDOffset.value: -2415020",
"XEphem*INDIConfig*JDSlope.value: 1",
"XEphem*INDIConfig*JDValue.value: Mount.Date.JD",
"XEphem*INDIConfig*LatitudeOffset.value: 0",
"XEphem*INDIConfig*LatitudeSlope.value: .0174532925",
"XEphem*INDIConfig*LatitudeSlope.value: .01745329251994329576",
"XEphem*INDIConfig*LatitudeValue.value: Mount.GEOGRAPHIC_COORD.LAT",
"XEphem*INDIConfig*LongitudeOffset.value: 0",
"XEphem*INDIConfig*LongitudeSlope.value: .0174532925",
"XEphem*INDIConfig*LongitudeSlope.value: .01745329251994329576",
"XEphem*INDIConfig*LongitudeValue.value: Mount.GEOGRAPHIC_COORD.LONG",
"XEphem*INDIConfig*POSIXTMValue.value: Mount.Date.POSIX",
"XEphem*INDIConfig*Port.value: 7624",
@ -242,11 +243,11 @@ String fallbacks[] = {
"XEphem*INDIConfig*PressureValue.value: Weather.WX.Pres",
"XEphem*INDIConfig*Recenter.set: False",
"XEphem*INDIConfig*SkyDecOffset.value: 0",
"XEphem*INDIConfig*SkyDecSlope.value: .0174532925",
"XEphem*INDIConfig*SkyDecSlope.value: .01745329251994329576",
"XEphem*INDIConfig*SkyDecValue.value: Telescope.Pointing.Dec2K",
"XEphem*INDIConfig*SkyMarker.set: False",
"XEphem*INDIConfig*SkyRAOffset.value: 0",
"XEphem*INDIConfig*SkyRASlope.value: .2617993875",
"XEphem*INDIConfig*SkyRASlope.value: .26179938779914943653",
"XEphem*INDIConfig*SkyRAValue.value: Telescope.Pointing.RA2K",
"XEphem*INDIConfig*TemperatureOffset.value: 0",
"XEphem*INDIConfig*TemperatureSlope.value: 1",
@ -963,4 +964,4 @@ String fallbacks[] = {
NULL
};
/* $Id: fallbacks.c,v 1.313 2013/01/14 04:02:19 ecdowney Exp $ */
/* $Id: fallbacks.c,v 1.314 2021/12/14 19:10:39 ecdowney Exp $ */

View File

@ -85,6 +85,7 @@ static Widget gotodecb_w; /* INDI goto dec offset */
static Widget edbon_w; /* TB whether edb GOTO is on */
static Widget rdon_w; /* TB whether ra/dec GOTO is on */
static Widget teleod_w; /* TB whether ra/dec sent as EOD else J2000 */
static Widget markeron_w; /* TB whether skyview marker is on */
static XtIntervalId marker_tid; /* timer to display sky marker */
@ -162,27 +163,34 @@ Obj *op;
}
}
/* send as astrometric J2000 ra/dec if on */
/* send as INDI if on */
if (XmToggleButtonGetState (rdon_w)) {
Now *np = mm_get_now();
char *dev, *prop, *ele[2];
double v[2];
Now now, *np;
Obj obj;
double ra, dec;
/* update ephemeris for op */
np = mm_get_now();
if (epoch != J2000) {
now = *np;
np = &now;
epoch = J2000;
obj = *op;
op = &obj;
}
obj_cir (np, op);
/* convert op to desired telescope's coords */
ra = op->f_RA;
dec = op->f_dec;
if (XmToggleButtonGetState(teleod_w)) {
/* telescope wants apparent @ EOD */
if (epoch != EOD) {
as_ap (np, op->f_epoch, &ra, &dec);
} /* else op is already apparent */
} else {
/* telescope wants astrometric @ 2000 */
if (epoch == EOD) {
ap_as (np, J2000, &ra, &dec);
} else {
precess (op->f_epoch, J2000, &ra, &dec);
}
}
/* scale to INDI coords */
v[0] = toINDIValue (op->s_ra, gotoram_w, gotorab_w);
v[1] = toINDIValue (op->s_dec, gotodecm_w, gotodecb_w);
v[0] = toINDIValue (ra, gotoram_w, gotorab_w);
v[1] = toINDIValue (dec, gotodecm_w, gotodecb_w);
/* send INDI ra/dec elements */
if (getINDIele (gotorav_w, gotodecv_w, &dev, &prop, ele) < 0) {
@ -339,9 +347,10 @@ sc_create_w()
"EDB", &edbv_w, NULL, NULL);
oneConfigRow (rc_w, &rdon_w, NULL, "EnableRADec",
"Enable sending RA/Dec goto to",
"GotoRA", &gotorav_w, &gotoram_w, &gotorab_w);
oneConfigRow (rc_w, NULL, NULL, NULL, NULL,
"GotoDec", &gotodecv_w, &gotodecm_w, &gotodecb_w);
"GotoRA", &gotorav_w, &gotoram_w, &gotorab_w);
oneConfigRow (rc_w, &teleod_w, NULL, "TelEOD",
"Tel uses EOD, else J2000",
"GotoDec", &gotodecv_w, &gotodecm_w, &gotodecb_w);
oneConfigRow (rc_w, &markeron_w, marker_cb, "SkyMarker",
"Enable Sky marker from",
"SkyRA", &rav_w, &ram_w, &rab_w);
@ -717,19 +726,28 @@ marker_tcb (XtPointer client, XtIntervalId *id)
if (rnp) {
INumber *dnp = findNumber (rap, ele[1]);
if (dnp) {
Now *np = mm_get_now();
Obj o;
Now *np;
/* build object */
/* get telescope's coords */
double ra = fromINDIValue (rnp->value, ram_w, rab_w);
double dec = fromINDIValue (dnp->value, decm_w,decb_w);
/* convert from telescope's coords to astrometric J2000 */
if (XmToggleButtonGetState(teleod_w)) {
/* telescope is sending us apparent at EOD */
ap_as (np, J2000, &ra, &dec);
} /* else no change, telescope already sending us astrometric @ J2000 */
/* find sky fields */
memset (&o, 0, sizeof(o));
o.f_RA = fromINDIValue (rnp->value, ram_w, rab_w);
o.f_dec = fromINDIValue (dnp->value, decm_w,decb_w);
o.f_RA = ra;
o.f_dec = dec;
o.o_type = FIXED;
o.f_epoch = J2000;
obj_cir (np, &o);
/* mark, on screen */
np = mm_get_now();
obj_cir (np, &o);
sv_scopeMark (&o);
} else {
xe_msg(1,"INDI:%s.%s.%s not found",dev,prop,ele[1]);
@ -864,3 +882,5 @@ fromINDIValue (double indiv, Widget m_w, Widget b_w)
return (localv);
}
/* For RCS Only -- Do Not Edit */
static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: scope.c,v $ $Date: 2021/12/14 19:10:55 $ $Revision: 1.29 $ $Name: $"};