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())
424 currentFilter = m_ActiveFilters[m_currentFilterPosition - 1];
425 targetFilter = m_ActiveFilters[position - 1];
427 if (currentFilter == targetFilter)
433 buildOperationQueue(FILTER_CHANGE);
435 executeOperationQueue();
441void FilterManager::updateProperty(INDI::Property prop)
443 if (m_FilterWheel ==
nullptr || m_FilterWheel->getDeviceName() != prop.getDeviceName())
446 if (prop.isNameMatch(
"FILTER_NAME"))
448 auto tvp = prop.getText();
449 m_FilterNameProperty = tvp;
451 refreshFilterLabels();
453 else if (prop.isNameMatch(
"FILTER_SLOT"))
455 m_FilterChangeTimeout.stop();
457 auto nvp = prop.getNumber();
460 if (state == FILTER_CHANGE && nvp->s == IPS_ALERT)
466 if (nvp->s != IPS_OK)
469 m_FilterPositionProperty = nvp;
470 refreshFilterPosition();
472 if (state == FILTER_CHANGE)
473 executeOperationQueue();
475 else if (state == FILTER_IDLE && m_ActiveFilters.count() >= m_currentFilterPosition)
476 lastFilterOffset = m_ActiveFilters[m_currentFilterPosition - 1]->offset();
481void FilterManager::processDisconnect()
483 m_currentFilterLabels.clear();
484 m_currentFilterPosition = -1;
485 m_FilterNameProperty =
nullptr;
486 m_FilterPositionProperty =
nullptr;
489void FilterManager::buildOperationQueue(FilterState operation)
491 operationQueue.clear();
492 m_useTargetFilter =
false;
498 if ( (m_Policy & CHANGE_POLICY) && targetFilter != currentFilter)
499 m_useTargetFilter =
true;
501 if (m_useTargetFilter)
503 operationQueue.enqueue(FILTER_CHANGE);
504 if (m_FocusReady && (m_Policy & OFFSET_POLICY))
505 operationQueue.enqueue(FILTER_OFFSET);
509 lastFilterOffset = targetFilter->offset();
510 currentFilter = targetFilter;
515 if (m_FocusReady && (m_Policy & AUTOFOCUS_POLICY) && targetFilter->useAutoFocus())
516 operationQueue.enqueue(FILTER_AUTOFOCUS);
525bool FilterManager::executeOperationQueue()
527 if (operationQueue.isEmpty())
530 emit newStatus(state);
535 FilterState nextOperation = operationQueue.dequeue();
537 bool actionRequired =
true;
539 switch (nextOperation)
543 m_FilterChangeTimeout.stop();
545 if (m_ConfirmationPending)
548 state = FILTER_CHANGE;
549 if (m_useTargetFilter)
550 targetFilterPosition = m_ActiveFilters.indexOf(targetFilter) + 1;
551 m_FilterWheel->setPosition(targetFilterPosition);
553 emit newStatus(state);
555 if (m_FilterConfirmSet)
559 KSMessageBox::Instance()->disconnect(
this);
560 m_ConfirmationPending =
false;
561 m_FilterWheel->confirmFilter();
565 KSMessageBox::Instance()->disconnect(
this);
566 m_ConfirmationPending =
false;
569 m_ConfirmationPending =
true;
571 KSMessageBox::Instance()->questionYesNo(
i18n(
"Set filter to %1. Is filter set?", targetFilter->color()),
572 i18n(
"Confirm Filter"));
575 else m_FilterChangeTimeout.start();
581 state = FILTER_OFFSET;
582 if (m_useTargetFilter)
584 targetFilterOffset = targetFilter->offset() - lastFilterOffset;
585 lastFilterOffset = targetFilter->offset();
586 currentFilter = targetFilter;
587 m_useTargetFilter =
false;
589 if (targetFilterOffset == 0)
590 actionRequired =
false;
593 emit newFocusOffset(targetFilterOffset,
false);
594 emit newStatus(state);
599 case FILTER_AUTOFOCUS:
600 state = FILTER_AUTOFOCUS;
601 qCDebug(KSTARS) <<
"FilterManager.cpp is triggering autofocus.";
602 emit newStatus(state);
603 emit runAutoFocus(AutofocusReason::FOCUS_FILTER,
"");
615 return executeOperationQueue();
618bool FilterManager::executeOneOperation(FilterState operation)
620 bool actionRequired =
false;
628 return actionRequired;
631void FilterManager::setFocusOffsetComplete()
633 if (state == FILTER_OFFSET)
634 executeOperationQueue();
637double FilterManager::getFilterExposure(
const QString &name)
const
639 auto filterDetails = getFilterByName(name);
641 return filterDetails->exposure();
647bool FilterManager::setFilterExposure(
int index,
double exposure)
649 if (m_currentFilterLabels.empty())
652 QString color = m_currentFilterLabels[index];
653 for (
int i = 0; i < m_ActiveFilters.count(); i++)
655 if (color == m_ActiveFilters[i]->color())
657 m_FilterModel->setData(m_FilterModel->index(i, FM_EXPOSURE), exposure);
658 m_FilterModel->submitAll();
659 refreshFilterModel();
667int FilterManager::getFilterOffset(
const QString &name)
const
669 int offset = INVALID_VALUE;
670 auto filterDetails = getFilterByName(name);
672 offset = filterDetails->offset();
677bool FilterManager::setFilterOffset(
QString color,
int offset)
679 if (m_currentFilterLabels.empty())
682 for (
int i = 0; i < m_ActiveFilters.count(); i++)
684 if (color == m_ActiveFilters[i]->color())
686 m_FilterModel->setData(m_FilterModel->index(i, FM_OFFSET), offset);
687 m_FilterModel->submitAll();
688 refreshFilterModel();
696bool FilterManager::getFilterAbsoluteFocusDetails(
const QString &name,
int &focusPos,
double &focusTemp,
697 double &focusAlt)
const
699 auto filterDetails = getFilterByName(name);
702 focusPos = filterDetails->absoluteFocusPosition();
703 focusTemp = filterDetails->focusTemperature();
704 focusAlt = filterDetails->focusAltitude();
711bool FilterManager::setFilterAbsoluteFocusDetails(
int index,
int focusPos,
double focusTemp,
double focusAlt)
713 if (index < 0 || index >= m_currentFilterLabels.count())
716 QString color = m_currentFilterLabels[index];
717 for (
int i = 0; i < m_ActiveFilters.count(); i++)
719 if (color == m_ActiveFilters[i]->color())
721 m_FilterModel->setData(m_FilterModel->index(i, FM_LAST_AF_SOLUTION), focusPos);
722 m_FilterModel->setData(m_FilterModel->index(i, FM_LAST_AF_TEMP), focusTemp);
723 m_FilterModel->setData(m_FilterModel->index(i, FM_LAST_AF_ALT), focusAlt);
724 m_FilterModel->setData(m_FilterModel->index(i, FM_LAST_AF_DATETIME),
725 KStarsData::Instance()->lt().toString(DATETIME_FORMAT));
726 m_FilterModel->submitAll();
727 refreshFilterModel();
735bool FilterManager::getAFDatetime(
const QString &name,
QDateTime &datetime)
const
737 auto filterDetails = getFilterByName(name);
740 datetime = filterDetails->focusDatetime();
748 auto filterDetails = getFilterByName(name);
750 return filterDetails->lockedFilter();
756bool FilterManager::setFilterLock(
int index,
QString name)
758 if (m_currentFilterLabels.empty())
761 QString color = m_currentFilterLabels[index];
762 for (
int i = 0; i < m_ActiveFilters.count(); i++)
764 if (color == m_ActiveFilters[i]->color())
766 m_FilterModel->setData(m_FilterModel->index(i, FM_LOCK_FILTER), name);
767 m_FilterModel->submitAll();
768 refreshFilterModel();
776int FilterManager::getFilterWavelength(
const QString &name)
const
778 auto filterDetails = getFilterByName(name);
780 return filterDetails->wavelength();
786double FilterManager::getFilterTicksPerTemp(
const QString &name)
const
788 auto filterDetails = getFilterByName(name);
790 return filterDetails->focusTicksPerTemp();
796double FilterManager::getFilterTicksPerAlt(
const QString &name)
const
798 auto filterDetails = getFilterByName(name);
800 return filterDetails->focusTicksPerAlt();
808 if (m_currentFilterLabels.empty() ||
809 m_currentFilterPosition < 1 ||
810 m_currentFilterPosition > m_currentFilterLabels.count())
815 color = m_currentFilterLabels[m_currentFilterPosition - 1];
817 auto pos = std::find_if(m_ActiveFilters.begin(), m_ActiveFilters.end(), [color](
OAL::Filter * oneFilter)
819 return (oneFilter->color() == color);
822 if (pos != m_ActiveFilters.end())
830 if (m_FilterWheel && (m_FilterWheel->getDeviceName() == device->getDeviceName()))
832 m_FilterNameProperty =
nullptr;
833 m_FilterPositionProperty =
nullptr;
834 m_FilterWheel =
nullptr;
835 m_currentFilterLabels.clear();
836 m_currentFilterPosition = 0;
837 qDeleteAll(m_ActiveFilters);
838 m_ActiveFilters.clear();
839 delete(m_FilterModel);
840 m_FilterModel =
nullptr;
844void FilterManager::setFocusStatus(Ekos::FocusState focusState)
846 if (state == FILTER_AUTOFOCUS)
851 executeOperationQueue();
862 emit runAutoFocus(AutofocusReason::FOCUS_FILTER,
"");
872bool FilterManager::syncAbsoluteFocusPosition(
int index)
874 if (m_FocusReady ==
false)
876 qCWarning(KSTARS_INDI) << __FUNCTION__ <<
"No Focuser detected.";
879 else if (index < 0 || index > m_ActiveFilters.count())
884 qCWarning(KSTARS_INDI) << __FUNCTION__ <<
"index" << index <<
"is out of bounds.";
890 auto absFocusPos = m_ActiveFilters[index]->absoluteFocusPosition();
892 if (m_FocusAbsPosition == absFocusPos || absFocusPos <= 0)
894 m_FocusAbsPositionPending =
false;
897 else if (m_FocusAbsPositionPending ==
false)
899 m_FocusAbsPositionPending =
true;
900 emit newFocusOffset(absFocusPos,
true);
906bool FilterManager::setFilterNames(
const QStringList &newLabels)
908 if (m_FilterWheel ==
nullptr || m_currentFilterLabels.empty())
911 m_FilterWheel->setLabels(newLabels);
922 for (
int i = 0; i < m_FilterModel->rowCount(); ++i)
927 {
"label", m_FilterModel->data(m_FilterModel->index(i, FM_LABEL)).toString()},
928 {
"exposure", m_FilterModel->data(m_FilterModel->index(i, FM_EXPOSURE)).toDouble()},
929 {
"offset", m_FilterModel->data(m_FilterModel->index(i, FM_OFFSET)).toInt()},
930 {
"autofocus", m_FilterModel->data(m_FilterModel->index(i, FM_AUTO_FOCUS)).toBool()},
931 {
"lock", m_FilterModel->data(m_FilterModel->index(i, FM_LOCK_FILTER)).toString()},
932 {
"lastafsolution", m_FilterModel->data(m_FilterModel->index(i, FM_LAST_AF_SOLUTION)).toInt()},
933 {
"lastaftemp", m_FilterModel->data(m_FilterModel->index(i, FM_LAST_AF_TEMP)).toDouble()},
934 {
"lastafalt", m_FilterModel->data(m_FilterModel->index(i, FM_LAST_AF_ALT)).toDouble()},
935 {
"lastafdt", m_FilterModel->data(m_FilterModel->index(i, FM_LAST_AF_DATETIME)).toString()},
936 {
"tickspertemp", m_FilterModel->data(m_FilterModel->index(i, FM_TICKS_PER_TEMP)).toDouble()},
937 {
"ticksperalt", m_FilterModel->data(m_FilterModel->index(i, FM_TICKS_PER_ALT)).toDouble()},
938 {
"wavelength", m_FilterModel->data(m_FilterModel->index(i, FM_WAVELENGTH)).toInt()},
941 filters.
append(oneFilter);
946 {
"device", m_FilterWheel->getDeviceName()},
954void FilterManager::setFilterData(
const QJsonObject &settings)
959 if (settings[
"device"].
toString() != m_FilterWheel->getDeviceName())
962 QJsonArray filters = settings[
"filters"].toArray();
965 for (
auto oneFilterRef : filters)
968 int row = oneFilter[
"index"].toInt();
970 labels[row] = oneFilter[
"label"].toString();
971 m_FilterModel->setData(m_FilterModel->index(row, FM_LABEL), oneFilter[
"label"].toString());
972 m_FilterModel->setData(m_FilterModel->index(row, FM_EXPOSURE), oneFilter[
"exposure"].toDouble());
973 m_FilterModel->setData(m_FilterModel->index(row, FM_OFFSET), oneFilter[
"offset"].toInt());
974 m_FilterModel->setData(m_FilterModel->index(row, FM_AUTO_FOCUS), oneFilter[
"autofocus"].toBool());
975 m_FilterModel->setData(m_FilterModel->index(row, FM_LOCK_FILTER), oneFilter[
"lock"].toString());
976 m_FilterModel->setData(m_FilterModel->index(row, FM_LAST_AF_SOLUTION), oneFilter[
"lastafsolution"].toInt());
977 m_FilterModel->setData(m_FilterModel->index(row, FM_LAST_AF_TEMP), oneFilter[
"lastaftemp"].toDouble());
978 m_FilterModel->setData(m_FilterModel->index(row, FM_LAST_AF_ALT), oneFilter[
"lastafalt"].toDouble());
979 m_FilterModel->setData(m_FilterModel->index(row, FM_LAST_AF_DATETIME), oneFilter[
"lastafdt"].toString(DATETIME_FORMAT));
980 m_FilterModel->setData(m_FilterModel->index(row, FM_TICKS_PER_TEMP), oneFilter[
"tickspertemp"].toDouble());
981 m_FilterModel->setData(m_FilterModel->index(row, FM_TICKS_PER_ALT), oneFilter[
"ticksperalt"].toDouble());
982 m_FilterModel->setData(m_FilterModel->index(row, FM_WAVELENGTH), oneFilter[
"wavelength"].toInt());
985 m_FilterModel->submitAll();
986 setFilterNames(labels);
988 refreshFilterModel();
991void FilterManager::buildFilterOffsets()
995 Ekos::Manager::Instance()->getFilterManager(m_FilterWheel->getDeviceName(), filterManager);
996 BuildFilterOffsets bfo(filterManager);
999void FilterManager::signalRunAutoFocus(AutofocusReason autofocusReason,
const QString &reasonInfo)
1002 emit runAutoFocus(autofocusReason, reasonInfo);
1005void FilterManager::autoFocusComplete(FocusState completionState,
int currentPosition,
double currentTemperature,
1009 emit autoFocusDone(completionState, currentPosition, currentTemperature, currentAlt);
1012void FilterManager::signalAbortAutoFocus()
1015 emit abortAutoFocus();
1018void FilterManager::checkFilterChangeTimeout()
1020 if (state == FILTER_CHANGE)
1022 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(StandardAction id)
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