9#include "cameraprocess.h"
10#include "camerastate.h"
11#include "capturedeviceadaptor.h"
12#include "captureadaptor.h"
13#include "refocusstate.h"
15#include "kstarsdata.h"
17#include "sequencejob.h"
18#include "placeholderpath.h"
19#include "ekos/manager.h"
20#include "ekos/auxiliary/darklibrary.h"
21#include "ekos/auxiliary/profilesettings.h"
22#include "auxiliary/ksmessagebox.h"
24#include "scriptsmanager.h"
25#include "fitsviewer/fitsdata.h"
26#include "indi/driverinfo.h"
27#include "indi/indifilterwheel.h"
28#include "indi/indicamera.h"
29#include "indi/indirotator.h"
30#include "ekos/guide/guide.h"
31#include <basedevice.h>
33#include <ekos_capture_debug.h>
36#define MF_TIMER_TIMEOUT 90000
37#define MF_RA_DIFF_LIMIT 4
42#define KEY_FILTERS "filtersList"
43#define TAB_BUTTON_SIZE 20
52 qRegisterMetaType<CaptureState>(
"CaptureState");
53 qDBusRegisterMetaType<CaptureState>();
54 new CaptureAdaptor(
this);
60 addButton->
setFixedSize(TAB_BUTTON_SIZE, TAB_BUTTON_SIZE);
61 addButton->
setToolTip(
i18n(
"<p>Add additional camera</p><p><b>WARNING</b>: This feature is experimental!</p>"));
64 cameraTabs->addTab(newTab,
"");
81 DarkLibrary::Instance()->setCaptureModule(
this);
88 newCamera.
reset(
new Camera(m_Cameras.
count()));
91 const int tabIndex = cameraTabs->insertTab(std::max(0, cameraTabs->count() - 1), newCamera.
get(),
"new Camera");
92 cameraTabs->setCurrentIndex(tabIndex);
98 closeButton->
setFixedSize(TAB_BUTTON_SIZE, TAB_BUTTON_SIZE);
102 checkCloseCameraTab(tabIndex);
107 connect(newCamera.
get(), &Camera::newLog,
this, &Capture::appendLogText);
109 connect(newCamera.
get(), &Camera::sequenceChanged,
this, &Capture::sequenceChanged);
110 connect(newCamera.
get(), &Camera::newLocalPreview,
this, &Capture::newLocalPreview);
111 connect(newCamera.
get(), &Camera::dslrInfoRequested,
this, &Capture::dslrInfoRequested);
112 connect(newCamera.
get(), &Camera::trainChanged,
this, &Capture::trainChanged);
113 connect(newCamera.
get(), &Camera::settingsUpdated,
this, &Capture::settingsUpdated);
114 connect(newCamera.
get(), &Camera::filterManagerUpdated,
this, &Capture::filterManagerUpdated);
115 connect(newCamera.
get(), &Camera::newFilterStatus,
this, &Capture::newFilterStatus);
116 connect(newCamera.
get(), &Camera::ready,
this, &Capture::ready);
117 connect(newCamera.
get(), &Camera::newExposureProgress,
this, &Capture::newExposureProgress);
118 connect(newCamera.
get(), &Camera::captureComplete,
this, &Capture::captureComplete);
119 connect(newCamera.
get(), &Camera::captureStarting,
this, &Capture::captureStarting);
120 connect(newCamera.
get(), &Camera::captureAborted,
this, &Capture::captureAborted);
121 connect(newCamera.
get(), &Camera::checkFocus,
this, &Capture::checkFocus);
122 connect(newCamera.
get(), &Camera::newImage,
this, &Capture::newImage);
123 connect(newCamera.
get(), &Camera::runAutoFocus,
this, &Capture::runAutoFocus);
124 connect(newCamera.
get(), &Camera::resetFocus,
this, &Capture::resetFocus);
125 connect(newCamera.
get(), &Camera::abortFocus,
this, &Capture::abortFocus);
126 connect(newCamera.
get(), &Camera::adaptiveFocus,
this, &Capture::adaptiveFocus);
127 connect(newCamera.
get(), &Camera::captureTarget,
this, &Capture::captureTarget);
128 connect(newCamera.
get(), &Camera::guideAfterMeridianFlip,
this, &Capture::guideAfterMeridianFlip);
129 connect(newCamera.
get(), &Camera::newStatus,
this, &Capture::newStatus);
130 connect(newCamera.
get(), &Camera::suspendGuiding,
this, &Capture::suspendGuiding);
131 connect(newCamera.
get(), &Camera::resumeGuiding,
this, &Capture::resumeGuiding);
132 connect(newCamera.
get(), &Camera::driverTimedout,
this, &Capture::driverTimedout);
134 m_Cameras.
append(newCamera);
144 if (tabID < cameraTabs->count() && tabID < m_Cameras.
count() && m_Cameras[tabID]->activeCamera() !=
nullptr)
146 auto name = m_Cameras[tabID]->activeCamera()->getDeviceName();
147 cameraTabs->setTabText(tabID, name);
150 qCWarning(KSTARS_EKOS_CAPTURE) <<
"Unknown camera ID:" << tabID;
153 cameraTabs->setTabText(cameraTabs->currentIndex(),
"no camera");
159 return process()->setDome(device);
164 if (mainCamera()->m_standAlone)
166 if (name ==
"Mount" && mountInterface ==
nullptr)
168 qCDebug(KSTARS_EKOS_CAPTURE) <<
"Registering new Module (" << name <<
")";
169 mountInterface =
new QDBusInterface(
"org.kde.kstars",
"/KStars/Ekos/Mount",
176 if (devices()->getActiveCamera())
177 return devices()->getActiveCamera()->getDeviceName();
189 if (!devices()->getActiveCamera())
192 state()->setSuspendGuidingOnDownload((devices()->getActiveCamera()->getChip(
193 ISD::CameraChip::GUIDE_CCD) == guideChip) ||
194 (guideChip->getCCD() == devices()->getActiveCamera() &&
195 devices()->getActiveCamera()->getDriverInfo()->getAuxInfo().value(
"mdpd",
false).toBool()));
200 if (devices()->filterWheel())
201 return devices()->filterWheel()->getDeviceName();
208 if (devices()->filterWheel())
210 mainCamera()->FilterPosCombo->setCurrentText(filter);
219 return mainCamera()->FilterPosCombo->currentText();
224void Capture::appendLogText(
const QString &text)
226 m_LogText.
insert(0,
i18nc(
"log entry; %1 is the date, %2 is the text",
"%1 %2",
227 KStarsData::Instance()->lt().toString(
"yyyy-MM-ddThh:mm:ss"), text));
229 qCInfo(KSTARS_EKOS_CAPTURE) << text;
234void Capture::clearLog()
242 Q_UNUSED(absTemperture);
246 state()->getRefocusState()->setFocusTemperatureDelta(focusTemperatureDelta);
251 const double deviation_rms = std::hypot(delta_ra, delta_dec);
254 state()->setGuideDeviation(deviation_rms);
261 state()->setIgnoreJobProgress(
true);
264void Capture::setAlignStatus(
AlignState newstate)
267 state()->setAlignState(newstate);
270void Capture::setGuideStatus(GuideState newstate)
273 state()->setGuideState(newstate);
278 if (devices()->getActiveCamera() ==
nullptr)
281 return devices()->getActiveCamera()->setStreamLimits(maxBufferSize, maxPreviewFPS);
286 if (i < m_Cameras.
count())
290 qCWarning(KSTARS_EKOS_CAPTURE) <<
"Unknown camera ID:" << i;
295void Ekos::Capture::closeCameraTab(
int tabIndex)
297 cameraTabs->removeTab(tabIndex);
298 camera(tabIndex).clear();
299 m_Cameras.removeAt(tabIndex);
301 cameraTabs->setCurrentIndex(std::max(0, tabIndex - 1));
304void Capture::checkCloseCameraTab(
int tabIndex)
306 if (m_Cameras[tabIndex]->state()->isBusy())
312 m_Cameras[tabIndex]->abort();
313 closeCameraTab(tabIndex);
321 KSMessageBox::Instance()->warningContinueCancel(
i18n(
"Camera %1 is busy. Abort to close?",
322 m_Cameras[tabIndex]->activeCamera()->getDeviceName()),
i18n(
"Stop capturing"), 30,
false,
i18n(
"Abort"));
326 closeCameraTab(tabIndex);
332 if (m_Cameras.
size() > 0)
338void Capture::setMountStatus(ISD::Mount::Status newState)
342 case ISD::Mount::MOUNT_PARKING:
343 case ISD::Mount::MOUNT_SLEWING:
344 case ISD::Mount::MOUNT_MOVING:
345 mainCamera()->previewB->setEnabled(
false);
346 mainCamera()->liveVideoB->setEnabled(
false);
350 if (state()->isBusy() ==
false)
351 mainCamera()->startB->setEnabled(
false);
355 if (state()->isBusy() ==
false)
357 mainCamera()->previewB->setEnabled(
true);
358 if (devices()->getActiveCamera())
359 mainCamera()->liveVideoB->setEnabled(devices()->getActiveCamera()->hasVideoStream());
360 mainCamera()->startB->setEnabled(
true);
367void Capture::setAlignResults(
double solverPA,
double ra,
double de,
double pixscale)
372 if (devices()->rotator() && mainCamera()->m_RotatorControlPanel)
373 mainCamera()->m_RotatorControlPanel->refresh(solverPA);
378 state()->setMeridianFlipState(newstate);
379 connect(state()->getMeridianFlipState().
get(), &MeridianFlipState::newLog,
this, &Capture::appendLogText);
384 return process()->hasCoolerControl();
389 return process()->setCoolerControl(enable);
394 process()->removeDevice(device);
397QString Capture::getTargetName()
400 return activeJob()->getCoreProperty(SequenceJob::SJ_TargetName).
toString();
407 state()->getRefocusState()->setFocusHFR(newHFR, inAutofocus);
bool setVideoLimits(uint16_t maxBufferSize, uint16_t maxPreviewFPS)
setVideoLimits sets the buffer size and max preview fps for live preview
bool setDome(ISD::Dome *device)
setDome Set dome device
void setFocusTemperatureDelta(double focusTemperatureDelta, double absTemperature)
updateAdaptiveFocusStatus Handle new focus state
void updateCamera(int tabID, bool isValid)
Update the camera.
void setHFR(double newHFR, int position, bool inAutofocus)
setHFR Receive the measured HFR value of the latest frame
QSharedPointer< CameraProcess > process() const
process shortcut for the process engine
void setGuideDeviation(double delta_ra, double delta_dec)
setGuideDeviation Set the guiding deviation as measured by the guiding module.
void registerNewModule(const QString &name)
registerNewModule Register an Ekos module as it arrives via DBus and create the appropriate DBus inte...
void removeDevice(const QSharedPointer< ISD::GenericDevice > &device)
Generic method for removing any connected device.
CameraChip class controls a particular chip in camera.
Class handles control of INDI dome devices.
Q_SCRIPTABLE bool hasCoolerControl()
DBUS interface function.
Q_SCRIPTABLE Q_NOREPLY void ignoreSequenceHistory()
DBUS interface function.
Q_SCRIPTABLE bool setCoolerControl(bool enable)
DBUS interface function.
Q_SCRIPTABLE bool setFilter(const QString &filter)
DBUS interface function.
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
Ekos is an advanced Astrophotography tool for Linux.
KIOCORE_EXPORT TransferJob * get(const QUrl &url, LoadType reload=NoReload, JobFlags flags=DefaultFlags)
bool connect(const QString &service, const QString &path, const QString &interface, const QString &name, QObject *receiver, const char *slot)
bool registerObject(const QString &path, QObject *object, RegisterOptions options)
QDBusConnection sessionBus()
QIcon fromTheme(const QString &name)
void append(QList< T > &&value)
qsizetype count() const const
iterator insert(const_iterator before, parameter_type value)
qsizetype size() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
bool disconnect(const QMetaObject::Connection &connection)
QString toString() const const