diff --git a/kstars/CMakeLists.txt b/kstars/CMakeLists.txt --- a/kstars/CMakeLists.txt +++ b/kstars/CMakeLists.txt @@ -140,6 +140,7 @@ ekos/ekoslive/ekoslivedialog.ui # INDI Hub ekos/indihub.ui + ekos/indihubagent.ui ) set(ekos_SRCS @@ -149,6 +150,7 @@ ekos/profilewizard.cpp ekos/qMDNS.cpp ekos/opsekos.cpp + ekos/indihub.cpp # Auxiliary ekos/auxiliary/dome.cpp diff --git a/kstars/ekos/indihub.h b/kstars/ekos/indihub.h --- a/kstars/ekos/indihub.h +++ b/kstars/ekos/indihub.h @@ -22,15 +22,16 @@ Robotic }; -QString toString(uint8_t mode) +struct AgentStatus { - if (mode == Solo) - return "solo"; - else if (mode == Share) - return "share"; - else if (mode == Robotic) - return "robotic"; - else - return "none"; -} + QString version; + QString mode; + QString indiProfile; + QString indiServer; + QString phd2Server; + QString indiServerEndpoint; + QString phd2ServerEndpoint; +}; + +QString toString(uint8_t mode); } diff --git a/kstars/ekos/indihub.h b/kstars/ekos/indihub.cpp copy from kstars/ekos/indihub.h copy to kstars/ekos/indihub.cpp --- a/kstars/ekos/indihub.h +++ b/kstars/ekos/indihub.cpp @@ -8,20 +8,11 @@ */ -#pragma once - +#include "indihub.h" #include namespace INDIHub { -enum -{ - None, - Solo, - Share, - Robotic -}; - QString toString(uint8_t mode) { if (mode == Solo) diff --git a/kstars/ekos/indihub.ui b/kstars/ekos/indihub.ui --- a/kstars/ekos/indihub.ui +++ b/kstars/ekos/indihub.ui @@ -67,6 +67,9 @@ true + + true + diff --git a/kstars/ekos/indihub.ui b/kstars/ekos/indihubagent.ui copy from kstars/ekos/indihub.ui copy to kstars/ekos/indihubagent.ui --- a/kstars/ekos/indihub.ui +++ b/kstars/ekos/indihubagent.ui @@ -1,7 +1,7 @@ - INDIHub - + INDIHubAgent + 0 @@ -11,7 +11,7 @@ - INDI Hub Settings + INDI Hub Agent status @@ -56,7 +56,7 @@ - <html><head/><body><h2 style=" margin-top:16px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:x-large; font-weight:600;">Share access to your observatory on </span><a href="https://indihub.space"><span style=" font-size:x-large; font-weight:600; text-decoration: underline; color:#007af4;">indihub.space</span></a></h2></body></html> + <html><head/><body><h2 style=" margin-top:16px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:x-large; font-weight:600;">Agent Status</h2></body></html> Qt::RichText @@ -79,69 +79,59 @@ 10 - + - Off + + + + Qt::AlignLeft + + + true - - modeButtonGroup - - - - Use you equipment without opening remote access but equipment is still connected to INDIHUB-network and all images taken are contributed for scientific purposes. - + - Solo + + + + Qt::AlignLeft + + + true - - modeButtonGroup - - - - <html><head/><body><p>Open remote access to your equipment via INDIHUB-network of telescopes, so you can provide remote imaging sessions to your guests.</p></body></html> - + - Share + + + + Qt::AlignLeft + + + true - - modeButtonGroup - - - - <html><head/><body><p>Open remote access to your equipment to be controlled by scheduler running in INDIHUB-cloud (experimental).</p></body></html> - + - Robotic (Experimental) + + + + Qt::AlignLeft + + + true - - modeButtonGroup - - - - - Qt::Horizontal - - - - 40 - 20 - - - - @@ -176,3 +166,4 @@ + diff --git a/kstars/ekos/manager.h b/kstars/ekos/manager.h --- a/kstars/ekos/manager.h +++ b/kstars/ekos/manager.h @@ -18,6 +18,7 @@ #include "ui_manager.h" #include "ekos.h" +#include "indihub.h" #include "align/align.h" #include "auxiliary/dome.h" #include "auxiliary/weather.h" @@ -395,6 +396,11 @@ void updateGuideStarPixmap(QPixmap &starPix); void updateGuideProfilePixmap(QPixmap &profilePix); void updateSigmas(double ra, double de); + + // INDI Hub Agent + void getINDIHubAgentStatus(); + void receiveINDIHubAgentStatus(QNetworkReply* reply); + void showINDIHubAgentStatus(); private: explicit Manager(QWidget *parent); @@ -528,6 +534,10 @@ friend class EkosLive::Client; friend class EkosLive::Message; friend class EkosLive::Media; + + // INDI Hub Agent + QNetworkAccessManager m_Manager; + INDIHub::AgentStatus indihubAgentStatus; static Manager *_Manager; }; diff --git a/kstars/ekos/manager.cpp b/kstars/ekos/manager.cpp --- a/kstars/ekos/manager.cpp +++ b/kstars/ekos/manager.cpp @@ -38,6 +38,8 @@ #include "ekoslive/message.h" #include "ekoslive/media.h" +#include "ui_indihubagent.h" + #include #include @@ -140,6 +142,10 @@ emit ekosLiveStatusChanged(false); }); + // INDI HUB Agent status + connect(indihubB, &QPushButton::clicked, this, &Ekos::Manager::showINDIHubAgentStatus); + + // INDI Control Panel //connect(controlPanelB, &QPushButton::clicked, GUIManager::Instance(), SLOT(show())); connect(ekosLiveB, &QPushButton::clicked, [&]() @@ -540,7 +546,10 @@ serialPortAssistantB->setEnabled(false); if (indiHubAgent) + { indiHubAgent->terminate(); + indihubB->setEnabled(false); + } profileGroup->setEnabled(true); @@ -1081,7 +1090,10 @@ { cleanDevices(false); if (indiHubAgent) + { indiHubAgent->terminate(); + indihubB->setEnabled(false); + } } } @@ -1101,6 +1113,9 @@ indiHubAgent->start(Options::iNDIHubAgent(), args); qCDebug(KSTARS_EKOS) << "Started INDIHub agent."; + + // wait 5 sec, then get indihub-agent status + QTimer::singleShot(5000, this, &Ekos::Manager::getINDIHubAgentStatus); } } } @@ -2145,6 +2160,78 @@ observatoryProcess->clearLog(); } +void Manager::getINDIHubAgentStatus() +{ + connect(&m_Manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(receiveINDIHubAgentStatus(QNetworkReply*))); + QUrl url(QString("http://localhost:2020/status")); + m_Manager.get(QNetworkRequest(url)); +} + +void Manager::receiveINDIHubAgentStatus(QNetworkReply* reply) +{ + if (reply->error() != QNetworkReply::NoError) + return; + + QJsonParseError parseError; + QString json = (QString)reply->readAll(); + QJsonDocument json_doc = QJsonDocument::fromJson(json.toUtf8(), &parseError); + if (parseError.error != QJsonParseError::NoError) + return; + + QVariant json_result = json_doc.toVariant(); + QVariantMap result = json_result.toMap(); + indihubAgentStatus.version = result["version"].toString(); + indihubAgentStatus.indiProfile = result["indiProfile"].toString(); + indihubAgentStatus.indiServer = result["indiServer"].toString(); + indihubAgentStatus.phd2Server = result["phd2Server"].toString(); + indihubAgentStatus.mode = result["mode"].toString(); + indihubAgentStatus.indiServerEndpoint = ""; + indihubAgentStatus.phd2ServerEndpoint = ""; + if (indihubAgentStatus.mode != "solo") + { + QList endpointList = result["publicEndpoints"].toList(); + foreach (QVariant endpointVar, endpointList) + { + QVariantMap endpointMap = endpointVar.toMap(); + QString name = endpointMap["name"].toString(); + QString addr = endpointMap["addr"].toString(); + if (name == "INDI-Server") + indihubAgentStatus.indiServerEndpoint = addr; + else if (name == "PHD2-Server") + indihubAgentStatus.phd2ServerEndpoint = addr; + } + } + + + indihubB->setEnabled(true); +} + +void Manager::showINDIHubAgentStatus() +{ + QDialog agentDialog; + Ui::INDIHubAgent indihubAgentUI; + indihubAgentUI.setupUi(&agentDialog); + + indihubAgentUI.logoLabel->setPixmap(QIcon(":/icons/indihub_logo.svg").pixmap(QSize(128, 128))); + indihubAgentUI.agentVersion->setText(QString("Version: ") + indihubAgentStatus.version); + indihubAgentUI.agentMode->setText(QString("Mode: ") + indihubAgentStatus.mode); + + if (indihubAgentStatus.indiServerEndpoint != "") + indihubAgentUI.agentIndiServerEndpoint->setText(QString("INDI-Server: ") + indihubAgentStatus.indiServerEndpoint); + else + indihubAgentUI.agentIndiServerEndpoint->setText(""); + + if (indihubAgentStatus.phd2ServerEndpoint != "") + indihubAgentUI.agentPhd2ServerEndpoint->setText(QString("PHD2-Server: ") + indihubAgentStatus.phd2ServerEndpoint); + else + indihubAgentUI.agentPhd2ServerEndpoint->setText(""); + + + connect(indihubAgentUI.closeB, &QPushButton::clicked, &agentDialog, &QDialog::close); + + agentDialog.exec(); +} + void Manager::initCapture() { if (captureProcess.get() != nullptr) diff --git a/kstars/ekos/manager.ui b/kstars/ekos/manager.ui --- a/kstars/ekos/manager.ui +++ b/kstars/ekos/manager.ui @@ -415,6 +415,35 @@ + + + + false + + + + 32 + 32 + + + + INDI Hub Agent status + + + + + + + :/icons/indihub.svg:/icons/indihub.svg + + + + 22 + 22 + + + +