diff --git a/KelvinDashboardGUI/DapChainNodeNetworkExplorer.cpp b/KelvinDashboardGUI/DapChainNodeNetworkExplorer.cpp index bfaf920783e3e84864efcdda75c603bd0bd85394..53a988b055634675f1a6529f4dcfc9051ef27507 100644 --- a/KelvinDashboardGUI/DapChainNodeNetworkExplorer.cpp +++ b/KelvinDashboardGUI/DapChainNodeNetworkExplorer.cpp @@ -53,17 +53,14 @@ void DapChainNodeNetworkExplorer::mousePressEvent(QMouseEvent* event) void DapChainNodeNetworkExplorer::wheelEvent(QWheelEvent* event) { -// if(event->modifiers() == Qt::ControlModifier) -// { - if(event->delta() > 1) - { - if(scale() < 1.8) setScale(scale() + 0.1); - } - else - { - if(scale() > 0.5) setScale(scale() - 0.1); - } -// } + if(event->delta() > 1) + { + if(scale() < 1.8) setScale(scale() + 0.1); + } + else + { + if(scale() > 0.5) setScale(scale() - 0.1); + } } void DapChainNodeNetworkExplorer::hoverMoveEvent(QHoverEvent* event) diff --git a/KelvinDashboardGUI/DapChainNodeNetworkExplorer.h b/KelvinDashboardGUI/DapChainNodeNetworkExplorer.h index b0017d2fa184f2267c0127927962e54be6b7f815..5e348687556a393f1f9155c71ac8f21d2b41fe7a 100644 --- a/KelvinDashboardGUI/DapChainNodeNetworkExplorer.h +++ b/KelvinDashboardGUI/DapChainNodeNetworkExplorer.h @@ -9,12 +9,9 @@ #include "DapChainNodeNetworkModel.h" #include "DapNodeType.h" -/*! - * \brief The DapChainNodeNetworkExplorer class - * \details Class paiting DapKelvin map - * \warning To use this class it requers to send DapChainNodeNetworkModel model to slot setModel() - * \author Tagiltsev Evgenii - */ +/// The DapChainNodeNetworkExplorer class +/// details Class paiting DapKelvin map +/// @warning To use this class it requers to send DapChainNodeNetworkModel model to slot setModel() class DapChainNodeNetworkExplorer : public QQuickPaintedItem { Q_OBJECT @@ -44,13 +41,13 @@ private: QMap<QString /*Address*/, DapNodeGui /*NodeDataGui*/> m_nodeMap; // node map for gui QPair<QString /*Address*/, DapNodeGui* /*NodeDataGui*/> m_currentSelectedNode; // selected node - QColor m_colorOnline; // Property color for online status - QColor m_colorOffline; // Property color for offline status - QColor m_colorSelect; // Property color for selected state - QColor m_colorNormal; // Property color for normal state - QColor m_colorFocused; // Property color for focused state - int m_widthLine; // Property width line for borders - int m_sizeNode; // Property lenght of square's side + QColor m_colorOnline; + QColor m_colorOffline; + QColor m_colorSelect; + QColor m_colorNormal; + QColor m_colorFocused; + int m_widthLine; + int m_sizeNode; protected: void mousePressEvent(QMouseEvent* event); @@ -59,38 +56,85 @@ protected: public: explicit DapChainNodeNetworkExplorer(QQuickItem *parent = nullptr); - void paint(QPainter* painter); //!< Overload method for paiting - - QColor getColorOnline() const; //!< Get color for online nodes - QColor getColorOffline() const; //!< Get color for offline nodes - QColor getColorSelect() const; //!< Get color for selected node - QColor getColorNormal() const; //!< Get color for normal state for node - QColor getColorFocused() const; //!< Get color for focused node - int getWidthLine() const; //!< Get line width for borders - int getSizeNode() const; //!< Get lenght of square's side - - DapChainNodeNetworkModel* getModel() const; //!< Get model - - Q_INVOKABLE int getSelectedNodePosX() const; //!< Get X position for selected node - Q_INVOKABLE int getSelectedNodePosY() const; //!< Get Y position for selected node - Q_INVOKABLE QString getSelectedNodeAddress() const; //!< Get address for selected node - Q_INVOKABLE QString getSelectedNodeAlias() const; //!< Get alias for selected node - Q_INVOKABLE QString getSelectedNodeIpv4() const; //!< Get Ipv4 address for selected node - Q_INVOKABLE QString getAddressByPos(const int aX, const int aY); //!< Find node address by coordinate + /// Overload method for paiting + void paint(QPainter* painter); + + /// Get color for online nodes + /// @return color of online nodes + QColor getColorOnline() const; + /// Get color for offline nodes + /// @return color of offline nodes + QColor getColorOffline() const; + /// Get color for selected node + /// @return color of seletected node + QColor getColorSelect() const; + /// Get color for normal state for node + /// @return color of normal state + QColor getColorNormal() const; + /// Get color for focused node + /// @return color of focused node + QColor getColorFocused() const; + /// Get line width for borders + /// @return width of line + int getWidthLine() const; + /// Get lenght of square's side + /// @return diameter of node element + int getSizeNode() const; + + /// Get model + /// @return model for network explorer + DapChainNodeNetworkModel* getModel() const; + + /// Get X position for selected node + /// @return X position of selected node + Q_INVOKABLE int getSelectedNodePosX() const; + /// Get Y position for selected node + /// @return Y position of selected node + Q_INVOKABLE int getSelectedNodePosY() const; + /// Get address for selected node + /// @return address of selected node + Q_INVOKABLE QString getSelectedNodeAddress() const; + /// Get alias for selected node + /// @return alias of selected node + Q_INVOKABLE QString getSelectedNodeAlias() const; + /// Get Ipv4 address for selected node + /// @return Ipv4 address of selected node + Q_INVOKABLE QString getSelectedNodeIpv4() const; + /// Find node address by coordinate + /// @param X position + /// @param Y position + /// @return address of node + Q_INVOKABLE QString getAddressByPos(const int aX, const int aY); public slots: - void setColorSelect(const QColor& aColorSelect); //!< Set color for selected node - void setColorNormal(const QColor& aColorNormal); //!< Set color for normal state for node - void setColorFocused(const QColor& aColorActivated); //!< Set color for focused node - void setColorOnline(const QColor& aColorOnline); //!< Set color for online nodes - void setColorOffline(const QColor& aColorOffline); //!< Set color for offline nodes - void setWidthLine(const int widthLine); //!< Set line width for borders - void setSizeNode(const int sizeNode); //!< Set lenght of square's side - - void setModel(DapChainNodeNetworkModel* aModel); //!< Set model + /// Set color for selected node + /// @param color for selected node + void setColorSelect(const QColor& aColorSelect); + /// Set color for normal state for node + /// @param color for normal state of node + void setColorNormal(const QColor& aColorNormal); + /// Set color for focused node + /// @param color for focused node + void setColorFocused(const QColor& aColorActivated); + /// Set color for online nodes + /// @param color for online nodes + void setColorOnline(const QColor& aColorOnline); + /// Set color for offline nodes + /// @param color offline nodes + void setColorOffline(const QColor& aColorOffline); + /// Set line width for borders + /// @param width of line + void setWidthLine(const int widthLine); + /// Set lenght of square's side + /// @param diameter of node element + void setSizeNode(const int sizeNode); + + /// Set model + /// @param model for explorer + void setModel(DapChainNodeNetworkModel* aModel); private slots: - void proccessCreateGraph(); // Slot for repainting map if it was changed + void proccessCreateGraph(); signals: void colorSelectChanged(QColor colorSelect); @@ -102,8 +146,12 @@ signals: void sizeNodeChanged(int sizeNode); void modelChanged(DapChainNodeNetworkModel* model); - void selectNode(bool isCurrentNode); //!< Signal selected node - void selectNodeChanged(); //!< Signal deselect node + /// Signal selected node + /// @param status current selected node. It is true + /// if current node was selected + void selectNode(bool isCurrentNode); + /// Signal skip selected node to normal state + void selectNodeChanged(); }; #endif // DAPCHAINNODENETWORKEXPLORER_H diff --git a/KelvinDashboardGUI/DapChainNodeNetworkModel.h b/KelvinDashboardGUI/DapChainNodeNetworkModel.h index db19d6ca44f773930fe22595ffc52ab26bbe1626..261258e9dd1fc8fbefddaace48969b72aeb5e487 100644 --- a/KelvinDashboardGUI/DapChainNodeNetworkModel.h +++ b/KelvinDashboardGUI/DapChainNodeNetworkModel.h @@ -8,6 +8,7 @@ #include "DapNodeType.h" +/// Class model for Network Explorer class DapChainNodeNetworkModel : public QObject { Q_OBJECT @@ -21,27 +22,46 @@ protected: public: explicit DapChainNodeNetworkModel(QObject *parent = nullptr); + + Q_INVOKABLE static DapChainNodeNetworkModel &getInstance(); + /// Get data about whole network with nodes + /// @return QMap where key is address and value is structure about one node const DapNodeMap* getDataMap() const; + /// Get data about onde node by address + /// @return data's node structure const DapNodeData* getNodeData(const QString& aAddress) const; + /// Get current address of node + /// @return address of current node QString getCurrentAddress() const; - Q_INVOKABLE static DapChainNodeNetworkModel &getInstance(); + /// Get status of node + /// @return It is true if node is online Q_INVOKABLE bool isNodeOnline(const QString& aAddress) const; public slots: + /// Receive new network data and repaint the screen + /// @param QMap<QString, QStringList> data of node n void receiveNewNetwork(const QVariant& aData); + /// Receive changes status for nodes void receiveNodeStatus(const QVariant& aData); + /// Send request to service about changing status of node Q_INVOKABLE void sendRequestNodeStatus(const bool aIsOnline); + /// Start timer for request new data of network Q_INVOKABLE void startRequest(); + /// @param time in milliseconds for delay Q_INVOKABLE void startRequest(const int aTimeout); + /// Stop timer for request data of network Q_INVOKABLE void stopRequest(); signals: + /// Signal for changing network void changeNodeNetwork(); + /// Signal for request network void requestNodeNetwork(); + /// Signal for request status of node void requestNodeStatus(bool status); + /// SIgnal about changing status node void changeStatusNode(QString node, bool isOnline); - void appendNode(QMap<QString, QVariant>); }; diff --git a/KelvinDashboardGUI/DapChainWalletsModel.h b/KelvinDashboardGUI/DapChainWalletsModel.h index afcb2c57d144d63fd91782d133132cbd74145de7..74ff829394e80f2bd2782a5c7aaaa149f5402b62 100755 --- a/KelvinDashboardGUI/DapChainWalletsModel.h +++ b/KelvinDashboardGUI/DapChainWalletsModel.h @@ -21,6 +21,7 @@ enum DapChainWalletRole { CountWalletRole }; +/// Class model for wallets screen class DapChainWalletsModel : public QAbstractListModel { Q_OBJECT @@ -33,15 +34,21 @@ public: /// @return Instance of a class. Q_INVOKABLE static DapChainWalletsModel &getInstance(); + /// Overraid model's methods int rowCount(const QModelIndex & = QModelIndex()) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; QHash<int, QByteArray> roleNames() const; + /// Get data in a row Q_INVOKABLE QVariantMap get(int row) const; + /// Add new wallet Q_INVOKABLE void append(const DapChainWallet &arWallet); Q_INVOKABLE void append(const QString& asIconPath, const QString &asName, const QString &asAddress, const QStringList &aBalance, const QStringList &aTokens); + /// Change data for wallet in a row Q_INVOKABLE void set(int row, const QString& asIconPath, const QString &asName, const QString &asAddresss, const QStringList &aBalance, const QStringList &aTokens); + /// Remove row with wallet Q_INVOKABLE void remove(int row); + /// Clear screen Q_INVOKABLE void clear(); public slots: diff --git a/KelvinDashboardGUI/DapCommandController.cpp b/KelvinDashboardGUI/DapCommandController.cpp index e989edf3624214094fb7862b2e373e699213ed9a..7a3cc5b53de45d920665fec3267f6817a65b5228 100755 --- a/KelvinDashboardGUI/DapCommandController.cpp +++ b/KelvinDashboardGUI/DapCommandController.cpp @@ -60,7 +60,6 @@ void DapCommandController::getHistory() void DapCommandController::setNewHistory(const QVariant& aData) { - qDebug() << "new story" << aData; emit sendHistory(aData); } @@ -207,16 +206,6 @@ void DapCommandController::closeClient() emit onClientClose(); } -/// Get node logs. -/// @param aiTimeStamp Timestamp start reading logging. -/// @param aiRowCount Number of lines displayed. -void DapCommandController::getNodeLogs(int aiTimeStamp, int aiRowCount) -{ - qInfo() << QString("getNodeLogs(%1, %2)").arg(aiTimeStamp).arg(aiRowCount); - DapRpcServiceReply *reply = m_DAPRpcSocket->invokeRemoteMethod("RPCServer.getNodeLogs", aiTimeStamp, aiRowCount); - connect(reply, SIGNAL(finished()), this, SLOT(processGetNodeLogs())); -} - void DapCommandController::addWallet(const QString &asWalletName) { qInfo() << QString("addWallet(%1)").arg(asWalletName); @@ -227,7 +216,7 @@ void DapCommandController::addWallet(const QString &asWalletName) void DapCommandController::removeWallet(const QString &asWalletName) { qInfo() << QString("removeWallet(%1)").arg(asWalletName); - DapRpcServiceReply *reply = m_DAPRpcSocket->invokeRemoteMethod("RPCServer.removeWallet", asWalletName); + m_DAPRpcSocket->invokeRemoteMethod("RPCServer.removeWallet", asWalletName); } void DapCommandController::sendToken(const QString &asSendWallet, const QString &asAddressReceiver, const QString &asToken, const QString &aAmount) @@ -252,7 +241,6 @@ void DapCommandController::getWalletInfo(const QString& asWalletName) void DapCommandController::getNodeNetwork() { - qInfo() << QString("getNodeNetwork()"); DapRpcServiceReply *reply = m_DAPRpcSocket->invokeRemoteMethod("RPCServer.getNodeNetwork"); connect(reply, SIGNAL(finished()), this, SLOT(processGetNodeNetwork())); } diff --git a/KelvinDashboardGUI/DapCommandController.h b/KelvinDashboardGUI/DapCommandController.h index 05758ec7a5793bfa0a1b964bdaa3193f4bbb4282..78152aba32eeedf940eb598e22dec277ae26d01c 100755 --- a/KelvinDashboardGUI/DapCommandController.h +++ b/KelvinDashboardGUI/DapCommandController.h @@ -32,21 +32,21 @@ signals: void sigWalletsReceived(const QMap<QString, QVariant>& aWallets); /// The signal is emitted when the main application window is activated. void onClientActivate(bool aIsActivated); - + /// void onClientClose(); - + /// Signal for changing information of wallet void sigWalletInfoChanged(const QString& asWalletName, const QString& asWalletAddress, const QStringList& aBalance, const QStringList& aTokens); - + /// Signal for data network void sendNodeNetwork(const QVariant& aData); - + /// Signal for sending status of node void sendNodeStatus(const QVariant& aData); - + /// void executeCommandChanged(const QString& result); - + /// Signal for cleaning log void onClearLogModel(); - + /// void onLogModel(); - + /// Signal for sending new transaction history void sendHistory(const QVariant& aData); public: @@ -85,10 +85,6 @@ public slots: void activateClient(bool aIsActivated); /// Shut down client. void closeClient(); - /// Get node logs. - /// @param aiTimeStamp Timestamp start reading logging. - /// @param aiRowCount Number of lines displayed. - void getNodeLogs(int aiTimeStamp, int aiRowCount); void processChangedLog(); @@ -110,8 +106,9 @@ public slots: /// Get node logs. void getNodeLogs(); + /// Get transaction history void getHistory(); - + /// Send to model new history void setNewHistory(const QVariant& aData); }; diff --git a/KelvinDashboardGUI/DapScreenHistoryFilterModel.h b/KelvinDashboardGUI/DapScreenHistoryFilterModel.h index 8c38e0f492f9c25ab0fc0e825c85df7a72c6475f..5753a5c030c96d87b9d9a36205a872e99ba1a0f8 100644 --- a/KelvinDashboardGUI/DapScreenHistoryFilterModel.h +++ b/KelvinDashboardGUI/DapScreenHistoryFilterModel.h @@ -16,16 +16,26 @@ private: int m_status; protected: + /// Overides methods bool lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const; bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const; public: explicit DapScreenHistoryFilterModel(QObject *parent = nullptr); + /// Get instance of this class + /// @return instance of this class static DapScreenHistoryFilterModel &getInstance(); public slots: + /// Filter model with wallet + /// @param number of wallet void setFilterWallet(const QString& aWalletNumber); + /// Filter model with dates + /// @param Min date + /// @param Max date void setFilterDate(const QDate& aDateLeft, const QDate& aDateRight); + /// Filter with status of transacrion + /// @param status of transaction void setFilterStatus(const DapTransactionStatus aStatus); }; diff --git a/KelvinDashboardGUI/DapScreenHistoryModel.cpp b/KelvinDashboardGUI/DapScreenHistoryModel.cpp index 8683499828ff45a331d4697a579afc00c2855267..859ba364e67c99b8bcda1e025716c3e2a151e02c 100644 --- a/KelvinDashboardGUI/DapScreenHistoryModel.cpp +++ b/KelvinDashboardGUI/DapScreenHistoryModel.cpp @@ -3,7 +3,9 @@ DapScreenHistoryModel::DapScreenHistoryModel(QObject *parent) : QAbstractListModel(parent) { - + m_timeout = new QTimer(this); + QObject::connect(m_timeout, &QTimer::timeout, this, &DapScreenHistoryModel::sendRequestHistory); + m_timeout->start(1000); } DapScreenHistoryModel& DapScreenHistoryModel::getInstance() @@ -44,7 +46,14 @@ QString DapScreenHistoryModel::toConvertCurrency(const QString& aMoney) const void DapScreenHistoryModel::receiveNewData(const QVariant& aData) { - if(!aData.isValid()) return; + if(!aData.isValid()) + { + qWarning() << "New history data is not valid"; + return; + } + + if(m_timeout->isActive()) m_timeout->stop(); + beginResetModel(); QList<QVariant> dataList = aData.toList(); m_elementList.clear(); @@ -67,7 +76,9 @@ void DapScreenHistoryModel::receiveNewData(const QVariant& aData) item.Cryptocurrency = dataItem.at(2); item.TokenName = dataItem.at(3); item.WalletNumber = dataItem.at(5); - item.Currency = "$ 0 USD"; // TODO: + // TODO: Later we should convert currency + item.Currency = "$ 0 USD"; + qWarning() << aData; switch (item.Status) { case DapTransactionStatus::stSent: item.Cryptocurrency.prepend("- "); break; @@ -81,6 +92,7 @@ void DapScreenHistoryModel::receiveNewData(const QVariant& aData) m_elementList.append(item); } + endResetModel(); } diff --git a/KelvinDashboardGUI/DapScreenHistoryModel.h b/KelvinDashboardGUI/DapScreenHistoryModel.h index 43ff5aea10fc6320d1a6bb8e3bcc206456f8a17c..181b2ea55c23d944a586b55e69750c84d69eb229 100644 --- a/KelvinDashboardGUI/DapScreenHistoryModel.h +++ b/KelvinDashboardGUI/DapScreenHistoryModel.h @@ -1,10 +1,12 @@ #ifndef DAPSCREENHISTORYMODEL_H #define DAPSCREENHISTORYMODEL_H +#include <QtGlobal> #include <QDebug> #include <QImage> #include <QAbstractListModel> #include <QDateTime> +#include <QTimer> #include "DapHistoryType.h" #define MASK_FOR_MODEL QString("MMMM, dd") @@ -14,6 +16,7 @@ class DapScreenHistoryModel : public QAbstractListModel Q_OBJECT public: + /// Role enumeration enum { DisplayDateRole = Qt::UserRole, DateRole, @@ -28,11 +31,15 @@ public: private: QList<DapTransactionItem> m_elementList; + QTimer* m_timeout; public: explicit DapScreenHistoryModel(QObject *parent = nullptr); + /// Get instance of this class + /// @param instance of this class static DapScreenHistoryModel &getInstance(); + /// Override model's methods int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QHash<int, QByteArray> roleNames() const override; @@ -40,7 +47,16 @@ public: Q_INVOKABLE QString toConvertCurrency(const QString& aMoney) const; public slots: + /// Receive new tx history + /// @param QList<QStringList> data void receiveNewData(const QVariant& aData); + +signals: + /// Signal for requset current state of tx history + /// By defalt this signal emits when the client has just started while + /// the tx model will not get at least one tx history. + /// The signal stop emitting after getting the request result + void sendRequestHistory(); }; #endif // DAPSCREENHISTORYMODEL_H diff --git a/KelvinDashboardGUI/DapServiceController.cpp b/KelvinDashboardGUI/DapServiceController.cpp index de0442e0864b8602f52572651658e71248d5adbc..25f3b6efb77bdf93d4b0fc53e5ada695de826048 100755 --- a/KelvinDashboardGUI/DapServiceController.cpp +++ b/KelvinDashboardGUI/DapServiceController.cpp @@ -59,6 +59,8 @@ void DapServiceController::init(DapServiceClient *apDapServiceClient) connect(m_pDapCommandController, SIGNAL(sendHistory(QVariant)), this, SLOT(processGetHistory(QVariant))); connect(m_pDapCommandController, &DapCommandController::sendHistory, &DapScreenHistoryModel::getInstance(), &DapScreenHistoryModel::receiveNewData); + + connect(&DapScreenHistoryModel::getInstance(), &DapScreenHistoryModel::sendRequestHistory, this, &DapServiceController::getHistory); } QString DapServiceController::getBrand() const @@ -78,15 +80,6 @@ QString DapServiceController::getResult() return m_sResult; } -/// Get node logs. -/// @param aiTimeStamp Timestamp start reading logging. -/// @param aiRowCount Number of lines displayed. -void DapServiceController::getNodeLogs(int aiTimeStamp, int aiRowCount) const -{ - qInfo() << QString("getNodeLogs(%1, %2)").arg(aiTimeStamp).arg(aiRowCount); - m_pDapCommandController->getNodeLogs(aiTimeStamp, aiRowCount); -} - void DapServiceController::getWallets() const { qInfo() << QString("getNodeLogs()"); @@ -187,7 +180,6 @@ void DapServiceController::getHistory() void DapServiceController::getNodeNetwork() { - qInfo() << QString("requestNodeNetwork"); m_pDapCommandController->getNodeNetwork(); } diff --git a/KelvinDashboardGUI/DapServiceController.h b/KelvinDashboardGUI/DapServiceController.h index 4ca69571e27416f8cb27a24fb9011766e9d67aa9..3dcc8a31d8882b81dc755694bb3e6cb6e8f83096 100755 --- a/KelvinDashboardGUI/DapServiceController.h +++ b/KelvinDashboardGUI/DapServiceController.h @@ -35,8 +35,6 @@ class DapServiceController : public QObject explicit DapServiceController(QObject *apParent = nullptr); public: - - /// Get an instance of a class. /// @return Instance of a class. Q_INVOKABLE static DapServiceController &getInstance(); @@ -82,7 +80,7 @@ public: void getWalletInfo(const QString& asWalletName); - void getHistory(); + signals: /// The signal is emitted when the Brand company property changes. @@ -119,13 +117,17 @@ private slots: void processGetHistory(const QVariant& aData); public slots: + /// Get history of transaction + void getHistory(); + /// Get node network for explorer void getNodeNetwork(); + /// Change status of node + /// @param it is true if a node is online void setNodeStatus(const bool aIsOnline); void get(); + /// Get node logs. - /// @param aiTimeStamp Timestamp start reading logging. - /// @param aiRowCount Number of lines displayed. Q_INVOKABLE void getNodeLogs() const; void clearLogModel(); diff --git a/KelvinDashboardGUI/DapUiQmlScreenHistory.qml b/KelvinDashboardGUI/DapUiQmlScreenHistory.qml index 95d4199f2777014e6bce696e00a559d1e2e97bbc..05772a700f25ad9ef22190aafcea97ba71a7e2a3 100644 --- a/KelvinDashboardGUI/DapUiQmlScreenHistory.qml +++ b/KelvinDashboardGUI/DapUiQmlScreenHistory.qml @@ -11,7 +11,7 @@ DapUiQmlScreenHistoryForm { Component { id: delegateDate Rectangle { - width: dapListView.width + width: parent.width height: 30 * pt color: "#DFE1E6" diff --git a/KelvinDashboardGUI/main.cpp b/KelvinDashboardGUI/main.cpp index 93b34e115c8371e6394c9cfae0d18d99927ebdaf..94b89492d0770394db2e67322c0ca258c64e8193 100755 --- a/KelvinDashboardGUI/main.cpp +++ b/KelvinDashboardGUI/main.cpp @@ -51,23 +51,20 @@ int main(int argc, char *argv[]) DapServiceController &controller = DapServiceController::getInstance(); controller.init(&dapServiceClient); dapServiceClient.init(); - controller.getNodeLogs(0, 100); controller.getWallets(); - controller.getHistory(); DapScreenHistoryFilterModel::getInstance() .setSourceModel(&DapScreenHistoryModel::getInstance()); -// controller.getNodeNetwork(); qmlRegisterType<DapScreenDialog>("KelvinDashboard", 1, 0, "DapScreenDialog"); qmlRegisterType<DapScreenDialogChangeWidget>("KelvinDashboard", 1, 0, "DapScreenDialogChangeWidget"); qmlRegisterType<DapLogMessage>("LogMessage", 1, 0, "DapLogMessage"); qmlRegisterType<DapChainNodeNetworkExplorer>("NodeNetworkExplorer", 1, 0, "DapUiQmlWidgetNodeNetwork"); -// qmlRegisterType<DapScreenHistoryModel>("") qmlRegisterSingletonType<DapUiQmlWidgetModel>("KelvinDashboard", 1, 0, "DapUiQmlWidgetModel", DapUiQmlWidgetModel::singletonProvider); qmlRegisterType<DapScreenHistoryModel>("DapTransactionHistory", 1, 0, "DapTransactionModel"); QQmlApplicationEngine engine; + /// TODO: this method for getting DPI screen can be useful in the future // qreal dpi = QGuiApplication::primaryScreen()->physicalDotsPerInch(); engine.rootContext()->setContextProperty("dapServiceController", &DapServiceController::getInstance()); engine.rootContext()->setContextProperty("dapUiQmlWidgetModel", &DapUiQmlWidgetModel::getInstance()); @@ -75,18 +72,9 @@ int main(int argc, char *argv[]) engine.rootContext()->setContextProperty("dapChainWalletsModel", &DapChainWalletsModel::getInstance()); engine.rootContext()->setContextProperty("dapNodeNetworkModel", &DapChainNodeNetworkModel::getInstance()); engine.rootContext()->setContextProperty("dapHistoryModel", &DapScreenHistoryFilterModel::getInstance()); - engine.rootContext()->setContextProperty("pt", 1.3 /* *dpi */); + engine.rootContext()->setContextProperty("pt", 1.3); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); -// DapSettings &settings = DapSettings::getInstance("Settings.json"); -// DapSettingsCipher &set = DapSettingsCipher::getInstance(settings); -// qDebug() << "Settings file name: " << set.getFileName(); -// set.setKeyValue("user", "Vasy"); -// bool f = false; -// set.setGroupPropertyValue("widgets", "name", "Services client", "visible", f); -// qDebug() << set.getGroupPropertyValue("widgets", "name", "Services client", "visible").toBool(); -// qDebug() << set.getKeyValue("user"); - if (engine.rootObjects().isEmpty()) return -1; diff --git a/KelvinDashboardService/DapChainDashboardService.cpp b/KelvinDashboardService/DapChainDashboardService.cpp index 6f01f3b2e9e5a45d23fbdc4495e1c067a3455fb7..65a40a92c47a072a4fdc3c83df37fdd721428ca2 100755 --- a/KelvinDashboardService/DapChainDashboardService.cpp +++ b/KelvinDashboardService/DapChainDashboardService.cpp @@ -69,9 +69,8 @@ QMap<QString, QVariant> DapChainDashboardService::getWallets() QStringList DapChainDashboardService::getWalletInfo(const QString &asWalletName) { -// qInfo() << QString("getWalletInfo(%1)").arg(asWalletName); -// return m_pDapChainWalletHandler->getWalletInfo(asWalletName); - return QStringList(); + qInfo() << QString("getWalletInfo(%1)").arg(asWalletName); + return m_pDapChainWalletHandler->getWalletInfo(asWalletName); } QVariant DapChainDashboardService::getNodeNetwork() const diff --git a/KelvinDashboardService/DapChainDashboardService.h b/KelvinDashboardService/DapChainDashboardService.h index 22ce4d49653dc2a093c103058e6ee8a26a2f97eb..c49a77d1e99441d3a78b4c96240210afeeeb9caa 100755 --- a/KelvinDashboardService/DapChainDashboardService.h +++ b/KelvinDashboardService/DapChainDashboardService.h @@ -42,11 +42,11 @@ class DapChainDashboardService : public DapRpcService DapUiSocketServer * m_pSocketService {nullptr}; /// Log reader. DapChainLogHandler * m_pDapChainLogHandler {nullptr}; - + /// Recipient wallet inforamtion DapChainWalletHandler * m_pDapChainWalletHandler {nullptr}; - + /// Recipient node network DapChainNodeNetworkHandler * m_pDapChainNodeHandler {nullptr}; - + /// Recipient history of transactions DapChainHistoryHandler* m_pDapChainHistoryHandler {nullptr}; public: @@ -75,21 +75,32 @@ public slots: /// @param aiRowCount Number of lines displayed. /// @return Logs node. QStringList getNodeLogs(int aiTimeStamp, int aiRowCount); - + /// Add new wallet QStringList addWallet(const QString &asWalletName); - + /// Remove wallet void removeWallet(const QString &asWalletName); - + /// Get wallet + /// @return data for wallets QMap<QString, QVariant> getWallets(); - + /// Get information of wallet such as balance, currencies + /// @param number of wallet + /// @return data for the wallet QStringList getWalletInfo(const QString &asWalletName); - + /// Create new transactio + /// @param name of wallet + /// @param address of a receiver + /// @param name of token + /// @param sum for transaction + /// @return result of trasaction QString sendToken(const QString &asWalletName, const QString &asReceiverAddr, const QString &asToken, const QString &asAmount); - + /// Get node network + /// @return QMap node network QVariant getNodeNetwork() const; - + /// Receive new status for node + /// @param true if online void setNodeStatus(const bool aIsOnline); - + /// Get history + /// @return QList data history QVariant getHistory() const; private slots: diff --git a/KelvinDashboardService/DapChainHistoryHandler.cpp b/KelvinDashboardService/DapChainHistoryHandler.cpp index e229a148806fa9ab870f6b1a67247e8e86c6b2c9..5e64edf7c5ee3b06389e1a4925d2d76c70fd096e 100644 --- a/KelvinDashboardService/DapChainHistoryHandler.cpp +++ b/KelvinDashboardService/DapChainHistoryHandler.cpp @@ -10,8 +10,6 @@ DapChainHistoryHandler::DapChainHistoryHandler(QObject *parent) : QVariant DapChainHistoryHandler::getHistory() const { -// qDebug() << "get story" << m_history; - return m_history; } @@ -27,12 +25,12 @@ void DapChainHistoryHandler::onRequestNewHistory(const QMap<QString, QVariant>& process.start(QString(CLI_PATH) + " tx_history -net private -chain gdb -addr " + wallets.at(i).toString()); process.waitForFinished(-1); - QString result = QString::fromStdString(process.readAll().toStdString()); + QByteArray result = process.readAll(); if(!result.isEmpty()) { - QRegExp rx("(\\w{3}\\s\\w{3}\\s\\d+\\s\\d{1,2}:\\d{2}:\\d{2}\\s\\d{4})\\s+" - "\\s(\\w+)\\s(\\d+)\\s(\\w+)\\s\\w+\\s+(\\w+)"); + QRegExp rx("(\\w{3} \\w{3} \\d+ \\d{1,2}:\\d{2}:\\d{2} \\d{4})\\s+" + "(\\w+) (\\d+) (\\w+) \\w+ (\\w+)"); int pos = 0; while ((pos = rx.indexIn(result, pos)) != -1) diff --git a/KelvinDashboardService/DapChainHistoryHandler.h b/KelvinDashboardService/DapChainHistoryHandler.h index 748546110f063b1e602909f4622df81b0e682661..1d204c46ac0e6a7a0a3102784a2e2c107738711e 100644 --- a/KelvinDashboardService/DapChainHistoryHandler.h +++ b/KelvinDashboardService/DapChainHistoryHandler.h @@ -22,13 +22,27 @@ private: public: explicit DapChainHistoryHandler(QObject *parent = nullptr); + /// Get current state of history + /// @return data QVariant getHistory() const; public slots: + /// Request new tx history + /// @param wallet list void onRequestNewHistory(const QMap<QString, QVariant>& aWallets); signals: + /// Signal for request wallets list void requsetWallets(); + /// Signal about getting new transatcion history + /// @param data of history QList<QVariant>. + /// QVariant is QStringList. QStringList consists + /// 0: date + /// 1: status + /// 2: currency + /// 3: token + /// 4: wallet_to + /// 5: wallet_from void changeHistory(QVariant); }; diff --git a/KelvinDashboardService/DapChainNodeNetworkHandler.cpp b/KelvinDashboardService/DapChainNodeNetworkHandler.cpp index 08aa838e3845554febe8302a4bde1f0948866c25..fa829cefec1b741f507d928316e3c6e34731ce3e 100644 --- a/KelvinDashboardService/DapChainNodeNetworkHandler.cpp +++ b/KelvinDashboardService/DapChainNodeNetworkHandler.cpp @@ -65,66 +65,10 @@ QVariant DapChainNodeNetworkHandler::getNodeNetwork() const } return nodeMap; - -// DapNodeMap nodeMap; - -// if(!result.isEmpty()) -// { -// QStringList nodes = QString::fromStdString(result.toStdString()).split("node "); -// for(int m = 1; m < nodes.count(); m++) -// { -// QString node = nodes.at(m); -// DapNodeData nodeData; -// QRegExp rx_node("address ((?:[0-9A-F]{4}::){3}[0-9A-F]{4}).+" -// "cell (0[xX][0-9A-F]{16}).+" -// "ipv4 ((?:[0-9]{1,3}\\.){3}[0-9]{1,3}).+" -// "ipv6 ::.+" -// "alias (\\S+).+" -// "links (\\d+).+"); - -// rx_node.indexIn(node, 0); -// nodeData.Cell = rx_node.cap(2).toUInt(); -// nodeData.Ipv4 = rx_node.cap(3); -// nodeData.Alias = rx_node.cap(4); - -// if(rx_node.cap(5).toUInt() > 0) -// { -// QStringList nodeLink; -// QRegExp rx_links("link\\d+ address : ((?:[0-9A-F]{4}::){3}[0-9A-F]{4})"); -// int pos = 0; - -// while ((pos = rx_links.indexIn(node, pos)) != -1) -// { -// nodeLink << rx_links.cap(1); -// pos += rx_links.matchedLength(); -// } -// } - -// qDebug() << rx_node.cap(1) << nodeMap.count(); -// nodeMap[rx_node.cap(1)] = nodeData; -// } -// } - -// QProcess process_status; -// process_status.start(QString(CLI_PATH) + QString(" net -net kelvin-testnet get status")); - -// process.waitForFinished(-1); -// QByteArray result_status = process_status.readAll(); - -// if(!result_status.isEmpty()) -// { -// QRegExp reg_exp("Network \"([\\w\\W]+)\" has state (\\w+) \\(target state [\\w]+\\), " -// "active links \\d+ from \\d+, cur node address ((?:[0-9A-F]{4}::){3}[0-9A-F]{4})"); - -// reg_exp.indexIn(result_status, 0); -// nodeMap[reg_exp.cap(2)].Status = reg_exp.cap(1) == "NET_STATE_OFFLINE" ? false : true; -// nodeMap[reg_exp.cap(2)].isCurrentNode = true; -// } } void DapChainNodeNetworkHandler::setNodeStatus(const bool aIsOnline) { - qDebug() << "SeT new status" << aIsOnline; QProcess process; process.start(QString(CLI_PATH) + QString(" net -net kelvin-testnet go %1").arg(aIsOnline ? "online" : "offline")); process.waitForFinished(-1); diff --git a/KelvinDashboardService/DapChainNodeNetworkHandler.h b/KelvinDashboardService/DapChainNodeNetworkHandler.h index d487eb26da0fcdfdad6f29182aff3fbcb7abbed3..e8cc121bed7349e55fc4faeecb6f5788f12567f3 100644 --- a/KelvinDashboardService/DapChainNodeNetworkHandler.h +++ b/KelvinDashboardService/DapChainNodeNetworkHandler.h @@ -17,7 +17,11 @@ public: explicit DapChainNodeNetworkHandler(QObject *parent = nullptr); public slots: + /// Change status of a node + /// @param it is true if a node is online void setNodeStatus(const bool aIsOnline); + /// Get new node network + /// @return data of node network QVariant getNodeNetwork() const; }; diff --git a/KelvinDashboardService/DapChainWalletHandler.cpp b/KelvinDashboardService/DapChainWalletHandler.cpp index 00e39b7005e7b3cb74753a99a79a731266d064e8..e6f1a298790427d8f56c919b14959491f58e4d2c 100755 --- a/KelvinDashboardService/DapChainWalletHandler.cpp +++ b/KelvinDashboardService/DapChainWalletHandler.cpp @@ -43,7 +43,6 @@ QMap<QString, QVariant> DapChainWalletHandler::getWallets() process.start(QString("%1 wallet list").arg(CLI_PATH)); process.waitForFinished(-1); QString str = QString::fromLatin1(process.readAll()); - qDebug() << "ZDES`" << str; QRegExp rx(":{1,1}([\\s\\w\\W]+)(\\n|\\r){1,1}" ); rx.setMinimal(true); int pos = 0; @@ -70,53 +69,23 @@ QMap<QString, QVariant> DapChainWalletHandler::getWallets() QStringList DapChainWalletHandler::getWalletInfo(const QString &asNameWallet) { QProcess process; - process.start(QString("%1 wallet info -w %2 -net kelvin-testnet").arg(CLI_PATH).arg(asNameWallet)); + process.start(QString("%1 wallet info -w %2 -net private").arg(CLI_PATH).arg(asNameWallet)); process.waitForFinished(-1); - char* response = process.readAll().data(); - //qDebug() << response; + QByteArray result = process.readAll(); + QRegExp rx("wallet: (\\w+)\\s+addr:\\s+(\\w+)\\s+(balance)|(\\d+.\\d+)\\s(\\(\\d+\\))\\s(\\w+)"); QStringList list; -#ifdef Q_OS_WIN32 - char *context = nullptr; - char *data = nullptr; - data = strtok_r(response, ":", &context); - if (strcmp(data, "wallet") != 0) { - data = strtok_r(response, ":", &context); - } - data = strtok_r(context+1, "\r", &context); - list.append(QString(data)); - data = strtok_r(context+1, ":", &context); - data = strtok_r(context+1, "\r", &context); - list.append(QString(data)); - data = strtok_r(context+1, ":", &context); - list.append(QString(data)); - data = strtok_r(context+4, "\r", &context); - - char *subctx; - char *subdata; - if (strlen(data) > 2) { - subdata = strtok_r(data+1, " ", &subctx); - } else { - subdata = strtok_r(data, " ", &subctx); - } - list.append(QString(subdata)); - subdata = strtok_r(subctx, " ", &subctx); - list.append(QString(subdata)); - subdata = strtok_r(subctx, "\r", &subctx); - list.append(QString(subdata)); -#else - QString str = QString::fromLatin1(process.readAll()).replace("\\", "\\\\"); - - QRegExp rx("[(:\\)\\t]{1,1}([^\\\\\\n\\t]+)[\\\\(|\\n|\\r]{1,1}"); - rx.setMinimal(true); - int pos{0}; - while((pos = rx.indexIn(str, pos)) != -1) + int pos = 0; + while((pos = rx.indexIn(result, pos)) != -1) { - list.append(rx.cap(1)); + if(rx.cap(1).isEmpty()) + list << rx.cap(4) << rx.cap(5) << rx.cap(6); + else + list << rx.cap(1) << rx.cap(2) << rx.cap(3); + pos += rx.matchedLength(); } -#endif - qDebug() << list; + return list; } diff --git a/KelvinDashboardService/KelvinDashboardService.pro b/KelvinDashboardService/KelvinDashboardService.pro index bce4996d1cb0c4318565821c810a200806d86666..306f6d0753c6180aebf3a4dad02e0a3e11603a1c 100755 --- a/KelvinDashboardService/KelvinDashboardService.pro +++ b/KelvinDashboardService/KelvinDashboardService.pro @@ -21,12 +21,13 @@ ICON = icon.ico win32 { VERSION = $${VER_MAJ}.$${VER_MIN}.$$VER_PAT DEFINES += CLI_PATH=\\\"./kelvin-node-cli.exe\\\" - DEFINES += LOG_FILE=\\\"./opt/kelvin-node/bin/kelvin-node_logs.txt\\\" +# DEFINES += LOG_FILE=\\\"./opt/kelvin-node/var/log/kelvin-node_logs.txt\\\" + DEFINES += LOG_FILE=\\\"./kelvin-node_logs.txt\\\" } else { VERSION = $$VER_MAJ\.$$VER_MIN\-$$VER_PAT DEFINES += CLI_PATH=\\\"/opt/kelvin-node/bin/kelvin-node-cli\\\" - DEFINES += LOG_FILE=\\\"/opt/kelvin-node/kelvin-node_logs.txt\\\" + DEFINES += LOG_FILE=\\\"/opt/kelvin-node/var/log/kelvin-node_logs.txt\\\" } # The following define makes your compiler emit warnings if you use diff --git a/libKelvinDashboardCommon/DapChainWallet.h b/libKelvinDashboardCommon/DapChainWallet.h index 062b86047e3a5c9b584b828593ca443b039afcbd..cbfd1247d0ea46d90206d1413876e45fd189a6ab 100755 --- a/libKelvinDashboardCommon/DapChainWallet.h +++ b/libKelvinDashboardCommon/DapChainWallet.h @@ -28,27 +28,43 @@ public: Q_PROPERTY(QStringList tokens MEMBER m_tokens READ getTokens WRITE setTokens NOTIFY tokensChanged) Q_PROPERTY(int count MEMBER m_iCount READ getCount) + /// Get name of wallet QString getName() const; + /// Set name for wallet void setName(const QString &asName); + /// Get address of wallet QString getAddress() const; + /// Set address for wallet void setAddress(const QString &asAddress); + /// Get icon path QString getIconPath() const; + /// Set icon path void setIconPath(const QString &asIconPath); + /// Get balance QStringList getBalance() const; + /// Set balance void setBalance(const QStringList& aBalance); + /// Get tokens name QStringList getTokens() const; + /// Set tokens name void setTokens(const QStringList& aTokens); + /// get number of tokens int getCount() const; signals: + /// Signal changes for icon path void iconPathChanged(const QString& asIconPath); + /// Signal changes for name of wallet void nameChanged(const QString& asName); + /// Signal changes for address of wallet void addressChanged(const QString& asAddress); + /// Signal changes for balance void balanceChanged(const QStringList& aBalance); + /// Signal changes for tokens void tokensChanged(const QStringList& aTokens); }; diff --git a/libKelvinDashboardCommon/DapHistoryType.h b/libKelvinDashboardCommon/DapHistoryType.h index 736a89f3946187923806e09dd71b5bda702a088a..cdd0b02ce524cfd99d9766ce9a3f443a3e7181c1 100644 --- a/libKelvinDashboardCommon/DapHistoryType.h +++ b/libKelvinDashboardCommon/DapHistoryType.h @@ -6,6 +6,7 @@ #include <QMap> #include <QStringList> +/// Enumeration of transaction status enum DapTransactionStatus { stUnknow, stPending, @@ -14,6 +15,7 @@ enum DapTransactionStatus { stError }; +/// Structure for transaction item struct DapTransactionItem { QDateTime Date; QImage TokenPic; @@ -24,6 +26,8 @@ struct DapTransactionItem { QString Currency; }; +/// Class-convertor transaction status +/// @todo This class does not have all statuses class DapTransactionStatusConvertor { @@ -31,10 +35,25 @@ private: static const QMap<DapTransactionStatus, QStringList> m_statusMap; public: + /// Get short text of status. CLI uses short text of transaction + /// @param enum status of transaction + /// @return short text of status static QString getShortStatus(const DapTransactionStatus aStatus); + /// Get long text of status. Client uses long text of status + /// @param enum status of transaction + /// @return long text of status static QString getLongStatus(const DapTransactionStatus aStatus); + /// Get enum status tranaction by short text of status tranasction + /// @param short text of trasaction + /// @return enum status of tranaction static DapTransactionStatus getStatusByShort(const QString& aShortStatus); + /// Get enum status of tranaction by long text of transaction + /// @param long text of transaction + /// @return enum status of transaction static DapTransactionStatus getStatusByLong(const QString& aLongStatus); + /// Get color for status of transaction + /// @param enum status of transaction + /// @return color for status of transaction static QColor getStatusColor(const DapTransactionStatus aStatus); }; diff --git a/libKelvinDashboardCommon/DapLogMessage.h b/libKelvinDashboardCommon/DapLogMessage.h index c283311bfed3f236f3edbacfc49abe2b27b78789..4867f50fc8b578e883c087e2426b6ae2a070481b 100644 --- a/libKelvinDashboardCommon/DapLogMessage.h +++ b/libKelvinDashboardCommon/DapLogMessage.h @@ -21,7 +21,7 @@ class DapLogMessage : public QObject QString m_sMessage; public: - explicit DapLogMessage(QObject *parent = nullptr) {} + explicit DapLogMessage(QObject *parent = nullptr) { Q_UNUSED(parent) } DapLogMessage(const QString &type, const QString ×tamp, const QString &file, const QString &message, QObject *parent = nullptr); diff --git a/libKelvinDashboardCommon/DapLogModel.cpp b/libKelvinDashboardCommon/DapLogModel.cpp index 4038781a15e3499b14139fdd8081f0569ba97d41..be73100b336ba478eb051d809cc778398cd5fb2e 100644 --- a/libKelvinDashboardCommon/DapLogModel.cpp +++ b/libKelvinDashboardCommon/DapLogModel.cpp @@ -18,23 +18,8 @@ int DapLogModel::rowCount(const QModelIndex &) const QVariant DapLogModel::data(const QModelIndex &index, int role) const { - - int y = rowCount(); if (index.row() < rowCount()) - switch (role) { -// case TypeRole: -// switch (m_dapLogMessage.at(index.row())->getType()) { -// case Type::Info: -// return "qrc:/Resources/Icons/dialog-information.png"; -// case Type::Warning: -// return "qrc:/Resources/Icons/dialog-warning.png"; -// case Type::Error: -// return "qrc:/Resources/Icons/dialog-error.png"; -// case Type::Debug: -// return "qrc:/Resources/Icons/dialog-question.png"; -// default: -// break; -// } + switch (role) { case TypeRole: { QString s = m_dapLogMessage.at(index.row())->getType(); @@ -44,13 +29,12 @@ QVariant DapLogModel::data(const QModelIndex &index, int role) const case FileRole: return m_dapLogMessage.at(index.row())->getFile(); case MessageRole: { - int x = index.row(); QString s1 = m_dapLogMessage.at(index.row())->getMessage(); return m_dapLogMessage.at(index.row())->getMessage(); } default: - break; + break; } return QVariant(); } @@ -58,11 +42,11 @@ QVariant DapLogModel::data(const QModelIndex &index, int role) const QHash<int, QByteArray> DapLogModel::roleNames() const { static const QHash<int, QByteArray> roles { - { TypeRole, "type" }, - { TimeStampRole, "timestamp" }, - { FileRole, "file" }, - { MessageRole, "message" } - }; + { TypeRole, "type" }, + { TimeStampRole, "timestamp" }, + { FileRole, "file" }, + { MessageRole, "message" } + }; return roles; } diff --git a/libKelvinDashboardCommon/DapLogModel.h b/libKelvinDashboardCommon/DapLogModel.h index 44bc2c0cc34bf8937914230ce16d7b3d8158dd26..114ee1091307c038ecc906491a5939e25ea340ec 100644 --- a/libKelvinDashboardCommon/DapLogModel.h +++ b/libKelvinDashboardCommon/DapLogModel.h @@ -19,6 +19,7 @@ enum DapLogRole { MessageRole }; +/// Class model for log screen class DapLogModel : public QAbstractListModel { Q_OBJECT @@ -44,7 +45,7 @@ public: Q_INVOKABLE void append(const QString &type, const QString ×tamp, const QString &file, const QString &message); Q_INVOKABLE void set(int row, const QString &type, const QString ×tamp, const QString &file, const QString &message); Q_INVOKABLE void remove(int row); - Q_INVOKABLE void clear(); + Q_INVOKABLE void clear(); public slots: /// Method that implements the singleton pattern for the qml layer. diff --git a/libKelvinDashboardCommon/DapNodeType.h b/libKelvinDashboardCommon/DapNodeType.h index 7e9991a795875a46f307d78113455d4332d23df1..4dfaa833dc86fbaef0673eb2744b593ff95fb203 100644 --- a/libKelvinDashboardCommon/DapNodeType.h +++ b/libKelvinDashboardCommon/DapNodeType.h @@ -5,6 +5,7 @@ #include <QStringList> #include <QDataStream> +/// Structure for node network data struct DapNodeData { quint32 Cell; QString Ipv4;