mirror of
https://github.com/IndeemaSoftware/QSimpleScada.git
synced 2026-10-16 21:01:05 +08:00
Improoving AScadaBoardController interface to better control devices and boards
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -52,7 +52,6 @@ public:
|
||||
signals:
|
||||
void infoChanged(QScadaObjectInfo *info);
|
||||
void geometryChanged(QScadaObjectInfo *info);
|
||||
void dynamicStatusChanged(QScadaObjectInfo *info);
|
||||
|
||||
private:
|
||||
QRect mGeometry;
|
||||
|
||||
Reference in New Issue
Block a user