Initial commit

This commit is contained in:
torsten committed 2026-08-13 18:33:10 +02:00
commit b7d90b9afe
16245 files changed
+3396666

No files matched your search

+35
View File
@@ -0,0 +1,35 @@
#
# $Id$
# $HeadURL$
# $Author$
# Created by Hannes Fritsche, SLSE, 2017-09-05
#
SET(SRCS
mainwindow.cpp
mainwindow.h
main.cpp
message_model.cpp
message_model.h
ui/mainwindow.ui
)
NGL_WRAP_UI(SRCS ui/mainwindow.ui)
NGL_ADD_EXECUTABLE(WS NO_TRANSLATION CnrProxyTester ${SRCS})
NGL_TARGET_LINK_LIBRARIES(CnrProxyTester
Qt5::Widgets
Qt5::Core
Qt5::WebSockets
nglapplication
LtsDataView
LtsWidgets
nglwidgets
LtsPluginLoader
StylePluginInterface
LtsUtilsCoreHeaderOnly
)
NGL_INSTALL_TARGET_DEVEL(CnrProxyTester)
+34
View File
@@ -0,0 +1,34 @@
/**
* @RDE_HEADER@
* $Id$
* $HeadURL$
* $Author$
* Created by Hannes Fritsche, SLSE, 2017-09-06
*/
#include "mainwindow.h"
#include <nglapplication/nglapplication.h>
#include <LtsPluginManager/lts_plugin_loader.h>
#include <PluginInterfaces/style_plugin_interface.h>
int main(int argc, char *argv[])
{
NGLApplication app(argc, argv);
app.createLogger("CNR Proxy Tester");
QCoreApplication::setApplicationName(QLatin1String("CNR Proxy Tester"));
QCoreApplication::setOrganizationName(QLatin1String("RME"));
LtsPluginManager::LtsPluginLoader::getInstance()->loadPlugins(LtsPluginManager::PluginType::STYLE, nullptr
, QStringList() << QStringLiteral("rme.light")); // load style plugin
MainWindow w;
w.show();
app.setQuitOnLastWindowClosed(true);
int retval = app.exec();
return retval;
}
+130
View File
@@ -0,0 +1,130 @@
/**
* @RDE_HEADER@
* $Id$
* $HeadURL$
* $Author$
* Created by Hannes Fritsche, SLSE, 2017-09-06
*/
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "message_model.h"
#include <nglsettings/nglsettings_settings.h>
#include <QJsonDocument>
#include <QtWebSockets/QWebSocket>
MainWindow::MainWindow(QWidget *parent)
: NGLMainWindow(parent)
, m_ui(new Ui::MainWindow)
, m_socket(new QWebSocket(QString(), QWebSocketProtocol::Version13, this))
, m_messageModel(new MessageModel(this))
{
m_ui->setupUi(this);
setWindowTitle(QLatin1String("CNR Tester"));
connect(m_ui->pbConnect, &QPushButton::clicked,
this, &MainWindow::onConnectClicked);
connect(m_ui->pbDisconnect, &QPushButton::clicked,
this, &MainWindow::onDisconnectClicked);
connect(m_ui->pbGetPositionsCnr, &QPushButton::clicked,
this, &MainWindow::onSendGetPositionsCnrClicked);
connect(m_ui->pbSendError, &QPushButton::clicked,
this, &MainWindow::onSendErrorClicked);
connect(m_ui->pbSendGetConfigCnr, &QPushButton::clicked,
this, &MainWindow::onSendGetConfigCnrClicked);
connect(m_ui->pbSendGetEssentials, &QPushButton::clicked,
this, &MainWindow::onSendGetEssentialsClicked);
connect(m_socket, &QWebSocket::stateChanged,
this, &MainWindow::onNewSocketState);
connect(m_socket, &QWebSocket::textMessageReceived,
this, &MainWindow::onNewTextMessageFromSocket);
connect(m_ui->pbClearMessages, &QPushButton::clicked,
m_messageModel, &MessageModel::clear);
m_ui->dvMessages->setModel(m_messageModel);
}
MainWindow::~MainWindow()
{
delete m_ui;
}
void MainWindow::onSendGetEssentialsClicked()
{
newMessageToServer(QLatin1String("getEssentials"));
}
void MainWindow::onSendGetConfigCnrClicked()
{
newMessageToServer(QLatin1String("getConfigCNR"));
}
void MainWindow::onSendGetPositionsCnrClicked()
{
int32_t repeat = m_ui->leCnrPosRepeat->text().toInt();
QJsonObject obj;
obj.insert(QLatin1String("repeat"), repeat);
newMessageToServer(QLatin1String("getPositionsCNR"), QUuid::createUuid().toString(), obj);
}
void MainWindow::onSendErrorClicked()
{
QJsonObject obj;
obj.insert(QLatin1String("errorClass"), m_ui->leErrorClass->text().toInt());
obj.insert(QLatin1String("errorMessage"), m_ui->leErrorMessage->text());
obj.insert(QLatin1String("uuid"), m_ui->leErrorUuid->text());
newMessageToServer(QLatin1String("error"), QString(), obj);
}
void MainWindow::onConnectClicked()
{
m_socket->open(QUrl(QStringLiteral("ws://%1:%2").arg(m_ui->leHost->text(), m_ui->lePort->text())));
}
void MainWindow::onDisconnectClicked()
{
m_socket->close();
}
void MainWindow::onNewSocketState(QAbstractSocket::SocketState state)
{
m_ui->lbState->setText(QVariant::fromValue(state).toString());
m_ui->pbConnect->setEnabled(state != QAbstractSocket::ConnectedState);
m_ui->pbDisconnect->setEnabled(state == QAbstractSocket::ConnectedState);
}
void MainWindow::onNewTextMessageFromSocket(const QString &message)
{
m_messageModel->addMessage(MessageModel::FROM_PROXY, message);
}
void MainWindow::newMessageToServer(const QString &type, const QString &uuid, const QJsonObject &data)
{
if (!m_socket || m_socket->state() != QAbstractSocket::ConnectedState)
return;
QJsonObject obj;
obj.insert(QLatin1String("type"), type);
obj.insert(QLatin1String("data"), data);
if (!uuid.isNull())
obj.insert(QLatin1String("uuid"), uuid);
m_socket->sendTextMessage(QString::fromUtf8(QJsonDocument(obj).toJson()));
m_messageModel->addMessage(MessageModel::TO_PROXY, type, uuid, obj.value(QLatin1String("data")).toString());
}
void MainWindow::setVersionView()
{
return;
// m_versionView = new VersionView(NGLSettings::instance(), tr("CNR Proxy Tester"), this);
// connect(m_versionView, SIGNAL(destroyed()), this, SLOT(onVersionViewDeleted()), Qt::DirectConnection);
}
+54
View File
@@ -0,0 +1,54 @@
/**
* @RDE_HEADER@
* $Id$
* $HeadURL$
* $Author$
* Created by Hannes Fritsche, SLSE, 2017-09-06
*/
#pragma once
#include <nglwidgets/nglmainwindow.h>
#include <QJsonObject>
#include <QUuid>
#include <QtNetwork/QAbstractSocket>
namespace Ui
{
class MainWindow;
}
class QWebSocket;
class MessageModel;
class MainWindow
: public NGLMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private Q_SLOTS:
void onSendGetEssentialsClicked();
void onSendGetConfigCnrClicked();
void onSendGetPositionsCnrClicked();
void onSendErrorClicked();
void onConnectClicked();
void onDisconnectClicked();
void onNewSocketState(QAbstractSocket::SocketState state);
void onNewTextMessageFromSocket(const QString &message);
void setVersionView() override final;
private: // methods
void newMessageToServer(const QString &type, const QString &uuid = QUuid::createUuid().toString(), const QJsonObject &data = QJsonObject());
private: // attributes
Ui::MainWindow *m_ui;
QWebSocket *m_socket;
MessageModel *m_messageModel;
};
+112
View File
@@ -0,0 +1,112 @@
/**
* @RDE_HEADER@
* The MessageModel class handles message related data
* $Id$
* $HeadURL$
* $Author$
* Created by Hannes Fritsche, SLSE, 2017-09-06
*/
#include "message_model.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
MessageModel::MessageModel(QObject *parent)
: LtsAbstractTableModel<MessageInfo>( { tr("Time"), tr("Direction"), tr("Type"), tr("UUID"), tr("Data") }, parent)
{
setData(QVector<MessageInfo>());
}
void MessageModel::addMessage(MessageModel::MessageDirection direction, const QString &message)
{
QJsonParseError parseError;
QString uuid = QLatin1String("-");
QString data = uuid;
QJsonDocument doc = QJsonDocument::fromJson(message.toLatin1(), &parseError);
QString type;
if (parseError.error != QJsonParseError::NoError)
type = parseError.errorString();
else if (!doc.isObject())
type = QLatin1String("invalid");
else
{
QJsonObject obj = doc.object();
type = obj.value(QLatin1String("type")).toString(QLatin1String("not present"));
uuid = obj.value(QLatin1String("uuid")).toString(QLatin1String("not present"));
QJsonObject dataObj = obj.value(QLatin1String("data")).toObject();
if (dataObj.isEmpty())
data = QLatin1String("not present");
else
data = QString::fromUtf8(QJsonDocument(dataObj).toJson());
}
addMessage(direction, type, uuid, data);
}
void MessageModel::addMessage(MessageModel::MessageDirection direction, const QString &type, const QString &uuid, const QString &data)
{
int32_t rows = rowCount();
onDataChanged({rows, toString(direction), type, uuid, data}, DataModification::eAdded);
}
QVariant MessageModel::data(const QModelIndex &index, int role) const
{
if (role != Qt::DisplayRole || !indexIsValid(index))
return QVariant();
const MessageInfo &infoData = m_vecData.at(index.row());
switch (index.column())
{
case TIME:
return infoData.time.toString();
case DIRECTION:
return infoData.direction;
case TYPE:
return infoData.type;
case UUID:
return infoData.uuid;
case DATA:
{
if (!infoData.data.size())
return infoData.data;
QJsonObject obj = QJsonDocument::fromJson(infoData.data.toLatin1()).object();
QString result = infoData.data;
const QStringList keys = obj.keys();
for (const QString &currentKey : keys)
{
const QJsonValue subObj = obj.value(currentKey);
if (subObj.isArray())
result.prepend(QStringLiteral("%1 size: %2\n").arg(currentKey).arg(subObj.toArray().size()));
}
return result;
}
}
return QVariant();
}
QString MessageModel::toString(MessageModel::MessageDirection direction) const
{
switch (direction)
{
case TO_PROXY:
return tr(" > to Proxy");
case FROM_PROXY:
return tr(" < from Proxy");
default:
return QString();
}
}
+79
View File
@@ -0,0 +1,79 @@
/**
* @RDE_HEADER@
* The MessageModel class handles message related data
* $Id$
* $HeadURL$
* $Author$
* Created by Hannes Fritsche, SLSE, 2017-09-06
*/
#pragma once
#include <LtsWidgets/lts_abstract_table_model.h>
#include <QDateTime>
class QWebSocket;
struct MessageInfo
{
QDateTime time;
int32_t idVal;
QString direction;
QString type;
QString uuid;
QString data;
MessageInfo(int32_t id, const QString &direction, const QString &type, const QString &uuid, const QString &data)
: time(QDateTime::currentDateTime())
, idVal(id)
, direction(direction)
, type(type)
, uuid(uuid)
, data(data)
{}
MessageInfo()
: time(QDateTime::currentDateTime())
, idVal(-1)
, direction(QLatin1String("-"))
, type(QLatin1String("-"))
, uuid(QLatin1String("-"))
, data(QLatin1String("-"))
{}
int32_t id() const { return idVal; }
};
class MessageModel
: public LtsWidgets::LtsAbstractTableModel<MessageInfo>
{
Q_OBJECT
public:
enum MessageDirection
{
TO_PROXY,
FROM_PROXY
};
enum Column
{
TIME,
DIRECTION,
TYPE,
UUID,
DATA
};
MessageModel(QObject *parent = nullptr);
void addMessage(MessageDirection direction, const QString &message);
void addMessage(MessageDirection direction, const QString &type, const QString &uuid, const QString &data);
QVariant data(const QModelIndex &index, int role) const override final;
private: // methods
QString toString(MessageDirection direction) const;
public:
};
+267
View File
@@ -0,0 +1,267 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1101</width>
<height>642</height>
</rect>
</property>
<property name="windowTitle">
<string notr="true">MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Host:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="leHost">
<property name="text">
<string notr="true">localhost</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Port:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lePort">
<property name="text">
<string notr="true">2081</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Connection State:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lbState">
<property name="text">
<string notr="true">-</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="pbConnect">
<property name="text">
<string>Connect</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="pbDisconnect">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Disconnect</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="Line" name="line1">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Get Essentials Message</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QPushButton" name="pbSendGetEssentials">
<property name="text">
<string>Send</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="1">
<widget class="QGroupBox" name="groupBox_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Get Config CNR</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QPushButton" name="pbSendGetConfigCnr">
<property name="text">
<string>Send</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="4" column="0">
<widget class="QGroupBox" name="groupBox_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Get Positions CNR</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Repeat:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="leCnrPosRepeat">
<property name="text">
<string notr="true"/>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QPushButton" name="pbGetPositionsCnr">
<property name="text">
<string>Send</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="4" column="1">
<widget class="QGroupBox" name="groupBox_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Error Message</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="1">
<widget class="QLineEdit" name="leErrorUuid"/>
</item>
<item row="3" column="0" colspan="2">
<widget class="QPushButton" name="pbSendError">
<property name="text">
<string>Send</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Message:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="leErrorMessage"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>UUID:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="leErrorClass"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Error Class:</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_5">
<property name="title">
<string>Messages</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="LtsDataView::LtsDataView" name="dvMessages" native="true"/>
</item>
<item>
<widget class="QPushButton" name="pbClearMessages">
<property name="text">
<string>Clear Messages</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
<customwidget>
<class>LtsDataView::LtsDataView</class>
<extends>QWidget</extends>
<header>LtsDataView/lts_data_view.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>