Git commit 81d9fb06f0f5d7527d9452028245f2d9700bc333 by Jasem Mutlaq. Committed on 30/09/2017 at 19:54. Pushed by mutlaqja into branch 'filtermanager'. Migrate Capture module to Filter Manager. All policies including locked fil= ter, offsets, and autofocus operations are applicable when changing filters M +127 -73 kstars/ekos/capture/capture.cpp M +6 -15 kstars/ekos/capture/capture.h M +3 -3 kstars/ekos/capture/capture.ui https://commits.kde.org/kstars/81d9fb06f0f5d7527d9452028245f2d9700bc333 diff --git a/kstars/ekos/capture/capture.cpp b/kstars/ekos/capture/capture.= cpp index 55d79286a..a60697785 100644 --- a/kstars/ekos/capture/capture.cpp +++ b/kstars/ekos/capture/capture.cpp @@ -78,7 +78,7 @@ Capture::Capture() filterManagerB->setIcon(QIcon::fromTheme("view-filter", QIcon(":/icons= /breeze/default/view-filter.svg"))); filterManagerB->setAttribute(Qt::WA_LayoutUsesWidgetRect); = - FilterCaptureCombo->addItem("--"); + FilterDevicesCombo->addItem("--"); = connect(binXIN, SIGNAL(valueChanged(int)), binYIN, SLOT(setValue(int))= ); = @@ -90,7 +90,7 @@ Capture::Capture() guideDeviationTimer.setInterval(GD_TIMER_TIMEOUT); connect(&guideDeviationTimer, SIGNAL(timeout()), this, SLOT(checkGuide= DeviationTimeout())); = - connect(FilterCaptureCombo, SIGNAL(activated(int)), this, SLOT(checkFi= lter(int))); + connect(FilterDevicesCombo, SIGNAL(activated(int)), this, SLOT(checkFi= lter(int))); = connect(temperatureCheck, &QCheckBox::toggled, [this](bool toggled) { @@ -198,8 +198,8 @@ Capture::Capture() targetADU =3D Options::calibrationADUValue(); targetADUTolerance =3D Options::calibrationADUValueTolerance(); = - // Load FIlter Offets - loadFilterOffsets(); + // Load FIlter Offets = + //loadFilterOffsets(); } = Capture::~Capture() @@ -246,7 +246,7 @@ void Capture::addFilter(ISD::GDInterface *newFilter) return; } = - FilterCaptureCombo->addItem(newFilter->getDeviceName()); + FilterDevicesCombo->addItem(newFilter->getDeviceName()); = Filters.append(static_cast(newFilter)); = @@ -254,7 +254,7 @@ void Capture::addFilter(ISD::GDInterface *newFilter) = checkFilter(1); = - FilterCaptureCombo->setCurrentIndex(1); + FilterDevicesCombo->setCurrentIndex(1); } = void Capture::pause() @@ -358,7 +358,7 @@ void Capture::start() spikeDetected =3D false; = = - // FIXME + // FIXME Migrate to Filter Manager #if 0 lastFilterOffset =3D 0; // lastFilterOffset should be set to the offset of the current used fi= lter so that any subsequent filter change @@ -936,8 +936,8 @@ bool Capture::setFilter(QString device, int filterSlot) { bool deviceFound =3D false; = - for (int i =3D 1; i < FilterCaptureCombo->count(); i++) - if (device =3D=3D FilterCaptureCombo->itemText(i)) + for (int i =3D 1; i < FilterDevicesCombo->count(); i++) + if (device =3D=3D FilterDevicesCombo->itemText(i)) { checkFilter(i); deviceFound =3D true; @@ -947,8 +947,8 @@ bool Capture::setFilter(QString device, int filterSlot) if (deviceFound =3D=3D false) return false; = - if (filterSlot < FilterCaptureCombo->count()) - FilterCaptureCombo->setCurrentIndex(filterSlot); + if (filterSlot < FilterDevicesCombo->count()) + FilterDevicesCombo->setCurrentIndex(filterSlot); = return true; } @@ -957,7 +957,7 @@ void Capture::checkFilter(int filterNum) { if (filterNum =3D=3D -1) { - filterNum =3D FilterCaptureCombo->currentIndex(); + filterNum =3D FilterDevicesCombo->currentIndex(); if (filterNum =3D=3D -1) return; } @@ -1257,7 +1257,7 @@ bool Capture::resumeSequence() // Otherwise, let's prepare for next exposure after making sure in-seq= uence focus and dithering are complete if applicable. else { - isAutoFocus =3D (autofocusCheck->isEnabled() && autofocusCheck->is= Checked() && HFRPixels->value() > 0); + isAutoFocus =3D (autofocusCheck->isEnabled() && autofocusCheck->is= Checked()/* && HFRPixels->value() > 0*/); if (isAutoFocus) requiredAutoFocusStarted =3D false; = @@ -1315,7 +1315,10 @@ bool Capture::resumeSequence() else if (isAutoFocus && activeJob->getFrameType() =3D=3D FRAME_LIG= HT) { secondsLabel->setText(i18n("Focusing...")); - emit checkFocus(HFRPixels->value()); + if (HFRPixels->value() =3D=3D 0) + emit checkFocus(0.1); + else + emit checkFocus(HFRPixels->value()); = qCDebug(KSTARS_EKOS_CAPTURE) << "In-sequence focusing started.= .."; = @@ -1718,7 +1721,10 @@ bool Capture::addJob(bool preview) if (jobUnderEdit) job =3D jobs.at(queueTable->currentRow()); else + { job =3D new SequenceJob(); + job->setFilterManager(filterManager); + } = if (job =3D=3D nullptr) { @@ -1790,6 +1796,8 @@ bool Capture::addJob(bool preview) } = job->setFrame(frameXIN->value(), frameYIN->value(), frameWIN->value(),= frameHIN->value()); + job->setRemoteDir(remoteDirIN->text()); + job->setLocalDir(fitsDir->text()); = if (jobUnderEdit =3D=3D false) { @@ -1809,8 +1817,6 @@ bool Capture::addJob(bool preview) if ((job->getFrameType() =3D=3D FRAME_LIGHT || job->getFrameType() =3D= =3D FRAME_FLAT) && job->getFilterName().isEmpty() =3D=3D false) directoryPostfix +=3D QLatin1Literal("/") + job->getFilterName(); = - job->setRemoteDir(remoteDirIN->text()); - job->setLocalDir(fitsDir->text()); job->setDirectoryPostfix(directoryPostfix); = int currentRow =3D 0; @@ -2189,66 +2195,50 @@ void Capture::prepareJob(SequenceJob *job) = void Capture::preparePreCaptureActions() { + // Update position if (currentFilterPosition > 0) - { activeJob->setCurrentFilter(currentFilterPosition); = - if (currentFilterPosition !=3D activeJob->getTargetFilter()) - { - appendLogText(i18n("Changing filter to %1...", FilterPosCombo-= >itemText(activeJob->getTargetFilter() - 1))); - secondsLabel->setText(i18n("Set filter...")); - - if (activeJob->isPreview() =3D=3D false) - { - state =3D CAPTURE_CHANGING_FILTER; - emit newStatus(Ekos::CAPTURE_CHANGING_FILTER); - } - - setBusy(true); - } - } - + // update temperature if (currentCCD->hasCooler() && activeJob->getEnforceTemperature()) { - if (activeJob->getCurrentTemperature() !=3D INVALID_VALUE && - fabs(activeJob->getCurrentTemperature() - activeJob->getTarget= Temperature()) > - Options::maxTemperatureDiff()) - { - appendLogText(i18n("Setting temperature to %1 C...", activeJob= ->getTargetTemperature())); - secondsLabel->setText(i18n("Set %1 C...", activeJob->getTarget= Temperature())); - - if (activeJob->isPreview() =3D=3D false) - { - state =3D CAPTURE_SETTING_TEMPERATURE; - emit newStatus(Ekos::CAPTURE_SETTING_TEMPERATURE); - } - - setBusy(true); - } + double temperature =3D 0; + currentCCD->getTemperature(&temperature); + activeJob->setCurrentTemperature(temperature); } = + // update rotator angle if (currentRotator !=3D nullptr && activeJob->getTargetRotation() !=3D= INVALID_VALUE) - { activeJob->setCurrentRotation(rotatorSettings->getCurrentRotationP= A()); = - if (rotatorSettings->getCurrentRotationPA() !=3D activeJob->getTar= getRotation()) - { - appendLogText(i18n("Setting rotation to %1 degrees E of N...",= activeJob->getTargetRotation())); - secondsLabel->setText(i18n("Set Rotator %1...", activeJob->get= TargetRotation())); + setBusy(true); + connect(activeJob, SIGNAL(prepareState(Ekos::CaptureState)), this, SLO= T(updatePrepareState(Ekos::CaptureState))); + connect(activeJob, SIGNAL(prepareComplete()), this, SLOT(executeJob())= ); = - if (activeJob->isPreview() =3D=3D false) - { - state =3D CAPTURE_SETTING_ROTATOR; - emit newStatus(Ekos::CAPTURE_SETTING_ROTATOR); - } + activeJob->prepareCapture(); +} = - setBusy(true); - } - } +void Capture::updatePrepareState(Ekos::CaptureState prepareState) +{ + state =3D prepareState; + emit newStatus(prepareState); = - connect(activeJob, SIGNAL(prepareComplete()), this, SLOT(executeJob())= ); + switch (prepareState) + { + case CAPTURE_SETTING_TEMPERATURE: + appendLogText(i18n("Setting temperature to %1 C...", activeJob->ge= tTargetTemperature())); + secondsLabel->setText(i18n("Set %1 C...", activeJob->getTargetTemp= erature())); + break; = - activeJob->prepareCapture(); + case CAPTURE_SETTING_ROTATOR: + appendLogText(i18n("Setting rotation to %1 degrees E of N...", act= iveJob->getTargetRotation())); + secondsLabel->setText(i18n("Set Rotator %1...", activeJob->getTarg= etRotation())); + break; + + default: + break; + + } } = void Capture::executeJob() @@ -2426,7 +2416,7 @@ void Capture::setFocusStatus(FocusState state) { if (focusState =3D=3D FOCUS_COMPLETE) { - HFRPixels->setValue(focusHFR + (focusHFR * 0.025)); + //HFRPixels->setValue(focusHFR + (focusHFR * 0.025)); appendLogText(i18n("Focus complete.")); } else if (focusState =3D=3D FOCUS_FAILED) @@ -2434,9 +2424,7 @@ void Capture::setFocusStatus(FocusState state) appendLogText(i18n("Autofocus failed. Aborting exposure...")); secondsLabel->setText(""); abort(); - } - - activeJob->setFilterPostFocusReady(focusState =3D=3D FOCUS_COMPLET= E); + } = return; } = @@ -2638,7 +2626,7 @@ bool Capture::loadSequenceQueue(const QString &fileUR= L) } else if (!strcmp(tagXMLEle(ep), "FilterWheel")) { - FilterCaptureCombo->setCurrentText(pcdataXMLEle(ep)); + FilterDevicesCombo->setCurrentText(pcdataXMLEle(ep)); checkFilter(); } else @@ -2959,7 +2947,7 @@ bool Capture::saveSequenceQueue(const QString &path) if (observerName.isEmpty() =3D=3D false) outstream << "" << observerName << "" << endl; outstream << "" << CCDCaptureCombo->currentText() << "" << = endl; - outstream << "" << FilterCaptureCombo->currentText() << "= " << endl; + outstream << "" << FilterDevicesCombo->currentText() << "= " << endl; outstream << "is= Checked() ? "true" : "false") << "'>" << guideDeviation->value() << "" << endl; outstream << "isChecked() = ? "true" : "false") << "'>" @@ -3124,6 +3112,7 @@ void Capture::syncGUIToJob(SequenceJob *job) uploadModeCombo->setCurrentIndex(job->getUploadMode()); remoteDirIN->setEnabled(uploadModeCombo->currentIndex() !=3D 0); remoteDirIN->setText(job->getRemoteDir()); + fitsDir->setText(job->getLocalDir()); = // Temperature Options temperatureCheck->setChecked(job->getEnforceTemperature()); @@ -3139,9 +3128,7 @@ void Capture::syncGUIToJob(SequenceJob *job) preDomePark =3D job->isPreDomePark(); = // Custom Properties - customPropertiesDialog->setCustomProperties(job->getCustomProperties()= ); - - fitsDir->setText(job->getLocalDir()); + customPropertiesDialog->setCustomProperties(job->getCustomProperties()= ); = = if (ISOCombo->isEnabled()) ISOCombo->setCurrentIndex(job->getISOIndex()); @@ -4486,8 +4473,10 @@ void Capture::postScriptFinished(int exitCode) resumeSequence(); } = +// FIXME Migrate to Filter Manager +#if 0 void Capture::loadFilterOffsets() -{ +{ = // Get all OAL equipment filter list KStarsData::Instance()->userdb()->GetAllFilters(m_filterList); filterFocusOffsets.clear(); @@ -4601,6 +4590,7 @@ void Capture::showFilterOffsetDialog() } } } +#endif = void Capture::toggleVideoStream(bool enable) { @@ -4738,7 +4728,71 @@ void Capture::setAlignResults(double orientation, do= uble ra, double de, double p void Capture::setFilterManager(const QSharedPointer &manage= r) { filterManager =3D manager; - connect(filterManagerB, SIGNAL(clicked()), filterManager.data(), SLOT(= show()), Qt::UniqueConnection); + connect(filterManagerB, &QPushButton::clicked, [this]() + { + filterManager->show(); + filterManager->raise(); + }); + + connect(filterManager.data(), &FilterManager::ready, [this]() + { + currentFilterPosition =3D filterManager->getFilterPosition(); + // Due to race condition, + focusState =3D FOCUS_IDLE; + if (activeJob) + activeJob->setCurrentFilter(currentFilterPosition); + + } + ); + + connect(filterManager.data(), &FilterManager::failed, [this]() + { + if (activeJob) + { + appendLogText(i18n("Filter operation failed.")); + abort(); + } + } + ); + + connect(filterManager.data(), &FilterManager::newStatus, [this](Ekos::= FilterState filterState) + { + if (state =3D=3D CAPTURE_CHANGING_FILTER) + { + secondsLabel->setText(Ekos::getFilterStatusString(filterState)= ); + switch (filterState) + { + case FILTER_OFFSET: + appendLogText(i18n("Changing focus offset by %1 steps.= ..", filterManager->getTargetFilterOffset())); + break; + + case FILTER_CHANGE: + appendLogText(i18n("Changing filter to %1...", FilterP= osCombo->itemText(filterManager->getTargetFilterPosition()-1))); + break; + + case FILTER_AUTOFOCUS: + appendLogText(i18n("Auto focus on filter change...")); + clearAutoFocusHFR(); + break; + + default: + break; + } + } + }); + + connect(filterManager.data(), &FilterManager::labelsChanged, this, [th= is]() + { + FilterPosCombo->clear(); + FilterPosCombo->addItems(filterManager->getFilterLabels()); + currentFilterPosition =3D filterManager->getFilterPosition(); + FilterPosCombo->setCurrentIndex(currentFilterPosition-1); + }); + connect(filterManager.data(), &FilterManager::positionChanged, this, [= this]() + { + currentFilterPosition =3D filterManager->getFilterPosition(); + FilterPosCombo->setCurrentIndex(currentFilterPosition-1); + }); } = } diff --git a/kstars/ekos/capture/capture.h b/kstars/ekos/capture/capture.h index 4f9c167ab..7038c8143 100644 --- a/kstars/ekos/capture/capture.h +++ b/kstars/ekos/capture/capture.h @@ -453,7 +453,7 @@ class Capture : public QWidget, public Ui::Capture = // Auto Focus //void updateAutofocusStatus(bool status, double HFR); - void startPostFilterAutoFocus(); + //void startPostFilterAutoFocus(); = // Timed refocus void startRefocusEveryNTimer(); @@ -476,8 +476,8 @@ class Capture : public QWidget, public Ui::Capture void postScriptFinished(int exitCode); = // Filter focus offset - void showFilterOffsetDialog(); - void loadFilterOffsets(); + //void showFilterOffsetDialog(); + //void loadFilterOffsets(); = // Live Video Preview void toggleVideoStream(bool enable); @@ -486,6 +486,9 @@ class Capture : public QWidget, public Ui::Capture // Observer void showObserverDialog(); = + // Active Job Prepare State + void updatePrepareState(Ekos::CaptureState prepareState); + // Rotator void updateRotatorNumber(INumberVectorProperty *nvp); = @@ -636,18 +639,6 @@ class Capture : public QWidget, public Ui::Capture // How many images to capture before dithering operation is executed? uint8_t ditherCounter { 0 }; = - // Map of filter focus offsets - struct FocusOffset - { - QString filter; - int16_t offset { 0 }; - }; - - QList filterFocusOffsets; - int16_t lastFilterOffset { 0 }; - - QList m_filterList; - std::unique_ptr customPropertiesDialog; = // Filter Manager diff --git a/kstars/ekos/capture/capture.ui b/kstars/ekos/capture/capture.ui index 7100a8ef2..e3e3cd21e 100644 --- a/kstars/ekos/capture/capture.ui +++ b/kstars/ekos/capture/capture.ui @@ -154,7 +154,7 @@ - + 0 @@ -182,7 +182,7 @@ - Filter focus offsets + Filter Settings @@ -1914,7 +1914,7 @@ CCDCaptureCombo - FilterCaptureCombo + FilterDevicesCombo filterManagerB temperatureCheck temperatureIN