15#include "indi/indistd.h"
16#include "indi/indidustcap.h"
17#include "indi/indicamera.h"
18#include "indi/indimount.h"
19#include "indi/indidome.h"
21#include "ekos/manager/meridianflipstate.h"
22#include "ekos/auxiliary/filtermanager.h"
23#include "ekos/scheduler/schedulertypes.h"
24#include "ekos/capture/refocusstate.h"
25#include "ekos/focus/focusutils.h"
26#include "placeholderpath.h"
30#define CAPTURE_TIMEOUT_THRESHOLD 180000
40 HFR_CHECK_LAST_AUTOFOCUS,
42 HFR_CHECK_MEDIAN_MEASURE,
45constexpr double HFR_CHECK_DEFAULT_THRESHOLD = 10.0;
49class CaptureDeviceAdaptor;
52class CameraState:
public QObject
62 ACTION_PREPARE_LIGHTSOURCE,
65 ACTION_FLAT_SYNC_FOCUS,
99 CONTINUE_ACTION_NEXT_EXPOSURE,
100 CONTINUE_ACTION_CAPTURE_COMPLETE
127 return m_sequenceQueue;
136 const QUrl &sequenceURL()
const;
137 void setSequenceURL(
const QUrl &newSequenceURL);
148 m_ImageData = newImageData;
155 int currentFilterID { Ekos::INVALID_VALUE };
169 MANUAL_COVER_CLOSED_LIGHT,
170 MANUAL_COVER_CLOSED_DARK
173 ManualCoverState m_ManualCoverState { MANAUL_COVER_OPEN };
175 bool hasLightBox {
false };
177 bool hasDustCap {
false };
179 bool hasTelescope {
false };
181 bool hasDome {
false };
186 ShutterStatus shutterStatus { SHUTTER_UNKNOWN };
195 void initCapturePreparation();
200 CaptureState getCaptureState()
const
202 return m_CaptureState;
204 void setCaptureState(CaptureState value);
206 bool isStartingCapture()
const
208 return m_StartingCapture;
210 void setStartingCapture(
bool newStartingCapture)
212 m_StartingCapture = newStartingCapture;
215 ContinueAction getContinueAction()
const
217 return m_ContinueAction;
219 void setContinueAction(ContinueAction newPauseFunction)
221 m_ContinueAction = newPauseFunction;
224 FocusState getFocusState()
const
228 void setFocusState(FocusState value)
230 m_FocusState = value;
233 GuideState getGuideState()
const
237 void setGuideState(GuideState state);
242 bool isActivelyGuiding();
244 bool useGuideHead()
const
246 return m_useGuideHead;
248 void setUseGuideHead(
bool value)
250 m_useGuideHead = value;
252 bool isGuidingDeviationDetected()
const
254 return m_GuidingDeviationDetected;
256 void setGuidingDeviationDetected(
bool newDeviationDetected)
258 m_GuidingDeviationDetected = newDeviationDetected;
261 bool suspendGuidingOnDownload()
const
263 return m_SuspendGuidingOnDownload;
265 void setSuspendGuidingOnDownload(
bool value)
267 m_SuspendGuidingOnDownload = value;
270 uint SpikesDetected()
const
272 return m_SpikesDetected;
274 uint increaseSpikesDetected()
276 return ++m_SpikesDetected;
278 void resetSpikesDetected()
280 m_SpikesDetected = 0;
283 IPState getDitheringState()
const
285 return m_DitheringState;
287 void setDitheringState(IPState value)
289 m_DitheringState = value;
292 AlignState getAlignState()
const
296 void setAlignState(AlignState value);
298 FilterState getFilterManagerState()
const
300 return m_FilterManagerState;
302 void setFilterManagerState(FilterState value)
304 m_FilterManagerState = value;
307 int getCurrentFilterPosition()
const
309 return m_CurrentFilterPosition;
312 const QString &getCurrentFilterName()
const
314 return m_CurrentFilterName;
317 const QString &CurrentFocusFilterName()
const
319 return m_CurrentFocusFilterName;
322 void setCurrentFilterPosition(
int position,
const QString &name,
const QString &focusFilterName);
324 LightState getLightBoxLightState()
const
326 return m_lightBoxLightState;
328 void setLightBoxLightState(LightState value)
330 m_lightBoxLightState = value;
333 bool lightBoxLightEnabled()
const
335 return m_lightBoxLightEnabled;
337 void setLightBoxLightEnabled(
bool value)
339 m_lightBoxLightEnabled = value;
345 void dustCapStateChanged(ISD::DustCap::Status status);
347 CapState getDustCapState()
const
349 return m_dustCapState;
351 void setDustCapState(CapState value)
353 m_dustCapState = value;
356 ISD::Mount::Status getScopeState()
const
360 void setScopeState(ISD::Mount::Status value)
362 m_scopeState = value;
365 ISD::Mount::PierSide getPierSide()
const
369 void setPierSide(ISD::Mount::PierSide value)
374 ISD::ParkStatus getScopeParkState()
const
376 return m_scopeParkState;
378 void setScopeParkState(ISD::ParkStatus value)
380 m_scopeParkState = value;
383 ISD::Dome::Status getDomeState()
const
387 void setDomeState(ISD::Dome::Status value)
397 return m_refocusState;
400 const QString &observerName()
const
402 return m_ObserverName;
404 void setObserverName(
const QString &value);
406 bool ignoreJobProgress()
const
408 return m_ignoreJobProgress;
410 void setIgnoreJobProgress(
bool value)
412 m_ignoreJobProgress = value;
415 bool isRememberFastExposure()
const
417 return m_RememberFastExposure;
419 void setRememberFastExposure(
bool value)
421 m_RememberFastExposure = value;
428 void setDirty(
bool value)
437 void setBusy(
bool busy);
439 bool isLooping()
const
443 void setLooping(
bool newLooping)
445 m_Looping = newLooping;
450 return m_SequenceArray;
454 m_SequenceArray = value;
457 PlaceholderPath &placeholderPath()
459 return m_currentPlaceholderPath;
461 void initPlaceholderPath()
463 m_currentPlaceholderPath = PlaceholderPath();
472 bool generateFilename(
const QString &extension,
QString *filename);
478 int getAlignmentRetries()
const
480 return m_AlignmentRetries;
482 int increaseAlignmentRetries()
484 return ++m_AlignmentRetries;
486 void resetAlignmentRetries()
488 m_AlignmentRetries = 0;
491 int getDitherCounter()
const
493 return m_ditherCounter;
495 void decreaseDitherCounter();
501 void resetDitherCounter();
503 int nextSequenceID()
const
505 return m_nextSequenceID;
507 void setNextSequenceID(
int id)
509 m_nextSequenceID = id;
512 uint16_t capturedFramesCount(
const QString &signature)
const
514 return m_capturedFramesMap[signature];
516 void setCapturedFramesCount(
const QString &signature, uint16_t count);
518 double lastRemainingFrameTimeMS()
const
520 return m_lastRemainingFrameTimeMS;
522 void setLastRemainingFrameTimeMS(
double value)
524 m_lastRemainingFrameTimeMS = value;
530 QTimer &getCaptureTimeout()
532 return m_captureTimeout;
534 uint8_t captureTimeoutCounter()
const
536 return m_CaptureTimeoutCounter;
538 void setCaptureTimeoutCounter(uint8_t value)
540 m_CaptureTimeoutCounter = value;
542 uint8_t deviceRestartCounter()
const
544 return m_DeviceRestartCounter;
546 void setDeviceRestartCounter(uint8_t value)
548 m_DeviceRestartCounter = value;
550 QTimer &downloadProgressTimer()
552 return m_downloadProgressTimer;
556 return m_DownloadTimer;
558 QTimer &getCaptureDelayTimer()
560 return m_captureDelayTimer;
562 QTimer &getGuideDeviationTimer()
564 return m_guideDeviationTimer;
567 QTime &imageCountDown()
569 return m_imageCountDown;
571 void imageCountDownAddMSecs(
int value)
573 m_imageCountDown = m_imageCountDown.
addMSecs(value);
576 QTime &sequenceCountDown()
578 return m_sequenceCountDown;
580 void sequenceCountDownAddMSecs(
int value)
582 m_sequenceCountDown = m_sequenceCountDown.
addMSecs(value);
610 bool checkDithering();
612 bool checkCapturing()
620 void updateMFMountState(MeridianFlipState::MeridianFlipMountState status);
625 void updateMeridianFlipStage(
const MeridianFlipState::MFStage &stage);
631 bool checkMeridianFlipActive();
637 bool checkMeridianFlipReady();
644 bool checkPostMeridianFlipActions();
651 bool checkAlignmentAfterFlip();
656 void checkGuideDeviationTimeout();
664 bool checkGuidingAfterFlip();
676 void processGuidingFailed();
681 void updateFocusState(FocusState state);
687 bool checkFocusRunning()
689 return (m_FocusState != FOCUS_IDLE && m_FocusState != FOCUS_COMPLETE && m_FocusState != FOCUS_ABORTED);
697 AutofocusReason getAFReason(RefocusState::RefocusReason state,
QString &reasonInfo);
703 bool startFocusIfRequired();
710 void updateAdaptiveFocusState(
bool success);
715 void updateHFRThreshold();
734 void setGuideDeviation(
double deviation_rms);
739 void addDownloadTime(
double time);
745 double averageDownloadTime()
747 return (downloadsCounter == 0 ? 0 : totalDownloadTime / downloadsCounter);
767 void checkSeqBoundary();
771 bool isModelinDSLRInfo(
const QString &model);
785 int pendingJobCount();
804 CCDFrameType jobFrameType(
int id);
810 int jobImageProgress(
int id);
816 int jobImageCount(
int id);
822 double jobExposureProgress(
int id);
828 double jobExposureDuration(
int id);
833 double progressPercentage();
838 bool isActiveJobPreview();
843 int activeJobRemainingTime();
848 int overallRemainingTime();
866 void setCalibrationSettings(
const QJsonObject &settings);
871 bool hasCapturedFramesMap()
873 return m_capturedFramesMap.
count() > 0;
878 void addCapturedFrame(
const QString &signature);
882 void removeCapturedFrameCount(
const QString &signature, uint16_t count);
886 void clearCapturedFramesMap()
888 m_capturedFramesMap.
clear();
891 bool isCaptureRunning()
896 ScriptTypes captureScriptType()
const
898 return m_CaptureScriptType;
900 void setCaptureScriptType(ScriptTypes value)
902 m_CaptureScriptType = value;
904 double targetADU()
const
908 void setTargetADU(
double value)
912 double targetADUTolerance()
const
914 return m_TargetADUTolerance;
916 void setTargetADUTolerance(
double value)
918 m_TargetADUTolerance = value;
924 void setSkyFlat(
bool enabled)
936 const DoubleRange &exposureRange()
const
938 return m_ExposureRange;
940 void setExposureRange(
double min,
double max)
942 m_ExposureRange.min = min;
943 m_ExposureRange.max = max;
948 return m_frameSettings;
952 m_frameSettings = value;
955 FlatFieldDuration flatFieldDuration()
const
957 return m_flatFieldDuration;
959 void setFlatFieldDuration(FlatFieldDuration value)
961 m_flatFieldDuration = value;
964 uint32_t calibrationPreAction()
const
966 return m_CalibrationPreAction;
968 void setCalibrationPreAction(uint32_t value)
970 m_CalibrationPreAction = value;
980 void captureBusy(
bool busy);
983 void suspendCapture();
984 void executeActiveJob();
985 void updatePrepareState(CaptureState state);
986 void captureStarted(CAPTUREResult rc);
988 void newMeridianFlipStage(MeridianFlipState::MFStage status);
990 void meridianFlipStarted();
992 void newGuiderDrift(
double deviation_rms);
994 void guideAfterMeridianFlip();
996 void newStatus(CaptureState status);
998 void newFocusStatus(FocusState status);
1000 void newAdaptiveFocusStatus(
bool success);
1002 void checkFocus(
double hfr);
1004 void runAutoFocus(AutofocusReason autofocusReason,
const QString &reasonInfo);
1008 void adaptiveFocus();
1010 void abortFastExposure();
1012 void newLimitFocusHFR(
double hfr);
1014 void newFilterPosition(
int targetFilterPosition, FilterManager::FilterPolicy policy = FilterManager::ALL_POLICIES);
1016 void sequenceChanged(
const QJsonArray &sequence);
1018 void newLog(
const QString &text);
1034 int m_CurrentFilterPosition { -1 };
1036 QString m_CurrentFilterName {
"--" };
1038 QString m_CurrentFocusFilterName {
"--" };
1042 bool m_StartingCapture {
true };
1044 bool m_useGuideHead {
false };
1046 bool m_GuidingDeviationDetected {
false };
1048 bool m_SuspendGuidingOnDownload {
false };
1050 uint m_SpikesDetected { 0 };
1052 QTimer m_guideDeviationTimer;
1055 uint8_t m_CaptureTimeoutCounter { 0 };
1056 uint8_t m_DeviceRestartCounter { 0 };
1058 QTime m_imageCountDown;
1059 double m_lastRemainingFrameTimeMS;
1062 QTimer m_captureDelayTimer;
1064 QTime m_sequenceCountDown;
1066 QTimer m_downloadProgressTimer;
1070 double totalDownloadTime {0};
1072 uint downloadsCounter {0};
1074 PlaceholderPath m_currentPlaceholderPath;
1076 int m_nextSequenceID { 0 };
1078 ContinueAction m_ContinueAction { CONTINUE_ACTION_NONE };
1082 bool m_ignoreJobProgress {
true };
1084 bool m_RememberFastExposure {
false};
1086 bool m_Dirty {
false };
1088 bool m_Busy {
false };
1090 bool m_Looping {
false };
1092 ScriptTypes m_CaptureScriptType { SCRIPT_N };
1094 double m_TargetADUTolerance { 1000 };
1095 double m_targetADU { 0 };
1096 bool m_skyFlat {
false };
1098 FlatFieldDuration m_flatFieldDuration { DURATION_MANUAL };
1099 uint32_t m_CalibrationPreAction { ACTION_NONE };
1100 bool m_lightBoxLightEnabled {
false };
1102 DoubleRange m_ExposureRange;
1110 FocusState m_FocusState { FOCUS_IDLE };
1111 GuideState m_GuideState { GUIDE_IDLE };
1112 IPState m_DitheringState {IPS_IDLE};
1114 FilterState m_FilterManagerState { FILTER_IDLE };
1115 LightState m_lightBoxLightState { CAP_LIGHT_UNKNOWN };
1116 CapState m_dustCapState { CAP_UNKNOWN };
1117 ISD::Mount::Status m_scopeState { ISD::Mount::MOUNT_IDLE };
1118 ISD::Mount::PierSide m_pierSide { ISD::Mount::PIER_UNKNOWN };
1119 ISD::ParkStatus m_scopeParkState { ISD::PARK_UNKNOWN };
1120 ISD::Dome::Status m_domeState { ISD::Dome::DOME_IDLE };
1126 int m_AlignmentRetries { 0 };
1128 uint m_ditherCounter { 0 };
1138 void appendLogText(
const QString &message);
Sequence Job is a container for the details required to capture a series of images.
The sky coordinates of a point in the sky.
Ekos is an advanced Astrophotography tool for Linux.
QMap< QString, uint16_t > CapturedFramesMap
mapping signature --> frames count
@ ALIGN_IDLE
No ongoing operations.
size_type count() const const
QObject * parent() const const
QTime addMSecs(int ms) const const