File indexing completed on 2024-04-14 14:11:11

0001 /*
0002     SPDX-FileCopyrightText: 2009 Prakash Mohan <prakash.mohan@kdemail.net>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "oal/equipmentwriter.h"
0008 #include "ui_equipmentwriter.h"
0009 
0010 #include <QFile>
0011 
0012 #include "kstarsdata.h"
0013 #include "oal/oal.h"
0014 #include "oal/scope.h"
0015 #include "oal/dslrlens.h"
0016 #include "oal/eyepiece.h"
0017 #include "oal/lens.h"
0018 #include "oal/filter.h"
0019 #include "ekos/ekos.h"
0020 
0021 #include <config-kstars.h>
0022 
0023 #ifdef HAVE_INDI
0024 #include "indi/drivermanager.h"
0025 #endif
0026 
0027 EquipmentWriter::EquipmentWriter()
0028 {
0029     QWidget *widget = new QWidget;
0030     ui.setupUi(widget);
0031     ui.tabWidget->setCurrentIndex(0);
0032     setWindowTitle(i18nc("@title:window", "Configure Equipment"));
0033 
0034     QVBoxLayout *mainLayout = new QVBoxLayout;
0035     mainLayout->addWidget(widget);
0036     setLayout(mainLayout);
0037 
0038     QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close);
0039     mainLayout->addWidget(buttonBox);
0040 
0041     QObject::connect(buttonBox, SIGNAL(rejected()), this, SLOT(close()));
0042 
0043     nextScope    = 0;
0044     nextEyepiece = 0;
0045     nextFilter   = 0;
0046     nextLens     = 0;
0047     nextDSLRLens = 0;
0048     loadEquipment();
0049     newScope    = true;
0050     newEyepiece = true;
0051     newLens     = true;
0052     newFilter   = true;
0053     newDSLRLens = true;
0054 
0055     //make connections
0056     connect(ui.NewScope, SIGNAL(clicked()), this, SLOT(slotNewScope()));
0057     connect(ui.NewEyepiece, SIGNAL(clicked()), this, SLOT(slotNewEyepiece()));
0058     connect(ui.NewLens, SIGNAL(clicked()), this, SLOT(slotNewLens()));
0059     connect(ui.NewFilter, SIGNAL(clicked()), this, SLOT(slotNewFilter()));
0060     connect(ui.AddScope, SIGNAL(clicked()), this, SLOT(slotSave()));
0061     connect(ui.AddEyepiece, SIGNAL(clicked()), this, SLOT(slotSave()));
0062     connect(ui.AddLens, SIGNAL(clicked()), this, SLOT(slotSave()));
0063     connect(ui.AddFilter, SIGNAL(clicked()), this, SLOT(slotSave()));
0064     connect(ui.ScopeList, SIGNAL(currentTextChanged(QString)), this, SLOT(slotSetScope(QString)));
0065     connect(ui.EyepieceList, SIGNAL(currentTextChanged(QString)), this, SLOT(slotSetEyepiece(QString)));
0066     connect(ui.LensList, SIGNAL(currentTextChanged(QString)), this, SLOT(slotSetLens(QString)));
0067     connect(ui.FilterList, SIGNAL(currentTextChanged(QString)), this, SLOT(slotSetFilter(QString)));
0068     connect(ui.RemoveScope, SIGNAL(clicked()), this, SLOT(slotRemoveScope()));
0069     connect(ui.RemoveEyepiece, SIGNAL(clicked()), this, SLOT(slotRemoveEyepiece()));
0070     connect(ui.RemoveLens, SIGNAL(clicked()), this, SLOT(slotRemoveLens()));
0071     connect(ui.RemoveFilter, SIGNAL(clicked()), this, SLOT(slotRemoveFilter()));
0072 
0073     connect(ui.NewDSLRLens, &QPushButton::clicked, this, &EquipmentWriter::slotNewDSLRLens);
0074     connect(ui.AddDSLRLens, &QPushButton::clicked, this, &EquipmentWriter::slotAddDSLRLens);
0075     connect(ui.RemoveDSLRLens, &QPushButton::clicked, this, &EquipmentWriter::slotRemoveDSLRLens);
0076     connect(ui.DSLRLensList,  &QListWidget::currentTextChanged, this, &EquipmentWriter::slotSetDSLRLens);
0077 }
0078 
0079 void EquipmentWriter::slotAddScope()
0080 {
0081     KStarsData::Instance()->userdb()->AddScope(ui.Model->text(),
0082             ui.Vendor->text(),
0083             ui.Type->currentText(),
0084             ui.Aperture->value(),
0085             ui.FocalLength->value());
0086 
0087     loadEquipment();
0088     ui.Model->clear();
0089     ui.Vendor->clear();
0090     ui.Aperture->setValue(0);
0091     ui.FocalLength->setValue(0);
0092 }
0093 
0094 void EquipmentWriter::slotRemoveScope()
0095 {
0096     KStarsData::Instance()->userdb()->DeleteEquipment("telescope", ui.Id->text());
0097     ui.Model->clear();
0098     ui.Vendor->clear();
0099     ui.Aperture->setValue(0);
0100     ui.FocalLength->setValue(0);
0101     loadEquipment();
0102 }
0103 
0104 void EquipmentWriter::slotSaveScope()
0105 {
0106     KStarsData::Instance()->userdb()->AddScope(ui.Model->text(),
0107             ui.Vendor->text(),
0108             ui.Type->currentText(),
0109             ui.Aperture->value(),
0110             ui.FocalLength->value(),
0111             ui.Id->text());
0112 
0113     loadEquipment();
0114 }
0115 
0116 void EquipmentWriter::slotSetScope(QString name)
0117 {
0118     //TODO: maybe this should also use the DB? ~~spacetime
0119     OAL::Scope *s = KStarsData::Instance()->logObject()->findScopeByName(name);
0120     if (s)
0121     {
0122         ui.Id->setText(s->id());
0123         ui.Model->setText(s->model());
0124         ui.Vendor->setText(s->vendor());
0125         ui.Type->setCurrentIndex(ui.Type->findText(s->type()));
0126         ui.Aperture->setValue(s->aperture());
0127         ui.FocalLength->setValue(s->focalLength());
0128         newScope = false;
0129     }
0130 }
0131 void EquipmentWriter::slotNewScope()
0132 {
0133     ui.Id->clear();
0134     ui.Model->clear();
0135     ui.Vendor->clear();
0136     ui.FocalLength->setValue(0);
0137     ui.ScopeList->selectionModel()->clear();
0138     newScope = true;
0139 }
0140 
0141 //////////////////////////////////////////////////////////////////////////////////////////
0142 /// DSLR lens
0143 //////////////////////////////////////////////////////////////////////////////////////////
0144 
0145 void EquipmentWriter::slotAddDSLRLens()
0146 {
0147     KStarsData::Instance()->userdb()->AddDSLRLens(
0148         ui.DSLR_model->text(),
0149         ui.DSLR_vendor->text(),
0150         ui.DSLRFocalLength->value(),
0151         ui.DSLRFocalRatio->value());
0152     loadEquipment();
0153     ui.DSLR_model->clear();
0154     ui.DSLR_vendor->clear();
0155     ui.DSLRFocalLength->setValue(24);
0156     ui.DSLRFocalRatio->setValue(2.8);
0157 }
0158 
0159 void EquipmentWriter::slotRemoveDSLRLens()
0160 {
0161     KStarsData::Instance()->userdb()->DeleteEquipment("dslrlens", ui.DSLR_id->text());
0162     ui.DSLR_model->clear();
0163     ui.DSLR_vendor->clear();
0164     ui.DSLRFocalLength->setValue(24);
0165     ui.DSLRFocalRatio->setValue(2.8);
0166     loadEquipment();
0167 }
0168 
0169 void EquipmentWriter::slotSaveDSLRLens()
0170 {
0171     KStarsData::Instance()->userdb()->AddDSLRLens(
0172         ui.DSLR_model->text(),
0173         ui.DSLR_vendor->text(),
0174         ui.DSLRFocalLength->value(),
0175         ui.DSLRFocalRatio->value(),
0176         ui.DSLR_id->text());
0177 
0178     loadEquipment();
0179 }
0180 
0181 void EquipmentWriter::slotSetDSLRLens(QString name)
0182 {
0183     OAL::DSLRLens *s = KStarsData::Instance()->logObject()->findDSLRLensByName(name);
0184     if (s)
0185     {
0186         ui.DSLR_id->setText(s->id());
0187         ui.DSLR_model->setText(s->model());
0188         ui.DSLR_vendor->setText(s->vendor());
0189         ui.DSLRFocalLength->setValue(s->focalLength());
0190         ui.DSLRFocalRatio->setValue(s->focalRatio());
0191         newDSLRLens = false;
0192     }
0193 }
0194 
0195 void EquipmentWriter::slotNewDSLRLens()
0196 {
0197     ui.DSLR_id->clear();
0198     ui.DSLR_model->clear();
0199     ui.DSLR_vendor->clear();
0200     ui.DSLRFocalLength->setValue(24);
0201     ui.DSLRFocalRatio->setValue(2.8);
0202     ui.DSLRLensList->selectionModel()->clear();
0203     newDSLRLens = true;
0204 }
0205 
0206 //////////////////////////////////////////////////////////////////////////////////////////
0207 /// Eyepeices
0208 //////////////////////////////////////////////////////////////////////////////////////////
0209 
0210 void EquipmentWriter::slotAddEyepiece()
0211 {
0212     KStarsData::Instance()->userdb()->AddEyepiece(ui.e_Vendor->text(), ui.e_Model->text(), ui.e_focalLength->value(),
0213             ui.Fov->value(), ui.FovUnit->currentText());
0214     loadEquipment();
0215     ui.e_Id->clear();
0216     ui.e_Model->clear();
0217     ui.e_Vendor->clear();
0218     ui.Fov->setValue(0);
0219     ui.e_focalLength->setValue(0);
0220 }
0221 
0222 void EquipmentWriter::slotRemoveEyepiece()
0223 {
0224     KStarsData::Instance()->userdb()->DeleteEquipment("eyepiece", ui.e_Id->text());
0225     loadEquipment();
0226     ui.e_Id->clear();
0227     ui.e_Model->clear();
0228     ui.e_Vendor->clear();
0229     ui.Fov->setValue(0);
0230     ui.e_focalLength->setValue(0);
0231     ui.EyepieceList->clear();
0232     foreach (OAL::Eyepiece *e, *(KStarsData::Instance()->logObject()->eyepieceList()))
0233         ui.EyepieceList->addItem(e->name());
0234 }
0235 void EquipmentWriter::slotSaveEyepiece()
0236 {
0237     KStarsData::Instance()->userdb()->AddEyepiece(ui.e_Vendor->text(), ui.e_Model->text(), ui.e_focalLength->value(),
0238             ui.Fov->value(), ui.FovUnit->currentText(), ui.e_Id->text());
0239     loadEquipment();
0240 }
0241 
0242 void EquipmentWriter::slotSetEyepiece(QString name)
0243 {
0244     //TODO: maybe this should also use the DB? ~~spacetime
0245     OAL::Eyepiece *e;
0246     e = KStarsData::Instance()->logObject()->findEyepieceByName(name);
0247     if (e)
0248     {
0249         ui.e_Id->setText(e->id());
0250         ui.e_Model->setText(e->model());
0251         ui.e_Vendor->setText(e->vendor());
0252         ui.Fov->setValue(e->appFov());
0253         ui.e_focalLength->setValue(e->focalLength());
0254         newEyepiece = false;
0255     }
0256 }
0257 
0258 void EquipmentWriter::slotNewEyepiece()
0259 {
0260     ui.e_Id->clear();
0261     ui.e_Model->clear();
0262     ui.e_Vendor->clear();
0263     ui.Fov->setValue(0);
0264     ui.e_focalLength->setValue(0);
0265     ui.EyepieceList->selectionModel()->clear();
0266     newEyepiece = true;
0267 }
0268 
0269 void EquipmentWriter::slotAddLens()
0270 {
0271     KStarsData::Instance()->userdb()->AddLens(ui.l_Vendor->text(), ui.l_Model->text(), ui.l_Factor->value());
0272     loadEquipment();
0273     ui.l_Id->clear();
0274     ui.l_Model->clear();
0275     ui.l_Vendor->clear();
0276     ui.l_Factor->setValue(0);
0277 }
0278 
0279 void EquipmentWriter::slotRemoveLens()
0280 {
0281     KStarsData::Instance()->userdb()->DeleteEquipment("lens", ui.l_Id->text());
0282     loadEquipment();
0283     ui.l_Id->clear();
0284     ui.l_Model->clear();
0285     ui.l_Vendor->clear();
0286     ui.l_Factor->setValue(0);
0287     ui.LensList->clear();
0288     foreach (OAL::Lens *l, *(KStarsData::Instance()->logObject()->lensList()))
0289         ui.LensList->addItem(l->name());
0290 }
0291 void EquipmentWriter::slotSaveLens()
0292 {
0293     KStarsData::Instance()->userdb()->AddLens(ui.l_Vendor->text(), ui.l_Model->text(), ui.l_Factor->value(),
0294             ui.l_Id->text());
0295     loadEquipment();
0296 }
0297 
0298 void EquipmentWriter::slotSetLens(QString name)
0299 {
0300     OAL::Lens *l;
0301     l = KStarsData::Instance()->logObject()->findLensByName(name);
0302     if (l)
0303     {
0304         ui.l_Id->setText(l->id());
0305         ui.l_Model->setText(l->model());
0306         ui.l_Vendor->setText(l->vendor());
0307         ui.l_Factor->setValue(l->factor());
0308         newLens = false;
0309     }
0310 }
0311 
0312 void EquipmentWriter::slotNewLens()
0313 {
0314     ui.l_Id->clear();
0315     ui.l_Model->clear();
0316     ui.l_Vendor->clear();
0317     ui.l_Factor->setValue(0);
0318     ui.LensList->selectionModel()->clear();
0319     newLens = true;
0320 }
0321 
0322 void EquipmentWriter::slotAddFilter()
0323 {
0324     filterProperties *fp = new filterProperties(ui.f_Vendor->text(), ui.f_Model->text(), ui.f_Type->text(),
0325             ui.f_Color->text(), ui.f_Offset->value(), ui.f_Exposure->value(), ui.f_UseAutoFocus->isChecked(),
0326             ui.f_LockedFilter->text(), 0, Ekos::INVALID_VALUE, Ekos::INVALID_VALUE, ui.f_FocusTicksPerTemp->value(),
0327             ui.f_FocusTicksPerAlt->value(), ui.f_Wavelength->value());
0328     KStarsData::Instance()->userdb()->AddFilter(fp, ui.f_Vendor->text());
0329 
0330     loadEquipment();
0331     ui.f_Id->clear();
0332     ui.f_Model->clear();
0333     ui.f_Vendor->clear();
0334     ui.f_Type->clear();
0335     ui.f_Offset->setValue(0);
0336     ui.f_Color->clear();
0337     ui.f_Exposure->setValue(1);
0338     ui.f_LockedFilter->setText(NULL_FILTER);
0339     ui.f_UseAutoFocus->setChecked(false);
0340     ui.f_FocusTemperature->setValue(Ekos::INVALID_VALUE);
0341     ui.f_FocusAltitude->setValue(Ekos::INVALID_VALUE);
0342     ui.f_FocusTicksPerTemp->setValue(0.0);
0343     ui.f_FocusTicksPerAlt->setValue(0.0);
0344     ui.f_Wavelength->setValue(500.0);
0345 
0346 }
0347 
0348 void EquipmentWriter::slotRemoveFilter()
0349 {
0350     KStarsData::Instance()->userdb()->DeleteEquipment("filter", ui.f_Id->text());
0351     loadEquipment();
0352     ui.f_Id->clear();
0353     ui.f_Model->clear();
0354     ui.f_Vendor->clear();
0355     ui.f_Type->clear();
0356     ui.f_Offset->setValue(0);
0357     ui.f_Color->clear();
0358     ui.f_Exposure->setValue(0);
0359     ui.f_LockedFilter->setText(NULL_FILTER);
0360     ui.f_UseAutoFocus->setChecked(false);
0361     ui.f_FocusTemperature->setValue(Ekos::INVALID_VALUE);
0362     ui.f_FocusAltitude->setValue(Ekos::INVALID_VALUE);
0363     ui.f_FocusTicksPerTemp->setValue(0.0);
0364     ui.f_FocusTicksPerAlt->setValue(0.0);
0365     ui.f_Wavelength->setValue(500.0);
0366     ui.FilterList->clear();
0367     foreach (OAL::Filter *f, *(KStarsData::Instance()->logObject()->filterList()))
0368         ui.FilterList->addItem(f->name());
0369 }
0370 
0371 void EquipmentWriter::slotSaveFilter()
0372 {
0373     filterProperties *fp = new filterProperties(ui.f_Vendor->text(), ui.f_Model->text(), ui.f_Type->text(),
0374             ui.f_Color->text(), ui.f_Offset->value(), ui.f_Exposure->value(), ui.f_UseAutoFocus->isChecked(),
0375             ui.f_LockedFilter->text(), ui.f_AbsoluteFocusPosition->value(), ui.f_FocusTemperature->value(),
0376             ui.f_FocusAltitude->value(), ui.f_FocusTicksPerTemp->value(), ui.f_FocusTicksPerAlt->value(),
0377             ui.f_Wavelength->value());
0378     // Add
0379     if (ui.f_Id->text().isEmpty())
0380         KStarsData::Instance()->userdb()->AddFilter(fp);
0381     // Update Existing
0382     else
0383         KStarsData::Instance()->userdb()->AddFilter(fp, ui.f_Id->text());
0384 
0385     loadEquipment();
0386 }
0387 
0388 void EquipmentWriter::slotSetFilter(QString name)
0389 {
0390     OAL::Filter *f;
0391     f = KStarsData::Instance()->logObject()->findFilterByName(name);
0392     if (f)
0393     {
0394         ui.f_Id->setText(f->id());
0395         ui.f_Model->setText(f->model());
0396         ui.f_Vendor->setText(f->vendor());
0397         ui.f_Type->setText(f->type());
0398         ui.f_Color->setText(f->color());
0399         ui.f_Offset->setValue(f->offset());
0400         ui.f_Exposure->setValue(f->exposure());
0401         ui.f_LockedFilter->setText(f->lockedFilter());
0402         ui.f_UseAutoFocus->setChecked(f->useAutoFocus());
0403         ui.f_AbsoluteFocusPosition->setValue(f->absoluteFocusPosition());
0404         ui.f_FocusTemperature->setValue(f->focusTemperature());
0405         ui.f_FocusAltitude->setValue(f->focusAltitude());
0406         ui.f_FocusTicksPerTemp->setValue(f->focusTicksPerTemp());
0407         ui.f_FocusTicksPerAlt->setValue(f->focusTicksPerAlt());
0408         ui.f_Wavelength->setValue(f->wavelength());
0409         newFilter = false;
0410     }
0411 }
0412 
0413 void EquipmentWriter::slotNewFilter()
0414 {
0415     ui.f_Id->clear();
0416     ui.f_Model->clear();
0417     ui.f_Vendor->clear();
0418     ui.f_Type->clear();
0419     ui.f_Model->clear();
0420     ui.f_Color->clear();
0421     ui.f_Offset->setValue(0);
0422     ui.f_Exposure->setValue(1);
0423     ui.f_LockedFilter->setText(NULL_FILTER);
0424     ui.f_UseAutoFocus->setChecked(false);
0425     ui.f_AbsoluteFocusPosition->setValue(0);
0426     ui.f_FocusTemperature->setValue(Ekos::INVALID_VALUE);
0427     ui.f_FocusAltitude->setValue(Ekos::INVALID_VALUE);
0428     ui.f_FocusTicksPerTemp->setValue(0.0);
0429     ui.f_FocusTicksPerAlt->setValue(0.0);
0430     ui.f_Wavelength->setValue(500.0);
0431     ui.FilterList->selectionModel()->clear();
0432     newFilter = true;
0433 }
0434 
0435 void EquipmentWriter::loadEquipment()
0436 {
0437     KStarsData::Instance()->logObject()->readScopes();
0438     KStarsData::Instance()->logObject()->readEyepieces();
0439     KStarsData::Instance()->logObject()->readLenses();
0440     KStarsData::Instance()->logObject()->readFilters();
0441     KStarsData::Instance()->logObject()->readDSLRLenses();
0442     ui.ScopeList->clear();
0443     ui.EyepieceList->clear();
0444     ui.LensList->clear();
0445     ui.FilterList->clear();
0446     ui.DSLRLensList->clear();
0447     foreach (OAL::Scope *s, *(KStarsData::Instance()->logObject()->scopeList()))
0448         ui.ScopeList->addItem(s->name());
0449     foreach (OAL::Eyepiece *e, *(KStarsData::Instance()->logObject()->eyepieceList()))
0450         ui.EyepieceList->addItem(e->name());
0451     foreach (OAL::Lens *l, *(KStarsData::Instance()->logObject()->lensList()))
0452         ui.LensList->addItem(l->name());
0453     foreach (OAL::Filter *f, *(KStarsData::Instance()->logObject()->filterList()))
0454         ui.FilterList->addItem(f->name());
0455     foreach (OAL::DSLRLens *l, *(KStarsData::Instance()->logObject()->dslrLensList()))
0456         ui.DSLRLensList->addItem(l->name());
0457 
0458 #ifdef HAVE_INDI
0459     DriverManager::Instance()->updateCustomDrivers();
0460 #endif
0461 }
0462 
0463 void EquipmentWriter::slotSave()
0464 {
0465     switch (ui.tabWidget->currentIndex())
0466     {
0467         case 0:
0468         {
0469             if (newScope)
0470                 slotAddScope();
0471             else
0472                 slotSaveScope();
0473             ui.ScopeList->clear();
0474             foreach (OAL::Scope *s, *(KStarsData::Instance()->logObject()->scopeList()))
0475                 ui.ScopeList->addItem(s->name());
0476             break;
0477         }
0478         case 1:
0479         {
0480             if (newEyepiece)
0481                 slotAddEyepiece();
0482             else
0483                 slotSaveEyepiece();
0484             ui.EyepieceList->clear();
0485             foreach (OAL::Eyepiece *e, *(KStarsData::Instance()->logObject()->eyepieceList()))
0486                 ui.EyepieceList->addItem(e->name());
0487             break;
0488         }
0489         case 2:
0490         {
0491             if (newDSLRLens)
0492                 slotAddDSLRLens();
0493             else
0494                 slotSaveDSLRLens();
0495             ui.DSLRLensList->clear();
0496             for (const auto &l : * (KStarsData::Instance()->logObject()->dslrLensList()))
0497                 ui.DSLRLensList->addItem(l->name());
0498             break;
0499         }
0500         case 3:
0501         {
0502             if (newLens)
0503                 slotAddLens();
0504             else
0505                 slotSaveLens();
0506             ui.LensList->clear();
0507             foreach (OAL::Lens *l, *(KStarsData::Instance()->logObject()->lensList()))
0508                 ui.LensList->addItem(l->name());
0509             break;
0510         }
0511         case 4:
0512         {
0513             if (newFilter)
0514                 slotAddFilter();
0515             else
0516                 slotSaveFilter();
0517             ui.FilterList->clear();
0518             foreach (OAL::Filter *f, *(KStarsData::Instance()->logObject()->filterList()))
0519                 ui.FilterList->addItem(f->name());
0520             break;
0521         }
0522     }
0523 }
0524 
0525 void EquipmentWriter::slotClose()
0526 {
0527     hide();
0528 }