File indexing completed on 2024-04-21 03:42:57

0001 /*
0002     SPDX-FileCopyrightText: 2021 Jasem Mutlaq <mutlaqja@ikarustech.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include <QDialog>
0010 #include <QStandardItemModel>
0011 #include <QJsonObject>
0012 #include <QLabel>
0013 #include <QComboBox>
0014 #include <QLineEdit>
0015 #include <QHBoxLayout>
0016 
0017 #include <KLed>
0018 
0019 #include <memory>
0020 
0021 #include "indi/indistd.h"
0022 #include "profileinfo.h"
0023 
0024 namespace  Selector
0025 {
0026 
0027 typedef enum
0028 {
0029     CONNECTION_SERIAL,
0030     CONNECTION_NETWORK,
0031     CONNECTION_NONE
0032 
0033 } ConnectionMode;
0034 
0035 
0036 class Device : public QObject
0037 {
0038         Q_OBJECT
0039 
0040     public:
0041         explicit Device(const QSharedPointer<ISD::GenericDevice> &device, QGridLayout *grid, uint8_t row);
0042 
0043         const QString name() const
0044         {
0045             return m_Name;
0046         }
0047 
0048         uint8_t systemPortCount() const;
0049 
0050         ConnectionMode activeConnectionMode()
0051         {
0052             return m_ActiveConnectionMode;
0053         }
0054 
0055         // Create GUI
0056         bool initGUI();
0057         // Sync GUI to data
0058         void syncGUI();
0059 
0060     private:
0061         void updateProperty(INDI::Property prop);
0062         void setConnected();
0063         void setDisconnected();
0064         void setConnectionMode(ConnectionMode mode);
0065 
0066         // N.B. JM: Using smart pointers doesn't work very well in Qt widget parent/child
0067         // scheme and can lead to double deletion, so we're sticking to regular pointers.
0068         // General
0069         KLed *m_LED {nullptr};
0070         QLabel *m_Label {nullptr};
0071         QPushButton *m_ConnectB {nullptr};
0072         QPushButton *m_DisconnectB {nullptr};
0073         // Serial
0074         QPushButton *m_SerialB {nullptr};
0075         QComboBox *m_Ports {nullptr};
0076         QComboBox *m_BaudRates {nullptr};
0077         // Network
0078         QPushButton *m_NetworkB {nullptr};
0079         QLineEdit *m_HostName {nullptr};
0080         QLineEdit *m_HostPort {nullptr};
0081         QPushButton *m_HostProtocolTCP {nullptr};
0082         QPushButton *m_HostProtocolUDP {nullptr};
0083 
0084         QMap<IPState, QColor> ColorCode;
0085         ConnectionMode m_ConnectionMode { CONNECTION_NONE };
0086 
0087 
0088         QString m_Name;
0089         QSharedPointer<ISD::GenericDevice> m_Device;
0090         QGridLayout *m_Grid{nullptr};
0091         uint8_t m_Row {0};
0092         ConnectionMode m_ActiveConnectionMode {CONNECTION_NONE};
0093 
0094         static const QStringList BAUD_RATES;
0095         static const QString ACTIVE_STYLESHEET;
0096 };
0097 
0098 class Dialog : public QDialog
0099 {
0100     public:
0101         explicit Dialog(QWidget *parent = nullptr);
0102 
0103         // Initialize device
0104         void addDevice(const QSharedPointer<ISD::GenericDevice> &device);
0105         void removeDevice(const QString &name);
0106 
0107         bool shouldShow() const;
0108 
0109         bool empty() const
0110         {
0111             return m_Devices.empty();
0112         }
0113 
0114     private:
0115 
0116         std::vector <std::unique_ptr< Device>> m_Devices;
0117         QGridLayout *m_Layout {nullptr};
0118 };
0119 
0120 }