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; }
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; }
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; }