bool StarbookDriver::ReadScopeStatus() { LOG_DEBUG("Status! Sending GETSTATUS command"); starbook::StatusResponse res; try { cmd_interface->GetStatus(res); } catch (std::exception &e) { StateTP.s = IPS_ALERT; failed_res++; LOG_ERROR(e.what()); if (failed_res > 3) { LOG_ERROR("Failed to keep connection, disconnecting"); StarbookDriver::Disconnect(); failed_res = 0; } return false; } last_known_state = res.state; setTrackState(res); setStarbookState(res.state); NewRaDec(res.equ.ra / 15, res.equ.dec); // CONVERSION failed_res = 0; LOG_DEBUG("STATUS"); return true; }
bool ioptronHC8406::Sync(double ra, double dec) { char syncString[256]; int syncType = IUFindOnSwitchIndex(&SyncCMRSP); if (!isSimulation()) { if (setObjectRA(PortFD, ra) < 0 || setObjectDEC(PortFD, dec) < 0) { EqNP.s = IPS_ALERT; IDSetNumber(&EqNP, "Error setting RA/DEC. Unable to Sync."); return false; } bool syncOK = true; switch (syncType) { case USE_REGULAR_SYNC: if (::Sync(PortFD, syncString) < 0) syncOK = false; break; case USE_CMR_SYNC: if (ioptronHC8406SyncCMR(syncString) < 0) syncOK = false; break; default: break; } if (syncOK == false) { EqNP.s = IPS_ALERT; IDSetNumber(&EqNP, "Synchronization failed."); return false; } } currentRA = ra; currentDEC = dec; DEBUGF(INDI::Logger::DBG_DEBUG, "%s Synchronization successful %s", (syncType == USE_REGULAR_SYNC ? "CM" : "CMR"), syncString); DEBUG(INDI::Logger::DBG_SESSION, "Synchronization successful."); EqNP.s = IPS_OK; NewRaDec(currentRA, currentDEC); return true; }
bool ScopeSim::Sync(double ra, double dec) { currentRA = ra; currentDEC = dec; EqPEN[RA_AXIS].value = ra; EqPEN[DEC_AXIS].value = dec; IDSetNumber(&EqPENV, nullptr); DEBUG(INDI::Logger::DBG_SESSION, "Sync is successful."); EqNP.s = IPS_OK; NewRaDec(currentRA, currentDEC); return true; }
bool ScopeSim::Sync(double ra, double dec) { currentRA = ra; currentDEC = dec; #ifdef USE_EQUATORIAL_PE EqPEN[RA_AXIS].value = ra; EqPEN[DEC_AXIS].value = dec; IDSetNumber(&EqPENV, nullptr); #endif LOG_INFO("Sync is successful."); EqNP.s = IPS_OK; NewRaDec(currentRA, currentDEC); return true; }
bool ScopeScript::ReadScopeStatus() { char name[1024]; char *s = tmpnam(name); INDI_UNUSED(s); bool status = RunScript(SCRIPT_STATUS, name, nullptr); if (status) { int parked = 0; float ra = 0, dec = 0; FILE *file = fopen(name, "r"); int ret = 0; ret = fscanf(file, "%d %f %f", &parked, &ra, &dec); fclose(file); unlink(name); if (parked != 0) { if (!isParked()) { SetParked(true); LOG_INFO("Park succesfully executed"); } } else { if (isParked()) { SetParked(false); LOG_INFO("Unpark succesfully executed"); } } NewRaDec(ra, dec); } else { LOG_ERROR("Failed to read status"); } return status; }
bool IEQPro::Sync(double ra, double dec) { if (set_ieqpro_ra(PortFD, ra) == false || set_ieqpro_dec(PortFD, dec) == false) { DEBUG(INDI::Logger::DBG_ERROR, "Error setting RA/DEC."); return false; } if (sync_ieqpro(PortFD) == false) { DEBUG(INDI::Logger::DBG_ERROR, "Failed to sync."); } TrackState = SCOPE_IDLE; EqNP.s = IPS_OK; currentRA = ra; currentDEC = dec; NewRaDec(currentRA, currentDEC); return true; }
bool SynscanDriver::ReadScopeStatus() { if (isSimulation()) { mountSim(); return true; } char res[SYN_RES] = {0}; // Goto in progress? if (sendCommand("L", res)) m_MountInfo[MI_GOTO_STATUS] = res[0]; // Pier side if (m_isAltAz == false && sendCommand("p", res)) { m_MountInfo[MI_POINT_STATUS] = res[0]; // INDI and mount pier sides are opposite to each other setPierSide(res[0] == 'W' ? PIER_EAST : PIER_WEST); } if (readTracking()) { if (TrackState == SCOPE_SLEWING) { if (isSlewComplete()) { TrackState = (m_TrackingFlag == 2) ? SCOPE_TRACKING : SCOPE_IDLE; HorizontalCoordsNP.s = (m_TrackingFlag == 2) ? IPS_OK : IPS_IDLE; IDSetNumber(&HorizontalCoordsNP, nullptr); } } else if (TrackState == SCOPE_PARKING) { if (isSlewComplete()) { HorizontalCoordsNP.s = IPS_IDLE; IDSetNumber(&HorizontalCoordsNP, nullptr); TrackState = SCOPE_PARKED; SetTrackEnabled(false); SetParked(true); } } else if (TrackState == SCOPE_IDLE && m_TrackingFlag > 0) TrackState = SCOPE_TRACKING; else if (TrackState == SCOPE_TRACKING && m_TrackingFlag == 0) TrackState = SCOPE_IDLE; } sendStatus(); // Get Precise RA/DE memset(res, 0, SYN_RES); if (!sendCommand("e", res)) return false; uint32_t n1 = 0, n2 = 0; sscanf(res, "%x,%x#", &n1, &n2); double ra = static_cast<double>(n1) / 0x100000000 * 360.0; double de = static_cast<double>(n2) / 0x100000000 * 360.0; ln_equ_posn epochPos { 0, 0 }, J2000Pos { 0, 0 }; J2000Pos.ra = range360(ra); J2000Pos.dec = rangeDec(de); // Synscan reports J2000 coordinates so we need to convert from J2000 to JNow ln_get_equ_prec2(&J2000Pos, JD2000, ln_get_julian_from_sys(), &epochPos); CurrentRA = epochPos.ra / 15.0; CurrentDE = epochPos.dec; char Axis1Coords[MAXINDINAME] = {0}, Axis2Coords[MAXINDINAME] = {0}; fs_sexa(Axis1Coords, J2000Pos.ra / 15.0, 2, 3600); fs_sexa(Axis2Coords, J2000Pos.dec, 2, 3600); LOGF_DEBUG("J2000 RA <%s> DE <%s>", Axis1Coords, Axis2Coords); memset(Axis1Coords, 0, MAXINDINAME); memset(Axis2Coords, 0, MAXINDINAME); fs_sexa(Axis1Coords, CurrentRA, 2, 3600); fs_sexa(Axis2Coords, CurrentDE, 2, 3600); LOGF_DEBUG("JNOW RA <%s> DE <%s>", Axis1Coords, Axis2Coords); // Now feed the rest of the system with corrected data NewRaDec(CurrentRA, CurrentDE); // Get precise az/alt memset(res, 0, SYN_RES); if (!sendCommand("z", res)) return false; sscanf(res, "%x,%x#", &n1, &n2); double az = static_cast<double>(n1) / 0x100000000 * 360.0; double al = static_cast<double>(n2) / 0x100000000 * 360.0; al = rangeDec(al); HorizontalCoordsN[AXIS_AZ].value = az; HorizontalCoordsN[AXIS_ALT].value = al; memset(Axis1Coords, 0, MAXINDINAME); memset(Axis2Coords, 0, MAXINDINAME); fs_sexa(Axis1Coords, az, 2, 3600); fs_sexa(Axis2Coords, al, 2, 3600); LOGF_DEBUG("AZ <%s> ALT <%s>", Axis1Coords, Axis2Coords); IDSetNumber(&HorizontalCoordsNP, nullptr); return true; }
void SynscanDriver::mountSim() { static struct timeval ltv; struct timeval tv; double dt, da, dx; int nlocked; /* update elapsed time since last poll, don't presume exactly POLLMS */ gettimeofday(&tv, nullptr); if (ltv.tv_sec == 0 && ltv.tv_usec == 0) ltv = tv; dt = tv.tv_sec - ltv.tv_sec + (tv.tv_usec - ltv.tv_usec) / 1e6; ltv = tv; double currentSlewRate = SIM_SLEW_RATE[IUFindOnSwitchIndex(&SlewRateSP)] * TRACKRATE_SIDEREAL / 3600.0; da = currentSlewRate * dt; /* Process per current state. We check the state of EQUATORIAL_COORDS and act acoordingly */ switch (TrackState) { case SCOPE_IDLE: CurrentRA += (TrackRateN[AXIS_RA].value / 3600.0 * dt) / 15.0; CurrentRA = range24(CurrentRA); break; case SCOPE_TRACKING: break; case SCOPE_SLEWING: case SCOPE_PARKING: /* slewing - nail it when both within one pulse @ SLEWRATE */ nlocked = 0; dx = TargetRA - CurrentRA; // Take shortest path if (fabs(dx) > 12) dx *= -1; if (fabs(dx) <= da) { CurrentRA = TargetRA; nlocked++; } else if (dx > 0) CurrentRA += da / 15.; else CurrentRA -= da / 15.; if (CurrentRA < 0) CurrentRA += 24; else if (CurrentRA > 24) CurrentRA -= 24; dx = TargetDE - CurrentDE; if (fabs(dx) <= da) { CurrentDE = TargetDE; nlocked++; } else if (dx > 0) CurrentDE += da; else CurrentDE -= da; if (nlocked == 2) { if (TrackState == SCOPE_SLEWING) TrackState = SCOPE_TRACKING; else TrackState = SCOPE_PARKED; } break; default: break; } NewRaDec(CurrentRA, CurrentDE); }
bool ScopeSim::ReadScopeStatus() { static struct timeval ltv { 0, 0 }; struct timeval tv { 0, 0 }; double dt = 0, da_ra = 0, da_dec = 0, dx = 0, dy = 0, ra_guide_dt = 0, dec_guide_dt = 0; static double last_dx = 0, last_dy = 0; int nlocked, ns_guide_dir = -1, we_guide_dir = -1; char RA_DISP[64], DEC_DISP[64], RA_GUIDE[64], DEC_GUIDE[64], RA_PE[64], DEC_PE[64], RA_TARGET[64], DEC_TARGET[64]; /* update elapsed time since last poll, don't presume exactly POLLMS */ gettimeofday(&tv, nullptr); if (ltv.tv_sec == 0 && ltv.tv_usec == 0) ltv = tv; dt = tv.tv_sec - ltv.tv_sec + (tv.tv_usec - ltv.tv_usec) / 1e6; ltv = tv; if (fabs(targetRA - currentRA) * 15. >= GOTO_LIMIT) da_ra = GOTO_RATE * dt; else if (fabs(targetRA - currentRA) * 15. >= SLEW_LIMIT) da_ra = SLEW_RATE * dt; else da_ra = FINE_SLEW_RATE * dt; if (fabs(targetDEC - currentDEC) >= GOTO_LIMIT) da_dec = GOTO_RATE * dt; else if (fabs(targetDEC - currentDEC) >= SLEW_LIMIT) da_dec = SLEW_RATE * dt; else da_dec = FINE_SLEW_RATE * dt; if (MovementNSSP.s == IPS_BUSY || MovementWESP.s == IPS_BUSY) { int rate = IUFindOnSwitchIndex(&SlewRateSP); switch (rate) { case SLEW_GUIDE: da_ra = FINE_SLEW_RATE * dt * 0.05; da_dec = FINE_SLEW_RATE * dt * 0.05; break; case SLEW_CENTERING: da_ra = FINE_SLEW_RATE * dt * .1; da_dec = FINE_SLEW_RATE * dt * .1; break; case SLEW_FIND: da_ra = SLEW_RATE * dt; da_dec = SLEW_RATE * dt; break; default: da_ra = GOTO_RATE * dt; da_dec = GOTO_RATE * dt; break; } switch (MovementNSSP.s) { case IPS_BUSY: if (MovementNSS[DIRECTION_NORTH].s == ISS_ON) currentDEC += da_dec; else if (MovementNSS[DIRECTION_SOUTH].s == ISS_ON) currentDEC -= da_dec; break; default: break; } switch (MovementWESP.s) { case IPS_BUSY: if (MovementWES[DIRECTION_WEST].s == ISS_ON) currentRA += da_ra / 15.; else if (MovementWES[DIRECTION_EAST].s == ISS_ON) currentRA -= da_ra / 15.; break; default: break; } NewRaDec(currentRA, currentDEC); return true; } /* Process per current state. We check the state of EQUATORIAL_EOD_COORDS_REQUEST and act acoordingly */ switch (TrackState) { /*case SCOPE_IDLE: EqNP.s = IPS_IDLE; break;*/ case SCOPE_SLEWING: case SCOPE_PARKING: /* slewing - nail it when both within one pulse @ SLEWRATE */ nlocked = 0; dx = targetRA - currentRA; // Always take the shortcut, don't go all around the globe // If the difference between target and current is more than 12 hours, then we need to take the shortest path if (dx > 12) dx -= 24; else if (dx < -12) dx += 24; // In meridian flip, alway force eastward motion (increasing RA) until target is reached. if (forceMeridianFlip) { dx = fabs(dx); if (dx == 0) { dx = 1; da_ra = GOTO_LIMIT; } } if (fabs(dx) * 15. <= da_ra) { currentRA = targetRA; nlocked++; } else if (dx > 0) currentRA += da_ra / 15.; else currentRA -= da_ra / 15.; currentRA = range24(currentRA); dy = targetDEC - currentDEC; if (fabs(dy) <= da_dec) { currentDEC = targetDEC; nlocked++; } else if (dy > 0) currentDEC += da_dec; else currentDEC -= da_dec; EqNP.s = IPS_BUSY; if (nlocked == 2) { forceMeridianFlip = false; if (TrackState == SCOPE_SLEWING) { // Initially no PE in both axis. EqPEN[0].value = currentRA; EqPEN[1].value = currentDEC; IDSetNumber(&EqPENV, nullptr); TrackState = SCOPE_TRACKING; EqNP.s = IPS_OK; DEBUG(INDI::Logger::DBG_SESSION, "Telescope slew is complete. Tracking..."); } else { SetParked(true); EqNP.s = IPS_IDLE; } } break; case SCOPE_IDLE: //currentRA += (TRACKRATE_SIDEREAL/3600.0 * dt) / 15.0; currentRA += (TrackRateN[AXIS_RA].value/3600.0 * dt) / 15.0; currentRA = range24(currentRA); break; case SCOPE_TRACKING: // In case of custom tracking rate if (TrackModeS[1].s == ISS_ON) { currentRA += ( ((TRACKRATE_SIDEREAL/3600.0) - (TrackRateN[AXIS_RA].value/3600.0)) * dt) / 15.0; currentDEC += ( (TrackRateN[AXIS_DE].value/3600.0) * dt); } dt *= 1000; if (guiderNSTarget[GUIDE_NORTH] > 0) { DEBUGF(INDI::Logger::DBG_DEBUG, "Commanded to GUIDE NORTH for %g ms", guiderNSTarget[GUIDE_NORTH]); ns_guide_dir = GUIDE_NORTH; } else if (guiderNSTarget[GUIDE_SOUTH] > 0) { DEBUGF(INDI::Logger::DBG_DEBUG, "Commanded to GUIDE SOUTH for %g ms", guiderNSTarget[GUIDE_SOUTH]); ns_guide_dir = GUIDE_SOUTH; } // WE Guide Selection if (guiderEWTarget[GUIDE_WEST] > 0) { we_guide_dir = GUIDE_WEST; DEBUGF(INDI::Logger::DBG_DEBUG, "Commanded to GUIDE WEST for %g ms", guiderEWTarget[GUIDE_WEST]); } else if (guiderEWTarget[GUIDE_EAST] > 0) { we_guide_dir = GUIDE_EAST; DEBUGF(INDI::Logger::DBG_DEBUG, "Commanded to GUIDE EAST for %g ms", guiderEWTarget[GUIDE_EAST]); } if (ns_guide_dir != -1) { dec_guide_dt = TrackRateN[AXIS_RA].value/3600.0 * GuideRateN[DEC_AXIS].value * guiderNSTarget[ns_guide_dir] / 1000.0 * (ns_guide_dir == GUIDE_NORTH ? 1 : -1); // If time remaining is more that dt, then decrement and if (guiderNSTarget[ns_guide_dir] >= dt) guiderNSTarget[ns_guide_dir] -= dt; else guiderNSTarget[ns_guide_dir] = 0; if (guiderNSTarget[ns_guide_dir] == 0) { GuideNSNP.s = IPS_IDLE; IDSetNumber(&GuideNSNP, nullptr); } EqPEN[DEC_AXIS].value += dec_guide_dt; } if (we_guide_dir != -1) { ra_guide_dt = (TrackRateN[AXIS_RA].value/3600.0) / 15.0 * GuideRateN[RA_AXIS].value * guiderEWTarget[we_guide_dir] / 1000.0 * (we_guide_dir == GUIDE_WEST ? -1 : 1); if (guiderEWTarget[we_guide_dir] >= dt) guiderEWTarget[we_guide_dir] -= dt; else guiderEWTarget[we_guide_dir] = 0; if (guiderEWTarget[we_guide_dir] == 0) { GuideWENP.s = IPS_IDLE; IDSetNumber(&GuideWENP, nullptr); } EqPEN[RA_AXIS].value += ra_guide_dt; } //Mention the followng: // Current RA displacemet and direction // Current DEC displacement and direction // Amount of RA GUIDING correction and direction // Amount of DEC GUIDING correction and direction dx = EqPEN[RA_AXIS].value - targetRA; dy = EqPEN[DEC_AXIS].value - targetDEC; fs_sexa(RA_DISP, fabs(dx), 2, 3600); fs_sexa(DEC_DISP, fabs(dy), 2, 3600); fs_sexa(RA_GUIDE, fabs(ra_guide_dt), 2, 3600); fs_sexa(DEC_GUIDE, fabs(dec_guide_dt), 2, 3600); fs_sexa(RA_PE, EqPEN[RA_AXIS].value, 2, 3600); fs_sexa(DEC_PE, EqPEN[DEC_AXIS].value, 2, 3600); fs_sexa(RA_TARGET, targetRA, 2, 3600); fs_sexa(DEC_TARGET, targetDEC, 2, 3600); if (dx != last_dx || dy != last_dy || ra_guide_dt != 0.0 || dec_guide_dt != 0.0) { last_dx = dx; last_dy = dy; //DEBUGF(INDI::Logger::DBG_DEBUG, "dt is %g\n", dt); DEBUGF(INDI::Logger::DBG_DEBUG, "RA Displacement (%c%s) %s -- %s of target RA %s", dx >= 0 ? '+' : '-', RA_DISP, RA_PE, (EqPEN[RA_AXIS].value - targetRA) > 0 ? "East" : "West", RA_TARGET); DEBUGF(INDI::Logger::DBG_DEBUG, "DEC Displacement (%c%s) %s -- %s of target RA %s", dy >= 0 ? '+' : '-', DEC_DISP, DEC_PE, (EqPEN[DEC_AXIS].value - targetDEC) > 0 ? "North" : "South", DEC_TARGET); DEBUGF(INDI::Logger::DBG_DEBUG, "RA Guide Correction (%g) %s -- Direction %s", ra_guide_dt, RA_GUIDE, ra_guide_dt > 0 ? "East" : "West"); DEBUGF(INDI::Logger::DBG_DEBUG, "DEC Guide Correction (%g) %s -- Direction %s", dec_guide_dt, DEC_GUIDE, dec_guide_dt > 0 ? "North" : "South"); } if (ns_guide_dir != -1 || we_guide_dir != -1) IDSetNumber(&EqPENV, nullptr); break; default: break; } char RAStr[64], DecStr[64]; fs_sexa(RAStr, currentRA, 2, 3600); fs_sexa(DecStr, currentDEC, 2, 3600); DEBUGF(DBG_SCOPE, "Current RA: %s Current DEC: %s", RAStr, DecStr); NewRaDec(currentRA, currentDEC); return true; }
void ioptronHC8406::mountSim() { static struct timeval ltv; struct timeval tv; double dt, da, dx; int nlocked; /* update elapsed time since last poll, don't presume exactly POLLMS */ gettimeofday(&tv, nullptr); if (ltv.tv_sec == 0 && ltv.tv_usec == 0) ltv = tv; dt = tv.tv_sec - ltv.tv_sec + (tv.tv_usec - ltv.tv_usec) / 1e6; ltv = tv; da = SLEWRATE * dt; /* Process per current state. We check the state of EQUATORIAL_COORDS and act acoordingly */ switch (TrackState) { case SCOPE_TRACKING: /* RA moves at sidereal, Dec stands still */ currentRA += (SIDRATE * dt / 15.); break; case SCOPE_SLEWING: case SCOPE_PARKING: /* slewing - nail it when both within one pulse @ SLEWRATE */ nlocked = 0; dx = targetRA - currentRA; if (fabs(dx) <= da) { currentRA = targetRA; nlocked++; } else if (dx > 0) currentRA += da / 15.; else currentRA -= da / 15.; dx = targetDEC - currentDEC; if (fabs(dx) <= da) { currentDEC = targetDEC; nlocked++; } else if (dx > 0) currentDEC += da; else currentDEC -= da; if (nlocked == 2) { if (TrackState == SCOPE_SLEWING) TrackState = SCOPE_TRACKING; else SetParked(true); } break; default: break; } NewRaDec(currentRA, currentDEC); }
bool ioptronHC8406::ReadScopeStatus() { //return true; //for debug if (!isConnected()) return false; if (isSimulation()) { mountSim(); return true; } switch (TrackState) { case SCOPE_IDLE: DEBUG(INDI::Logger::DBG_WARNING, "<ReadScopeStatus> IDLE"); break; case SCOPE_SLEWING: DEBUG(INDI::Logger::DBG_WARNING, "<ReadScopeStatus> SLEWING"); break; case SCOPE_TRACKING: DEBUG(INDI::Logger::DBG_WARNING, "<ReadScopeStatus> TRACKING"); break; case SCOPE_PARKING: DEBUG(INDI::Logger::DBG_WARNING, "<ReadScopeStatus> PARKING"); break; case SCOPE_PARKED: DEBUG(INDI::Logger::DBG_WARNING, "<ReadScopeStatus> PARKED"); break; default: DEBUG(INDI::Logger::DBG_WARNING, "<ReadScopeStatus> UNDEFINED"); break; } if (TrackState == SCOPE_SLEWING ) { // Check if LX200 is done slewing if (isSlewComplete()) { usleep(1000000); //Wait until :MS# finish if (IUFindSwitch(&CoordSP, "SYNC")->s == ISS_ON || IUFindSwitch(&CoordSP, "SLEW")->s == ISS_ON) { TrackState = SCOPE_IDLE; DEBUG(INDI::Logger::DBG_WARNING, "Slew is complete. IDLE"); SetTrackEnabled(false); } else { TrackState = SCOPE_TRACKING; DEBUG(INDI::Logger::DBG_WARNING, "Slew is complete. TRACKING"); SetTrackEnabled(true); } } } else if (TrackState == SCOPE_PARKING) { // isSlewComplete() not work because is base on actual RA/DEC vs target RA/DEC. DO ALWAYS if (true || isSlewComplete()) { SetParked(true); TrackState = SCOPE_PARKED; } } if (getLX200RA(PortFD, ¤tRA) < 0 || getLX200DEC(PortFD, ¤tDEC) < 0) { EqNP.s = IPS_ALERT; IDSetNumber(&EqNP, "Error reading RA/DEC."); return false; } NewRaDec(currentRA, currentDEC); //sendScopeTime(); //syncSideOfPier(); return true; }
/************************************************************************************** ** Client is asking us to report telescope status ***************************************************************************************/ bool SimpleScope::ReadScopeStatus() { static struct timeval ltv; struct timeval tv; double dt=0, da_ra=0, da_dec=0, dx=0, dy=0; int nlocked; /* update elapsed time since last poll, don't presume exactly POLLMS */ gettimeofday (&tv, NULL); if (ltv.tv_sec == 0 && ltv.tv_usec == 0) ltv = tv; dt = tv.tv_sec - ltv.tv_sec + (tv.tv_usec - ltv.tv_usec)/1e6; ltv = tv; // Calculate how much we moved since last time da_ra = SLEW_RATE *dt; da_dec = SLEW_RATE *dt; /* Process per current state. We check the state of EQUATORIAL_EOD_COORDS_REQUEST and act acoordingly */ switch (TrackState) { case SCOPE_SLEWING: // Wait until we are "locked" into positon for both RA & DEC axis nlocked = 0; // Calculate diff in RA dx = targetRA - currentRA; // If diff is very small, i.e. smaller than how much we changed since last time, then we reached target RA. if (fabs(dx)*15. <= da_ra) { currentRA = targetRA; nlocked++; } // Otherwise, increase RA else if (dx > 0) currentRA += da_ra/15.; // Otherwise, decrease RA else currentRA -= da_ra/15.; // Calculate diff in DEC dy = targetDEC - currentDEC; // If diff is very small, i.e. smaller than how much we changed since last time, then we reached target DEC. if (fabs(dy) <= da_dec) { currentDEC = targetDEC; nlocked++; } // Otherwise, increase DEC else if (dy > 0) currentDEC += da_dec; // Otherwise, decrease DEC else currentDEC -= da_dec; // Let's check if we recahed position for both RA/DEC if (nlocked == 2) { // Let's set state to TRACKING TrackState = SCOPE_TRACKING; DEBUG(INDI::Logger::DBG_SESSION, "Telescope slew is complete. Tracking..."); } break; default: break; } char RAStr[64], DecStr[64]; // Parse the RA/DEC into strings fs_sexa(RAStr, currentRA, 2, 3600); fs_sexa(DecStr, currentDEC, 2, 3600); DEBUGF(DBG_SCOPE, "Current RA: %s Current DEC: %s", RAStr, DecStr ); NewRaDec(currentRA, currentDEC); return true; }
bool SynscanMount::ReadScopeStatus() { char str[20]; int bytesWritten, bytesRead; int numread; double ra,dec; long unsigned int n1,n2; //IDLog("SynScan Read Status\n"); //tty_write(PortFD,(unsigned char *)"Ka",2, &bytesWritten); // test for an echo tty_write(PortFD,"Ka",2, &bytesWritten); // test for an echo tty_read(PortFD,str,2,2, &bytesRead); // Read 2 bytes of response if(str[1] != '#') { // this is not a correct echo if (isDebug()) IDLog("ReadStatus Echo Fail. %s\n", str); IDMessage(getDeviceName(),"Mount Not Responding"); return false; } if(TrackState==SCOPE_SLEWING) { // We have a slew in progress // lets see if it's complete // This only works for ra/dec goto commands // The goto complete flag doesn't trip for ALT/AZ commands memset(str,0,3); tty_write(PortFD,"L",1, &bytesWritten); numread=tty_read(PortFD,str,2,3, &bytesRead); if(str[0]!=48) { // Nothing to do here } else { if(TrackState==SCOPE_PARKING) TrackState=SCOPE_PARKED; else TrackState=SCOPE_TRACKING; } } if(TrackState==SCOPE_PARKING) { // ok, lets try read where we are // and see if we have reached the park position memset(str,0,20); tty_write(PortFD,"Z",1, &bytesWritten); numread=tty_read(PortFD,str,10,2, &bytesRead); //IDLog("PARK READ %s\n",str); if(strncmp((char *)str,"0000,4000",9)==0) { TrackState=SCOPE_PARKED; ParkSP.s=IPS_OK; IDSetSwitch(&ParkSP,NULL); IDMessage(getDeviceName(),"Telescope is Parked."); } } memset(str,0,20); tty_write(PortFD,"e",1, &bytesWritten); numread=tty_read(PortFD,str,18,1, &bytesRead); if (bytesRead!=18) //if(str[17] != '#') { IDLog("read status bytes didn't get a full read\n"); return false; } if (isDebug()) IDLog("Bytes read is (%s)\n", str); // bytes read is as expected //sscanf((char *)str,"%x",&n1); //sscanf((char *)&str[9],"%x",&n2); // JM read as unsigned long int, otherwise we get negative RA! sscanf(str, "%lx,%lx#", &n1, &n2); ra=(double)n1/0x100000000*24.0; dec=(double)n2/0x100000000*360.0; NewRaDec(ra,dec); return true; }
bool IEQPro::ReadScopeStatus() { bool rc = false; IEQInfo newInfo; if (isSimulation()) mountSim(); rc = get_ieqpro_status(PortFD, &newInfo); if (rc) { IUResetSwitch(&GPSStatusSP); GPSStatusS[newInfo.gpsStatus].s = ISS_ON; IDSetSwitch(&GPSStatusSP, NULL); IUResetSwitch(&TimeSourceSP); TimeSourceS[newInfo.timeSource].s = ISS_ON; IDSetSwitch(&TimeSourceSP, NULL); IUResetSwitch(&HemisphereSP); HemisphereS[newInfo.hemisphere].s = ISS_ON; IDSetSwitch(&HemisphereSP, NULL); TelescopeTrackMode trackMode; switch (newInfo.trackRate) { case TR_SIDEREAL: trackMode = TRACK_SIDEREAL; break; case TR_SOLAR: trackMode = TRACK_SOLAR; break; case TR_LUNAR: trackMode = TRACK_LUNAR; break; case TR_KING: trackMode = TRACK_SIDEREAL; break; case TR_CUSTOM: trackMode = TRACK_CUSTOM; break; } switch (newInfo.systemStatus) { case ST_STOPPED: TrackModeSP.s = IPS_IDLE; TrackState = SCOPE_IDLE; break; case ST_PARKED: TrackModeSP.s = IPS_IDLE; TrackState = SCOPE_PARKED; if (isParked() == false) SetParked(true); break; case ST_HOME: TrackModeSP.s = IPS_IDLE; TrackState = SCOPE_IDLE; break; case ST_SLEWING: case ST_MERIDIAN_FLIPPING: if (TrackState != SCOPE_SLEWING && TrackState != SCOPE_PARKING) TrackState = SCOPE_SLEWING; break; case ST_TRACKING_PEC_OFF: case ST_TRACKING_PEC_ON: case ST_GUIDING: TrackModeSP.s = IPS_BUSY; TrackState = SCOPE_TRACKING; if (scopeInfo.systemStatus == ST_SLEWING) DEBUG(INDI::Logger::DBG_SESSION, "Slew complete, tracking..."); else if (scopeInfo.systemStatus == ST_MERIDIAN_FLIPPING) DEBUG(INDI::Logger::DBG_SESSION, "Meridian flip complete, tracking..."); break; } IUResetSwitch(&TrackModeSP); TrackModeS[trackMode].s = ISS_ON; IDSetSwitch(&TrackModeSP, NULL); scopeInfo = newInfo; } rc = get_ieqpro_coords(PortFD, ¤tRA, ¤tDEC); if (rc) NewRaDec(currentRA, currentDEC); return rc; }