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 }