diff --git a/kstars/ekos/align/align.cpp b/kstars/ekos/align/align.cpp --- a/kstars/ekos/align/align.cpp +++ b/kstars/ekos/align/align.cpp @@ -2715,7 +2715,9 @@ if (targetPosition > 0 && targetPosition != currentFilterPosition) { filterPositionPending = true; - filterManager->setFilterPosition(targetPosition); + // Disabling the autofocus policy for align. + filterManager->setFilterPosition( + targetPosition, FilterManager::NO_AUTOFOCUS_POLICY); state = ALIGN_PROGRESS; return true; } diff --git a/kstars/ekos/auxiliary/filtermanager.h b/kstars/ekos/auxiliary/filtermanager.h --- a/kstars/ekos/auxiliary/filtermanager.h +++ b/kstars/ekos/auxiliary/filtermanager.h @@ -41,7 +41,8 @@ CHANGE_POLICY = 1 << 0, OFFSET_POLICY = 1 << 1, AUTOFOCUS_POLICY = 1 << 2, - ALL_POLICIES = CHANGE_POLICY | OFFSET_POLICY | AUTOFOCUS_POLICY + ALL_POLICIES = CHANGE_POLICY | OFFSET_POLICY | AUTOFOCUS_POLICY, + NO_AUTOFOCUS_POLICY = CHANGE_POLICY | OFFSET_POLICY } FilterPolicy; FilterManager(); diff --git a/kstars/ekos/capture/capture.h b/kstars/ekos/capture/capture.h --- a/kstars/ekos/capture/capture.h +++ b/kstars/ekos/capture/capture.h @@ -900,6 +900,7 @@ FocusState focusState { FOCUS_IDLE }; GuideState guideState { GUIDE_IDLE }; AlignState alignState { ALIGN_IDLE }; + FilterState filterManagerState { FILTER_IDLE }; PauseFunctionPointer pauseFunction; diff --git a/kstars/ekos/capture/capture.cpp b/kstars/ekos/capture/capture.cpp --- a/kstars/ekos/capture/capture.cpp +++ b/kstars/ekos/capture/capture.cpp @@ -1936,7 +1936,14 @@ abort(); return; } - + // This test must be placed before the FOCUS_PROGRESS test, + // as sometimes the FilterManager can cause a auto-focus. + if (filterManagerState != FILTER_IDLE) + { + // Try again in 1 second if FilterManager is busy. + QTimer::singleShot(1000, this, &Ekos::Capture::captureImage); + return; + } if (focusState >= FOCUS_PROGRESS) { appendLogText(i18n("Cannot capture while focus module is busy.")); @@ -6192,6 +6199,7 @@ connect(filterManager.data(), &FilterManager::newStatus, [this](Ekos::FilterState filterState) { + filterManagerState = filterState; if (m_State == CAPTURE_CHANGING_FILTER) { secondsLabel->setText(Ekos::getFilterStatusString(filterState));