diff --git a/kstars/ekos/scheduler/scheduler.cpp b/kstars/ekos/scheduler/scheduler.cpp --- a/kstars/ekos/scheduler/scheduler.cpp +++ b/kstars/ekos/scheduler/scheduler.cpp @@ -2056,11 +2056,10 @@ appendLogText(i18n("Starting shutdown procedure due to severe weather.")); if (currentJob) { + currentJob->setState(SchedulerJob::JOB_ABORTED); stopCurrentJobAction(); stopGuiding(); jobTimer.stop(); - currentJob->setState(SchedulerJob::JOB_ABORTED); - currentJob->setStage(SchedulerJob::STAGE_IDLE); } checkShutdownState(); //connect(KStars::Instance()->data()->clock(), SIGNAL(timeAdvanced()), this, SLOT(checkStatus()), &Scheduler::Qt::UniqueConnection); @@ -2699,23 +2698,29 @@ captureInterface->call(QDBus::AutoDetect, "setCoolerControl", arg); } - if (capCheck->isEnabled() && capCheck->isChecked()) + // The following steps require a connection to the INDI server + if (indiState == INDI_READY) { - shutdownState = SHUTDOWN_PARK_CAP; - return false; - } + if (capCheck->isEnabled() && capCheck->isChecked()) + { + shutdownState = SHUTDOWN_PARK_CAP; + return false; + } - if (parkMountCheck->isEnabled() && parkMountCheck->isChecked()) - { - shutdownState = SHUTDOWN_PARK_MOUNT; - return false; - } + if (parkMountCheck->isEnabled() && parkMountCheck->isChecked()) + { + shutdownState = SHUTDOWN_PARK_MOUNT; + return false; + } - if (parkDomeCheck->isEnabled() && parkDomeCheck->isChecked()) - { - shutdownState = SHUTDOWN_PARK_DOME; - return false; + if (parkDomeCheck->isEnabled() && parkDomeCheck->isChecked()) + { + shutdownState = SHUTDOWN_PARK_DOME; + return false; + } } + else appendLogText(i18n("Warning: Bypassing parking procedures, no INDI connection.")); + if (shutdownScriptURL.isEmpty() == false) { shutdownState = SHUTDOWN_SCRIPT; @@ -2727,7 +2732,12 @@ break; case SHUTDOWN_PARK_CAP: - if (capCheck->isEnabled() && capCheck->isChecked()) + if (indiState != INDI_READY) + { + qCInfo(KSTARS_EKOS_SCHEDULER) << "Bypassing shutdown step 'park cap', no INDI connection."; + shutdownState = SHUTDOWN_SCRIPT; + } + else if (capCheck->isEnabled() && capCheck->isChecked()) parkCap(); else shutdownState = SHUTDOWN_PARK_MOUNT; @@ -2738,7 +2748,12 @@ break; case SHUTDOWN_PARK_MOUNT: - if (parkMountCheck->isEnabled() && parkMountCheck->isChecked()) + if (indiState != INDI_READY) + { + qCInfo(KSTARS_EKOS_SCHEDULER) << "Bypassing shutdown step 'park cap', no INDI connection."; + shutdownState = SHUTDOWN_SCRIPT; + } + else if (parkMountCheck->isEnabled() && parkMountCheck->isChecked()) parkMount(); else shutdownState = SHUTDOWN_PARK_DOME; @@ -2749,7 +2764,12 @@ break; case SHUTDOWN_PARK_DOME: - if (parkDomeCheck->isEnabled() && parkDomeCheck->isChecked()) + if (indiState != INDI_READY) + { + qCInfo(KSTARS_EKOS_SCHEDULER) << "Bypassing shutdown step 'park cap', no INDI connection."; + shutdownState = SHUTDOWN_SCRIPT; + } + else if (parkDomeCheck->isEnabled() && parkDomeCheck->isChecked()) parkDome(); else shutdownState = SHUTDOWN_SCRIPT; @@ -3075,17 +3095,24 @@ "Job '%3' is now approaching astronomical twilight rise limit at %1 (%2 minutes safety margin), marking aborted.", preDawnDateTime.toString(), Options::preDawnTime(), currentJob->getName())); + // Let the Scheduler attempt to connect INDI again currentJob->setState(SchedulerJob::JOB_ABORTED); stopCurrentJobAction(); stopGuiding(); - checkShutdownState(); - - //disconnect(KStars::Instance()->data()->clock(), SIGNAL(timeAdvanced()), this, SLOT(checkJobStage()), Qt::UniqueConnection); - //connect(KStars::Instance()->data()->clock(), SIGNAL(timeAdvanced()), this, SLOT(checkStatus()), Qt::UniqueConnection); + disconnectINDI(); + stopEkos(); return; } } + // Check Ekos state + if (!checkEkosState()) + return; + + // Check INDI state + if (!checkINDIState()) + return; + switch (currentJob->getStage()) { case SchedulerJob::STAGE_IDLE: @@ -3107,8 +3134,13 @@ if (slewStatus.error().type() == QDBusError::UnknownObject) { appendLogText(i18n("Warning: job '%1' lost connection to INDI while slewing, marking aborted.", currentJob->getName())); + + // Let the Scheduler attempt to connect INDI again currentJob->setState(SchedulerJob::JOB_ABORTED); - checkShutdownState(); + stopCurrentJobAction(); + stopGuiding(); + disconnectINDI(); + stopEkos(); return; } @@ -3145,8 +3177,13 @@ if (focusReply.error().type() == QDBusError::UnknownObject) { appendLogText(i18n("Warning: job '%1' lost connection to INDI server while focusing, marking aborted.", currentJob->getName())); + + // Let the Scheduler attempt to connect INDI again currentJob->setState(SchedulerJob::JOB_ABORTED); - checkShutdownState(); + stopCurrentJobAction(); + stopGuiding(); + disconnectINDI(); + stopEkos(); return; } @@ -3205,8 +3242,13 @@ if (alignReply.error().type() == QDBusError::UnknownObject) { appendLogText(i18n("Warning: job '%1' lost connection to INDI server while aligning, marking aborted.", currentJob->getName())); + + // Let the Scheduler attempt to connect INDI again currentJob->setState(SchedulerJob::JOB_ABORTED); - checkShutdownState(); + stopCurrentJobAction(); + stopGuiding(); + disconnectINDI(); + stopEkos(); return; } @@ -3263,8 +3305,13 @@ if (slewStatus.error().type() == QDBusError::UnknownObject) { appendLogText(i18n("Warning: job '%1' lost connection to INDI server while reslewing, marking aborted.",currentJob->getName())); + + // Let the Scheduler attempt to connect INDI again currentJob->setState(SchedulerJob::JOB_ABORTED); - checkShutdownState(); + stopCurrentJobAction(); + stopGuiding(); + disconnectINDI(); + stopEkos(); } else if (slewStatus.value() == IPS_OK && isDomeMoving == false) { @@ -3298,8 +3345,13 @@ if (guideReply.error().type() == QDBusError::UnknownObject) { appendLogText(i18n("Warning: job '%1' lost connection to INDI server while guiding, marking aborted.",currentJob->getName())); + + // Let the Scheduler attempt to connect INDI again currentJob->setState(SchedulerJob::JOB_ABORTED); - checkShutdownState(); + stopCurrentJobAction(); + stopGuiding(); + disconnectINDI(); + stopEkos(); return; } @@ -3359,8 +3411,13 @@ if (captureReply.error().type() == QDBusError::UnknownObject) { appendLogText(i18n("Warning: job '%1' lost connection to INDI server while capturing, marking aborted.",currentJob->getName())); + + // Let the Scheduler attempt to connect INDI again currentJob->setState(SchedulerJob::JOB_ABORTED); - checkShutdownState(); + stopCurrentJobAction(); + stopGuiding(); + disconnectINDI(); + stopEkos(); } else if (captureReply.value().toStdString() == "Aborted" || captureReply.value().toStdString() == "Error") { @@ -4003,12 +4060,12 @@ QDBusReply const slewModeReply = mountInterface->callWithArgumentList(QDBus::AutoDetect, "slew", telescopeSlew); if (slewModeReply.error().type() != QDBusError::NoError) { - /* FIXME: manage error */ qCCritical(KSTARS_EKOS_SCHEDULER) << QString("Warning: job '%1' slew request received DBUS error: %2").arg(currentJob->getName(), QDBusError::errorString(slewModeReply.error().type())); - return; + currentJob->setState(SchedulerJob::JOB_ABORTED); + stopCurrentJobAction(); + stopGuiding(); } - - currentJob->setStage(SchedulerJob::STAGE_SLEWING); + else currentJob->setStage(SchedulerJob::STAGE_SLEWING); } void Scheduler::startFocusing() @@ -4034,6 +4091,9 @@ if (focusModeReply.error().type() != QDBusError::NoError) { qCCritical(KSTARS_EKOS_SCHEDULER) << QString("Warning: job '%1' canAutoFocus request received DBUS error: %2").arg(currentJob->getName(), QDBusError::errorString(focusModeReply.error().type())); + currentJob->setState(SchedulerJob::JOB_ABORTED); + stopCurrentJobAction(); + stopGuiding(); return; } @@ -4056,6 +4116,9 @@ if ((reply = focusInterface->call(QDBus::AutoDetect, "resetFrame")).type() == QDBusMessage::ErrorMessage) { qCCritical(KSTARS_EKOS_SCHEDULER) << QString("Warning: job '%1' resetFrame request received DBUS error: %2").arg(currentJob->getName(), reply.errorMessage()); + currentJob->setState(SchedulerJob::JOB_ABORTED); + stopCurrentJobAction(); + stopGuiding(); return; } @@ -4068,14 +4131,20 @@ QDBusMessage::ErrorMessage) { qCCritical(KSTARS_EKOS_SCHEDULER) << QString("Warning: job '%1' setAutoFocusStar request received DBUS error: %1").arg(currentJob->getName(), reply.errorMessage()); + currentJob->setState(SchedulerJob::JOB_ABORTED); + stopCurrentJobAction(); + stopGuiding(); return; } } // Start auto-focus if ((reply = focusInterface->call(QDBus::AutoDetect, "start")).type() == QDBusMessage::ErrorMessage) { qCCritical(KSTARS_EKOS_SCHEDULER) << QString("Warning: job '%1' startFocus request received DBUS error: %2").arg(currentJob->getName(), reply.errorMessage()); + currentJob->setState(SchedulerJob::JOB_ABORTED); + stopCurrentJobAction(); + stopGuiding(); return; } @@ -4282,6 +4351,7 @@ if ((reply = alignInterface->callWithArgumentList(QDBus::AutoDetect, "loadAndSlew", solveArgs)).type() == QDBusMessage::ErrorMessage) { + /* FIXME: Manage error */ qCCritical(KSTARS_EKOS_SCHEDULER) << QString("Warning: job '%1' loadAndSlew request received DBUS error: %2").arg(currentJob->getName(), reply.errorMessage()); return; } @@ -4293,6 +4363,7 @@ { if ((reply = alignInterface->call(QDBus::AutoDetect, "captureAndSolve")).type() == QDBusMessage::ErrorMessage) { + /* FIXME: Manage error */ qCCritical(KSTARS_EKOS_SCHEDULER) << QString("Warning: job '%1' captureAndSolve request received DBUS error: %2").arg(currentJob->getName(), reply.errorMessage()); return; }