summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasem Mutlaq <mutlaqja@ikarustech.com>2016-09-30 20:38:10 (GMT)
committerJasem Mutlaq <mutlaqja@ikarustech.com>2016-09-30 20:38:10 (GMT)
commit29f66bff03d27e1a5b5ec958fa7cccf82ee7613c (patch)
tree86d10701023b1f28a7d480a7fd34b3732a28af55
parente191630a1685e7c0d361c3a8315f74d58bb2308f (diff)
Calibration mostly works now in internal guider. Need to test all cases after guiding and dithering are complete
-rw-r--r--kstars/ekos/guide/externalguide/phd2.h2
-rw-r--r--kstars/ekos/guide/guide.cpp324
-rw-r--r--kstars/ekos/guide/guide.h52
-rw-r--r--kstars/ekos/guide/guide.ui77
-rw-r--r--kstars/ekos/guide/guideinterface.cpp5
-rw-r--r--kstars/ekos/guide/guideinterface.h4
-rw-r--r--kstars/ekos/guide/internalguide/gmath.cpp42
-rw-r--r--kstars/ekos/guide/internalguide/gmath.h11
-rw-r--r--kstars/ekos/guide/internalguide/internalguider.cpp433
-rw-r--r--kstars/ekos/guide/internalguide/internalguider.h35
-rw-r--r--kstars/ekos/guide/opscalibration.cpp7
-rw-r--r--kstars/ekos/guide/opscalibration.h1
-rw-r--r--kstars/ekos/guide/opscalibration.ui41
-rw-r--r--kstars/kstars.kcfg6
-rw-r--r--kstars/org.kde.kstars.Ekos.Guide.xml9
15 files changed, 543 insertions, 506 deletions
diff --git a/kstars/ekos/guide/externalguide/phd2.h b/kstars/ekos/guide/externalguide/phd2.h
index 90b2a37..a36c100 100644
--- a/kstars/ekos/guide/externalguide/phd2.h
+++ b/kstars/ekos/guide/externalguide/phd2.h
@@ -47,7 +47,7 @@ public:
bool calibrate() override;
bool guide() override;
- bool stop() override;
+ bool abort() override;
bool suspend() override;
bool resume() override;
bool dither(double pixels) override;
diff --git a/kstars/ekos/guide/guide.cpp b/kstars/ekos/guide/guide.cpp
index f4fb24f..ab8f8bc 100644
--- a/kstars/ekos/guide/guide.cpp
+++ b/kstars/ekos/guide/guide.cpp
@@ -37,6 +37,7 @@
#include "guideadaptor.h"
#include "kspaths.h"
+#include "kstarsdata.h"
#define driftGraph_WIDTH 200
#define driftGraph_HEIGHT 200
@@ -63,15 +64,37 @@ Guide::Guide() : QWidget()
// ST4 Driver
GuideDriver=NULL;
+ // Auto Star
+ autoStarCaptured = false;
+
+ guideView = new FITSView(guideWidget);
+ guideView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ guideView->setBaseSize(guideWidget->size());
+ QVBoxLayout *vlayout = new QVBoxLayout();
+ vlayout->addWidget(guideView);
+ guideWidget->setLayout(vlayout);
+ connect(guideView, SIGNAL(trackingStarSelected(int,int)), this, SLOT(setTrackingStar(int,int)));
+
ccd_hor_pixel = ccd_ver_pixel = focal_length = aperture = -1;
guideDeviationRA = guideDeviationDEC = 0;
useGuideHead = false;
- rapidGuideReticleSet = false;
+ rapidGuideReticleSet = false;
// Load all settings
loadSettings();
+ // Set color scheme
+ refreshColorScheme();
+
+ // Image Filters
+ foreach(QString filter, FITSViewer::filterTypes)
+ filterCombo->addItem(filter);
+
+ // Progress Indicator
+ pi = new QProgressIndicator(this);
+ controlLayout->addWidget(pi, 0, 1, 1, 1);
+
// Exposure
connect(exposureIN, SIGNAL(editingFinished()), this, SLOT(saveDefaultGuideExposure()));
@@ -96,7 +119,7 @@ Guide::Guide() : QWidget()
// Drift Graph scales
connect( spinBox_XScale, SIGNAL(valueChanged(int)), this, SLOT(onXscaleChanged(int)) );
- connect( spinBox_YScale, SIGNAL(valueChanged(int)), this, SLOT(onYscaleChanged(int)) );
+ connect( spinBox_YScale, SIGNAL(valueChanged(int)), this, SLOT(onYscaleChanged(int)) );
// Guiding Rate - Advisory only
connect( spinBox_GuideRate, SIGNAL(valueChanged(double)), this, SLOT(onInfoRateChanged(double)) );
@@ -134,13 +157,14 @@ Guide::Guide() : QWidget()
connect( spinBox_MinPulseRA, SIGNAL(editingFinished()), this, SLOT(onInputParamChanged()) );
connect( spinBox_MinPulseDEC, SIGNAL(editingFinished()), this, SLOT(onInputParamChanged()) );
- // Image Filters
- foreach(QString filter, FITSViewer::filterTypes)
- filterCombo->addItem(filter);
+ // Capture
+ connect(captureB, SIGNAL(clicked()), this, SLOT(capture()));
- // Progress Indicator
- pi = new QProgressIndicator(this);
- controlLayout->addWidget(pi, 0, 1, 1, 1);
+ // Stop
+ connect(stopB, SIGNAL(clicked()), this, SLOT(abort()));
+
+ // Calibrate
+ connect(calibrateB, SIGNAL(clicked()), this, SLOT(calibrate()));
// Drift Graph
//driftGraph = new ScrollGraph( this, driftGraph_WIDTH, driftGraph_HEIGHT );
@@ -158,15 +182,23 @@ Guide::Guide() : QWidget()
case GUIDE_INTERNAL:
{
guider= new InternalGuider();
+ InternalGuider *internalGuider = dynamic_cast<InternalGuider*>(guider);
// Options
KConfigDialog* dialog = new KConfigDialog(this, "guidesettings", Options::self());
- opsCalibration = new OpsCalibration(dynamic_cast<InternalGuider*>(guider));
+ opsCalibration = new OpsCalibration(internalGuider);
dialog->addPage(opsCalibration, i18n("Calibration Settings"));
- opsGuide = new OpsGuide(dynamic_cast<InternalGuider*>(guider));
+ opsGuide = new OpsGuide(internalGuider);
dialog->addPage(opsGuide, i18n("Guide Settings"));
connect(guideOptionsB, SIGNAL(clicked()), dialog, SLOT(show()));
- calibrationB->setEnabled(true);
+ connect(internalGuider, SIGNAL(newPulse(GuideDirection,int)), this, SLOT(sendPulse(GuideDirection,int)));
+ connect(internalGuider, SIGNAL(newPulse(GuideDirection,int,GuideDirection,int)), this, SLOT(sendPulse(GuideDirection,int,GuideDirection,int)));
+ connect(internalGuider, SIGNAL(DESwapChanged(bool)), swapCheck, SLOT(setChecked(bool)));
+ //connect(swapCheck, SIGNAL(toggled(bool)), internalGuider, SLOT(setDECSwap(bool)));
+
+ internalGuider->setGuideView(guideView);
+
+ calibrateB->setEnabled(true);
captureB->setEnabled(true);
}
break;
@@ -177,7 +209,7 @@ Guide::Guide() : QWidget()
// Do NOT receive BLOBs from the driver
//currentCCD->getDriverInfo()->getClientManager()->setBLOBMode(B_NEVER, currentCCD->getDeviceName(), useGuideHead ? "CCD2" : "CCD1");
- calibrationB->setEnabled(false);
+ calibrateB->setEnabled(false);
captureB->setEnabled(false);
break;
@@ -187,7 +219,7 @@ Guide::Guide() : QWidget()
// Do NOT receive BLOBs from the driver
//currentCCD->getDriverInfo()->getClientManager()->setBLOBMode(B_NEVER, currentCCD->getDeviceName(), useGuideHead ? "CCD2" : "CCD1");
- calibrationB->setEnabled(false);
+ calibrateB->setEnabled(false);
captureB->setEnabled(false);
break;
}
@@ -195,6 +227,8 @@ Guide::Guide() : QWidget()
state = GUIDE_IDLE;
+ connect(guider, SIGNAL(frameCaptureRequested()), this, SLOT(capture()));
+ connect(guider, SIGNAL(newLog(QString)), this, SLOT(appendLogText(QString)));
connect(guider, SIGNAL(newStatus(Ekos::GuideState)), this, SLOT(setStatus(Ekos::GuideState)));
connect(guider, SIGNAL(newStarPosition(QVector3D,bool)), this, SLOT(setStarPosition(QVector3D,bool)));
@@ -305,6 +339,9 @@ void Guide::checkCCD(int ccdNum)
else
useGuideHead=false;
+ ISD::CCDChip *targetChip = currentCCD->getChip(useGuideHead ? ISD::CCDChip::GUIDE_CCD : ISD::CCDChip::PRIMARY_CCD);
+ targetChip->setImageView(guideView, FITS_GUIDE);
+
syncCCDInfo();
}
}
@@ -522,7 +559,7 @@ void Guide::setAO(ISD::ST4 *newAO)
bool Guide::capture()
{
if (currentCCD == NULL)
- return false;
+ return false;
double seqExpose = exposureIN->value();
@@ -581,12 +618,78 @@ bool Guide::capture()
break;
}
+ guideView->setBaseSize(guideWidget->size());
+
connect(currentCCD, SIGNAL(BLOBUpdated(IBLOB*)), this, SLOT(newFITS(IBLOB*)));
targetChip->capture(seqExpose);
+ setBusy(true);
+
+ return true;
+}
+
+bool Guide::abort()
+{
+ ISD::CCDChip *targetChip = currentCCD->getChip(useGuideHead ? ISD::CCDChip::GUIDE_CCD : ISD::CCDChip::PRIMARY_CCD);
+
+ setBusy(false);
+
+ switch (state)
+ {
+ case GUIDE_IDLE:
+ case GUIDE_CONNECTED:
+ case GUIDE_DISCONNECTED:
+ if (targetChip->isCapturing())
+ targetChip->abortExposure();
+ break;
+
+ case GUIDE_CALIBRATING:
+ case GUIDE_CALIBRATION_STAR:
+ case GUIDE_CALIBRATION_CAPTURE:
+ guider->abort();
+ default:
+ break;
+
+ }
+
+
+ // Maybe set this above?
+ if (state >= GUIDE_CALIBRATING)
+ state = GUIDE_ABORTED;
+ else
+ state = GUIDE_IDLE;
+
+ emit newStatus(state);
+
return true;
}
+void Guide::setBusy(bool enable)
+{
+ if (enable)
+ {
+ calibrateB->setEnabled(false);
+ guideB->setEnabled(false);
+ captureB->setEnabled(false);
+
+ stopB->setEnabled(true);
+
+ pi->startAnimation();
+ }
+ else
+ {
+ calibrateB->setEnabled(true);
+ captureB->setEnabled(true);
+
+ if (state >= GUIDE_CALIBRATION_SUCESS)
+ guideB->setEnabled(true);
+
+ stopB->setEnabled(false);
+
+ pi->stopAnimation();
+ }
+}
+
void Guide::newFITS(IBLOB *bp)
{
INDI_UNUSED(bp);
@@ -606,7 +709,7 @@ void Guide::newFITS(IBLOB *bp)
targetChip->getFrame(&x,&y,&w,&h);
targetChip->getBinning(&binx,&biny);
- FITSView *currentImage = targetChip->getImage(FITS_GUIDE);
+ FITSView *currentImage = targetChip->getImageView(FITS_GUIDE);
FITSData *darkData = NULL;
uint16_t offsetX = x / binx;
uint16_t offsetY = y / biny;
@@ -633,13 +736,11 @@ void Guide::newFITS(IBLOB *bp)
void Guide::setCaptureComplete()
{
-
-
DarkLibrary::Instance()->disconnect(this);
ISD::CCDChip *targetChip = currentCCD->getChip(useGuideHead ? ISD::CCDChip::GUIDE_CCD : ISD::CCDChip::PRIMARY_CCD);
- FITSView *targetImage = targetChip->getImage(FITS_GUIDE);
+ FITSView *targetImage = targetChip->getImageView(FITS_GUIDE);
if (targetImage == NULL)
{
@@ -653,23 +754,19 @@ void Guide::setCaptureComplete()
if (Options::guideLogging())
qDebug() << "Guide: received guide frame.";
- FITSData *image_data = targetImage->getImageData();
- Q_ASSERT(image_data);
-
- // FIXME
- /*
+ //FITSData *image_data = targetImage->getImageData();
+ //Q_ASSERT(image_data);
-
- pmath->setImageView(targetImage);
- guider->setImageView(targetImage);
+ //pmath->setImageView(targetImage);
+ //guider->setImageView(targetImage);
int subBinX=1, subBinY=1;
targetChip->getBinning(&subBinX, &subBinY);
// It should be false in case we do not need to process the image for motion
// which happens when we take an image for auto star selection.
- if (calibration->setImageView(targetImage) == false)
- return;
+ //if (calibration->setImageView(targetImage) == false)
+ // return;
if (starCenter.x() == 0 && starCenter.y() == 0)
{
@@ -683,7 +780,54 @@ void Guide::setCaptureComplete()
syncTrackingBoxPosition();
- if (isSuspended)
+ switch (state)
+ {
+ case GUIDE_IDLE:
+ case GUIDE_ABORTED:
+ case GUIDE_CONNECTED:
+ case GUIDE_DISCONNECTED:
+ case GUIDE_CALIBRATION_SUCESS:
+ case GUIDE_CALIBRATION_ERROR:
+ setBusy(false);
+ break;
+
+ case GUIDE_CALIBRATION_CAPTURE:
+ {
+ if (Options::autoStarEnabled())
+ {
+ autoStarCaptured = selectAutoStar();
+ if (autoStarCaptured)
+ {
+ appendLogText(i18n("Auto star selected. Starting calibration..."));
+ guider->setStarPosition(starCenter);
+ guider->calibrate();
+ }
+ else
+ {
+ appendLogText(i18n("Failed to select an auto star."));
+ state = GUIDE_CALIBRATION_ERROR;
+ emit newStatus(state);
+ setBusy(false);
+ }
+ }
+ else
+ {
+ appendLogText(i18n("Select a guide star to calibrate."));
+ state = GUIDE_CALIBRATION_STAR;
+ emit newStatus(state);
+ }
+ }
+ break;
+ case GUIDE_CALIBRATING:
+ guider->calibrate();
+ break;
+
+ default:
+ break;
+
+ }
+
+ /*if (isSuspended)
{
if (Options::guideLogging())
qDebug() << "Guide: Guider is suspended.";
@@ -750,12 +894,11 @@ void Guide::setDECSwap(bool enable)
if (ST4Driver == NULL || guider == NULL)
return;
- // FIXME
- /*
- guider->setDECSwap(enable);
- ST4Driver->setDECSwap(enable);
- */
-
+ if (guiderType == GUIDE_INTERNAL)
+ {
+ dynamic_cast<InternalGuider*>(guider)->setDECSwap(enable);
+ ST4Driver->setDECSwap(enable);
+ }
}
bool Guide::sendPulse( GuideDirection ra_dir, int ra_msecs, GuideDirection dec_dir, int dec_msecs )
@@ -764,11 +907,8 @@ bool Guide::sendPulse( GuideDirection ra_dir, int ra_msecs, GuideDirection dec_d
if (GuideDriver == NULL || (ra_dir == NO_DIR && dec_dir == NO_DIR))
return false;
- // FIXME
- /*
- if (calibration->isCalibrating())
+ if (state == GUIDE_CALIBRATING)
QTimer::singleShot( (ra_msecs > dec_msecs ? ra_msecs : dec_msecs) + 100, this, SLOT(capture()));
- */
return GuideDriver->doPulse(ra_dir, ra_msecs, dec_dir, dec_msecs);
}
@@ -778,11 +918,8 @@ bool Guide::sendPulse( GuideDirection dir, int msecs )
if (GuideDriver == NULL || dir==NO_DIR)
return false;
- // FIXME
- /*
- if (calibration->isCalibrating())
+ if (state == GUIDE_CALIBRATING)
QTimer::singleShot(msecs+100, this, SLOT(capture()));
- */
return GuideDriver->doPulse(dir, msecs);
@@ -958,34 +1095,28 @@ void Guide::updateGuideDriver(double delta_ra, double delta_dec)
*/
}
-bool Guide::startCalibration()
+bool Guide::calibrate()
{
saveSettings();
- // FIXME
- /*
- if (Options::useEkosGuider())
- return calibration->startCalibration();
- else
- return phd2->startGuiding();
+ autoStarCaptured = false;
- */
-
- return true;
-}
+ if (starCenter.isNull() || Options::autoStarEnabled())
+ {
+ state = GUIDE_CALIBRATION_CAPTURE;
+ emit newStatus(state);
-bool Guide::stopCalibration()
-{
- // FIXME
- /*
- if (Options::useEkosGuider())
- return calibration->stopCalibration();
- else
- return phd2->stopGuiding();
+ appendLogText(i18n("Capturing image..."));
+ capture();
+ return true;
+ }
- */
+ guider->setStarPosition(starCenter);
+ bool rc = guider->calibrate();
+ if (rc)
+ setBusy(true);
- return true;
+ return rc;
}
bool Guide::startGuiding()
@@ -1008,22 +1139,6 @@ bool Guide::startGuiding()
}
-bool Guide::stopGuiding()
-{
- // FIXME
- /*
- isSuspended=false;
-
- if (Options::useEkosGuider())
- return guider->abort(true);
- else
- // guider stop will call phd2->stopGuide() and change GUI elements accordingly
- return guider->stop();
- */
-
- return true;
-}
-
void Guide::setSuspended(bool enable)
{
/*
@@ -1108,7 +1223,7 @@ void Guide::setSubFrameEnabled(bool enable)
//guider->setGuideOptions(guider->getAlgorithm(), enable , guider->useRapidGuide());
}
-void Guide::setGuideRapid(bool enable)
+void Guide::setGuideRapidEnabled(bool enable)
{
//guider->setGuideOptions(guider->getAlgorithm(), guider->useSubFrame() , enable);
}
@@ -1172,6 +1287,20 @@ void Guide::setStatus(Ekos::GuideState newState)
state = newState;
+ switch (state)
+ {
+ case GUIDE_CALIBRATION_SUCESS:
+ setBusy(false);
+ break;
+
+ case GUIDE_CALIBRATION_ERROR:
+ setBusy(false);
+ break;
+
+ default:
+ break;
+ }
+
emit newStatus(newState);
}
@@ -1251,11 +1380,9 @@ void Guide::syncTrackingBoxPosition()
Q_ASSERT(targetChip);
int subBinX=1, subBinY=1;
- targetChip->getBinning(&subBinX, &subBinY);
-
- FITSView *targetImage = targetChip->getImage(FITS_GUIDE);
+ targetChip->getBinning(&subBinX, &subBinY);
- if (targetImage && starCenter.isNull() == false)
+ if (starCenter.isNull() == false)
{
double boxSize = boxSizeCombo->currentText().toInt();
int x,y,w,h;
@@ -1280,8 +1407,8 @@ void Guide::syncTrackingBoxPosition()
}
QRect starRect = QRect( starCenter.x()-boxSize/(2*subBinX), starCenter.y()-boxSize/(2*subBinY), boxSize/subBinX, boxSize/subBinY);
- targetImage->setTrackingBoxEnabled(true);
- targetImage->setTrackingBox(starRect);
+ guideView->setTrackingBoxEnabled(true);
+ guideView->setTrackingBox(starRect);
}
}
@@ -1307,7 +1434,7 @@ bool Guide::selectAutoStar()
if (targetChip == NULL)
return false;
- FITSView *targetImage = targetChip->getImage(FITS_GUIDE);
+ FITSView *targetImage = targetChip->getImageView(FITS_GUIDE);
if (targetImage == NULL)
return false;
@@ -1560,7 +1687,7 @@ void Guide::loadSettings()
spinBox_MaxPulseDEC->setValue(Options::dECMaximumPulse());
// Min Pulse Duration (ms)
spinBox_MinPulseRA->setValue(Options::rAMinimumPulse());
- spinBox_MinPulseDEC->setValue(Options::dECMinimumPulse());
+ spinBox_MinPulseDEC->setValue(Options::dECMinimumPulse());
}
void Guide::saveSettings()
@@ -1597,6 +1724,25 @@ void Guide::saveSettings()
Options::setDECMinimumPulse(spinBox_MinPulseDEC->value());
}
+void Guide::refreshColorScheme()
+{
+ // Drift color legend
+ RADriftLabel->setStyleSheet(QString("background-color: %1;").arg(KStarsData::Instance()->colorScheme()->colorNamed("RAGuideError").name(QColor::HexRgb)));
+ DEDriftLabel->setStyleSheet(QString("background-color: %1;").arg(KStarsData::Instance()->colorScheme()->colorNamed("DEGuideError").name(QColor::HexRgb)));
+}
+
+void Guide::setTrackingStar(int x, int y)
+{
+ QVector3D newStarPosition(x,y, -1);
+ setStarPosition(newStarPosition, true);
+
+ if (state == GUIDE_CALIBRATION_STAR)
+ {
+ guider->setStarPosition(newStarPosition);
+ guider->calibrate();
+ }
+}
+
}
diff --git a/kstars/ekos/guide/guide.h b/kstars/ekos/guide/guide.h
index 77910cf..68dfa13 100644
--- a/kstars/ekos/guide/guide.h
+++ b/kstars/ekos/guide/guide.h
@@ -27,7 +27,7 @@
#include "ui_guide.h"
class QTabWidget;
-class FITSData;
+class FITSView;
class ScrollGraph;
class QProgressIndicator;
@@ -158,7 +158,7 @@ public:
* Set rapid guiding option. The options must be set before starting the guiding operation. If no options are set, the options loaded from the user configuration are used.
* @param enable if true, it will activate RapidGuide in the CCD driver. When Rapid Guide is used, no frames are sent to Ekos for analysis and the centeroid calculations are done in the CCD driver.
*/
- Q_SCRIPTABLE Q_NOREPLY void setGuideRapid(bool enable);
+ Q_SCRIPTABLE Q_NOREPLY void setGuideRapidEnabled(bool enable);
/** DBUS interface function.
* Enable or disables dithering
@@ -190,9 +190,7 @@ public:
void clearLog();
- void setDECSwap(bool enable);
- bool sendPulse( GuideDirection ra_dir, int ra_msecs, GuideDirection dec_dir, int dec_msecs );
- bool sendPulse( GuideDirection dir, int msecs );
+ void setDECSwap(bool enable);
QString getLogText() { return logText.join("\n"); }
@@ -205,6 +203,11 @@ public:
void startRapidGuide();
void stopRapidGuide();
+ /**
+ * @brief refreshColorScheme Update any colors that depend on updates in the color scheme
+ */
+ void refreshColorScheme();
+
GuideInterface * getGuider() { return guider;}
public slots:
@@ -216,22 +219,16 @@ public slots:
Q_SCRIPTABLE bool startGuiding();
/** DBUS interface function.
- * Stop the autoguiding operation.
- * @return Returns true if guiding stopped successfully, false otherwise.
+ * Stop any active calibration, guiding, or dithering operation
+ * @return Returns true if operation is stopped successfully, false otherwise.
*/
- Q_SCRIPTABLE bool stopGuiding();
+ Q_SCRIPTABLE bool abort();
/** DBUS interface function.
* Start the calibration operation.
* @return Returns true if calibration started successfully, false otherwise.
*/
- Q_SCRIPTABLE bool startCalibration();
-
- /** DBUS interface function.
- * Stop the calibration operation.
- * @return Returns true if calibration stopped successfully, false otherwise.
- */
- Q_SCRIPTABLE bool stopCalibration();
+ Q_SCRIPTABLE bool calibrate();
/** DBUS interface function.
* Capture a guide frame
@@ -259,8 +256,10 @@ public slots:
void dither();
void setSuspended(bool enable);
+ // Append Log entry
void appendLogText(const QString &);
+ // Update Guide module status
void setStatus(Ekos::GuideState newState);
// Star Position
@@ -269,6 +268,10 @@ public slots:
// Capture
void setCaptureComplete();
+ // Send pulse to ST4 driver
+ bool sendPulse( GuideDirection ra_dir, int ra_msecs, GuideDirection dec_dir, int dec_msecs );
+ bool sendPulse( GuideDirection dir, int msecs );
+
protected slots:
void updateCCDBin(int index);
@@ -278,6 +281,13 @@ protected slots:
*/
void processCCDNumber(INumberVectorProperty *nvp);
+ /**
+ * @brief setTrackingStar Gets called when the user select a star in the guide frame
+ * @param x X coordinate of star
+ * @param y Y coordinate of star
+ */
+ void setTrackingStar(int x, int y);
+
void saveDefaultGuideExposure();
void updateTrackingBoxSize(int currentIndex);
@@ -328,6 +338,12 @@ private:
*/
void saveSettings();
+ /**
+ * @brief setBusy Indicate busy status within the module visually
+ * @param enable True if module is busy, false otherwise
+ */
+ void setBusy(bool enable);
+
// Devices
ISD::CCD *currentCCD;
ISD::Telescope *currentTelescope;
@@ -371,6 +387,12 @@ private:
OpsCalibration *opsCalibration;
OpsGuide *opsGuide;
+ // Guide Frame
+ FITSView *guideView;
+
+ // Auto star operation
+ bool autoStarCaptured;
+
};
}
diff --git a/kstars/ekos/guide/guide.ui b/kstars/ekos/guide/guide.ui
index 03d12a1..8f44f58 100644
--- a/kstars/ekos/guide/guide.ui
+++ b/kstars/ekos/guide/guide.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>702</width>
- <height>515</height>
+ <width>697</width>
+ <height>510</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
@@ -42,6 +42,21 @@
<string>Control</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
+ <property name="spacing">
+ <number>3</number>
+ </property>
+ <property name="leftMargin">
+ <number>3</number>
+ </property>
+ <property name="topMargin">
+ <number>3</number>
+ </property>
+ <property name="rightMargin">
+ <number>3</number>
+ </property>
+ <property name="bottomMargin">
+ <number>3</number>
+ </property>
<item>
<layout class="QGridLayout" name="controlLayout">
<property name="spacing">
@@ -55,7 +70,7 @@
</widget>
</item>
<item row="2" column="0">
- <widget class="QPushButton" name="calibrationB">
+ <widget class="QPushButton" name="calibrateB">
<property name="enabled">
<bool>true</bool>
</property>
@@ -115,9 +130,12 @@
</item>
<item>
<layout class="QGridLayout" name="gridLayout_6">
- <property name="spacing">
+ <property name="horizontalSpacing">
<number>1</number>
</property>
+ <property name="verticalSpacing">
+ <number>5</number>
+ </property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
@@ -586,32 +604,19 @@
<item>
<layout class="QVBoxLayout" name="rightLayout">
<item>
- <widget class="FITSView" name="guideView">
+ <widget class="QWidget" name="guideWidget" native="true">
<property name="minimumSize">
<size>
<width>320</width>
<height>240</height>
</size>
</property>
- <property name="styleSheet">
- <string notr="true">background-color:gray;</string>
- </property>
- <property name="sizeAdjustPolicy">
- <enum>QAbstractScrollArea::AdjustToContentsOnFirstShow</enum>
- </property>
- <property name="widgetResizable">
- <bool>true</bool>
+ <property name="sizeIncrement">
+ <size>
+ <width>40</width>
+ <height>30</height>
+ </size>
</property>
- <widget class="QWidget" name="scrollAreaWidgetContents_2">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>462</width>
- <height>238</height>
- </rect>
- </property>
- </widget>
</widget>
</item>
<item>
@@ -714,6 +719,9 @@
<height>16</height>
</size>
</property>
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
<property name="text">
<string/>
</property>
@@ -733,6 +741,13 @@
</widget>
</item>
<item>
+ <widget class="Line" name="line_3">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QLabel" name="DEDriftLabel">
<property name="minimumSize">
<size>
@@ -746,6 +761,9 @@
<height>16</height>
</size>
</property>
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
<property name="text">
<string/>
</property>
@@ -765,6 +783,13 @@
</widget>
</item>
<item>
+ <widget class="Line" name="line_4">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QLabel" name="l_1">
<property name="text">
<string>X</string>
@@ -1157,12 +1182,6 @@
</widget>
<customwidgets>
<customwidget>
- <class>FITSView</class>
- <extends>QScrollArea</extends>
- <header>fitsviewer/fitsview.h</header>
- <container>1</container>
- </customwidget>
- <customwidget>
<class>ScrollGraph</class>
<extends>QWidget</extends>
<header>ekos/guide/scroll_graph.h</header>
diff --git a/kstars/ekos/guide/guideinterface.cpp b/kstars/ekos/guide/guideinterface.cpp
index ff819aa..edcbaa1 100644
--- a/kstars/ekos/guide/guideinterface.cpp
+++ b/kstars/ekos/guide/guideinterface.cpp
@@ -95,6 +95,11 @@ bool GuideInterface::getFrameParams(uint16_t *x, uint16_t *y, uint16_t *w, uint1
return true;
}
+void GuideInterface::setStarPosition(QVector3D starCenter)
+{
+ INDI_UNUSED(starCenter);
+}
+
}
diff --git a/kstars/ekos/guide/guideinterface.h b/kstars/ekos/guide/guideinterface.h
index d5082dd..f8ca60a 100644
--- a/kstars/ekos/guide/guideinterface.h
+++ b/kstars/ekos/guide/guideinterface.h
@@ -38,7 +38,7 @@ public:
virtual bool guide() = 0;
virtual bool suspend() = 0;
virtual bool resume() = 0;
- virtual bool stop() = 0;
+ virtual bool abort() = 0;
virtual bool dither(double pixels) = 0;
virtual bool setGuiderParams(double ccdPixelSizeX, double ccdPixelSizeY, double mountAperture, double mountFocalLength);
@@ -47,6 +47,8 @@ public:
virtual bool setFrameParams(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t binX, uint16_t binY);
virtual bool getFrameParams(uint16_t *x, uint16_t *y, uint16_t *w, uint16_t *h, uint16_t *binX, uint16_t *binY);
+ virtual void setStarPosition(QVector3D starCenter);
+
signals:
void newLog(const QString &);
void newStatus(Ekos::GuideState);
diff --git a/kstars/ekos/guide/internalguide/gmath.cpp b/kstars/ekos/guide/internalguide/gmath.cpp
index e6773ae..debe3a5 100644
--- a/kstars/ekos/guide/internalguide/gmath.cpp
+++ b/kstars/ekos/guide/internalguide/gmath.cpp
@@ -53,8 +53,7 @@ typedef struct
cgmath::cgmath() : QObject()
{
// sys...
- ticks = 0;
- pdata = NULL;
+ ticks = 0;
video_width = -1;
video_height = -1;
ccd_pixel_width = 0;
@@ -123,38 +122,18 @@ bool cgmath::setVideoParameters( int vid_wd, int vid_ht )
return true;
}
-void cgmath::setDataBuffer(float *buffer)
-{
- pdata = buffer;
-}
-
-void cgmath::setImageView(FITSView *image)
+void cgmath::setGuideView(FITSView *image)
{
guideView = image;
- if (guideView)
+ /*if (guideView)
{
FITSData *image_data = guideView->getImageData();
setDataBuffer(image_data->getImageBuffer());
setVideoParameters(image_data->getWidth(), image_data->getHeight());
- }
-}
-
-float *cgmath::getDataBuffer( int *width, int *height, int *length, int *size )
-{
- if( width )
- *width = video_width;
- if( height )
- *height = video_height;
- if( length )
- *length = video_width * video_height;
- if( size )
- *size = video_width * video_height * sizeof(float);
-
- return pdata;
+ }*/
}
-
bool cgmath::setGuiderParameters( double ccd_pix_wd, double ccd_pix_ht, double guider_aperture, double guider_focal )
{
if( ccd_pix_wd < 0 )
@@ -215,7 +194,8 @@ bool cgmath::getReticleParameters( double *x, double *y, double *ang ) const
*x = reticle_pos.x;
*y = reticle_pos.y;
- *ang = reticle_angle;
+ if (ang)
+ *ang = reticle_angle;
return true;
}
@@ -573,6 +553,16 @@ Vector cgmath::findLocalStarPosition( void ) const
if (trackingBox.isValid() == false)
return Vector(-1,-1,-1);
+ FITSData *imageData = guideView->getImageData();
+ if (imageData == NULL)
+ {
+ if (Options::guideLogging())
+ qDebug() << "Guide: Cannot process a NULL image.";
+ return Vector(-1,-1,-1);
+ }
+
+ float *pdata = imageData->getImageBuffer();
+
if (Options::guideLogging())
qDebug() << "Guide: Tracking Square " << trackingBox;
diff --git a/kstars/ekos/guide/internalguide/gmath.h b/kstars/ekos/guide/internalguide/gmath.h
index e4cf01e..6574349 100644
--- a/kstars/ekos/guide/internalguide/gmath.h
+++ b/kstars/ekos/guide/internalguide/gmath.h
@@ -109,8 +109,7 @@ public:
virtual ~cgmath();
// functions
- bool setVideoParameters( int vid_wd, int vid_ht );
- float *getDataBuffer( int *width, int *height, int *length, int *size );
+ bool setVideoParameters( int vid_wd, int vid_ht );
bool setGuiderParameters( double ccd_pix_wd, double ccd_pix_ht, double guider_aperture, double guider_focal );
void getGuiderParameters( double *ccd_pix_wd, double *ccd_pix_ht, double *guider_aperture, double *guider_focal );
bool setReticleParameters( double x, double y, double ang );
@@ -127,11 +126,10 @@ public:
info_params_t getInfoParameters( void ) const;
uint32_t getTicks( void ) const;
- void setDataBuffer(float *buffer);
- void setImageView(FITSView *image);
+ void setGuideView(FITSView *image);
bool declinationSwapEnabled() { return dec_swap;}
void setDeclinationSwapEnabled(bool enable) { dec_swap = enable;}
- FITSView *getImageView() { return guideView; }
+ FITSView *getGuideView() { return guideView; }
void setPreviewMode(bool enable) { preview_mode = enable;}
/*void moveSquare( double newx, double newy );
@@ -176,8 +174,7 @@ signals:
private:
// sys...
- uint32_t ticks; // global channel ticker
- float *pdata; // pointer to data buffer
+ uint32_t ticks; // global channel ticker
QPointer<FITSView> guideView; // pointer to image
int video_width, video_height; // video frame dimensions
double ccd_pixel_width, ccd_pixel_height, aperture, focal;
diff --git a/kstars/ekos/guide/internalguide/internalguider.cpp b/kstars/ekos/guide/internalguide/internalguider.cpp
index 6517618..2f93446 100644
--- a/kstars/ekos/guide/internalguide/internalguider.cpp
+++ b/kstars/ekos/guide/internalguide/internalguider.cpp
@@ -10,6 +10,7 @@
*/
#include <KMessageBox>
+#include <KNotification>
#include "internalguider.h"
#include "gmath.h"
@@ -29,10 +30,11 @@ InternalGuider::InternalGuider()
connect(pmath, SIGNAL(newAxisDelta(double,double)), this, SIGNAL(newAxisDelta(double,double)));
connect(pmath, SIGNAL(newAxisDelta(double,double)), this, SLOT(updateGuideDriver(double,double)));
- connect(pmath, SIGNAL(newStarPosition(QVector3D,bool)), this, SLOT(setStarPosition(QVector3D,bool)));
+ //connect(pmath, SIGNAL(newStarPosition(QVector3D,bool)), this, SLOT(setStarPosition(QVector3D,bool)));
+ connect(pmath, SIGNAL(newStarPosition(QVector3D,bool)), this, SIGNAL(newStarPosition(QVector3D,bool)));
// Calibration
- calibrationStage = CAL_CAPTURE_IMAGE;
+ calibrationStage = CAL_IDLE;
is_started = false;
axis = GUIDE_RA;
@@ -47,10 +49,6 @@ InternalGuider::InternalGuider()
okColor = Qt::green;
busyColor = Qt::yellow;
alertColor = Qt::red;
-
-
-
-
}
InternalGuider::~InternalGuider()
@@ -62,9 +60,10 @@ bool InternalGuider::guide()
return false;
}
-bool InternalGuider::stop()
+bool InternalGuider::abort()
{
-return false;
+ calibrationStage = CAL_IDLE;
+ return true;
}
bool InternalGuider::suspend()
@@ -99,46 +98,33 @@ bool InternalGuider::getReticleParameters(double *x, double *y, double *angle)
bool InternalGuider::setGuiderParams(double ccdPixelSizeX, double ccdPixelSizeY, double mountAperture, double mountFocalLength)
{
- // TODO
- return true;
+ this->ccdPixelSizeX = ccdPixelSizeX;
+ this->ccdPixelSizeY = ccdPixelSizeY;
+ this->mountAperture = mountAperture;
+ this->mountFocalLength = mountFocalLength;
+ return pmath->setGuiderParameters(ccdPixelSizeX, ccdPixelSizeY, mountAperture, mountFocalLength);
}
-
-bool InternalGuider::calibrate()
+bool InternalGuider::setFrameParams(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t binX, uint16_t binY)
{
+ if( w <= 0 || h <= 0 )
+ return false;
- //FIXME
-
-#if 0
- /* // Capture final image
- if (calibrationType == CAL_MANUAL && calibrationStage == CAL_START)
- {
- guideModule->capture();
- return;
- }
-
- if (calibrationStage > CAL_START)
- {
- stopCalibration();
- return;
- }
-
- startCalibration();*/
+ subX = x;
+ subY = y;
+ subW = w;
+ subH = h;
+ subBinX = binX;
+ subBinY = binY;
- /*if (guideModule->isGuiding())
- {
- guideModule->appendLogText(i18n("Cannot calibrate while autoguiding is active."));
- return false;
- }*/
+ pmath->setVideoParameters(w, h);
- if (calibrationStage != CAL_START && Options::autoStarEnabled())
- {
- calibrationStage = CAL_CAPTURE_IMAGE;
- emit frameCaptureRequested();
- return true;
- }
+ return true;
+}
+bool InternalGuider::calibrate()
+{
bool ccdInfo=true, scopeInfo=true;
QString errMsg;
@@ -159,57 +145,68 @@ bool InternalGuider::calibrate()
if (ccdInfo == false || scopeInfo == false)
{
- KMessageBox::error(this, i18n("%1 info are missing. Please set the values in INDI Control Panel.", errMsg));
+ KMessageBox::error(NULL, i18n("Missing Information"), i18n("%1 info are missing. Please set the values in INDI Control Panel.", errMsg));
return false;
}
- disconnect(guideFrame, SIGNAL(trackingStarSelected(int,int)), this, SLOT(trackingStarSelected(int, int)));
+ if (state != GUIDE_CALIBRATING)
+ {
+ calibrationStage = CAL_IDLE;
+ state = GUIDE_CALIBRATING;
+ emit newStatus(GUIDE_CALIBRATING);
+ }
+ // Capture final image
+
+ // FIXME check how to do manual
+ // and fucking document it
+ /*
+ if (calibrationType == CAL_MANUAL && calibrationStage == CAL_START)
+ {
+ calibrationStage = CAL_CAPTURE_IMAGE;
+ emit frameCaptureRequested();
+ return;
+ }*/
- calibrationStage = CAL_START;
- emit newStatus(Ekos::GUIDE_CALIBRATING);
- // Must reset dec swap before we run any calibration procedure!
+ //startCalibration();
- // FIXME
- //guideModule->setDECSwap(false);
- //pmath->setDeclinationSwapEnabled(false);
- pmath->setLostStar(false);
- //pmain_wnd->capture();
+ /*if (guideModule->isGuiding())
+ {
+ guideModule->appendLogText(i18n("Cannot calibrate while autoguiding is active."));
+ return false;
+ }*/
- // FIXME
- /*Options::setCalibrationPulseDuration(ui.spinBox_Pulse->value());
- Options::setUseAutoMode(ui.autoModeCheck->isChecked());
- Options::setUseTwoAxis(ui.twoAxisCheck->isChecked());
- Options::setAutoModeIterations(ui.spinBox_DriftTime->value());
- Options::setAutoStar(ui.autoStarCheck->isChecked());
- if (ui.autoStarCheck->isChecked())
- Options::setAutoSquareSize(ui.autoSquareSizeCheck->isChecked());
- */
-
- // manual
- if( ui.autoModeCheck->checkState() != Qt::Checked )
+ if (calibrationStage > CAL_START)
{
- calibrateManualReticle();
+ //abort();
+ processCalibration();
return true;
}
- ui.progressBar->setVisible(true);
+ disconnect(guideFrame, SIGNAL(trackingStarSelected(int,int)), this, SLOT(trackingStarSelected(int, int)));
+
+ // Must reset dec swap before we run any calibration procedure!
+
+ emit DESwapChanged(false);
+ pmath->setDeclinationSwapEnabled(false);
+ pmath->setLostStar(false);
+ //pmain_wnd->capture();
+
+ calibrationStage = CAL_START;
+
// automatic
- if( ui.twoAxisCheck->checkState() == Qt::Checked )
+ // If two axies (RA/DEC) are required
+ if( Options::twoAxisEnabled() )
calibrateRADECRecticle(false);
else
+ // Just RA
calibrateRADECRecticle(true);
-
- #endif
return true;
-
-
-
}
bool InternalGuider::stopCalibration()
@@ -233,22 +230,22 @@ return true;
void InternalGuider::processCalibration()
{
-
- //FIXME
-
-#if 0
//if (pmath->get_image())
//guide_frame->setTrackingBox(QRect(pmath-> square_pos.x, square_pos.y, square_size*2, square_size*2));
//pmath->get_image()->setTrackingBoxSize(QSize(pmath->get_square_size(), pmath->get_square_size()));
+ pmath->performProcessing();
+
if (pmath->isStarLost())
- {
+ {
+ //ui.startCalibrationLED->setColor(alertColor);
+ //KMessageBox::error(NULL, i18n("Lost track of the guide star. Try increasing the square size or reducing pulse duration."));
+ emit newLog(i18n("Lost track of the guide star. Try increasing the square size or reducing pulse duration."));
+ reset();
+
calibrationStage = CAL_ERROR;
emit newStatus(Ekos::GUIDE_CALIBRATION_ERROR);
- ui.startCalibrationLED->setColor(alertColor);
- KMessageBox::error(NULL, i18n("Lost track of the guide star. Try increasing the square size or reducing pulse duration."));
- reset();
return;
}
@@ -257,10 +254,6 @@ void InternalGuider::processCalibration()
case CAL_NONE:
break;
- case CAL_MANUAL:
- calibrateManualReticle();
- break;
-
case CAL_RA_AUTO:
calibrateRADECRecticle(true);
break;
@@ -269,8 +262,6 @@ void InternalGuider::processCalibration()
calibrateRADECRecticle(false);
break;
}
-
-#endif
}
/*bool InternalGuider::isCalibrating()
@@ -281,10 +272,24 @@ void InternalGuider::processCalibration()
return false;
}*/
+void InternalGuider::setGuideView(FITSView *guideView)
+{
+ guideFrame = guideView;
+
+ pmath->setGuideView(guideFrame);
+
+ //connect(guideFrame, SIGNAL(trackingStarSelected(int,int)), this, SLOT(trackingStarSelected(int, int)), Qt::UniqueConnection);
+}
+
void InternalGuider::reset()
{
//FIXME
+ is_started = false;
+ state = GUIDE_IDLE;
+ //calibrationStage = CAL_IDLE;
+ connect(guideFrame, SIGNAL(trackingStarSelected(int,int)), this, SLOT(trackingStarSelected(int, int)), Qt::UniqueConnection);
+
#if 0
is_started = false;
ui.pushButton_StartCalibration->setText( i18n("Start") );
@@ -295,129 +300,15 @@ void InternalGuider::reset()
#endif
}
-void InternalGuider::calibrateManualReticle( void )
-{
- //----- manual mode ----
- // get start point
-
- calibrationType = CAL_MANUAL;
-
- // FIXME
-
-#if 0
-
- if( !is_started )
- {
- if( ui.twoAxisCheck->checkState() == Qt::Checked )
- {
- ui.pushButton_StartCalibration->setText( i18n("Stop GUIDE_RA") );
- }
- else
- {
- ui.pushButton_StartCalibration->setText( i18n("Stop") );
- }
- guideModule->appendLogText(i18n("Drift scope in RA. Press stop when done."));
-
- calibrationStage = CAL_START;
- pmath->getStarScreenPosition( &start_x1, &start_y1 );
-
- axis = GUIDE_RA;
- is_started = true;
- }
- else // get end point and calc orientation
- {
- if( ui.twoAxisCheck->checkState() == Qt::Checked )
- {
- if( axis == GUIDE_RA )
- {
- pmath->getStarScreenPosition( &end_x1, &end_y1 );
-
- start_x2 = end_x1;
- start_y2 = end_y1;
-
- axis = GUIDE_DEC;
-
- ui.pushButton_StartCalibration->setText( i18n("Stop GUIDE_DEC") );
- guideModule->appendLogText(i18n("Drift scope in DEC. Press Stop when done."));
- return;
- }
- else
- {
- pmath->getStarScreenPosition( &end_x2, &end_y2 );
- bool dec_swap=false;
- // calc orientation
- if( pmath->calculateAndSetReticle2D( start_x1, start_y1, end_x1, end_y1, start_x2, start_y2, end_x2, end_y2, &dec_swap ) )
- {
- fillInterface();
- if (dec_swap)
- guideModule->appendLogText(i18n("DEC swap enabled."));
- else
- guideModule->appendLogText(i18n("DEC swap disabled."));
-
- guideModule->appendLogText(i18n("Calibration completed."));
-
- KNotification::event( QLatin1String( "CalibrationSuccessful" ) , i18n("Guiding calibration completed successfully"));
- calibrationStage = CAL_FINISH;
-
- emit newStatus(Ekos::GUIDE_CALIBRATION_SUCESS);
-
- guideModule->setDECSwap(dec_swap);
- }
- else
- {
- QMessageBox::warning( this, i18n("Error"), i18n("Calibration rejected. Start drift is too short."), QMessageBox::Ok );
- is_started = false;
- calibrationStage = CAL_ERROR;
- emit newStatus(Ekos::GUIDE_CALIBRATION_ERROR);
- }
- }
- }
- else
- {
- pmath->getStarScreenPosition( &end_x1, &end_y1 );
-
- if( pmath->calculateAndSetReticle1D( start_x1, start_y1, end_x1, end_y1 ) )
- {
- calibrationStage = CAL_FINISH;
- fillInterface();
- guideModule->appendLogText(i18n("Calibration completed."));
-
- emit newStatus(Ekos::GUIDE_CALIBRATION_SUCESS);
-
- KNotification::event( QLatin1String( "CalibrationSuccessful" ) , i18n("Guiding calibration completed successfully"));
- }
- else
- {
- calibrationStage = CAL_ERROR;
-
- emit newStatus(Ekos::GUIDE_CALIBRATION_ERROR);
-
- QMessageBox::warning( this, i18n("Error"), i18n("Calibration rejected. Start drift is too short."), QMessageBox::Ok );
- is_started = false;
- KNotification::event( QLatin1String( "CalibrationFailed" ) , i18n("Guiding calibration failed with errors"));
- }
- }
-
- reset();
-
- }
-
-#endif
-}
-
void InternalGuider::calibrateRADECRecticle( bool ra_only )
{
- // FIXME
-#if 0
bool auto_term_ok = false;
+ Q_ASSERT(pmath);
- if( !pmath )
- return;
-
- int pulseDuration = ui.spinBox_Pulse->value();
- int totalPulse = pulseDuration * auto_drift_time;
+ int pulseDuration = Options::calibrationPulseDuration();
+ int totalPulse = pulseDuration * Options::autoModeIterations();
if (ra_only)
calibrationType = CAL_RA_AUTO;
@@ -429,7 +320,7 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
case CAL_START:
//----- automatic mode -----
- auto_drift_time = ui.spinBox_DriftTime->value();
+ auto_drift_time = Options::autoModeIterations();
if (ra_only)
turn_back_time = auto_drift_time*2 + auto_drift_time/2;
@@ -437,39 +328,26 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
turn_back_time = auto_drift_time*6;
iterations = 0;
- ui.progressBar->setMaximum( turn_back_time );
-
- ui.progressBar->setValue( 0 );
+ emit newLog(i18n("GUIDE_RA drifting forward..."));
- ui.pushButton_StartCalibration->setText(i18n("Abort"));
-
- guideModule->appendLogText(i18n("GUIDE_RA drifting forward..."));
-
- // get start point
- //pmath->get_star_screen_pos( &start_x1, &start_y1 );
-
- start_x1 = ui.spinBox_ReticleX->value();
- start_y1 = ui.spinBox_ReticleY->value();
+ pmath->getReticleParameters(&start_x1, &start_y1, NULL);
if (Options::guideLogging())
qDebug() << "Guide: Start X1 " << start_x1 << " Start Y1 " << start_y1;
- guideModule->sendPulse( RA_INC_DIR, pulseDuration );
+ emit newPulse( RA_INC_DIR, pulseDuration );
+
if (Options::guideLogging())
qDebug() << "Guide: Iteration " << iterations << " Direction: " << RA_INC_DIR << " Duration: " << pulseDuration << " ms.";
iterations++;
- ui.progressBar->setValue( iterations );
-
calibrationStage = CAL_RA_INC;
- ui.startCalibrationLED->setColor(busyColor);
-
break;
case CAL_RA_INC:
- guideModule->sendPulse( RA_INC_DIR, pulseDuration );
+ emit newPulse( RA_INC_DIR, pulseDuration );
if (Options::guideLogging())
{
@@ -477,12 +355,10 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
double cur_x, cur_y;
pmath->getStarScreenPosition( &cur_x, &cur_y );
qDebug() << "Guide: Iteration #" << iterations-1 << ": STAR " << cur_x << "," << cur_y;
-
qDebug() << "Guide: Iteration " << iterations << " Direction: " << RA_INC_DIR << " Duration: " << pulseDuration << " ms.";
}
iterations++;
- ui.progressBar->setValue( iterations );
if (iterations == auto_drift_time)
calibrationStage = CAL_RA_DEC;
@@ -500,7 +376,7 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
phi = pmath->calculatePhi( start_x1, start_y1, end_x1, end_y1 );
ROT_Z = RotateZ( -M_PI*phi/180.0 ); // derotates...
- guideModule->appendLogText(i18n("GUIDE_RA drifting reverse..."));
+ emit newLog(i18n("GUIDE_RA drifting reverse..."));
}
@@ -528,7 +404,7 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
{
if (iterations < turn_back_time)
{
- guideModule->sendPulse( RA_DEC_DIR, pulseDuration );
+ emit newPulse( RA_DEC_DIR, pulseDuration );
if (Options::guideLogging())
{
@@ -536,13 +412,10 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
double cur_x, cur_y;
pmath->getStarScreenPosition( &cur_x, &cur_y );
qDebug() << "Guide: Iteration #" << iterations-1 << ": STAR " << cur_x << "," << cur_y;
-
qDebug() << "Guide: Iteration " << iterations << " Direction: " << RA_INC_DIR << " Duration: " << pulseDuration << " ms.";
}
iterations++;
-
- ui.progressBar->setValue( iterations );
break;
}
@@ -550,10 +423,7 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
emit newStatus(Ekos::GUIDE_CALIBRATION_ERROR);
- if (ui.autoStarCheck->isChecked())
- guideModule->appendLogText(i18np("GUIDE_RA: Scope cannot reach the start point after %1 iteration. Possible mount or drive problems...", "GUIDE_RA: Scope cannot reach the start point after %1 iterations. Possible mount or drive problems...", turn_back_time));
- else
- QMessageBox::warning( this, i18n("Warning"), i18np("GUIDE_RA: Scope cannot reach the start point after %1 iteration. Possible mount or drive problems...", "GUIDE_RA: Scope cannot reach the start point after %1 iterations. Possible mount or drive problems...", turn_back_time), QMessageBox::Ok );
+ emit newLog(i18np("GUIDE_RA: Scope cannot reach the start point after %1 iteration. Possible mount or drive problems...", "GUIDE_RA: Scope cannot reach the start point after %1 iterations. Possible mount or drive problems...", turn_back_time));
KNotification::event( QLatin1String( "CalibrationFailed" ) , i18n("Guiding calibration failed with errors"));
reset();
@@ -569,7 +439,7 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
if (Options::guideLogging())
qDebug() << "Guide: Start X2 " << start_x2 << " start Y2 " << start_y2;
- guideModule->sendPulse( DEC_INC_DIR, pulseDuration );
+ emit newPulse( DEC_INC_DIR, pulseDuration );
if (Options::guideLogging())
{
@@ -577,37 +447,34 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
double cur_x, cur_y;
pmath->getStarScreenPosition( &cur_x, &cur_y );
qDebug() << "Guide: Iteration #" << iterations-1 << ": STAR " << cur_x << "," << cur_y;
-
qDebug() << "Guide: Iteration " << iterations << " Direction: " << RA_INC_DIR << " Duration: " << pulseDuration << " ms.";
}
iterations++;
- dec_iterations = 1;
- ui.progressBar->setValue( iterations );
- guideModule->appendLogText(i18n("GUIDE_DEC drifting forward..."));
+ dec_iterations = 1;
+ emit newLog(i18n("GUIDE_DEC drifting forward..."));
break;
}
// calc orientation
if( pmath->calculateAndSetReticle1D( start_x1, start_y1, end_x1, end_y1, totalPulse) )
{
- calibrationStage = CAL_FINISH;
- fillInterface();
- guideModule->appendLogText(i18n("Calibration completed."));
+ calibrationStage = CAL_IDLE;
+
+ // FIXME what is this for?
+ //fillInterface();
+
+ emit newLog(i18n("Calibration completed."));
emit newStatus(Ekos::GUIDE_CALIBRATION_SUCESS);
- ui.startCalibrationLED->setColor(okColor);
KNotification::event( QLatin1String( "CalibrationSuccessful" ) , i18n("Guiding calibration completed successfully"));
//if (ui.autoStarCheck->isChecked())
//guideModule->selectAutoStar();
}
else
{
- if (ui.autoStarCheck->isChecked())
- guideModule->appendLogText(i18n("Calibration rejected. Star drift is too short."));
- else
- QMessageBox::warning( this, i18n("Error"), i18n("Calibration rejected. Star drift is too short."), QMessageBox::Ok );
- ui.startCalibrationLED->setColor(alertColor);
+ emit newLog(i18n("Calibration rejected. Star drift is too short."));
+
calibrationStage = CAL_ERROR;
emit newStatus(Ekos::GUIDE_CALIBRATION_ERROR);
@@ -620,7 +487,7 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
}
case CAL_DEC_INC:
- guideModule->sendPulse( DEC_INC_DIR, pulseDuration );
+ emit newPulse( DEC_INC_DIR, pulseDuration );
if (Options::guideLogging())
{
@@ -628,13 +495,11 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
double cur_x, cur_y;
pmath->getStarScreenPosition( &cur_x, &cur_y );
qDebug() << "Guide: Iteration #" << iterations-1 << ": STAR " << cur_x << "," << cur_y;
-
qDebug() << "Guide: Iteration " << iterations << " Direction: " << RA_INC_DIR << " Duration: " << pulseDuration << " ms.";
}
iterations++;
dec_iterations++;
- ui.progressBar->setValue( iterations );
if (dec_iterations == auto_drift_time)
calibrationStage = CAL_DEC_DEC;
@@ -652,7 +517,7 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
phi = pmath->calculatePhi( start_x2, start_y2, end_x2, end_y2 );
ROT_Z = RotateZ( -M_PI*phi/180.0 ); // derotates...
- guideModule->appendLogText(i18n("GUIDE_DEC drifting reverse..."));
+ emit newLog(i18n("GUIDE_DEC drifting reverse..."));
}
//----- Z-check (new!) -----
@@ -684,7 +549,7 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
{
if (iterations < turn_back_time)
{
- guideModule->sendPulse( DEC_DEC_DIR, pulseDuration );
+ emit newPulse(DEC_DEC_DIR, pulseDuration );
if (Options::guideLogging())
{
@@ -692,14 +557,11 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
double cur_x, cur_y;
pmath->getStarScreenPosition( &cur_x, &cur_y );
qDebug() << "Guide: Iteration #" << iterations-1 << ": STAR " << cur_x << "," << cur_y;
-
qDebug() << "Guide: Iteration " << iterations << " Direction: " << RA_INC_DIR << " Duration: " << pulseDuration << " ms.";
}
iterations++;
dec_iterations++;
-
- ui.progressBar->setValue( iterations );
break;
}
@@ -707,10 +569,7 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
emit newStatus(Ekos::GUIDE_CALIBRATION_ERROR);
- if (ui.autoStarCheck->isChecked())
- guideModule->appendLogText(i18np("GUIDE_DEC: Scope cannot reach the start point after %1 iteration.\nPossible mount or drive problems...", "GUIDE_DEC: Scope cannot reach the start point after %1 iterations.\nPossible mount or drive problems...", turn_back_time));
- else
- QMessageBox::warning( this, i18n("Warning"), i18np("GUIDE_DEC: Scope cannot reach the start point after %1 iteration.\nPossible mount or drive problems...", "GUIDE_DEC: Scope cannot reach the start point after %1 iterations.\nPossible mount or drive problems...", turn_back_time), QMessageBox::Ok );
+ emit newLog(i18np("GUIDE_DEC: Scope cannot reach the start point after %1 iteration.\nPossible mount or drive problems...", "GUIDE_DEC: Scope cannot reach the start point after %1 iterations.\nPossible mount or drive problems...", turn_back_time));
KNotification::event( QLatin1String( "CalibrationFailed" ) , i18n("Guiding calibration failed with errors"));
reset();
@@ -721,18 +580,18 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
// calc orientation
if( pmath->calculateAndSetReticle2D( start_x1, start_y1, end_x1, end_y1, start_x2, start_y2, end_x2, end_y2, &swap_dec, totalPulse ) )
{
- calibrationStage = CAL_FINISH;
- fillInterface();
+ calibrationStage = CAL_IDLE;
+ //fillInterface();
if (swap_dec)
- guideModule->appendLogText(i18n("DEC swap enabled."));
+ emit newLog(i18n("DEC swap enabled."));
else
- guideModule->appendLogText(i18n("DEC swap disabled."));
- guideModule->appendLogText(i18n("Calibration completed."));
+ emit newLog(i18n("DEC swap disabled."));
+
+ emit newLog(i18n("Calibration completed."));
emit newStatus(Ekos::GUIDE_CALIBRATION_SUCESS);
- ui.startCalibrationLED->setColor(okColor);
- guideModule->setDECSwap(swap_dec);
+ emit DESwapChanged(swap_dec);
KNotification::event( QLatin1String( "CalibrationSuccessful" ) , i18n("Guiding calibration completed successfully"));
@@ -742,14 +601,11 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
}
else
{
- if (ui.autoStarCheck->isChecked())
- guideModule->appendLogText(i18n("Calibration rejected. Star drift is too short."));
- else
- QMessageBox::warning( this, i18n("Error"), i18n("Calibration rejected. Star drift is too short."), QMessageBox::Ok );
+ emit newLog(i18n("Calibration rejected. Star drift is too short."));
emit newStatus(Ekos::GUIDE_CALIBRATION_ERROR);
- ui.startCalibrationLED->setColor(alertColor);
+ //ui.startCalibrationLED->setColor(alertColor);
calibrationStage = CAL_ERROR;
KNotification::event( QLatin1String( "CalibrationFailed" ) , i18n("Guiding calibration failed with errors"));
}
@@ -764,41 +620,41 @@ void InternalGuider::calibrateRADECRecticle( bool ra_only )
break;
}
+}
-#endif
+void InternalGuider::setStarPosition(QVector3D starCenter)
+{
+ pmath->setReticleParameters(starCenter.x(), starCenter.y(), -1);
}
void InternalGuider::trackingStarSelected(int x, int y)
{
+ if (calibrationStage == CAL_IDLE)
+ return;
- // FIXME
-
-#if 0
//int square_size = guide_squares[pmath->getSquareIndex()].size;
- pmath->setReticleParameters(x, y, ui.spinBox_ReticleAngle->value());
+ pmath->setReticleParameters(x, y, -1);
//pmath->moveSquare(x-square_size/(2*pmath->getBinX()), y-square_size/(2*pmath->getBinY()));
- update_reticle_pos(x, y);
+ //update_reticle_pos(x, y);
+
- if (calibrationStage == CAL_FINISH)
- return;
- ui.selectStarLED->setColor(okColor);
+ //ui.selectStarLED->setColor(okColor);
calibrationStage = CAL_START;
- ui.pushButton_StartCalibration->setEnabled(true);
+ //ui.pushButton_StartCalibration->setEnabled(true);
- QVector3D starCenter = guideModule->getStarPosition();
+ QVector3D starCenter; // = guideModule->getStarPosition();
starCenter.setX(x);
- starCenter.setY(y);
- guideModule->setStarPosition(starCenter, true);
+ starCenter.setY(y);
+ emit newStarPosition(starCenter, true);
- if (ui.autoStarCheck->isChecked())
- startCalibration();
-
-#endif
+ //if (ui.autoStarCheck->isChecked())
+ if (Options::autoStarEnabled())
+ calibrate();
}
#if 0
@@ -905,5 +761,8 @@ void InternalGuider::toggleAutoSquareSize(bool enable)
#endif
-
+void InternalGuider::setDECSwap(bool enable)
+{
+ pmath->setDeclinationSwapEnabled(enable);
+}
}
diff --git a/kstars/ekos/guide/internalguide/internalguider.h b/kstars/ekos/guide/internalguide/internalguider.h
index 0f825df..b3b1c8f 100644
--- a/kstars/ekos/guide/internalguide/internalguider.h
+++ b/kstars/ekos/guide/internalguide/internalguider.h
@@ -15,6 +15,7 @@
#include <QFile>
#include <QPixmap>
+#include "indi/indicommon.h"
#include "fitsviewer/fitsview.h"
#include "matr.h"
@@ -27,11 +28,12 @@ namespace Ekos
class InternalGuider : public GuideInterface
{
+ Q_OBJECT
public:
- enum CalibrationStage { CAL_CAPTURE_IMAGE, CAL_SELECT_STAR, CAL_FINISH, CAL_ERROR, CAL_START, CAL_RA_INC, CAL_RA_DEC, CAL_DEC_INC, CAL_DEC_DEC };
- enum CalibrationType { CAL_NONE, CAL_MANUAL, CAL_RA_AUTO, CAL_RA_DEC_AUTO };
+ enum CalibrationStage { CAL_IDLE, CAL_ERROR, CAL_CAPTURE_IMAGE, CAL_SELECT_STAR, CAL_START, CAL_RA_INC, CAL_RA_DEC, CAL_DEC_INC, CAL_DEC_DEC };
+ enum CalibrationType { CAL_NONE, CAL_RA_AUTO, CAL_RA_DEC_AUTO };
InternalGuider();
~InternalGuider();
@@ -41,19 +43,27 @@ public:
bool calibrate() override;
bool guide() override;
- bool stop() override;
+ bool abort() override;
bool suspend() override;
bool resume() override;
bool dither(double pixels) override;
+ bool setFrameParams(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t binX, uint16_t binY) override;
bool setGuiderParams(double ccdPixelSizeX, double ccdPixelSizeY, double mountAperture, double mountFocalLength) override;
+ // Set Star Position
+ void setStarPosition(QVector3D starCenter) override;
+
+ // Select algorithm
void setSquareAlgorithm( int index );
// Reticle Parameters
void setReticleParameters(double x, double y, double angle);
bool getReticleParameters(double *x, double *y, double *angle);
+ // Guide View
+ void setGuideView(FITSView *guideView);
+
/// IMPORTED CHECK THEM ALL
@@ -79,22 +89,25 @@ public slots:
void setDECSwap(bool enable);
// OBSELETE
- void connectPHD2();
- void setPHD2Connected();
- void setPHD2Disconnected();
+ //void connectPHD2();
+ //void setPHD2Connected();
+ //void setPHD2Disconnected();
// Only called by PHD2
- void toggleExternalGuideStateGUI(Ekos::GuideState state);
+ //void toggleExternalGuideStateGUI(Ekos::GuideState state);
protected slots:
- void openCalibrationOptions();
- void openGuideOptions();
+ //void openCalibrationOptions();
+ //void openGuideOptions();
- void capture();
+ //void capture();
void trackingStarSelected(int x, int y);
signals:
void newProfilePixmap(QPixmap &);
+ void newPulse( GuideDirection ra_dir, int ra_msecs, GuideDirection dec_dir, int dec_msecs );
+ void newPulse( GuideDirection dir, int msecs );
+ void DESwapChanged(bool enable);
private:
cgmath *pmath;
@@ -115,7 +128,7 @@ private:
// IMPORTED FROM R_CALIBRATION - CLEAN UP
- void fillInterface( void );
+ //void fillInterface( void );
void calibrateManualReticle( void );
void calibrateRADECRecticle( bool ra_only ); // 1 or 2-axis calibration
diff --git a/kstars/ekos/guide/opscalibration.cpp b/kstars/ekos/guide/opscalibration.cpp
index f45bc76..f4ddcc8 100644
--- a/kstars/ekos/guide/opscalibration.cpp
+++ b/kstars/ekos/guide/opscalibration.cpp
@@ -36,8 +36,7 @@ OpsCalibration::OpsCalibration(InternalGuider *guiderObject) : QFrame( KStars::
m_ConfigDialog = KConfigDialog::exists( "guidesettings" );
connect( m_ConfigDialog->button(QDialogButtonBox::Apply), SIGNAL( clicked() ), SLOT( slotApply() ) );
- connect( m_ConfigDialog->button(QDialogButtonBox::Ok), SIGNAL( clicked() ), SLOT( slotApply() ) );
- connect( m_ConfigDialog->button(QDialogButtonBox::Cancel), SIGNAL( clicked() ), SLOT( slotCancel() ) );
+ connect( m_ConfigDialog->button(QDialogButtonBox::Ok), SIGNAL( clicked() ), SLOT( slotApply() ) );
}
@@ -64,8 +63,4 @@ void OpsCalibration::slotApply()
guider->setReticleParameters(spinBox_ReticleX->value(), spinBox_ReticleY->value(), spinBox_ReticleAngle->value());
}
-void OpsCalibration::slotCancel()
-{
-}
-
}
diff --git a/kstars/ekos/guide/opscalibration.h b/kstars/ekos/guide/opscalibration.h
index 0146122..9123411 100644
--- a/kstars/ekos/guide/opscalibration.h
+++ b/kstars/ekos/guide/opscalibration.h
@@ -40,7 +40,6 @@ protected:
private slots:
void slotApply();
- void slotCancel();
private:
KConfigDialog *m_ConfigDialog;
diff --git a/kstars/ekos/guide/opscalibration.ui b/kstars/ekos/guide/opscalibration.ui
index d29d886..ba6a570 100644
--- a/kstars/ekos/guide/opscalibration.ui
+++ b/kstars/ekos/guide/opscalibration.ui
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>298</width>
+ <width>273</width>
<height>168</height>
</rect>
</property>
@@ -22,14 +22,27 @@
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
+ <item row="0" column="1">
<widget class="QLabel" name="l_29">
<property name="text">
<string>Pulse:</string>
</property>
</widget>
</item>
- <item row="0" column="1">
+ <item row="1" column="2">
+ <widget class="QSpinBox" name="kcfg_AutoModeIterations">
+ <property name="minimum">
+ <number>3</number>
+ </property>
+ <property name="maximum">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>5</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
<widget class="QSpinBox" name="kcfg_CalibrationPulseDuration">
<property name="minimum">
<number>100</number>
@@ -45,26 +58,10 @@
</property>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QCheckBox" name="kcfg_AutoModeEnabled">
- <property name="text">
- <string>Auto mode</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
<item row="1" column="1">
- <widget class="QSpinBox" name="kcfg_AutoModeIterations">
- <property name="minimum">
- <number>3</number>
- </property>
- <property name="maximum">
- <number>10</number>
- </property>
- <property name="value">
- <number>5</number>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Iterations:</string>
</property>
</widget>
</item>
diff --git a/kstars/kstars.kcfg b/kstars/kstars.kcfg
index d33e42e..55dfd73 100644
--- a/kstars/kstars.kcfg
+++ b/kstars/kstars.kcfg
@@ -1608,11 +1608,7 @@ sky map.</whatsthis>
<entry name="GuideSquareSizeIndex" type="UInt">
<label>Guide square size index (0 to 4) corresponding to pixel sizes (8 to 128).</label>
<default>1</default>
- </entry>
- <entry name="AutoModeEnabled" type="Bool">
- <label>Automatically calibrate selected axes.</label>
- <default>true</default>
- </entry>
+ </entry>
<entry name="AutoStarEnabled" type="Bool">
<label>Automatically select calibration star and perform calibration.</label>
<default>false</default>
diff --git a/kstars/org.kde.kstars.Ekos.Guide.xml b/kstars/org.kde.kstars.Ekos.Guide.xml
index 51cb54c..db4a65a 100644
--- a/kstars/org.kde.kstars.Ekos.Guide.xml
+++ b/kstars/org.kde.kstars.Ekos.Guide.xml
@@ -4,13 +4,10 @@
<method name="startGuiding">
<arg type="b" direction="out"/>
</method>
- <method name="stopGuiding">
+ <method name="abort">
<arg type="b" direction="out"/>
</method>
- <method name="startCalibration">
- <arg type="b" direction="out"/>
- </method>
- <method name="stopCalibration">
+ <method name="calibrate">
<arg type="b" direction="out"/>
</method>
<method name="capture">
@@ -77,7 +74,7 @@
<arg name="enable" type="b" direction="in"/>
<annotation name="org.freedesktop.DBus.Method.NoReply" value="true"/>
</method>
- <method name="setGuideRapid">
+ <method name="setGuideRapidEnabled">
<arg name="enable" type="b" direction="in"/>
<annotation name="org.freedesktop.DBus.Method.NoReply" value="true"/>
</method>