File indexing completed on 2024-04-21 14:45:04
0001 /* 0002 SPDX-FileCopyrightText: 2018 Jasem Mutlaq <mutlaqja@ikarustech.com> 0003 0004 Message Channel 0005 0006 SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 #pragma once 0010 0011 #include <QtWebSockets/QWebSocket> 0012 #include <memory> 0013 0014 #include "ekos/ekos.h" 0015 #include "ekos/align/polaralignmentassistant.h" 0016 #include "ekos/manager.h" 0017 #include "catalogsdb.h" 0018 #include "nodemanager.h" 0019 #include <QQueue> 0020 0021 namespace EkosLive 0022 { 0023 class Message : public QObject 0024 { 0025 Q_OBJECT 0026 0027 public: 0028 explicit Message(Ekos::Manager *manager, QVector<QSharedPointer<NodeManager>> &nodeManagers); 0029 virtual ~Message() = default; 0030 0031 bool isConnected() const; 0032 0033 // Module Status Updates 0034 void updateMountStatus(const QJsonObject &status, bool throttle = false); 0035 void updateCaptureStatus(const QJsonObject &status); 0036 void updateFocusStatus(const QJsonObject &status); 0037 void updateGuideStatus(const QJsonObject &status); 0038 void updateDomeStatus(const QJsonObject &status); 0039 void updateCapStatus(const QJsonObject &status); 0040 0041 // Send devices as they come 0042 void sendEvent(const QString &message, KSNotification::EventSource source, KSNotification::EventType event); 0043 void sendScopes(); 0044 void sendDSLRLenses(); 0045 void sendDrivers(); 0046 void sendDevices(); 0047 void sendTrains(); 0048 void sendTrainProfiles(); 0049 0050 // Scheduler 0051 void sendSchedulerJobs(); 0052 void sendSchedulerJobList(QJsonArray jobsList); 0053 void sendSchedulerStatus(const QJsonObject &status); 0054 0055 signals: 0056 void connected(); 0057 void disconnected(); 0058 void expired(const QUrl &url); 0059 void optionsUpdated(); 0060 void resetPolarView(); 0061 0062 public slots: 0063 // Connection 0064 void sendConnection(); 0065 void sendModuleState(const QString &name); 0066 void clearPendingProperties(); 0067 0068 // Ekos 0069 void setEkosStatingStatus(Ekos::CommunicationStatus status); 0070 0071 // INDI 0072 void setINDIStatus(Ekos::CommunicationStatus status); 0073 0074 // Alignment 0075 void setAlignStatus(Ekos::AlignState newState); 0076 void setAlignSolution(const QVariantMap &solution); 0077 void sendAlignSettings(const QVariantMap &settings); 0078 0079 // Guide 0080 void sendGuideSettings(const QVariantMap &settings); 0081 0082 // Focus 0083 void sendFocusSettings(const QVariantMap &settings); 0084 0085 // Mount 0086 void sendMountSettings(const QVariantMap &settings); 0087 0088 // Dark Library 0089 void sendDarkLibrarySettings(const QVariantMap &settings); 0090 0091 //Scheduler 0092 void sendSchedulerSettings(const QVariantMap &settings); 0093 0094 // Polar 0095 void setPAHStage(Ekos::PolarAlignmentAssistant::Stage stage); 0096 void setPAHMessage(const QString &message); 0097 void setPolarResults(QLineF correctionVector, double polarError, double azError, double altError); 0098 void setUpdatedErrors(double total, double az, double alt); 0099 void setPAHEnabled(bool enabled); 0100 void setBoundingRect(QRect rect, QSize view, double currentZoom); 0101 0102 // Capture 0103 void sendCaptureSequence(const QJsonArray &sequenceArray); 0104 void sendPreviewLabel(const QString &preview); 0105 void sendCaptureSettings(const QJsonObject &settings); 0106 0107 // Focus 0108 void autofocusAborted(); 0109 0110 // DSLR 0111 void requestDSLRInfo(const QString &cameraName); 0112 0113 // Port Selection 0114 void requestPortSelection(bool show); 0115 0116 // Trains 0117 void requestOpticalTrains(bool show); 0118 0119 // Dialogs 0120 void sendDialog(const QJsonObject &message); 0121 void processDialogResponse(const QJsonObject &payload); 0122 0123 // Process properties 0124 void processNewProperty(INDI::Property prop); 0125 void processDeleteProperty(INDI::Property prop); 0126 void processUpdateProperty(INDI::Property prop); 0127 0128 // Process message 0129 void processMessage(const QSharedPointer<ISD::GenericDevice> &device, int id); 0130 0131 // StellarSolver 0132 void sendStellarSolverProfiles(); 0133 0134 void sendManualRotatorStatus(double currentPA, double targetPA, double threshold); 0135 0136 private slots: 0137 0138 // Connection 0139 void onConnected(); 0140 void onDisconnected(); 0141 0142 // Communication 0143 void onTextReceived(const QString &); 0144 0145 private: 0146 // Profiles 0147 void sendProfiles(); 0148 void setProfileMapping(const QJsonObject &payload); 0149 void sendStates(); 0150 0151 // Capture 0152 void processCaptureCommands(const QString &command, const QJsonObject &payload); 0153 void setCapturePresetSettings(const QJsonObject &settings); 0154 void sendTemperature(double value); 0155 0156 // Mount 0157 void processMountCommands(const QString &command, const QJsonObject &payload); 0158 0159 // Focus 0160 void processFocusCommands(const QString &command, const QJsonObject &payload); 0161 0162 // Guide 0163 void processGuideCommands(const QString &command, const QJsonObject &payload); 0164 0165 // Align 0166 void processAlignCommands(const QString &command, const QJsonObject &payload); 0167 0168 // Scheduler 0169 void processSchedulerCommands(const QString &command, const QJsonObject &payload); 0170 0171 // Polar 0172 void processPolarCommands(const QString &command, const QJsonObject &payload); 0173 0174 // Profile 0175 void processProfileCommands(const QString &command, const QJsonObject &payload); 0176 0177 // Options 0178 void processOptionsCommands(const QString &command, const QJsonObject &payload); 0179 0180 // Scopes 0181 void processScopeCommands(const QString &command, const QJsonObject &payload); 0182 0183 // DSLRs 0184 void processDSLRCommands(const QString &command, const QJsonObject &payload); 0185 0186 // Trains 0187 void processTrainCommands(const QString &command, const QJsonObject &payload); 0188 0189 // Filter Manager commands 0190 void processFilterManagerCommands(const QString &command, const QJsonObject &payload); 0191 0192 // Dark Library commands 0193 void processDarkLibraryCommands(const QString &command, const QJsonObject &payload); 0194 0195 // Low-level Device commands 0196 void processDeviceCommands(const QString &command, const QJsonObject &payload); 0197 0198 // Process Astronomy Library command 0199 void processAstronomyCommands(const QString &command, const QJsonObject &payload); 0200 0201 void dispatchDebounceQueue(); 0202 0203 KStarsDateTime getNextDawn(); 0204 0205 void sendResponse(const QString &command, const QJsonObject &payload); 0206 void sendResponse(const QString &command, const QJsonArray &payload); 0207 void sendResponse(const QString &command, const QString &payload); 0208 void sendResponse(const QString &command, bool payload); 0209 0210 void sendPendingProperties(); 0211 0212 typedef struct 0213 { 0214 int number_integer; 0215 uint number_unsigned_integer; 0216 double number_double; 0217 bool boolean; 0218 QString text; 0219 QUrl url; 0220 } SimpleTypes; 0221 0222 QObject *findObject(const QString &name); 0223 void invokeMethod(QObject *context, const QJsonObject &payload); 0224 bool parseArgument(QVariant::Type type, const QVariant &arg, QGenericArgument &genericArg, SimpleTypes &types); 0225 0226 Ekos::Manager *m_Manager { nullptr }; 0227 QVector<QSharedPointer<NodeManager>> m_NodeManagers; 0228 0229 bool m_sendBlobs { true}; 0230 0231 QMap<QString, QSet<QString>> m_PropertySubscriptions; 0232 QLineF correctionVector; 0233 QRect m_BoundingRect; 0234 QSize m_ViewSize; 0235 double m_CurrentZoom {100}; 0236 0237 QSet<INDI::Property *> m_PendingProperties; 0238 QTimer m_PendingPropertiesTimer; 0239 QTimer m_DebouncedSend; 0240 QMap<QString, QVariantMap> m_DebouncedMap; 0241 0242 QDateTime m_ThrottleTS; 0243 CatalogsDB::DBManager m_DSOManager; 0244 0245 typedef enum 0246 { 0247 North, 0248 East, 0249 South, 0250 West, 0251 All 0252 } Direction; 0253 0254 // Throttle interval 0255 static const uint16_t THROTTLE_INTERVAL = 1000; 0256 }; 0257 }