Kstars

capture.h
1/*
2 SPDX-FileCopyrightText: 2012 Jasem Mutlaq <mutlaqja@ikarustech.com>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#pragma once
8
9#include "ui_capture.h"
10
11#include "sequencejob.h"
12#include "ekos/manager/meridianflipstate.h"
13#include "customproperties.h"
14#include "ekos/ekos.h"
15#include "ekos/focus/focusutils.h"
16#include "indi/indicamera.h"
17#include "indi/indidustcap.h"
18#include "indi/indidome.h"
19#include "indi/indilightbox.h"
20#include "indi/indimount.h"
21#include "ui_limits.h"
22#include "ui_calibrationoptions.h"
23
24#include <QTimer>
25#include <QUrl>
26#include <QDBusInterface>
27
28#include <memory>
29
30class DSLRInfo;
33class KDirWatch;
34class RotatorSettings;
35
36/**
37 * @namespace Ekos
38 * @short Ekos is an advanced Astrophotography tool for Linux.
39 * It is based on a modular extensible framework to perform common astrophotography tasks. This includes highly accurate GOTOs using astrometry solver, ability to measure and correct polar alignment errors ,
40 * auto-focus & auto-guide capabilities, and capture of single or stack of images with filter wheel support.\n
41 * Features:
42 * - Control your telescope, CCD (& DSLRs), filter wheel, focuser, guider, adaptive optics unit, and any INDI-compatible auxiliary device from Ekos.
43 * - Extremely accurate GOTOs using astrometry.net solver (both Online and Offline solvers supported).
44 * - Load & Slew: Load a FITS image, slew to solved coordinates, and center the mount on the exact image coordinates in order to get the same desired frame.
45 * - Measure & Correct Polar Alignment errors using astrometry.net solver.
46 * - Auto and manual focus modes using Half-Flux-Radius (HFR) method.
47 * - Automated unattended meridian flip. Ekos performs post meridian flip alignment, calibration, and guiding to resume the capture session.
48 * - Automatic focus between exposures when a user-configurable HFR limit is exceeded.
49 * - Automatic focus between exposures when the temperature has changed a lot since last focus.
50 * - Auto guiding with support for automatic dithering between exposures and support for Adaptive Optics devices in addition to traditional guiders.
51 * - Powerful sequence queue for batch capture of images with optional prefixes, timestamps, filter wheel selection, and much more!
52 * - Export and import sequence queue sets as Ekos Sequence Queue (.esq) files.
53 * - Center the telescope anywhere in a captured FITS image or any FITS with World Coordinate System (WCS) header.
54 * - Automatic flat field capture, just set the desired ADU and let Ekos does the rest!
55 * - Automatic abort and resumption of exposure tasks if guiding errors exceed a user-configurable value.
56 * - Support for dome slaving.
57 * - Complete integration with KStars Observation Planner and SkyMap
58 * - Integrate with all INDI native devices.
59 * - Powerful scripting capabilities via \ref EkosDBusInterface "DBus."
60 *
61 * The primary class is Ekos::Manager. It handles startup and shutdown of local and remote INDI devices, manages and orchesterates the various Ekos modules, and provides advanced DBus
62 * interface to enable unattended scripting.
63 *
64 * @author Jasem Mutlaq
65 * @version 1.9
66 */
67namespace Ekos
68{
69
70class CaptureDeviceAdaptor;
71class CaptureModuleState;
72class CaptureProcess;
73class ScriptsManager;
74
75/**
76 *@class Capture
77 *@short Captures single or sequence of images from a CCD.
78 * The capture class support capturing single or multiple images from a CCD, it provides a
79 * powerful sequence queue with filter selection. Any sequence queue can be saved as
80 * Ekos Sequence Queue (.esq). All image capture operations are saved as Sequence Jobs
81 * that encapsulate all the different options in a capture process. The user may select in
82 * sequence autofocusing by setting limits for HFR, execution time or temperature delta. When the limit
83 * is exceeded, it automatically trigger autofocus operation. The capture process can also be
84 * linked with guide module. If guiding deviations exceed a certain threshold, the capture operation aborts until
85 * the guiding deviation resume to acceptable levels and the capture operation is resumed.
86 *
87 * Controlling the capturing execution is a complex process, that is controlled by
88 * these classes:
89 * - this class, that controll the UI and is the interface for all DBUS functions
90 * - {@see CaptureModuleState} holds all state informations
91 * - {@see CaptureProcess} holds the business logic that controls the process
92 * For ore details about the capturing execution process, please visit {@see CaptureProcess}.
93 *
94 *@author Jasem Mutlaq
95 *@version 1.4
96 */
97class Capture : public QWidget, public Ui::Capture
98{
100 Q_CLASSINFO("D-Bus Interface", "org.kde.kstars.Ekos.Capture")
101 Q_PROPERTY(Ekos::CaptureState status READ status NOTIFY newStatus)
102 Q_PROPERTY(QString targetName READ getTargetName WRITE setTargetName)
103 Q_PROPERTY(QString observerName READ getObserverName WRITE setObserverName)
104 Q_PROPERTY(QString opticalTrain READ opticalTrain WRITE setOpticalTrain)
105 Q_PROPERTY(QString camera READ camera)
106 Q_PROPERTY(QString filterWheel READ filterWheel)
107 Q_PROPERTY(QString filter READ filter WRITE setFilter)
109 Q_PROPERTY(QStringList logText READ logText NOTIFY newLog)
110
111 public:
112 typedef enum
113 {
114 NOT_PREVIEW,
115 LOCAL_PREVIEW,
116 REMOTE_PREVIEW
117 } FilenamePreviewType;
118
119 Capture(bool standAlone = false);
120 ~Capture();
121
122 /** @defgroup CaptureDBusInterface Ekos DBus Interface - Capture Module
123 * Ekos::Capture interface provides advanced scripting capabilities to capture image sequences.
124 * @{
125 */
126
127
128 /** DBUS interface function.
129 * select the CCD device from the available CCD drivers.
130 * @param device The CCD device name
131 */
133
134 /** DBUS interface function.
135 * select the filter device from the available filter drivers. The filter device can be the same as the CCD driver if the filter functionality was embedded within the driver.
136 * @param device The filter device name
137 */
139
140 /** DBUS interface function.
141 * select the filter name from the available filters in case a filter device is active.
142 * @param filter The filter name
143 */
144 Q_SCRIPTABLE bool setFilter(const QString &filter);
145 Q_SCRIPTABLE QString filter();
146
147 /** DBUS interface function.
148 * Aborts any current jobs and remove all sequence queue jobs.
149 */
150 Q_SCRIPTABLE Q_NOREPLY void clearSequenceQueue();
151
152 /** DBUS interface function.
153 * Returns the overall sequence queue status. If there are no jobs pending, it returns "Invalid". If all jobs are idle, it returns "Idle". If all jobs are complete, it returns "Complete". If one or more jobs are aborted
154 * it returns "Aborted" unless it was temporarily aborted due to guiding deviations, then it would return "Suspended". If one or more jobs have errors, it returns "Error". If any jobs is under progress, returns "Running".
155 */
157 {
158 return state()->sequenceQueueStatus();
159 }
160
161 /** DBUS interface function.
162 * Loads the Ekos Sequence Queue file in the Sequence Queue. Jobs are appended to existing jobs.
163 * @param fileURL full URL of the filename
164 * @param targetName override the target in the sequence queue file (necessary for using the target of the scheduler)
165 */
166 Q_SCRIPTABLE bool loadSequenceQueue(const QString &fileURL, QString targetName = "");
167
168 /** DBUS interface function.
169 * Saves the Sequence Queue to the Ekos Sequence Queue file.
170 * @param fileURL full URL of the filename
171 */
172 Q_SCRIPTABLE bool saveSequenceQueue(const QString &path);
173
174 /** DBUS interface function.
175 * Enables or disables the maximum guiding deviation and sets its value.
176 * @param enable If true, enable the guiding deviation check, otherwise, disable it.
177 * @param value if enable is true, it sets the maximum guiding deviation in arcsecs. If the value is exceeded, the capture operation is aborted until the value falls below the value threshold.
178 */
179 Q_SCRIPTABLE Q_NOREPLY void setMaximumGuidingDeviation(bool enable, double value);
180
181 /** DBUS interface function.
182 * Enables or disables the in sequence focus and sets Half-Flux-Radius (HFR) limit.
183 * @param enable If true, enable the in sequence auto focus check, otherwise, disable it.
184 * @param HFR if enable is true, it sets HFR in pixels. After each exposure, the HFR is re-measured and if it exceeds the specified value, an autofocus operation will be commanded.
185 */
186 Q_SCRIPTABLE Q_NOREPLY void setInSequenceFocus(bool enable, double HFR);
187
188 /** DBUS interface function.
189 * Does the CCD has a cooler control (On/Off) ?
190 */
192
193 /** DBUS interface function.
194 * Set the CCD cooler ON/OFF
195 *
196 */
197 Q_SCRIPTABLE bool setCoolerControl(bool enable);
198
199 /** DBUS interface function.
200 * @return Returns the percentage of completed captures in all active jobs
201 */
203 {
204 return state()->progressPercentage();
205 }
206
207 /** DBUS interface function.
208 * @return Returns the number of jobs in the sequence queue.
209 */
211 {
212 return state()->allJobs().count();
213 }
214
215 /** DBUS interface function.
216 * @return Returns the number of pending uncompleted jobs in the sequence queue.
217 */
219 {
220 return state()->pendingJobCount();
221 }
222
223 /** DBUS interface function.
224 * @return Returns ID of current active job if any, or -1 if there are no active jobs.
225 */
227 {
228 return state()->activeJobID();
229 }
230
231 /** DBUS interface function.
232 * @return Returns time left in seconds until active job is estimated to be complete.
233 */
235 {
236 return state()->activeJobRemainingTime();
237 }
238
239 /** DBUS interface function.
240 * @return Returns overall time left in seconds until all jobs are estimated to be complete
241 */
243 {
244 return state()->overallRemainingTime();
245 }
246
247 /** DBUS interface function.
248 * @param id job number. Job IDs start from 0 to N-1.
249 * @return Returns the job state (Idle, In Progress, Error, Aborted, Complete)
250 */
252 {
253 return state()->jobState(id);
254 }
255
256 /** DBUS interface function.
257 * @param id job number. Job IDs start from 0 to N-1.
258 * @return Returns the job filter name.
259 */
261 {
262 return state()->jobFilterName(id);
263 }
264
265 /** DBUS interface function.
266 * @param id job number. Job IDs start from 0 to N-1.
267 * @return Returns The number of images completed capture in the job.
268 */
270 {
271 return state()->jobImageProgress(id);
272 }
273
274 /** DBUS interface function.
275 * @param id job number. Job IDs start from 0 to N-1.
276 * @return Returns the total number of images to capture in the job.
277 */
279 {
280 return state()->jobImageCount(id);
281 }
282
283 /** DBUS interface function.
284 * @param id job number. Job IDs start from 0 to N-1.
285 * @return Returns the number of seconds left in an exposure operation.
286 */
288 {
289 return state()->jobExposureProgress(id);
290 }
291
292 /** DBUS interface function.
293 * @param id job number. Job IDs start from 0 to N-1.
294 * @return Returns the total requested exposure duration in the job.
295 */
297 {
298 return state()->jobExposureDuration(id);
299 }
300
301 /** DBUS interface function.
302 * @param id job number. Job IDs start from 0 to N-1.
303 * @return Returns the frame type (light, dark, ...) of the job.
304 */
305 Q_SCRIPTABLE CCDFrameType getJobFrameType(int id)
306 {
307 return state()->jobFrameType(id);
308 }
309
310 /** DBUS interface function.
311 * Clear in-sequence focus settings. It sets the autofocus HFR to zero so that next autofocus value is remembered for the in-sequence focusing.
312 */
313 Q_SCRIPTABLE Q_NOREPLY void clearAutoFocusHFR();
314
315 /** DBUS interface function.
316 * Jobs will NOT be checked for progress against the file system and will be always assumed as new jobs.
317 */
318 Q_SCRIPTABLE Q_NOREPLY void ignoreSequenceHistory();
319
320 /** DBUS interface function.
321 * Set count of already completed frames. This is required when we have identical external jobs
322 * with identical paths, but we need to continue where we left off. For example, if we have 3 identical
323 * jobs, each capturing 5 images. Let's suppose 9 images were captured before. If the count for this signature
324 * is set to 1, then we continue to capture frame #2 even though the number of completed images is already
325 * larger than required count (5). It is mostly used in conjunction with Ekos Scheduler.
326 */
327 Q_SCRIPTABLE Q_NOREPLY void setCapturedFramesMap(const QString &signature, int count)
328 {
329 state()->setCapturedFramesCount(signature, static_cast<ushort>(count));
330 };
331
332
333 /** DBUS interface function.
334 * List of logging entries for the capture module.
335 */
337 {
338 return m_LogText;
339 }
340
341 /** DBUS interface function.
342 * Single text string holding all log lines for the capture module.
343 */
345 {
346 return m_LogText.join("\n");
347 }
348
349 /** DBUS interface function.
350 * Status of the capture module
351 */
353 {
354 return state()->getCaptureState();
355 }
356 /** @} end of group CaptureDBusInterface */
357
358
359 // ////////////////////////////////////////////////////////////////////
360 // Changing the devices used by Capture
361 // ////////////////////////////////////////////////////////////////////
362
363 /**
364 * @brief Add new Camera
365 * @param device pointer to camera device.
366 * @return True if added successfully, false if duplicate or failed to add.
367 */
368 bool updateCamera();
369
370 /**
371 * @brief Add new Filter Wheel
372 * @param name device name of the new filter wheel
373 */
374 void setFilterWheel(QString name);
375
376 /**
377 * @brief Add new Rotator
378 * @param name name of the new rotator
379 */
380 void setRotator(QString name);
381
382 /**
383 * @brief setDome Set dome device
384 * @param device pointer to dome device
385 * @return true if successfull, false otherewise.
386 */
387 bool setDome(ISD::Dome *device);
388
389 /**
390 * @brief Generic method for removing any connected device.
391 */
393
394 /**
395 * @brief registerNewModule Register an Ekos module as it arrives via DBus
396 * and create the appropriate DBus interface to communicate with it.
397 * @param name of module
398 */
399 void registerNewModule(const QString &name);
400
401 // ////////////////////////////////////////////////////////////////////
402 // Synchronize UI with device parameters
403 // ////////////////////////////////////////////////////////////////////
404
405 void syncFrameType(const QString &name);
406 void syncCameraInfo();
407
408 // ////////////////////////////////////////////////////////////////////
409 // Optical Train handling
410 // ////////////////////////////////////////////////////////////////////
411 void setupOpticalTrainManager();
412 void refreshOpticalTrain();
413
414 QString opticalTrain() const
415 {
416 return opticalTrainCombo->currentText();
417 }
418 void setOpticalTrain(const QString &value)
419 {
420 opticalTrainCombo->setCurrentText(value);
421 }
422
423 // ////////////////////////////////////////////////////////////////////
424 // Rotator
425 // ////////////////////////////////////////////////////////////////////
426 const QSharedPointer<RotatorSettings> &RotatorControl() const
427 {
428 return m_RotatorControlPanel;
429 }
430
431 // ////////////////////////////////////////////////////////////////////
432 // Filter Manager and filters
433 // ////////////////////////////////////////////////////////////////////
434 void setupFilterManager();
435
436 const QSharedPointer<FilterManager> &filterManager() const
437 {
438 return m_FilterManager;
439 }
440
441 /**
442 * @brief checkFilter Refreshes the filter wheel information in the capture module.
443 */
445
446 /**
447 * @brief shortcut for updating the current filter information for the state machine
448 */
450
451 // ////////////////////////////////////////////////////////////////////
452 // Read and write access for EkosLive
453 // ////////////////////////////////////////////////////////////////////
454
455 /**
456 * @brief getSequence Return the JSON representation of the current sequeue queue
457 * @return Reference to JSON array containing sequence queue jobs.
458 */
459 const QJsonArray &getSequence() const
460 {
461 return state()->getSequence();
462 }
463
464 /**
465 * @brief setVideoLimits sets the buffer size and max preview fps for live preview
466 * @param maxBufferSize in bytes
467 * @param maxPreviewFPS number of frames per second
468 * @return True if value is updated, false otherwise.
469 */
470 bool setVideoLimits(uint16_t maxBufferSize, uint16_t maxPreviewFPS);
471
472 // ////////////////////////////////////////////////////////////////////
473 // DSLR handling
474 // ////////////////////////////////////////////////////////////////////
475
476 /**
477 * @brief addDSLRInfo Save DSLR Info the in the database. If the interactive dialog was open, close it.
478 * @param model Camera name
479 * @param maxW Maximum width in pixels
480 * @param maxH Maximum height in pixels
481 * @param pixelW Pixel horizontal size in microns
482 * @param pixelH Pizel vertical size in microns
483 */
484 void addDSLRInfo(const QString &model, uint32_t maxW, uint32_t maxH, double pixelW, double pixelH);
485
486 void openExposureCalculatorDialog();
487
488 void onStandAloneShow(QShowEvent* event);
489
490 // ////////////////////////////////////////////////////////////////////
491 // Settings
492 // ////////////////////////////////////////////////////////////////////
493 QVariantMap getAllSettings() const;
494 void setAllSettings(const QVariantMap &settings);
495
496 QSharedPointer<CaptureDeviceAdaptor> m_captureDeviceAdaptor;
497
498 public slots:
499 // ////////////////////////////////////////////////////////////////////
500 // Main capturing actions
501 // ////////////////////////////////////////////////////////////////////
502
503 /** \addtogroup CaptureDBusInterface
504 * @{
505 */
506
507 /** DBUS interface function.
508 * @brief Start the execution of the Capture::SequenceJob list #jobs.
509 *
510 * Starting the execution of the Capture::SequenceJob list selects the first job
511 * from the list that may be executed and starts to prepare the job (@see prepareJob()).
512 *
513 * Several factors determine, which of the jobs will be selected:
514 * - First, the list is searched to find the first job that is marked as idle or aborted.
515 * - If none is found, it is checked whether ignoring job progress is set. If yes,
516 * all jobs are are reset (@see reset()) and the first one from the list is selected.
517 * If no, the user is asked whether the jobs should be reset. If the user declines,
518 * starting is aborted.
519 */
520 Q_SCRIPTABLE Q_NOREPLY void start();
521
522 /** DBUS interface function.
523 * Stops currently running jobs:
524 * CAPTURE_IDLE: capture in idle state waiting for further action (e.g. single sequence
525 * is complete, next one starting)
526 * CAPTURE_COMPLETE: all capture sequences are complete
527 * CAPTURE_ABORT: capture aborted either by user interaction or by a technical error
528 * CAPTURE_SUSPEND: capture suspended and waiting to be restarted
529 * @param targetState status of the job after stop
530 */
531 Q_SCRIPTABLE Q_NOREPLY void stop(CaptureState targetState = CAPTURE_IDLE);
532
533 /** DBUS interface function.
534 * Aborts all jobs and mark current state as ABORTED. It simply calls stop(CAPTURE_ABORTED)
535 */
536 Q_SCRIPTABLE Q_NOREPLY void abort()
537 {
539 }
540
541 /** DBUS interface function.
542 * Aborts all jobs and mark current state as SUSPENDED. It simply calls stop(CAPTURE_SUSPENDED)
543 * The only difference between SUSPENDED and ABORTED it that capture module can automatically resume a suspended
544 * state on its own without external trigger once the right conditions are met. When whatever reason caused the module
545 * to go into suspended state ceases to exist, the capture module automatically resumes. On the other hand, ABORTED state
546 * must be started via an external programmatic or user trigger (e.g. click the start button again).
547 */
548 Q_SCRIPTABLE Q_NOREPLY void suspend()
549 {
551 }
552 /** DBUS interface function.
553 * @brief pause Pauses the Sequence Queue progress AFTER the current capture is complete.
554 */
555 Q_SCRIPTABLE Q_NOREPLY void pause();
556
557 /** DBUS interface function.
558 * @brief toggleSequence Toggle sequence state depending on its current state.
559 * 1. If paused, then resume sequence.
560 * 2. If idle or completed, then start sequence.
561 * 3. Otherwise, abort current sequence.
562 */
563 Q_SCRIPTABLE Q_NOREPLY void toggleSequence();
564
565
566 /** DBUS interface function.
567 * Toggle video streaming if supported by the device.
568 * @param enabled Set to true to start video streaming, false to stop it if active.
569 */
570 Q_SCRIPTABLE Q_NOREPLY void toggleVideo(bool enabled);
571
572
573 /** DBus interface function
574 * @brief restartCamera Restarts the INDI driver associated with a camera. Remote and Local drivers are supported.
575 * @param name Name of camera to restart. If a driver defined multiple cameras, they would be removed and added again
576 * after driver restart.
577 */
578 Q_SCRIPTABLE Q_NOREPLY void restartCamera(const QString &name);
579
580 /** DBus interface function
581 * @brief Set the name of the target to be captured.
582 */
583 Q_SCRIPTABLE Q_NOREPLY void setTargetName(const QString &newTargetName);
584
585 Q_SCRIPTABLE QString getTargetName();
586
587 /** DBus interface function
588 * @brief Set the observer name.
589 */
590 Q_SCRIPTABLE Q_NOREPLY void setObserverName(const QString &value)
591 {
592 state()->setObserverName(value);
593 };
594 Q_SCRIPTABLE QString getObserverName()
595 {
596 return state()->observerName();
597 }
598
599
600 /** @}*/
601
602 /**
603 * @brief process shortcut for the process engine
604 */
606 {
607 return m_captureProcess;
608 }
609
610 // ////////////////////////////////////////////////////////////////////
611 // Capture actions
612 // ////////////////////////////////////////////////////////////////////
613 /**
614 * @brief captureStarted Change the UI after the capturing process
615 * has been started.
616 */
617 void jobStarting();
618 /**
619 * @brief capturePreview Capture a single preview image
620 */
621 void capturePreview();
622
623 /**
624 * @brief startFraming Like captureOne but repeating.
625 */
626 void startFraming();
627
628 /**
629 * @brief generateDarkFlats Generate a list of dark flat jobs from available flat frames.
630 */
631 void generateDarkFlats();
632
633 /**
634 * @brief updateJobFromUI Update all job attributes from the UI settings.
635 */
636 void updateJobFromUI(SequenceJob *job, FilenamePreviewType filenamePreview = NOT_PREVIEW);
637
638 /**
639 * @brief addJob Add a new job to the UI. This is used when a job is loaded from a capture sequence file. In
640 * contrast to {@see #createJob()}, the job's attributes are taken from the file and only the UI gehts updated.
641 */
642 void addJob(SequenceJob *job);
643
644 /**
645 * @brief createJob Create a new job with the settings given in the GUI.
646 * @param jobtype batch, preview, looping or dark flat job.
647 * @param filenamePreview if the job is to generate a preview filename
648 * @return pointer to job created or nullptr otherwise.
649 */
650 SequenceJob *createJob(SequenceJob::SequenceJobType jobtype = SequenceJob::JOBTYPE_BATCH,
651 FilenamePreviewType filenamePreview = NOT_PREVIEW);
652
653 /**
654 * @brief jobEditFinished Editing of an existing job finished, update its
655 * attributes from the UI settings. The job under edit is taken from the
656 * selection in the job table.
657 * @return true if job updated succeeded.
658 */
659 void editJobFinished();
660
661 // ////////////////////////////////////////////////////////////////////
662 // public capture settings
663 // ////////////////////////////////////////////////////////////////////
664 /**
665 * @brief seqCount Set required number of images to capture in one sequence job
666 * @param count number of images to capture
667 */
668 void setCount(uint16_t count)
669 {
670 captureCountN->setValue(count);
671 }
672
673 /**
674 * @brief setDelay Set delay between capturing images within a sequence in seconds
675 * @param delay numbers of seconds to wait before starting the next image.
676 */
677 void setDelay(uint16_t delay)
678 {
679 captureDelayN->setValue(delay);
680 }
681
682 /**
683 * @brief Slot receiving the update of the current target distance.
684 * @param targetDiff distance to the target in arcseconds.
685 */
686 void updateTargetDistance(double targetDiff);
687
688 /**
689 * @brief checkCamera Refreshes the CCD information in the capture module.
690 */
692
693 /**
694 * @brief processCCDNumber Process number properties arriving from CCD. Currently, only CCD and Guider frames are processed.
695 * @param nvp pointer to number property.
696 */
697 void processCameraNumber(INDI::Property prop);
698
699
700 /**
701 * @brief removeJob Remove a job sequence from the queue
702 * @param index Row index for job to remove, if left as -1 (default), the currently selected row will be removed.
703 * if no row is selected, the last job shall be removed.
704 * @param true if sequence is removed. False otherwise.
705 */
706 bool removeJob(int index = -1);
707
708 /**
709 * @brief MeridianFlipState Access to the meridian flip state machine
710 */
712 {
713 return state()->getMeridianFlipState();
714 }
715 void setMeridianFlipState(QSharedPointer<MeridianFlipState> newstate);
716
717 // ////////////////////////////////////////////////////////////////////
718 // UI controls
719 // ////////////////////////////////////////////////////////////////////
720
721 void removeJobFromQueue();
722
723 /**
724 * @brief moveJobUp Move the job in the sequence queue one place up or down.
725 */
726 void moveJob(bool up);
727
728 /**
729 * @brief setTemperature Set the target CCD temperature in the GUI settings.
730 */
731 void setTargetTemperature(double temperature)
732 {
733 cameraTemperatureN->setValue(temperature);
734 }
735
736 void setForceTemperature(bool enabled)
737 {
738 cameraTemperatureS->setChecked(enabled);
739 }
740
741 /**
742 * @brief updateTargetName React upon a new capture target name
743 */
744 void newTargetName(const QString &name);
745
746 /**
747 * @brief showTemperatureRegulation Toggle temperature regulation dialog which sets temperature ramp and threshold
748 */
750
751 /**
752 * @brief updateStartButtons Update the start and the pause button to new states of capturing
753 * @param start start capturing
754 * @param pause pause capturing
755 */
756 void updateStartButtons(bool start, bool pause = false);
757
758 // Clear Camera Configuration
759 void clearCameraConfiguration();
760
761 // ////////////////////////////////////////////////////////////////////
762 // slots handling device and module events
763 // ////////////////////////////////////////////////////////////////////
764
765 /**
766 * @brief captureStarted Manage the result when capturing has been started
767 */
768 void captureRunning();
769
770 /**
771 * @brief setGuideDeviation Set the guiding deviation as measured by the guiding module. Abort capture
772 * if deviation exceeds user value. Resume capture if capture was aborted and guiding
773 * deviations are below user value.
774 * @param delta_ra Deviation in RA in arcsecs from the selected guide star.
775 * @param delta_dec Deviation in DEC in arcsecs from the selected guide star.
776 */
777 void setGuideDeviation(double delta_ra, double delta_dec);
778
779 void setGuideChip(ISD::CameraChip *guideChip);
780
781 /**
782 * @brief updateCCDTemperature Update CCD temperature in capture module.
783 * @param value Temperature in celcius.
784 */
785 void updateCCDTemperature(double value);
786
787 // Auto Focus
788 /**
789 * @brief setFocusStatus Forward the new focus state to the capture module state machine
790 */
791 void setFocusStatus(FocusState newstate);
792
793 /**
794 * @brief updateFocusStatus Handle new focus state
795 */
796 void updateFocusStatus(FocusState newstate);
797
798 // Adaptive Focus
799 /**
800 * @brief focusAdaptiveComplete Forward the new focus state to the capture module state machine
801 */
802 void focusAdaptiveComplete(bool success)
803 {
804 // directly forward it to the state machine
805 state()->updateAdaptiveFocusState(success);
806 }
807
808 /**
809 * @brief updateAdaptiveFocusStatus Handle new focus state
810 */
811
813
814 /**
815 * @brief setHFR Receive the measured HFR value of the latest frame
816 */
817 void setHFR(double newHFR, int position, bool inAutofocus);
818
819 // Filter
820 void setFilterStatus(FilterState filterState);
821
822 // Guide
823 void setGuideStatus(GuideState newstate);
824
825 // Align
826
827 void setAlignStatus(Ekos::AlignState newstate);
828 void setAlignResults(double solverPA, double ra, double de, double pixscale);
829
830 // Update Mount module status
831 void setMountStatus(ISD::Mount::Status newState);
832
833 // ////////////////////////////////////////////////////////////////////
834 // Module logging
835 // ////////////////////////////////////////////////////////////////////
836 Q_SCRIPTABLE void clearLog();
837 void appendLogText(const QString &);
838
839
840 private slots:
841
842 // ////////////////////////////////////////////////////////////////////
843 // UI controls
844 // ////////////////////////////////////////////////////////////////////
845 void checkFrameType(int index);
846 void updateCaptureCountDown(int deltaMillis);
847 void saveFITSDirectory();
848
849 // Sequence Queue
850 void loadSequenceQueue();
851 void saveSequenceQueue();
852 void saveSequenceQueueAs();
853
854 // Jobs
855 void resetJobs();
856 bool selectJob(QModelIndex i);
857 void editJob(QModelIndex i);
858 void resetJobEdit(bool cancelled = false);
859
860 // Observer
861 void showObserverDialog();
862
863 // Cooler
864 void setCoolerToggled(bool enabled);
865
866 // ////////////////////////////////////////////////////////////////////
867 // slots handling device and module events
868 // ////////////////////////////////////////////////////////////////////
869
870 // Script Manager
871 void handleScriptsManager();
872
873 void setVideoStreamEnabled(bool enabled);
874
875 /**
876 * @brief Listen to device property changes (temperature, rotator) that are triggered by
877 * SequenceJob.
878 */
879 void updatePrepareState(CaptureState prepareState);
880
881 // Rotator
882 void updateRotatorAngle(double value);
883 void setRotatorReversed(bool toggled);
884
885 /**
886 * @brief setDownloadProgress update the Capture Module and Summary
887 * Screen's estimate of how much time is left in the download
888 */
889 void updateDownloadProgress(double downloadTimeLeft);
890
891 signals:
892 Q_SCRIPTABLE void newLog(const QString &text);
893 Q_SCRIPTABLE void meridianFlipStarted();
894 Q_SCRIPTABLE void guideAfterMeridianFlip();
895 Q_SCRIPTABLE void newStatus(CaptureState status);
896 Q_SCRIPTABLE void captureComplete(const QVariantMap &metadata);
897
898 void newFilterStatus(FilterState state);
899
900 void ready();
901
902 // communication with other modules
903 void checkFocus(double);
904 void runAutoFocus(AutofocusReason autofocusReason, const QString &reasonInfo);
905 void resetFocus();
906 void abortFocus();
907 void adaptiveFocus();
908 void suspendGuiding();
909 void resumeGuiding();
910 void captureTarget(QString targetName);
911 void newImage(SequenceJob *job, const QSharedPointer<FITSData> &data);
912 void newExposureProgress(SequenceJob *job);
913 void newDownloadProgress(double);
914 void sequenceChanged(const QJsonArray &sequence);
915 void settingsUpdated(const QVariantMap &settings);
916 void newLocalPreview(const QString &preview);
917 void dslrInfoRequested(const QString &cameraName);
918 void driverTimedout(const QString &deviceName);
919
920 // Signals for the Analyze tab.
921 void captureStarting(double exposureSeconds, const QString &filter);
922 void captureAborted(double exposureSeconds);
923
924 // Filter Manager
925 void filterManagerUpdated(ISD::FilterWheel *device);
926
927 void trainChanged();
928
929
930 private:
931 // ////////////////////////////////////////////////////////////////////
932 // capture process steps
933 // ////////////////////////////////////////////////////////////////////
934 /**
935 * @brief captureImageStarted Image capturing for the active job has started.
936 */
937 void captureImageStarted();
938
939 /**
940 * @brief jobPreparationStarted Preparation actions for the current active job have beenstarted.
941 */
942 void jobExecutionPreparationStarted();
943
944 /**
945 * @brief jobPrepared Select the job that is currently in preparation.
946 */
947 void jobPrepared(SequenceJob *job);
948
949 /**
950 * @brief imageCapturingCompleted Capturing a single frame completed
951 */
952 void imageCapturingCompleted();
953
954 /**
955 * @brief captureStopped Capturing has stopped
956 */
957 void captureStopped();
958
959 /**
960 * @brief processFITSfinished processing new FITS data received from camera finished.
961 * @param success true iff processing was successful
962 */
963 void processingFITSfinished(bool success);
964
965 // Propagate meridian flip state changes to the UI
966 void updateMeridianFlipStage(MeridianFlipState::MFStage stage);
967
968 // ////////////////////////////////////////////////////////////////////
969 // Job table handling
970 // ////////////////////////////////////////////////////////////////////
971
972
973 /**
974 * @brief updateJobTable Update the table row values for the given sequence job. If the job
975 * is null, all rows will be updated
976 * @param job as identifier for the row
977 * @param full if false, then only the status and the counter will be updated.
978 */
979 void updateJobTable(SequenceJob *job, bool full = false);
980
981
982 /**
983 * @brief Update the style of the job's row, depending on the job's state
984 */
985 void updateRowStyle(SequenceJob *job);
986
987 /**
988 * @brief updateCellStyle Update the cell's style. If active is true, set a bold and italic font and
989 * a regular font otherwise.
990 */
991 void updateCellStyle(QTableWidgetItem *cell, bool active);
992
993 /**
994 * @brief updateJobTableCountCell Update the job counter in the job table of a sigle job
995 */
996 void updateJobTableCountCell(SequenceJob *job, QTableWidgetItem *countCell);
997
998 // ////////////////////////////////////////////////////////////////////
999 // helper functions
1000 // ////////////////////////////////////////////////////////////////////
1001 // check if the upload paths are filled correctly
1002 bool checkUploadPaths(FilenamePreviewType filenamePreview);
1003
1004 // create a new row in the job table and fill it with the given job's values
1005 void createNewJobTableRow(SequenceJob *job);
1006
1007 // Create a Json job from the current job table row
1008 QJsonObject createJsonJob(SequenceJob *job, int currentRow);
1009
1010 // shortcut for the module state
1012 {
1013 return m_captureModuleState;
1014 }
1015 // shortcut to device adapter
1017 {
1018 return m_captureDeviceAdaptor;
1019 }
1020 // shortcut for the active job
1021 SequenceJob *activeJob() const
1022 {
1023 return state()->getActiveJob();
1024 }
1025 // Shortcut to the active camera held in the device adaptor
1026 ISD::Camera *activeCamera();
1027
1028 // Filename preview
1029 void generatePreviewFilename();
1030 QString previewFilename(FilenamePreviewType = LOCAL_PREVIEW);
1031
1032 void setBusy(bool enable);
1033
1034 /* Capture */
1035 void createDSLRDialog();
1036
1037 void resetFrameToZero();
1038
1039 /**
1040 * @brief Sync refocus options to the GUI settings
1041 */
1042 //void syncRefocusOptionsFromGUI();
1043
1044 /**
1045 * @brief currentScope Retrieve the scope parameters from the optical train.
1046 */
1047 QJsonObject currentScope();
1048
1049 /**
1050 * @brief currentReducer Retrieve the reducer parameters from the optical train.
1051 */
1052 double currentReducer();
1053
1054 /**
1055 * @brief currentAperture Determine the current aperture
1056 * @return
1057 */
1058 double currentAperture();
1059
1060 // ////////////////////////////////////////////////////////////////////
1061 // UI controls
1062 // ////////////////////////////////////////////////////////////////////
1063 /**
1064 * @brief setBinning Set binning
1065 * @param horBin Horizontal binning
1066 * @param verBin Vertical binning
1067 */
1068 void setBinning(int horBin, int verBin)
1069 {
1070 captureBinHN->setValue(horBin);
1071 captureBinVN->setValue(verBin);
1072 }
1073
1074 /**
1075 * @brief setISO Set index of ISO list.
1076 * @param index index of ISO list.
1077 */
1078 void setISO(int index)
1079 {
1080 captureISOS->setCurrentIndex(index);
1081 }
1082
1083 // reset = 0 --> Do not reset
1084 // reset = 1 --> Full reset
1085 // reset = 2 --> Only update limits if needed
1086 void updateFrameProperties(int reset = 0);
1087
1088 /**
1089 * @brief updateCaptureFormats Update encoding and transfer formats
1090 */
1091 void updateCaptureFormats();
1092
1093 /**
1094 * @brief updateHFRCheckAlgo Update the in-sequence HFR check algorithm
1095 */
1096 void updateHFRCheckAlgo();
1097
1098 /**
1099 * @brief syncGUIToJob Update UI to job settings
1100 */
1101 void syncGUIToJob(SequenceJob *job);
1102 /**
1103 * @brief syncLimitSettings Update Limits UI from Options
1104 */
1105 void syncLimitSettings();
1106
1107 // DSLR Info
1108 void cullToDSLRLimits();
1109 //void syncDriverToDSLRLimits();
1110
1111 // selection of a job
1112 void selectedJobChanged(QModelIndex current, QModelIndex previous);
1113
1114 // Change filter name in INDI
1115 void editFilterName();
1116 bool editFilterNameInternal(const QStringList &labels, QStringList &newLabels);
1117
1118 /**
1119 * @brief syncControl Sync setting to widget. The value depends on the widget type.
1120 * @param settings Map of all settings
1121 * @param key name of widget to sync
1122 * @param widget pointer of widget to set
1123 * @return True if sync successful, false otherwise
1124 */
1125 bool syncControl(const QVariantMap &settings, const QString &key, QWidget * widget);
1126
1127 /**
1128 * @brief syncSettings When checkboxes, comboboxes, or spin boxes are updated, save their values in the
1129 * global and per-train settings.
1130 */
1131 void syncSettings();
1132
1133 /**
1134 * @brief Connect GUI elements to sync settings once updated.
1135 */
1136 void connectSyncSettings();
1137 /**
1138 * @brief Stop updating settings when GUI elements are updated.
1139 */
1140 void disconnectSyncSettings();
1141 /**
1142 * @brief loadSettings Load setting from Options and set them accordingly.
1143 */
1144 void loadGlobalSettings();
1145
1146 /**
1147 * @brief settleSettings Run this function after timeout from debounce timer to update database
1148 * and emit settingsChanged signal. This is required so we don't overload output.
1149 */
1150 void settleSettings();
1151
1152 // ////////////////////////////////////////////////////////////////////
1153 // device control
1154 // ////////////////////////////////////////////////////////////////////
1155 // Gain
1156 // This sets and gets the custom properties target gain
1157 // it does not access the ccd gain property
1158 void setGain(double value);
1159 double getGain();
1160
1161 void setOffset(double value);
1162 double getOffset();
1163
1164 void setStandAloneGain(double value);
1165 void setStandAloneOffset(double value);
1166
1167 /**
1168 * @brief processCCDNumber Process number properties arriving from CCD. Currently, only CCD and Guider frames are processed.
1169 * @param nvp pointer to number property.
1170 */
1171 void processCCDNumber(INumberVectorProperty *nvp);
1172
1173 // Disable all the widgets that aren't used in stand-alone mode.
1174 void initStandAlone();
1175
1176 // Utilities for storing stand-alone variables.
1177 void storeTrainKey(const QString &key, const QStringList &list);
1178 void storeTrainKeyString(const QString &key, const QString &str);
1179
1180 // ////////////////////////////////////////////////////////////////////
1181 // Attributes
1182 // ////////////////////////////////////////////////////////////////////
1183 double seqExpose { 0 };
1184 int seqTotalCount;
1185 int seqCurrentCount { 0 };
1186
1187 QPointer<CaptureProcess> m_captureProcess;
1188 QSharedPointer<CaptureModuleState> m_captureModuleState;
1189
1190 QPointer<QDBusInterface> mountInterface;
1191
1192 QStringList m_LogText;
1193 bool m_JobUnderEdit { false };
1194
1195 // Flat field automation
1197
1198 QUrl dirPath;
1199
1200 std::unique_ptr<CustomProperties> customPropertiesDialog;
1201 std::unique_ptr<DSLRInfo> dslrInfoDialog;
1202
1203 // Controls
1204 double GainSpinSpecialValue { INVALID_VALUE };
1205 double OffsetSpinSpecialValue { INVALID_VALUE };
1206
1207 // sub dialogs
1208 std::unique_ptr<Ui::Limits> m_LimitsUI;
1209 QPointer<QDialog> m_LimitsDialog;
1210 std::unique_ptr<Ui::Calibration> m_CalibrationUI;
1211 QPointer<QDialog> m_CalibrationDialog;
1212 QPointer<ScriptsManager> m_scriptsManager;
1213
1214 QVariantMap m_Metadata;
1215 QVariantMap m_Settings;
1216 QVariantMap m_GlobalSettings;
1217
1218 QTimer m_DebounceTimer;
1219
1220 QSharedPointer<FilterManager> m_FilterManager;
1221 QSharedPointer<RotatorSettings> m_RotatorControlPanel;
1222
1223 bool m_standAlone {false};
1224 bool m_standAloneUseCcdGain { true};
1225 bool m_standAloneUseCcdOffset { true};
1226};
1227
1228}
Captures single or sequence of images from a CCD.
Definition capture.h:98
void updateJobFromUI(SequenceJob *job, FilenamePreviewType filenamePreview=NOT_PREVIEW)
updateJobFromUI Update all job attributes from the UI settings.
Definition capture.cpp:3322
void processCameraNumber(INDI::Property prop)
processCCDNumber Process number properties arriving from CCD.
Definition capture.cpp:1440
void refreshCameraSettings()
checkCamera Refreshes the CCD information in the capture module.
Definition capture.cpp:891
bool setVideoLimits(uint16_t maxBufferSize, uint16_t maxPreviewFPS)
setVideoLimits sets the buffer size and max preview fps for live preview
Definition capture.cpp:2556
void editJobFinished()
jobEditFinished Editing of an existing job finished, update its attributes from the UI settings.
Definition capture.cpp:1842
bool setDome(ISD::Dome *device)
setDome Set dome device
Definition capture.cpp:814
void setDelay(uint16_t delay)
setDelay Set delay between capturing images within a sequence in seconds
Definition capture.h:677
void setFocusTemperatureDelta(double focusTemperatureDelta, double absTemperature)
updateAdaptiveFocusStatus Handle new focus state
Definition capture.cpp:2057
QPointer< CaptureProcess > process() const
process shortcut for the process engine
Definition capture.h:605
void jobStarting()
captureStarted Change the UI after the capturing process has been started.
Definition capture.cpp:860
void setHFR(double newHFR, int position, bool inAutofocus)
setHFR Receive the measured HFR value of the latest frame
Definition capture.cpp:3704
void moveJob(bool up)
moveJobUp Move the job in the sequence queue one place up or down.
Definition capture.cpp:1942
void showTemperatureRegulation()
showTemperatureRegulation Toggle temperature regulation dialog which sets temperature ramp and thresh...
Definition capture.cpp:3224
void updateTargetDistance(double targetDiff)
Slot receiving the update of the current target distance.
Definition capture.cpp:1626
void newTargetName(const QString &name)
updateTargetName React upon a new capture target name
Definition capture.cpp:1977
void generateDarkFlats()
generateDarkFlats Generate a list of dark flat jobs from available flat frames.
Definition capture.cpp:3299
void refreshFilterSettings()
checkFilter Refreshes the filter wheel information in the capture module.
Definition capture.cpp:1527
void captureRunning()
captureStarted Manage the result when capturing has been started
Definition capture.cpp:1678
void setFocusStatus(FocusState newstate)
setFocusStatus Forward the new focus state to the capture module state machine
Definition capture.cpp:2075
void startFraming()
startFraming Like captureOne but repeating.
Definition capture.cpp:3689
void updateCCDTemperature(double value)
updateCCDTemperature Update CCD temperature in capture module.
Definition capture.cpp:1730
void setRotator(QString name)
Add new Rotator.
Definition capture.cpp:819
void setTargetTemperature(double temperature)
setTemperature Set the target CCD temperature in the GUI settings.
Definition capture.h:731
void addDSLRInfo(const QString &model, uint32_t maxW, uint32_t maxH, double pixelW, double pixelH)
addDSLRInfo Save DSLR Info the in the database.
Definition capture.cpp:2767
void capturePreview()
capturePreview Capture a single preview image
Definition capture.cpp:3684
bool updateCamera()
Add new Camera.
Definition capture.cpp:757
bool removeJob(int index=-1)
removeJob Remove a job sequence from the queue
Definition capture.cpp:1882
void setGuideDeviation(double delta_ra, double delta_dec)
setGuideDeviation Set the guiding deviation as measured by the guiding module.
Definition capture.cpp:2066
void focusAdaptiveComplete(bool success)
focusAdaptiveComplete Forward the new focus state to the capture module state machine
Definition capture.h:802
void updateCurrentFilterPosition()
shortcut for updating the current filter information for the state machine
Definition capture.cpp:1519
void registerNewModule(const QString &name)
registerNewModule Register an Ekos module as it arrives via DBus and create the appropriate DBus inte...
Definition capture.cpp:870
void updateFocusStatus(FocusState newstate)
updateFocusStatus Handle new focus state
Definition capture.cpp:2081
void setFilterWheel(QString name)
Add new Filter Wheel.
Definition capture.cpp:791
SequenceJob * createJob(SequenceJob::SequenceJobType jobtype=SequenceJob::JOBTYPE_BATCH, FilenamePreviewType filenamePreview=NOT_PREVIEW)
createJob Create a new job with the settings given in the GUI.
Definition capture.cpp:1759
void updateStartButtons(bool start, bool pause=false)
updateStartButtons Update the start and the pause button to new states of capturing
Definition capture.cpp:3281
void setCount(uint16_t count)
seqCount Set required number of images to capture in one sequence job
Definition capture.h:668
const QJsonArray & getSequence() const
getSequence Return the JSON representation of the current sequeue queue
Definition capture.h:459
void addJob(SequenceJob *job)
addJob Add a new job to the UI.
Definition capture.cpp:1753
QSharedPointer< MeridianFlipState > getMeridianFlipState()
MeridianFlipState Access to the meridian flip state machine.
Definition capture.h:711
Capture(bool standAlone=false)
Definition capture.cpp:287
void removeDevice(const QSharedPointer< ISD::GenericDevice > &device)
Generic method for removing any connected device.
Definition capture.cpp:3630
CameraChip class controls a particular chip in camera.
Camera class controls an INDI Camera device.
Definition indicamera.h:47
Class handles control of INDI dome devices.
Definition indidome.h:23
The QProgressIndicator class lets an application display a progress indicator to show that a long tas...
Sequence Job is a container for the details required to capture a series of images.
Q_SCRIPTABLE bool hasCoolerControl()
DBUS interface function.
Definition capture.cpp:3620
Q_SCRIPTABLE double getJobExposureProgress(int id)
DBUS interface function.
Definition capture.h:287
Q_SCRIPTABLE Q_NOREPLY void abort()
DBUS interface function.
Definition capture.h:536
Q_SCRIPTABLE Q_NOREPLY void toggleVideo(bool enabled)
DBUS interface function.
Definition capture.cpp:3645
Q_SCRIPTABLE Q_NOREPLY void setCapturedFramesMap(const QString &signature, int count)
DBUS interface function.
Definition capture.h:327
Q_SCRIPTABLE int getActiveJobID()
DBUS interface function.
Definition capture.h:226
Q_SCRIPTABLE QString getJobState(int id)
DBUS interface function.
Definition capture.h:251
Q_SCRIPTABLE Q_NOREPLY void setTargetName(const QString &newTargetName)
DBus interface function.
Definition capture.cpp:3650
Q_SCRIPTABLE Q_NOREPLY void clearAutoFocusHFR()
DBUS interface function.
Definition capture.cpp:2547
Q_SCRIPTABLE QString getSequenceQueueStatus()
DBUS interface function.
Definition capture.h:156
Q_SCRIPTABLE Q_NOREPLY void ignoreSequenceHistory()
DBUS interface function.
Definition capture.cpp:2311
Q_SCRIPTABLE int getJobCount()
DBUS interface function.
Definition capture.h:210
Q_SCRIPTABLE double getProgressPercentage()
DBUS interface function.
Definition capture.h:202
Q_SCRIPTABLE Q_NOREPLY void restartCamera(const QString &name)
DBus interface function.
Definition capture.cpp:3679
Q_SCRIPTABLE QString getJobFilterName(int id)
DBUS interface function.
Definition capture.h:260
Q_SCRIPTABLE Q_NOREPLY void setInSequenceFocus(bool enable, double HFR)
DBUS interface function.
Definition capture.cpp:2509
Q_SCRIPTABLE Q_NOREPLY void setObserverName(const QString &value)
DBus interface function.
Definition capture.h:590
Q_SCRIPTABLE Q_NOREPLY void toggleSequence()
DBUS interface function.
Definition capture.cpp:851
Q_SCRIPTABLE double getJobExposureDuration(int id)
DBUS interface function.
Definition capture.h:296
Q_SCRIPTABLE QString filterWheel()
DBUS interface function.
Q_SCRIPTABLE QString camera()
DBUS interface function.
Q_SCRIPTABLE Q_NOREPLY void stop(CaptureState targetState=CAPTURE_IDLE)
DBUS interface function.
Definition capture.cpp:3640
Q_SCRIPTABLE QStringList logText()
DBUS interface function.
Definition capture.h:336
Q_SCRIPTABLE int getActiveJobRemainingTime()
DBUS interface function.
Definition capture.h:234
Q_SCRIPTABLE bool setCoolerControl(bool enable)
DBUS interface function.
Definition capture.cpp:3625
Q_SCRIPTABLE bool setFilter(const QString &filter)
DBUS interface function.
Definition capture.cpp:1503
Q_SCRIPTABLE Q_NOREPLY void setMaximumGuidingDeviation(bool enable, double value)
DBUS interface function.
Definition capture.cpp:2502
Q_SCRIPTABLE Q_NOREPLY void pause()
DBUS interface function.
Definition capture.cpp:845
Q_SCRIPTABLE CCDFrameType getJobFrameType(int id)
DBUS interface function.
Definition capture.h:305
Q_SCRIPTABLE int getJobImageCount(int id)
DBUS interface function.
Definition capture.h:278
Q_SCRIPTABLE int getJobImageProgress(int id)
DBUS interface function.
Definition capture.h:269
Q_SCRIPTABLE Q_NOREPLY void start()
DBUS interface function.
Definition capture.cpp:3635
Q_SCRIPTABLE int getOverallRemainingTime()
DBUS interface function.
Definition capture.h:242
Q_SCRIPTABLE QString getLogText()
DBUS interface function.
Definition capture.h:344
Q_SCRIPTABLE Q_NOREPLY void clearSequenceQueue()
DBUS interface function.
Definition capture.cpp:2516
Q_SCRIPTABLE int getPendingJobCount()
DBUS interface function.
Definition capture.h:218
Q_SCRIPTABLE CaptureState status()
DBUS interface function.
Definition capture.h:352
Q_SCRIPTABLE Q_NOREPLY void suspend()
DBUS interface function.
Definition capture.h:548
Ekos is an advanced Astrophotography tool for Linux.
Definition align.cpp:78
AlignState
Definition ekos.h:145
CaptureState
Capture states.
Definition ekos.h:92
@ CAPTURE_SUSPENDED
Definition ekos.h:98
@ CAPTURE_ABORTED
Definition ekos.h:99
@ CAPTURE_IDLE
Definition ekos.h:93
Q_CLASSINFO(Name, Value)
Q_OBJECTQ_OBJECT
Q_PROPERTY(...)
QString join(QChar separator) const const
virtual bool event(QEvent *event) override
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:19:02 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.