7#include "opticaltrainmanager.h"
8#include <kstars_debug.h>
10#include "ksnotification.h"
11#include "kstarsdata.h"
13#include "indi/indilistener.h"
14#include "ekos/auxiliary/profilesettings.h"
15#include "oal/equipmentwriter.h"
18#include <QSqlTableModel>
19#include <QSqlDatabase>
22#include <basedevice.h>
29OpticalTrainManager *OpticalTrainManager::m_Instance =
nullptr;
34OpticalTrainManager *OpticalTrainManager::Instance()
36 if (m_Instance ==
nullptr)
37 m_Instance =
new OpticalTrainManager();
45void OpticalTrainManager::release()
54OpticalTrainManager::OpticalTrainManager() :
QDialog(
KStars::Instance())
64 emit configurationRequested(
false);
99 updateOpticalTrainValue(value,
"reducer");
139 addOpticalTrain(m_TrainNames.count(),
i18n(
"New Train"));
140 m_OpticalTrainsModel->select();
150 removeOpticalTrain(trainNamesList->currentItem()->text());
151 removeB->setEnabled(false);
160 writer->loadEquipment();
162 refreshOpticalElements();
167 selectOpticalTrain(item);
171 renameCurrentOpticalTrain(item->
text());
179 m_CheckMissingDevicesTimer.setInterval(5000);
180 m_CheckMissingDevicesTimer.setSingleShot(
true);
183 m_DelegateTimer.setInterval(1000);
184 m_DelegateTimer.setSingleShot(
true);
188 setProfile(m_Profile);
197void OpticalTrainManager::initModel()
203 m_OpticalTrains.clear();
204 for (
int i = 0; i < m_OpticalTrainsModel->rowCount(); ++i)
207 QSqlRecord record = m_OpticalTrainsModel->record(i);
208 for (
int j = 0;
j < record.
count();
j++)
214 m_TrainNames.clear();
215 for (
auto &
oneTrain : m_OpticalTrains)
225void OpticalTrainManager::syncDevices()
227 syncDelegatesToDevices();
238void OpticalTrainManager::refreshModel()
240 KStars::Instance()->data()->userdb()->GetOpticalTrains(m_Profile->id, m_OpticalTrains);
241 m_TrainNames.clear();
242 for (
auto &
oneTrain : m_OpticalTrains)
252void OpticalTrainManager::syncActiveDevices()
254 for (
auto &
oneTrain : m_OpticalTrains)
259 if (getGenericDevice(
train, Mount, device))
260 syncActiveProperties(
oneTrain, device);
261 if (getGenericDevice(
train, Camera, device))
262 syncActiveProperties(
oneTrain, device);
263 if (getGenericDevice(
train, GuideVia, device))
264 syncActiveProperties(
oneTrain, device);
265 if (getGenericDevice(
train, Focuser, device))
266 syncActiveProperties(
oneTrain, device);
267 if (getGenericDevice(
train, FilterWheel, device))
268 syncActiveProperties(
oneTrain, device);
269 if (getGenericDevice(
train, Rotator, device))
270 syncActiveProperties(
oneTrain, device);
271 if (getGenericDevice(
train, DustCap, device))
272 syncActiveProperties(
oneTrain, device);
273 if (getGenericDevice(
train, LightBox, device))
274 syncActiveProperties(
oneTrain, device);
279 if (!m_OpticalTrains.isEmpty())
281 auto name = m_OpticalTrains[0][
"name"].toString();
282 if (getGenericDevice(name, Dome, device))
283 syncActiveProperties(m_OpticalTrains[0], device);
284 if (getGenericDevice(name, Weather, device))
285 syncActiveProperties(m_OpticalTrains[0], device);
286 if (getGenericDevice(name, GPS, device))
287 syncActiveProperties(m_OpticalTrains[0], device);
296 auto tvp = device->getProperty(
"ACTIVE_DEVICES");
302 for (
auto &
it : *
tvp.getText())
306 if (
it.isNameMatch(
"ACTIVE_TELESCOPE"))
314 if (getGenericDevice(name, Mount, genericDevice))
315 devs.append(genericDevice);
318 else if (
it.isNameMatch(
"ACTIVE_DOME"))
320 devs = INDIListener::devicesByInterface(INDI::BaseDevice::DOME_INTERFACE);
322 else if (
it.isNameMatch(
"ACTIVE_GPS"))
324 devs = INDIListener::devicesByInterface(INDI::BaseDevice::GPS_INTERFACE);
326 else if (
it.isNameMatch(
"ACTIVE_ROTATOR"))
334 if (getGenericDevice(name, Rotator, genericDevice))
335 devs.append(genericDevice);
338 else if (
it.isNameMatch(
"ACTIVE_FOCUSER"))
346 if (getGenericDevice(name, Focuser, genericDevice))
347 devs.append(genericDevice);
350 else if (
it.isNameMatch(
"ACTIVE_FILTER"))
358 if (getGenericDevice(name, FilterWheel, genericDevice))
359 devs.append(genericDevice);
365 if (
it.getText() !=
devs.first()->getDeviceName())
367 it.setText(
devs.first()->getDeviceName().toLatin1().constData());
368 device->sendNewProperty(
tvp.getText());
375 device->sendNewProperty(
tvp.getText());
386 m_DelegateTimer.stop();
389 if (m_Profile != profile)
396 if (syncDelegatesToDevices())
398 m_CheckMissingDevicesTimer.start();
401 m_DelegateTimer.start();
407 checkOpticalTrains();
414void OpticalTrainManager::checkOpticalTrains()
416 if (m_OpticalTrains.empty())
418 generateOpticalTrains();
420 if (!m_OpticalTrains.empty())
423 ProfileSettings::Instance()->setOneSetting(ProfileSettings::PrimaryOpticalTrain,
primaryTrainID);
424 ProfileSettings::Instance()->setOneSetting(ProfileSettings::CaptureOpticalTrain,
primaryTrainID);
425 ProfileSettings::Instance()->setOneSetting(ProfileSettings::FocusOpticalTrain,
primaryTrainID);
426 ProfileSettings::Instance()->setOneSetting(ProfileSettings::MountOpticalTrain,
primaryTrainID);
427 ProfileSettings::Instance()->setOneSetting(ProfileSettings::AlignOpticalTrain,
primaryTrainID);
428 ProfileSettings::Instance()->setOneSetting(ProfileSettings::DarkLibraryOpticalTrain,
primaryTrainID);
429 if (m_OpticalTrains.count() > 1)
430 ProfileSettings::Instance()->setOneSetting(ProfileSettings::GuideOpticalTrain, m_OpticalTrains[1][
"id"].toInt());
432 ProfileSettings::Instance()->setOneSetting(ProfileSettings::GuideOpticalTrain,
primaryTrainID);
438 emit configurationRequested(
true);
442 m_CheckMissingDevicesTimer.start();
449void OpticalTrainManager::generateOpticalTrains()
452 addOpticalTrain(0,
i18n(
"Primary"));
455 addOpticalTrain(1,
i18n(
"Secondary"));
458 addOpticalTrain(2,
i18n(
"Tertiary"));
464QString OpticalTrainManager::addOpticalTrain(uint8_t index,
const QString &name)
467 train[
"profile"] = m_Profile->id;
468 train[
"name"] = uniqueTrainName(name);
473 train[
"reducer"] = 1.0;
483 train[
"camera"] =
"--";
497 KStarsData::Instance()->userdb()->AddOpticalTrain(
train);
498 return train[
"name"].toString();
504void OpticalTrainManager::addOpticalTrain(
const QJsonObject &value)
507 newTrain[
"profile"] = m_Profile->id;
508 KStarsData::Instance()->userdb()->AddOpticalTrain(
newTrain);
516bool OpticalTrainManager::setOpticalTrainValue(
const QString &name,
const QString &field,
const QVariant &value)
518 for (
auto &
oneTrain : m_OpticalTrains)
528 KStarsData::Instance()->userdb()->UpdateOpticalTrain(
oneTrain,
oneTrain[
"id"].toInt());
540void OpticalTrainManager::renameCurrentOpticalTrain(
const QString &name)
542 if (m_CurrentOpticalTrain !=
nullptr && (*m_CurrentOpticalTrain)[
"name"] != name)
546 auto unique = uniqueTrainName(name);
548 setOpticalTrainValue((*m_CurrentOpticalTrain)[
"name"].
toString(),
"name",
unique);
554 selectOpticalTrain(
unique);
577bool OpticalTrainManager::removeOpticalTrain(
const QString &name)
579 for (
auto &
oneTrain : m_OpticalTrains)
584 KStarsData::Instance()->userdb()->DeleteOpticalTrain(
id);
585 KStarsData::Instance()->userdb()->DeleteOpticalTrainSettings(
id);
587 selectOpticalTrain(
nullptr);
598bool OpticalTrainManager::syncDelegatesToDevices()
600 auto changed =
false;
603 auto mounts = INDIListener::devicesByInterface(INDI::BaseDevice::TELESCOPE_INTERFACE);
606 values <<
oneMount->getDeviceName();
607 changed |= !values.
empty() && values != m_MountNames;
608 m_MountNames = values;
616 auto dustcaps = INDIListener::devicesByInterface(INDI::BaseDevice::DUSTCAP_INTERFACE);
618 values <<
oneCap->getDeviceName();
619 changed |= !values.
empty() && values != m_DustCapNames;
620 m_DustCapNames = values;
628 auto lightboxes = INDIListener::devicesByInterface(INDI::BaseDevice::LIGHTBOX_INTERFACE);
630 values <<
oneBox->getDeviceName();
631 changed |= !values.
empty() && values != m_LightBoxNames;
633 m_LightBoxNames = values;
640 changed |= !values.
empty() && values != m_ScopeNames;
641 m_ScopeNames = values;
649 auto rotators = INDIListener::devicesByInterface(INDI::BaseDevice::ROTATOR_INTERFACE);
652 changed |= !values.
empty() && values != m_RotatorNames;
653 m_RotatorNames = values;
661 auto focusers = INDIListener::devicesByInterface(INDI::BaseDevice::FOCUSER_INTERFACE);
664 changed |= !values.
empty() && values != m_FocuserNames;
665 m_FocuserNames = values;
673 auto filterwheels = INDIListener::devicesByInterface(INDI::BaseDevice::FILTER_INTERFACE);
676 changed |= !values.
empty() && values != m_FilterWheelNames;
677 m_FilterWheelNames = values;
685 auto cameras = INDIListener::devicesByInterface(INDI::BaseDevice::CCD_INTERFACE);
688 changed |= !values.
empty() && values != m_CameraNames;
689 m_CameraNames = values;
697 auto guiders = INDIListener::devicesByInterface(INDI::BaseDevice::GUIDER_INTERFACE);
700 changed |= !values.
empty() && values != m_GuiderNames;
701 m_GuiderNames = values;
717 while (m_TrainNames.contains(result))
728 if (item !=
nullptr && selectOpticalTrain(item->
text()))
739QString OpticalTrainManager::findTrainContainingDevice(
const QString &name, Role role)
741 for (
auto &
oneTrain : m_OpticalTrains)
797bool OpticalTrainManager::selectOpticalTrain(
const QString &name)
799 for (
auto &
oneTrain : m_OpticalTrains)
803 m_Persistent =
false;
815 removeB->setEnabled(m_OpticalTrains.length() > 1);
823 m_Persistent =
false;
824 m_CurrentOpticalTrain =
nullptr;
844void OpticalTrainManager::openEditor(
const QString &name)
846 selectOpticalTrain(name);
848 if (matches.count() > 0)
850 emit configurationRequested(
true);
859 for (
auto &
oneTrain : m_OpticalTrains)
883 auto devices = INDIListener::devicesByInterface(INDI::BaseDevice::DOME_INTERFACE);
884 if (!devices.empty())
886 generic = devices[0];
895 auto devices = INDIListener::devicesByInterface(INDI::BaseDevice::GPS_INTERFACE);
896 if (!devices.empty())
898 generic = devices[0];
918 for (
auto &
oneTrain : m_OpticalTrains)
924 return generic->getMount();
936 for (
auto &
oneTrain : m_OpticalTrains)
942 return generic->getDustCap();
954 for (
auto &
oneTrain : m_OpticalTrains)
960 return generic->getLightBox();
973 for (
auto &
oneTrain : m_OpticalTrains)
988double OpticalTrainManager::getReducer(
const QString &name)
990 for (
auto &
oneTrain : m_OpticalTrains)
993 return oneTrain[
"reducer"].toDouble();
1004 for (
auto &
oneTrain : m_OpticalTrains)
1010 return generic->getRotator();
1022 for (
auto &
oneTrain : m_OpticalTrains)
1028 return generic->getFocuser();
1038ISD::FilterWheel *OpticalTrainManager::getFilterWheel(
const QString &name)
1040 for (
auto &
oneTrain : m_OpticalTrains)
1046 return generic->getFilterWheel();
1058 for (
auto &
oneTrain : m_OpticalTrains)
1064 return generic->getCamera();
1074ISD::Guider *OpticalTrainManager::getGuider(
const QString &name)
1076 for (
auto &
oneTrain : m_OpticalTrains)
1082 return generic->getGuider();
1096 for (
auto &
oneTrain : m_OpticalTrains)
1102 return generic->getAdaptiveOptics();
1112const QVariantMap OpticalTrainManager::getOpticalTrain(uint8_t
id)
const
1114 for (
auto &
oneTrain : m_OpticalTrains)
1120 return QVariantMap();
1126bool OpticalTrainManager::exists(uint8_t
id)
const
1128 for (
auto &
oneTrain : m_OpticalTrains)
1140const QVariantMap OpticalTrainManager::getOpticalTrain(
const QString &name)
const
1142 for (
auto &
oneTrain : m_OpticalTrains)
1148 return QVariantMap();
1154void OpticalTrainManager::refreshTrains()
1163void OpticalTrainManager::refreshOpticalElements()
1165 m_ScopeNames =
KStars::Instance()->data()->userdb()->getOpticalElementNames();
1166 syncDelegatesToDevices();
1172int OpticalTrainManager::id(
const QString &name)
const
1174 for (
auto &
oneTrain : m_OpticalTrains)
1186QString OpticalTrainManager::name(
int id)
const
1188 for (
auto &
oneTrain : m_OpticalTrains)
1191 return oneTrain[
"name"].toString();
1200void OpticalTrainManager::checkMissingDevices()
1203 auto devices = getMissingDevices();
1204 if (!devices.empty())
1206 if (devices.count() == 1)
1209 i18n(
"Missing device detected (%1). Please reconfigure the optical trains before proceeding any further.",
1211 KSNotification::General, KSNotification::Warn);
1216 i18n(
"Missing devices detected (%1). Please reconfigure the optical trains before proceeding any further.",
1217 devices.join(
", ")),
1218 KSNotification::General, KSNotification::Warn);
1222 emit configurationRequested(
true);
1229QStringList OpticalTrainManager::getMissingDevices()
const
1232 for (
auto &
oneTrain : m_OpticalTrains)
1235 if (mount !=
"--" && m_MountNames.contains(mount) ==
false)
1238 auto camera =
oneTrain[
"camera"].toString();
1239 if (camera !=
"--" && m_CameraNames.contains(camera) ==
false)
1243 if (
dustcap !=
"--" && m_DustCapNames.contains(
dustcap) ==
false)
1250 auto focuser =
oneTrain[
"focuser"].toString();
1251 if (focuser !=
"--" && m_FocuserNames.contains(focuser) ==
false)
1258 auto guider =
oneTrain[
"guider"].toString();
1259 if (guider !=
"--" && m_GuiderNames.contains(guider) ==
false)
1270void Ekos::OpticalTrainManager::updateOpticalTrainValue(
QComboBox *cb,
const QString &element)
1272 if (
trainNamesList->currentItem() !=
nullptr && m_Persistent ==
true)
1279void OpticalTrainManager::updateOpticalTrainValue(
double value,
const QString &element)
1281 if (
trainNamesList->currentItem() !=
nullptr && m_Persistent ==
true)
1282 setOpticalTrainValue(
trainNamesList->currentItem()->text(), element, value);
1289void OpticalTrainManager::reset()
1291 if (m_CurrentOpticalTrain !=
nullptr)
1293 auto id = m_CurrentOpticalTrain->value(
"id");
1294 auto name = m_CurrentOpticalTrain->value(
"name");
1296 m_CurrentOpticalTrain->clear();
1298 m_CurrentOpticalTrain->insert(
"id",
id);
1299 m_CurrentOpticalTrain->insert(
"name", name);
1300 m_CurrentOpticalTrain->insert(
"mount",
"--");
1301 m_CurrentOpticalTrain->insert(
"camera",
"--");
1302 m_CurrentOpticalTrain->insert(
"rotator",
"--");
1303 m_CurrentOpticalTrain->insert(
"guider",
"--");
1304 m_CurrentOpticalTrain->insert(
"dustcap",
"--");
1305 m_CurrentOpticalTrain->insert(
"scope",
"--");
1306 m_CurrentOpticalTrain->insert(
"filterwheel",
"--");
1307 m_CurrentOpticalTrain->insert(
"focuser",
"--");
1308 m_CurrentOpticalTrain->insert(
"reducer", 1);
1309 m_CurrentOpticalTrain->insert(
"lightbox",
"--");
1311 KStarsData::Instance()->userdb()->UpdateOpticalTrain(*m_CurrentOpticalTrain,
id.toInt());
1313 selectOpticalTrain(
name.toString());
AdaptiveOptics class handles control of INDI AdaptiveOptics devices.
Camera class controls an INDI Camera device.
Handles operation of a remotely controlled dust cover cap.
Focuser class handles control of INDI focuser devices.
Handles operation of a remotely controlled light box.
device handle controlling Mounts.
Rotator class handles control of INDI Rotator devices.
This is the main window for KStars.
static KStars * Instance()
Information on telescope used in observation.
QString i18n(const char *text, const TYPE &arg...)
char * toString(const EngineQuery &query)
Ekos is an advanced Astrophotography tool for Linux.
KIOCORE_EXPORT SimpleJob * mount(bool ro, const QByteArray &fstype, const QString &dev, const QString &point, JobFlags flags=DefaultFlags)
QString name(StandardShortcut id)
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList< int > &roles)
void currentIndexChanged(int index)
void finished(int result)
void valueChanged(double d)
QVariantMap toVariantMap() const const
QString text() const const
QSqlDatabase database(const QString &connectionName, bool open)
QString fieldName(int index) const const
QVariant value(const QString &name) const const
QString arg(Args &&... args) const const
bool isEmpty() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)