// // Function for interpreting a command string of the format ": COMMAND <ARGUMENT> #" // void Dome::interpretCommand(Messenger *message) { message->readChar(); // Reads ":" char command = message->readChar(); // Read the command switch(command){ case 'P': Park(); break; case 'O': OpenCloseShutter(message->readInt()); break; case 'S': Slew(message->readLong()); break; case 'H': AbortSlew(); break; case 'T': SyncToAzimuth(message->readInt()); break; } }
Mount::MOVE_RESULT ScopeASCOM::Guide(GUIDE_DIRECTION direction, int duration) { MOVE_RESULT result = MOVE_OK; try { Debug.AddLine("Guiding Dir = %d, Dur = %d", direction, duration); if (!IsConnected()) { throw ERROR_INFO("ASCOM Scope: attempt to guide when not connected"); } if (!m_bCanPulseGuide) { // Could happen if move command is issued on the Aux mount or CanPulseGuide property got changed on the fly pFrame->Alert(_("ASCOM driver does not support PulseGuide")); throw ERROR_INFO("ASCOM scope: guide command issued but PulseGuide not supported"); } GITObjRef scope(m_gitEntry); // First, check to see if already moving CheckSlewing(&scope, &result); if (IsGuiding(&scope)) { Debug.AddLine("Entered PulseGuideScope while moving"); int i; for (i = 0; i < 20; i++) { wxMilliSleep(50); CheckSlewing(&scope, &result); if (!IsGuiding(&scope)) break; Debug.AddLine("Still moving"); } if (i == 20) { Debug.AddLine("Still moving after 1s - aborting"); throw ERROR_INFO("ASCOM Scope: scope is still moving after 1 second"); } else { Debug.AddLine("Movement stopped - continuing"); } } // Do the move VARIANTARG rgvarg[2]; rgvarg[1].vt = VT_I2; rgvarg[1].iVal = direction; rgvarg[0].vt = VT_I4; rgvarg[0].lVal = (long) duration; DISPPARAMS dispParms; dispParms.cArgs = 2; dispParms.rgvarg = rgvarg; dispParms.cNamedArgs = 0; dispParms.rgdispidNamedArgs = NULL; wxStopWatch swatch; HRESULT hr; EXCEPINFO excep; Variant vRes; if (FAILED(hr = scope.IDisp()->Invoke(dispid_pulseguide, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispParms, &vRes, &excep, NULL))) { Debug.AddLine(wxString::Format("pulseguide: [%x] %s", hr, _com_error(hr).ErrorMessage())); // Make sure nothing got by us and the mount can really handle pulse guide - HIGHLY unlikely if (scope.GetProp(&vRes, L"CanPulseGuide") && !vRes.boolVal) { Debug.AddLine("Tried to guide mount that has no PulseGuide support"); // This will trigger a nice alert the next time through Guide m_bCanPulseGuide = false; } throw ERROR_INFO("ASCOM Scope: pulseguide command failed: " + ExcepMsg(excep)); } long elapsed = swatch.Time(); if (elapsed < (long)duration) { unsigned long rem = (unsigned long)((long)duration - elapsed); Debug.AddLine("PulseGuide returned control before completion, sleep %lu", rem + 10); if (WorkerThread::MilliSleep(rem + 10)) throw ERROR_INFO("ASCOM Scope: thread terminate requested"); } if (IsGuiding(&scope)) { Debug.AddLine("scope still moving after pulse duration time elapsed"); // try waiting a little longer. If scope does not stop moving after 1 second, try doing AbortSlew // if it still does not stop after 2 seconds, bail out with an error enum { GRACE_PERIOD_MS = 1000, TIMEOUT_MS = GRACE_PERIOD_MS + 1000, }; bool timeoutExceeded = false; bool didAbortSlew = false; while (true) { ::wxMilliSleep(20); if (WorkerThread::InterruptRequested()) throw ERROR_INFO("ASCOM Scope: thread interrupt requested"); CheckSlewing(&scope, &result); if (!IsGuiding(&scope)) { Debug.AddLine("scope move finished after %ld + %ld ms", (long)duration, swatch.Time() - (long)duration); break; } long now = swatch.Time(); if (!didAbortSlew && now > duration + GRACE_PERIOD_MS && m_abortSlewWhenGuidingStuck) { Debug.AddLine("scope still moving after %ld + %ld ms, try aborting slew", (long)duration, now - (long)duration); AbortSlew(&scope); didAbortSlew = true; continue; } if (now > duration + TIMEOUT_MS) { timeoutExceeded = true; break; } } if (timeoutExceeded && IsGuiding(&scope)) { throw ERROR_INFO("timeout exceeded waiting for guiding pulse to complete"); } } } catch (const wxString& msg) { POSSIBLY_UNUSED(msg); if (result == MOVE_OK) { result = MOVE_ERROR; pFrame->Alert(_("PulseGuide command to mount has failed - guiding is likely to be ineffective.")); } } if (result == MOVE_STOP_GUIDING) { pFrame->Alert(_("Guiding stopped: the scope started slewing.")); } return result; }