bool ScopeINDI::GetCoordinates(double *ra, double *dec, double *siderealTime) { bool err = true; if (coord_prop) { INumber *raprop = IUFindNumber(coord_prop,"RA"); INumber *decprop = IUFindNumber(coord_prop,"DEC"); if (raprop && decprop) { *ra = raprop->value; // hours *dec = decprop->value; // degrees err = false; } if (SiderealTime_prop) { // LX200 only INumber *stprop = IUFindNumber(coord_prop,"LST"); if (stprop){ *siderealTime = stprop->value; } } else { #ifdef LIBNOVA double lat,lon; double jd = ln_get_julian_from_sys(); *siderealTime = ln_get_apparent_sidereal_time (jd); if (!GetSiteLatLong(&lat,&lon)) *siderealTime = *siderealTime + (lon/15); #else *siderealTime = 0; #endif } } return err; }
bool IEQPro::SetDefaultPark() { // By default set RA to HA SetAxis1Park(ln_get_apparent_sidereal_time(ln_get_julian_from_sys())); // Set DEC to 90 or -90 depending on the hemisphere SetAxis2Park( (HemisphereS[HEMI_NORTH].s == ISS_ON) ? 90 : -90); return true; }
END_TEST START_TEST(test_altaz_2) { // test 2, 2016-04-12T19:20:47 HST = 2016-4-13U20:23:47 struct ln_date test_t; test_t.years = 2016; test_t.months = 4; test_t.days = 13; test_t.hours = 20; test_t.minutes = 23; test_t.seconds = 47; double JD = ln_get_julian_day (&test_t); ck_assert_dbl_eq (JD, 2457492.34985, 10e-5); ck_assert_dbl_eq (ln_get_mean_sidereal_time (JD), ln_get_apparent_sidereal_time (JD) + 6.842610000035165e-05, 10e-10); }
/* Constructor */ IEQPro::IEQPro() { set_ieqpro_device(getDeviceName()); //ctor currentRA=ln_get_apparent_sidereal_time(ln_get_julian_from_sys()); currentDEC=90; scopeInfo.gpsStatus = GPS_OFF; scopeInfo.systemStatus = ST_STOPPED; scopeInfo.trackRate = TR_SIDEREAL; scopeInfo.slewRate = SR_1; scopeInfo.timeSource = TS_RS232; scopeInfo.hemisphere = HEMI_NORTH; DBG_SCOPE = INDI::Logger::getInstance().addDebugLevel("Scope Verbose", "SCOPE"); SetTelescopeCapability(TELESCOPE_CAN_PARK | TELESCOPE_CAN_SYNC | TELESCOPE_CAN_GOTO | TELESCOPE_CAN_ABORT | TELESCOPE_HAS_TIME | TELESCOPE_HAS_LOCATION,9); }
int ln_get_object_rst_horizon_offset (double JD, struct ln_lnlat_posn * observer, struct ln_equ_posn * object, long double horizon, struct ln_rst_time * rst, double ut_offset) { int jd; long double O, JD_UT, H0, H1; double Hat, Har, Has, altr, alts; double mt, mr, ms, mst, msr, mss; double dmt, dmr, dms; int ret, i; if (isnan (ut_offset)) { JD_UT = JD; } else { /* convert local sidereal time into degrees for 0h of UT on day JD */ jd = (int)JD; JD_UT = jd + ut_offset; } O = ln_get_apparent_sidereal_time (JD_UT); O *= 15.0; /* equ 15.1 */ H0 = (sin (ln_deg_to_rad (horizon)) - sin (ln_deg_to_rad (observer->lat)) * sin (ln_deg_to_rad (object->dec))); H1 = (cos (ln_deg_to_rad (observer->lat)) * cos (ln_deg_to_rad (object->dec))); H1 = H0 / H1; ret = check_coords (observer, H1, horizon, object); if (ret) return ret; H0 = acos (H1); H0 = ln_rad_to_deg (H0); /* equ 15.2 */ mt = (object->ra - observer->lng - O) / 360.0; mr = mt - H0 / 360.0; ms = mt + H0 / 360.0; for (i = 0; i < 3; i++) { /* put in correct range */ if (mt > 1.0) mt--; else if (mt < 0) mt++; if (mr > 1.0) mr--; else if (mr < 0) mr++; if (ms > 1.0) ms--; else if (ms < 0) ms++; /* find sidereal time at Greenwich, in degrees, for each m */ mst = O + 360.985647 * mt; msr = O + 360.985647 * mr; mss = O + 360.985647 * ms; /* find local hour angle */ Hat = mst + observer->lng - object->ra; Har = msr + observer->lng - object->ra; Has = mss + observer->lng - object->ra; /* find altitude for rise and set */ altr = sin (ln_deg_to_rad (observer->lat)) * sin (ln_deg_to_rad (object->dec)) + cos (ln_deg_to_rad (observer->lat)) * cos (ln_deg_to_rad (object->dec)) * cos (ln_deg_to_rad (Har)); alts = sin (ln_deg_to_rad (observer->lat)) * sin (ln_deg_to_rad (object->dec)) + cos (ln_deg_to_rad (observer->lat)) * cos (ln_deg_to_rad (object->dec)) * cos (ln_deg_to_rad (Has)); /* must be in degrees */ altr = ln_rad_to_deg (altr); alts = ln_rad_to_deg (alts); /* corrections for m */ ln_range_degrees (Hat); if (Hat > 180.0) Hat -= 360; dmt = -(Hat / 360.0); dmr = (altr - horizon) / (360 * cos (ln_deg_to_rad (object->dec)) * cos (ln_deg_to_rad (observer->lat)) * sin (ln_deg_to_rad (Har))); dms = (alts - horizon) / (360 * cos (ln_deg_to_rad (object->dec)) * cos (ln_deg_to_rad (observer->lat)) * sin (ln_deg_to_rad (Has))); /* add corrections and change to JD */ mt += dmt; mr += dmr; ms += dms; if (mt <= 1 && mt >= 0 && mr <= 1 && mr >= 0 && ms <= 1 && ms >= 0) break; } rst->rise = JD_UT + mr; rst->transit = JD_UT + mt; rst->set = JD_UT + ms; /* not circumpolar */ return 0; }
int ln_get_motion_body_rst_horizon_offset (double JD, struct ln_lnlat_posn * observer, get_motion_body_coords_t get_motion_body_coords, void * orbit, double horizon, struct ln_rst_time * rst, double ut_offset) { int jd; double T, O, JD_UT, H0, H1; double Hat, Har, Has, altr, alts; double mt, mr, ms, mst, msr, mss, nt, nr, ns; struct ln_equ_posn sol1, sol2, sol3, post, posr, poss; double dmt, dmr, dms; int ret, i; /* dynamical time diff */ T = ln_get_dynamical_time_diff (JD); if (isnan (ut_offset)) { JD_UT = JD; } else { jd = (int)JD; JD_UT = jd + ut_offset; } O = ln_get_apparent_sidereal_time (JD_UT); O *= 15.0; /* get body coords for JD_UT -1, JD_UT and JD_UT + 1 */ get_motion_body_coords (JD_UT - 1.0, orbit, &sol1); get_motion_body_coords (JD_UT, orbit, &sol2); get_motion_body_coords (JD_UT + 1.0, orbit, &sol3); /* equ 15.1 */ H0 = (sin(ln_deg_to_rad (horizon)) - sin(ln_deg_to_rad(observer->lat)) * sin(ln_deg_to_rad(sol2.dec))); H1 = (cos(ln_deg_to_rad(observer->lat)) * cos(ln_deg_to_rad(sol2.dec))); H1 = H0 / H1; ret = check_coords (observer, H1, horizon, &sol2); if (ret) return ret; H0 = acos (H1); H0 = ln_rad_to_deg (H0); /* correct ra values for interpolation - put them to the same side of circle */ if ((sol1.ra - sol2.ra) > 180.0) sol2.ra += 360; if ((sol2.ra - sol3.ra) > 180.0) sol3.ra += 360; if ((sol3.ra - sol2.ra) > 180.0) sol3.ra -= 360; if ((sol2.ra - sol1.ra) > 180.0) sol3.ra -= 360; for (i = 0; i < 3; i++) { /* equ 15.2 */ mt = (sol2.ra - observer->lng - O) / 360.0; mr = mt - H0 / 360.0; ms = mt + H0 / 360.0; /* put in correct range */ if (mt > 1.0 ) mt--; else if (mt < 0.0) mt++; if (mr > 1.0 ) mr--; else if (mr < 0.0) mr++; if (ms > 1.0 ) ms--; else if (ms < 0.0) ms++; /* find sidereal time at Greenwich, in degrees, for each m*/ mst = O + 360.985647 * mt; msr = O + 360.985647 * mr; mss = O + 360.985647 * ms; nt = mt + T / 86400.0; nr = mr + T / 86400.0; ns = ms + T / 86400.0; /* interpolate ra and dec for each m, except for transit dec (dec2) */ posr.ra = ln_interpolate3 (nr, sol1.ra, sol2.ra, sol3.ra); posr.dec = ln_interpolate3 (nr, sol1.dec, sol2.dec, sol3.dec); post.ra = ln_interpolate3 (nt, sol1.ra, sol2.ra, sol3.ra); poss.ra = ln_interpolate3 (ns, sol1.ra, sol2.ra, sol3.ra); poss.dec = ln_interpolate3 (ns, sol1.dec, sol2.dec, sol3.dec); /* find local hour angle */ Hat = mst + observer->lng - post.ra; Har = msr + observer->lng - posr.ra; Has = mss + observer->lng - poss.ra; /* find altitude for rise and set */ altr = sin(ln_deg_to_rad(observer->lat)) * sin(ln_deg_to_rad(posr.dec)) + cos(ln_deg_to_rad(observer->lat)) * cos(ln_deg_to_rad(posr.dec)) * cos(ln_deg_to_rad (Har)); alts = sin(ln_deg_to_rad(observer->lat)) * sin(ln_deg_to_rad(poss.dec)) + cos(ln_deg_to_rad(observer->lat)) * cos(ln_deg_to_rad(poss.dec)) * cos(ln_deg_to_rad (Has)); /* corrections for m */ dmt = - (Hat / 360.0); dmr = (altr - horizon) / (360 * cos(ln_deg_to_rad(posr.dec)) * cos(ln_deg_to_rad(observer->lat)) * sin(ln_deg_to_rad(Har))); dms = (alts - horizon) / (360 * cos(ln_deg_to_rad(poss.dec)) * cos(ln_deg_to_rad(observer->lat)) * sin(ln_deg_to_rad(Has))); /* add corrections and change to JD */ mt += dmt; mr += dmr; ms += dms; if (mt <= 1 && mt >= 0 && mr <= 1 && mr >= 0 && ms <= 1 && ms >= 0) break; } rst->rise = JD_UT + mr; rst->transit = JD_UT + mt; rst->set = JD_UT + ms; /* not circumpolar */ return 0; }
END_TEST START_TEST(test_altaz_1) { // test 1, 2016-01-12T19:20:47 HST = 2016-01-13U05:20:47 struct ln_date test_t; test_t.years = 2016; test_t.months = 1; test_t.days = 13; test_t.hours = 5; test_t.minutes = 20; test_t.seconds = 47; double JD = ln_get_julian_day (&test_t); ck_assert_dbl_eq (JD, 2457400.7227662038, 10e-10); struct ln_hrz_posn hrz, res_hrz; hrz.alt = 80; hrz.az = 20; struct ln_equ_posn pos; pos.ra = 20; pos.dec = 80; int32_t azc = -20000000; int32_t altc = 1000; int ret = altAzTest->test_hrz2counts (&hrz, azc, altc); ck_assert_int_eq (ret, 0); ck_assert_int_eq (azc, -13048946); ck_assert_int_eq (altc, 3169029); altAzTest->test_counts2hrz (azc, altc, &res_hrz); ck_assert_dbl_eq (res_hrz.az, hrz.az, 10e-5); ck_assert_dbl_eq (res_hrz.alt, hrz.alt, 10e-5); ck_assert_dbl_eq (ln_get_mean_sidereal_time (JD), ln_get_apparent_sidereal_time (JD) + 7.914799999397815e-06, 10e-10); altAzTest->modelOff (); ret = altAzTest->test_sky2counts (JD, 0, &pos, azc, altc); ck_assert_int_eq (ret, 0); #ifdef RTS2_LIBERFA ck_assert_int_eq (azc, 16135692); ck_assert_int_eq (altc, 27318632); #else ck_assert_int_eq (azc, 16147941); ck_assert_int_eq (altc, 27349158); #endif altAzTest->test_counts2sky (JD, azc, altc, pos.ra, pos.dec); #ifdef RTS2_LIBERFA ck_assert_dbl_eq (pos.ra, 20, 10e-1); ck_assert_dbl_eq (pos.dec, 80, 10e-1); #else ck_assert_dbl_eq (pos.ra, 20, 10e-4); ck_assert_dbl_eq (pos.dec, 80, 10e-4); #endif altAzTest->modelOn (); // origin pos.ra = 344.16613; pos.dec = -80.3703305; ret = altAzTest->test_sky2counts (JD, 0, &pos, azc, altc); ck_assert_int_eq (ret, 0); #ifdef RTS2_LIBERFA ck_assert_int_eq (azc, 49514704); ck_assert_int_eq (altc, 12305112); #else ck_assert_int_eq (azc, 49510278); ck_assert_int_eq (altc, 12292286); #endif // target pos.ra = 62.95859; pos.dec = -80.51601; float e = altAzTest->test_move (JD, &pos, azc, altc, 2.0, 200); ck_assert_msg (!std::isnan (e), "position %f %f not reached", pos.ra, pos.dec); struct ln_equ_posn curr; curr.ra = curr.dec = 0; altAzTest->test_counts2sky (JD, azc, altc, curr.ra, curr.dec); #ifdef RTS2_LIBERFA ck_assert_dbl_eq (pos.ra, curr.ra, 10e-1); ck_assert_dbl_eq (pos.dec, curr.dec, 10e-1); #else ck_assert_dbl_eq (pos.ra, curr.ra, 10e-3); ck_assert_dbl_eq (pos.dec, curr.dec, 10e-3); #endif altAzTest->test_counts2hrz (-70194687, -48165219, &hrz); ck_assert_dbl_eq (hrz.alt, -4.621631, 10e-3); ck_assert_dbl_eq (hrz.az, 73.446355, 10e-3); ret = altAzTest->test_hrz2counts (&hrz, azc, altc); ck_assert_int_eq (ret, 0); ck_assert_int_eq (azc, 64023041); ck_assert_int_eq (altc, 18943644); altAzTest->test_counts2hrz (-68591258, -68591258, &hrz); ck_assert_dbl_eq (hrz.alt, 75.047819, 10e-2); ck_assert_dbl_eq (hrz.az, 262.047819, 10e-2); ret = altAzTest->test_hrz2counts (&hrz, azc, altc); ck_assert_int_eq (ret, 0); ck_assert_int_eq (azc, 32072038); ck_assert_int_eq (altc, 4092184); }
double get_local_sidereal_time(double longitude) { double SD = ln_get_apparent_sidereal_time(ln_get_julian_from_sys()) - (360.0 - longitude) / 15.0; return range24(SD); }
void IEQPro::getStartupData() { DEBUG(INDI::Logger::DBG_DEBUG, "Getting firmware data..."); if (get_ieqpro_firmware(PortFD, &firmwareInfo)) { IUSaveText(&FirmwareT[0], firmwareInfo.Model.c_str()); IUSaveText(&FirmwareT[1], firmwareInfo.MainBoardFirmware.c_str()); IUSaveText(&FirmwareT[2], firmwareInfo.ControllerFirmware.c_str()); IUSaveText(&FirmwareT[3], firmwareInfo.RAFirmware.c_str()); IUSaveText(&FirmwareT[4], firmwareInfo.DEFirmware.c_str()); FirmwareTP.s = IPS_OK; IDSetText(&FirmwareTP, NULL); } DEBUG(INDI::Logger::DBG_DEBUG, "Getting guiding rate..."); double guideRate=0; if (get_ieqpro_guide_rate(PortFD, &guideRate)) { GuideRateN[0].value = guideRate; IDSetNumber(&GuideRateNP, NULL); } double HA = ln_get_apparent_sidereal_time(ln_get_julian_from_sys()); double DEC = (HemisphereS[HEMI_NORTH].s == ISS_ON) ? 90 : -90; if (InitPark()) { // If loading parking data is successful, we just set the default parking values. SetAxis1ParkDefault(HA); SetAxis2ParkDefault(DEC); } else { // Otherwise, we set all parking data to default in case no parking data is found. SetAxis1Park(HA); SetAxis2Park(DEC); SetAxis1ParkDefault(HA); SetAxis2ParkDefault(DEC); } double utc_offset; int yy, dd, mm, hh, minute, ss; if (get_ieqpro_utc_date_time(PortFD, &utc_offset, &yy, &mm, &dd, &hh, &minute, &ss)) { char isoDateTime[32]; char utcOffset[8]; snprintf(isoDateTime, 32, "%04d-%02d-%02dT%02d:%02d:%02d", yy, mm, dd, hh, minute, ss); snprintf(utcOffset, 8, "%4.2f", utc_offset); IUSaveText(IUFindText(&TimeTP, "UTC"), isoDateTime); IUSaveText(IUFindText(&TimeTP, "OFFSET"), utcOffset); DEBUGF(INDI::Logger::DBG_SESSION, "Mount UTC offset is %s. UTC time is %s", utcOffset, isoDateTime); IDSetText(&TimeTP, NULL); } // Get Longitude and Latitude from mount double longitude=0,latitude=0; if (get_ieqpro_latitude(PortFD, &latitude) && get_ieqpro_longitude(PortFD, &longitude)) { // Convert to INDI standard longitude (0 to 360 Eastward) if (longitude < 0) longitude += 360; LocationN[LOCATION_LATITUDE].value = latitude; LocationN[LOCATION_LONGITUDE].value= longitude; LocationNP.s = IPS_OK; IDSetNumber(&LocationNP, NULL); } if (isSimulation()) { if (isParked()) set_sim_system_status(ST_PARKED); else set_sim_system_status(ST_STOPPED); } }