Kstars

camera.h
1/*
2 SPDX-FileCopyrightText: 2012 Jasem Mutlaq <mutlaqja@ikarustech.com>
3 SPDX-FileCopyrightText: 2024 Wolfgang Reissenberger <sterne-jaeger@openfuture.de>
4
5 SPDX-License-Identifier: GPL-2.0-or-later
6*/
7
8#pragma once
9#include "ui_camera.h"
10#include "ui_limits.h"
11#include "ui_calibrationoptions.h"
12#include "customproperties.h"
13#include "rotatorsettings.h"
14#include "sequencejob.h"
15
16namespace
17{
18
19// Columns in the job table
20enum JobTableColumnIndex
21{
22 JOBTABLE_COL_STATUS = 0,
23 JOBTABLE_COL_FILTER,
24 JOBTABLE_COL_COUNTS,
25 JOBTABLE_COL_EXP,
26 JOBTABLE_COL_TYPE,
27 JOBTABLE_COL_BINNING,
28 JOBTABLE_COL_ISO,
29 JOBTABLE_COL_OFFSET
30};
31} // namespace
32
33class DSLRInfo;
34
35namespace Ekos
36{
37
38class Capture;
39class CaptureDeviceAdaptor;
40class CameraProcess;
41class CameraState;
42class ScriptsManager;
43class FilterManager;
44class SequenceJob;
45
46class Camera : public QWidget, public Ui::Camera
47{
49 friend class Capture;
50public:
51 typedef enum
52 {
53 NOT_PREVIEW,
54 LOCAL_PREVIEW,
55 REMOTE_PREVIEW
56 } FilenamePreviewType;
57
58 explicit Camera(int id = 0, bool standAlone = false, QWidget *parent = nullptr);
59 ~Camera();
60
61 // ////////////////////////////////////////////////////////////////////
62 // device control
63 // ////////////////////////////////////////////////////////////////////
64 // Gain
65 // This sets and gets the custom properties target gain
66 // it does not access the ccd gain property
67 void setGain(double value);
68 double getGain();
69
70 void setOffset(double value);
71 double getOffset();
72
73 /**
74 * @brief Add new Rotator
75 * @param name name of the new rotator
76 */
77 void setRotator(QString name);
78
79 /**
80 * @brief addDSLRInfo Save DSLR Info the in the database. If the interactive dialog was open, close it.
81 * @param model Camera name
82 * @param maxW Maximum width in pixels
83 * @param maxH Maximum height in pixels
84 * @param pixelW Pixel horizontal size in microns
85 * @param pixelH Pizel vertical size in microns
86 */
87 void addDSLRInfo(const QString &model, uint32_t maxW, uint32_t maxH, double pixelW, double pixelH);
88
89 // ////////////////////////////////////////////////////////////////////
90 // Main capturing actions
91 // ////////////////////////////////////////////////////////////////////
92 /**
93 * @brief Start the execution of the Capture::SequenceJob list #jobs.
94 *
95 * Starting the execution of the Capture::SequenceJob list selects the first job
96 * from the list that may be executed and starts to prepare the job (@see prepareJob()).
97 *
98 * Several factors determine, which of the jobs will be selected:
99 * - First, the list is searched to find the first job that is marked as idle or aborted.
100 * - If none is found, it is checked whether ignoring job progress is set. If yes,
101 * all jobs are are reset (@see reset()) and the first one from the list is selected.
102 * If no, the user is asked whether the jobs should be reset. If the user declines,
103 * starting is aborted.
104 */
105 void start();
106
107 /**
108 * Stops currently running jobs:
109 * CAPTURE_IDLE: capture in idle state waiting for further action (e.g. single sequence
110 * is complete, next one starting)
111 * CAPTURE_COMPLETE: all capture sequences are complete
112 * CAPTURE_ABORT: capture aborted either by user interaction or by a technical error
113 * CAPTURE_SUSPEND: capture suspended and waiting to be restarted
114 * @param targetState status of the job after stop
115 */
116 void stop(CaptureState targetState = CAPTURE_IDLE);
117
118 /**
119 * Aborts all jobs and mark current state as ABORTED. It simply calls stop(CAPTURE_ABORTED)
120 */
121 void abort()
122 {
123 stop(CAPTURE_ABORTED);
124 }
125
126 /**
127 * Aborts all jobs and mark current state as SUSPENDED. It simply calls stop(CAPTURE_SUSPENDED)
128 * The only difference between SUSPENDED and ABORTED it that capture module can automatically resume a suspended
129 * state on its own without external trigger once the right conditions are met. When whatever reason caused the module
130 * to go into suspended state ceases to exist, the capture module automatically resumes. On the other hand, ABORTED state
131 * must be started via an external programmatic or user trigger (e.g. click the start button again).
132 */
133 void suspend()
134 {
135 stop(CAPTURE_SUSPENDED);
136 }
137
138 /** DBUS interface function.
139 * @brief pause Pauses the Sequence Queue progress AFTER the current capture is complete.
140 */
141 void pause();
142
143 /**
144 * @brief toggleSequence Toggle sequence state depending on its current state.
145 * 1. If paused, then resume sequence.
146 * 2. If idle or completed, then start sequence.
147 * 3. Otherwise, abort current sequence.
148 */
149 void toggleSequence();
150
151 /**
152 * Toggle video streaming if supported by the device.
153 * @param enabled Set to true to start video streaming, false to stop it if active.
154 */
155 void toggleVideo(bool enabled);
156
157 /**
158 * @brief restartCamera Restarts the INDI driver associated with a camera. Remote and Local drivers are supported.
159 * @param name Name of camera to restart. If a driver defined multiple cameras, they would be removed and added again
160 * after driver restart.
161 */
162 void restartCamera(const QString &name);
163
164 /**
165 * @brief capturePreview Capture a single preview image
166 */
167 void capturePreview();
168
169 /**
170 * @brief startFraming Like captureOne but repeating.
171 */
172 void startFraming();
173
174 /**
175 * @brief generateDarkFlats Generate a list of dark flat jobs from available flat frames.
176 */
177 void generateDarkFlats();
178
179 /**
180 * @brief setDownloadProgress update the Capture Module and Summary
181 * Screen's estimate of how much time is left in the download
182 */
183 void updateDownloadProgress(double downloadTimeLeft, const QString &devicename);
184
185 void updateCaptureCountDown(int deltaMillis);
186
187 // ////////////////////////////////////////////////////////////////////
188 // Job handling
189 // ////////////////////////////////////////////////////////////////////
190
191 /**
192 * @brief createJob Create a new job with the settings given in the GUI.
193 * @param jobtype batch, preview, looping or dark flat job.
194 * @param filenamePreview if the job is to generate a preview filename
195 * @return pointer to job created or nullptr otherwise.
196 */
197 SequenceJob *createJob(SequenceJob::SequenceJobType jobtype = SequenceJob::JOBTYPE_BATCH,
198 Camera::FilenamePreviewType filenamePreview = Camera::NOT_PREVIEW);
199
200 /**
201 * @brief removeJob Remove a job sequence from the queue
202 * @param index Row index for job to remove, if left as -1 (default), the currently selected row will be removed.
203 * if no row is selected, the last job shall be removed.
204 * @param true if sequence is removed. False otherwise.
205 */
206 bool removeJob(int index = -1);
207
208 // ////////////////////////////////////////////////////////////////////
209 // Process control
210 // ////////////////////////////////////////////////////////////////////
211 /**
212 * Enables or disables the maximum guiding deviation and sets its value.
213 * @param enable If true, enable the guiding deviation check, otherwise, disable it.
214 * @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.
215 */
216 void setMaximumGuidingDeviation(bool enable, double value);
217
218 /**
219 * Enables or disables the in sequence focus and sets Half-Flux-Radius (HFR) limit.
220 * @param enable If true, enable the in sequence auto focus check, otherwise, disable it.
221 * @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.
222 */
223 void setInSequenceFocus(bool enable, double HFR);
224
225 /**
226 * Loads the Ekos Sequence Queue file in the Sequence Queue. Jobs are appended to existing jobs.
227 * @param fileURL full URL of the filename
228 * @param targetName override the target in the sequence queue file (necessary for using the target of the scheduler)
229 */
230 bool loadSequenceQueue(const QString &fileURL, QString targetName = "");
231
232 /**
233 * Saves the Sequence Queue to the Ekos Sequence Queue file.
234 * @param fileURL full URL of the filename
235 */
236 bool saveSequenceQueue(const QString &path);
237
238 /**
239 * @brief Update the camera's capture state
240 */
241 void updateCameraStatus(CaptureState status);
242
243 /**
244 * Aborts any current jobs and remove all sequence queue jobs.
245 */
246 void clearSequenceQueue();
247
248 // shortcuts
249 void loadSequenceQueue();
250 void saveSequenceQueue();
251 void saveSequenceQueueAs();
252
253 QVariantMap getAllSettings() const;
254 void setAllSettings(const QVariantMap &settings, const QVariantMap *standAloneSettings = nullptr);
255
256 // ////////////////////////////////////////////////////////////////////
257 // Optical Train handling
258 // ////////////////////////////////////////////////////////////////////
259 void setupOpticalTrainManager();
260 void refreshOpticalTrain();
261
262 // Utilities for storing stand-alone variables.
263 void storeTrainKey(const QString &key, const QStringList &list);
264 void storeTrainKeyString(const QString &key, const QString &str);
265
266 // ////////////////////////////////////////////////////////////////////
267 // Filter Manager and filters
268 // ////////////////////////////////////////////////////////////////////
269 void setupFilterManager();
270 void clearFilterManager();
271
272 /**
273 * @brief checkFilter Refreshes the filter wheel information in the capture module.
274 */
275 void refreshFilterSettings();
276
277 QSharedPointer<FilterManager> &filterManager()
278 {
279 return m_FilterManager;
280 }
281
282 /**
283 * @brief shortcut for updating the current filter information for the state machine
284 */
285 void updateCurrentFilterPosition();
286
287 /**
288 * @brief Add new Filter Wheel
289 * @param name device name of the new filter wheel
290 */
291 void setFilterWheel(QString name);
292
293 // ////////////////////////////////////////////////////////////////////
294 // Devices and process engine
295 // ////////////////////////////////////////////////////////////////////
296
297 /**
298 * @brief activeJob Shortcut to device adapter
299 */
301 {
302 return m_DeviceAdaptor;
303 }
304
306 {
307 return m_cameraProcess;
308 }
309
310 // shortcut for the module state
311 QSharedPointer<CameraState> state() const
312 {
313 return m_cameraState;
314 }
315
316 // shortcut for the active job
317 SequenceJob *activeJob() const
318 {
319 return state()->getActiveJob();
320 }
321
322 // Shortcut to the active camera held in the device adaptor
323 ISD::Camera *activeCamera();
324
325 /**
326 * @brief currentScope Retrieve the scope parameters from the optical train.
327 */
328 QJsonObject currentScope();
329
330 /**
331 * @brief currentReducer Retrieve the reducer parameters from the optical train.
332 */
333 double currentReducer();
334
335 /**
336 * @brief currentAperture Determine the current aperture
337 * @return
338 */
339 double currentAperture();
340
341 void setForceTemperature(bool enabled)
342 {
343 cameraTemperatureS->setChecked(enabled);
344 }
345
346 // Propagate meridian flip state changes to the UI
347 void updateMeridianFlipStage(MeridianFlipState::MFStage stage);
348
349 // ////////////////////////////////////////////////////////////////////
350 // sub dialogs
351 // ////////////////////////////////////////////////////////////////////
352
353 void openExposureCalculatorDialog();
354
355 // Script Manager
356 void handleScriptsManager();
357
358 /**
359 * @brief showTemperatureRegulation Toggle temperature regulation dialog which sets temperature ramp and threshold
360 */
361 void showTemperatureRegulation();
362
363 void createDSLRDialog();
364
365 // Observer
366 void showObserverDialog();
367
368 // ////////////////////////////////////////////////////////////////////
369 // Standalone editor
370 // ////////////////////////////////////////////////////////////////////
371 /**
372 * Gets called when the stand-alone editor gets a show event.
373 * Do this initialization here so that if the live capture module was
374 * used after startup, it will have set more recent remembered values.
375 */
376 void onStandAloneShow(QShowEvent* event);
377
378 bool m_standAlone {false};
379 void setStandAloneGain(double value);
380 void setStandAloneOffset(double value);
381
382 CustomProperties *customPropertiesDialog() const
383 {
384 return m_customPropertiesDialog.get();
385 }
386
387
388 // ////////////////////////////////////////////////////////////////////
389 // Access to properties
390 // ////////////////////////////////////////////////////////////////////
391
392 /**
393 * @brief Set the observer name.
394 */
395 void setObserverName(const QString &value)
396 {
397 state()->setObserverName(value);
398 };
399
400 QString getObserverName()
401 {
402 return state()->observerName();
403 }
404
405 QVariantMap &settings()
406 {
407 return m_settings;
408 }
409 void setSettings(const QVariantMap &newSettings)
410 {
411 m_settings = newSettings;
412 }
413
414signals:
415 // communication with other modules
416 void ready();
417 void refreshCamera(uint id, bool isValid);
418 void newExposureProgress(SequenceJob *job, const QString &devicename);
419 void newDownloadProgress(double, const QString &devicename);
420 void newImage(SequenceJob *job, const QSharedPointer<FITSData> &data, const QString &devicename = "");
421 void captureTarget(QString targetName);
422 void captureComplete(const QVariantMap &metadata);
423 void runAutoFocus(AutofocusReason autofocusReason, const QString &reasonInfo);
424 void resetFocus();
425 void abortFocus();
426 void adaptiveFocus();
427 void settingsUpdated(const QVariantMap &settings);
428 void sequenceChanged(const QJsonArray &sequence);
429 void newLocalPreview(const QString &preview);
430 void dslrInfoRequested(const QString &cameraName);
431 void filterManagerUpdated(ISD::FilterWheel *device);
432 void newFilterStatus(FilterState state);
433 void trainChanged();
434 void newLog(const QString &text);
435
436 // Signals for the Analyze tab.
437 void captureStarting(double exposureSeconds, const QString &filter);
438 void captureAborted(double exposureSeconds);
439
440 // communication with other modules
441 void checkFocus(double);
442 void meridianFlipStarted();
443 void guideAfterMeridianFlip();
444 void newStatus(CaptureState status, const QString &devicename);
445 void suspendGuiding();
446 void resumeGuiding();
447 void driverTimedout(const QString &deviceName);
448
449private slots:
450 // ////////////////////////////////////////////////////////////////////
451 // slots handling device and module events
452 // ////////////////////////////////////////////////////////////////////
453
454 void setVideoStreamEnabled(bool enabled);
455
456 // Cooler
457 void setCoolerToggled(bool enabled);
458
459 // Filter
460 void setFilterStatus(FilterState filterState);
461
462 // Jobs
463 void resetJobs();
464 bool selectJob(QModelIndex i);
465 void editJob(QModelIndex i);
466 void resetJobEdit(bool cancelled = false);
467
468private:
469
470 /**
471 * @brief initCamera Initialize all camera settings
472 */
473 void initCamera();
474 // ////////////////////////////////////////////////////////////////////
475 // Device updates
476 // ////////////////////////////////////////////////////////////////////
477 // Rotator
478 void updateRotatorAngle(double value);
479 void setRotatorReversed(bool toggled);
480
481 /**
482 * @brief updateCCDTemperature Update CCD temperature in capture module.
483 * @param value Temperature in celcius.
484 */
485 void updateCCDTemperature(double value);
486
487 // Auto Focus
488 /**
489 * @brief setFocusStatus Forward the new focus state to the capture module state machine
490 */
491 void setFocusStatus(FocusState newstate);
492
493 /**
494 * @brief updateFocusStatus Handle new focus state
495 */
496 void updateFocusStatus(FocusState newstate);
497
498 // Adaptive Focus
499 /**
500 * @brief focusAdaptiveComplete Forward the new focus state to the capture module state machine
501 */
502 void focusAdaptiveComplete(bool success)
503 {
504 // directly forward it to the state machine
505 state()->updateAdaptiveFocusState(success);
506 }
507
508 /**
509 * @brief New camera selected
510 * @param isValid is the selected camera valid.
511 */
512 void updateCamera(bool isValid);
513
514 /**
515 * @brief checkCamera Refreshes the CCD information in the capture module.
516 */
517 void refreshCameraSettings();
518
519 /**
520 * @brief processCCDNumber Process number properties arriving from CCD. Currently, only CCD and Guider frames are processed.
521 * @param nvp pointer to number property.
522 */
523 void processCameraNumber(INDI::Property prop);
524
525 /**
526 * @brief Slot receiving the update of the current target distance.
527 * @param targetDiff distance to the target in arcseconds.
528 */
529 void updateTargetDistance(double targetDiff);
530
531 // ////////////////////////////////////////////////////////////////////
532 // Capture actions
533 // ////////////////////////////////////////////////////////////////////
534 /**
535 * @brief captureStarted Change the UI after the capturing process
536 * has been started.
537 */
538 void jobStarting();
539
540 /**
541 * @brief addJob Add a new job to the UI. This is used when a job is loaded from a capture sequence file. In
542 * contrast to {@see #createJob()}, the job's attributes are taken from the file and only the UI gehts updated.
543 */
544 void addJob(SequenceJob *job);
545
546 /**
547 * @brief jobEditFinished Editing of an existing job finished, update its
548 * attributes from the UI settings. The job under edit is taken from the
549 * selection in the job table.
550 * @return true if job updated succeeded.
551 */
552 void editJobFinished();
553
554 /**
555 * @brief imageCapturingCompleted Capturing a single frame completed
556 */
557 void imageCapturingCompleted();
558
559 /**
560 * @brief captureStopped Capturing has stopped
561 */
562 void captureStopped();
563
564 /**
565 * @brief processFITSfinished processing new FITS data received from camera finished.
566 * @param success true iff processing was successful
567 */
568 void processingFITSfinished(bool success);
569
570 /**
571 * @brief captureRunning Manage the result when capturing has been started
572 */
573 void captureRunning();
574
575 /**
576 * @brief captureImageStarted Image capturing for the active job has started.
577 */
578 void captureImageStarted();
579
580 /**
581 * @brief jobPreparationStarted Preparation actions for the current active job have beenstarted.
582 */
583 void jobExecutionPreparationStarted();
584
585 /**
586 * @brief jobPrepared Select the job that is currently in preparation.
587 */
588 void jobPrepared(SequenceJob *job);
589
590 /**
591 * @brief Set the name of the target to be captured.
592 */
593 void setTargetName(const QString &newTargetName);
594
595 // ////////////////////////////////////////////////////////////////////
596 // UI controls
597 // ////////////////////////////////////////////////////////////////////
598 void checkFrameType(int index);
599
600 /**
601 * @brief updateStartButtons Update the start and the pause button to new states of capturing
602 * @param start start capturing
603 * @param pause pause capturing
604 */
605 void updateStartButtons(bool start, bool pause = false);
606
607 void setBusy(bool enable);
608
609 /**
610 * @brief Listen to device property changes (temperature, rotator) that are triggered by
611 * SequenceJob.
612 */
613 void updatePrepareState(CaptureState prepareState);
614
615 /**
616 * @brief updateJobTable Update the table row values for the given sequence job. If the job
617 * is null, all rows will be updated
618 * @param job as identifier for the row
619 * @param full if false, then only the status and the counter will be updated.
620 */
621 void updateJobTable(SequenceJob *job, bool full = false);
622
623 /**
624 * @brief updateJobFromUI Update all job attributes from the UI settings.
625 */
626 void updateJobFromUI(SequenceJob *job, Camera::FilenamePreviewType filenamePreview = Camera::NOT_PREVIEW);
627
628 /**
629 * @brief syncGUIToJob Update UI to job settings
630 */
631 void syncGUIToJob(SequenceJob *job);
632
633 void syncFrameType(const QString &name);
634
635 void syncCameraInfo();
636
637 // create a new row in the job table and fill it with the given job's values
638 void createNewJobTableRow(SequenceJob *job);
639
640 /**
641 * @brief Update the style of the job's row, depending on the job's state
642 */
643 void updateRowStyle(SequenceJob *job);
644
645 /**
646 * @brief updateCellStyle Update the cell's style. If active is true, set a bold and italic font and
647 * a regular font otherwise.
648 */
649 void updateCellStyle(QTableWidgetItem *cell, bool active);
650
651 /**
652 * @brief syncControl Sync setting to widget. The value depends on the widget type.
653 * @param settings Map of all settings
654 * @param key name of widget to sync
655 * @param widget pointer of widget to set
656 * @return True if sync successful, false otherwise
657 */
658 bool syncControl(const QVariantMap &settings, const QString &key, QWidget * widget);
659
660 /**
661 * @brief moveJobUp Move the job in the sequence queue one place up or down.
662 */
663 void moveJob(bool up);
664
665
666 void removeJobFromQueue();
667
668 void saveFITSDirectory();
669
670 /**
671 * @brief updateCaptureFormats Update encoding and transfer formats
672 */
673 void updateCaptureFormats();
674
675 /**
676 * @brief updateHFRCheckAlgo Update the in-sequence HFR check algorithm
677 */
678 void updateHFRCheckAlgo();
679
680 /**
681 * Clear in-sequence focus settings. It sets the autofocus HFR to zero so that next autofocus value is remembered for the in-sequence focusing.
682 */
683 void clearAutoFocusHFR();
684
685 // selection of a job
686 void selectedJobChanged(QModelIndex current, QModelIndex previous);
687
688 // Clear Camera Configuration
689 void clearCameraConfiguration();
690
691 // Change filter name in INDI
692 void editFilterName();
693 bool editFilterNameInternal(const QStringList &labels, QStringList &newLabels);
694
695 // ////////////////////////////////////////////////////////////////////
696 // Settings
697 // ////////////////////////////////////////////////////////////////////
698 /**
699 * @brief loadSettings Load setting from Options and set them accordingly.
700 */
701 void loadGlobalSettings();
702
703 /**
704 * @brief syncLimitSettings Update Limits UI from Options
705 */
706 void syncLimitSettings();
707
708 /**
709 * @brief settleSettings Run this function after timeout from debounce timer to update database
710 * and emit settingsChanged signal. This is required so we don't overload output.
711 */
712 void settleSettings();
713
714 /**
715 * @brief syncSettings When checkboxes, comboboxes, or spin boxes are updated, save their values in the
716 * global and per-train settings.
717 */
718 void syncSettings();
719
720 /**
721 * @brief Connect GUI elements to sync settings once updated.
722 */
723 void connectSyncSettings();
724 /**
725 * @brief Stop updating settings when GUI elements are updated.
726 */
727 void disconnectSyncSettings();
728
729 // ////////////////////////////////////////////////////////////////////
730 // helper functions
731 // ////////////////////////////////////////////////////////////////////
732 // check if the upload paths are filled correctly
733 bool checkUploadPaths(FilenamePreviewType filenamePreview);
734
735 // Create a Json job from the current job table row
736 QJsonObject createJsonJob(SequenceJob *job, int currentRow);
737
738 /**
739 * @return Returns true if an ongoing capture is a preview capture.
740 */
741 bool isActiveJobPreview()
742 {
743 return state() && state()->isActiveJobPreview();
744 }
745
746 // Filename preview
747 void generatePreviewFilename();
748 QString previewFilename(FilenamePreviewType previewType = LOCAL_PREVIEW);
749
750 /**
751 * @brief updateJobTableCountCell Update the job counter in the job table of a sigle job
752 */
753 void updateJobTableCountCell(SequenceJob *job, QTableWidgetItem *countCell);
754
755 void cullToDSLRLimits();
756
757 void resetFrameToZero();
758
759 // reset = 0 --> Do not reset
760 // reset = 1 --> Full reset
761 // reset = 2 --> Only update limits if needed
762 void updateFrameProperties(int reset = 0);
763
764 // ////////////////////////////////////////////////////////////////////
765 // Sub dialogs
766 // ////////////////////////////////////////////////////////////////////
767 QSharedPointer<FilterManager> m_FilterManager;
768 std::unique_ptr<Ui::Limits> m_LimitsUI;
769 QPointer<QDialog> m_LimitsDialog;
770 std::unique_ptr<Ui::Calibration> m_CalibrationUI;
771 QPointer<QDialog> m_CalibrationDialog;
772 QPointer<ScriptsManager> m_scriptsManager;
773 QSharedPointer<RotatorSettings> m_RotatorControlPanel;
774 std::unique_ptr<DSLRInfo> m_DSLRInfoDialog;
775
776 // ////////////////////////////////////////////////////////////////////
777 // Module logging
778 // ////////////////////////////////////////////////////////////////////
779 void appendLogText(const QString &text)
780 {
781 emit newLog(text);
782 }
783
784 // ////////////////////////////////////////////////////////////////////
785 // Attributes
786 // ////////////////////////////////////////////////////////////////////
787 int m_cameraId;
788 QVariantMap m_settings;
789 QVariantMap m_GlobalSettings;
790 std::unique_ptr<CustomProperties> m_customPropertiesDialog;
791 QTimer m_DebounceTimer;
792
793 bool m_standAloneUseCcdGain { true};
794 bool m_standAloneUseCcdOffset { true};
795 bool m_JobUnderEdit { false };
796
797 QUrl m_dirPath;
798
800 QSharedPointer<CameraProcess> m_cameraProcess;
801 QSharedPointer<CameraState> m_cameraState;
802
803 // Controls
804 double GainSpinSpecialValue { INVALID_VALUE };
805 double OffsetSpinSpecialValue { INVALID_VALUE };
806};
807} // namespace Ekos
Camera class controls an INDI Camera device.
Definition indicamera.h:44
Sequence Job is a container for the details required to capture a series of images.
Ekos is an advanced Astrophotography tool for Linux.
Definition align.cpp:79
@ CAPTURE_SUSPENDED
Definition ekos.h:98
@ CAPTURE_ABORTED
Definition ekos.h:99
@ CAPTURE_IDLE
Definition ekos.h:93
Q_OBJECTQ_OBJECT
QObject * parent() 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 Fri Jul 26 2024 11:59:51 by doxygen 1.11.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.