7#include "buildfilteroffsets.h"
8#include <kstars_debug.h>
10#include "indi_debug.h"
11#include "kstarsdata.h"
13#include "ekos/focus/focus.h"
14#include "ekos/manager.h"
16#include "auxiliary/kspaths.h"
17#include "auxiliary/ksmessagebox.h"
18#include "ekos/auxiliary/tabledelegate.h"
21#include <QSqlTableModel>
22#include <QSqlDatabase>
25#include <basedevice.h>
32FilterManager::FilterManager(QWidget *parent) : QDialog(parent)
40 connect(buttonBox, SIGNAL(accepted()),
this, SLOT(
close()));
41 connect(buttonBox, SIGNAL(rejected()),
this, SLOT(
close()));
45 kcfg_FlatSyncFocus->setChecked(Options::flatSyncFocus());
48 Options::setFlatSyncFocus(kcfg_FlatSyncFocus->isChecked());
52 m_FilterChangeTimeout.setSingleShot(
true);
53 m_FilterChangeTimeout.setInterval(30000);
59 noEditDelegate =
new NotEditableDelegate(m_FilterView);
60 m_FilterView->setItemDelegateForColumn(FM_LABEL, noEditDelegate);
63 exposureDelegate =
new DoubleDelegate(m_FilterView, 0.001, 3600, 1);
64 m_FilterView->setItemDelegateForColumn(FM_EXPOSURE, exposureDelegate);
67 offsetDelegate =
new IntegerDelegate(m_FilterView, -10000, 10000, 1);
68 m_FilterView->setItemDelegateForColumn(FM_OFFSET, offsetDelegate);
71 useAutoFocusDelegate =
new ToggleDelegate(m_FilterView);
72 m_FilterView->setItemDelegateForColumn(FM_AUTO_FOCUS, useAutoFocusDelegate);
75 lockDelegate =
new ComboDelegate(m_FilterView);
76 m_FilterView->setItemDelegateForColumn(FM_LOCK_FILTER, lockDelegate);
77 lockDelegate->setValues(getLockDelegates());
81 lastAFSolutionDelegate =
new IntegerDelegate(m_FilterView, 0, 1000000, 1);
82 m_FilterView->setItemDelegateForColumn(FM_LAST_AF_SOLUTION, lastAFSolutionDelegate);
85 lastAFTempDelegate =
new DoubleDelegate(m_FilterView, -60.0, 60.0, 1.0);
86 m_FilterView->setItemDelegateForColumn(FM_LAST_AF_TEMP, lastAFTempDelegate);
89 lastAFAltDelegate =
new DoubleDelegate(m_FilterView, 0.0, 90.0, 1.0);
90 m_FilterView->setItemDelegateForColumn(FM_LAST_AF_ALT, lastAFAltDelegate);
93 lastAFDTDelegate =
new DatetimeDelegate(m_FilterView, DATETIME_FORMAT,
"2025-01-01",
"2100-01-01",
false);
94 m_FilterView->setItemDelegateForColumn(FM_LAST_AF_DATETIME, lastAFDTDelegate);
97 ticksPerTempDelegate =
new DoubleDelegate(m_FilterView, -10000.0, 10000.0, 1.0);
98 m_FilterView->setItemDelegateForColumn(FM_TICKS_PER_TEMP, ticksPerTempDelegate);
101 ticksPerAltDelegate =
new DoubleDelegate(m_FilterView, -10000.0, 10000.0, 1.0);
102 m_FilterView->setItemDelegateForColumn(FM_TICKS_PER_ALT, ticksPerAltDelegate);
105 wavelengthDelegate =
new IntegerDelegate(m_FilterView, 200, 1000, 50);
106 m_FilterView->setItemDelegateForColumn(FM_WAVELENGTH, wavelengthDelegate);
109void FilterManager::createFilterModel()
114 m_FilterView->setModel(m_FilterModel);
115 m_FilterModel->setTable(
"filter");
126 m_FilterModel->setHeaderData(FM_AUTO_FOCUS,
Qt::Horizontal,
i18n(
"Start Auto Focus when filter is activated"),
130 m_FilterModel->setHeaderData(FM_LOCK_FILTER,
Qt::Horizontal,
i18n(
"Lock specific filter when running Auto Focus"),
135 i18n(
"Last AF solution. Updated automatically by the autofocus process."),
Qt::ToolTipRole);
136 m_FilterModel->setHeaderData(FM_LAST_AF_SOLUTION,
Qt::Horizontal,
i18n(
"Last AF Solution"));
139 i18n(
"The temperature of the last AF solution. Updated automatically by the autofocus process."),
Qt::ToolTipRole);
140 m_FilterModel->setHeaderData(FM_LAST_AF_TEMP,
Qt::Horizontal,
i18n(
"Last AF Temp (°C)"));
143 i18n(
"The altitude of the last AF solution. Updated automatically by the autofocus process."),
Qt::ToolTipRole);
144 m_FilterModel->setHeaderData(FM_LAST_AF_ALT,
Qt::Horizontal,
i18n(
"Last AF Alt (°Alt)"));
147 i18n(
"The datetime of the last AF solution. Updated automatically by the autofocus process."),
Qt::ToolTipRole);
148 m_FilterModel->setHeaderData(FM_LAST_AF_DATETIME,
Qt::Horizontal,
i18n(
"Last AF Datetime"));
151 i18n(
"The number of ticks per °C increase in temperature. +ve for outward focuser movement"),
Qt::ToolTipRole);
155 i18n(
"The number of ticks per degree increase in altitude. +ve for outward focuser movement"),
Qt::ToolTipRole);
167 if (topLeft.
column() == FM_EXPOSURE)
168 emit exposureChanged(m_FilterModel->data(topLeft).toDouble());
169 else if (topLeft.
column() == FM_LOCK_FILTER)
173 QString lock = m_FilterModel->
data(m_FilterModel->index(topLeft.
row(), topLeft.
column())).toString();
174 QString filter = m_FilterModel->data(m_FilterModel->index(topLeft.
row(), FM_LABEL)).toString();
175 bool alreadyALock =
false;
176 for (
int i = 0; i < m_ActiveFilters.count(); i++)
178 if (m_ActiveFilters[i]->lockedFilter() == filter)
184 if (alreadyALock || (lock == filter))
186 m_FilterModel->setData(m_FilterModel->index(topLeft.
row(), topLeft.
column()), NULL_FILTER);
189 lockDelegate->setValues(getLockDelegates());
191 else if (topLeft.
column() == FM_TICKS_PER_TEMP)
192 emit ticksPerTempChanged();
193 else if (topLeft.
column() == FM_TICKS_PER_ALT)
194 emit ticksPerAltChanged();
195 else if (topLeft.
column() == FM_WAVELENGTH)
196 emit wavelengthChanged();
200void FilterManager::refreshFilterModel()
202 if (m_FilterWheel ==
nullptr || m_currentFilterLabels.empty())
206 if (m_FilterModel ==
nullptr)
209 QString vendor(m_FilterWheel->getDeviceName());
210 m_FilterModel->setFilter(
QString(
"vendor='%1'").arg(vendor));
211 m_FilterModel->select();
213 m_FilterView->hideColumn(0);
214 m_FilterView->hideColumn(1);
215 m_FilterView->hideColumn(2);
216 m_FilterView->hideColumn(3);
220 if (m_FilterModel->rowCount() > 0 && m_FilterModel->rowCount() != m_currentFilterLabels.count())
222 for (
int i = 0; i < m_FilterModel->rowCount(); i++)
223 m_FilterModel->removeRow(i);
225 m_FilterModel->select();
229 if (m_FilterModel->rowCount() == 0)
231 filterProperties *fp =
new filterProperties(vendor,
"",
"",
"");
232 for (
QString &filter : m_currentFilterLabels)
235 KStarsData::Instance()->userdb()->AddFilter(fp);
238 m_FilterModel->select();
243 for (
int i = 0; i < m_FilterModel->rowCount(); ++i)
245 QModelIndex index = m_FilterModel->index(i, FM_LABEL);
246 if (m_FilterModel->data(index).toString() != m_currentFilterLabels[i])
248 m_FilterModel->setData(index, m_currentFilterLabels[i]);
253 lockDelegate->setValues(getLockDelegates());
259void FilterManager::resizeDialog()
263 int width = m_FilterView->horizontalHeader()->length() + 50;
264 int height =
label->height() + m_FilterView->verticalHeader()->
length() + label_2->height() + buttonBox->height() + 100;
265 this->resize(width, height);
273 for (
int i = 0; i < m_ActiveFilters.count(); i++)
275 if (m_ActiveFilters[i]->lockedFilter() == NULL_FILTER)
276 lockDelegates.
append(m_ActiveFilters[i]->color());
278 return lockDelegates;
281void FilterManager::reloadFilters()
283 qDeleteAll(m_ActiveFilters);
284 currentFilter =
nullptr;
285 targetFilter =
nullptr;
286 m_ActiveFilters.clear();
287 operationQueue.clear();
289 filterProperties *fp =
new filterProperties(
"",
"",
"",
"");
291 for (
int i = 0; i < m_FilterModel->rowCount(); ++i)
303 fp->useAutoFocus = record.
value(
"UseAutoFocus").
toInt() == 1;
304 fp->absFocusPos = record.
value(
"AbsoluteFocusPosition").
toInt();
305 fp->focusTemperature = record.
value(
"FocusTemperature").
toDouble();
306 fp->focusAltitude = record.
value(
"FocusAltitude").
toDouble();
307 fp->focusDatetime = record.
value(
"FocusDatetime").
toString();
308 fp->focusTicksPerTemp = record.
value(
"FocusTicksPerTemp").
toDouble();
309 fp->focusTicksPerAlt = record.
value(
"FocusTicksPerAlt").
toDouble();
310 fp->wavelength = record.
value(
"Wavelength").
toInt();
312 m_ActiveFilters.append(o);
316void FilterManager::setFilterWheel(ISD::FilterWheel *filter)
319 if (m_FilterWheel == filter && m_FilterNameProperty && m_FilterPositionProperty)
321 else if (m_FilterWheel)
322 m_FilterWheel->disconnect(
this);
326 m_FilterNameProperty =
nullptr;
327 m_FilterPositionProperty =
nullptr;
328 m_FilterConfirmSet =
nullptr;
333 connect(m_FilterWheel, &ISD::ConcreteDevice::propertyUpdated,
this, &FilterManager::updateProperty);
334 connect(m_FilterWheel, &ISD::ConcreteDevice::Disconnected,
this, &FilterManager::processDisconnect);
336 refreshFilterProperties();
339void FilterManager::refreshFilterProperties()
341 if (m_FilterNameProperty && m_FilterPositionProperty)
343 if (m_FilterConfirmSet ==
nullptr)
344 m_FilterConfirmSet = m_FilterWheel->getSwitch(
"CONFIRM_FILTER_SET");
347 if (m_currentFilterLabels.count() == m_FilterNameProperty->ntp)
351 filterNameLabel->setText(m_FilterWheel->getDeviceName());
353 m_currentFilterLabels.clear();
355 m_FilterNameProperty = m_FilterWheel->getText(
"FILTER_NAME");
356 m_FilterPositionProperty = m_FilterWheel->getNumber(
"FILTER_SLOT");
357 m_FilterConfirmSet = m_FilterWheel->getSwitch(
"CONFIRM_FILTER_SET");
359 refreshFilterLabels();
360 refreshFilterPosition();
362 if (m_currentFilterPosition >= 1 && m_currentFilterPosition <= m_ActiveFilters.count())
363 lastFilterOffset = m_ActiveFilters[m_currentFilterPosition - 1]->offset();
366QStringList FilterManager::getFilterLabels(
bool forceRefresh)
368 if ((!m_currentFilterLabels.empty() && forceRefresh ==
false) || !m_FilterNameProperty || !m_FilterPositionProperty)
369 return m_currentFilterLabels;
373 for (
int i = 0; i < m_FilterPositionProperty->np[0].max; i++)
375 if (m_FilterNameProperty !=
nullptr && (i < m_FilterNameProperty->ntp))
376 filterList.
append(m_FilterNameProperty->tp[i].text);
382int FilterManager::getFilterPosition(
bool forceRefresh)
384 if (forceRefresh ==
false || m_FilterPositionProperty ==
nullptr)
385 return m_currentFilterPosition;
387 return static_cast<int>(m_FilterPositionProperty->np[0].value);
390void FilterManager::refreshFilterLabels()
392 QList filters = getFilterLabels(
true);
394 if (filters != m_currentFilterLabels)
396 m_currentFilterLabels = filters;
397 refreshFilterModel();
399 emit labelsChanged(filters);
402 refreshFilterPosition();
406void FilterManager::refreshFilterPosition()
409 int pos = getFilterPosition(
true);
410 if (pos != m_currentFilterPosition)
412 m_currentFilterPosition = pos;
413 emit positionChanged(pos);
417bool FilterManager::setFilterPosition(uint8_t position, FilterPolicy policy)
420 if (position > m_ActiveFilters.count() || m_currentFilterPosition < 1 || position < 1)
424 currentFilter = m_ActiveFilters[m_currentFilterPosition - 1];
425 targetFilter = m_ActiveFilters[position - 1];
427 buildOperationQueue(FILTER_CHANGE);
429 executeOperationQueue();
435void FilterManager::updateProperty(INDI::Property prop)
437 if (m_FilterWheel ==
nullptr || m_FilterWheel->getDeviceName() != prop.getDeviceName())
440 if (prop.isNameMatch(
"FILTER_NAME"))
442 auto tvp = prop.getText();
443 m_FilterNameProperty = tvp;
445 refreshFilterLabels();
447 else if (prop.isNameMatch(
"FILTER_SLOT"))
449 m_FilterChangeTimeout.stop();
451 auto nvp = prop.getNumber();
454 if (state == FILTER_CHANGE && nvp->s == IPS_ALERT)
460 if (nvp->s != IPS_OK)
463 m_FilterPositionProperty = nvp;
464 refreshFilterPosition();
466 if (state == FILTER_CHANGE)
467 executeOperationQueue();
469 else if (state == FILTER_IDLE && m_ActiveFilters.count() >= m_currentFilterPosition)
470 lastFilterOffset = m_ActiveFilters[m_currentFilterPosition - 1]->offset();
475void FilterManager::processDisconnect()
477 m_currentFilterLabels.clear();
478 m_currentFilterPosition = -1;
479 m_FilterNameProperty =
nullptr;
480 m_FilterPositionProperty =
nullptr;
483void FilterManager::buildOperationQueue(FilterState operation)
485 operationQueue.clear();
486 m_useTargetFilter =
false;
497 if (m_FocusReady && (m_Policy & AUTOFOCUS_POLICY) && targetFilter->useAutoFocus())
498 if ((targetFilter != currentFilter) || (m_LastAFFailed.value(targetFilter->color(), FALSE)))
501 if ( (m_Policy & CHANGE_POLICY) && targetFilter != currentFilter)
502 m_useTargetFilter =
true;
504 if (m_useTargetFilter)
506 operationQueue.enqueue(FILTER_CHANGE);
507 if (m_FocusReady && (m_Policy & OFFSET_POLICY))
508 operationQueue.enqueue(FILTER_OFFSET);
512 lastFilterOffset = targetFilter->offset();
513 currentFilter = targetFilter;
519 operationQueue.enqueue(FILTER_AUTOFOCUS);
528bool FilterManager::executeOperationQueue()
530 if (operationQueue.isEmpty())
533 emit newStatus(state);
538 FilterState nextOperation = operationQueue.dequeue();
540 bool actionRequired =
true;
542 switch (nextOperation)
546 m_FilterChangeTimeout.stop();
548 if (m_ConfirmationPending)
551 state = FILTER_CHANGE;
552 if (m_useTargetFilter)
553 targetFilterPosition = m_ActiveFilters.indexOf(targetFilter) + 1;
554 m_FilterWheel->setPosition(targetFilterPosition);
556 emit newStatus(state);
558 if (m_FilterConfirmSet)
562 KSMessageBox::Instance()->disconnect(
this);
563 m_ConfirmationPending =
false;
564 m_FilterWheel->confirmFilter();
568 KSMessageBox::Instance()->disconnect(
this);
569 m_ConfirmationPending =
false;
572 m_ConfirmationPending =
true;
574 KSMessageBox::Instance()->questionYesNo(
i18n(
"Set filter to %1. Is filter set?", targetFilter->color()),
575 i18n(
"Confirm Filter"));
578 else m_FilterChangeTimeout.start();
584 state = FILTER_OFFSET;
585 if (m_useTargetFilter)
587 targetFilterOffset = targetFilter->offset() - lastFilterOffset;
588 lastFilterOffset = targetFilter->offset();
589 currentFilter = targetFilter;
590 m_useTargetFilter =
false;
592 if (targetFilterOffset == 0)
593 actionRequired =
false;
596 emit newFocusOffset(targetFilterOffset,
false);
597 emit newStatus(state);
602 case FILTER_AUTOFOCUS:
603 state = FILTER_AUTOFOCUS;
604 qCDebug(KSTARS) <<
"FilterManager.cpp is triggering autofocus.";
605 emit newStatus(state);
606 emit runAutoFocus(AutofocusReason::FOCUS_FILTER,
"");
618 return executeOperationQueue();
621bool FilterManager::executeOneOperation(FilterState operation)
623 bool actionRequired =
false;
631 return actionRequired;
634void FilterManager::setFocusOffsetComplete()
636 if (state == FILTER_OFFSET)
637 executeOperationQueue();
640double FilterManager::getFilterExposure(
const QString &name)
const
642 auto filterDetails = getFilterByName(name);
644 return filterDetails->exposure();
650bool FilterManager::setFilterExposure(
int index,
double exposure)
652 if (m_currentFilterLabels.empty())
655 QString color = m_currentFilterLabels[index];
656 for (
int i = 0; i < m_ActiveFilters.count(); i++)
658 if (color == m_ActiveFilters[i]->color())
660 m_FilterModel->setData(m_FilterModel->index(i, FM_EXPOSURE), exposure);
661 m_FilterModel->submitAll();
662 refreshFilterModel();
670int FilterManager::getFilterOffset(
const QString &name)
const
672 int offset = INVALID_VALUE;
673 auto filterDetails = getFilterByName(name);
675 offset = filterDetails->offset();
680bool FilterManager::setFilterOffset(
QString color,
int offset)
682 if (m_currentFilterLabels.empty())
685 for (
int i = 0; i < m_ActiveFilters.count(); i++)
687 if (color == m_ActiveFilters[i]->color())
689 m_FilterModel->setData(m_FilterModel->index(i, FM_OFFSET), offset);
690 m_FilterModel->submitAll();
691 refreshFilterModel();
699bool FilterManager::getFilterAbsoluteFocusDetails(
const QString &name,
int &focusPos,
double &focusTemp,
700 double &focusAlt)
const
702 auto filterDetails = getFilterByName(name);
705 focusPos = filterDetails->absoluteFocusPosition();
706 focusTemp = filterDetails->focusTemperature();
707 focusAlt = filterDetails->focusAltitude();
714bool FilterManager::setFilterAbsoluteFocusDetails(
int index,
int focusPos,
double focusTemp,
double focusAlt)
716 if (index < 0 || index >= m_currentFilterLabels.count())
719 QString color = m_currentFilterLabels[index];
720 for (
int i = 0; i < m_ActiveFilters.count(); i++)
722 if (color == m_ActiveFilters[i]->color())
724 m_FilterModel->setData(m_FilterModel->index(i, FM_LAST_AF_SOLUTION), focusPos);
725 m_FilterModel->setData(m_FilterModel->index(i, FM_LAST_AF_TEMP), focusTemp);
726 m_FilterModel->setData(m_FilterModel->index(i, FM_LAST_AF_ALT), focusAlt);
727 m_FilterModel->setData(m_FilterModel->index(i, FM_LAST_AF_DATETIME),
728 KStarsData::Instance()->lt().toString(DATETIME_FORMAT));
729 m_FilterModel->submitAll();
730 refreshFilterModel();
738bool FilterManager::getAFDatetime(
const QString &name,
QDateTime &datetime)
const
740 auto filterDetails = getFilterByName(name);
743 datetime = filterDetails->focusDatetime();
751 auto filterDetails = getFilterByName(name);
753 return filterDetails->lockedFilter();
759bool FilterManager::setFilterLock(
int index,
QString name)
761 if (m_currentFilterLabels.empty())
764 QString color = m_currentFilterLabels[index];
765 for (
int i = 0; i < m_ActiveFilters.count(); i++)
767 if (color == m_ActiveFilters[i]->color())
769 m_FilterModel->setData(m_FilterModel->index(i, FM_LOCK_FILTER), name);
770 m_FilterModel->submitAll();
771 refreshFilterModel();
779int FilterManager::getFilterWavelength(
const QString &name)
const
781 auto filterDetails = getFilterByName(name);
783 return filterDetails->wavelength();
789double FilterManager::getFilterTicksPerTemp(
const QString &name)
const
791 auto filterDetails = getFilterByName(name);
793 return filterDetails->focusTicksPerTemp();
799double FilterManager::getFilterTicksPerAlt(
const QString &name)
const
801 auto filterDetails = getFilterByName(name);
803 return filterDetails->focusTicksPerAlt();
811 if (m_currentFilterLabels.empty() ||
812 m_currentFilterPosition < 1 ||
813 m_currentFilterPosition > m_currentFilterLabels.count())
818 color = m_currentFilterLabels[m_currentFilterPosition - 1];
820 auto pos = std::find_if(m_ActiveFilters.begin(), m_ActiveFilters.end(), [color](
OAL::Filter * oneFilter)
822 return (oneFilter->color() == color);
825 if (pos != m_ActiveFilters.end())
833 if (m_FilterWheel && (m_FilterWheel->getDeviceName() == device->getDeviceName()))
835 m_FilterNameProperty =
nullptr;
836 m_FilterPositionProperty =
nullptr;
837 m_FilterWheel =
nullptr;
838 m_currentFilterLabels.clear();
839 m_currentFilterPosition = 0;
840 qDeleteAll(m_ActiveFilters);
841 m_ActiveFilters.clear();
842 delete(m_FilterModel);
843 m_FilterModel =
nullptr;
847void FilterManager::setFocusStatus(Ekos::FocusState focusState)
849 setAutofocusStatus(focusState);
851 if (state == FILTER_AUTOFOCUS)
856 executeOperationQueue();
867 emit runAutoFocus(AutofocusReason::FOCUS_FILTER,
"");
876void FilterManager::setAutofocusStatus(Ekos::FocusState focusState)
880 if (focusState == FOCUS_COMPLETE)
881 m_LastAFFailed.insert(targetFilter->color(), FALSE);
882 else if (focusState == FOCUS_ABORTED || focusState == FOCUS_FAILED)
883 m_LastAFFailed.insert(targetFilter->color(), TRUE);
887bool FilterManager::syncAbsoluteFocusPosition(
int index)
889 if (m_FocusReady ==
false)
891 qCWarning(KSTARS_INDI) << __FUNCTION__ <<
"No Focuser detected.";
894 else if (index < 0 || index > m_ActiveFilters.count())
899 qCWarning(KSTARS_INDI) << __FUNCTION__ <<
"index" << index <<
"is out of bounds.";
905 auto absFocusPos = m_ActiveFilters[index]->absoluteFocusPosition();
907 if (m_FocusAbsPosition == absFocusPos || absFocusPos <= 0)
909 m_FocusAbsPositionPending =
false;
912 else if (m_FocusAbsPositionPending ==
false)
914 m_FocusAbsPositionPending =
true;
915 emit newFocusOffset(absFocusPos,
true);
921bool FilterManager::setFilterNames(
const QStringList &newLabels)
923 if (m_FilterWheel ==
nullptr || m_currentFilterLabels.empty())
926 m_FilterWheel->setLabels(newLabels);
937 for (
int i = 0; i < m_FilterModel->rowCount(); ++i)
942 {
"label", m_FilterModel->data(m_FilterModel->index(i, FM_LABEL)).toString()},
943 {
"exposure", m_FilterModel->data(m_FilterModel->index(i, FM_EXPOSURE)).toDouble()},
944 {
"offset", m_FilterModel->data(m_FilterModel->index(i, FM_OFFSET)).toInt()},
945 {
"autofocus", m_FilterModel->data(m_FilterModel->index(i, FM_AUTO_FOCUS)).toBool()},
946 {
"lock", m_FilterModel->data(m_FilterModel->index(i, FM_LOCK_FILTER)).toString()},
947 {
"lastafsolution", m_FilterModel->data(m_FilterModel->index(i, FM_LAST_AF_SOLUTION)).toInt()},
948 {
"lastaftemp", m_FilterModel->data(m_FilterModel->index(i, FM_LAST_AF_TEMP)).toDouble()},
949 {
"lastafalt", m_FilterModel->data(m_FilterModel->index(i, FM_LAST_AF_ALT)).toDouble()},
950 {
"lastafdt", m_FilterModel->data(m_FilterModel->index(i, FM_LAST_AF_DATETIME)).toString()},
951 {
"tickspertemp", m_FilterModel->data(m_FilterModel->index(i, FM_TICKS_PER_TEMP)).toDouble()},
952 {
"ticksperalt", m_FilterModel->data(m_FilterModel->index(i, FM_TICKS_PER_ALT)).toDouble()},
953 {
"wavelength", m_FilterModel->data(m_FilterModel->index(i, FM_WAVELENGTH)).toInt()},
956 filters.
append(oneFilter);
961 {
"device", m_FilterWheel->getDeviceName()},
969void FilterManager::setFilterData(
const QJsonObject &settings)
974 if (settings[
"device"].
toString() != m_FilterWheel->getDeviceName())
977 QJsonArray filters = settings[
"filters"].toArray();
980 for (
auto oneFilterRef : filters)
983 int row = oneFilter[
"index"].toInt();
985 labels[row] = oneFilter[
"label"].toString();
986 m_FilterModel->setData(m_FilterModel->index(row, FM_LABEL), oneFilter[
"label"].toString());
987 m_FilterModel->setData(m_FilterModel->index(row, FM_EXPOSURE), oneFilter[
"exposure"].toDouble());
988 m_FilterModel->setData(m_FilterModel->index(row, FM_OFFSET), oneFilter[
"offset"].toInt());
989 m_FilterModel->setData(m_FilterModel->index(row, FM_AUTO_FOCUS), oneFilter[
"autofocus"].toBool());
990 m_FilterModel->setData(m_FilterModel->index(row, FM_LOCK_FILTER), oneFilter[
"lock"].toString());
991 m_FilterModel->setData(m_FilterModel->index(row, FM_LAST_AF_SOLUTION), oneFilter[
"lastafsolution"].toInt());
992 m_FilterModel->setData(m_FilterModel->index(row, FM_LAST_AF_TEMP), oneFilter[
"lastaftemp"].toDouble());
993 m_FilterModel->setData(m_FilterModel->index(row, FM_LAST_AF_ALT), oneFilter[
"lastafalt"].toDouble());
994 m_FilterModel->setData(m_FilterModel->index(row, FM_LAST_AF_DATETIME), oneFilter[
"lastafdt"].toString(DATETIME_FORMAT));
995 m_FilterModel->setData(m_FilterModel->index(row, FM_TICKS_PER_TEMP), oneFilter[
"tickspertemp"].toDouble());
996 m_FilterModel->setData(m_FilterModel->index(row, FM_TICKS_PER_ALT), oneFilter[
"ticksperalt"].toDouble());
997 m_FilterModel->setData(m_FilterModel->index(row, FM_WAVELENGTH), oneFilter[
"wavelength"].toInt());
1000 m_FilterModel->submitAll();
1001 setFilterNames(labels);
1003 refreshFilterModel();
1006void FilterManager::buildFilterOffsets()
1010 Ekos::Manager::Instance()->getFilterManager(m_FilterWheel->getDeviceName(), filterManager);
1011 BuildFilterOffsets bfo(filterManager);
1014void FilterManager::signalRunAutoFocus(AutofocusReason autofocusReason,
const QString &reasonInfo)
1017 emit runAutoFocus(autofocusReason, reasonInfo);
1020void FilterManager::autoFocusComplete(FocusState completionState,
int currentPosition,
double currentTemperature,
1024 emit autoFocusDone(completionState, currentPosition, currentTemperature, currentAlt);
1027void FilterManager::signalAbortAutoFocus()
1030 emit abortAutoFocus();
1033void FilterManager::checkFilterChangeTimeout()
1035 if (state == FILTER_CHANGE)
1037 qCWarning(KSTARS) <<
"FilterManager.cpp filter change timed out.";
Information of user filters.
QString i18n(const char *text, const TYPE &arg...)
char * toString(const EngineQuery &query)
Ekos is an advanced Astrophotography tool for Linux.
QString name(const QVariant &location)
QString label(StandardShortcut id)
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList< int > &roles)
void append(const QJsonValue &value)
void append(QList< T > &&value)
QSqlDatabase database(const QString &connectionName, bool open)
QVariant value(const QString &name) const const
bool isEmpty() const const
qsizetype length() const const
QFuture< void > filter(QThreadPool *pool, Sequence &sequence, KeepFunctor &&filterFunction)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
double toDouble(bool *ok) const const
int toInt(bool *ok) const const
QString toString() const const