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
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}
116
118{
119 int pos = findCamera(trainname, false);
120 if (pos >= 0)
121 camera(pos)->clearAutoFocusHFR();
122}
123
124QSharedPointer<Camera> Capture::addCamera()
125{
126 QSharedPointer<Camera> newCamera;
127 newCamera.reset(new Camera(cameras().count(), false, nullptr));
128
129 // create the new tab and bring it to front
130 const int tabIndex = cameraTabs->insertTab(std::max(0, cameraTabs->count() - 1), newCamera.get(), "new Camera");
131 cameraTabs->setCurrentIndex(tabIndex);
132 // make the tab first tab non closeable
133 if (tabIndex == 0)
134 cameraTabs->tabBar()->setTabButton(0, QTabBar::RightSide, nullptr);
135
136 // forward signals from the camera
137 connect(newCamera.get(), &Camera::newLog, this, &Capture::appendLogText);
138 connect(newCamera.get(), &Camera::refreshCamera, this, &Capture::updateCamera);
139 connect(newCamera.get(), &Camera::sequenceChanged, this, &Capture::sequenceChanged);
140 connect(newCamera.get(), &Camera::newLocalPreview, this, &Capture::newLocalPreview);
141 connect(newCamera.get(), &Camera::dslrInfoRequested, this, &Capture::dslrInfoRequested);
142 connect(newCamera.get(), &Camera::trainChanged, this, &Capture::trainChanged);
143 connect(newCamera.get(), &Camera::settingsUpdated, this, &Capture::settingsUpdated);
144 connect(newCamera.get(), &Camera::filterManagerUpdated, this, &Capture::filterManagerUpdated);
145 connect(newCamera.get(), &Camera::newFilterStatus, this, &Capture::newFilterStatus);
146 connect(newCamera.get(), &Camera::ready, this, &Capture::ready);
147 connect(newCamera.get(), &Camera::newExposureProgress, this, &Capture::newExposureProgress);
148 connect(newCamera.get(), &Camera::captureComplete, this, &Capture::captureComplete);
149 connect(newCamera.get(), &Camera::captureStarting, this, &Capture::captureStarting);
150 connect(newCamera.get(), &Camera::captureAborted, this, &Capture::captureAborted);
151 connect(newCamera.get(), &Camera::checkFocus, this, &Capture::checkFocus);
152 connect(newCamera.get(), &Camera::newImage, this, &Capture::newImage);
153 connect(newCamera.get(), &Camera::runAutoFocus, this, &Capture::runAutoFocus);
154 connect(newCamera.get(), &Camera::resetFocusFrame, this, &Capture::resetFocusFrame);
155 connect(newCamera.get(), &Camera::abortFocus, this, &Capture::abortFocus);
156 connect(newCamera.get(), &Camera::adaptiveFocus, this, &Capture::adaptiveFocus);
157 connect(newCamera.get(), &Camera::meridianFlipStarted, this, &Capture::meridianFlipStarted);
158 connect(newCamera.get(), &Camera::captureTarget, this, &Capture::captureTarget);
159 connect(newCamera.get(), &Camera::guideAfterMeridianFlip, this, &Capture::guideAfterMeridianFlip);
160 connect(newCamera.get(), &Camera::newStatus, this, &Capture::newStatus);
161 connect(newCamera.get(), &Camera::suspendGuiding, this, &Capture::suspendGuiding);
162 connect(newCamera.get(), &Camera::resumeGuiding, this, &Capture::resumeGuiding);
163 connect(newCamera.get(), &Camera::resetNonGuidedDither, this, &Capture::resetNonGuidedDither);
164 connect(newCamera.get(), &Camera::driverTimedout, this, &Capture::driverTimedout);
165
166 // find an unused train for additional tabs
167 const QString train = tabIndex == 0 ? "" : findUnusedOpticalTrain();
168 // select an unused train
169 if (train != "")
170 newCamera->opticalTrainCombo->setCurrentText(train);
171
172 moduleState()->addCamera(newCamera);
173 // update the tab text
174 updateCamera(tabIndex, true);
175
176 return newCamera;
177}
178
179const QString Capture::findUnusedOpticalTrain()
180{
181 QList<QString> names = OpticalTrainManager::Instance()->getTrainNames();
182 foreach(auto cam, cameras())
183 names.removeAll(cam->opticalTrain());
184
185 if (names.isEmpty())
186 return "";
187 else
188 return names.first();
189}
190
191void Capture::updateCamera(int tabID, bool isValid)
192{
193 if (isValid)
194 {
195 if (tabID < cameraTabs->count() && tabID < cameras().count())
196 {
197 auto cam = moduleState()->mutableCameras()[tabID];
198
199 if (cam->activeCamera() != nullptr)
200 {
201 auto name = cam->activeCamera()->getDeviceName();
202 cameraTabs->setTabText(tabID, name);
203 }
204
205 // update shared attributes
206 cam->state()->getRefocusState()->setForceInSeqAF(moduleState()->forceInSeqAF(cam->opticalTrain()));
207 }
208 else
209 qCWarning(KSTARS_EKOS_CAPTURE) << "Unknown camera ID:" << tabID;
210 }
211 else
212 cameraTabs->setTabText(cameraTabs->currentIndex(), "no camera");
213}
214
215
217{
218 return process()->setDome(device);
219}
220
222{
223 if (mainCamera()->m_standAlone)
224 return;
225 if (name == "Mount" && mountInterface == nullptr)
226 {
227 qCDebug(KSTARS_EKOS_CAPTURE) << "Registering new Module (" << name << ")";
228 mountInterface = new QDBusInterface("org.kde.kstars", "/KStars/Ekos/Mount",
229 "org.kde.kstars.Ekos.Mount", QDBusConnection::sessionBus(), this);
230 }
231}
232
233QString Capture::camera()
234{
235 if (mainCameraDevices()->getActiveCamera())
236 return mainCameraDevices()->getActiveCamera()->getDeviceName();
237
238 return QString();
239}
240
241void Capture::setGuideChip(ISD::CameraChip * guideChip)
242{
243 // We should suspend guide in two scenarios:
244 // 1. If guide chip is within the primary CCD, then we cannot download any data from guide chip while primary CCD is downloading.
245 // 2. If we have two CCDs running from ONE driver (Multiple-Devices-Per-Driver mpdp is true). Same issue as above, only one download
246 // at a time.
247 // After primary CCD download is complete, we resume guiding.
248 if (!mainCameraDevices()->getActiveCamera())
249 return;
250
251 mainCameraState()->setSuspendGuidingOnDownload((mainCameraDevices()->getActiveCamera()->getChip(
252 ISD::CameraChip::GUIDE_CCD) == guideChip) ||
253 (guideChip->getCCD() == mainCameraDevices()->getActiveCamera() &&
254 mainCameraDevices()->getActiveCamera()->getDriverInfo()->getAuxInfo().value("mdpd", false).toBool()));
255}
256
257void Capture::setFocusStatus(FocusState newstate, 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->setFocusStatus(newstate);
263}
264
265void Capture::focusAdaptiveComplete(bool success, const QString &trainname)
266{
267 // publish to all known focusers using the same optical train (should be only one)
268 for (auto &cam : cameras())
269 if (trainname == "" || cam->opticalTrain() == trainname)
270 cam->focusAdaptiveComplete(success);
271}
272
273QString Capture::filterWheel()
274{
275 if (mainCameraDevices()->filterWheel())
276 return mainCameraDevices()->filterWheel()->getDeviceName();
277
278 return QString();
279}
280
281bool Capture::setFilter(const QString &filter)
282{
283 if (mainCameraDevices()->filterWheel())
284 {
285 mainCamera()->FilterPosCombo->setCurrentText(filter);
286 return true;
287 }
288
289 return false;
290}
291
292QString Capture::filter()
293{
294 return mainCamera()->FilterPosCombo->currentText();
295}
296
297bool Capture::loadSequenceQueue(const QString &fileURL, QString train, bool isLead, QString targetName)
298{
300 if (train == "")
301 cam = mainCamera();
302 else if (isLead)
303 {
304 // take the main camera, and select the train if necessary
305 if (mainCamera()->opticalTrain() != train)
306 mainCamera()->selectOpticalTrain(train);
307
308 cam = mainCamera();
309 }
310 else
311 {
312 // find the camera, create a new one if necessary
313 int pos = findCamera(train, true);
314 if (pos < 0)
315 return false;
316 else
317 cam = camera(pos);
318 }
319 // camera found, load the sequence queue
320 return cam->loadSequenceQueue(fileURL, targetName);
321}
322
323
324void Capture::appendLogText(const QString &text)
325{
326 m_LogText.insert(0, i18nc("log entry; %1 is the date, %2 is the text", "%1 %2",
327 KStarsData::Instance()->lt().toString("yyyy-MM-ddThh:mm:ss"), text));
328
329 qCInfo(KSTARS_EKOS_CAPTURE) << text;
330
331 emit newLog(text);
332}
333
334void Capture::clearLog()
335{
336 m_LogText.clear();
337 emit newLog(QString());
338}
339
340void Capture::setFocusTemperatureDelta(double focusTemperatureDelta, double absTemperture, const QString &trainname)
341{
342 Q_UNUSED(absTemperture);
343 // publish to all known focusers using the same optical train (should be only one)
344 for (auto &cam : cameras())
345 if (trainname == "" || cam->opticalTrain() == trainname)
346 cam->state()->getRefocusState()->setFocusTemperatureDelta(focusTemperatureDelta);
347}
348
349void Capture::setGuideDeviation(double delta_ra, double delta_dec)
350{
351 // forward it to the global state machine
352 moduleState()->setGuideDeviation(delta_ra, delta_dec);
353
354}
355
357{
358 // This function is called independently from the Scheduler or the UI, so honor the change
359 mainCameraState()->setIgnoreJobProgress(true);
360}
361
362void Capture::setCapturedFramesMap(const QString &signature, int count, QString train)
363{
365 if (train == "")
366 cam = mainCamera();
367 else
368 {
369 // find the camera, create a new one if necessary
370 int pos = findCamera(train, true);
371 if (pos < 0)
372 qCWarning(KSTARS_EKOS_CAPTURE) << "Cannot set the captured frames map for train" << train;
373 else
374 cam = camera(pos);
375 }
376 // camera found, set the captured frames map
377 cam->state()->setCapturedFramesCount(signature, count);
378}
379
380void Capture::setAlignStatus(AlignState newstate)
381{
382 // forward it directly to the state machine
383 mainCameraState()->setAlignState(newstate);
384}
385
386void Capture::setGuideStatus(GuideState newstate)
387{
388 // forward to state machine
389 moduleState()->setGuideStatus(newstate);
390}
391
392bool Capture::setVideoLimits(uint16_t maxBufferSize, uint16_t maxPreviewFPS)
393{
394 if (mainCameraDevices()->getActiveCamera() == nullptr)
395 return false;
396
397 return mainCameraDevices()->getActiveCamera()->setStreamLimits(maxBufferSize, maxPreviewFPS);
398}
399
400
401
403{
405 if (train == "")
406 cam = mainCamera();
407 else
408 {
409 // find the camera, create a new one if necessary
410 int pos = findCamera(train, true);
411 if (pos < 0)
412 {
413 qCWarning(KSTARS_EKOS_CAPTURE) << "Cannot start capturing for train" << train;
414 return "";
415 }
416 else
417 cam = camera(pos);
418 }
419 // camera found, start capturing
420 cam->start();
421 // return the real train name
422 return cam->opticalTrain();
423}
424
426{
428 if (train == "")
429 for (auto cam : cameras())
430 cam->abort();
431 else
432 {
433 int pos = findCamera(train, false);
434 if (pos < 0)
435 {
436 qCWarning(KSTARS_EKOS_CAPTURE) << "Cannot abort capturing for train" << train;
437 return;
438 }
439 else
440 cam = camera(pos);
441
442 // camera found, abort capturing
443 cam->abort();
444 }
445}
446
447QSharedPointer<Camera> &Capture::camera(int i)
448{
449 if (i < cameras().count())
450 return moduleState()->mutableCameras()[i];
451 else
452 {
453 qCWarning(KSTARS_EKOS_CAPTURE) << "Unknown camera ID:" << i;
454 return moduleState()->mutableCameras()[0];
455 }
456}
457
458void Ekos::Capture::closeCameraTab(int tabIndex)
459{
460 cameraTabs->removeTab(tabIndex);
461 moduleState()->removeCamera(tabIndex);
462 // select the next one on the left
463 cameraTabs->setCurrentIndex(std::max(0, tabIndex - 1));
464}
465
466void Capture::checkCloseCameraTab(int tabIndex)
467{
468 // ignore close event from the "Add" tab
469 if (tabIndex == cameraTabs->count() - 1)
470 return;
471
472 if (moduleState()->mutableCameras()[tabIndex]->state()->isBusy())
473 {
474 // if accept has been clicked, abort and close the tab
475 connect(KSMessageBox::Instance(), &KSMessageBox::accepted, this, [this, &tabIndex]()
476 {
477 KSMessageBox::Instance()->disconnect(this);
478 moduleState()->mutableCameras()[tabIndex]->abort();
479 closeCameraTab(tabIndex);
480 });
481 // if cancel has been clicked, do not close the tab
482 connect(KSMessageBox::Instance(), &KSMessageBox::rejected, this, [this]()
483 {
484 KSMessageBox::Instance()->disconnect(this);
485 });
486
487 KSMessageBox::Instance()->warningContinueCancel(i18n("Camera %1 is busy. Abort to close?",
488 moduleState()->mutableCameras()[tabIndex]->activeCamera()->getDeviceName()), i18n("Stop capturing"), 30, false,
489 i18n("Abort"));
490 }
491 else
492 {
493 closeCameraTab(tabIndex);
494 }
495}
496
497const QSharedPointer<Camera> Capture::mainCamera() const
498{
499 if (cameras().size() > 0)
500 return moduleState()->cameras()[0];
501 else
502 {
503 QSharedPointer<CaptureModuleState> cms;
504 cms.reset(new CaptureModuleState());
505 // TODO FIXME
506 //return QSharedPointer<Camera>(new Camera(cms));
507 return QSharedPointer<Camera>(new Camera(0));
508 }
509}
510
511int Capture::findCamera(QString train, bool addIfNecessary)
512{
513 for (auto &cam : cameras())
514 {
515 if (cam->opticalTrain() == train)
516 return cam->m_cameraId;
517 }
518
519 // none found
520 if (addIfNecessary)
521 {
522 QSharedPointer<Camera> cam = addCamera();
523 cam->selectOpticalTrain(train);
524 return cam->m_cameraId;
525 }
526 // nothing found
527 return -1;
528}
529
530void Capture::setMountStatus(ISD::Mount::Status newState)
531{
532 switch (newState)
533 {
534 case ISD::Mount::MOUNT_PARKING:
535 case ISD::Mount::MOUNT_SLEWING:
536 case ISD::Mount::MOUNT_MOVING:
537 mainCamera()->previewB->setEnabled(false);
538 mainCamera()->liveVideoB->setEnabled(false);
539 // Only disable when button is "Start", and not "Stopped"
540 // If mount is in motion, Stopped button should always be enabled to terminate
541 // the sequence
542 if (mainCameraState()->isBusy() == false)
543 mainCamera()->startB->setEnabled(false);
544 break;
545
546 default:
547 if (mainCameraState()->isBusy() == false)
548 {
549 mainCamera()->previewB->setEnabled(true);
550 if (mainCameraDevices()->getActiveCamera())
551 mainCamera()->liveVideoB->setEnabled(mainCameraDevices()->getActiveCamera()->hasVideoStream());
552 mainCamera()->startB->setEnabled(true);
553 }
554
555 break;
556 }
557}
558
559void Capture::setAlignResults(double solverPA, double ra, double de, double pixscale)
560{
561 Q_UNUSED(ra)
562 Q_UNUSED(de)
563 Q_UNUSED(pixscale)
564 if (mainCameraDevices()->rotator() && mainCamera()->m_RotatorControlPanel)
565 mainCamera()->m_RotatorControlPanel->refresh(solverPA);
566}
567
568void Capture::setMeridianFlipState(QSharedPointer<MeridianFlipState> newstate)
569{
570 mainCameraState()->setMeridianFlipState(newstate);
571 connect(mainCameraState()->getMeridianFlipState().get(), &MeridianFlipState::newLog, this, &Capture::appendLogText);
572 connect(mainCameraState()->getMeridianFlipState().get(), &MeridianFlipState::newMountMFStatus, moduleState().get(),
573 &CaptureModuleState::updateMFMountState);
574}
575
577{
578 bool result = false;
579 for (auto &cam : cameras())
580 if (cam->process()->hasCoolerControl())
581 result |= cam->process()->hasCoolerControl();
582 return result;
583}
584
586{
587 bool result = true;
588 for (auto &cam : cameras())
589 if (cam->process()->hasCoolerControl())
590 result &= cam->process()->setCoolerControl(enable);
591
592 return result;
593}
594
596{
597 process()->removeDevice(device);
598}
599
600QString Capture::getTargetName()
601{
602 if (activeJob())
603 return activeJob()->getCoreProperty(SequenceJob::SJ_TargetName).toString();
604 else
605 return "";
606}
607
608void Capture::setHFR(double newHFR, int, bool inAutofocus, const QString &trainname)
609{
610 // publish to all known focusers using the same optical train (should be only one)
611 for (auto &cam : cameras())
612 if (trainname == "" || cam->opticalTrain() == trainname)
613 cam->state()->getRefocusState()->setFocusHFR(newHFR, inAutofocus);
614}
615
616void Capture::inSequenceAFRequested(bool requested, const QString &trainname)
617{
618 // publish to all known cameras using the same optical train (should be only one)
619 for (auto &cam : cameras())
620 if (trainname == "" || cam->opticalTrain() == trainname)
621 // set the value directly in the camera's state
622 cam->state()->getRefocusState()->setForceInSeqAF(requested);
623
624 moduleState()->setForceInSeqAF(requested, trainname);
625}
626} // 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:608
bool setVideoLimits(uint16_t maxBufferSize, uint16_t maxPreviewFPS)
setVideoLimits sets the buffer size and max preview fps for live preview
Definition capture.cpp:392
bool setDome(ISD::Dome *device)
setDome Set dome device
Definition capture.cpp:216
void updateCamera(int tabID, bool isValid)
Update the camera.
Definition capture.cpp:191
void inSequenceAFRequested(bool requested, const QString &trainname)
inSequenceAFRequested Focuser informs that the user wishes an AF run as soon as possible.
Definition capture.cpp:616
QSharedPointer< CameraProcess > process() const
process shortcut for the process engine
Definition capture.h:610
void setFocusStatus(FocusState newstate, const QString &trainname)
setFocusStatus Forward the new focus state to the capture module state machine
Definition capture.cpp:257
void setFocusTemperatureDelta(double focusTemperatureDelta, double absTemperature, const QString &trainname)
setFocusTemperatureDelta update the focuser's temperature delta
Definition capture.cpp:340
void setGuideDeviation(double delta_ra, double delta_dec)
setGuideDeviation Set the guiding deviation as measured by the guiding module.
Definition capture.cpp:349
void registerNewModule(const QString &name)
registerNewModule Register an Ekos module as it arrives via DBus and create the appropriate DBus inte...
Definition capture.cpp:221
void focusAdaptiveComplete(bool success, const QString &trainname)
focusAdaptiveComplete Forward the new focus state to the capture module state machine
Definition capture.cpp:265
int findCamera(QString train, bool addIfNecessary)
find the camera using the given train
Definition capture.cpp:511
void removeDevice(const QSharedPointer< ISD::GenericDevice > &device)
Generic method for removing any connected device.
Definition capture.cpp:595
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:576
Q_SCRIPTABLE Q_NOREPLY void abort(QString train="")
DBUS interface function.
Definition capture.cpp:425
Q_SCRIPTABLE Q_NOREPLY void ignoreSequenceHistory()
DBUS interface function.
Definition capture.cpp:356
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:402
Q_SCRIPTABLE Q_NOREPLY void clearAutoFocusHFR(const QString &trainname)
DBUS interface function.
Definition capture.cpp:117
Q_SCRIPTABLE bool loadSequenceQueue(const QString &fileURL, QString train="", bool isLead=true, QString targetName="")
DBUS interface function.
Definition capture.cpp:297
Q_SCRIPTABLE bool setCoolerControl(bool enable)
DBUS interface function.
Definition capture.cpp:585
Q_SCRIPTABLE bool setFilter(const QString &filter)
DBUS interface function.
Definition capture.cpp:281
Q_SCRIPTABLE Q_NOREPLY void setCapturedFramesMap(const QString &signature, int count, QString train="")
DBUS interface function.
Definition capture.cpp:362
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 &)
void setWindowFlags(Qt::WindowFlags type)
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Feb 21 2025 11:54:27 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.