summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasem Mutlaq <mutlaqja@ikarustech.com>2016-09-11 22:22:03 (GMT)
committerJasem Mutlaq <mutlaqja@ikarustech.com>2016-09-11 22:22:03 (GMT)
commit3954632f283e9cd5ebce3dc73cc1ca5c06a9039f (patch)
treeffc4e7c88dfd3fc32e78af02cac9e00a0a3efde6
parent32fe363e0778a46112bb3da92b4c1e747acd915a (diff)
Added ability to pause sequences and then resume them later. The module now accepts an optional target name which it will append to the root directory of the sequence file. This way the scheduler or other scripts can still use the same sequence files but with different targets
-rw-r--r--kstars/ekos/capture.cpp181
-rw-r--r--kstars/ekos/capture.h47
-rw-r--r--kstars/ekos/capture.ui56
-rw-r--r--kstars/org.kde.kstars.Ekos.Capture.xml8
4 files changed, 238 insertions, 54 deletions
diff --git a/kstars/ekos/capture.cpp b/kstars/ekos/capture.cpp
index c80706b..cc3b0de 100644
--- a/kstars/ekos/capture.cpp
+++ b/kstars/ekos/capture.cpp
@@ -55,10 +55,12 @@ Capture::Capture()
setupUi(this);
new CaptureAdaptor(this);
- QDBusConnection::sessionBus().registerObject("/KStars/Ekos/Capture", this);
+ QDBusConnection::sessionBus().registerObject("/KStars/Ekos/Capture", this);
dirPath = QUrl(QDir::homePath());
+ state = CAPTURE_IDLE;
+
currentCCD = NULL;
currentTelescope = NULL;
currentFilter = NULL;
@@ -112,10 +114,14 @@ Capture::Capture()
seqFileCount = 0;
//seqWatcher = new KDirWatch();
seqTimer = new QTimer(this);
- connect(startB, SIGNAL(clicked()), this, SLOT(start()));
- connect(stopB, SIGNAL(clicked()), this, SLOT(abort()));
connect(seqTimer, SIGNAL(timeout()), this, SLOT(captureImage()));
+ connect(startB, SIGNAL(clicked()), this, SLOT(toggleSequence()));
+ connect(pauseB, SIGNAL(clicked()), this, SLOT(pause()));
+
+ startB->setIcon(QIcon::fromTheme("media-playback-start"));
+ pauseB->setIcon(QIcon::fromTheme("media-playback-pause"));
+
connect(binXIN, SIGNAL(valueChanged(int)), binYIN, SLOT(setValue(int)));
connect(CCDCaptureCombo, SIGNAL(activated(QString)), this, SLOT(setDefaultCCD(QString)));
@@ -214,7 +220,7 @@ void Capture::addCCD(ISD::GDInterface *newCCD)
CCDs.append(ccd);
- CCDCaptureCombo->addItem(ccd->getDeviceName());
+ CCDCaptureCombo->addItem(ccd->getDeviceName());
if (Filters.count() > 0)
syncFilterInfo();
@@ -252,6 +258,45 @@ void Capture::addFilter(ISD::GDInterface *newFilter)
}
+void Capture::pause()
+{
+ pauseFunction=NULL;
+ state = CAPTURE_PAUSED;
+ emit newStatus(Ekos::CAPTURE_PAUSED);
+ appendLogText(i18n("Sequence shall be paused after current exposure is complete."));
+ pauseB->setEnabled(false);
+
+ startB->setIcon(QIcon::fromTheme("media-playback-start"));
+ startB->setToolTip(i18n("Resume Sequence"));
+}
+
+void Capture::toggleSequence()
+{
+ if (state == CAPTURE_PAUSED)
+ {
+ startB->setIcon(QIcon::fromTheme("media-playback-stop"));
+ startB->setToolTip(i18n("Stop Sequence"));
+ pauseB->setEnabled(true);
+
+ state = CAPTURE_CAPTURING;
+ emit newStatus(Ekos::CAPTURE_CAPTURING);
+
+ appendLogText(i18n("Sequence resumed."));
+
+ // Call from where ever we have left of when we paused
+ if (pauseFunction)
+ (this->*pauseFunction)();
+ }
+ else if (state == CAPTURE_IDLE)
+ {
+ start();
+ }
+ else
+ {
+ abort();
+ }
+}
+
void Capture::start()
{
if (darkSubCheck->isChecked())
@@ -325,13 +370,18 @@ void Capture::start()
}
}*/
+ state = CAPTURE_PROGRESS;
emit newStatus(Ekos::CAPTURE_PROGRESS);
+ startB->setIcon(QIcon::fromTheme("media-playback-stop"));
+ startB->setToolTip(i18n("Stop Sequence"));
+ pauseB->setEnabled(true);
+
prepareJob(first_job);
}
-void Capture::abort()
+void Capture::stop(bool abort)
{
retries = 0;
@@ -357,6 +407,8 @@ void Capture::abort()
activeJob->reset();
}
+ state = CAPTURE_IDLE;
+
// Turn off any calibration light, IF they were turned on by Capture module
if (dustCap && dustCapLightEnabled)
{
@@ -372,7 +424,7 @@ void Capture::abort()
secondsLabel->clear();
disconnect(currentCCD, SIGNAL(BLOBUpdated(IBLOB*)), this, SLOT(newFITS(IBLOB*)));
disconnect(currentCCD, SIGNAL(newImage(QImage*,ISD::CCDChip*)), this, SLOT(sendNewImage(QImage*,ISD::CCDChip*)));
- disconnect(currentCCD, SIGNAL(newExposureValue(ISD::CCDChip*,double, IPState)), this, SLOT(updateCaptureProgress(ISD::CCDChip*,double,IPState)));
+ disconnect(currentCCD, SIGNAL(newExposureValue(ISD::CCDChip*,double, IPState)), this, SLOT(updateCaptureProgress(ISD::CCDChip*,double,IPState)));
currentCCD->setFITSDir("");
@@ -385,6 +437,13 @@ void Capture::abort()
setBusy(false);
+ if (abort)
+ {
+ startB->setIcon(QIcon::fromTheme("media-playback-start"));
+ startB->setToolTip(i18n("Start Sequence"));
+ pauseB->setEnabled(false);
+ }
+
seqTimer->stop();
}
@@ -425,7 +484,7 @@ void Capture::checkCCD(int ccdNum)
}
if (ccdNum <= CCDs.count())
- {
+ {
// Check whether main camera or guide head only
currentCCD = CCDs.at(ccdNum);
@@ -541,7 +600,7 @@ void Capture::updateFrameProperties(bool reset)
exposureIN->setMinimum(min);
exposureIN->setMaximum(max);
exposureIN->setSingleStep(step);
- }
+ }
if (currentCCD->getMinMaxStep(frameProp, "WIDTH", &min, &max, &step))
{
@@ -797,15 +856,26 @@ void Capture::syncFilterInfo()
}
}
-void Capture::startNextExposure()
+bool Capture::startNextExposure()
{
+ if (state == CAPTURE_PAUSED)
+ {
+ pauseFunction = &Capture::startNextExposure;
+ appendLogText(i18n("Sequence paused."));
+ secondsLabel->setText(i18n("Paused..."));
+ return false;
+ }
+
if (seqDelay > 0)
{
secondsLabel->setText(i18n("Waiting..."));
+ state = CAPTURE_WAITING;
emit newStatus(Ekos::CAPTURE_WAITING);
}
seqTimer->start(seqDelay);
+
+ return true;
}
void Capture::newFITS(IBLOB *bp)
@@ -841,7 +911,8 @@ void Capture::newFITS(IBLOB *bp)
previewB->setEnabled(true);
// If the FITS is not for our device, simply ignore
- if (QString(bp->bvp->device) != currentCCD->getDeviceName() || (startB->isEnabled() && previewB->isEnabled()))
+ //if (QString(bp->bvp->device) != currentCCD->getDeviceName() || (startB->isEnabled() && previewB->isEnabled()))
+ if (QString(bp->bvp->device) != currentCCD->getDeviceName() || state == CAPTURE_IDLE)
return;
disconnect(currentCCD, SIGNAL(BLOBUpdated(IBLOB*)), this, SLOT(newFITS(IBLOB*)));
@@ -872,7 +943,7 @@ void Capture::newFITS(IBLOB *bp)
}
-void Capture::setCaptureComplete()
+bool Capture::setCaptureComplete()
{
disconnect(currentCCD, SIGNAL(newExposureValue(ISD::CCDChip*,double,IPState)), this, SLOT(updateCaptureProgress(ISD::CCDChip*,double,IPState)));
DarkLibrary::Instance()->disconnect(this);
@@ -883,16 +954,24 @@ void Capture::setCaptureComplete()
{
jobs.removeOne(activeJob);
delete(activeJob);
- // Reste active job pointer
+ // Reset active job pointer
activeJob = NULL;
abort();
- return;
+ return true;
+ }
+
+ if (state == CAPTURE_PAUSED)
+ {
+ pauseFunction = &Capture::setCaptureComplete;
+ appendLogText(i18n("Sequence paused."));
+ secondsLabel->setText(i18n("Paused..."));
+ return false;
}
if (activeJob->getFrameType() != FRAME_LIGHT)
{
if (processPostCaptureCalibrationStage() == false)
- return;
+ return true;
if (calibrationStage == CAL_CALIBRATION_COMPLETE)
calibrationStage = CAL_CAPTURING;
@@ -904,6 +983,7 @@ void Capture::setCaptureComplete()
appendLogText(i18n("Received image %1 out of %2.", seqCurrentCount, seqTotalCount));
+ state = CAPTURE_IMAGE_RECEIVED;
emit newStatus(Ekos::CAPTURE_IMAGE_RECEIVED);
currentImgCountOUT->setText( QString::number(seqCurrentCount));
@@ -912,12 +992,12 @@ void Capture::setCaptureComplete()
if (seqCurrentCount >= seqTotalCount)
{
processJobCompletion();
- return;
+ return true;
}
// Check if meridian condition is met
if (checkMeridianFlip())
- return;
+ return true;
// FIXME remove post capture script later
if (Options::postCaptureScript().isEmpty() == false)
@@ -927,13 +1007,15 @@ void Capture::setCaptureComplete()
}
else
resumeSequence();
+
+ return true;
}
void Capture::processJobCompletion()
{
activeJob->done();
- abort();
+ stop();
// Check if meridian condition is met
if (checkMeridianFlip())
@@ -947,6 +1029,9 @@ void Capture::processJobCompletion()
{
KNotification::event( QLatin1String( "CaptureSuccessful"), i18n("CCD capture sequence completed"));
+ abort();
+
+ state = CAPTURE_COMPLETE;
emit newStatus(Ekos::CAPTURE_COMPLETE);
if (parkCheck->isChecked() && currentTelescope && currentTelescope->canPark())
@@ -966,6 +1051,14 @@ void Capture::processJobCompletion()
bool Capture::resumeSequence()
{
+ if (state == CAPTURE_PAUSED)
+ {
+ pauseFunction = &Capture::resumeSequence;
+ appendLogText(i18n("Sequence paused."));
+ secondsLabel->setText(i18n("Paused..."));
+ return false;
+ }
+
// If seqTotalCount is zero, we have to find if there are more pending jobs in the queue
if (seqTotalCount == 0)
{
@@ -1015,6 +1108,7 @@ bool Capture::resumeSequence()
secondsLabel->setText(i18n("Dithering..."));
emit exposureComplete();
+ state = CAPTURE_DITHERING;
emit newStatus(Ekos::CAPTURE_DITHERING);
}
else if (isAutoFocus && activeJob->getFrameType() == FRAME_LIGHT)
@@ -1022,13 +1116,14 @@ bool Capture::resumeSequence()
secondsLabel->setText(i18n("Focusing..."));
emit checkFocus(HFRPixels->value());
+ state = CAPTURE_FOCUSING;
emit newStatus(Ekos::CAPTURE_FOCUSING);
}
else
startNextExposure();
-
- return true;
}
+
+ return true;
}
void Capture::captureOne()
@@ -1089,6 +1184,8 @@ void Capture::captureImage()
if (currentCCD->getUploadMode() != ISD::CCD::UPLOAD_LOCAL)
checkSeqBoundary(activeJob->getFITSDir());
+ state = CAPTURE_CAPTURING;
+
if (activeJob->isPreview() == false)
emit newStatus(Ekos::CAPTURE_CAPTURING);
@@ -1130,26 +1227,37 @@ void Capture::captureImage()
break;
case SequenceJob::CAPTURE_FOCUS_ERROR:
- appendLogText(i18n("Cannot capture while module is busy."));
+ appendLogText(i18n("Cannot capture while focus module is busy."));
abort();
break;
}
}
-void Capture::resumeCapture()
+bool Capture::resumeCapture()
{
+ if (state == CAPTURE_PAUSED)
+ {
+ pauseFunction = &Capture::resumeCapture;
+ appendLogText(i18n("Sequence paused."));
+ secondsLabel->setText(i18n("Paused..."));
+ return false;
+ }
+
appendLogText(i18n("Dither complete."));
if (isAutoFocus && autoFocusStatus == false)
{
secondsLabel->setText(i18n("Focusing..."));
emit checkFocus(HFRPixels->value());
+ state = CAPTURE_FOCUSING;
emit newStatus(Ekos::CAPTURE_FOCUSING);
- return;
+ return true;
}
startNextExposure();
+
+ return true;
}
/*******************************************************************************/
@@ -1397,7 +1505,12 @@ void Capture::addJob(bool preview)
return;
}
- QString finalFITSDir = fitsDir->text() + QLatin1Literal("/") + frameTypeCombo->currentText();
+ QString finalFITSDir = fitsDir->text();
+
+ if (targetName.isEmpty())
+ finalFITSDir += QLatin1Literal("/") + frameTypeCombo->currentText();
+ else
+ finalFITSDir += QLatin1Literal("/") + targetName + QLatin1Literal("/") + frameTypeCombo->currentText();
if ( (job->getFrameType() == FRAME_LIGHT || job->getFrameType() == FRAME_FLAT) && job->getFilterName().isEmpty() == false)
finalFITSDir += QLatin1Literal("/") + job->getFilterName();
@@ -1406,7 +1519,6 @@ void Capture::addJob(bool preview)
int currentRow = 0;
if (jobUnderEdit == false)
{
-
currentRow = queueTable->rowCount();
queueTable->insertRow(currentRow);
}
@@ -1619,8 +1731,8 @@ void Capture::setBusy(bool enable)
enable ? pi->startAnimation() : pi->stopAnimation();
previewB->setEnabled(!enable);
- startB->setEnabled(!enable);
- stopB->setEnabled(enable);
+ //startB->setEnabled(!enable);
+ //stopB->setEnabled(enable);
}
void Capture::prepareJob(SequenceJob *job)
@@ -1659,7 +1771,10 @@ void Capture::prepareJob(SequenceJob *job)
secondsLabel->setText(i18n("Set filter..."));
if (activeJob->isPreview() == false)
+ {
+ state = CAPTURE_CHANGING_FILTER;
emit newStatus(Ekos::CAPTURE_CHANGING_FILTER);
+ }
setBusy(true);
@@ -1675,7 +1790,10 @@ void Capture::prepareJob(SequenceJob *job)
secondsLabel->setText(i18n("Set %1 C...", activeJob->getTargetTemperature()));
if (activeJob->isPreview() == false)
+ {
+ state = CAPTURE_SETTING_TEMPERATURE;
emit newStatus(Ekos::CAPTURE_SETTING_TEMPERATURE);
+ }
setBusy(true);
}
@@ -1849,7 +1967,7 @@ void Capture::setAutoguiding(bool enable)
if (enable == false && isAutoGuiding && meridianFlipStage == MF_NONE && activeJob && activeJob->getStatus() == SequenceJob::JOB_BUSY)
{
appendLogText(i18n("Autoguiding stopped. Aborting..."));
- abort();
+ stop();
}
isAutoGuiding = enable;
@@ -2415,7 +2533,7 @@ void Capture::resetJobs()
foreach(SequenceJob *job, jobs)
job->resetStatus();
- abort();
+ stop();
// Reste active job pointer
activeJob = NULL;
@@ -2678,7 +2796,8 @@ void Capture::setTemperature()
void Capture::clearSequenceQueue()
{
activeJob=NULL;
- abort();
+ targetName = QString();
+ stop();
while (queueTable->rowCount() > 0)
queueTable->removeRow(0);
jobs.clear();
@@ -2788,6 +2907,7 @@ void Capture::processTelescopeNumber(INumberVectorProperty *nvp)
appendLogText(i18n("Performing post flip re-alignment..."));
secondsLabel->setText(i18n("Aligning..."));
+ state = CAPTURE_ALIGNING;
emit newStatus(Ekos::CAPTURE_ALIGNING);
meridianFlipStage = MF_ALIGNING;
@@ -2818,6 +2938,7 @@ void Capture::checkGuidingAfterFlip()
appendLogText(i18n("Performing post flip re-calibration and guiding..."));
secondsLabel->setText(i18n("Calibrating..."));
+ state = CAPTURE_CALIBRATING;
emit newStatus(Ekos::CAPTURE_CALIBRATING);
meridianFlipStage = MF_GUIDING;
@@ -2885,6 +3006,7 @@ bool Capture::checkMeridianFlip()
currentTelescope->Slew(initialRA,dec);
secondsLabel->setText(i18n("Meridian Flip..."));
+ state = CAPTURE_MERIDIAN_FLIP;
emit newStatus(Ekos::CAPTURE_MERIDIAN_FLIP);
QTimer::singleShot(MF_TIMER_TIMEOUT, this, SLOT(checkMeridianFlipTimeout()));
@@ -3620,6 +3742,7 @@ void Capture::startPostFilterAutoFocus()
secondsLabel->setText(i18n("Focusing..."));
+ state = CAPTURE_FOCUSING;
emit newStatus(Ekos::CAPTURE_FOCUSING);
appendLogText(i18n("Post filter change Autofocus..."));
diff --git a/kstars/ekos/capture.h b/kstars/ekos/capture.h
index 7b52a7f..2923471 100644
--- a/kstars/ekos/capture.h
+++ b/kstars/ekos/capture.h
@@ -56,10 +56,10 @@ class KDirWatch;
* The primary class is EkosManager. It handles startup and shutdown of local and remote INDI devices, manages and orchesterates the various Ekos modules, and provides advanced DBus
* interface to enable unattended scripting.
*@author Jasem Mutlaq
- *@version 1.2
+ *@version 1.3
*/
namespace Ekos
-{
+{
class SequenceJob;
@@ -84,6 +84,7 @@ public:
enum { CALIBRATE_NONE, CALIBRATE_START, CALIBRATE_DONE };
typedef enum { MF_NONE, MF_INITIATED, MF_FLIPPING, MF_SLEWING, MF_ALIGNING, MF_GUIDING } MFStage;
typedef enum { CAL_NONE, CAL_DUSTCAP_PARKING, CAL_DUSTCAP_PARKED, CAL_LIGHTBOX_ON, CAL_SLEWING, CAL_SLEWING_COMPLETE, CAL_MOUNT_PARKING, CAL_MOUNT_PARKED, CAL_DOME_PARKING, CAL_DOME_PARKED, CAL_PRECAPTURE_COMPLETE, CAL_CALIBRATION, CAL_CALIBRATION_COMPLETE, CAL_CAPTURING, CAL_DUSTCAP_UNPARKING, CAL_DUSTCAP_UNPARKED} CalibrationStage;
+ typedef bool (Capture::*PauseFunctionPointer)();
Capture();
~Capture();
@@ -130,6 +131,13 @@ public:
Q_SCRIPTABLE bool loadSequenceQueue(const QString &fileURL);
/** DBUS interface function.
+ * Sets target name. The target name shall be appended to the root directory specified by the user.
+ * e.g. If root directory is /home/jasem and target is M31, then root directory becomes /home/jasem/M31
+ * @param name Name of desired target
+ */
+ Q_SCRIPTABLE Q_NOREPLY void setTargetName(const QString &name) { targetName = name; }
+
+ /** DBUS interface function.
* Enables or disables the maximum guiding deviation and sets its value.
* @param enable If true, enable the guiding deviation check, otherwise, disable it.
* @param 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.
@@ -270,9 +278,16 @@ public slots:
Q_SCRIPTABLE Q_NOREPLY void start();
/** DBUS interface function.
- * Aborts all jobs and set current job status to Aborted if it was In Progress.
+ * Stop all jobs and set current job status to aborted if abort is set to true, otherwise status is idle until
+ * sequence is resumed or restarted.
+ * @param abort abort jobs if in progress
+ */
+ Q_SCRIPTABLE Q_NOREPLY void stop(bool abort=false);
+
+ /** DBUS interface function.
+ * Aborts all jobs. It simply calls stop(true)
*/
- Q_SCRIPTABLE Q_NOREPLY void abort();
+ Q_SCRIPTABLE Q_NOREPLY void abort() { stop(true); }
/** @}*/
@@ -365,7 +380,7 @@ public slots:
/**
* @brief resumeCapture Resume capture after dither and/or focusing processes are complete.
*/
- void resumeCapture();
+ bool resumeCapture();
/**
* @brief updateCCDTemperature Update CCD temperature in capture module.
@@ -378,6 +393,10 @@ public slots:
*/
void setTemperature();
+ // Pause Sequence Queue
+ void pause();
+
+ // Logs
void appendLogText(const QString &);
private slots:
@@ -387,8 +406,11 @@ private slots:
*/
void setDirty();
+ void toggleSequence();
+
+
void checkFrameType(int index);
- void resetFrame();
+ void resetFrame();
void updateCaptureProgress(ISD::CCDChip *tChip, double value, IPState state);
void checkSeqBoundary(const QString &path);
void saveFITSDirectory();
@@ -425,8 +447,8 @@ private slots:
// Send image info
void sendNewImage(QImage *image, ISD::CCDChip *myChip);
- // Capture
- void setCaptureComplete();
+ // Capture
+ bool setCaptureComplete();
// Temporary for post capture script
void postScriptFinished(int exitCode);
@@ -447,7 +469,7 @@ private:
void setBusy(bool enable);
bool resumeSequence();
- void startNextExposure();
+ bool startNextExposure();
void updateFrameProperties(bool reset=false);
void prepareJob(SequenceJob *job);
void syncGUIToJob(SequenceJob *job);
@@ -481,6 +503,8 @@ private:
//int calibrationState;
bool useGuideHead;
+ QString targetName;
+
SequenceJob *activeJob;
QList<ISD::CCD *> CCDs;
@@ -552,6 +576,11 @@ private:
// Misc
bool ignoreJobProgress;
+ // State
+ CaptureState state;
+
+ PauseFunctionPointer pauseFunction;
+
// CCD Chip frame settings
QMap<ISD::CCDChip *, QVariantMap> frameSettings;
diff --git a/kstars/ekos/capture.ui b/kstars/ekos/capture.ui
index 682feaf..383b1c5 100644
--- a/kstars/ekos/capture.ui
+++ b/kstars/ekos/capture.ui
@@ -966,6 +966,16 @@
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
+ <widget class="QPushButton" name="previewB">
+ <property name="toolTip">
+ <string/>
+ </property>
+ <property name="text">
+ <string>Preview</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<spacer name="buttonSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@@ -982,22 +992,24 @@
</spacer>
</item>
<item>
- <widget class="QPushButton" name="previewB">
- <property name="toolTip">
- <string/>
+ <widget class="QPushButton" name="startB">
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
</property>
- <property name="text">
- <string>Preview</string>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
</property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="startB">
<property name="toolTip">
- <string/>
+ <string>Start Sequence</string>
</property>
<property name="text">
- <string>&amp;Start Sequence</string>
+ <string/>
</property>
<property name="autoDefault">
<bool>true</bool>
@@ -1008,12 +1020,27 @@
</widget>
</item>
<item>
- <widget class="QPushButton" name="stopB">
+ <widget class="QPushButton" name="pauseB">
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Pause Sequence</string>
+ </property>
<property name="text">
- <string>S&amp;top</string>
+ <string/>
</property>
<property name="autoDefault">
<bool>true</bool>
@@ -1428,9 +1455,6 @@
</spacer>
</item>
</layout>
- <zorder>optionsGroup</zorder>
- <zorder>progressGroup</zorder>
- <zorder>CCDFWGroup</zorder>
<zorder>verticalSpacer</zorder>
</widget>
<resources/>
diff --git a/kstars/org.kde.kstars.Ekos.Capture.xml b/kstars/org.kde.kstars.Ekos.Capture.xml
index 5401df3..f9141f1 100644
--- a/kstars/org.kde.kstars.Ekos.Capture.xml
+++ b/kstars/org.kde.kstars.Ekos.Capture.xml
@@ -7,6 +7,10 @@
<method name="abort">
<annotation name="org.freedesktop.DBus.Method.NoReply" value="true"/>
</method>
+ <method name="stop">
+ <arg name="abort" type="b" direction="in"/>
+ <annotation name="org.freedesktop.DBus.Method.NoReply" value="true"/>
+ </method>
<method name="setCCD">
<arg type="b" direction="out"/>
<arg name="device" type="s" direction="in"/>
@@ -30,6 +34,10 @@
<method name="getSequenceQueueStatus">
<arg type="s" direction="out"/>
</method>
+ <method name="setTargetName">
+ <arg name="name" type="s" direction="in"/>
+ <annotation name="org.freedesktop.DBus.Method.NoReply" value="true"/>
+ </method>
<method name="setMaximumGuidingDeviaiton">
<arg name="enable" type="b" direction="in"/>
<arg name="value" type="d" direction="in"/>