Kstars

capture.cpp
1/*
2 SPDX-FileCopyrightText: 2012 Jasem Mutlaq <mutlaqja@ikarustech.com>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "capture.h"
8#include "opsmiscsettings.h"
9#include "opsdslrsettings.h"
10#include <KConfigDialog>
11
12#include "cameraprocess.h"
13#include "camerastate.h"
14#include "capturedeviceadaptor.h"
15#include "captureadaptor.h"
16#include "refocusstate.h"
17#include "kstars.h"
18#include "kstarsdata.h"
19#include "Options.h"
20#include "sequencejob.h"
21#include "placeholderpath.h"
22#include "ekos/manager.h"
23#include "ekos/auxiliary/darklibrary.h"
24#include "ekos/auxiliary/opticaltrainmanager.h"
25#include "ekos/auxiliary/profilesettings.h"
26#include "auxiliary/ksmessagebox.h"
27
28#include "scriptsmanager.h"
29#include "fitsviewer/fitsdata.h"
30#include "indi/driverinfo.h"
31#include "indi/indifilterwheel.h"
32#include "indi/indicamera.h"
33#include "indi/indirotator.h"
34#include "ekos/guide/guide.h"
35#include <basedevice.h>
36
37#include <ekos_capture_debug.h>
38#include <qlineedit.h>
39
40#define MF_TIMER_TIMEOUT 90000
41#define MF_RA_DIFF_LIMIT 4
42
43// Qt version calming
44#include <qtendl.h>
45
46#define KEY_FILTERS "filtersList"
47#define TAB_BUTTON_SIZE 20
48
49namespace Ekos
50{
51
52Capture::Capture()
53{
54 setupUi(this);
55
56 qRegisterMetaType<CaptureState>("CaptureState");
57 qDBusRegisterMetaType<CaptureState>();
58 new CaptureAdaptor(this);
59 // initialize the global capture state
60 m_moduleState.reset(new CaptureModuleState());
61
62 // Adding the "New Tab" tab
63 QWidget *newTab = new QWidget;
64 QPushButton *addButton = new QPushButton;
65 addButton->setIcon(QIcon::fromTheme("list-add"));
66 addButton->setFixedSize(TAB_BUTTON_SIZE, TAB_BUTTON_SIZE);
67 addButton->setToolTip(i18n("<p>Add additional camera</p><p><b>WARNING</b>: This feature is experimental!</p>"));
68 connect(addButton, &QPushButton::clicked, this, &Capture::addCamera);
69
70 cameraTabs->addTab(newTab, "");
71 cameraTabs->tabBar()->setTabButton(0, QTabBar::RightSide, addButton);
72 // Connect the close request signal to the slot
73 connect(cameraTabs, &QTabWidget::tabCloseRequested, this, &Capture::checkCloseCameraTab);
74 // Create main camera
75 addCamera();
76
77 QDBusConnection::sessionBus().registerObject("/KStars/Ekos/Capture", this);
78 QPointer<QDBusInterface> ekosInterface = new QDBusInterface("org.kde.kstars", "/KStars/Ekos", "org.kde.kstars.Ekos",
80
81 // Connecting DBus signals
82 QDBusConnection::sessionBus().connect("org.kde.kstars", "/KStars/Ekos", "org.kde.kstars.Ekos", "newModule", this,
83 SLOT(registerNewModule(QString)));
84
85 // ensure that the mount interface is present
86 registerNewModule("Mount");
87
88 DarkLibrary::Instance()->setCaptureModule(this);
89
90 // connection to the global module state
91 connect(m_moduleState.get(), &CaptureModuleState::dither, this, &Capture::dither);
92 connect(m_moduleState.get(), &CaptureModuleState::newLog, this, &Capture::appendLogText);
93
95}
96
97
99{
100 KConfigDialog *dialog = new KConfigDialog(this, "capturesettings", Options::self());
101
102#ifdef Q_OS_MACOS
103 dialog->setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint);
104#endif
105
106 m_OpsMiscSettings = new OpsMiscSettings();
107 KPageWidgetItem *page = dialog->addPage(m_OpsMiscSettings, i18n("Misc"));
108 page->setIcon(QIcon::fromTheme("configure"));
109
110 m_OpsDslrSettings = new OpsDslrSettings();
111 page = dialog->addPage(m_OpsDslrSettings, i18n("DSLR"));
112 page->setIcon(QIcon::fromTheme("camera-photo"));
113
114
115}
116QSharedPointer<Camera> Capture::addCamera()
117{
118 QSharedPointer<Camera> newCamera;
119 newCamera.reset(new Camera(cameras().count(), false, nullptr));
120
121 // create the new tab and bring it to front
122 const int tabIndex = cameraTabs->insertTab(std::max(0, cameraTabs->count() - 1), newCamera.get(), "new Camera");
123 cameraTabs->setCurrentIndex(tabIndex);
124 // make the tab first tab non closeable
125 if (tabIndex == 0)
126 cameraTabs->tabBar()->setTabButton(0, QTabBar::RightSide, nullptr);
127
128 // forward signals from the camera
129 connect(newCamera.get(), &Camera::newLog, this, &Capture::appendLogText);
130 connect(newCamera.get(), &Camera::refreshCamera, this, &Capture::updateCamera);
131 connect(newCamera.get(), &Camera::sequenceChanged, this, &Capture::sequenceChanged);
132 connect(newCamera.get(), &Camera::newLocalPreview, this, &Capture::newLocalPreview);
133 connect(newCamera.get(), &Camera::dslrInfoRequested, this, &Capture::dslrInfoRequested);
134 connect(newCamera.get(), &Camera::trainChanged, this, &Capture::trainChanged);
135 connect(newCamera.get(), &Camera::settingsUpdated, this, &Capture::settingsUpdated);
136 connect(newCamera.get(), &Camera::filterManagerUpdated, this, &Capture::filterManagerUpdated);
137 connect(newCamera.get(), &Camera::newFilterStatus, this, &Capture::newFilterStatus);
138 connect(newCamera.get(), &Camera::ready, this, &Capture::ready);
139 connect(newCamera.get(), &Camera::newExposureProgress, this, &Capture::newExposureProgress);
140 connect(newCamera.get(), &Camera::captureComplete, this, &Capture::captureComplete);
141 connect(newCamera.get(), &Camera::captureStarting, this, &Capture::captureStarting);
142 connect(newCamera.get(), &Camera::captureAborted, this, &Capture::captureAborted);
143 connect(newCamera.get(), &Camera::checkFocus, this, &Capture::checkFocus);
144 connect(newCamera.get(), &Camera::newImage, this, &Capture::newImage);
145 connect(newCamera.get(), &Camera::runAutoFocus, this, &Capture::runAutoFocus);
146 connect(newCamera.get(), &Camera::resetFocusFrame, this, &Capture::resetFocusFrame);
147 connect(newCamera.get(), &Camera::abortFocus, this, &Capture::abortFocus);
148 connect(newCamera.get(), &Camera::adaptiveFocus, this, &Capture::adaptiveFocus);
149 connect(newCamera.get(), &Camera::meridianFlipStarted, this, &Capture::meridianFlipStarted);
150 connect(newCamera.get(), &Camera::captureTarget, this, &Capture::captureTarget);
151 connect(newCamera.get(), &Camera::guideAfterMeridianFlip, this, &Capture::guideAfterMeridianFlip);
152 connect(newCamera.get(), &Camera::newStatus, this, &Capture::newStatus);
153 connect(newCamera.get(), &Camera::suspendGuiding, this, &Capture::suspendGuiding);
154 connect(newCamera.get(), &Camera::resumeGuiding, this, &Capture::resumeGuiding);
155 connect(newCamera.get(), &Camera::resetNonGuidedDither, this, &Capture::resetNonGuidedDither);
156 connect(newCamera.get(), &Camera::driverTimedout, this, &Capture::driverTimedout);
157
158 // find an unused train for additional tabs
159 const QString train = tabIndex == 0 ? "" : findUnusedOpticalTrain();
160 // select an unused train
161 if (train != "")
162 newCamera->opticalTrainCombo->setCurrentText(train);
163
164 moduleState()->addCamera(newCamera);
165 // update the tab text
166 updateCamera(tabIndex, true);
167
168 return newCamera;
169}
170
171const QString Capture::findUnusedOpticalTrain()
172{
173 QList<QString> names = OpticalTrainManager::Instance()->getTrainNames();
174 foreach(auto cam, cameras())
175 names.removeAll(cam->opticalTrain());
176
177 if (names.isEmpty())
178 return "";
179 else
180 return names.first();
181}
182
183void Capture::updateCamera(int tabID, bool isValid)
184{
185 if (isValid)
186 {
187 if (tabID < cameraTabs->count() && tabID < cameras().count())
188 {
189 auto cam = moduleState()->mutableCameras()[tabID];
190
191 if (cam->activeCamera() != nullptr)
192 {
193 auto name = cam->activeCamera()->getDeviceName();
194 cameraTabs->setTabText(tabID, name);
195 }
196
197 // update shared attributes
198 cam->state()->getRefocusState()->setForceInSeqAF(moduleState()->forceInSeqAF(cam->opticalTrain()));
199 }
200 else
201 qCWarning(KSTARS_EKOS_CAPTURE) << "Unknown camera ID:" << tabID;
202 }
203 else
204 cameraTabs->setTabText(cameraTabs->currentIndex(), "no camera");
205}
206
207
209{
210 return process()->setDome(device);
211}
212
214{
215 if (mainCamera()->m_standAlone)
216 return;
217 if (name == "Mount" && mountInterface == nullptr)
218 {
219 qCDebug(KSTARS_EKOS_CAPTURE) << "Registering new Module (" << name << ")";
220 mountInterface = new QDBusInterface("org.kde.kstars", "/KStars/Ekos/Mount",
221 "org.kde.kstars.Ekos.Mount", QDBusConnection::sessionBus(), this);
222 }
223}
224
225QString Capture::camera()
226{
227 if (mainCameraDevices()->getActiveCamera())
228 return mainCameraDevices()->getActiveCamera()->getDeviceName();
229
230 return QString();
231}
232
233void Capture::setGuideChip(ISD::CameraChip * guideChip)
234{
235 // We should suspend guide in two scenarios:
236 // 1. If guide chip is within the primary CCD, then we cannot download any data from guide chip while primary CCD is downloading.
237 // 2. If we have two CCDs running from ONE driver (Multiple-Devices-Per-Driver mpdp is true). Same issue as above, only one download
238 // at a time.
239 // After primary CCD download is complete, we resume guiding.
240 if (!mainCameraDevices()->getActiveCamera())
241 return;
242
243 mainCameraState()->setSuspendGuidingOnDownload((mainCameraDevices()->getActiveCamera()->getChip(
244 ISD::CameraChip::GUIDE_CCD) == guideChip) ||
245 (guideChip->getCCD() == mainCameraDevices()->getActiveCamera() &&
246 mainCameraDevices()->getActiveCamera()->getDriverInfo()->getAuxInfo().value("mdpd", false).toBool()));
247}
248
249void Capture::setFocusStatus(FocusState newstate, const QString &trainname)
250{
251 // publish to all known focusers using the same optical train (should be only one)
252 for (auto &cam : cameras())
253 if (trainname == "" || cam->opticalTrain() == trainname)
254 cam->setFocusStatus(newstate);
255}
256
257void Capture::focusAdaptiveComplete(bool success, const QString &trainname)
258{
259 // publish to all known focusers using the same optical train (should be only one)
260 for (auto &cam : cameras())
261 if (trainname == "" || cam->opticalTrain() == trainname)
262 cam->focusAdaptiveComplete(success);
263}
264
265QString Capture::filterWheel()
266{
267 if (mainCameraDevices()->filterWheel())
268 return mainCameraDevices()->filterWheel()->getDeviceName();
269
270 return QString();
271}
272
273bool Capture::setFilter(const QString &filter)
274{
275 if (mainCameraDevices()->filterWheel())
276 {
277 mainCamera()->FilterPosCombo->setCurrentText(filter);
278 return true;
279 }
280
281 return false;
282}
283
284QString Capture::filter()
285{
286 return mainCamera()->FilterPosCombo->currentText();
287}
288
289bool Capture::loadSequenceQueue(const QString &fileURL, QString train, bool isLead, QString targetName)
290{
292 if (train == "")
293 cam = mainCamera();
294 else if (isLead)
295 {
296 // take the main camera, and select the train if necessary
297 if (mainCamera()->opticalTrain() != train)
298 mainCamera()->selectOpticalTrain(train);
299
300 cam = mainCamera();
301 }
302 else
303 {
304 // find the camera, create a new one if necessary
305 int pos = findCamera(train, true);
306 if (pos < 0)
307 return false;
308 else
309 cam = camera(pos);
310 }
311 // camera found, load the sequence queue
312 return cam->loadSequenceQueue(fileURL, targetName);
313}
314
315
316void Capture::appendLogText(const QString &text)
317{
318 m_LogText.insert(0, i18nc("log entry; %1 is the date, %2 is the text", "%1 %2",
319 KStarsData::Instance()->lt().toString("yyyy-MM-ddThh:mm:ss"), text));
320
321 qCInfo(KSTARS_EKOS_CAPTURE) << text;
322
323 emit newLog(text);
324}
325
326void Capture::clearLog()
327{
328 m_LogText.clear();
329 emit newLog(QString());
330}
331
332void Capture::setFocusTemperatureDelta(double focusTemperatureDelta, double absTemperture, const QString &trainname)
333{
334 Q_UNUSED(absTemperture);
335 // publish to all known focusers using the same optical train (should be only one)
336 for (auto &cam : cameras())
337 if (trainname == "" || cam->opticalTrain() == trainname)
338 cam->state()->getRefocusState()->setFocusTemperatureDelta(focusTemperatureDelta);
339}
340
341void Capture::setGuideDeviation(double delta_ra, double delta_dec)
342{
343 // forward it to the global state machine
344 moduleState()->setGuideDeviation(delta_ra, delta_dec);
345
346}
347
349{
350 // This function is called independently from the Scheduler or the UI, so honor the change
351 mainCameraState()->setIgnoreJobProgress(true);
352}
353
354void Capture::setCapturedFramesMap(const QString &signature, int count, QString train)
355{
357 if (train == "")
358 cam = mainCamera();
359 else
360 {
361 // find the camera, create a new one if necessary
362 int pos = findCamera(train, true);
363 if (pos < 0)
364 qCWarning(KSTARS_EKOS_CAPTURE) << "Cannot set the captured frames map for train" << train;
365 else
366 cam = camera(pos);
367 }
368 // camera found, set the captured frames map
369 cam->state()->setCapturedFramesCount(signature, count);
370}
371
372void Capture::setAlignStatus(AlignState newstate)
373{
374 // forward it directly to the state machine
375 mainCameraState()->setAlignState(newstate);
376}
377
378void Capture::setGuideStatus(GuideState newstate)
379{
380 // forward to state machine
381 moduleState()->setGuideStatus(newstate);
382}
383
384bool Capture::setVideoLimits(uint16_t maxBufferSize, uint16_t maxPreviewFPS)
385{
386 if (mainCameraDevices()->getActiveCamera() == nullptr)
387 return false;
388
389 return mainCameraDevices()->getActiveCamera()->setStreamLimits(maxBufferSize, maxPreviewFPS);
390}
391
393{
395 if (train == "")
396 cam = mainCamera();
397 else
398 {
399 // find the camera, create a new one if necessary
400 int pos = findCamera(train, true);
401 if (pos < 0)
402 {
403 qCWarning(KSTARS_EKOS_CAPTURE) << "Cannot start capturing for train" << train;
404 return "";
405 }
406 else
407 cam = camera(pos);
408 }
409 // camera found, start capturing
410 cam->start();
411 // return the real train name
412 return cam->opticalTrain();
413}
414
416{
418 if (train == "")
419 for (auto cam : cameras())
420 cam->abort();
421 else
422 {
423 int pos = findCamera(train, false);
424 if (pos < 0)
425 {
426 qCWarning(KSTARS_EKOS_CAPTURE) << "Cannot abort capturing for train" << train;
427 return;
428 }
429 else
430 cam = camera(pos);
431
432 // camera found, abort capturing
433 cam->abort();
434 }
435}
436
437QSharedPointer<Camera> &Capture::camera(int i)
438{
439 if (i < cameras().count())
440 return moduleState()->mutableCameras()[i];
441 else
442 {
443 qCWarning(KSTARS_EKOS_CAPTURE) << "Unknown camera ID:" << i;
444 return moduleState()->mutableCameras()[0];
445 }
446}
447
448void Ekos::Capture::closeCameraTab(int tabIndex)
449{
450 cameraTabs->removeTab(tabIndex);
451 moduleState()->removeCamera(tabIndex);
452 // select the next one on the left
453 cameraTabs->setCurrentIndex(std::max(0, tabIndex - 1));
454}
455
456void Capture::checkCloseCameraTab(int tabIndex)
457{
458 // ignore close event from the "Add" tab
459 if (tabIndex == cameraTabs->count() - 1)
460 return;
461
462 if (moduleState()->mutableCameras()[tabIndex]->state()->isBusy())
463 {
464 // if accept has been clicked, abort and close the tab
465 connect(KSMessageBox::Instance(), &KSMessageBox::accepted, this, [this, &tabIndex]()
466 {
467 KSMessageBox::Instance()->disconnect(this);
468 moduleState()->mutableCameras()[tabIndex]->abort();
469 closeCameraTab(tabIndex);
470 });
471 // if cancel has been clicked, do not close the tab
472 connect(KSMessageBox::Instance(), &KSMessageBox::rejected, this, [this]()
473 {
474 KSMessageBox::Instance()->disconnect(this);
475 });
476
477 KSMessageBox::Instance()->warningContinueCancel(i18n("Camera %1 is busy. Abort to close?",
478 moduleState()->mutableCameras()[tabIndex]->activeCamera()->getDeviceName()), i18n("Stop capturing"), 30, false,
479 i18n("Abort"));
480 }
481 else
482 {
483 closeCameraTab(tabIndex);
484 }
485}
486
487const QSharedPointer<Camera> Capture::mainCamera() const
488{
489 if (cameras().size() > 0)
490 return moduleState()->cameras()[0];
491 else
492 {
493 QSharedPointer<CaptureModuleState> cms;
494 cms.reset(new CaptureModuleState());
495 // TODO FIXME
496 //return QSharedPointer<Camera>(new Camera(cms));
497 return QSharedPointer<Camera>(new Camera(0));
498 }
499}
500
501int Capture::findCamera(QString train, bool addIfNecessary)
502{
503 for (auto &cam : cameras())
504 {
505 if (cam->opticalTrain() == train)
506 return cam->m_cameraId;
507 }
508
509 // none found
510 if (addIfNecessary)
511 {
512 QSharedPointer<Camera> cam = addCamera();
513 cam->selectOpticalTrain(train);
514 return cam->m_cameraId;
515 }
516 // nothing found
517 return -1;
518}
519
520void Capture::setMountStatus(ISD::Mount::Status newState)
521{
522 switch (newState)
523 {
524 case ISD::Mount::MOUNT_PARKING:
525 case ISD::Mount::MOUNT_SLEWING:
526 case ISD::Mount::MOUNT_MOVING:
527 mainCamera()->previewB->setEnabled(false);
528 mainCamera()->liveVideoB->setEnabled(false);
529 // Only disable when button is "Start", and not "Stopped"
530 // If mount is in motion, Stopped button should always be enabled to terminate
531 // the sequence
532 if (mainCameraState()->isBusy() == false)
533 mainCamera()->startB->setEnabled(false);
534 break;
535
536 default:
537 if (mainCameraState()->isBusy() == false)
538 {
539 mainCamera()->previewB->setEnabled(true);
540 if (mainCameraDevices()->getActiveCamera())
541 mainCamera()->liveVideoB->setEnabled(mainCameraDevices()->getActiveCamera()->hasVideoStream());
542 mainCamera()->startB->setEnabled(true);
543 }
544
545 break;
546 }
547}
548
549void Capture::setAlignResults(double solverPA, double ra, double de, double pixscale)
550{
551 Q_UNUSED(ra)
552 Q_UNUSED(de)
553 Q_UNUSED(pixscale)
554 if (mainCameraDevices()->rotator() && mainCamera()->m_RotatorControlPanel)
555 mainCamera()->m_RotatorControlPanel->refresh(solverPA);
556}
557
558void Capture::setMeridianFlipState(QSharedPointer<MeridianFlipState> newstate)
559{
560 mainCameraState()->setMeridianFlipState(newstate);
561 connect(mainCameraState()->getMeridianFlipState().get(), &MeridianFlipState::newLog, this, &Capture::appendLogText);
562 connect(mainCameraState()->getMeridianFlipState().get(), &MeridianFlipState::newMountMFStatus, moduleState().get(),
563 &CaptureModuleState::updateMFMountState);
564}
565
567{
568 bool result = false;
569 for (auto &cam : cameras())
570 if (cam->process()->hasCoolerControl())
571 result |= cam->process()->hasCoolerControl();
572 return result;
573}
574
576{
577 bool result = true;
578 for (auto &cam : cameras())
579 if (cam->process()->hasCoolerControl())
580 result &= cam->process()->setCoolerControl(enable);
581
582 return result;
583}
584
586{
587 process()->removeDevice(device);
588}
589
590QString Capture::getTargetName()
591{
592 if (activeJob())
593 return activeJob()->getCoreProperty(SequenceJob::SJ_TargetName).toString();
594 else
595 return "";
596}
597
598void Capture::setHFR(double newHFR, int, bool inAutofocus, const QString &trainname)
599{
600 // publish to all known focusers using the same optical train (should be only one)
601 for (auto &cam : cameras())
602 if (trainname == "" || cam->opticalTrain() == trainname)
603 cam->state()->getRefocusState()->setFocusHFR(newHFR, inAutofocus);
604}
605
606void Capture::inSequenceAFRequested(bool requested, const QString &trainname)
607{
608 // publish to all known cameras using the same optical train (should be only one)
609 for (auto &cam : cameras())
610 if (trainname == "" || cam->opticalTrain() == trainname)
611 // set the value directly in the camera's state
612 cam->state()->getRefocusState()->setForceInSeqAF(requested);
613
614 moduleState()->setForceInSeqAF(requested, trainname);
615}
616} // namespace
void setHFR(double newHFR, int position, bool inAutofocus, const QString &trainname)
setHFR Receive the measured HFR value of the latest frame
Definition capture.cpp:598
bool setVideoLimits(uint16_t maxBufferSize, uint16_t maxPreviewFPS)
setVideoLimits sets the buffer size and max preview fps for live preview
Definition capture.cpp:384
bool setDome(ISD::Dome *device)
setDome Set dome device
Definition capture.cpp:208
void updateCamera(int tabID, bool isValid)
Update the camera.
Definition capture.cpp:183
void inSequenceAFRequested(bool requested, const QString &trainname)
inSequenceAFRequested Focuser informs that the user wishes an AF run as soon as possible.
Definition capture.cpp:606
QSharedPointer< CameraProcess > process() const
process shortcut for the process engine
Definition capture.h:615
void setFocusStatus(FocusState newstate, const QString &trainname)
setFocusStatus Forward the new focus state to the capture module state machine
Definition capture.cpp:249
void setFocusTemperatureDelta(double focusTemperatureDelta, double absTemperature, const QString &trainname)
setFocusTemperatureDelta update the focuser's temperature delta
Definition capture.cpp:332
void setGuideDeviation(double delta_ra, double delta_dec)
setGuideDeviation Set the guiding deviation as measured by the guiding module.
Definition capture.cpp:341
void registerNewModule(const QString &name)
registerNewModule Register an Ekos module as it arrives via DBus and create the appropriate DBus inte...
Definition capture.cpp:213
void focusAdaptiveComplete(bool success, const QString &trainname)
focusAdaptiveComplete Forward the new focus state to the capture module state machine
Definition capture.cpp:257
int findCamera(QString train, bool addIfNecessary)
find the camera using the given train
Definition capture.cpp:501
void removeDevice(const QSharedPointer< ISD::GenericDevice > &device)
Generic method for removing any connected device.
Definition capture.cpp:585
CameraChip class controls a particular chip in camera.
Class handles control of INDI dome devices.
Definition indidome.h:25
KPageWidgetItem * addPage(QWidget *page, const QString &itemName, const QString &pixmapName=QString(), const QString &header=QString(), bool manage=true)
void setIcon(const QIcon &icon)
Q_SCRIPTABLE bool hasCoolerControl()
DBUS interface function.
Definition capture.cpp:566
Q_SCRIPTABLE Q_NOREPLY void abort(QString train="")
DBUS interface function.
Definition capture.cpp:415
Q_SCRIPTABLE Q_NOREPLY void ignoreSequenceHistory()
DBUS interface function.
Definition capture.cpp:348
void setupOptions()
prepareGUI Perform once only GUI prep processing
Definition capture.cpp:98
Q_SCRIPTABLE QString start(QString train="")
DBUS interface function.
Definition capture.cpp:392
Q_SCRIPTABLE bool loadSequenceQueue(const QString &fileURL, QString train="", bool isLead=true, QString targetName="")
DBUS interface function.
Definition capture.cpp:289
Q_SCRIPTABLE bool setCoolerControl(bool enable)
DBUS interface function.
Definition capture.cpp:575
Q_SCRIPTABLE bool setFilter(const QString &filter)
DBUS interface function.
Definition capture.cpp:273
Q_SCRIPTABLE Q_NOREPLY void setCapturedFramesMap(const QString &signature, int count, QString train="")
DBUS interface function.
Definition capture.cpp:354
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
Ekos is an advanced Astrophotography tool for Linux.
Definition align.cpp:83
AlignState
Definition ekos.h:145
KIOCORE_EXPORT TransferJob * get(const QUrl &url, LoadType reload=NoReload, JobFlags flags=DefaultFlags)
void clicked(bool checked)
void setIcon(const QIcon &icon)
bool connect(const QString &service, const QString &path, const QString &interface, const QString &name, QObject *receiver, const char *slot)
bool registerObject(const QString &path, QObject *object, RegisterOptions options)
QDBusConnection sessionBus()
void accepted()
void rejected()
QIcon fromTheme(const QString &name)
void clear()
T & first()
iterator insert(const_iterator before, parameter_type value)
bool isEmpty() const const
qsizetype removeAll(const AT &t)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
bool disconnect(const QMetaObject::Connection &connection)
T * get() const const
void tabCloseRequested(int index)
QString toString() const const
QWidget(QWidget *parent, Qt::WindowFlags f)
void setFixedSize(const QSize &s)
void setupUi(QWidget *widget)
void setToolTip(const QString &)
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Jan 24 2025 11:53:00 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.