Merge feature/qt6-migration-basis-modules-services into feature/qt6-migration-basis-modules

Resolves 17 conflicts against legacy Qt5 semantics; validates with BUILD_RTI=ON BUILD_GRANTLEE=ON.
This commit is contained in:
berrux-dev committed 2026-09-24 10:10:25 +02:00
commit 5381c65fee
1200 files changed
+20421 -18259

No files matched your search

@@ -0,0 +1,22 @@
/**
* Export definitions
* $Id$
* $HeadURL$
* $Author$
* Created by Hanna E. Rathje, SLSE, 2015-08-04
*/
#pragma once
#include <QtCore/qglobal.h>
#ifndef SAATELEGRAMS_EXPORT
# ifdef BUILD_STATIC_LIBRARIES
# define SAATELEGRAMS_EXPORT
# else
# if defined(MAKE_SAATELEGRAMS_LIB)
# define SAATELEGRAMS_EXPORT Q_DECL_EXPORT
# else
# define SAATELEGRAMS_EXPORT Q_DECL_IMPORT
# endif
# endif
#endif
@@ -0,0 +1,104 @@
/**
* @RDE_HEADER@
* AesHandler for AdlerJson Plugin
* $Id: aes_handler.h 62304 2024-03-21 08:17:45Z ewert_j $
* $HeadURL: svn://slssvn/TDS/branches/product/features/ufom/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/aes_handler.h $
* $Author: ewert_j $
* Created by Julius Ewert, ESIM, 2024-03-20
*/
#pragma once
#include "Core/core_types.h"
#include "logger.h"
#include "main_dispatcher.h"
#include "telegrams.h"
#include <QtCore/QDateTime>
#include <QtCore/QHash>
#include <QtCore/QObject>
#include <QtCore/QUrl>
#include <AreaEffectSimulation/aes_dtc.h>
#include <AreaEffectSimulation/aes_ftc.h>
#include <LtsUtils/LtsUtilsCore/data_modification_enum.h>
#include <LtsUtils/LtsUtilsGui/LtsUtilsGuiDds/request_helper.h>
#include <ParticipantManagement/ppm.hpp>
#include <ParticipantManagement/ppm.hpp>
namespace AdlerJson
{
class MainDispatcher;
class AesHandler
: public QObject
, protected AreaEffectSimulation::Interface::Ftc::AirSupportImpactModifyReplyHandler
, protected AreaEffectSimulation::Interface::Ftc::OffRouteMineModifyReplyHandler
, protected AreaEffectSimulation::Interface::Ftc::EffectClusterModifyReplyHandler
, protected AreaEffectSimulation::Interface::Ftc::TrajectoryAdlerModifyReplyHandler
, protected NotificationManagement::Interface::Ftc::CreateNotificationReplyHandler
{
Q_OBJECT
public:
explicit AesHandler(std::shared_ptr<TrainingAreaBase::Interface::Fts> ftsTab, QObject *parent = nullptr);
bool init(MainDispatcher *mainDispatcher);
bool sendAesModifyRequest(const QJsonObject &obj);
bool sendExplosionArea(const QJsonObject &data);
// DDS Overrides
void onAirSupportImpactModifyReply(const Core::FunctionReplyObject &reply) override;
void onOffRouteMineModifyReply(const Core::FunctionReplyObject &replyObject) override;
void onEffectClusterModifyReply(const Core::FunctionReplyObject &replyObject) override;
void onCreateNotificationReply(const Core::FunctionReplyObject &replyObject) override;
// Internal
void onExplosionSingleChanged(const AreaEffectSimulation::ExplosionSingle &data, DataModification modType);
void onEffectClusterChanged(const AreaEffectSimulation::EffectCluster &data, DataModification modType);
void handleCreateSingleExplosion(const TrainingAreaBase::TetraIcd::CreateSingleExplosion &data);
void handleEXFire(const Feuerkampfdaten &data, int wsId);
void handleEXDontFire(const Feuerkampfdaten &data, int wsId);
// Reald Data
void sendTrajectoryAdlerModifyRequest(const WirkfeldplanungData &data, int participantId, int wirkmittelIndex, int aesId);
void handleEffectCluster(const WirkfeldplanungData &data, int wsId);
//
void removeAllPendingEffectCluster(int partyId);
std::shared_ptr<AreaEffectSimulation::Interface::Dtc> getDtc() { return m_dtcAes; };
std::shared_ptr<AreaEffectSimulation::Interface::Ftc> getFtc() { return m_ftcAes; };
private:
AreaEffectSimulation::Area createMinimumRect(int zone, const QVector<QPointF> &points);
signals:
void explosionSingleChanged(const QJsonObject &jsonObj);
private:
QList<qint32> findAllPendingEffectCluster(int partyId);
void handleAmmoCount(const Feuerkampfdaten &data, int saaPartyId, bool sendExVollzug = false);
private:
MainDispatcher *m_mainDispatcher;
std::shared_ptr<AreaEffectSimulation::Interface::Ftc> m_ftcAes;
std::shared_ptr<AreaEffectSimulation::Interface::Dtc> m_dtcAes;
std::shared_ptr<ParticipantManagement::Interface::Dtc> m_dtcPpm;
std::shared_ptr<TrainingAreaBase::DdsHandler> m_ddsHandler;
void onTrajectoryAdlerModifyReply(const Core::FunctionReplyObject &reply) override;
LtsUtils::RequestHelper *m_requestHelper;
QHash<int, AreaEffectSimulation::AesEffectState> m_singleExplosions;
WirkfeldplanungData m_wirkfeldPlanungsData;
QHash<int, QString> m_aesIdToFeuerkampfReferenz; // key = aesId, value = feuerkampfReferenz
QHash<QString, int> m_feuerkampReferenzAmmoCounter; // key = feuerkampfReferenz, value = AmmoCounter
QHash<QString, std::vector<ProjectDataManagement::L27_EffectorId>> m_feuerkampfReferenzWirkmittel; // key = feuerkampfReferenz, value = Kenner
QHash<QString, bool> m_feuerkampfReferenzUsedFeuerHalt; // key = feuerkampfReferenz, value = boolean -> if Feuerhalt was activ
int m_participantId;
int m_wirkmittelIndex;
int m_aesId;
QHash<int, int> aesIdWsId; // key = aesId value = wsId
};
} // namespace AdlerJson
@@ -0,0 +1,50 @@
/**
* @RDE_HEADER@
* $Id: $
* $HeadURL: $
* $Author: $
* Created by Steve K., ESZS 12-01-2026
*/
#pragma once
#include "logger.h"
#include <AssetManagement/asm_dtc.h>
#include <AssetManagement/asm_ftc.h>
#include "main_dispatcher.h"
#include <QtCore/QObject>
namespace AssetManagement
{
namespace Interface
{
class Dtc;
class Ftc;
}
}
namespace AdlerJson
{
class MainDispatcher;
class AsmHandler : public QObject
, protected AssetManagement::Interface::Ftc::AssetModifyReplyHandler
{
Q_OBJECT
public:
explicit AsmHandler(QObject *parent = nullptr);
bool init(MainDispatcher* mainDispatcher);
std::shared_ptr<AssetManagement::Interface::Dtc> getDtc() { return m_dtcAsm; }
std::shared_ptr<AssetManagement::Interface::Ftc> getFtc() { return m_ftcAsm; }
void modifyAssetAdlerProperties(int assetId, bool isSaaConnected = false);
private:
void onAssetModifyReply(const Core::FunctionReplyObject &reply) override;
private:
std::shared_ptr<AssetManagement::Interface::Dtc> m_dtcAsm;
std::shared_ptr<AssetManagement::Interface::Ftc> m_ftcAsm;
int m_exerciseId;
};
} // namespace AdlerJson
@@ -0,0 +1,67 @@
/**
* @RDE_HEADER@
* FlmHandler for UFomHlaJson Plugin
* $Id: pdm_handler.h 62304 2024-03-21 08:17:45Z ewert_j $
* $HeadURL: svn://slssvn/TDS/branches/product/features/ufom/Lts/Proxies/TrainingAreaBase/Plugins/UFomHlaJson/pdm_handler.h $
* $Author: ewert_j $
* Created by Julius Ewert, ESIM, 2024-03-20
*/
#pragma once
#include "logger.h"
#include <QtCore/QObject>
#include <Lts/Services/FileManagement/flm_ftc.h>
#include <NotificationManagement/nom_ftc.h>
#include <NotificationManagement/nom_ftc_types.h>
#include <OperatorManagement/opm_data_plugin_interface.h>
#include <TrainingAreaBase/dds_handler.h>
namespace FileManagement
{
namespace Interface
{
class Dtc;
}
} // namespace FileManagement
namespace AdlerJson
{
class MainDispatcher;
class FlmHandler
: public QObject
, protected FileManagement::Interface::Ftc::FileContentModifyReplyHandler
, protected FileManagement::Interface::Ftc::PathCreateReplyHandler
, protected NotificationManagement::Interface::Ftc::CreateNotificationReplyHandler
{
Q_OBJECT
public:
explicit FlmHandler(QObject *parent = nullptr);
bool processHQMessage(int partyId, const QString &name, int meldungsnummer, const QJsonObject &obj);
void createHQNotification(const int partyId, const int folderId, const int fileId);
signals:
public slots:
bool init(MainDispatcher *mainDispatcher);
void initHQFolders(int partyId);
private:
void onFileContentModifyReply(const Core::FunctionReplyObject &reply) override;
void onPathCreateReply(const Core::FunctionReplyObject &reply) override;
void onCreateNotificationReply(const Core::FunctionReplyObject &replyObject) override final;
bool parseContent(const QString &contentString, QMap<QString, QString> &retMap);
private:
MainDispatcher *m_mainDispatcher = nullptr;
int m_exerciseId;
int m_parentFolderId;
int m_partyId;
int m_folderHXMessagesId;
std::shared_ptr<FileManagement::Interface::Dtc> m_dtcFlm;
std::shared_ptr<FileManagement::Interface::Ftc> m_ftcFlm;
std::shared_ptr<NotificationManagement::Interface::Ftc> m_ftcNom;
std::shared_ptr<OperatorManagement::Interface::Dtc> m_opmDtc;
};
} // namespace AdlerJson
@@ -0,0 +1,54 @@
#pragma once
#include "telegrams.h"
class GenerateTelegrams
{
public:
GenerateTelegrams();
static void SAATELEGRAMS_EXPORT addHeaderData(AdlerJson::EXTelegramBase &tele, const int saaId, const QString referenceUuid = QString{});
static void SAATELEGRAMS_EXPORT generateConnectResponseMessage(AdlerJson::ExAnmeldebestaetigung &exAnmeldebestaetigung);
static void SAATELEGRAMS_EXPORT generateConnectMessage(AdlerJson::EXRegistration &exRegistration, int partyId, bool isVerbund = true);
static void SAATELEGRAMS_EXPORT generateDisconnectMessage(AdlerJson::EXDeregistration &eXDeregistration, int partyId);
static void SAATELEGRAMS_EXPORT generateStatusMessage(AdlerJson::EXStatus &exStatus, AdlerJson::Szenarstatus status);
static void SAATELEGRAMS_EXPORT generateConnectionTestMessage();
static void SAATELEGRAMS_EXPORT generateAbmeldung(AdlerJson::EXDeregistration &req);
static void SAATELEGRAMS_EXPORT generateZeit1(AdlerJson::Zeitangabe_DTG &zeit);
static void SAATELEGRAMS_EXPORT generateZeit2(AdlerJson::Zeitangabe_DTG &zeit);
// fire
static void SAATELEGRAMS_EXPORT generateZieldaten(AdlerJson::Zieldaten &wzd);
static void SAATELEGRAMS_EXPORT generateWirkmittelFeuerkommando_Gmlrs(QVector<AdlerJson::WirkmittelFeuerkommandoRakete> &wfr);
static void SAATELEGRAMS_EXPORT generateEXFQBABBFK(AdlerJson::ExAwesPlanning &req);
static void SAATELEGRAMS_EXPORT generateEXFQBABBFK_Gmlrs(AdlerJson::ExAwesPlanning &req);
static void SAATELEGRAMS_EXPORT generateEXFQBABBFK_Dm72(AdlerJson::ExAwesPlanning &req);
static void SAATELEGRAMS_EXPORT generateFeuerbereit(AdlerJson::ExFeuerbereit &req);
static void SAATELEGRAMS_EXPORT generateFeuern(AdlerJson::ExFeuern &req);
static void SAATELEGRAMS_EXPORT generateFeuern_Gmlrs(AdlerJson::ExFeuern &req);
static void SAATELEGRAMS_EXPORT generateFeuern_Dm72(AdlerJson::ExFeuern &req);
static void SAATELEGRAMS_EXPORT generateNichtFeuern(AdlerJson::exNichtFeuern &req);
static void SAATELEGRAMS_EXPORT generateAbgefeuert(AdlerJson::ExAbgefeuert &req);
static void SAATELEGRAMS_EXPORT generateVollzugsmeldung(AdlerJson::ExVollzugsmeldung &req);
// static void SAATELEGRAMS_EXPORT generateErkundungsanfrage(AdlerJson::ExErkundungsanfrage &req);
static void SAATELEGRAMS_EXPORT generateErkundungsergebnisse(AdlerJson::ExErkundungsergebnisse &req);
static void SAATELEGRAMS_EXPORT generateFeuerkampf(AdlerJson::ExFeuerkampf &req);
static void SAATELEGRAMS_EXPORT generateFeuerhalt(AdlerJson::ExFeuerhalt &req);
static void SAATELEGRAMS_EXPORT generateStellungsmeldungFS(AdlerJson::ExFeuerstellungFS &req);
static void SAATELEGRAMS_EXPORT generateStellungsmeldungWS(AdlerJson::ExFeuerstellungWS &req);
static void SAATELEGRAMS_EXPORT generateStellungsmeldungWS_Gmlrs(AdlerJson::ExFeuerstellungWS &req);
static void SAATELEGRAMS_EXPORT generateStellungsmeldungWS_Dm72(AdlerJson::ExFeuerstellungWS &req);
static void SAATELEGRAMS_EXPORT generateStellungsmeldungLP(AdlerJson::ExFeuerstellungLP &req);
static void SAATELEGRAMS_EXPORT generateStellungswechsel(AdlerJson::ExStellungswechsel &req);
static void SAATELEGRAMS_EXPORT generateKoordinierungsmassnahmen(AdlerJson::ExHqKoordinierungsmassnahmen &req);
static void SAATELEGRAMS_EXPORT generateKoordinierungsmassnahmen_EX_L25(AdlerJson::ExHqKoordinierungsmassnahmen &req,
ProjectDataManagement::L25_KindGuidingLine kind, int i);
static void SAATELEGRAMS_EXPORT generateFuehrungslinien(AdlerJson::ExHqFuehrungslinien &req);
static void SAATELEGRAMS_EXPORT generateFuehrungslinien_EX_L24(AdlerJson::ExHqFuehrungslinien &req, AdlerJson::Art_L24 art24, int meldungsnummer);
static void SAATELEGRAMS_EXPORT generateTechnischeQuittung(AdlerJson::ExTqTechnischeQuittung &req);
static void SAATELEGRAMS_EXPORT generateFreitextmeldung(AdlerJson::ExAqFreitextmeldung &req);
static void SAATELEGRAMS_EXPORT generateManuelleQuittung(AdlerJson::ExMqManuelleQuittung &req);
static void SAATELEGRAMS_EXPORT generateFlugbahnberechnung(AdlerJson::ExFlugbahnberechnung &req);
static void SAATELEGRAMS_EXPORT generateFlugbahndaten(AdlerJson::ExFlugbahndaten &req);
};
@@ -0,0 +1,15 @@
#pragma once
class InterfaceController
{
public:
InterfaceController();
public Q_SLOTS:
void onRegistration();
void onDeregistration();
void onNewConnection();
void onWebSocketDisconnected();
void onTextMessageReceived(const QByteArray &baJson);
};
@@ -0,0 +1,158 @@
/**
* @RDE_HEADER@
* HlaDispatcher for AdlerJson Plugin
* $Id: hla_dispatcher.h 62304 2024-03-21 08:17:45Z ewert_j $
* $HeadURL: svn://slssvn/TDS/branches/product/features/ufom/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/hla_dispatcher.h $
* $Author: ewert_j $
* Created by Julius Ewert, ESIM, 2024-03-20
*/
#pragma once
#include <QtCore/QHash>
#include <QtCore/QObject>
#include <QtCore/QVector>
#include <QtWebSockets/QWebSocket>
#include <Core/core_types.h> // tr_lts
#include <TrainingAreaBase/tab_plugin_interface.h>
// #include "logger.h"
#include "aes_handler.h"
#include "asm_handler.h"
#include "flm_handler.h"
#include "pdm_handler.h"
#include "ppm_handler.h"
#include "saa_interface.h"
#include "telegrams.h"
#include "ws_interface.h"
// #include <NotificationManagement/nom_ftc.h>
#include <NotificationManagement/nom_enums.hpp>
// #include <TrainingAreaBase/tab_dts.h>
// #include <TrainingAreaBase/tab_fts.h>
class QTimer;
namespace AdlerJson
{
using namespace TrainingAreaBase;
class JsonHandlerRx;
class JsonHandlerTx;
class DdsHandler;
// class EXStatus;
struct TrajectoryIdentifier
{
int aesItemId;
int explosionId;
};
class JsonDispatcher final
: public TrainingAreaBase::Plugin::Interface
, protected TrainingAreaBase::Interface::Fts::AdlerCalculateTrajectoryRequestHandler
, protected NotificationManagement::Interface::Ftc::CreateNotificationReplyHandler
{
Q_OBJECT
public:
JsonDispatcher(TrainingAreaBase::Plugin::DataProvider *pdp,
const std::shared_ptr<TrainingAreaBase::RecvFromTab> &recvFromTabCb,
const std::shared_ptr<TrainingAreaBase::TxMixin> &sendToTabCb,
NGL::Settings *settings,
std::shared_ptr<TrainingAreaBase::DdsHandler> &ddsHandler,
std::shared_ptr<FlmHandler> &flmHandler,
MainDispatcher *mainDispatcher);
public Q_SLOTS:
bool init() override;
public:
std::shared_ptr<TrainingAreaBase::SendToTab> sendToTab() override;
bool isDebugInterface() const override { return false; }
bool canSendData() const override;
void exerciseChanged() override { return; }
const char *name() const override { return tr_lts("dds", "APHLA"); }
std::shared_ptr<SAAInterface> getSAAByParty(const int partyId);
std::shared_ptr<SAAInterface> getSAAByWs(const int wsId);
QString getSender() { return QStringLiteral("EXCON@GUEZ.DE"); }
// SendToTele
bool sendExFeuerbereit(const ExFeuerbereit &exFBDataIn, const int partyId);
bool sendExAbgefeuert(const ExAbgefeuert &exAFDataIn, int partyId);
bool sendExMqManuelleQuittung(const ExMqManuelleQuittung &exMQDataIn, int partyId);
bool sendExTqTechnischeQuittung(const ExTqTechnischeQuittung &exTQDataIn, int partyId);
bool sendExVollzugsmeldung(const ExVollzugsmeldung &exVZDataIn, int partyId);
void onAdlerCalculateTrajectoryRequest(const rti::core::SampleIdentity &cookie, const TrainingAreaBase::AdlerCalculateTrajectoryRequest &request) override;
int getAssetId(const QString &saaName) const;
// misc
void cleanupSaaInterfaces(const QString &saaName, int wsId, int partyId);
void getCreateNotificationRequestData(const int wsId,
const QString &title,
NotificationManagement::CreateNotification &data,
const QString &content = {},
const QStringList &contentArgs = {});
void createNotificationRequest(const int wsId, const QString &title, const NotificationManagement::MessageType messageType, const NotificationManagement::NotificationType notificationType, const QString &content = {}, const QStringList &contentArgs = {});
public Q_SLOTS:
void onSAARegistration(const int wsId, const int partyId, const QString &saaName, const QString &szenarName, bool isVerbund, const QString &uuid);
void onSAADeregistration(const int wsId, const int partyId);
void onSAAConnectionTest(const int wsId, const QString &uuid);
void onSAAStatus(const int wsId, const EXStatus &status);
void onSAAExceptionStatus(const int wsId, const TechnischeDaten &exceptionStatus);
void onSAASQWS(const int wsId, const Waffensystemdaten &exSQWS);
void onSAASQFS(const int wsId, const Feuerstellungsdaten &exSQFS);
void onSAASQLP(const int wsId, const Ladeplatzdaten &exSQLP);
void onSAAHXGuidingLines(const int wsId, const Koordinierungsdaten &koordinierungsdaten);
void onSAAHXGuidingLinesAndBoundaries(const int wsId, const Fuehrungsdaten &fuehrungsdaten);
void onSSAEXFIREHALT(const int wsId, const FeuerHaltDaten &feuerhaltdaten);
void onSAATrajectoryData(const int wsId, const Flugbahndaten &exFlugbahndaten, const QString referenceUuid);
void onWebSocketConnected();
void onNewWebsocketConnected(const int wsId, const QString &address, qint16 port);
void onWSDisconnected(const int wsId);
void onWebsocketExternalConnectionStateChanged(bool bConnected);
void onWebSocketError();
void onRecivedTelegram(int wsId, const QJsonObject &telegramData);
void onTextMessageReceived(const QByteArray &message);
void connectWebsocket();
void reallyConnectWebsocket() { connectWebsocket(); }
void onKeepAliveTimerTimeout();
void onCreateNotificationReply(const Core::FunctionReplyObject &replyObject);
Q_SIGNALS:
void broadcastTelegramsRequest(const int equipmentNumber, const int broadcastIndex, const int resetCounter);
void jsonTelegramReceived(const TrainingAreaBase::TetraIcd::TrainingAreaTelegram *tele);
void websocketConnected(quint16 port);
private:
QUrl webSocketUrl() const;
bool isConnectionTest(QJsonDocument &doc);
QString getParticipantInfoLink(const QString &verein, const int partyId, const bool isVerbund);
std::shared_ptr<SAAInterface> getSAAByName(const QString &saaName);
private:
std::shared_ptr<TrainingAreaBase::RecvFromTab> m_recvFromTabCb;
std::shared_ptr<JsonHandlerRx> m_recvFromWebsocket;
std::shared_ptr<JsonHandlerTx> m_sendToWebsocket;
// DDS
MainDispatcher *m_mainDispatcher;
std::shared_ptr<FlmHandler> m_flmHandler;
std::shared_ptr<PpmHandler> m_ppmHandler;
std::shared_ptr<TrainingAreaBase::Interface::Fts> m_ftsTab;
std::shared_ptr<TrainingAreaBase::Interface::Dts> m_dtsTab;
std::shared_ptr<NotificationManagement::Interface::Ftc> m_ftcNom;
QVector<std::shared_ptr<SAAInterface>> m_saaInterfaces;
QMap<int, QTimer *> m_connectionKeepaliveTimer;
QHash<QString, TrajectoryIdentifier> m_trajectoryIdentifier; // key = exFlugbahnberechnung.uuid
QHash<QString, Core::GeoPosition> m_positionsLaunch; // key = exFlugbahnberechnung.uuid
NGL::Settings *m_settings;
QWebSocket *m_webSocket;
std::shared_ptr<TrainingAreaBase::WebSocketInterface> m_webSocketInterface;
QTimer *m_webSocketReconnectTimer;
bool m_bWarnedOnce;
rti::core::SampleIdentity m_cookieCalculateTrajectoryAdler;
int m_explosionIndex;
};
} // namespace AdlerJson
@@ -0,0 +1,59 @@
/**
* @RDE_HEADER@
* JsonHandlerRx for AdlerJson Plugin
* $Id: hla_handler_rx.h 62304 2024-03-21 08:17:45Z ewert_j $
* $HeadURL: svn://slssvn/TDS/branches/product/features/ufom/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/hla_handler_rx.h $
* $Author: ewert_j $
* Created by Julius Ewert, ESIM, 2024-03-20
*/
#pragma once
#include <TrainingAreaBase/recv_from_tab.h>
#include <TrainingAreaBase/tx_mixin.h>
#include <TrainingAreaBase/tab_plugin_interface.h>
#include <QtCore/QObject>
#include <QtCore/QString>
#include <memory>
#include "logger.h"
namespace AdlerJson
{
class AesHandler;
class PpmHandler;
class JsonDispatcher;
class JsonHandlerRx : public QObject
{
Q_OBJECT
public:
explicit JsonHandlerRx(const std::shared_ptr<TrainingAreaBase::RecvFromTab> &recvFromTabCb,
const std::shared_ptr<TrainingAreaBase::TxMixin> &sendToTabCb,
JsonDispatcher *dispatcher,
AesHandler *aesHandler,
PpmHandler *ppmHandler);
bool handleTelegram (const QByteArray &baJson );
bool handleTelegram (TrainingAreaBase::TetraIcd::TrainingAreaTelegram *tabTele);
bool handleTelegram (int wsId, const QJsonObject& telegram, int &errorcode);
Q_SIGNALS:
void participantConnectionState(int equipmentNumber, bool dataCommunicationPossible);
private:
template<typename T>
void rxData (const T &data );
template<typename T>
void txData (const T &data );
bool checkExercise (int equipmentNumber) const;
private:
std::shared_ptr<TrainingAreaBase::RecvFromTab> m_rxHandler;
std::shared_ptr<TrainingAreaBase::TxMixin> m_txHandler;
JsonDispatcher *m_dispatcher;
bool m_bWarnedOnce;
bool m_bWarnedOnceTx;
AesHandler *m_aesHandler;
PpmHandler *m_ppmHandler;
LOGGER_T m_logger;
};
} // namespace AdlerJson
@@ -0,0 +1,107 @@
/**
* @RDE_HEADER@
* HlaHandlerTx for AdlerJson Plugin
* $Id: hla_handler_tx.h 62304 2024-03-21 08:17:45Z ewert_j $
* $HeadURL: svn://slssvn/TDS/branches/product/features/ufom/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/hla_handler_tx.h $
* $Author: ewert_j $
* Created by Julius Ewert, ESIM, 2024-03-20
*/
#pragma once
#include "ppm_handler.h"
#include "pdm_handler.h"
#include "logger.h"
//#include "ws_handler.h"
#include "ws_interface.h"
#include <TrainingAreaBase/send_to_tab.h>
#include <TrainingAreaBase/recv_from_tab.h>
#include <TrainingAreaBase/tab_plugin_interface.h>
#include <QtCore/QHash>
class QWebSocket;
class PpmHandler;
class PdmHandler;
class AesHandler;
namespace AdlerJson
{
class JsonHandlerTx final : public QObject, public TrainingAreaBase::SendToTab
{
Q_OBJECT
public:
explicit JsonHandlerTx(TrainingAreaBase::Plugin::DataProvider *pdp, MainDispatcher *mainDispatcher);
void onWebSocketConnected (QWebSocket *webSocket);
void onWebSocketDisconnected ( );
void onWebsocketConnectedToExternalSystem (bool bConnected );
void setWSInterface(std::shared_ptr<TrainingAreaBase::WebSocketInterface> wsInterface) {m_wsInterface = wsInterface;};
const char *name () const override { return "ApAdler"; }
void resetSendCounter () override;
HandleState canHandleTelegram (int equipmentNumber, int telegramId) const override;
bool txData (const TrainingAreaBase::TetraIcd::Acknowledge &data) override;
bool txData (const TrainingAreaBase::TetraIcd::DemandBite &data) override;
bool txData (const TrainingAreaBase::TetraIcd::Init &data) override;
bool txData (const TrainingAreaBase::TetraIcd::SetVulnerabilityModel &data) override;
bool txData (const TrainingAreaBase::TetraIcd::DemandEquipmentConfigurationReport &data) override;
bool txData (const TrainingAreaBase::TetraIcd::DemandVulnerabilityStateChange &data) override;
bool txData (const TrainingAreaBase::TetraIcd::LanguageSelection &data) override;
bool txData (const TrainingAreaBase::TetraIcd::EquipmentMessage &data) override;
bool txData (const TrainingAreaBase::TetraIcd::EquipmentMessageOC &data) override;
bool txData (const TrainingAreaBase::TetraIcd::CreateSingleExplosion &data) override;
bool txData (const TrainingAreaBase::TetraIcd::CreateAreaExplosion &data) override;
bool txData (const TrainingAreaBase::TetraIcd::CreateMineArea &data) override;
bool txData (const TrainingAreaBase::TetraIcd::MineAreaSingleMineState &data) override;
bool txData (const TrainingAreaBase::TetraIcd::CreateNContamination &data) override;
bool txData (const TrainingAreaBase::TetraIcd::CreateCContamination &data) override;
bool txData (const TrainingAreaBase::TetraIcd::DeactivateEffectSimulation &data) override;
bool txData (const TrainingAreaBase::TetraIcd::ModifyAreaEffectSimulationName &data) override;
bool txData (const TrainingAreaBase::TetraIcd::PauseEffectSimulation &data) override;
bool txData (const TrainingAreaBase::TetraIcd::ResumeEffectSimulation &data) override;
bool txData (const TrainingAreaBase::TetraIcd::MineTriggered &data) override;
bool txData (const TrainingAreaBase::TetraIcd::DusMineReactivation &data) override;
bool txData (const TrainingAreaBase::TetraIcd::CreateFunctionalArea &data) override;
bool txData (const TrainingAreaBase::TetraIcd::CreateDusSingleMine &data) override;
bool txData (const TrainingAreaBase::TetraIcd::ExerciseEnvironmentData &data) override;
bool txData (const TrainingAreaBase::TetraIcd::ExerciseStateData &data) override;
bool txData (const TrainingAreaBase::TetraIcd::OpaquePayloadDataOut &data) override;
bool txData (const TrainingAreaBase::TetraIcd::ParticipantSwVersionsRequest &data) override;
bool txData (const TrainingAreaBase::TetraIcd::CesHitInformation &data) override;
bool txData (const TrainingAreaBase::TetraIcd::TechnicalArea &data) override;
bool txData (const TrainingAreaBase::TetraIcd::CesHitRequest &data) override;
bool txData (const TrainingAreaBase::TetraIcd::ParticipantMode &data) override;
bool txData (const TrainingAreaBase::TetraIcd::DemandParticipantMode &data) override;
bool txData (const TrainingAreaBase::TetraIcd::ParticipantConfiguration &data) override;
bool txData (const TrainingAreaBase::TetraIcd::DemandParticipantConfiguration &data) override;
bool txData (const TrainingAreaBase::TetraIcd::ExerciseEquipmentAssignmentComplete &data) override;
bool txData (const TrainingAreaBase::TetraIcd::Sanitation &data) override;
bool txData (const TrainingAreaBase::TetraIcd::SelectiveReammunition &data) override;
bool txData (const TrainingAreaBase::TetraIcd::SetDevicePowerRequest &data) override;
bool txData (const TrainingAreaBase::TetraIcd::OcCommand &data) override;
bool txData (const TrainingAreaBase::TetraIcd::UAVPerformMission &data) override;
bool txData (const TrainingAreaBase::TetraIcd::UAVChangeState &data) override;
bool txData (const TrainingAreaBase::TetraIcd::ExFireReadiness &data) override;
bool txData (const TrainingAreaBase::TetraIcd::ExFiredReport&data) override;
bool txData (const TrainingAreaBase::TetraIcd::ExConfirmationReport &data) override;
QHash<int, bool> dataCommunicationPossible() const;
public slots:
void onParticipantConnectionState (const int equipmentNumber, const bool dataCommunicationPossible);
void onGenericTelegram (const QJsonObject &telegram);
void onGenericTelegram1 (const int wsId, const QJsonObject &telegram);
private:
bool sendToTx(const TrainingAreaBase::TetraIcd::TrainingAreaTelegram *data, const bool bForce = false);
private:
TrainingAreaBase::Plugin::DataProvider *m_pdp;
QHash<int, bool> m_dataCommunicationPossible; // equioNo, reachable
MainDispatcher *m_mainDispatcher;
QWebSocket *m_webSocket;
std::shared_ptr<TrainingAreaBase::WebSocketInterface> m_wsInterface;
bool m_bWebsocketConnectedToExternalSystem;
LOGGER_T m_logger;
};
}// namespace AdlerJson
@@ -0,0 +1,23 @@
/**
* @RDE_HEADER@
* Logger for AdlerJson Plugin
* $Id: logger.h 62304 2024-03-21 08:17:45Z ewert_j $
* $HeadURL: svn://slssvn/TDS/branches/product/features/ufom/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/logger.h $
* $Author: ewert_j $
* Created by Julius Ewert, ESIM, 2024-03-20
*/
#pragma once
#include <NGLLogger/INGLLogger.h>
namespace AdlerJson
{
using LOGGER_T = NGL::INGLLogger&;
LOGGER_T getLogger(const char *name);
inline LOGGER_T getLogger(const QString &loggerName)
{
return getLogger(loggerName.toUtf8().constData());
}
} // namespace AdlerJson
@@ -0,0 +1,84 @@
/**
* @RDE_HEADER@
* MainDispatcher for AdlerJson Plugin
* $Id: main_dispatcher.h 62899 2024-05-29 11:08:50Z ewert_j $
* $HeadURL: svn://slssvn/TDS/branches/product/features/ufom/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/main_dispatcher.h $
* $Author: ewert_j $
* Created by Julius Ewert, ESIM, 2024-03-20
*/
#pragma once
#include <QtCore/QObject>
#include <TrainingAreaBase/tab_plugin_interface.h>
#include <Core/core_types.h> // tr_lts
#include <TrainingAreaBase/dds_handler.h>
//#include "logger.h"
#include "ppm_handler.h"
#include "pdm_handler.h"
#include "aes_handler.h"
#include "flm_handler.h"
#include "asm_handler.h"
namespace AdlerJson
{
class JsonDispatcher;
class PpmHandler;
class PdmHandler;
class AesHandler;
class FlmHandler;
class AsmHandler;
class MainDispatcher final : public TrainingAreaBase::Plugin::Interface
{
Q_OBJECT
public:
MainDispatcher( TrainingAreaBase::Plugin::DataProvider *pdp,
const std::shared_ptr<TrainingAreaBase::RecvFromTab> &recvFromTabCb,
const std::shared_ptr<TrainingAreaBase::TxMixin> &sendToTabCb,
const std::shared_ptr<TrainingAreaBase::DdsHandler> &ddsHandler,
NGL::Settings *settings);
~MainDispatcher();
std::shared_ptr<PpmHandler> ppmHandler() const { return m_ppmHandler; }
std::shared_ptr<PdmHandler> pdmHandler() const { return m_pdmHandler; }
std::shared_ptr<AesHandler> aesHandler() const { return m_aesHandler; }
std::shared_ptr<AsmHandler> asmHandler() const { return m_asmHandler; }
JsonDispatcher* jsonDispatcher() const { return m_adlerDispatcher; }
std::shared_ptr<TrainingAreaBase::DdsHandler> ddsHandler() const { return m_ddsHandler; }
int exerciseId() const { return m_exerciseId; }
public slots:
bool init() override;
void onWebsocketConnected(quint16 port);
public:
std::shared_ptr<TrainingAreaBase::SendToTab> sendToTab() override;
bool canSendData () const override;
void exerciseChanged () override;
bool isDebugInterface () const override { return false; }
const char *name () const override { return tr_lts("dds", "ApHlaJson"); }
private:
JsonDispatcher *m_adlerDispatcher;
std::shared_ptr<TrainingAreaBase::RecvFromTab> m_recvFromTabCb;
const std::shared_ptr<TrainingAreaBase::TxMixin> m_sendToTab;
std::shared_ptr<TrainingAreaBase::SendToTab> m_mainHandlerTx;
TrainingAreaBase::Plugin::DataProvider *m_pdp;
NGL::Settings *m_settings;
std::shared_ptr<PpmHandler> m_ppmHandler;
std::shared_ptr<PdmHandler> m_pdmHandler;
std::shared_ptr<AesHandler> m_aesHandler;
std::shared_ptr<FlmHandler> m_flmHandler;
std::shared_ptr<AsmHandler> m_asmHandler;
std::shared_ptr<TrainingAreaBase::DdsHandler> m_ddsHandler;
int m_domainId;
int m_exerciseId;
};
} // namespace AdlerJson
@@ -0,0 +1,44 @@
/**
* @RDE_HEADER@
* PdmHandler for AdlerJson Plugin
* $Id: pdm_handler.h 62304 2024-03-21 08:17:45Z ewert_j $
* $HeadURL: svn://slssvn/TDS/branches/product/features/ufom/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/pdm_handler.h $
* $Author: ewert_j $
* Created by Julius Ewert, ESIM, 2024-03-20
*/
#pragma once
#include "main_dispatcher.h"
#include "logger.h"
#include <TrainingAreaBase/dds_handler.h>
#include <ProjectDataManagement/pdm.hpp>
#include <ProjectDataManagement/pdm_dtc.h>
#include <LtsUtils/LtsUtilsCore/data_modification_enum.h>
#include <QtCore/QObject>
#include <QtCore/QHash>
#include <QtCore/QUrl>
#include <QtCore/QDateTime>
namespace AdlerJson
{
class MainDispatcher;
class PdmHandler : public QObject
{
Q_OBJECT
public:
explicit PdmHandler(QObject *parent = nullptr);
void getChargeTypes();
std::shared_ptr<ProjectDataManagement::Interface::Dtc> getDtc() { return m_dtcPdm; }
signals:
void sendChargeTypes(QJsonObject jsonObj);
public slots:
bool init(MainDispatcher* mainDispatcher);
private:
std::shared_ptr<ProjectDataManagement::Interface::Dtc> m_dtcPdm;
};
} // namespace AdlerJson
@@ -0,0 +1,33 @@
/**
* @RDE_HEADER@
* TabAdlerPlugin for AdlerJson Plugin
* $Id: plugin.h 62304 2024-03-21 08:17:45Z ewert_j $
* $HeadURL: svn://slssvn/TDS/branches/product/features/ufom/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/plugin.h $
* $Author: ewert_j $
* Created by Julius Ewert, ESIM, 2024-03-20
*/
#pragma once
#include "TrainingAreaBase/dds_handler.h"
#include <QtCore/QObject>
#include <TrainingAreaBase/tab_plugin_interface.h>
namespace AdlerJson
{
class TabAdlerPlugin : public QObject, public TrainingAreaBase::Plugin::Plugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "special:3:tab.aphla")
Q_INTERFACES(TrainingAreaBase::Plugin::Plugin)
public:
TabAdlerPlugin() = default;
~TabAdlerPlugin() = default;
std::shared_ptr<TrainingAreaBase::Plugin::Interface> createInterface(TrainingAreaBase::Plugin::DataProvider *pdp,
const std::shared_ptr<TrainingAreaBase::RecvFromTab> &recvFromTabCb,
const std::shared_ptr<TrainingAreaBase::TxMixin> &sendToTab,
const std::shared_ptr<TrainingAreaBase::DdsHandler> &ddsHandler,
NGL::Settings *settings) override;
};
} // namespace AdlerJson
@@ -0,0 +1,111 @@
/**
* @RDE_HEADER@
* PpmHandler for AdlerJson Plugin
* $Id: ppm_handler.h 62899 2024-05-29 11:08:50Z ewert_j $
* $HeadURL: svn://slssvn/TDS/branches/product/features/ufom/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/ppm_handler.h $
* $Author: ewert_j $
* Created by Julius Ewert, ESIM, 2024-03-20
*/
#pragma once
#include "Core/core.hpp"
#include "main_dispatcher.h"
#include "logger.h"
#include <ParticipantManagement/ppm.hpp>
#include <ParticipantManagement/ppm.hpp>
#include <ParticipantManagement/ppm_ftc.h>
#include <LtsUtils/LtsUtilsCore/data_modification_enum.h>
#include <QtCore/QTimer>
#include <QtCore/QObject>
#include <QtCore/QHash>
#include <QtCore/QUrl>
#include <QtCore/QDateTime>
#include <telegrams.h>
namespace AdlerJson
{
class MainDispatcher;
class PpmHandler
: public QObject
, protected ParticipantManagement::Interface::Ftc::ModifyParticipantDataReplyHandler
, protected ParticipantManagement::Interface::Ftc::ModifyPartyDataReplyHandler
{
Q_OBJECT
public:
explicit PpmHandler(QObject *parent = nullptr);
bool init(MainDispatcher* mainDispatcher);
void getParticipants();
bool isEqNumberInExercise(const int equipmentNumber) const;
std::shared_ptr<ParticipantManagement::Interface::Dtc> getDtc() { return m_dtcPpm; }
std::shared_ptr<ParticipantManagement::Interface::Ftc> getFtc() { return m_ftcPpm; }
void onCreateParticipant();
// ModifyParticipantDataRequestHandler interface
void onModifyParticipantDataReply(const Core::FunctionReply &reply);
void onModifyPartyDataReply(const Core::FunctionReply &reply);
void modifyPartyAdlerProperties(const int wsId, const int assetId, const int partyId, const QString &saaName, const QString &szenarName,
const ParticipantManagement::ConnectState &connectState, const bool isVerbund);
//parse functions that trigger other services
void parseSQFS(const Feuerstellungsdaten &exSQFS, const int wsId);
void parseSQWS(const Waffensystemdaten &exSQWS, const int wsId);
void parseSQLP(const Ladeplatzdaten &exSQLP, const int wsId);
void removeAllSAAParticipants(const int partyId);
ParticipantManagement::Participant findParticipantByInternalName(const QString &internalName, const int partyId, const bool isVerbund);
signals:
void participantChanged(const QJsonObject &jsonObj);
void participantUnmount(const QJsonObject &jsonObj);
void participantMount(const QJsonObject &jsonObj);
private slots:
void onPartyChanged(const ParticipantManagement::Party &data, DataModification modType);
void onParticipantChanged(const ParticipantManagement::Participant &data, DataModification modType);
void onParticipantPositionChanged(const ParticipantManagement::ParticipantPosition &data, DataModification modType);
void onDynamicParticipantDataChanged(const ParticipantManagement::DynamicParticipantData &data, DataModification modType);
void onSendParticipantDataTimeout();
private:
void handleParticipantPositionChangedExternal(const ParticipantManagement::ParticipantPosition &position);
void handleParticipantPositionChangedInternal(const ParticipantManagement::ParticipantPosition &position);
void sendParticipantMount(const ParticipantManagement::Participant &part, const ParticipantManagement::Participant &partToBeMounted);
void sendParticipantUnmount(const ParticipantManagement::Participant &participant);
void sendParticipantPositionChanged(const ParticipantManagement::ParticipantPosition &position);
void onModifyParticipantDataReply(const Core::FunctionReplyObject &reply) override;
void onModifyPartyDataReply(const Core::FunctionReplyObject &reply) override;
QList<ParticipantManagement::Participant> findAllSAAParticipants(const int partyId);
ParticipantManagement::ParticipantData findParticipantDataByInternalName(int &randomNumberInOut, const QString &internalName, const bool isVerbund);
ParticipantManagement::ParticipantData findRootUnit(const int partyId);
void sendPositionFromTempMap(int rndNmbr, const int partyId, const bool isVerbund);
void sendChargesFromTempMap(const int rndNmbr, const int partyId, const bool isVerbund);
void sendReadyMessageFromTempMap(int rndNmbr, const int partyId, const bool isVerbund);
int convertStatus_L28(const ProjectDataManagement::L28_Status &status);
QVector<AdlerJson::Geschoss> sumUpAnzahlForSameGeschoss(const QVector<AdlerJson::Geschoss> &geschosse) const;
private:
MainDispatcher *m_mainDispatcher;
std::shared_ptr<ParticipantManagement::Interface::Dtc> m_dtcPpm;
std::shared_ptr<ParticipantManagement::Interface::Ftc> m_ftcPpm;
QHash<int, int> m_participantIdsByEqNo; // eqNo, partId
QHash<int, int> m_mountedParticipants;// participantId of passanger, participantId of Vehicle
QTimer *m_sendParticipantDataTimer;
QVector<int> m_randomNumbers;
//maps
QMap<ProjectDataManagement::L19_Oi, KoordinateMitHoehe> m_mapLocationToPosition;
QMap<int, QMap<QString,KoordinateMitHoehe>> m_tempPositionMap;
QMap<int, QVector<QString>> m_tempinternalNameMap;
QMap<int, QMap<QString,QVector<Geschoss>>> m_tempChargesMap;
QMap<int, std::vector<ParticipantManagement::ParticipantData>> m_tempPartDataList;
QMap<int, QMap<QString,ProjectDataManagement::L28_Status>> m_tempReadyMessage;
};
} // namespace AdlerJson
@@ -0,0 +1,103 @@
#pragma once
#include <QtCore/QString>
#include <AdlerJson/telegrams.h>
#include "ppm_handler.h"
#include "aes_handler.h"
#include "pdm_handler.h"
#include "logger.h"
// Forward:
namespace LtsCoordTrans
{
struct UtmCoordinate;
}
namespace AdlerJson
{
enum class ScenarioStatus // Szenarstatus
{
NONE ,
INACTIVE , // Inaktiv
PLANNED , // Geplant
ACTIVE , // Aktiv
STOPPED // Gestoppt
};
QString statusToStr(ScenarioStatus status);
ScenarioStatus strToStatus(QString status);
/**
* @brief Convert (relative) Flugbahnpunkt to EXCON coordinate system
* @param fbPos Flugbahnpunkt to be converted.
* @param transformMatrix QTransform to be applied (most likely rotation).
* @param utmLaunch launch coordinate for debugging purpose
* @param logger to be used.
* @return Coordinate transformed (rotated) in EXCON coordinate system.
*/
static Core::RelativePositionRelativeTime convertFlugbahnpunkt(const Flugbahnpunkt &fbPos,
const QTransform &transformMatrix,
const LtsCoordTrans::UtmCoordinate &utmLaunch,
LOGGER_T logger);
class JsonDispatcher;
class SAAInterface
: public QObject
, protected AreaEffectSimulation::Interface::Ftc::TrajectoryAdlerModifyReplyHandler
{
Q_OBJECT
public:
SAAInterface(int wsId, int partyId, const QString& saaName, const QString& szenarName, bool isVerbund, QObject *parent = nullptr);
bool init(std::shared_ptr<PpmHandler> ppmHandler,
std::shared_ptr<PdmHandler> pdmHandler,
std::shared_ptr<AesHandler> aesHandler,
std::shared_ptr<TrainingAreaBase::Interface::Dts> dtsTab);
int getWsId(){ return m_wsId; };
void setWsId(int wsId){ m_wsId = wsId;};
int getPartyId(){ return m_partyId; };
void setPartyId(int partyId){ m_partyId = partyId; };
QString getSAAName(){ return m_saaName; };
//QString getSAAName(){ return QStringLiteral("SAA.GUEZ.DE"); };
void setSaaName(const QString& saaName){ m_saaName = saaName; };
//void setSaaName(const QString& saaName){ Q_UNUSED(saaName); m_saaName = QStringLiteral("SAA@GUEZ.de"); };
QString getSzenarName() {return m_szenarName; }
void setSzenarName(const QString &szenarName) { m_szenarName = szenarName; }
Szenarstatus getStatus(){ return m_status; };
void setStatus(Szenarstatus status);
void setIsVerbund(bool isVerbund) { m_isVerbund = isVerbund; }
bool getIsVerbund(){ return m_isVerbund; }
void setIsAlive(bool isAlive) { m_isAlive = isAlive; }
bool getIsAlive(){ return m_isAlive; }
//parse functions that trigger other services
void parseFlugbahndaten(const Flugbahndaten &flugbahndaten, int aesItemId, int exposionId, const Core::GeoPosition &positionLaunch);
template<typename T>
void rxData (const T &data );
private:
void onTrajectoryAdlerModifyReply(const Core::FunctionReplyObject &reply) override;
int m_wsId;
int m_partyId;
QString m_saaName;
QString m_szenarName;
Szenarstatus m_status;
bool m_isVerbund;
bool m_isAlive=false;
//int m_currentRandomNumber{0};
//DDS
std::shared_ptr<PpmHandler> m_ppmHandler;
std::shared_ptr<PdmHandler> m_pdmHandler;
std::shared_ptr<AesHandler> m_aesHandler;
std::shared_ptr<AreaEffectSimulation::Interface::Ftc> m_ftcAes;
std::shared_ptr<TrainingAreaBase::Interface::Dts> m_dtsTab;
};
}
@@ -0,0 +1,33 @@
/**
* Settings for TetraRadio
* $Id: settings.h 63154 2024-06-25 11:19:33Z karwat $
* $HeadURL: svn://slssvn/TDS/branches/product/features/24_adler/Lts/Proxies/TrainingAreaBase/settings.h $
* $Author: karwat $
* Created by Christian Ehrlicher, SLSE, 2016-04-14
*/
#pragma once
#include <QtCore/QString>
#include <QtCore/QJsonObject>
namespace NGL
{
class Settings;
}
namespace TrainingAreaBase
{
namespace Settings
{
//!< The real NGL::Settings - object
NGL::Settings *settings();
void setIniFile(const QString &ini);
QString txDir();
QString rxDir();
QPair<quint16, quint16> getWebSocketServerPortRange(int type);
}
} // namespace TrainingAreaBase
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,78 @@
#pragma once
#include "ws_interface.h"
#include "logger.h"
#include <TrainingAreaBase/training_area_telegrams.h>
#include <QtWebSockets/QWebSocketServer>
#include <QtCore/QObject>
#include <memory>
namespace TrainingAreaBase
{
class WebSocketWrapper;
class WebSocketHandler : public WebSocketInterface
{
Q_OBJECT
public:
explicit WebSocketHandler(QObject *parent = nullptr);
~WebSocketHandler();
// WSInterface interface
public:
bool init(quint16 listenPort) override;
bool isConnected() const override;
quint16 getPort() const override;
bool sendTelegram(const int typeId, const QJsonObject *data, const int exerciseId) override;
bool sendTelegram(const int wsId, const QJsonObject *data) override;
bool disconnectWs(int wsId) override;
QString getPeerAddress(int wsId) const override;
QUrl getPeerUrl(int wsId) const override;
int getExerciseId(int wsId) const override;
//Q_SIGNALS:
// void wsDisconnect(const int wsId);
private Q_SLOTS:
void onNewConnection();
void onWebSocketDisconnected();
void onTextMessageReceived(const QByteArray &baJson);
private:
bool sendTelegramInternal(const TrainingAreaBase::TetraIcd::TrainingAreaTelegram *data, const QString &type, int exerciseId);
bool sendTelegramInternal(const int wsId, const TrainingAreaBase::TetraIcd::TrainingAreaTelegram *data, const QString &type, const int exerciseId);
int getWSIdFromWS( WebSocketWrapper* wsw );
private:
QWebSocketServer *m_webSocketServer;
//QVector<std::shared_ptr<WebSocketWrapper>> m_webSockets;
QMap<int, std::shared_ptr<WebSocketWrapper>> m_connections; // key = wsId
int m_nextWsId = 1;
AdlerJson::LOGGER_T m_logger;
};
class WebSocketWrapper : public QObject
{
Q_OBJECT
public:
explicit WebSocketWrapper(QWebSocket *ws);
~WebSocketWrapper();
bool sendTextMessage(const QString &msg);
void setExerciseId(int exerciseId);
void setWsId(int wsId){ m_wsId = wsId; }
int getWsId(){ return m_wsId; }
int exerciseId() const { return m_exerciseId; }
QWebSocket *webSocket() const { return m_webSocket; }
Q_SIGNALS:
void textMessageReceived(const QByteArray &data);
private Q_SLOTS:
void onTextMessageReceived(const QString &data);
private:
QWebSocket *m_webSocket;
int m_wsId;
int m_exerciseId;
};
}
@@ -0,0 +1,45 @@
#pragma once
#include <QtCore/QObject>
#include <qobjectdefs.h>
namespace TrainingAreaBase {
class WebSocketInterface : public QObject
{
Q_OBJECT
public:
virtual bool init(quint16 listenPort) = 0;
bool init(const QPair<quint16, quint16> &portRange)
{
for (quint16 currentPort = portRange.first; currentPort != portRange.second; ++currentPort)
{
if (init(currentPort))
return true;
}
return init(0);
}
virtual bool isConnected() const = 0;
virtual quint16 getPort() const = 0;
virtual bool disconnectWs(int wsId) = 0;
virtual bool sendTelegram(int typeId, const QJsonObject *data, int exerciseId) = 0;
virtual bool sendTelegram(int wsId, const QJsonObject *data) = 0;
virtual QString getPeerAddress(int wsId) const = 0;
virtual QUrl getPeerUrl(int wsId) const = 0;
virtual int getExerciseId(int wsId) const = 0;
Q_SIGNALS:
void recivedTelegram(int wsId, const QJsonObject& telegramData);
void newConnection(int wsId, const QString& address, qint16 port);
void wsDisconnected(int wsId);
public:
explicit WebSocketInterface(QObject* parent = nullptr) : QObject(parent){}
virtual ~WebSocketInterface() {}
};
}