Improoving AScadaBoardController interface to better control devices and boards

This commit is contained in:
vshevchyk
2019-07-24 15:37:33 +03:00
parent 543fa69778
commit f055e3cc0e
10 changed files with 209 additions and 26 deletions
+7 -1
View File
@@ -9,8 +9,9 @@
#include <QPen>
#include <QDebug>
QScadaBoard::QScadaBoard(QWidget *parent) :
QScadaBoard::QScadaBoard(int id, QWidget *parent) :
QWidget(parent),
mId{id},
mObjects{new QList<QScadaObject*>()},
mEditable{false},
mShowGrid{true},
@@ -171,6 +172,11 @@ void QScadaBoard::objectResize(int, int)
update();
}
int QScadaBoard::getId() const
{
return mId;
}
QList<QScadaObject *> *QScadaBoard::objects() const
{
return mObjects;
+3 -1
View File
@@ -14,7 +14,7 @@ class QScadaBoard : public QWidget
{
Q_OBJECT
public:
explicit QScadaBoard(QWidget *parent = nullptr);
explicit QScadaBoard(int id, QWidget *parent = nullptr);
QScadaBoard(QScadaBoardInfo *);
~QScadaBoard();
@@ -48,6 +48,7 @@ public:
void resetGridPixmap();
int getId() const;
private:
void orderObject(QScadaObject *o);
@@ -72,6 +73,7 @@ protected slots:
void objectResize(int x, int y);
private:
int mId;
QList<QScadaObject*> *mObjects;
bool mEditable; //default value false
bool mShowGrid; //default value true
+79 -9
View File
@@ -4,6 +4,7 @@
#include "qscadaboard.h"
#include "qscadaboardinfo.h"
#include "../QScadaObject/qscadaobjectinfodialog.h"
#include "../QScadaDevice/qscadadeviceinfo.h"
#include <QGridLayout>
#include <QMenu>
@@ -33,6 +34,11 @@ QScadaBoardController::~QScadaBoardController()
delete mBoard;
}
void QScadaBoardController::appendDevice(QScadaDeviceInfo *deviceInfo)
{
mBoardManager->appendDevice(deviceInfo);
}
void QScadaBoardController::clearBoard(QScadaBoard* board)
{
for (QScadaObject *object : *board->objects()) {
@@ -70,12 +76,16 @@ void QScadaBoardController::initBoardForDeviceIp(QString ip)
disconnect(mBoard, SIGNAL(objectSelected(QScadaObject *)), this, SLOT(updateObjectInfoDialog(QScadaObject *)));
}
mBoard = mBoardManager->getBoardForDeviceWithIp(ip);
mMainLayout->addWidget(mBoard);
mBoard->setGeometry(QRect(0, 0, this->geometry().width(), this->geometry().height()));
connect(mBoard, SIGNAL(objectSelected(QScadaObject *)), this, SLOT(updateObjectInfoDialog(QScadaObject *)));
connect(mBoard, SIGNAL(objectDoubleClicked(QScadaObject*)), this, SLOT(objectDoubleClickedHandler(QScadaObject*)));
connect(mBoard, SIGNAL(newObjectCreated(QScadaObject*)), this, SLOT(updateObjectInfoDialog(QScadaObject *)));
mBoard = mBoardManager->initBoardForDeviceIp(ip);
if (mBoard != nullptr) {
mMainLayout->addWidget(mBoard);
mBoard->setGeometry(QRect(0, 0, this->geometry().width(), this->geometry().height()));
connect(mBoard, SIGNAL(objectSelected(QScadaObject *)), this, SLOT(updateObjectInfoDialog(QScadaObject *)));
connect(mBoard, SIGNAL(objectDoubleClicked(QScadaObject*)), this, SLOT(objectDoubleClickedHandler(QScadaObject*)));
connect(mBoard, SIGNAL(newObjectCreated(QScadaObject*)), this, SLOT(updateObjectInfoDialog(QScadaObject *)));
} else {
qDebug() << "QScadaBoardController::" << __FUNCTION__<< " No device with ip " << ip << " found";
}
}
void QScadaBoardController::updateBoardForDeviceIp(QString ip)
@@ -212,6 +222,63 @@ void QScadaBoardController::setParametersDialod(QScadaObjectInfoDialog *paramete
connect(mParametersDialod, SIGNAL(savePressed(QScadaObjectInfo*)), this, SLOT(updateSavedObject(QScadaObjectInfo *)));
}
void QScadaBoardController::updateValue(QString deviceIp, int boardId, int id, QVariant value)
{
QScadaBoard *lBoard = mBoardManager->getBoard(deviceIp, boardId);
if (lBoard != nullptr) {
lBoard->updateValue(id, value);
} else {
qDebug() << "QScadaBoardController::" << __FUNCTION__ << " no available board id" << boardId << " on device with ip " << deviceIp;
}
}
void QScadaBoardController::setPropertyWithId(QString deviceIp, int boardId, int id, QString property, QVariant value)
{
QScadaBoard *lBoard = mBoardManager->getBoard(deviceIp, boardId);
if (lBoard != nullptr) {
lBoard->setPropertyWithId(id, property, value);
} else {
qDebug() << "QScadaBoardController::" << __FUNCTION__ << " for available device with ip " << deviceIp;
}
}
void QScadaBoardController::openProject(QString file)
{
}
void QScadaBoardController::saveProject(QString file)
{
// if (!file.isEmpty()) {
// if (!file.contains(".irp")) {
// file.append(".irp");
// }
// QString lDevices = QConnectedDeviceInfo::XMLFromDeviceInfo(lList, this); //<----;
// //create xml for boards of each device
// QFile lFile(lFileName);
// if (lFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
// QTextStream lOut(&lFile);
// lOut.setCodec("UTF-8");
// lOut << lDevices;
// } else {
// QString lMessage(tr("Something went wrong while trying to create file"));
// lMessage.append(" ").append(lFileName);
// QMessageBox lMsgBox;
// lMsgBox.setText(lMessage);
// lMsgBox.exec();
// }
// lFile.close();
// } else {
// qDebug() << "QScadaBoardController::" << __FUNCTION__ << " File nmae can't be empty";
// }
}
QList<QScadaBoard *> QScadaBoardController::getBoardList()
{
return mBoardManager->getBoardList();
@@ -220,13 +287,16 @@ QList<QScadaBoard *> QScadaBoardController::getBoardList()
QList<QScadaBoard *> QScadaBoardController::getBoardListForDeviceIp(QString ip)
{
QList<QScadaBoard *> rList;
rList.append(mBoardManager->getBoardForDeviceWithIp(ip));
rList.append(mBoardManager->getBoardListForDeviceIp(ip));
return rList;
}
void QScadaBoardController::setEditingMode(bool editing)
{
mBoard->setEditable(editing);
mBoard->setShowGrid(editing);
if (mBoard != nullptr) {
mBoard->setEditable(editing);
mBoard->setShowGrid(editing);
}
}
+10
View File
@@ -14,6 +14,7 @@ class QScadaObject;
class VUnitModel;
class QScadaBoardManager;
class QScadaBoardInfo;
class QScadaDeviceInfo;
class QScadaBoardController : public QWidget
{
@@ -22,6 +23,8 @@ public:
explicit QScadaBoardController(QWidget *parent = nullptr);
~QScadaBoardController();
void appendDevice(QScadaDeviceInfo*);
void clearBoard(QScadaBoard*);
void clearAllBoards();
@@ -36,6 +39,12 @@ public:
QScadaObjectInfoDialog *getParametersDialod() const;
void setParametersDialod(QScadaObjectInfoDialog *parametersDialod);
void updateValue(QString deviceIp, int boardId, int id, QVariant value);
void setPropertyWithId(QString deviceIp, int boardId, int id, QString property, QVariant value);
void openProject(QString file);
void saveProject(QString file);
signals:
void objectDoubleClicked(QScadaObject*);
@@ -59,6 +68,7 @@ private:
QScadaObjectInfoDialog *mParametersDialod;
QList<int> mObjectIds;
QGridLayout *mMainLayout;
QList<QScadaDeviceInfo*> mDevices;
};
#endif // VVIEWCONFIGURAOT_H
+83 -8
View File
@@ -1,6 +1,7 @@
#include "qscadaboardmanager.h"
#include "qscadaboard.h"
#include "qscadaboardcontroller.h"
#include "../QScadaDevice/qscadadeviceinfo.h"
#include <QWidget>
@@ -9,22 +10,96 @@ QScadaBoardManager::QScadaBoardManager(QObject *parent) : QObject(parent)
}
QScadaBoard *QScadaBoardManager::getBoardForDeviceWithIp(QString ip)
QScadaBoard *QScadaBoardManager::getBoard(QString deviceIp, int boardId)
{
QScadaDeviceInfo *lDevice = deviceForIp(deviceIp);
return getBoard(lDevice, boardId);
}
QScadaBoard* QScadaBoardManager::getBoard(QScadaDeviceInfo *device, int boardId)
{
QScadaBoard *rBoard = nullptr;
if (mBoardMap.contains(ip)) {
rBoard = mBoardMap.value(ip);
} else {
rBoard = new QScadaBoard();
rBoard->setEditable(true);
mBoardMap.insert(ip, rBoard);
if (device != nullptr) {
for (int id : device->boardIds()) {
if (id == boardId) {
rBoard = mBoards.value(id);//get board object for id
}
}
}
return rBoard;
}
QScadaBoard *QScadaBoardManager::initBoardForDeviceIp(QString deviceIp)
{
QScadaBoard *rBoard = nullptr;
QScadaDeviceInfo *lDevice = deviceForIp(deviceIp);
if (lDevice != nullptr) {
rBoard = new QScadaBoard(generateIdForNewBoard());
mBoards.insert(rBoard->getId(), rBoard);
lDevice->appendBoardId(rBoard->getId());
}
return rBoard;
}
QList<QScadaBoard *> QScadaBoardManager::getBoardListForDeviceIp(QString deviceIp)
{
QList<QScadaBoard *> rBoards;
QScadaDeviceInfo *lDevice = deviceForIp(deviceIp);
if (lDevice != nullptr) {
for (int boardId : lDevice->boardIds()) {
rBoards.append(mBoards.value(boardId));
}
}
return rBoards;
}
QList<QScadaBoard *> QScadaBoardManager::getBoardList()
{
return mBoardMap.values();
return mBoards.values();
}
QScadaDeviceInfo *QScadaBoardManager::deviceForIp(QString ip)
{
QScadaDeviceInfo *rDevice = nullptr;
for (QScadaDeviceInfo *device : mDevices) {
if (device->ip().toString() == ip) {
rDevice = device;
}
}
return rDevice;
}
int QScadaBoardManager::generateIdForNewBoard()
{
int rId = 0;
//new id should bigeer than all exisitng is list
for (int id : mBoards.keys()) {
if (id > rId) {
rId = id + 1;
}
}
return rId;
}
void QScadaBoardManager::appendDevice(QScadaDeviceInfo *deviceInfo)
{
QScadaDeviceInfo *lDevice = deviceForIp(deviceInfo->ip().toString());
//if device with the same ip address exists appeding will be ignored
if (lDevice == nullptr) {
mDevices.append(deviceInfo);
} else {
qDebug() << "QScadaBoardManager::" << __FUNCTION__ << " device with ip " << deviceInfo->ip().toString() << " already added";
}
}
+13 -4
View File
@@ -6,6 +6,7 @@
class QScadaBoard;
class QScadaBoardController;
class QScadaDeviceInfo;
class QScadaBoardManager : public QObject
{
@@ -13,15 +14,23 @@ class QScadaBoardManager : public QObject
public:
explicit QScadaBoardManager(QObject *parent = nullptr);
QScadaBoard* getBoardForDeviceWithIp(QString);
QScadaBoard* getBoard(QString deviceIp, int boardId);
QScadaBoard* getBoard(QScadaDeviceInfo *device, int boardId);
QScadaBoard* initBoardForDeviceIp(QString deviceIp);
QList<QScadaBoard*> getBoardListForDeviceIp(QString);
QList<QScadaBoard*> getBoardList();
QScadaBoardController *getController() const;
void setController(QScadaBoardController *controller);
//if device with the same ip address exists appeding will be ignored
void appendDevice(QScadaDeviceInfo *deviceInfo);
private:
QMap<QString, QScadaBoard*> mBoardMap;
QScadaDeviceInfo* deviceForIp(QString ip);
int generateIdForNewBoard();
private:
QMap<int, QScadaBoard*> mBoards;//list of devices with unique id
QList<QScadaDeviceInfo*> mDevices;//list of devices
};
#endif // VBOARDMANAGER_H
+10
View File
@@ -129,3 +129,13 @@ bool QScadaDeviceInfo::operator<(const QScadaDeviceInfo &deviceInfo)
return rValue;
}
QList<int> QScadaDeviceInfo::boardIds() const
{
return mBoardIds;
}
void QScadaDeviceInfo::appendBoardId(int boardId)
{
mBoardIds.append(boardId);
}
+4
View File
@@ -46,6 +46,9 @@ public:
bool operator<(const QScadaDeviceInfo &deviceInfo);
QList<int> boardIds() const;
void appendBoardId(int);
private:
QString mName;
QString mType;
@@ -57,6 +60,7 @@ private:
quint16 mPort;
QScadaStatus mDeviceStatus;
int mUnitCount;
QList<int> mBoardIds;
};
#endif // VDEVICEINFO_H
-2
View File
@@ -261,7 +261,5 @@ void QScadaObject::initUI()
setAction(QObjectActionNone);
setMouseTracking(true);//this not mouseMoveEven is called everytime mouse is moved
connect(mInfo, SIGNAL(dynamicStatusChanged(QScadaObjectInfo *)), this, SLOT(dynamicStatusChanged(QScadaObjectInfo *)));
setGeometry(info()->geometry());
}
-1
View File
@@ -52,7 +52,6 @@ public:
signals:
void infoChanged(QScadaObjectInfo *info);
void geometryChanged(QScadaObjectInfo *info);
void dynamicStatusChanged(QScadaObjectInfo *info);
private:
QRect mGeometry;