Commit 7b45612a authored by Hy Murveit's avatar Hy Murveit Committed by Jasem Mutlaq

Changed the help popup so that it scrolls. Added a way to input an alternate...

Changed the help popup so that it scrolls. Added a way to input an alternate directory for FITS files.
parent 9278ec8f
<sect2 id="ekos-analyze">
<title>Analyze</title>
<indexterm>
<primary>Tools</primary>
<secondary>Ekos</secondary>
<tertiary>Analyze</tertiary>
</indexterm>
<screenshot>
<screeninfo>
Ekos Analyze Module
</screeninfo>
<mediaobject>
<imageobject>
<imagedata fileref="ekos_analyze.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Ekos Analyze Module</phrase>
</textobject>
</mediaobject>
</screenshot>
<sect3 id="analyze-Introduction">
<title>Introduction</title>
<para>
The Analyze Module records and displays what happened in an imaging session. That is, it does not control any if your imaging, but rather reviews what occurred. Sessions are stored in an <guilabel>analyze</guilabel> folder, a sister folder to the main logging folder. The .analyze files written there can be loaded into the Analyze tab to be viewed. Analyze also can display data from the current imaging session.
</para>
<para>
There are two main graphs, Timeline and Stats. They are coordinated--they always display the same time interval from the Ekos session, though the x-axis of the Timeline shows seconds elapsed from the start of the log, and Stats shows clock time. The x-axis can be zoomed in and out with the +/- button, mouse wheel, as well as with standard keyboard shortcuts (e.g. zoom-in == control +) The x-axis can be panned with the scroll bar as well as with the left and right arrow keys. You can view your current imaging session, or review old sessions by loading .analyze files using the <guilabel>Input</guilabel> dropdown. Checking <guilabel>Full Width</guilabel> displays all the data, and <guilabel>Latest</guilabel> displays the most recent data (you can control the width by zooming).
</para>
</sect3>
<sect3 id="analyze-timeline">
<title>Timeline</title>
<para>
Timeline shows the major Ekos processes, and when they were active. For intance, the <guilabel>Capture</guilabel> line shows when images were taken (green sections) and when imaging was aborted (red sections). Clicking on a green section gives information about that image, and double clicking on one brings up the image taken then in a fitsviewer, if it's available. [Note: if you've moved your captured images, you can set <guilabel>alternate directory</guilabel> in the input menu to a directory which is the base of part of the original file path.] Clicking on a <guilabel>Focus</guilabel> segment shows focus session information and displays up the position vs HFR measurements from that session. Clicking on a <guilabel>Guider</guilabel> segment shows a drift plot from that session, (if it's guiding) and the session's RMS statistics. Other timelines show status information when clicked.
</para>
</sect3>
<sect3 id="analyze-statistics">
<title>Statistics</title>
<para>
A variety of statistics can be displayed on the Stats graph. There are too many for all to be shown in a readable way, so select among them with the checkboxes. A reasonable way to start might be to use <guilabel>rms</guilabel>, <guilabel>snr</guilabel> (using the internal guider with SEP Multistar), and <guilabel>hfr</guilabel> (if you have auto-compute HFR in the FITS options). Experiment with others. The axis shown (0-5) is appropriate only for ra/dec error, drift, rms, pulses, and hfr. These may be y-axis scaled (awkwardly) using the mouse wheel, but the other graphs cannot be scaled. To reset y-axis zooming, right-click on the Stats plot. Clicking on the graph fills in the values of the displayed statistics. This graph is zoomed and panned horizontally in coordination with the timeline.
</para>
</sect3>
</sect2>
......@@ -137,6 +137,7 @@
&tool-ekos-guide;
&tool-ekos-align;
&tool-ekos-scheduler;
&tool-ekos-analyze;
&tool-ekos-tutorials;
</sect1>
......@@ -66,6 +66,7 @@
<!ENTITY tool-ekos-profile-editor SYSTEM "ekos-profile-editor.docbook">
<!ENTITY tool-ekos-profile-wizard SYSTEM "ekos-profile-wizard.docbook">
<!ENTITY tool-ekos-scheduler SYSTEM "ekos-scheduler.docbook">
<!ENTITY tool-ekos-analyze SYSTEM "ekos-analyze.docbook">
<!ENTITY tool-ekos-setup SYSTEM "ekos-setup.docbook">
<!ENTITY tool-ekos-tutorials SYSTEM "ekos-tutorials.docbook">
<!ENTITY tool-ekos-user-interface SYSTEM "ekos-user-interface.docbook">
......
......@@ -102,6 +102,8 @@ if (INDI_FOUND)
ekos/manager.ui
ekos/profileeditor.ui
ekos/profilewizard.ui
# Analyze
ekos/analyze/analyze.ui
# Scheduler
ekos/scheduler/scheduler.ui
ekos/scheduler/mosaic.ui
......@@ -168,6 +170,9 @@ if (INDI_FOUND)
ekos/capture/rotatorsettings.cpp
ekos/capture/customproperties.cpp
# Analyze
ekos/analyze/analyze.cpp
# Scheduler
ekos/scheduler/schedulerjob.cpp
ekos/scheduler/scheduler.cpp
......@@ -982,6 +987,7 @@ ecm_qt_declare_logging_category(kstars_SRCS HEADER ekos_align_debug.h IDENTIFIER
ecm_qt_declare_logging_category(kstars_SRCS HEADER ekos_guide_debug.h IDENTIFIER KSTARS_EKOS_GUIDE CATEGORY_NAME org.kde.kstars.ekos.guide)
ecm_qt_declare_logging_category(kstars_SRCS HEADER ekos_mount_debug.h IDENTIFIER KSTARS_EKOS_MOUNT CATEGORY_NAME org.kde.kstars.ekos.mount)
ecm_qt_declare_logging_category(kstars_SRCS HEADER ekos_scheduler_debug.h IDENTIFIER KSTARS_EKOS_SCHEDULER CATEGORY_NAME org.kde.kstars.ekos.scheduler)
ecm_qt_declare_logging_category(kstars_SRCS HEADER ekos_analyze_debug.h IDENTIFIER KSTARS_EKOS_ANALYZE CATEGORY_NAME org.kde.kstars.ekos.analyze)
ecm_qt_declare_logging_category(kstars_SRCS HEADER ekos_observatory_debug.h IDENTIFIER KSTARS_EKOS_OBSERVATORY CATEGORY_NAME org.kde.kstars.ekos.observatory)
kconfig_add_kcfg_files(kstars_SRCS ${kstars_KCFG_SRCS})
......
......@@ -6,6 +6,7 @@
<file>icons/ekos_guide.png</file>
<file>icons/ekos_mount.png</file>
<file>icons/ekos_scheduler.png</file>
<file>icons/ekos_analyze.png</file>
<file>icons/ekos_setup.png</file>
<file>icons/fov.png</file>
<file>icons/histogram.png</file>
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -687,6 +687,7 @@ void Capture::stop(CaptureState targetState)
stopText = i18n("CCD capture aborted");
break;
}
emit captureAborted(activeJob->getExposure());
KSNotification::event(QLatin1String("CaptureFailed"), stopText);
appendLogText(stopText);
activeJob->abort();
......@@ -1777,6 +1778,10 @@ IPState Capture::setCaptureComplete()
appendLogText(i18n("Received image %1 out of %2.", activeJob->getCompleted(), activeJob->getCount()));
FITSView * currentImage = targetChip->getImageView(FITS_NORMAL);
double hfr = currentImage ? currentImage->getImageData()->getHFR(HFR_AVERAGE) : 0;
emit captureComplete(blobFilename, activeJob->getExposure(), activeJob->getFilterName(), hfr);
m_State = CAPTURE_IMAGE_RECEIVED;
emit newStatus(Ekos::CAPTURE_IMAGE_RECEIVED);
......@@ -2237,6 +2242,7 @@ void Capture::captureImage()
{
case SequenceJob::CAPTURE_OK:
{
emit captureStarting(activeJob->getExposure(), activeJob->getFilterName());
appendLogText(i18n("Capturing %1-second %2 image...", QString("%L1").arg(activeJob->getExposure(), 0, 'f', 3),
activeJob->getFilterName()));
captureTimeout.start(static_cast<int>(activeJob->getExposure()) * 1000 + CAPTURE_TIMEOUT_THRESHOLD);
......
......@@ -757,6 +757,12 @@ class Capture : public QWidget, public Ui::Capture
void dslrInfoRequested(const QString &cameraName);
void driverTimedout(const QString &deviceName);
// Signals for the Analyze tab.
void captureComplete(const QString &filename, double exposureSeconds,
const QString &filter, double hfr);
void captureStarting(double exposureSeconds, const QString &filter);
void captureAborted(double exposureSeconds);
private:
void setBusy(bool enable);
IPState resumeSequence();
......
......@@ -749,6 +749,9 @@ void Focus::start()
<< " Tolerance: " << toleranceIN->value()
<< " Frames: " << 1 /*focusFramesSpin->value()*/ << " Maximum Travel: " << maxTravelIN->value();
emit autofocusStarting(focuserTemperature != INVALID_VALUE
? focuserTemperature : observatoryTemperature, filter());
if (useAutoStar->isChecked())
appendLogText(i18n("Autofocus in progress..."));
else
......@@ -834,6 +837,17 @@ void Focus::checkStopFocus()
void Focus::abort()
{
QString str = "";
const int size = hfr_position.size();
for (int i = 0; i < size; ++i)
{
str.append(QString("%1%2|%3")
.arg(i == 0 ? "" : "|" )
.arg(QString::number(hfr_position[i], 'f', 0))
.arg(QString::number(hfr_value[i], 'f', 3)));
}
emit autofocusAborted(filter(), str);
stop(true);
}
......@@ -1260,6 +1274,20 @@ bool Focus::appendHFR(double newHFR)
return HFRFrames.count() < focusFramesSpin->value();
}
void Focus::emitComplete()
{
QString str = "";
const int size = hfr_position.size();
for (int i = 0; i < size; ++i)
{
str.append(QString("%1%2|%3")
.arg(i == 0 ? "" : "|" )
.arg(QString::number(hfr_position[i], 'f', 0))
.arg(QString::number(hfr_value[i], 'f', 3)));
}
emit autofocusComplete(filter(), str);
}
void Focus::setCaptureComplete()
{
DarkLibrary::Instance()->disconnect(this);
......@@ -1333,6 +1361,7 @@ void Focus::setCaptureComplete()
if (focusAlgorithm == FOCUS_POLYNOMIAL && polySolutionFound == MINIMUM_POLY_SOLUTIONS)
{
polySolutionFound = 0;
emitComplete();
appendLogText(i18n("Autofocus complete after %1 iterations.", hfr_position.count()));
stop();
setAutoFocusResult(true);
......@@ -1903,6 +1932,7 @@ void Focus::autoFocusLinear()
{
if (linearFocuser->isDone() && linearFocuser->solution() != -1)
{
emitComplete();
appendLogText(i18np("Autofocus complete after %1 iteration.",
"Autofocus complete after %1 iterations.", hfr_position.count()));
stop();
......@@ -1998,6 +2028,7 @@ void Focus::autoFocusAbs()
}
else
{
emitComplete();
appendLogText(i18n("Autofocus complete after %1 iterations.", hfr_position.count()));
stop();
setAutoFocusResult(true);
......@@ -2187,6 +2218,7 @@ void Focus::autoFocusAbs()
// Ops, we can't go any further, we're done.
if (targetPosition == currentPosition)
{
emitComplete();
appendLogText(i18n("Autofocus complete after %1 iterations.", hfr_position.count()));
stop();
setAutoFocusResult(true);
......@@ -2309,6 +2341,7 @@ void Focus::autoFocusRel()
case FOCUS_OUT:
if (fabs(currentHFR - minHFR) < (toleranceIN->value() / 100.0) && HFRInc == 0)
{
emitComplete();
appendLogText(i18n("Autofocus complete after %1 iterations.", hfr_position.count()));
stop();
setAutoFocusResult(true);
......
......@@ -387,6 +387,10 @@ class Focus : public QWidget, public Ui::Focus
void newStarPixmap(QPixmap &);
void newProfilePixmap(QPixmap &);
// Signals for Analyze.
void autofocusStarting(double temperature, const QString &filter);
void autofocusComplete(const QString &filter, const QString &points);
void autofocusAborted(const QString &filter, const QString &points);
private:
////////////////////////////////////////////////////////////////////
......@@ -462,6 +466,12 @@ class Focus : public QWidget, public Ui::Focus
*/
bool appendHFR(double newHFR);
/**
* @brief emitComplete emits the message needed for Analyze when focus completes.
*/
void emitComplete();
void initializeFocuserTemperature();
void setLastFocusTemperature();
void updateTemperature(TemperatureSource source, double newTemperature);
......
......@@ -483,6 +483,10 @@ void PHD2::processPHD2Event(const QJsonObject &jsonEvent, const QByteArray &line
emit newAxisDelta(diff_ra_arcsecs, diff_de_arcsecs);
emit newAxisPulse(pulse_ra, pulse_dec);
// Does PHD2 real a sky background or num-stars measure?
emit guideStats(diff_ra_arcsecs, diff_de_arcsecs, pulse_ra, pulse_dec,
std::isfinite(snr) ? snr : 0, 0, 0);
double total_sqr_RA_error = 0.0;
double total_sqr_DE_error = 0.0;
......
......@@ -1842,8 +1842,10 @@ void Guide::setMountStatus(ISD::Telescope::Status newState)
}
}
void Guide::setMountCoords(const QString &ra, const QString &dec, const QString &az, const QString &alt, int pierSide)
void Guide::setMountCoords(const QString &ra, const QString &dec, const QString &az, const QString &alt, int pierSide,
const QString &ha)
{
Q_UNUSED(ha);
guider->setMountCoords(ra, dec, az, alt, pierSide);
}
......@@ -2366,6 +2368,7 @@ bool Guide::setGuiderType(int type)
connect(guider, &Ekos::GuideInterface::newLog, this, &Ekos::Guide::appendLogText);
connect(guider, &Ekos::GuideInterface::newStatus, this, &Ekos::Guide::setStatus);
connect(guider, &Ekos::GuideInterface::newStarPosition, this, &Ekos::Guide::setStarPosition);
connect(guider, &Ekos::GuideInterface::guideStats, this, &Ekos::Guide::guideStats);
connect(guider, &Ekos::GuideInterface::newAxisDelta, this, &Ekos::Guide::setAxisDelta);
connect(guider, &Ekos::GuideInterface::newAxisPulse, this, &Ekos::Guide::setAxisPulse);
......
......@@ -377,7 +377,8 @@ class Guide : public QWidget, public Ui::Guide
void setCaptureStatus(Ekos::CaptureState newState);
// Update Mount module status
void setMountStatus(ISD::Telescope::Status newState);
void setMountCoords(const QString &ra, const QString &dec, const QString &az, const QString &alt, int pierSide);
void setMountCoords(const QString &ra, const QString &dec, const QString &az, const QString &alt, int pierSide,
const QString &ha);
// Update Pier Side
void setPierSide(ISD::Telescope::PierSide newSide);
......@@ -493,6 +494,9 @@ class Guide : public QWidget, public Ui::Guide
// Sigma deviations in arcsecs RMS
void newAxisSigma(double ra, double de);
void guideStats(double raError, double decError, int raPulse, int decPulse,
double snr, double skyBg, int numStars);
void guideChipUpdated(ISD::CCDChip *);
void driverTimedout(const QString &deviceName);
......
......@@ -86,7 +86,8 @@ class GuideInterface : public QObject
void newSNR(double snr);
void calibrationUpdate(CalibrationUpdateType type, const QString &message = QString(""), double x = 0, double y = 0);
void frameCaptureRequested();
void guideStats(double raError, double decError, int raPulse, int decPulse,
double snr, double skyBg, int numStars);
void guideEquipmentUpdated();
protected:
......
......@@ -1180,6 +1180,9 @@ void cgmath::performProcessing(GuideLog *logger, bool guiding)
// process statistics
calc_square_err();
if (guiding)
emitStats();
// finally process tickers
do_ticks();
}
......@@ -1218,6 +1221,28 @@ void cgmath::performProcessing(GuideLog *logger, bool guiding)
qCDebug(KSTARS_EKOS_GUIDE) << "################## FINISH PROCESSING ##################";
}
void cgmath::emitStats()
{
double pulseRA = 0;
if (out_params.pulse_dir[GUIDE_RA] == RA_DEC_DIR)
pulseRA = out_params.pulse_length[GUIDE_RA];
else if (out_params.pulse_dir[GUIDE_RA] == RA_INC_DIR)
pulseRA = -out_params.pulse_length[GUIDE_RA];
double pulseDEC = 0;
if (out_params.pulse_dir[GUIDE_DEC] == DEC_DEC_DIR)
pulseDEC = -out_params.pulse_length[GUIDE_DEC];
else if (out_params.pulse_dir[GUIDE_DEC] == DEC_INC_DIR)
pulseDEC = out_params.pulse_length[GUIDE_DEC];
const bool hasGuidestars = (square_alg_idx == SEP_MULTISTAR);
const double snr = hasGuidestars ? guideStars.getGuideStarSNR() : 0;
const double skyBG = hasGuidestars ? guideStars.skybackground().mean : 0;
const int numStars = hasGuidestars ? guideStars.skybackground().starsDetected : 0; // wait for rob's release
emit guideStats(-out_params.delta[GUIDE_RA], -out_params.delta[GUIDE_DEC],
pulseRA, pulseDEC, snr, skyBG, numStars);
}
void cgmath::calc_square_err(void)
{
if (!do_statistics)
......
......@@ -197,6 +197,10 @@ class cgmath : public QObject
void newAxisDelta(double delta_ra, double delta_dec);
void newStarPosition(QVector3D, bool);
// For Analyze.
void guideStats(double raError, double decError, int raPulse, int decPulse,
double snr, double skyBg, int numStars);
private:
// Templated functions
template <typename T>
......@@ -214,6 +218,9 @@ class cgmath : public QObject
// Old-stye Logging--deprecate.
void createGuideLog();
// For Analyze.
void emitStats();
/// Global channel ticker
uint32_t ticks { 0 };
/// Pointer to image
......
......@@ -34,6 +34,7 @@ InternalGuider::InternalGuider()
// Create math object
pmath.reset(new cgmath());
connect(pmath.get(), &cgmath::newStarPosition, this, &InternalGuider::newStarPosition);
connect(pmath.get(), &cgmath::guideStats, this, &InternalGuider::guideStats);
// Do this so that stored calibration will be visible on the
// guide options menu. Calibration will get restored again when needed.
......
......@@ -120,6 +120,9 @@ Manager::Manager(QWidget * parent) : QDialog(parent)
// Enable scheduler Tab
toolsWidget->setTabEnabled(1, false);
// Enable analyze Tab
toolsWidget->setTabEnabled(2, false);
// Start/Stop INDI Server
connect(processINDIB, &QPushButton::clicked, this, &Ekos::Manager::processINDI);
processINDIB->setIcon(QIcon::fromTheme("media-playback-start"));
......@@ -281,8 +284,8 @@ Manager::Manager(QWidget * parent) : QDialog(parent)
// Initialize Ekos Scheduler Module
schedulerProcess.reset(new Ekos::Scheduler());
toolsWidget->addTab(schedulerProcess.get(), QIcon(":/icons/ekos_scheduler.png"), "");
toolsWidget->tabBar()->setTabToolTip(1, i18n("Scheduler"));
int index = toolsWidget->addTab(schedulerProcess.get(), QIcon(":/icons/ekos_scheduler.png"), "");
toolsWidget->tabBar()->setTabToolTip(index, i18n("Scheduler"));
connect(schedulerProcess.get(), &Scheduler::newLog, this, &Ekos::Manager::updateLog);
//connect(schedulerProcess.get(), SIGNAL(newTarget(QString)), mountTarget, SLOT(setText(QString)));
connect(schedulerProcess.get(), &Ekos::Scheduler::newTarget, [&](const QString & target)
......@@ -291,6 +294,13 @@ Manager::Manager(QWidget * parent) : QDialog(parent)
ekosLiveClient.get()->message()->updateMountStatus(QJsonObject({{"target", target}}));
});
// Initialize Ekos Analyze Module
analyzeProcess.reset(new Ekos::Analyze());
index = toolsWidget->addTab(analyzeProcess.get(), QIcon(":/icons/ekos_analyze.png"), "");
toolsWidget->tabBar()->setTabToolTip(index, i18n("Analyze"));
numPermanentTabs = index + 1;
// Temporary fix. Not sure how to resize Ekos Dialog to fit contents of the various tabs in the QScrollArea which are added
// dynamically. I used setMinimumSize() but it doesn't appear to make any difference.
// Also set Layout policy to SetMinAndMaxSize as well. Any idea how to fix this?
......@@ -323,15 +333,13 @@ Manager::Manager(QWidget * parent) : QDialog(parent)
QTransform trans;
trans.rotate(90);
QIcon icon = toolsWidget->tabIcon(0);
QPixmap pix = icon.pixmap(QSize(48, 48));
icon = QIcon(pix.transformed(trans));
toolsWidget->setTabIcon(0, icon);
icon = toolsWidget->tabIcon(1);
pix = icon.pixmap(QSize(48, 48));
icon = QIcon(pix.transformed(trans));
toolsWidget->setTabIcon(1, icon);
for (int i = 0; i < numPermanentTabs; ++i)
{
QIcon icon = toolsWidget->tabIcon(i);
QPixmap pix = icon.pixmap(QSize(48, 48));
icon = QIcon(pix.transformed(trans));
toolsWidget->setTabIcon(i, icon);
}
}
//Note: This is to prevent a button from being called the default button
......@@ -2577,7 +2585,7 @@ void Manager::removeTabs()
{
disconnect(toolsWidget, &QTabWidget::currentChanged, this, &Ekos::Manager::processTabChange);
for (int i = 2; i < toolsWidget->count(); i++)
for (int i = numPermanentTabs; i < toolsWidget->count(); i++)
toolsWidget->removeTab(i);
alignProcess.reset();
......@@ -2869,8 +2877,11 @@ void Manager::updateMountStatus(ISD::Telescope::Status status)
ekosLiveClient.get()->message()->updateMountStatus(cStatus);
}
void Manager::updateMountCoords(const QString &ra, const QString &dec, const QString &az, const QString &alt)
void Manager::updateMountCoords(const QString &ra, const QString &dec, const QString &az, const QString &alt,
int pierSide, const QString &ha)
{
Q_UNUSED(ha);
Q_UNUSED(pierSide);
raOUT->setText(ra);
decOUT->setText(dec);
azOUT->setText(az);
......@@ -3483,6 +3494,62 @@ void Manager::connectModules()
connect(alignProcess.get(), &Ekos::Align::newCorrectionVector, ekosLiveClient.get()->media(),
&EkosLive::Media::setCorrectionVector);
}
// Analyze connections.
if (analyzeProcess.get())
{
if (captureProcess.get())
{
connect(captureProcess.get(), &Ekos::Capture::captureComplete,
analyzeProcess.get(), &Ekos::Analyze::captureComplete, Qt::UniqueConnection);
connect(captureProcess.get(), &Ekos::Capture::captureStarting,
analyzeProcess.get(), &Ekos::Analyze::captureStarting, Qt::UniqueConnection);
connect(captureProcess.get(), &Ekos::Capture::captureAborted,
analyzeProcess.get(), &Ekos::Analyze::captureAborted, Qt::UniqueConnection);
#if 0
// Meridian Flip
connect(captureProcess.get(), &Ekos::Capture::meridianFlipStarted,
analyzeProcess.get(), &Ekos::Analyze::meridianFlipStarted, Qt::UniqueConnection);
connect(captureProcess.get(), &Ekos::Capture::meridianFlipCompleted,
analyzeProcess.get(), &Ekos::Analyze::meridianFlipComplete, Qt::UniqueConnection);
#endif
}
if (guideProcess.get())
{
connect(guideProcess.get(), &Ekos::Guide::newStatus,
analyzeProcess.get(), &Ekos::Analyze::guideState, Qt::UniqueConnection);
connect(guideProcess.get(), &Ekos::Guide::guideStats,
analyzeProcess.get(), &Ekos::Analyze::guideStats, Qt::UniqueConnection);
}
}
if (focusProcess.get())
{
connect(focusProcess.get(), &Ekos::Focus::autofocusComplete,
analyzeProcess.get(), &Ekos::Analyze::autofocusComplete, Qt::UniqueConnection);
connect(focusProcess.get(), &Ekos::Focus::autofocusStarting,
analyzeProcess.get(), &Ekos::Analyze::autofocusStarting, Qt::UniqueConnection);
connect(focusProcess.get(), &Ekos::Focus::autofocusAborted,
analyzeProcess.get(), &Ekos::Analyze::autofocusAborted, Qt::UniqueConnection);
}
if (alignProcess.get())
{
connect(alignProcess.get(), &Ekos::Align::newStatus,
analyzeProcess.get(), &Ekos::Analyze::alignState, Qt::UniqueConnection);
}
if (mountProcess.get())
{
// void newStatus(ISD::Telescope::Status status);
connect(mountProcess.get(), &Ekos::Mount::newStatus,
analyzeProcess.get(), &Ekos::Analyze::mountState, Qt::UniqueConnection);
//void newCoords(const QString &ra, const QString &dec,
// const QString &az, const QString &alt, int pierSide);
connect(mountProcess.get(), &Ekos::Mount::newCoords,
analyzeProcess.get(), &Ekos::Analyze::mountCoords, Qt::UniqueConnection);
// void newMeridianFlipStatus(MeridianFlipStatus status);
connect(mountProcess.get(), &Ekos::Mount::newMeridianFlipStatus,
analyzeProcess.get(), &Ekos::Analyze::mountFlipStatus, Qt::UniqueConnection);
}
}
void Manager::setEkosLiveConnected(bool enabled)
......@@ -3586,7 +3653,7 @@ void Manager::syncActiveDevices()
}
}
bool Manager::checkUniqueBinaryDriver(DriverInfo *primaryDriver, DriverInfo *secondaryDriver)
bool Manager::checkUniqueBinaryDriver(DriverInfo * primaryDriver, DriverInfo * secondaryDriver)
{
if (!primaryDriver || !secondaryDriver)
return false;
......
......@@ -28,6 +28,7 @@
#include "indi/indistd.h"
#include "mount/mount.h"
#include "scheduler/scheduler.h"
#include "analyze/analyze.h"
#include "observatory/observatory.h"
#include "auxiliary/filtermanager.h"
#include "auxiliary/serialportassistant.h"
......@@ -390,7 +391,8 @@ class Manager : public QDialog, public Ui::Manager
void wizardProfile();
// Mount Summary
void updateMountCoords(const QString &ra, const QString &dec, const QString &az, const QString &alt);
void updateMountCoords(const QString &ra, const QString &dec, const QString &az, const QString &alt, int pierSide,
const QString &ha);
void updateMountStatus(ISD::Telescope::Status status);
void setTarget(SkyObject *o);
......@@ -490,6 +492,7 @@ class Manager : public QDialog, public Ui::Manager
std::unique_ptr<Guide> guideProcess;
std::unique_ptr<Align> alignProcess;
std::unique_ptr<Mount> mountProcess;
std::unique_ptr<Analyze> analyzeProcess;
std::unique_ptr<Scheduler> schedulerProcess;
std::unique_ptr<Observatory> observatoryProcess;
std::unique_ptr<Dome> domeProcess;
......@@ -546,6 +549,9 @@ class Manager : public QDialog, public Ui::Manager
// Logs
QPointer<OpsLogs> opsLogs;
// E.g. Setup, Scheduler, and Analyze.
int numPermanentTabs { 0 };
friend class EkosLive::Client;
friend class EkosLive::Message;
friend class EkosLive::Media;
......
......@@ -645,8 +645,9 @@ void Mount::updateTelescopeCoords()
lastAlt = currentAlt;
lastHa = hourAngle();
dms ha2(lst - telescopeCoord.ra());
emit newCoords(raOUT->text(), decOUT->text(), azOUT->text(), altOUT->text(),
currentTelescope->pierSide());
currentTelescope->pierSide(), ha2.toHMSString());
ISD::Telescope::Status currentStatus = currentTelescope->status();
if (m_Status != currentStatus)
......
......@@ -426,8 +426,8 @@ class Mount : public QWidget, public Ui::Mount
signals:
void newLog(const QString &text);
void newCoords(const QString &ra, const QString &dec,
const QString &az, const QString &alt, int pierSide);
void newCoords(const QString &ra, const QString &dec, const QString &az,
const QString &alt, int pierSide, const QString &ha);
void newTarget(const QString &name);
void newStatus(