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 }