7#include "sequencejobstate.h"
10#include "kstarsdata.h"
12#include "ekos/auxiliary/rotatorutils.h"
21void SequenceJobState::setFrameType(CCDFrameType frameType)
24 m_frameType = frameType;
26 m_PreparationState = PREP_NONE;
29void SequenceJobState::initPreparation(
bool isPreview)
33 wpScopeStatus = WP_NONE;
39 if (m_status == JOB_BUSY &&
enforceCCDTemp == m_enforceTemperature)
55 prepareRotatorCheck();
60 m_PreparationState = PREP_BUSY;
62 checkAllActionsReady();
68 if (m_status == JOB_BUSY &&
enforceCCDTemp == m_enforceTemperature)
84 m_PreparationState = PREP_BUSY;
86 checkAllActionsReady();
92 if (m_status == JOB_BUSY &&
enforceCCDTemp == m_enforceTemperature)
108 m_PreparationState = PREP_BUSY;
110 checkAllActionsReady();
120 m_PreparationState = PREP_INIT_CAPTURE;
125 prepareTargetFilter(frameType,
isPreview);
126 checkAllActionsReady();
128 return areActionsReady();
131bool SequenceJobState::areActionsReady()
133 for (
bool &ready : prepareActions.values())
142void SequenceJobState::checkAllActionsReady()
144 switch (m_PreparationState)
151 if (areActionsReady())
154 if (checkLightFrameScopeCoverOpen() !=
IPS_OK)
157 m_PreparationState = PREP_COMPLETED;
158 emit prepareComplete();
162 if (!areActionsReady())
166 if (checkFlatsCoverReady() !=
IPS_OK)
173 if (checkFlatSyncFocus() !=
IPS_OK)
177 if (m_PreparationState == PREP_BUSY)
179 m_PreparationState = PREP_COMPLETED;
180 emit prepareComplete();
186 if (!areActionsReady())
190 if (checkDarksCoverReady() !=
IPS_OK)
194 if (m_PreparationState == PREP_BUSY)
196 m_PreparationState = PREP_COMPLETED;
197 emit prepareComplete();
202 emit prepareComplete();
208 case PREP_INIT_CAPTURE:
209 if (areActionsReady())
212 m_PreparationState = PREP_NONE;
213 emit initCaptureComplete(m_fitsMode);
224void SequenceJobState::setAllActionsReady()
234 for (CaptureModuleState::PrepareActions action :
236 CaptureModuleState::ACTION_FILTER, CaptureModuleState::ACTION_ROTATOR, CaptureModuleState::ACTION_TEMPERATURE
238 setInitialized(action,
false);
241void SequenceJobState::prepareTargetFilter(CCDFrameType frameType,
bool isPreview)
243 if (targetFilterID != INVALID_VALUE)
245 if (isInitialized(CaptureModuleState::ACTION_FILTER) ==
false)
247 prepareActions[CaptureModuleState::ACTION_FILTER] =
false;
250 if (
isPreview || frameType != FRAME_LIGHT || autoFocusReady ==
false)
251 m_filterPolicy =
static_cast<FilterManager::FilterPolicy
>(m_filterPolicy & ~FilterManager::AUTOFOCUS_POLICY);
253 emit readFilterPosition();
255 else if (targetFilterID != m_CaptureModuleState->currentFilterID)
258 prepareActions[CaptureModuleState::ACTION_FILTER] =
false;
261 m_filterPolicy = FilterManager::ALL_POLICIES;
264 if (
isPreview || frameType != FRAME_LIGHT || autoFocusReady ==
false)
265 m_filterPolicy =
static_cast<FilterManager::FilterPolicy
>(m_filterPolicy & ~FilterManager::AUTOFOCUS_POLICY);
267 emit changeFilterPosition(targetFilterID, m_filterPolicy);
273void SequenceJobState::prepareTemperatureCheck(
bool enforceCCDTemp)
278 if (m_enforceTemperature)
280 prepareActions[CaptureModuleState::ACTION_TEMPERATURE] =
false;
281 if (isInitialized(CaptureModuleState::ACTION_TEMPERATURE))
285 ignoreNextValue[CaptureModuleState::ACTION_TEMPERATURE] =
true;
287 emit setCCDTemperature(targetTemperature);
297void SequenceJobState::prepareRotatorCheck()
299 if (targetPositionAngle > Ekos::INVALID_VALUE)
301 if (isInitialized(CaptureModuleState::ACTION_ROTATOR))
303 prepareActions[CaptureModuleState::ACTION_ROTATOR] =
false;
304 double rawAngle = RotatorUtils::Instance()->calcRotatorAngle(targetPositionAngle);
314IPState SequenceJobState::checkCalibrationPreActionsReady()
318 if (m_CalibrationPreAction & ACTION_WALL)
319 result = checkWallPositionReady(FRAME_FLAT);
324 if (m_CalibrationPreAction & ACTION_PARK_MOUNT)
325 result = checkPreMountParkReady();
330 if (m_CalibrationPreAction & ACTION_PARK_DOME)
331 result = checkPreDomeParkReady();
336IPState SequenceJobState::checkFlatsCoverReady()
338 auto result = checkCalibrationPreActionsReady();
341 if (m_CaptureModuleState->hasDustCap && m_CaptureModuleState->hasLightBox)
342 return checkDustCapReady(FRAME_FLAT);
344 else if (m_CalibrationPreAction & ACTION_WALL)
349 if (m_CaptureModuleState->hasLightBox)
350 return checkDustCapReady(FRAME_FLAT);
352 return checkManualCoverReady(
true);
359IPState SequenceJobState::checkDarksCoverReady()
361 IPState result = checkCalibrationPreActionsReady();;
366 result = checkHasShutter();
370 if (m_CaptureModuleState->hasDustCap)
371 return checkDustCapReady(FRAME_DARK);
373 else if (m_CalibrationPreAction & ACTION_WALL)
376 return checkManualCoverReady(
false);
384 if (
lightSourceRequired && m_CaptureModuleState->m_ManualCoverState != CaptureModuleState::MANUAL_COVER_CLOSED_LIGHT)
386 if (coverQueryState == CAL_CHECK_CONFIRMATION)
390 emit askManualScopeCover(
i18n(
"Cover the telescope with an evenly illuminated light source."),
391 i18n(
"Flat Frame"),
true);
392 coverQueryState = CAL_CHECK_CONFIRMATION;
396 else if (!
lightSourceRequired && m_CaptureModuleState->m_ManualCoverState != CaptureModuleState::MANUAL_COVER_CLOSED_DARK &&
397 m_CaptureModuleState->shutterStatus == CaptureModuleState::SHUTTER_NO)
399 if (coverQueryState == CAL_CHECK_CONFIRMATION)
402 emit askManualScopeCover(
i18n(
"Cover the telescope in order to take a dark exposure."),
403 i18n(
"Dark Exposure"),
false);
405 coverQueryState = CAL_CHECK_CONFIRMATION;
412IPState SequenceJobState::checkDustCapReady(CCDFrameType frameType)
415 if (m_CaptureModuleState->getLightBoxLightState() == CaptureModuleState::CAP_LIGHT_BUSY ||
416 m_CaptureModuleState->getDustCapState() == CaptureModuleState::CAP_PARKING ||
417 m_CaptureModuleState->getDustCapState() == CaptureModuleState::CAP_UNPARKING)
420 if (m_CaptureModuleState->getDustCapState() == CaptureModuleState::CAP_ERROR)
428 if (m_CaptureModuleState->hasDustCap && m_CaptureModuleState->getDustCapState() !=
targetCapState)
430 m_CaptureModuleState->setDustCapState(
captureLights ? CaptureModuleState::CAP_UNPARKING : CaptureModuleState::CAP_PARKING);
438 CaptureModuleState::CAP_LIGHT_OFF;
440 if (m_CaptureModuleState->hasLightBox && m_CaptureModuleState->getLightBoxLightState() !=
targetLightBoxStatus)
442 m_CaptureModuleState->setLightBoxLightState(CaptureModuleState::CAP_LIGHT_BUSY);
452IPState SequenceJobState::checkWallPositionReady(CCDFrameType
frametype)
454 if (m_CaptureModuleState->hasTelescope)
456 if (wpScopeStatus < WP_SLEWING)
459 KStarsData::Instance()->
geo()->lat());
460 wpScopeStatus = WP_SLEWING;
461 emit slewTelescope(wallCoord);
462 emit newLog(
i18n(
"Mount slewing to wall position (az =%1 alt =%2)",
463 wallCoord.
alt().toDMSString(), wallCoord.
az().toDMSString()));
467 else if (wpScopeStatus == WP_SLEWING || wpScopeStatus == WP_TRACKING_BUSY)
470 else if (wpScopeStatus == WP_SLEW_COMPLETED)
472 wpScopeStatus = WP_TRACKING_BUSY;
473 emit setScopeTracking(
false);
474 emit newLog(
i18n(
"Slew to wall position complete, stop tracking."));
477 else if (wpScopeStatus == WP_TRACKING_OFF)
478 emit newLog(
i18n(
"Slew to wall position complete, tracking stopped."));
483 CaptureModuleState::CAP_LIGHT_OFF);
485 if (m_CaptureModuleState->hasLightBox ==
true)
489 m_CaptureModuleState->setLightBoxLightState(CaptureModuleState::CAP_LIGHT_BUSY);
500IPState SequenceJobState::checkPreMountParkReady()
502 if (m_CaptureModuleState->hasTelescope)
504 if (m_CaptureModuleState->getScopeParkState() == ISD::PARK_ERROR)
506 emit newLog(
i18n(
"Parking mount failed, aborting..."));
510 else if (m_CaptureModuleState->getScopeParkState() == ISD::PARK_PARKING)
512 else if (m_CaptureModuleState->getScopeParkState() != ISD::PARK_PARKED)
514 m_CaptureModuleState->setScopeParkState(ISD::PARK_PARKING);
515 emit setScopeParked(
true);
516 emit newLog(
i18n(
"Parking mount prior to calibration frames capture..."));
524IPState SequenceJobState::checkPreDomeParkReady()
526 if (m_CaptureModuleState->hasDome)
528 if (m_CaptureModuleState->getDomeState() == ISD::Dome::DOME_ERROR)
530 emit newLog(
i18n(
"Parking dome failed, aborting..."));
534 else if (m_CaptureModuleState->getDomeState() == ISD::Dome::DOME_PARKING)
536 else if (m_CaptureModuleState->getDomeState() != ISD::Dome::DOME_PARKED)
538 m_CaptureModuleState->setDomeState(ISD::Dome::DOME_PARKING);
539 emit setDomeParked(
true);
540 emit newLog(
i18n(
"Parking dome prior to calibration frames capture..."));
548IPState SequenceJobState::checkFlatSyncFocus()
551 if (flatSyncStatus == FS_BUSY)
556 emit flatSyncFocus(targetFilterID);
561 if (m_frameType == FRAME_FLAT && Options::flatSyncFocus() && flatSyncStatus != FS_COMPLETED)
563 flatSyncStatus = FS_BUSY;
564 emit flatSyncFocus(targetFilterID);
571IPState SequenceJobState::checkHasShutter()
573 if (m_CaptureModuleState->shutterStatus == CaptureModuleState::SHUTTER_BUSY)
575 if (m_CaptureModuleState->shutterStatus != CaptureModuleState::SHUTTER_UNKNOWN)
578 m_CaptureModuleState->shutterStatus = CaptureModuleState::SHUTTER_BUSY;
579 emit queryHasShutter();
583IPState SequenceJobState::checkLightFrameScopeCoverOpen()
586 if (m_CaptureModuleState->hasLightBox && m_CaptureModuleState->getLightBoxLightState() != CaptureModuleState::CAP_LIGHT_OFF)
588 if (m_CaptureModuleState->getLightBoxLightState() != CaptureModuleState::CAP_LIGHT_BUSY)
590 m_CaptureModuleState->setLightBoxLightState(CaptureModuleState::CAP_LIGHT_BUSY);
591 emit setLightBoxLight(
false);
592 emit newLog(
i18n(
"Turn light box light off..."));
598 if (m_CaptureModuleState->hasDustCap)
600 if (m_CaptureModuleState->getDustCapState() != CaptureModuleState::CAP_IDLE)
602 if (m_CaptureModuleState->getDustCapState() != CaptureModuleState::CAP_UNPARKING)
604 m_CaptureModuleState->setDustCapState(CaptureModuleState::CAP_UNPARKING);
605 emit parkDustCap(
false);
606 emit newLog(
i18n(
"Unparking dust cap..."));
616 if (m_CaptureModuleState->m_ManualCoverState != CaptureModuleState::MANAUL_COVER_OPEN)
621 if (coverQueryState == CAL_CHECK_CONFIRMATION)
624 emit askManualScopeOpen(m_CaptureModuleState->m_ManualCoverState == CaptureModuleState::MANUAL_COVER_CLOSED_LIGHT);
633bool SequenceJobState::isInitialized(CaptureModuleState::PrepareActions action)
635 return m_CaptureModuleState.
data()->isInitialized[action];
638void SequenceJobState::setInitialized(CaptureModuleState::PrepareActions action,
bool init)
640 m_CaptureModuleState.
data()->isInitialized[action] =
init;
643void SequenceJobState::setCurrentFilterID(
int value)
645 m_CaptureModuleState->currentFilterID = value;
646 if (isInitialized(CaptureModuleState::ACTION_FILTER) ==
false && value != targetFilterID)
650 prepareActions[CaptureModuleState::ACTION_FILTER] =
false;
652 emit changeFilterPosition(targetFilterID, m_filterPolicy);
655 setInitialized(CaptureModuleState::ACTION_FILTER,
true);
657 if (value == targetFilterID)
658 prepareActions[CaptureModuleState::ACTION_FILTER] =
true;
660 checkAllActionsReady();
663void SequenceJobState::setCurrentCCDTemperature(
double currentTemperature)
666 if (ignoreNextValue[CaptureModuleState::ACTION_TEMPERATURE])
668 ignoreNextValue[CaptureModuleState::ACTION_TEMPERATURE] =
false;
672 if (isInitialized(CaptureModuleState::ACTION_TEMPERATURE))
674 if (m_enforceTemperature ==
false
675 ||
fabs(targetTemperature - currentTemperature) <= Options::maxTemperatureDiff())
676 prepareActions[CaptureModuleState::ACTION_TEMPERATURE] =
true;
678 checkAllActionsReady();
682 setInitialized(CaptureModuleState::ACTION_TEMPERATURE,
true);
683 if (m_enforceTemperature ==
false
684 ||
fabs(targetTemperature - currentTemperature) <= Options::maxTemperatureDiff())
686 prepareActions[CaptureModuleState::ACTION_TEMPERATURE] =
true;
687 checkAllActionsReady();
691 prepareTemperatureCheck(m_enforceTemperature);
696void SequenceJobState::setCurrentRotatorPositionAngle(
double rotatorAngle, IPState state)
700 if (isInitialized(CaptureModuleState::ACTION_ROTATOR))
706 prepareActions[CaptureModuleState::ACTION_ROTATOR] =
true;
708 checkAllActionsReady();
712 setInitialized(CaptureModuleState::ACTION_ROTATOR,
true);
716 prepareActions[CaptureModuleState::ACTION_ROTATOR] =
true;
717 checkAllActionsReady();
721 prepareRotatorCheck();
726void SequenceJobState::setFocusStatus(FocusState state)
732 if (prepareActions[CaptureModuleState::ACTION_AUTOFOCUS] ==
false)
734 prepareActions[CaptureModuleState::ACTION_AUTOFOCUS] =
true;
735 checkAllActionsReady();
741 emit prepareComplete(
false);
749void SequenceJobState::updateManualScopeCover(
bool closed,
bool success,
bool light)
755 m_CaptureModuleState->m_ManualCoverState = light ? CaptureModuleState::MANUAL_COVER_CLOSED_LIGHT :
756 CaptureModuleState::MANUAL_COVER_CLOSED_DARK;
758 m_CaptureModuleState->m_ManualCoverState = CaptureModuleState::MANAUL_COVER_OPEN;
759 coverQueryState = CAL_CHECK_TASK;
761 checkAllActionsReady();
766 m_CaptureModuleState->shutterStatus = CaptureModuleState::SHUTTER_UNKNOWN;
767 coverQueryState = CAL_CHECK_TASK;
773void SequenceJobState::lightBoxLight(
bool on)
775 m_CaptureModuleState->setLightBoxLightState(on ? CaptureModuleState::CAP_LIGHT_ON : CaptureModuleState::CAP_LIGHT_OFF);
776 emit newLog(
i18n(on ?
"Light box on." :
"Light box off."));
778 checkAllActionsReady();
781void SequenceJobState::dustCapStateChanged(ISD::DustCap::Status status)
785 case ISD::DustCap::CAP_ERROR:
786 m_CaptureModuleState->setDustCapState(CaptureModuleState::CAP_ERROR);
789 case ISD::DustCap::CAP_PARKED:
790 m_CaptureModuleState->setDustCapState(CaptureModuleState::CAP_PARKED);
791 emit newLog(
i18n(
"Dust cap parked."));
793 case ISD::DustCap::CAP_IDLE:
794 m_CaptureModuleState->setDustCapState(CaptureModuleState::CAP_IDLE);
795 emit newLog(
i18n(
"Dust cap unparked."));
797 case ISD::DustCap::CAP_UNPARKING:
798 m_CaptureModuleState->setDustCapState(CaptureModuleState::CAP_UNPARKING);
800 case ISD::DustCap::CAP_PARKING:
801 m_CaptureModuleState->setDustCapState(CaptureModuleState::CAP_PARKING);
806 checkAllActionsReady();
809void SequenceJobState::scopeStatusChanged(ISD::Mount::Status status)
814 case ISD::Mount::MOUNT_TRACKING:
815 if (wpScopeStatus == WP_SLEWING)
816 wpScopeStatus = WP_SLEW_COMPLETED;
818 case ISD::Mount::MOUNT_IDLE:
819 if (wpScopeStatus == WP_SLEWING || wpScopeStatus == WP_TRACKING_BUSY)
820 wpScopeStatus = WP_TRACKING_OFF;
826 m_CaptureModuleState->setScopeState(status);
828 checkAllActionsReady();
831void SequenceJobState::scopeParkStatusChanged(ISD::ParkStatus status)
833 m_CaptureModuleState->setScopeParkState(status);
835 checkAllActionsReady();
838void SequenceJobState::domeStatusChanged(ISD::Dome::Status status)
840 m_CaptureModuleState->setDomeState(status);
842 checkAllActionsReady();
845void SequenceJobState::flatSyncFocusChanged(
bool completed)
847 flatSyncStatus = (completed ? FS_COMPLETED : FS_BUSY);
849 checkAllActionsReady();
852void SequenceJobState::hasShutter(
bool present)
855 m_CaptureModuleState->shutterStatus = CaptureModuleState::SHUTTER_YES;
857 m_CaptureModuleState->shutterStatus = CaptureModuleState::SHUTTER_NO;
860 checkAllActionsReady();
863SequenceJobState::PreparationState SequenceJobState::getPreparationState()
const
865 return m_PreparationState;
868void SequenceJobState::setFilterStatus(FilterState
filterState)
872 case FILTER_AUTOFOCUS:
874 prepareActions[CaptureModuleState::ACTION_AUTOFOCUS] =
false;
void HorizontalToEquatorial(const dms *LST, const dms *lat)
Determine the (RA, Dec) coordinates of the SkyPoint from its (Altitude, Azimuth) coordinates,...
QString i18n(const char *text, const TYPE &arg...)
Ekos is an advanced Astrophotography tool for Linux.
@ CAPTURE_SETTING_ROTATOR
@ CAPTURE_CHANGING_FILTER
@ CAPTURE_SETTING_TEMPERATURE
GeoCoordinates geo(const QVariant &location)