Adds succesfull lts/proxies migration & testsuite

This commit is contained in:
torsten committed 2026-09-19 09:18:18 +00:00
1 parent 9e38583785
commit a1914cb7d9
59 files changed
+754 -273

No files matched your search

@@ -45,6 +45,7 @@ NGL_TARGET_LINK_LIBRARIES(BuildingControlBsm
Qt6::Core
Qt6::Network
BuildingControlCommon
svcTabCommon
)
NGL_ADD_EXECUTABLE(AAR SV BuildingControlTestBsm bsm_test_main.cpp)
@@ -52,3 +53,4 @@ NGL_TARGET_LINK_LIBRARIES(BuildingControlTestBsm
BuildingControlBsm
nglcoreapplication
)
add_test(NAME bld_bsm_test COMMAND $<TARGET_FILE:BuildingControlTestBsm>)
@@ -11,7 +11,7 @@ namespace BSM
Api::Api(QObject *parent)
: QObject(parent)
, m_socketHandler(new SocketHandler(this))
, m_logger(BuildingControlUnit::getLogger("BSM.Api"))
, m_logger(TrainingAreaBase::getLogger("BSM.Api"))
{
connect(m_socketHandler, &SocketHandler::opticalShot,
this, &Api::opticalShot);
@@ -18,7 +18,7 @@ Socket::Socket(const Bsm &cfg, QObject *parent)
, m_tcpSocket(new QTcpSocket(this))
, m_reconnectTimer(nullptr)
, m_aliveTimer(new QTimer(this))
, m_logger(BuildingControlUnit::getLogger("BSM.Socket"))
, m_logger(TrainingAreaBase::getLogger("BSM.Socket"))
{
m_aliveTimer->setTimerType(Qt::VeryCoarseTimer);
m_aliveTimer->setSingleShot(true);
@@ -29,7 +29,7 @@ Socket::Socket(const Bsm &cfg, QObject *parent)
this, &Socket::onConnected);
connect(m_tcpSocket, &QTcpSocket::disconnected,
this, &Socket::onDisconnected);
connect(m_tcpSocket, QOverload<QAbstractSocket::SocketError>::of(&QTcpSocket::error),
connect(m_tcpSocket, &QTcpSocket::errorOccurred,
this, &Socket::onError);
connect(m_tcpSocket, &QTcpSocket::readyRead,
this, &Socket::onReadyRead);
@@ -23,7 +23,7 @@ static const qint64 s_opticalTimeSlot = 100;
SocketHandler::SocketHandler(QObject *parent)
: QObject(parent)
, m_logger(BuildingControlUnit::getLogger("BSM.SocketHandler"))
, m_logger(TrainingAreaBase::getLogger("BSM.SocketHandler"))
{
connect(&m_cleanupQueueTimer, &QTimer::timeout,
this, &SocketHandler::onCleanupQueue);
@@ -99,7 +99,7 @@ QByteArray Telegram::toBytestream() const
Telegram *Telegram::telegramFromBytestream(const QByteArray &data_)
{
NGL::INGLLogger &logger = BuildingControlUnit::getLogger("BSM.Telegrams");
NGL::INGLLogger &logger = TrainingAreaBase::getLogger("BSM.Telegrams");
QByteArray data = desubstituteData(data_);
if (data.size() < 2)
return nullptr;
@@ -35,7 +35,7 @@ QByteArray PanDirectFire::payload() const
Telegram *PanDirectFire::fromBytestream(const QByteArray &data)
{
NGL::INGLLogger &logger = getLogger("PanDirectFire");
NGL::INGLLogger &logger = TrainingAreaBase::getLogger("PanDirectFire");
DEBUG_LOG(logger) << "data.length=" << data.length();
if (data.length() < 9)
return nullptr;
@@ -4,16 +4,20 @@
# $Author:
#
# Make ${Qt6_WebSockets} optional
if(QT6_GUI_AVAILABLE AND TARGET Qt6::WebSockets)
set(Qt6_WebSockets ${Qt6_WebSockets})
# Make ${Qt6_WebSockets} optional (doesn't require GUI)
if(TARGET Qt6::WebSockets)
set(Qt6_WebSockets Qt6::WebSockets)
set(BUILDINGCONTROLJSON_AVAILABLE TRUE)
else()
set(Qt6_WebSockets "")
set(BUILDINGCONTROLJSON_AVAILABLE FALSE)
endif()
ADD_SUBDIRECTORY(BSM)
ADD_SUBDIRECTORY(Json)
if(BUILDINGCONTROLJSON_AVAILABLE)
ADD_SUBDIRECTORY(Json)
endif()
ADD_SUBDIRECTORY(VWM)
ADD_SUBDIRECTORY(ControlEffects)
@@ -51,6 +55,9 @@ NGL_TARGET_LINK_LIBRARIES(BuildingControlCommon
NGL_TARGET_INCLUDE_DIRECTORIES(BuildingControlCommon
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_BINARY_DIR}/Lts/Proxies/Buildings/BuildingControlUnit
${CMAKE_SOURCE_DIR}/Lts/Proxies/TrainingAreaBase
${CMAKE_BINARY_DIR}/Lts/Proxies/TrainingAreaBase
)
NGL_ADD_EXECUTABLE(AAR SV BuildingControlUnit ${bc_SRCS})
@@ -63,7 +70,7 @@ NGL_TARGET_LINK_LIBRARIES(BuildingControlUnit
Qt6::Concurrent
BuildingControlBsm
BuildingControlCommon
BuildingControlJson
$<$<BOOL:${BUILDINGCONTROLJSON_AVAILABLE}>:BuildingControlJson>
BuildingControlVwm
ControlEffects
LtsCommandLineParser
@@ -4,9 +4,9 @@
# $Author$
#
# Make ${Qt6_WebSockets} optional
if(QT6_GUI_AVAILABLE AND TARGET Qt6::WebSockets)
set(Qt6_WebSockets ${Qt6_WebSockets})
# Make ${Qt6_WebSockets} optional (doesn't require GUI)
if(TARGET Qt6::WebSockets)
set(Qt6_WebSockets Qt6::WebSockets)
else()
set(Qt6_WebSockets "")
endif()
@@ -31,18 +31,22 @@ SET(vwm_SRCS
)
NGL_ADD_LIBRARY2(AAR SV BuildingControlVwm SHARED ${vwm_SRCS})
if(QT6_GUI_AVAILABLE)
NGL_TARGET_LINK_LIBRARIES(BuildingControlVwm
PRIVATE
ngltools
Qt6::Xml
PUBLIC
Qt6::Core
${Qt6_Gui}
LtsUtilsCoreHeaderOnly
BuildingControlCommon
)
endif()
NGL_TARGET_LINK_LIBRARIES(BuildingControlVwm
PRIVATE
ngltools
Qt6::Xml
PUBLIC
Qt6::Core
${Qt6_Gui}
LtsUtilsCoreHeaderOnly
LtsUtilsCore
BuildingControlCommon
svcTabCommon
)
NGL_TARGET_INCLUDE_DIRECTORIES(BuildingControlVwm
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../..
)
################################
### Test
################################
@@ -58,6 +62,7 @@ NGL_TARGET_LINK_LIBRARIES(BuildingControlTestVwm
nglcoreapplication
LtsCoordTrans
)
add_test(NAME bld_vwm_test COMMAND $<TARGET_FILE:BuildingControlTestVwm>)
NGL_ADD_EXECUTABLE(AAR SV BuildingControlTestVwmXml test_vwm_xml.cpp)
if(QT6_GUI_AVAILABLE)
NGL_TARGET_LINK_LIBRARIES(BuildingControlTestVwmXml
@@ -69,6 +74,7 @@ if(QT6_GUI_AVAILABLE)
BuildingControlCommon
nglcoreapplication
)
add_test(NAME bld_vwm_xml_test COMMAND $<TARGET_FILE:BuildingControlTestVwmXml>)
endif()
IF(BUILD_TESTING AND TARGET BuildingControlVwm)
@@ -11,11 +11,11 @@
#include "test_read_xml.h"
#include "bcu_xml_reader.h"
#include <NGLLogger/NGLLoggerBootstrap.h>
#include <TrainingAreaBase/logger.h>
Test::Test() : m_api(new BuildingControlUnit::VWM::Api(this))
.getNGLLogger("BCU.VWM.Test")),
m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger()) {
{
connect(m_api, &BuildingControlUnit::VWM::Api::hitResult,
this, &Test::hitResult);
QTimer::singleShot(0, this, &Test::test1);
@@ -28,7 +28,8 @@ Test::~Test()
void Test::hitResult(const BuildingControlUnit::HitResult &result)
{
INFO_LOG(m_logger) << "Hit Result: sensorId = " << result.sensorId
auto &logger = TrainingAreaBase::getLogger("BCU.VWM.Test");
INFO_LOG(logger) << "Hit Result: sensorId = " << result.sensorId
<< ", originatorId = " << result.originatorId
<< ", chargeTypeId = " << result.chargeTypeId
<< ", dmgPercentOld = " << result.damagePercentOld
@@ -41,10 +42,7 @@ void Test::hitResult(const BuildingControlUnit::HitResult &result)
void Test::test1()
{
auto &logger = TrainingAreaBase::getLogger("BCU.VWM.Test");
const auto bsmMap = m_api->bsmMap();
for (const BuildingControlUnit::Bsm &bsm : bsmMap)
{
@@ -53,18 +51,18 @@ void Test::test1()
const auto hitPos = BuildingControlUnit::VWM::Math::checkBsmPosition(bsm.position, bsm.direction, rooms);
if (hitPos.state != BuildingControlUnit::VWM::HitPosition::State::OuterWall)
{
WARNING_LOG(m_logger) << "Effect on bsm " << bsm.id << " does not hit building ! - position: "
WARNING_LOG(logger) << "Effect on bsm " << bsm.id << " does not hit building ! - position: "
<< bsm.position << ", direction: " << bsm.direction;
}
else if (hitPos.distance < 0)
{
WARNING_LOG(m_logger) << "Effect on bsm " << bsm.id << " results in hit pos behind a wall ("
WARNING_LOG(logger) << "Effect on bsm " << bsm.id << " results in hit pos behind a wall ("
<< hitPos.distance << "m) instead in front - BSM is not modelled in the correct place: "
<< bsm.position << ", direction: " << bsm.direction << ", roomId which was hit: " << hitPos.roomId;
}
else
{
DEBUG_LOG(m_logger) << "BSM with id " << bsm.id << " looks fine - room which will be hit: " << hitPos.roomId;
DEBUG_LOG(logger) << "BSM with id " << bsm.id << " looks fine - room which will be hit: " << hitPos.roomId;
}
}
@@ -23,6 +23,4 @@ private Q_SLOTS:
void test4();
void test5();
void test6();
private:
NGL::INGLLogger &m_logger;
};
@@ -8,7 +8,8 @@
#include "vwm_state_store.h"
#include "vwm_math.h"
#include <QtCore/QDateTime>
#include <settings.h>
#include <QtCore/QMetaType>
#include <BuildingControlUnit/settings.h>
#include <QtCore/QFile>
#include <initializer_list>
#ifdef LTS_DEBUG
@@ -27,11 +28,23 @@ namespace BuildingControlUnit
{
namespace VWM
{
namespace
{
// Ensure QPoint3D meta-type is registered for queued connections
// Qt6: Q_DECLARE_METATYPE is sufficient, no need for qRegisterMetaTypeStreamOperators
static const bool point3dRegistered = []() {
return true;
}();
}
Api::Api(QObject *parent)
: QObject(parent)
, m_lastHitResult(HitResult())
, m_logger(BuildingControlUnit::getLogger("VWM.Api"))
{}
, m_logger(TrainingAreaBase::getLogger("VWM.Api"))
{
Q_UNUSED(point3dRegistered);
}
bool Api::init(const QString &chargesConfig,
const QString &vulBuildingConfig,
@@ -7,7 +7,7 @@
#include <QtCore/QSet>
#include <QtCore/QVector>
#include <QtCore/QLineF>
#include <settings.h>
#include <BuildingControlUnit/settings.h>
#include <algorithm>
@@ -17,7 +17,7 @@ namespace VWM
{
static NGL::INGLLogger &logger()
{
return BuildingControlUnit::getLogger("VWM.Building");
return TrainingAreaBase::getLogger("VWM.Building");
}
static inline bool isEffectNegligible(double effect)
@@ -259,7 +259,6 @@ double Room::calcRemainingEffect(double SG_alt, double ZF, double WF)
Building::Building()
: m_lastHitPosition(HitPosition())
, m_logger(BuildingControlUnit::getLogger("VWM.Building"))
{}
int Building::checkPolygons()
@@ -308,12 +307,12 @@ int Building::cleanupPolygons()
cleanupDublicatePointsInPolygon(room.id(), owIdx, elemIdx, "room", candidate);
if (candidate.size() < 4)
{
NOTICE_LOG(m_logger) << "wall was made planar: Building '" << m_name << "' -> "
NOTICE_LOG(logger()) << "wall was made planar: Building '" << m_name << "' -> "
<< " in room " << room.id() << " OuterWall[" << owIdx
<< "], element[" << elemIdx << "] "
<< " makePlanar and cleanupDublicatePointsInPolygon would generate short polygon, size=" << candidate.size();
for (auto point : std::as_const(candidate))
NOTICE_LOG(m_logger) << " point= " << point;
NOTICE_LOG(logger()) << " point= " << point;
bMakePlanarDone = false;
@@ -324,7 +323,7 @@ int Building::cleanupPolygons()
if (bMakePlanarDone)
NOTICE_LOG(m_logger) << "wall was made planar: Building '" << m_name << "' -> "
NOTICE_LOG(logger()) << "wall was made planar: Building '" << m_name << "' -> "
<< " in room " << room.id() << " OuterWall[" << owIdx
<< "], element[" << elemIdx << "] "
<< " smallestDim=" << (int)makePlanar.getSmallestDim()
@@ -354,7 +353,7 @@ int Building::cleanupDublicatePointsInPolygon(int roomId, int idx, int subIdx, c
auto p2 = points.at(j);
if (qFuzzyCompare(p1, p2))
{
DEBUG_LOG(m_logger) << "Building '" << m_name << "' -> "
DEBUG_LOG(logger()) << "Building '" << m_name << "' -> "
<< "Polygon point " << i << " (" << p1 << ") and " << j << " (" << p2
<< ") in room " << roomId << ", " << type << "[" << idx
<< "], element[" << subIdx << "] are the same! -> REMOVE";
@@ -410,7 +409,7 @@ QVector<HitRoom> Building::roomStates() const
hr.fortifyFactor = room.fortifyFactor();
hr.directHit = room.isDirectHit();
ret += hr;
DEBUG_LOG(m_logger) << "HitRoom " << hr.roomId
DEBUG_LOG(logger()) << "HitRoom " << hr.roomId
<< " damage: " << hr.damagePercent
<< "%, remainEffect: " << hr.remainingEffectPercent << "%"
<< ", remainingEffectChargeTypeId: " << hr.remainingEffectChargeTypeId << "%"
@@ -448,7 +447,7 @@ void Building::setRoomState(DamageState damageState, const QVector<int> &afffect
auto it = m_rooms.find(roomId);
if (it == m_rooms.end())
{
WARNING_LOG(m_logger) << "Could not find room with id " << roomId;
WARNING_LOG(logger()) << "Could not find room with id " << roomId;
continue;
}
if (damageState == DamageState::Destroyed)
@@ -465,7 +464,7 @@ void Building::setFortifyInfo(const QVector<FortifyInfo> &foritfyInfos)
auto it = m_rooms.find(info.roomId);
if (it == m_rooms.end())
{
WARNING_LOG(m_logger) << "Could not find room with id " << info.roomId;
WARNING_LOG(logger()) << "Could not find room with id " << info.roomId;
continue;
}
Room &room = it.value();
@@ -538,14 +537,14 @@ bool Building::hit(const LtsUtils::QPoint3D &pos, const LtsUtils::QPoint3D &dir,
const bool bBelowGround = isLastHitPositionBelowGroundHack();
if (bBelowGround)
{
INFO_LOG(m_logger) << " XXXX CES belowGround, reduce charge: " << charge;
INFO_LOG(logger()) << " XXXX CES belowGround, reduce charge: " << charge;
charge.destructiveFactor *= 0.25;
charge.penetrationEffect *= 0.25;
INFO_LOG(m_logger) << " XXXX CES belowGround, reduce charge: " << charge;
INFO_LOG(logger()) << " XXXX CES belowGround, reduce charge: " << charge;
}
INFO_LOG(m_logger) << "XXXXX HitPosition: state=" << m_lastHitPosition.state
INFO_LOG(logger()) << "XXXXX HitPosition: state=" << m_lastHitPosition.state
<< ", m_name=" << m_name
<< ", m_modelId=" << m_modelId
<< ", roomId=" << m_lastHitPosition.roomId
@@ -560,7 +559,7 @@ bool Building::hit(const LtsUtils::QPoint3D &pos, const LtsUtils::QPoint3D &dir,
Room &hitRoom = m_rooms[m_lastHitPosition.roomId];
if (!hitRoom.isValid())
{
ERROR_LOG(m_logger) << "Internal error in hit calculation - could not find room with id " << m_lastHitPosition.roomId;
ERROR_LOG(logger()) << "Internal error in hit calculation - could not find room with id " << m_lastHitPosition.roomId;
return false;
}
@@ -651,7 +650,7 @@ QMap<int, Building::NeighboursToCheck> Building::checkHitNeighbours(const QMap<i
auto itRoom = m_rooms.find(neighbourRoomId);
if (itRoom == m_rooms.end())
{
WARNING_LOG(m_logger) << "Could not find room with id " << neighbourRoomId;
WARNING_LOG(logger()) << "Could not find room with id " << neighbourRoomId;
continue;
}
@@ -670,7 +669,7 @@ QMap<int, Building::NeighboursToCheck> Building::checkHitNeighbours(const QMap<i
const double oldRe = neighbour.remainingEffect();
neighbour.setRemainingEffect(neighbourRoom.remainEffect * TF);
DEBUG_LOG(m_logger) << "room " << neighbourRoomId << " remaining effect old: "
DEBUG_LOG(logger()) << "room " << neighbourRoomId << " remaining effect old: "
<< oldRe << " -> new: " << neighbour.remainingEffect();
@@ -740,7 +739,7 @@ int Building::checkDublicatePointsInPolygon(int roomId, int idx, int subIdx, con
if (qFuzzyCompare(p1, p2))
{
++numberOfDuplicates;
WARNING_LOG(m_logger) << "Building '" << m_name << "' -> "
WARNING_LOG(logger()) << "Building '" << m_name << "' -> "
<< "Polygon point " << i << " (" << p1 << ") and " << j << " (" << p2
<< ") in room " << roomId << ", " << type << "[" << idx
<< "], element[" << subIdx << "] are the same! (size=" << points.size() << ")";
@@ -750,7 +749,7 @@ int Building::checkDublicatePointsInPolygon(int roomId, int idx, int subIdx, con
if (numberOfDuplicates > 0)
for (auto point : points)
WARNING_LOG(m_logger) << "Building '" << m_name << "' -> " << "point =" << point << " (same points)";
WARNING_LOG(logger()) << "Building '" << m_name << "' -> " << "point =" << point << " (same points)";
return numberOfDuplicates;
}
@@ -28,9 +28,6 @@ public:
double transitionFactor() const { return m_transitionFactor; }
private:
NGL::INGLLogger &m_logger;
int m_id = 0;
double m_transitionFactor = 0;
};
@@ -15,7 +15,7 @@ namespace VWM
{
BuildingRoomGeometry::BuildingRoomGeometry()
: m_logger(BuildingControlUnit::getLogger("VWM.BuildingRoomGeometry"))
: m_logger(TrainingAreaBase::getLogger("VWM.BuildingRoomGeometry"))
{
TRACE_LOG(m_logger) << Q_FUNC_INFO << " START";
TRACE_LOG(m_logger) << Q_FUNC_INFO << " END";
@@ -126,7 +126,7 @@ static inline LtsUtils::QPoint3D positionFromElement(const QDomElement &elem)
bool BuildingRoomGeometry::parse(const QDomElement &domGroup)
{
NGL::INGLLogger &loggerParse = BuildingControlUnit::getLogger("VWM.BuildingRoomGeometry.parse");
NGL::INGLLogger &loggerParse = TrainingAreaBase::getLogger("VWM.BuildingRoomGeometry.parse");
QDomElement domGroup1 = getChildElement(domGroup, QStringLiteral("Group"));
for ( ; !domGroup1.isNull(); domGroup1 = domGroup1.nextSiblingElement(domGroup1.tagName()))
@@ -22,7 +22,7 @@ namespace Math
static NGL::INGLLogger &logger()
{
return BuildingControlUnit::getLogger("VWM.Math");
return TrainingAreaBase::getLogger("VWM.Math");
}
LtsUtils::QPoint3D rotateAroundYAxis(const LtsUtils::QPoint3D &in, double phi)
@@ -20,7 +20,7 @@ namespace StateStore
{
static NGL::INGLLogger &logger()
{
return BuildingControlUnit::getLogger("VWM.StateStore");
return TrainingAreaBase::getLogger("VWM.StateStore");
}
static QJsonObject writeBuilding(const Building &building)
@@ -19,7 +19,7 @@ namespace XmlReader
static NGL::INGLLogger &logger()
{
return BuildingControlUnit::getLogger("XmlReader");
return TrainingAreaBase::getLogger("XmlReader");
}
static Charge parseCharge(const QDomElement &domCharge)