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"
29#define CAPTURE_TIMEOUT_THRESHOLD 180000
39 HFR_CHECK_LAST_AUTOFOCUS,
41 HFR_CHECK_MEDIAN_MEASURE,
44constexpr double HFR_CHECK_DEFAULT_THRESHOLD = 10.0;
48class CaptureDeviceAdaptor;
51class CaptureModuleState:
public QObject
61 ACTION_PREPARE_LIGHTSOURCE,
64 ACTION_FLAT_SYNC_FOCUS,
98 CONTINUE_ACTION_NEXT_EXPOSURE,
99 CONTINUE_ACTION_CAPTURE_COMPLETE
126 return m_sequenceQueue;
135 const QUrl &sequenceURL()
const;
154 int currentFilterID { Ekos::INVALID_VALUE };
168 MANUAL_COVER_CLOSED_LIGHT,
169 MANUAL_COVER_CLOSED_DARK
172 ManualCoverState m_ManualCoverState { MANAUL_COVER_OPEN };
174 bool hasLightBox {
false };
176 bool hasDustCap {
false };
178 bool hasTelescope {
false };
180 bool hasDome {
false };
185 ShutterStatus shutterStatus { SHUTTER_UNKNOWN };
194 void initCapturePreparation();
199 CaptureState getCaptureState()
const
201 return m_CaptureState;
203 void setCaptureState(CaptureState value);
205 bool isStartingCapture()
const
207 return m_StartingCapture;
214 ContinueAction getContinueAction()
const
216 return m_ContinueAction;
223 FocusState getFocusState()
const
227 void setFocusState(FocusState value)
229 m_FocusState = value;
232 GuideState getGuideState()
const
236 void setGuideState(GuideState state);
241 bool isActivelyGuiding();
243 bool useGuideHead()
const
245 return m_useGuideHead;
247 void setUseGuideHead(
bool value)
249 m_useGuideHead = value;
251 bool isGuidingDeviationDetected()
const
253 return m_GuidingDeviationDetected;
260 bool suspendGuidingOnDownload()
const
262 return m_SuspendGuidingOnDownload;
264 void setSuspendGuidingOnDownload(
bool value)
266 m_SuspendGuidingOnDownload = value;
269 int SpikesDetected()
const
271 return m_SpikesDetected;
273 int increaseSpikesDetected()
275 return ++m_SpikesDetected;
277 void resetSpikesDetected()
279 m_SpikesDetected = 0;
282 IPState getDitheringState()
const
284 return m_DitheringState;
286 void setDitheringState(IPState value)
288 m_DitheringState = value;
291 AlignState getAlignState()
const
295 void setAlignState(AlignState value);
297 FilterState getFilterManagerState()
const
299 return m_FilterManagerState;
301 void setFilterManagerState(FilterState value)
303 m_FilterManagerState = value;
306 int getCurrentFilterPosition()
const
308 return m_CurrentFilterPosition;
311 const QString &getCurrentFilterName()
const
313 return m_CurrentFilterName;
316 const QString &CurrentFocusFilterName()
const
318 return m_CurrentFocusFilterName;
323 LightState getLightBoxLightState()
const
325 return m_lightBoxLightState;
327 void setLightBoxLightState(LightState value)
329 m_lightBoxLightState = value;
332 bool lightBoxLightEnabled()
const
334 return m_lightBoxLightEnabled;
336 void setLightBoxLightEnabled(
bool value)
338 m_lightBoxLightEnabled = value;
341 CapState getDustCapState()
const
343 return m_dustCapState;
345 void setDustCapState(CapState value)
347 m_dustCapState = value;
350 ISD::Mount::Status getScopeState()
const
354 void setScopeState(ISD::Mount::Status value)
356 m_scopeState = value;
359 ISD::Mount::PierSide getPierSide()
const
363 void setPierSide(ISD::Mount::PierSide value)
368 ISD::ParkStatus getScopeParkState()
const
370 return m_scopeParkState;
372 void setScopeParkState(ISD::ParkStatus value)
374 m_scopeParkState = value;
377 ISD::Dome::Status getDomeState()
const
381 void setDomeState(ISD::Dome::Status value)
391 return m_refocusState;
394 const QString &observerName()
const
396 return m_ObserverName;
398 void setObserverName(
const QString &value);
400 bool ignoreJobProgress()
const
402 return m_ignoreJobProgress;
404 void setIgnoreJobProgress(
bool value)
406 m_ignoreJobProgress = value;
409 bool isRememberFastExposure()
const
411 return m_RememberFastExposure;
413 void setRememberFastExposure(
bool value)
415 m_RememberFastExposure = value;
422 void setDirty(
bool value)
431 void setBusy(
bool busy);
433 bool isLooping()
const
444 return m_SequenceArray;
448 m_SequenceArray = value;
455 int getAlignmentRetries()
const
457 return m_AlignmentRetries;
459 int increaseAlignmentRetries()
461 return ++m_AlignmentRetries;
463 void resetAlignmentRetries()
465 m_AlignmentRetries = 0;
468 int getDitherCounter()
const
470 return m_ditherCounter;
472 void decreaseDitherCounter();
478 void resetDitherCounter();
485 void checkSeqBoundary();
487 int nextSequenceID()
const
489 return m_nextSequenceID;
491 void setNextSequenceID(
int id)
493 m_nextSequenceID = id;
496 uint16_t capturedFramesCount(
const QString &signature)
const
498 return m_capturedFramesMap[signature];
500 void setCapturedFramesCount(
const QString &signature, uint16_t count);
502 double lastRemainingFrameTimeMS()
const
504 return m_lastRemainingFrameTimeMS;
506 void setLastRemainingFrameTimeMS(
double value)
508 m_lastRemainingFrameTimeMS = value;
514 QTimer &getCaptureTimeout()
516 return m_captureTimeout;
518 uint8_t captureTimeoutCounter()
const
520 return m_CaptureTimeoutCounter;
522 void setCaptureTimeoutCounter(uint8_t value)
524 m_CaptureTimeoutCounter = value;
526 uint8_t deviceRestartCounter()
const
528 return m_DeviceRestartCounter;
530 void setDeviceRestartCounter(uint8_t value)
532 m_DeviceRestartCounter = value;
534 QTimer &downloadProgressTimer()
536 return m_downloadProgressTimer;
540 return m_DownloadTimer;
542 QTimer &getCaptureDelayTimer()
544 return m_captureDelayTimer;
546 QTimer &getGuideDeviationTimer()
548 return m_guideDeviationTimer;
551 QTime &imageCountDown()
553 return m_imageCountDown;
555 void imageCountDownAddMSecs(
int value)
557 m_imageCountDown = m_imageCountDown.
addMSecs(value);
560 QTime &sequenceCountDown()
562 return m_sequenceCountDown;
564 void sequenceCountDownAddMSecs(
int value)
566 m_sequenceCountDown = m_sequenceCountDown.
addMSecs(value);
594 bool checkDithering();
596 bool checkCapturing()
604 void updateMFMountState(MeridianFlipState::MeridianFlipMountState status);
609 void updateMeridianFlipStage(
const MeridianFlipState::MFStage &stage);
615 bool checkMeridianFlipActive();
621 bool checkMeridianFlipReady();
628 bool checkPostMeridianFlipActions();
635 bool checkAlignmentAfterFlip();
640 void checkGuideDeviationTimeout();
648 bool checkGuidingAfterFlip();
660 void processGuidingFailed();
665 void updateFocusState(FocusState state);
671 bool checkFocusRunning()
673 return (m_FocusState != FOCUS_IDLE && m_FocusState != FOCUS_COMPLETE && m_FocusState != FOCUS_ABORTED);
681 AutofocusReason getAFReason(RefocusState::RefocusReason state,
QString &reasonInfo);
687 bool startFocusIfRequired();
694 void updateAdaptiveFocusState(
bool success);
699 void updateHFRThreshold();
723 void addDownloadTime(
double time);
729 double averageDownloadTime()
731 return (downloadsCounter == 0 ? 0 : totalDownloadTime / downloadsCounter);
751 void checkSeqBoundary(
QUrl sequenceURL);
756 bool isModelinDSLRInfo(
const QString &model);
770 int pendingJobCount();
789 CCDFrameType jobFrameType(
int id);
795 int jobImageProgress(
int id);
801 int jobImageCount(
int id);
807 double jobExposureProgress(
int id);
813 double jobExposureDuration(
int id);
818 double progressPercentage();
823 int activeJobRemainingTime();
828 int overallRemainingTime();
846 void setCalibrationSettings(
const QJsonObject &settings);
851 bool hasCapturedFramesMap()
853 return m_capturedFramesMap.
count() > 0;
858 void addCapturedFrame(
const QString &signature);
862 void removeCapturedFrameCount(
const QString &signature, uint16_t count);
866 void clearCapturedFramesMap()
868 m_capturedFramesMap.
clear();
871 bool isCaptureRunning()
876 ScriptTypes captureScriptType()
const
878 return m_CaptureScriptType;
880 void setCaptureScriptType(ScriptTypes value)
882 m_CaptureScriptType = value;
884 double targetADU()
const
888 void setTargetADU(
double value)
892 double targetADUTolerance()
const
894 return m_TargetADUTolerance;
896 void setTargetADUTolerance(
double value)
898 m_TargetADUTolerance = value;
904 void setSkyFlat(
bool enabled)
916 const DoubleRange &exposureRange()
const
918 return m_ExposureRange;
920 void setExposureRange(
double min,
double max)
922 m_ExposureRange.min = min;
923 m_ExposureRange.max = max;
928 return m_frameSettings;
932 m_frameSettings = value;
935 FlatFieldDuration flatFieldDuration()
const
937 return m_flatFieldDuration;
939 void setFlatFieldDuration(FlatFieldDuration value)
941 m_flatFieldDuration = value;
944 uint32_t calibrationPreAction()
const
946 return m_CalibrationPreAction;
948 void setCalibrationPreAction(uint32_t value)
950 m_CalibrationPreAction = value;
960 void captureBusy(
bool busy);
963 void suspendCapture();
964 void executeActiveJob();
965 void updatePrepareState(CaptureState state);
966 void captureStarted(CAPTUREResult
rc);
968 void newMeridianFlipStage(MeridianFlipState::MFStage status);
970 void meridianFlipStarted();
974 void guideAfterMeridianFlip();
978 void newFocusStatus(FocusState status);
980 void newAdaptiveFocusStatus(
bool success);
982 void checkFocus(
double hfr);
988 void adaptiveFocus();
990 void abortFastExposure();
992 void newLimitFocusHFR(
double hfr);
994 void newFilterPosition(
int targetFilterPosition, FilterManager::FilterPolicy policy = FilterManager::ALL_POLICIES);
996 void sequenceChanged(
const QJsonArray &sequence);
998 void newLog(
const QString &text);
1014 int m_CurrentFilterPosition { -1 };
1016 QString m_CurrentFilterName {
"--" };
1018 QString m_CurrentFocusFilterName {
"--" };
1022 bool m_StartingCapture {
true };
1024 bool m_useGuideHead {
false };
1026 bool m_GuidingDeviationDetected {
false };
1028 bool m_SuspendGuidingOnDownload {
false };
1030 int m_SpikesDetected { 0 };
1032 QTimer m_guideDeviationTimer;
1035 uint8_t m_CaptureTimeoutCounter { 0 };
1036 uint8_t m_DeviceRestartCounter { 0 };
1038 QTime m_imageCountDown;
1039 double m_lastRemainingFrameTimeMS;
1042 QTimer m_captureDelayTimer;
1044 QTime m_sequenceCountDown;
1046 QTimer m_downloadProgressTimer;
1050 double totalDownloadTime {0};
1052 uint downloadsCounter {0};
1054 int m_nextSequenceID { 0 };
1056 ContinueAction m_ContinueAction { CONTINUE_ACTION_NONE };
1060 bool m_ignoreJobProgress {
true };
1062 bool m_RememberFastExposure {
false};
1064 bool m_Dirty {
false };
1066 bool m_Busy {
false };
1068 bool m_Looping {
false };
1070 ScriptTypes m_CaptureScriptType { SCRIPT_N };
1072 double m_TargetADUTolerance { 1000 };
1073 double m_targetADU { 0 };
1074 bool m_skyFlat {
false };
1076 FlatFieldDuration m_flatFieldDuration { DURATION_MANUAL };
1077 uint32_t m_CalibrationPreAction { ACTION_NONE };
1078 bool m_lightBoxLightEnabled {
false };
1080 DoubleRange m_ExposureRange;
1088 FocusState m_FocusState { FOCUS_IDLE };
1089 GuideState m_GuideState { GUIDE_IDLE };
1090 IPState m_DitheringState {
IPS_IDLE};
1092 FilterState m_FilterManagerState { FILTER_IDLE };
1093 LightState m_lightBoxLightState { CAP_LIGHT_UNKNOWN };
1094 CapState m_dustCapState { CAP_UNKNOWN };
1095 ISD::Mount::Status m_scopeState { ISD::Mount::MOUNT_IDLE };
1096 ISD::Mount::PierSide m_pierSide { ISD::Mount::PIER_UNKNOWN };
1097 ISD::ParkStatus m_scopeParkState { ISD::PARK_UNKNOWN };
1098 ISD::Dome::Status m_domeState { ISD::Dome::DOME_IDLE };
1104 int m_AlignmentRetries { 0 };
1106 uint m_ditherCounter { 0 };
1116 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.
CaptureState
Capture states.
size_type count() const const
QObject * parent() const const
QTime addMSecs(int ms) const const