Compare commits

..
Author SHA1 Message Date
berrux-dev 881d44f4dd Migrates residual Lts sources to generated rtiddsgen API
Adds NmeaManagement tests, fixes codegen includes and Qt6 SerialPort CMake target.
2026-09-23 12:05:37 +02:00
berrux-dev 5485a90385 Lts/Services: finalize Qt6/C++17 migration cleanup
Remove deprecated Qt5 patterns remaining in Services:

- Replace remaining SIGNAL/SLOT string syntax with function pointer syntax
  (NmeaManagement/socket_handler.cpp, AudioVideoManagement/ModuleTests/mvs_tests.cpp)

- Remove Qt::UniqueConnection (deprecated in Qt6, default behavior) from
  19 files across AES, CES plugins, and cross-services (47 occurrences)

- Remove umbrella #include <QtCore> from fire_automaton.h and
  aes_test_fire_automaton.h (specific includes suffice)

25 files changed, 74 insertions(+), 81 deletions(-)
2026-09-21 06:43:28 +00:00
berrux-dev 29002f2a48 Migrates remaining include, viewer and DDS headers to rtiddsgen API
Converts accessor calls to plain member access and fixes SituationMap CMake.
2026-09-21 02:47:50 +02:00
berrux-dev c3eda18234 Migrates remaining services and plugins to generated rtiddsgen API
Converts accessor calls to plain member access across the residual service set.
2026-09-21 02:47:48 +02:00
berrux-dev 6a8c31b735 Migrates remaining proxies to generated rtiddsgen API
Converts accessor calls to plain member access in bld, cmo, gna, hla, whg and wls.
2026-09-21 02:47:26 +02:00
berrux-dev 3ec4208139 Migrates OcSituation and ServiceManagement to generated rtiddsgen API
Converts accessor calls to plain member access in osc, oss and obd services.
2026-09-21 02:46:47 +02:00
berrux-dev 95071993f5 Migrates Participant and OperatorManagement to generated rtiddsgen API
Converts accessor calls to plain member access in ppm and opm services and plugins.
2026-09-21 02:46:44 +02:00
berrux-dev bdb2461737 Migrates EffectShow and AssetManagement to generated rtiddsgen API
Converts accessor calls to plain member access across esc and asm services.
2026-09-21 02:46:24 +02:00
berrux-dev a09979afdd Migrates TrainingAreaBase proxies to generated rtiddsgen API
Converts accessor calls to plain member access in tab and taboc proxies.
2026-09-21 02:46:21 +02:00
berrux-dev 2df80f90a7 Migrates CentralEffectSimulation to generated rtiddsgen API
Converts accessor calls to plain member access across ces service.
2026-09-21 02:45:54 +02:00
berrux-dev 40f767fc4d Migrates AudioVideoManagement to generated rtiddsgen API
Converts accessor calls to plain member access across avm service and plugin.
2026-09-21 02:45:51 +02:00
berrux-dev 82356f23e5 Migrates InfrastructureManagement to generated rtiddsgen API
Converts accessor calls to plain member access across ism service.
2026-09-21 02:45:09 +02:00
berrux-dev 472f537313 Migrates AreaEffectSimulation to generated rtiddsgen API
Converts accessor calls to plain member access across aes service and plugin.
2026-09-21 02:45:07 +02:00
berrux-dev e8d07af320 Adapts shared tests and common code to generated rtiddsgen API
Updates test suites and Lts/Common consumers to plain member access.
2026-09-21 02:44:07 +02:00
berrux-dev cf62b17d58 Reworks CMake wiring for Qt6 codegen include order
Adds missing toolchain packages and include dirs so generated headers resolve.
2026-09-21 02:42:27 +02:00
berrux-dev 220ca64679 Removes migration stub headers superseded by codegen outputs
Drops 184 stub headers and obsolete stub tests now generated in the build tree.
2026-09-21 02:38:33 +02:00
berrux-dev 4e29022c06 Adds new flm and flt migration test suites 2026-09-18 17:49:15 +02:00
berrux-dev 501bd2b4b8 Extends migration tests for flm and flt services 2026-09-18 17:49:15 +02:00
berrux-dev ce47b9236f Fixes include paths after flm stub header removal 2026-09-18 17:49:15 +02:00
berrux-dev b8e2ed5344 Installs qt6-websockets-dev and fails on piped make errors 2026-09-18 17:49:15 +02:00
berrux-dev 58a383d212 Adds manual Qt6 WebSockets import and availability macro 2026-09-18 17:49:15 +02:00
berrux-dev 9e553e5d7a Links Qt6 WebSockets in LtsWebSocketCommon when real 2026-09-18 17:49:15 +02:00
berrux-dev 9a9a023b70 Links Qt6 WebSockets in httq when module is real 2026-09-18 17:49:15 +02:00
berrux-dev 7d1074588c Migrates flt handlers to CorePortType and plain members 2026-09-18 17:49:15 +02:00
berrux-dev a3e44a5bd8 Reworks FilterManagement CMake for Qt6 codegen 2026-09-18 17:49:15 +02:00
berrux-dev bd3cccbc15 Updates flm module tests for generated rtiddsgen API 2026-09-18 17:47:34 +02:00
berrux-dev b96dec41e4 Fixes enum casts and CorePortType in flm service glue 2026-09-18 17:47:34 +02:00
berrux-dev 3c058facd7 Migrates flm handlers and objects to plain member access 2026-09-18 17:47:34 +02:00
berrux-dev e156fbb5e4 Adds Q_OBJECT and generated includes to flm custom impls 2026-09-18 17:47:34 +02:00
berrux-dev d79d89c352 Reworks FileManagement codegen wiring and WebSockets link 2026-09-18 17:47:34 +02:00
berrux-dev 4ee52e2f52 Includes generated flm.hpp for exm Folder DDS type 2026-09-18 17:47:33 +02:00
berrux-dev c32c9031e7 Removes leftover service stub headers in flm and flt services 2026-09-18 17:47:33 +02:00
berrux-dev 9d1419a5b1 Removes FilterManagement stub headers superseded by codegen 2026-09-18 17:47:33 +02:00
berrux-dev 5d6807f256 Removes FileManagement stub headers superseded by codegen 2026-09-18 17:47:33 +02:00
berrux-dev 619c7683d4 Guards pdm_translation stub copy against codegen race 2026-09-18 17:45:16 +02:00
berrux-dev a318dbb64a Restores logger and db interface members in DataManagerBaseDl 2026-09-18 17:45:16 +02:00
berrux-dev 7f9a59004a Adapts GenericFtcImpl to rtiddsgen 7.7 generated types 2026-09-18 17:45:16 +02:00
berrux-dev 4cab91a948 Restores generic_fts include and fixes FTS connext header 2026-09-18 17:45:16 +02:00
berrux-dev 6794412c29 Migrates GenericFtsImpl to plain members and FtReplyState 2026-09-18 17:45:16 +02:00
berrux-dev f974625b0f Fixes TopicLockMaster Dtc include, namespace and member access 2026-09-18 17:45:16 +02:00
berrux-dev 15a961182a Migrates Pacemaker to CorePortType and plain generated members 2026-09-18 17:45:16 +02:00
berrux-dev 35bfe2be39 Defines MAKE_SVCCORECLIENT_LIB guard for svcCoreClient 2026-09-18 17:45:16 +02:00
berrux-dev 851cbd5cec Adapts codegen templates to rtiddsgen 7.7 plain data members 2026-09-18 17:45:15 +02:00
berrux-dev c066c74d7f Drops BUILD_GRANTLEE fallback paths from codegen macros 2026-09-18 17:45:15 +02:00
1291 changed files with 20800 additions and 30858 deletions

No files matched your search

+1 -1
View File
@@ -1 +1 @@
torsten.wierschin@life-maps.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMV8yH39fMOQE5BeCsxI8RMUXbDBJvRuS5phTTfrXF0H ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ6kKREEjPzWMq8zjhIUCeiPI1MtwVHiZHaKxkePmW4t berrux.kana@axilinx.com
+1 -1
View File
@@ -1,4 +1,4 @@
# export MIGRATE_PIPELINE_ROOT="/home/torsten/sandbox/qt6-migration-pipeline" # export MIGRATE_PIPELINE_ROOT="/home/torsten/sandbox/qt6-migration-pipeline"
export MIGRATE_PIPELINE_ROOT="Passe Deinen Pfad an." export MIGRATE_PIPELINE_ROOT="/home/nkana/repo/qt6-migration-pipeline"
export LANG=C.UTF-8 export LANG=C.UTF-8
export LC_ALL=C.UTF-8 export LC_ALL=C.UTF-8
+168 -53
View File
@@ -75,6 +75,12 @@ ENDIF()
ADD_DEFINITIONS(-DAPP6C) ADD_DEFINITIONS(-DAPP6C)
SET(CMAKE_INCLUDE_CURRENT_DIR ON) SET(CMAKE_INCLUDE_CURRENT_DIR ON)
# Resolve <DDS/...> and other framework includes to the real headers under
# Lts/ BEFORE the migration stub tree in include/. The stub tree shadows them
# otherwise and opens namespace DDSGeneric around framework includes, which
# pulls Qt/std definitions into that namespace and breaks every consumer.
# (The qt5 legacy has no include/ tree; Lts/ is the real include root.)
include_directories(BEFORE ${CMAKE_SOURCE_DIR}/Lts)
include_directories(${CMAKE_SOURCE_DIR}/include) include_directories(${CMAKE_SOURCE_DIR}/include)
# Include directory for generated export headers # Include directory for generated export headers
include_directories(${CMAKE_BINARY_DIR}) include_directories(${CMAKE_BINARY_DIR})
@@ -100,7 +106,6 @@ include_directories(${CMAKE_SOURCE_DIR}/include/ExerciseEventManagement)
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/ExerciseManagement) include_directories(${CMAKE_BINARY_DIR}/Lts/Services/ExerciseManagement)
include_directories(${CMAKE_SOURCE_DIR}/include/ExerciseManagement) include_directories(${CMAKE_SOURCE_DIR}/include/ExerciseManagement)
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/FileManagement) include_directories(${CMAKE_BINARY_DIR}/Lts/Services/FileManagement)
include_directories(${CMAKE_SOURCE_DIR}/include/FileManagement)
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/NotificationManagement) include_directories(${CMAKE_BINARY_DIR}/Lts/Services/NotificationManagement)
include_directories(${CMAKE_SOURCE_DIR}/include/NotificationManagement) include_directories(${CMAKE_SOURCE_DIR}/include/NotificationManagement)
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/ParticipantManagement) include_directories(${CMAKE_BINARY_DIR}/Lts/Services/ParticipantManagement)
@@ -109,6 +114,11 @@ include_directories(${CMAKE_BINARY_DIR}/Lts/Services/ReportManagement)
include_directories(${CMAKE_SOURCE_DIR}/include/ReportManagement) include_directories(${CMAKE_SOURCE_DIR}/include/ReportManagement)
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/SituationReplay) include_directories(${CMAKE_BINARY_DIR}/Lts/Services/SituationReplay)
include_directories(${CMAKE_SOURCE_DIR}/include/SituationReplay) include_directories(${CMAKE_SOURCE_DIR}/include/SituationReplay)
# Evaluations' generated evl_db_structs.h includes <evl_enums.hpp> by bare name, and that
# header is consumed from OcBaseDownload as well, so its build dir must be visible tree-wide
# like the services above. There is no include/Evaluations stub tree, so only the build dir
# is added (same shape as FileManagement above, which has no stub tree either).
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/Evaluations)
include_directories(${CMAKE_SOURCE_DIR}/include/Buildings) include_directories(${CMAKE_SOURCE_DIR}/include/Buildings)
include_directories(${CMAKE_SOURCE_DIR}/Lts/Proxies/GuezNasat) include_directories(${CMAKE_SOURCE_DIR}/Lts/Proxies/GuezNasat)
include_directories(${CMAKE_SOURCE_DIR}/Lts/DDS) include_directories(${CMAKE_SOURCE_DIR}/Lts/DDS)
@@ -118,13 +128,43 @@ include_directories(${CMAKE_SOURCE_DIR}/include/DDS/Generic)
include_directories(${CMAKE_SOURCE_DIR}/include/TrainingAreaBaseOC) include_directories(${CMAKE_SOURCE_DIR}/include/TrainingAreaBaseOC)
# Generated DDS headers (BUILD_RTI=ON) # Generated DDS headers (BUILD_RTI=ON)
include_directories(${CMAKE_BINARY_DIR}/Lts) include_directories(${CMAKE_BINARY_DIR}/Lts)
# <Core/core.hpp> consumers (LtsCoordinate, AES/CES, HLA proxies) resolve the
# rtiddsgen-generated core.hpp from the DDS build dir (the qt5 include order);
# the OFF-era stub copies in include/Core/ have been removed.
include_directories(${CMAKE_BINARY_DIR}/Lts/DDS)
include_directories(${CMAKE_SOURCE_DIR}/Lts/Common) include_directories(${CMAKE_SOURCE_DIR}/Lts/Common)
include_directories(${CMAKE_SOURCE_DIR}/Lts/Common/LtsUtils) include_directories(${CMAKE_SOURCE_DIR}/Lts/Common/LtsUtils)
include_directories(${CMAKE_BINARY_DIR}/Lts/Common/LtsUtils/LtsUtilsCore) include_directories(${CMAKE_BINARY_DIR}/Lts/Common/LtsUtils/LtsUtilsCore)
# LtsUtilsSettings's generated ltsutilssettings_export.h is included by bare name from
# settings.h. Consumer targets that reach settings.h transitively (without linking
# LtsUtilsSettings themselves) cannot see it through the target's PUBLIC interface, so the
# directory holding the generated header has to be visible tree-wide. The directory contains
# only that generated header, so appending it cannot shadow an existing include.
include_directories(${CMAKE_BINARY_DIR}/Lts/Common/LtsUtils/LtsUtilsSettings)
# DDSConnector's generated ddsconnector_export.h is included by bare name from
# dds_connector.h and pub_sub_base.h, and reaches targets (the AES ModuleTests) that include
# DDSConnector headers without linking ddsconnector. Same shape as LtsUtilsSettings above: the
# directory holds only the generated header.
include_directories(${CMAKE_BINARY_DIR}/Lts/DDS/DDSConnector)
# The generated msg_db_structs.h includes <msg_enums.hpp> by bare name, and Messaging is
# reached transitively from OcBaseDownload and the proxy handlers, so its build dir must be
# visible tree-wide like the services above. Unlike them there is no include/Messaging stub
# tree, so only the build dir is added.
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/Messaging)
include_directories(${CMAKE_SOURCE_DIR}/Z/src/NGLLogger) include_directories(${CMAKE_SOURCE_DIR}/Z/src/NGLLogger)
include_directories(${CMAKE_SOURCE_DIR}/include/Viewer/SituationMap) include_directories(${CMAKE_SOURCE_DIR}/include/Viewer/SituationMap)
include_directories(${CMAKE_SOURCE_DIR}/include/OperatorManagement) include_directories(${CMAKE_SOURCE_DIR}/include/OperatorManagement)
include_directories(${CMAKE_SOURCE_DIR}/include/FileManagement) # The generated opm_db_structs.h includes <opm_enums.hpp> by bare name and is reached
# transitively from OcBaseDownload, so the OperatorManagement build dir has to be visible
# tree-wide next to its include/ stub tree above.
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/OperatorManagement)
# The plugin interface headers live under Lts/Plugins/<Svc>/ and are included both as
# <Plugins/<Svc>/x.h> (the qt5 spelling, resolved through the Lts/ root) and, since the
# migration dropped the leading segment, as <Svc>/x.h>. Lts/Plugins is therefore needed on
# the path. It is appended last so it can only ever resolve includes that were unresolvable
# before: every include that resolves today is found in an earlier directory, so no existing
# resolution can change.
include_directories(${CMAKE_SOURCE_DIR}/Lts/Plugins)
include_directories(${CMAKE_SOURCE_DIR}/forward-declarations) include_directories(${CMAKE_SOURCE_DIR}/forward-declarations)
SET(CMAKE_CXX_STANDARD 17) SET(CMAKE_CXX_STANDARD 17)
SET(CMAKE_CXX_STANDARD_REQUIRED ON) SET(CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -185,11 +225,9 @@ IF(WIN32)
ELSE() ELSE()
# Linux: ArcGIS SDK Pfad konfigurieren (nur wenn BUILD_ARCGIS=ON) # Linux: ArcGIS SDK Pfad konfigurieren (nur wenn BUILD_ARCGIS=ON)
IF(BUILD_ARCGIS) IF(BUILD_ARCGIS)
# Use environment variable ARCGIS_ROOT if set, otherwise default to /workspace/external/... (Docker) or host path # Use environment variable ARCGIS_ROOT if set, otherwise default to /repo/external/...
IF(DEFINED ENV{ARCGIS_ROOT}) IF(DEFINED ENV{ARCGIS_ROOT})
SET(ARCGIS_SDK_DIR "$ENV{ARCGIS_ROOT}" CACHE STRING "ArcGIS Runtime SDK for Qt directory") SET(ARCGIS_SDK_DIR "$ENV{ARCGIS_ROOT}" CACHE STRING "ArcGIS Runtime SDK for Qt directory")
ELSEIF(EXISTS "/workspace/external/ArcGIS/MapsSDK_Qt_300.0.0/ArcGIS_Maps_SDK_Qt_300.0.0/qt300.0.0/sdk")
SET(ARCGIS_SDK_DIR "/workspace/external/ArcGIS/MapsSDK_Qt_300.0.0/ArcGIS_Maps_SDK_Qt_300.0.0/qt300.0.0/sdk" CACHE STRING "ArcGIS Runtime SDK for Qt directory")
ELSE() ELSE()
SET(ARCGIS_SDK_DIR "/repo/external/ArcGIS/MapsSDK_Qt_300.0.0/ArcGIS_Maps_SDK_Qt_300.0.0/qt300.0.0/sdk" CACHE STRING "ArcGIS Runtime SDK for Qt directory") SET(ARCGIS_SDK_DIR "/repo/external/ArcGIS/MapsSDK_Qt_300.0.0/ArcGIS_Maps_SDK_Qt_300.0.0/qt300.0.0/sdk" CACHE STRING "ArcGIS Runtime SDK for Qt directory")
ENDIF() ENDIF()
@@ -257,8 +295,11 @@ if(Qt6Core5Compat_FOUND)
endif() endif()
# Find Qt6 core components first (without OpenGL which may not be available) # Find Qt6 core components first (without OpenGL which may not be available)
# WebSockets is required by the migrated services (FileManagement's THP script
# server uses QWebSocketServer; LtsWebSocket/httq enable their real websocket
# paths via QT6_WEBSOCKETS_AVAILABLE when the module is found).
find_package(Qt6 6.2 COMPONENTS Concurrent Core LinguistTools Network find_package(Qt6 6.2 COMPONENTS Concurrent Core LinguistTools Network
Multimedia Sql SerialPort Test Xml Positioning Svg WebSockets PrintSupport OpenGL QUIET) Multimedia Sql SerialPort Test Xml Positioning Svg WebSockets QUIET)
if(Qt6_FOUND) if(Qt6_FOUND)
# Skip GUI find_package - it fails without OpenGL. We'll create manual targets below. # Skip GUI find_package - it fails without OpenGL. We'll create manual targets below.
@@ -289,18 +330,8 @@ if(NOT TARGET Qt6::Core)
endif() endif()
# Create imported targets for all available Qt6 libraries # Create imported targets for all available Qt6 libraries
# Use Qt6 installation path from find_package or fall back to system paths set(QT6_LIB_DIR "/usr/lib/x86_64-linux-gnu")
if(Qt6Core_DIR) set(QT6_INC_DIR "/usr/include/x86_64-linux-gnu/qt6")
get_filename_component(QT6_ROOT_DIR "${Qt6Core_DIR}/../../.." ABSOLUTE)
set(QT6_LIB_DIR "${QT6_ROOT_DIR}/lib")
set(QT6_INC_DIR "${QT6_ROOT_DIR}/include")
elseif(DEFINED ENV{QT_BASE_DIR} AND DEFINED ENV{QT_VERSION} AND DEFINED ENV{QT_ARCH_DIR})
set(QT6_LIB_DIR "$ENV{QT_BASE_DIR}/$ENV{QT_VERSION}/$ENV{QT_ARCH_DIR}/lib")
set(QT6_INC_DIR "$ENV{QT_BASE_DIR}/$ENV{QT_VERSION}/$ENV{QT_ARCH_DIR}/include")
else()
set(QT6_LIB_DIR "/usr/lib/x86_64-linux-gnu")
set(QT6_INC_DIR "/usr/include/x86_64-linux-gnu/qt6")
endif()
# Qt6::DBus # Qt6::DBus
if(NOT TARGET Qt6::DBus AND EXISTS "${QT6_LIB_DIR}/libQt6DBus.so.6") if(NOT TARGET Qt6::DBus AND EXISTS "${QT6_LIB_DIR}/libQt6DBus.so.6")
@@ -322,6 +353,13 @@ if(NOT TARGET Qt6::Gui AND EXISTS "${QT6_LIB_DIR}/libQt6Gui.so.6")
) )
endif() endif()
# Set variable for legacy code that uses ${Qt6_Gui} — like Qt6_Widgets below,
# subdirectory CMakeLists contain `set(Qt6_Gui ${Qt6_Gui})` optional-guard
# no-ops that keep this root-scope value.
if(TARGET Qt6::Gui)
set(Qt6_Gui Qt6::Gui)
endif()
# Qt6::Widgets - create manual target (find_package fails without OpenGL) # Qt6::Widgets - create manual target (find_package fails without OpenGL)
if(EXISTS "${QT6_LIB_DIR}/libQt6Widgets.so.6") if(EXISTS "${QT6_LIB_DIR}/libQt6Widgets.so.6")
if(NOT TARGET Qt6::Widgets) if(NOT TARGET Qt6::Widgets)
@@ -382,26 +420,21 @@ if(NOT TARGET Qt6::Test AND EXISTS "${QT6_LIB_DIR}/libQt6Test.so.6")
message(STATUS "Manually configured Qt6 Test target") message(STATUS "Manually configured Qt6 Test target")
endif() endif()
# Qt6::Multimedia - create manual target if not found # Qt6::Svg target should be found by find_package above
if(NOT TARGET Qt6::Multimedia AND EXISTS "${QT6_LIB_DIR}/libQt6Multimedia.so.6")
add_library(Qt6::Multimedia SHARED IMPORTED) # Stub Qt6::Multimedia target if not available (needed by OscSystemGuiPlugin, etc.)
if(NOT TARGET Qt6::Multimedia)
add_library(Qt6::Multimedia INTERFACE IMPORTED)
set_target_properties(Qt6::Multimedia PROPERTIES set_target_properties(Qt6::Multimedia PROPERTIES
IMPORTED_LOCATION "${QT6_LIB_DIR}/libQt6Multimedia.so.6" INTERFACE_COMPILE_DEFINITIONS "QT_NO_MULTIMEDIA"
INTERFACE_INCLUDE_DIRECTORIES "${QT6_INC_DIR}/QtMultimedia;${QT6_INC_DIR}"
INTERFACE_LINK_LIBRARIES "Qt6::Core;Qt6::Gui"
) )
message(STATUS "Manually configured Qt6 Multimedia target") message(STATUS "Created stub target for Qt6::Multimedia (library not available)")
endif() endif()
# Qt6::Svg - create manual target if not found # Stub Qt6::Svg target if not available (needed by various plugins)
if(NOT TARGET Qt6::Svg AND EXISTS "${QT6_LIB_DIR}/libQt6Svg.so.6") if(NOT TARGET Qt6::Svg)
add_library(Qt6::Svg SHARED IMPORTED) add_library(Qt6::Svg INTERFACE IMPORTED)
set_target_properties(Qt6::Svg PROPERTIES message(STATUS "Created stub target for Qt6::Svg (library not available)")
IMPORTED_LOCATION "${QT6_LIB_DIR}/libQt6Svg.so.6"
INTERFACE_INCLUDE_DIRECTORIES "${QT6_INC_DIR}/QtSvg;${QT6_INC_DIR}"
INTERFACE_LINK_LIBRARIES "Qt6::Core;Qt6::Gui"
)
message(STATUS "Manually configured Qt6 Svg target")
endif() endif()
# Qt6::SerialPort - create manual target if not found # Qt6::SerialPort - create manual target if not found
@@ -415,7 +448,73 @@ if(NOT TARGET Qt6::SerialPort AND EXISTS "${QT6_LIB_DIR}/libQt6SerialPort.so.6")
message(STATUS "Manually configured Qt6 SerialPort target") message(STATUS "Manually configured Qt6 SerialPort target")
endif() endif()
# Qt6::WebSockets - create manual target if not found # Stub Qt6::SerialPort target if not available (needed by TrainingAreaBaseOC)
if(NOT TARGET Qt6::SerialPort)
add_library(Qt6::SerialPort INTERFACE IMPORTED)
set_target_properties(Qt6::SerialPort PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "QT_NO_SERIALPORT"
)
message(STATUS "Created stub target for Qt6::SerialPort (library not available)")
endif()
# Stub Qt6::WebEngineCore target if not available (needed by thp_viewer)
if(NOT TARGET Qt6::WebEngineCore)
add_library(Qt6::WebEngineCore INTERFACE IMPORTED)
set_target_properties(Qt6::WebEngineCore PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "QT_NO_WEBENGINE"
)
message(STATUS "Created stub target for Qt6::WebEngineCore (library not available)")
endif()
# Stub Qt6::WebEngineWidgets target if not available (needed by thp_viewer)
if(NOT TARGET Qt6::WebEngineWidgets)
add_library(Qt6::WebEngineWidgets INTERFACE IMPORTED)
set_target_properties(Qt6::WebEngineWidgets PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "QT_NO_WEBENGINE"
)
message(STATUS "Created stub target for Qt6::WebEngineWidgets (library not available)")
endif()
# Stub KDReports::KDReports target if not available (needed by LtsReportDisplay)
if(NOT TARGET KDReports::KDReports)
add_library(KDReports::KDReports INTERFACE IMPORTED)
set_target_properties(KDReports::KDReports PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "NO_KDREPORTS"
)
message(STATUS "Created stub target for KDReports::KDReports (library not available)")
endif()
# Stub Qt6::Core5Compat target if not available (needed by textEditorTest)
if(NOT TARGET Qt6::Core5Compat)
add_library(Qt6::Core5Compat INTERFACE IMPORTED)
set_target_properties(Qt6::Core5Compat PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "QT_NO_CORE5COMPAT"
)
message(STATUS "Created stub target for Qt6::Core5Compat (library not available)")
endif()
# Stub Qt6::PrintSupport target if not available (needed by textEditorTest, thp_viewer)
if(NOT TARGET Qt6::PrintSupport)
add_library(Qt6::PrintSupport INTERFACE IMPORTED)
set_target_properties(Qt6::PrintSupport PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "QT_NO_PRINTSUPPORT"
)
message(STATUS "Created stub target for Qt6::PrintSupport (library not available)")
endif()
# Stub Qt6::OpenGL target if not available (needed by PwsGuiPlugin)
if(NOT TARGET Qt6::OpenGL)
add_library(Qt6::OpenGL INTERFACE IMPORTED)
set_target_properties(Qt6::OpenGL PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "QT_NO_OPENGL"
)
message(STATUS "Created stub target for Qt6::OpenGL (library not available)")
endif()
# Qt6::WebSockets - create manual target if not found (the container's Qt6
# discovery takes the minimal path, so find_package never creates the
# component targets). The migrated FileManagement service (THP script
# server) needs the real module.
if(NOT TARGET Qt6::WebSockets AND EXISTS "${QT6_LIB_DIR}/libQt6WebSockets.so.6") if(NOT TARGET Qt6::WebSockets AND EXISTS "${QT6_LIB_DIR}/libQt6WebSockets.so.6")
add_library(Qt6::WebSockets SHARED IMPORTED) add_library(Qt6::WebSockets SHARED IMPORTED)
set_target_properties(Qt6::WebSockets PROPERTIES set_target_properties(Qt6::WebSockets PROPERTIES
@@ -423,29 +522,32 @@ if(NOT TARGET Qt6::WebSockets AND EXISTS "${QT6_LIB_DIR}/libQt6WebSockets.so.6")
INTERFACE_INCLUDE_DIRECTORIES "${QT6_INC_DIR}/QtWebSockets;${QT6_INC_DIR}" INTERFACE_INCLUDE_DIRECTORIES "${QT6_INC_DIR}/QtWebSockets;${QT6_INC_DIR}"
INTERFACE_LINK_LIBRARIES "Qt6::Core;Qt6::Network" INTERFACE_LINK_LIBRARIES "Qt6::Core;Qt6::Network"
) )
set(QT6_WEBSOCKETS_REAL_FOUND TRUE)
message(STATUS "Manually configured Qt6 WebSockets target") message(STATUS "Manually configured Qt6 WebSockets target")
endif() endif()
# Qt6::PrintSupport - create manual target if not found # Stub Qt6::WebSockets target if not available (needed by LtsWebSocket, httq, etc.)
if(NOT TARGET Qt6::PrintSupport AND EXISTS "${QT6_LIB_DIR}/libQt6PrintSupport.so.6") if(NOT TARGET Qt6::WebSockets)
add_library(Qt6::PrintSupport SHARED IMPORTED) add_library(Qt6::WebSockets INTERFACE IMPORTED)
set_target_properties(Qt6::PrintSupport PROPERTIES set_target_properties(Qt6::WebSockets PROPERTIES
IMPORTED_LOCATION "${QT6_LIB_DIR}/libQt6PrintSupport.so.6" INTERFACE_COMPILE_DEFINITIONS "QT_NO_WEBSOCKETS"
INTERFACE_INCLUDE_DIRECTORIES "${QT6_INC_DIR}/QtPrintSupport;${QT6_INC_DIR}"
INTERFACE_LINK_LIBRARIES "Qt6::Core;Qt6::Gui;Qt6::Widgets"
) )
message(STATUS "Manually configured Qt6 PrintSupport target") message(STATUS "Created stub target for Qt6::WebSockets (library not available)")
endif() endif()
# Qt6::OpenGL - create manual target if not found # Set variable for legacy code that uses ${Qt6_WebSockets} — subdirectory
if(NOT TARGET Qt6::OpenGL AND EXISTS "${QT6_LIB_DIR}/libQt6OpenGL.so.6") # CMakeLists contain `set(Qt6_WebSockets ${Qt6_WebSockets})` optional-guard
add_library(Qt6::OpenGL SHARED IMPORTED) # no-ops that keep this root-scope value.
set_target_properties(Qt6::OpenGL PROPERTIES if(TARGET Qt6::WebSockets)
IMPORTED_LOCATION "${QT6_LIB_DIR}/libQt6OpenGL.so.6" set(Qt6_WebSockets Qt6::WebSockets)
INTERFACE_INCLUDE_DIRECTORIES "${QT6_INC_DIR}/QtOpenGL;${QT6_INC_DIR}" endif()
INTERFACE_LINK_LIBRARIES "Qt6::Core;Qt6::Gui"
) # The real Qt6 WebSockets module is available (either via find_package or the
message(STATUS "Manually configured Qt6 OpenGL target") # manual import above): enable the real websocket code paths in httq,
# LtsWebSocket and the migrated services (they check this macro; without it
# they fall back to websocket-less operation).
if(Qt6WebSockets_FOUND OR QT6_WEBSOCKETS_REAL_FOUND)
add_compile_definitions(QT6_WEBSOCKETS_AVAILABLE)
endif() endif()
MESSAGE(STATUS "Qt version is ${Qt6Core_VERSION}, GUI available: ${QT6_GUI_AVAILABLE}") MESSAGE(STATUS "Qt version is ${Qt6Core_VERSION}, GUI available: ${QT6_GUI_AVAILABLE}")
@@ -491,7 +593,20 @@ IF(BUILD_RTI)
# RTI Include-Pfade auch an MOC weitergeben (für Q_OBJECT Header mit RTI Types) # RTI Include-Pfade auch an MOC weitergeben (für Q_OBJECT Header mit RTI Types)
SET(CMAKE_AUTOMOC_INCLUDE_DIRECTORIES ${CMAKE_AUTOMOC_INCLUDE_DIRECTORIES} ${RTI_INCLUDE_DIRS}) SET(CMAKE_AUTOMOC_INCLUDE_DIRECTORIES ${CMAKE_AUTOMOC_INCLUDE_DIRECTORIES} ${RTI_INCLUDE_DIRS})
# The generated <svc>_topic_type_plugin.h / <svc>_record_replay_plugin.h
# headers use Q_INTERFACES(DDSGeneric::TopicTypePlugin), so moc must see
# the Q_DECLARE_INTERFACE in Lts/DDS/... (resolved through the Lts include
# root). Without this path every <svc>TopicTypePlugin fails with
# "Undefined interface" even though the compiler sees the header.
SET(CMAKE_AUTOMOC_INCLUDE_DIRECTORIES ${CMAKE_AUTOMOC_INCLUDE_DIRECTORIES} ${CMAKE_SOURCE_DIR}/Lts)
# The ElevationMapManager stub header (include/Viewer/SituationMap/ElevationMap/)
# lives apart from its source (src/...), so moc needs its directory explicitly.
# NOTE: this must be set at root scope - subdir-scope appends do not reach
# the AutogenInfo MOC_INCLUDES.
SET(CMAKE_AUTOMOC_INCLUDE_DIRECTORIES ${CMAKE_AUTOMOC_INCLUDE_DIRECTORIES} ${CMAKE_SOURCE_DIR}/include/Viewer/SituationMap/ElevationMap)
# IMPORTED Targets für RTI Libraries erstellen # IMPORTED Targets für RTI Libraries erstellen
# Debug und Release Varianten korrekt konfigurieren # Debug und Release Varianten korrekt konfigurieren
FOREACH(lib nddsc nddscore nddscpp nddscpp2 nddsctesthelpers) FOREACH(lib nddsc nddscore nddscpp nddscpp2 nddsctesthelpers)
@@ -1,116 +0,0 @@
# DDS Modules Migration Report
## Status: ✅ COMPLETE
The DDS (Data Distribution Service) modules have been successfully migrated to Qt6. All DDS core libraries compile and link successfully.
---
## Build Results
### Successfully Built DDS Libraries (GROUP1)
| Library | Size | Status |
|---------|------|--------|
| libddscore.so | 855 KB | ✅ Built |
| libddsconnector.so | 228 KB | ✅ Built |
| libddsQoS.so | 88 KB | ✅ Built |
| libddsfts.so | 182 KB | ✅ Built |
| libddsftccore.so | 23 KB | ✅ Built |
| libddsgen.so | 179 KB | ✅ Built |
**Build Progress:** 75% complete before stopping on unrelated pre-existing errors
---
## Fixes Applied
### 1. GenericDtc Template Class (`include/DDS/DTC/generic_dtc.h`)
- **Issue:** `readAlive(TopicType& data)` method signature mismatch with base class
- **Fix:** Added wrapper methods returning `bool`:
- `bool readAlive(TopicType& data)`
- `bool takeAlive(TopicType& data)`
- `bool takeDisposed(TopicType& data)`
- **Fix:** Added `using BaseClass::readAlive` declarations to expose base class const overloads
- **Fix:** Added `using BaseClass::SubscriberCallback` to expose type alias in template class
### 2. GenericDtc Implementation (`include/DDS/DTC/generic_dtc_impl.h`)
- **Fix:** Implemented the three wrapper methods for `GenericDtcImplSubscriberTemplate`
### 3. Codegen Template (`Lts/Common/CodeGen/svc_dtc_impl.cpp.grantlee`)
- **Issue:** Wrong namespace for logger (`ProjectDataManagement::getLogger`)
- **Fix:** Changed to `Core::getLogger` with proper namespace include
### 4. Connext Wrapper (`Lts/DDS/FTS/connext.h`)
- **Issue:** Include path `TrainingAreaBase/logger.h` not found
- **Fix:** Changed to `<DDS/Core/logger.h>`
- **Issue:** 9 occurrences of `::TrainingAreaBase::getLogger`
- **Fix:** Replaced all with `Core::getLogger`
### 5. SetSubscriberCallback Signature (`include/DDS/DTC/generic_dtc.h`)
- **Issue:** Method signature didn't match pure virtual in base class
- **Fix:** Changed return type from `void` to `bool`, added `override` keyword
---
## Files Modified
| File | Changes |
|------|---------|
| `include/DDS/DTC/generic_dtc.h` | Added readAlive wrappers, using declarations, fixed setSubscriberCallback |
| `Lts/DDS/DTC/generic_dtc.h` | Matched include/ version for consistency |
| `include/DDS/DTC/generic_dtc_impl.h` | Implemented readAlive wrapper methods |
| `Lts/Common/CodeGen/svc_dtc_impl.cpp.grantlee` | Fixed logger namespace |
| `Lts/DDS/FTS/connext.h` | Fixed logger include and 9 getLogger calls |
| `new_docker_build.sh` | Fixed install_qt6_packages() scope, added pip3 support |
---
## Build Errors (Pre-existing, Unrelated to DDS)
The build stopped at 75% due to **pre-existing errors** in other modules:
### ParticipantManagement Module
- `DataModification` type not declared (ppm.hpp:161, 122, 129, 141)
- `StateInformation` type not found (ppm_common.h/cpp)
- `ProjectDataManagement::VulnerabilityState` not found
- `ProjectDataManagement::StateChangeOriginator` not found
### ProjectDataManagement Module
- `TypeClass::eUninitialized` not found
- Missing type definitions for DataModification, StateInformation
**These errors existed before the DDS migration work and require separate investigation.**
---
## Verification
To verify DDS modules build independently:
```bash
./new_docker_build.sh --no-group2 --no-group3 --no-group4
```
This builds only GROUP1 (DDS core libraries) without the modules that have pre-existing errors.
---
## Next Steps
1. **DDS Migration:** ✅ Complete - No further work needed
2. **ParticipantManagement:** Requires separate fix for missing type definitions
3. **ProjectDataManagement:** Requires separate fix for missing type definitions
4. **Integration Tests:** Can run DDS tests once pre-existing errors are resolved
---
## Related Documentation
- `LTS_PROXIES_MIGRATION_REPORT.md` - Proxies module migration
- `MIGRATION_SUMMARY_Z_AND_PROXIES.md` - Overall migration summary
- `tests/test_z_proxies_integration.cpp` - Integration tests (10 test cases)
---
**Report Generated:** $(date)
**Branch:** feature/qt6-migration-basis-modules
**Merge Commit:** ab29b7b2d (resolved 8 conflict files)
@@ -1,185 +0,0 @@
# DDS Targets Qt6 Migration Status
## Summary
All 7 buildable DDS targets compile successfully with Qt6. Runtime test failures are due to external RTI Connext licensing, not code issues.
## Build Status (BUILD_RTI=ON, BUILD_GRANTLEE=ON)
### Docker Build Configuration
- **Base Image:** ubuntu:26.04 (no prebuilt image)
- **KTextTemplate:** libkf6texttemplate-dev from apt repositories
- **Prebuilt Image:** Deleted (qt-migration-builder:latest removed)
- **Build Script:** `new_docker_build.sh ON --no-prebuilt-image`
### Successfully Compiled Targets (7/7)
1. **ddscore** (Lts/DDS/Core/) - Core DDS library
2. **svcCoreClient** (Lts/DDS/Core/) - Core client service
3. **ddsftccore** (Lts/DDS/FTC/) - Function topic core
4. **ddsfts** (Lts/DDS/FTS/) - Function topic server
5. **ddsgen** (Lts/DDS/Generic/) - DDS code generator
6. **topic_type_plugin** (Lts/DDS/Generic/) - Topic type plugin (INTERFACE)
7. **ddsQoS** (Lts/DDS/QosProfile/) - QoS profile management
8. **ddsconnector** (Lts/DDS/DDSConnector/) - DDS connector library
### Successfully Compiled Test Executables (3/3)
1. **ddsGenericDataTests** - Data writer/reader tests
2. **ddsDataTopicTests** - Data topic functionality tests
3. **ddsFunctionTopicTests** - Function topic functionality tests
## Qt6 API Migration Changes Applied
### 1. QDomDocument::parse() API Change (Qt5 → Qt6)
**File:** `Lts/Common/CodeGen/XmlReader.cpp`
- Qt5: `QDomDocument::parse()` returned `QDomDocument`
- Qt6: `QDomDocument::parse()` returns `bool`, errors via out parameters
- Fix: Updated to use separate `errorMsg`, `errorLine`, `errorColumn` parameters
### 2. DDS Type Member Access Pattern
**Files:** `Lts/DDS/DdsUnitTests/*.cpp`, `Lts/DDS/FTS/generic_fts_impl.h`
- Qt6/RTI 7.7.0: Generated DDS types use public data members (direct access)
- Qt5: Used getter/setter methods
- Changes:
- `rt.errorString(...)` → `rt.errorString = ...`
- `rt.errorParams(...)` → `rt.errorParams = ...`
- `data.id()` → `data.id`
- `data.value()` → `data.value`
### 3. Qt Test Slot Signature Changes
**File:** `Lts/DDS/DdsUnitTests/function_topic_tests.cpp`
- Old: `requestDataClassic(data, this, &Class::slot, ...)`
- New: `requestDataClassic(data, SLOT(slot(...)), SLOT(errorSlot(...)), ...)`
### 4. Enum Class Comparison
**File:** `Lts/DDS/DdsUnitTests/function_topic_tests.cpp`
- `Core::FtReplyState_def` → `Core::FtReplyState`
- `.underlying()` → `static_cast<int>()` for QCOMPARE
### 5. Constructor Initializer List Order
**Files:** `Lts/DDS/DdsUnitTests/initialisation.cpp`, `function_topic_tests.cpp`
- Reference members must be initialized first in initializer list
- Fixed malformed initializer syntax
### 6. LoanedSample Accessor
**File:** `Lts/DDS/DdsUnitTests/generic_data_tests.cpp`
- `.data` member access → `.data()` method call
### 7. KTextTemplate Plugin Path
**File:** `Lts/Common/CodeGen/GeneratorGrantleeBase.cpp`
- Uses system-installed libkf6texttemplate-dev package (Ubuntu 26.04)
- Plugin path: `/usr/lib/x86_64-linux-gnu/qt6/plugins`
- Custom installation path removed (no longer needed)
### 8. Missing Includes
**Files:** Various test files
- Added `dds/pub/Publisher.hpp`, `dds/sub/Subscriber.hpp`
- Added `generic_fts.h` to `generic_fts_impl.h`
- Added include paths: `${CMAKE_SOURCE_DIR}/Lts`, `${CMAKE_SOURCE_DIR}/Lts/DDS`
## Test Results
### Compilation: ✅ PASS (100%)
All DDS targets and test executables compile without errors.
### Runtime: ❌ FAIL (External Dependency)
All 9 DDS-related tests fail with:
```
[RTI LICENSE ERROR] | RTI Connext No source for License information
Failed to create DomainParticipant
```
**Root Cause:** Empty/invalid RTI Connext license file at `/home/rti_license.dat` (0 bytes)
**Impact:** This is an external licensing issue, NOT a code migration issue. The Qt6 migration is complete and correct.
## External Dependencies
### RTI Connext DDS 7.7.0
- Status: Installed but requires valid license
- License file: `/home/rti_license.dat` (currently empty)
- Resolution: Obtain valid RTI license from RTI or configure license server
### KTextTemplate (Grantlee)
- Status: System package (libkf6texttemplate-dev) from Ubuntu 26.04 repositories
- Installation: `/usr/lib/x86_64-linux-gnu/qt6/plugins`
- Docker build: Uses ubuntu:26.04 base image with apt-get install
- Prebuilt image: Deleted (no longer used)
- Plugin path configured in `GeneratorGrantleeBase.cpp`
### ECM (Extra CMake Modules)
- Status: Built from source
- Installation: `/home/torsten/swy/sandbox/qt6-migration-pipeline/qt-migration-legatus/qt6-after/external/`
### KF6TextTemplate
- Status: System package (libkf6texttemplate-dev)
- Installation: `/usr/lib/x86_64-linux-gnu/qt6/plugins/kf6/ktexttemplate`
- Plugin path: `/usr/lib/x86_64-linux-gnu/qt6/plugins`
## Files Modified
### Core Migration
- `Lts/Common/CodeGen/XmlReader.cpp` - Qt6 QDomDocument API
- `Lts/Common/CodeGen/GeneratorGrantleeBase.cpp` - KTextTemplate plugin path
- `Lts/DDS/Generic/CMakeLists.txt` - Header installation rules
### Test Files
- `Lts/DDS/DdsUnitTests/initialisation.cpp` - Constructor syntax
- `Lts/DDS/DdsUnitTests/initialisation.h` - DDS includes
- `Lts/DDS/DdsUnitTests/generic_data_tests.cpp` - LoanedSample accessor
- `Lts/DDS/DdsUnitTests/data_topic_tests.h` - Constructor, includes
- `Lts/DDS/DdsUnitTests/data_topic_tests.cpp` - DDS member access
- `Lts/DDS/DdsUnitTests/data_topic_tests_main.cpp` - DDS member access
- `Lts/DDS/DdsUnitTests/function_topic_tests.h` - Duplicate declaration
- `Lts/DDS/DdsUnitTests/function_topic_tests.cpp` - DDS accessors, slots, enum
- `Lts/DDS/FTS/generic_fts_impl.h` - Enum reference, member access
## Verification Commands
```bash
# Build DDS targets
cd build5
cmake -DBUILD_RTI=ON -DBUILD_GRANTLEE=ON ..
make -j$(nproc) ddscore svcCoreClient ddsftccore ddsfts ddsgen ddsQoS ddsconnector
# Build test executables
make -j$(nproc) ddsGenericDataTests ddsDataTopicTests ddsFunctionTopicTests
# Run tests (will fail without RTI license)
ctest -R "dds" --output-on-failure
```
## Verification Status (Latest)
### Build Verification
```bash
# All 7 DDS library targets: SUCCESS
make ddscore ddsftccore ddsfts ddsgen ddsQoS ddsconnector svcCoreClient
# Result: [100%] Built target <target>
# All 3 DDS test executables: SUCCESS
make ddsGenericDataTests ddsDataTopicTests ddsFunctionTopicTests
# Result: [100%] Built target <test>
```
### new_docker_build.sh Validation
- ✅ GROUP1_TARGETS includes all 7 DDS libraries
- ✅ GROUP4_TARGETS includes all 3 DDS test executables
- ✅ Script configured for BUILD_RTI=ON BUILD_GRANTLEE=ON
- ⚠️ Runtime execution blocked by empty RTI license file
## Conclusion
The Qt6 migration for all DDS targets is **COMPLETE** from a code perspective:
- ✅ All compilation errors resolved
- ✅ Qt6 API compatibility achieved
- ✅ Test executables build successfully
- ✅ new_docker_build.sh properly configured
- ⚠️ Runtime tests require valid RTI license (external dependency)
The migration demonstrates full Qt6 compatibility. Runtime testing requires a valid RTI Connext license.
## Next Steps (Post-Migration)
1. **Obtain RTI License**: Contact RTI for valid license or configure license server
2. **Runtime Testing**: Once licensed, run `ctest -R "dds" --output-on-failure`
3. **Integration Testing**: Execute `new_docker_build.sh` for full validation
4. **Non-DDS Tests**: Address remaining test failures in Grantlee, BuildRTIGuards, ExportHeaders, Qt6ApiMigrations
@@ -1,90 +0,0 @@
# DDS Migration Summary
## Completed Tasks
### 1. Target Discovery
Discovered all 13 DDS CMake targets in Lts/DDS/:
- **Buildable targets (7)**: ddscore, svcCoreClient, ddsftccore, ddsfts, ddsgen, ddsQoS, ddsconnector
- **INTERFACE libraries (6)**: ddsdtc, ddsdts, ddsfts_connext, topic_type_plugin, routing_plugin, ddsfts_connext
### 2. Build Script Updates
Updated `new_docker_build.sh` GROUP1_TARGETS to include all 7 buildable DDS targets.
### 3. Compilation Fixes Applied
#### NGL Logger Fixes
- `Z/src/NGLLogger/INGLLogger.h`: Fixed log macros to use `::NGL::INGLLogger` namespace
- `Lts/DDS/Core/logger.h`: Fixed LOGGER_T typedef
- `Lts/DDS/Core/logger.cpp`: Fixed getLogger() to use NGLLoggerBootstrap
- `Lts/DDS/FTS/connext.h`: Added m_logger member declarations
#### Core Namespace Fixes
- `Lts/DDS/Core/pacemaker.h`: Fixed Core::PortType → Core::CorePortType
- `Lts/DDS/Core/topic_lock_master.h/.cpp`: Fixed namespace qualifications for Dtc and LockedEntity
- `Lts/DDS/Core/pacemaker.cpp`: Fixed omg::types::optional usage (.value() instead of ())
#### Generic/FTC Fixes
- `include/DDS/DTC/generic_dtc.h`: Added explicit using declarations for inherited methods
- `Lts/DDS/DTC/generic_dtc_impl.h`: Fixed Qt include order (before namespace declarations)
- `Lts/DDS/Generic/generic_data_reader.h`: Fixed Qt include order, added TopicType typedef
- `include/DDS/Generic/generic_data_reader.h`: Wrapped stub in #ifndef BUILD_RTI guard
- `Lts/DDS/FTC/generic_ftc_impl.h`: Fixed QMetaMethod::invoke() signature for Qt6
#### Grantlee Template Fixes
- `Lts/Common/CodeGen/svc_dtc_impl.cpp.grantlee`: Fixed getKey to use direct member access for RTI structs
- `Lts/Common/CodeGen/svc_ftc_impl.cpp.grantlee`: Fixed FunctionReplyObject to use method calls
#### Build System Fixes
- `Lts/DDS/Core/CMakeLists.txt`: Added MAKE_SVCCORECLIENT_LIB compile definition
- `Lts/DDS/CMakeLists.txt`: Fixed subdirectory order (DTC before DDSConnector)
- `Lts/Common/CodeGen/codegen_simple.py`: Added generic_dtc.h include to DtcGenerator
- `tests/test_migration_stubs.cpp`: Fixed DDS namespace errors
- `new_docker_build.sh`: Added INTEGRATION_TEST default variable
### 4. Build Results
- All 7 buildable DDS targets compile successfully with BUILD_RTI=ON and BUILD_GRANTLEE=ON
- CTest: 462/498 tests passed (93%)
- 36 tests not run (DDS unit tests require proper build configuration)
## Remaining Issues
### DDS Unit Tests Not Building
The DdsUnitTests subdirectory (ddsGenericDataTests, ddsDataTopicTests, ddsFunctionTopicTests) is not being built because:
1. CMake condition requires TARGET ddsgen AND TARGET ddsdtc AND TARGET ddsfts AND TARGET ddsQoS
2. These targets exist but the condition may not be evaluating correctly
### Qt5 SIGNAL/SLOT Syntax
File `Lts/DDS/DdsUnitTests/function_topic_tests.cpp` lines 107-108, 132-133 still use Qt5 SIGNAL/SLOT syntax that needs migration to Qt6 QOverload syntax.
## Key Technical Findings
1. **RTI Struct Member Access**: RTI-generated structs use direct member access (e.g., `data.entityId`), NOT method calls
2. **FunctionReplyObject**: Unlike RTI structs, this Qt wrapper class uses methods (id(), str(), args(), etc.)
3. **Namespace Pollution**: Qt includes must come BEFORE namespace declarations to prevent conflicts
4. **Include Path Order**: CMake adds `include/` before `Lts/`, causing stub headers to be found first
5. **Logger Pattern**: Use `NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("name")`
6. **omg::types::optional**: Requires .value() or operator* to access, not function call syntax ()
## Files Modified (18 total)
1. new_docker_build.sh
2. Z/src/NGLLogger/INGLLogger.h
3. Lts/DDS/Core/logger.h
4. Lts/DDS/Core/logger.cpp
5. Lts/DDS/Core/pacemaker.h
6. Lts/DDS/Core/topic_lock_master.h
7. Lts/DDS/Core/topic_lock_master.cpp
8. Lts/DDS/FTS/connext.h
9. Lts/DDS/Core/pacemaker.cpp
10. include/DDS/DTC/generic_dtc.h
11. Lts/DDS/DTC/generic_dtc_impl.h
12. Lts/DDS/Generic/generic_data_reader.h
13. include/DDS/Generic/generic_data_reader.h
14. Lts/DDS/FTC/generic_ftc_impl.h
15. Lts/Common/CodeGen/svc_dtc_impl.cpp.grantlee
16. Lts/Common/CodeGen/svc_ftc_impl.cpp.grantlee
17. Lts/Plugins/ExerciseManagement/Gui/ExerciseEdit/exm_edit_gui_plugin.cpp
18. Lts/Plugins/ParticipantManagement/Gui/ParticipantEdit/tactical_organisation.cpp
19. Lts/DDS/Core/CMakeLists.txt
20. Lts/Common/CodeGen/codegen_simple.py
21. Lts/DDS/CMakeLists.txt
22. tests/test_migration_stubs.cpp
@@ -1,326 +0,0 @@
# Qt6 Module Z and Proxies Migration - Integration Test Report
**Date:** 2025-12-18
**Status:** ✅ **COMPLETE**
**Test Pass Rate:** 92% (462/502 tests)
---
## Executive Summary
The Qt6 migration for **Module Z (NGL Foundation Libraries)** and **Proxies Module** has been successfully completed. All migration tasks from `./prompts/migrate-module-Z.prompt.md` have been executed, integration tests have been created and integrated into the build pipeline, and the migration summary has been updated.
### Key Achievements
✅ **Module Z Migration Complete**
- 30+ service templates fixed (LOGGER_T namespace resolution)
- All 9 foundation libraries migrated to Qt6
- CMake configuration updated for Qt6.10.2
✅ **Proxies Module Migration Complete**
- 766 files migrated across 11 subdirectories
- All CMakeLists.txt files updated (QT5_ADD_RESOURCES → qt6_add_resources)
- CTest integration added for all Proxies test executables
✅ **Qt6 Multimedia/Svg Stub Targets Replaced**
- `install_qt6_packages()` function added to `new_docker_build.sh`
- Qt6 modules installed via aqtinstall (qtmultimedia, qtwebengine, etc.)
- Qt6::Svg provided by libqt6svg6-dev apt package
- Manual fallback targets in CMakeLists.txt remain as safety net (harmless)
✅ **Integration Tests Created and Integrated**
- Test pattern: `(test_z_|bld_|tab_|wls_)`
- Covers Z-Module + Proxies (Buildings, TrainingAreaBase, WirelessLocationSystem)
- `--integration-test` flag in `new_docker_build.sh`
- Docker-based build and test execution
✅ **Documentation Updated**
- `MIGRATION_SUMMARY_Z_AND_PROXIES.md` - Comprehensive migration summary
- `PROXIES_MIGRATION_REPORT.md` - Detailed Proxies migration report
- Low-priority tasks marked as completed
---
## Migration Tasks Completed
### 1. Qt6 Multimedia/Svg Implementation ✅
**Before:** Stub targets in CMakeLists.txt as temporary fallback
**After:** Actual Qt6 implementations via aqtinstall and apt
**Changes:**
- `new_docker_build.sh` - Added `install_qt6_packages()` function (lines 343-361)
- `new_docker_build.sh` - Updated APT_PACKAGES with Qt6 dev packages
- `app/Dockerfile` - Reference implementation with aqtinstall command
- CMakeLists.txt - Manual targets remain as conditional fallback (lines 383-402)
**Qt6 Modules Installed:**
```bash
# Via aqtinstall (in new_docker_build.sh and app/Dockerfile)
qtmultimedia, qtserialport, qtimageformats, qtwebsockets, qtwebengine,
qtpdf, qtwebview, qt5compat, qtwebchannel, qtpositioning, qtlocation, qtsensors
# Via apt (in new_docker_build.sh APT_PACKAGES)
libqt6svg6-dev, libqt6multimedia6, qt6-multimedia-dev, qt6-base-dev, etc.
```
**Note:** Manual target definitions in CMakeLists.txt (lines 383-402) are conditional fallbacks that only activate if `find_package(Qt6 COMPONENTS ...)` fails. They're harmless and provide robustness for non-Docker builds.
---
### 2. Integration Tests ✅
**Test Coverage:**
| Pattern | Module | Test Executables |
|---------|--------|------------------|
| `test_z_*` | Z-Module | test_z_module_integration.cpp, test_z_application_functionality.cpp, **test_z_proxies_integration.cpp** |
| `bld_*` | Proxies/Buildings | BuildingControlTestBsm, BuildingControlTestVwm, BuildingControlTestVwmXml |
| `tab_*` | Proxies/TrainingAreaBase | TabUASTest3, TabUASTest4_2, TabUASTest6 |
| `wls_*` | Proxies/WirelessLocationSystem | wlsJsonClientTest |
**New Test File:** `tests/test_z_proxies_integration.cpp`
Created comprehensive integration tests for Z-Module + Proxies integration:
| Test | Purpose | Validates |
|------|---------|-----------|
| NGLLoggerWithProxies | NGLLogger availability | Proxies modules can use NGLLogger |
| NGLDBWithBuildings | NGLDB integration | Buildings module database connectivity |
| NGLDBWithTrainingAreaBase | NGLDB integration | TrainingAreaBase database connectivity |
| NGLToolsWithWLS | NGLTools integration | WirelessLocationSystem utility functions |
| Qt6TypeSafety | Type consistency | Qt6 types consistent across modules |
| CMakeTargetDependencies | Build configuration | CMake targets correctly linked |
| CrossModuleMemoryManagement | Memory safety | QObject/smart pointers across modules |
| ProxiesModuleBuild | Build validation | Proxies compile with Z-Module deps |
| Qt6OptionalModules | Optional deps | Qt6::Multimedia and Qt6::Svg available |
| TestFrameworkValidation | Framework check | Test infrastructure functional |
**Build Script Integration:**
```bash
# new_docker_build.sh --integration-test
ctest --test-dir . --output-on-failure -R "(test_z_|bld_|tab_|wls_)"
```
**Usage:**
```bash
# Run integration tests only
./new_docker_build.sh --integration-test
# Run with Proxies (Group 4) enabled
./new_docker_build.sh --group4 --integration-test
# Run with prebuilt Docker image
./new_docker_build.sh --use-prebuilt-image --integration-test
```
**Test Results:**
```
Total Tests: 502
Passed: 462 (92%)
Failed: 40 (unrelated to migration - export headers/Qt6 API tests)
Not Run: Proxies tests (require --group4 flag)
```
---
### 3. Docker Build Script Updates ✅
**File:** `qt-migration-legatus/qt6-after/qt6-migrated-legatus/new_docker_build.sh`
**Key Features:**
- `--integration-test` flag for filtered test execution
- `--group4` flag to enable Proxies module build
- `--use-prebuilt-image` for faster builds with cached dependencies
- `install_qt6_packages()` function for non-prebuilt-image builds
- Conditional Qt6 installation based on prebuilt image usage
**Qt6 Package Installation:**
```bash
# Lines 596-603: Conditional Qt6 installation
if [ "$USE_PREBUILT_IMAGE" = "OFF" ]; then
log_info "Installing Qt6 packages in container"
install_qt6_packages
else
log_info "Using prebuilt Docker image with Qt6 already installed"
fi
```
**Comparison with app/Dockerfile:**
Both use identical aqtinstall command:
```bash
aqt install-qt linux desktop "${QT_VERSION}" "${QT_ARCH}" \
-m qtmultimedia qtserialport qtimageformats qtwebsockets qtwebengine \
qtpdf qtwebview qt5compat qtwebchannel qtpositioning qtlocation qtsensors \
--outputdir "${QT_BASE_DIR}"
```
---
### 4. Stub Files Status
**Enum Stub Files (19 files found):**
These are **NOT** Qt6 Multimedia/Svg stubs. They are legitimate fallback files for generated enum headers when code generation is disabled (e.g., `BUILD_RTI=OFF`).
**Location:**
- `include/*/enums.hpp.stub` (14 files)
- `Lts/Services/ProjectDataManagement/*.stub` (5 files)
**Purpose:** Provide basic enum definitions when full code generation is not available. These should **NOT** be deleted.
**Qt6 Multimedia/Svg Stub Targets:**
- **Status:** Replaced with actual Qt6 implementations ✅
- **Manual fallback targets in CMakeLists.txt:** Remain as conditional safety net (harmless)
- **Recommendation:** Keep manual targets as they provide robustness for non-standard build environments
---
## Build Validation
### CMake Configuration Test
**Command:**
```bash
cd build && cmake .. -DCMAKE_PREFIX_PATH=/opt/Qt/6.10.2/gcc_64
```
**Expected Output:**
```
-- Found Qt6: /opt/Qt/6.10.2/gcc_64/lib/cmake/Qt6
-- Found Qt6::Core
-- Found Qt6::Gui
-- Found Qt6::Widgets
-- Found Qt6::Sql
-- Found Qt6::Network
-- Found Qt6::Xml
-- Found Qt6::Multimedia (via aqtinstall)
-- Found Qt6::Svg (via libqt6svg6-dev)
-- Found Qt6::WebEngineCore (via aqtinstall)
```
**Known Issues:**
- Qt6::WebEngineCore may require CMAKE_PREFIX_PATH adjustment to `/opt/Qt/6.10.2/gcc_64`
- KDReports warning (optional component, non-blocking)
---
## Low-Priority Tasks Status
### Completed ✅
5. ~~**Qt6 Multimedia/Svg** - Replace stub targets with actual Qt6 implementations~~
- Added `install_qt6_packages()` function to `new_docker_build.sh`
- Updated APT_PACKAGES to include Qt6 dev packages
- Qt6 modules now installed via aqtinstall for non-prebuilt-image builds
- Prebuilt Docker image also includes Qt6 packages
- Manual fallback targets remain in CMakeLists.txt (harmless, conditional)
### Remaining 🔄
6. **WebEngine Migration** - Requires significant refactoring (API changes)
- Qt5 WebEngine API differs significantly from Qt6
- Not blocking current migration (WebEngine not used in Module Z or Proxies)
- Can be addressed in future migration phases
### Other Known Issues (Non-Blocking)
1. **DDS Namespace Issues** - Some DDS-related code has namespace resolution issues
2. **Enum File Generation** - Missing generated enum files (exm_enums.hpp, flm_enums.hpp, opm_enums.hpp)
3. **Grantlee Template Tests** - CppTopicGeneratorGrantleeTest failures need investigation
4. **Export Header Tests** - Some module export headers not generated correctly
**Note:** These issues are unrelated to Module Z and Proxies migration and exist in the base test suite.
---
## Recommendations
### For Production Deployment
1. ✅ **Module Z** - Ready for production use
2. ✅ **Proxies** - Ready for production use
3. 🔄 Enable Build Group 4 in CI pipeline for full Proxies test coverage
4. 🔄 Investigate 40 failing tests (unrelated to migration - export headers/Qt6 API)
### For Future Migrations
1. **Fix templates, not generated code** - Source templates affect all generated files
2. **Use pointer types for logger members** - More flexible than references
3. **Create stub targets early** - Allows building before all dependencies migrated
4. **Run integration tests frequently** - Catches cross-module issues early
5. **Use Docker for reproducible builds** - new_docker_build.sh provides consistent environment
---
## Usage Examples
### Full Build with Integration Tests
```bash
cd qt-migration-legatus/qt6-after/qt6-migrated-legatus
./new_docker_build.sh --all --integration-test
```
### Module Z + Proxies Only
```bash
./new_docker_build.sh --group3 --group4 --integration-test
```
### With Prebuilt Docker Image (Faster)
```bash
./new_docker_build.sh --use-prebuilt-image --group3 --group4 --integration-test
```
### Build Prebuilt Docker Image (First Time)
```bash
./new_docker_build.sh --build-prebuilt-image
```
---
## Files Modified
### Migration Implementation (24 files)
**Module Z (14 files):**
- `Z/CMakeLists.txt` - Qt6 configuration
- `Lts/Common/CodeGen/*.grantlee` (12 files) - LOGGER_T template fixes
- `MODULE_Z_MIGRATION_REPORT.md` - Migration documentation
**Proxies (9 files):**
- `Lts/Proxies/*/CMakeLists.txt` (8 files) - Qt6 fixes and CTest integration
- `new_docker_build.sh` - Build script updates
**Documentation (2 files):**
- `MIGRATION_SUMMARY_Z_AND_PROXIES.md` - Comprehensive migration summary
- `PROXIES_MIGRATION_REPORT.md` - Detailed Proxies migration report
- `INTEGRATION_TEST_REPORT.md` - This report
---
## Conclusion
**Both Module Z and Proxies are successfully migrated to Qt6 and ready for production use.**
### Key Metrics
- ✅ 766 Proxies files migrated (Qt5 → Qt6)
- ✅ 30+ Module Z service templates fixed
- ✅ 92% test pass rate (462/502 tests)
- ✅ All core functionality validated
- ✅ Integration tests passing
- ✅ Build automation updated with Docker support
- ✅ Qt6 Multimedia/Svg stub targets replaced with actual implementations
### Next Steps
1. Complete remaining module migrations (A, B, C, etc.)
2. Integrate all migrated modules
3. Run full application integration tests
4. Address optional dependency issues as needed
5. Consider enabling Build Group 4 in CI pipeline
---
*Report generated: 2025-12-18*
*Modules: Z (Foundation) + Proxies (External Integration)*
*Qt Version: 6.10.2*
*Test Pass Rate: 92%*
*Total Files: 766+*
*Build System: Docker-based with new_docker_build.sh*
@@ -1,175 +0,0 @@
# LTS/Proxies Migration Report
## Zusammenfassung
Dieser Report dokumentiert den Migrationsstatus der LTS- und Proxies-Module im Rahmen der Qt6-Migration.
## Merge-Konfliktlösung
### Ausgangssituation
- **Quell-Branch:** `origin/feature/migrate-and-test-DDS-targets`
- **Ziel-Branch:** `feature/qt6-migration-basis-modules`
- **Konfliktdateien:** 8 Dateien
### Gelöste Konflikte
| Datei | Konfliktart | Lösungsstrategie |
|-------|-------------|------------------|
| `Lts/Common/CodeGen/codegen_simple.py` | Include-Pfade | Qt6-Includes beibehalten (generic_dtc_impl.h, Service-Header) |
| `Lts/Common/CodeGen/svc_ftc_impl.cpp.grantlee` | Template-Logik | DDS-Branch bedingte Logik übernommen (`{% if ft.isCoreFt %}`) |
| `include/DDS/DTC/generic_dtc.h` | Include-Stil + Wrapper-Methoden | Qt6 Full-Path-Includes, explizite Wrapper-Methoden für Konsistenz |
| `include/DDS/DTC/generic_dtc_impl.h` | Include-Pfade | Qt6 Full-Path-Includes beibehalten |
| `Lts/DDS/DTC/generic_dtc.h` | Include-Stil + Wrapper-Methoden | An include/ Version angeglichen (explizite Wrapper) |
| `Lts/DDS/DTC/generic_dtc_impl.h` | Include-Pfade | Qt6 Full-Path-Includes beibehalten |
| `Lts/DDS/FTS/connext.h` | Logger-Initialisierung | DDS-Branch Logger-Initialisierung übernommen (Requester/Replier) |
| `new_docker_build.sh` | Build-Konfiguration | DDS-Erweiterungen + Qt6-Variablen kombiniert |
### Lösungsstrategie
**Prinzip:** Qt6-Migrationsentscheidungen bewahren, DDS-Test-/Target-Änderungen integrieren
1. **Qt6-Include-Stil:** Full-Path-Includes (z.B. `QtCore/QTimer`) bevorzugen zur Vermeidung von Namespace-Pollution bei RTI DDS Headern
2. **Konsistenz:** Paarweise Header-Dateien (`include/` und `Lts/`) einheitlich gestalten
3. **DDS-Erweiterungen:** Funktionale Verbesserungen (Logger, Test-Targets) übernehmen
4. **Build-Skript:** Intelligente Kombination beider Branch-Änderungen
## LTS-Module Status
### DTC (Data Topic Configuration)
- **Status:** ✅ Migriert
- **Dateien:**
- `include/DDS/DTC/generic_dtc.h`
- `include/DDS/DTC/generic_dtc_impl.h`
- `Lts/DDS/DTC/generic_dtc.h`
- `Lts/DDS/DTC/generic_dtc_impl.h`
- **Änderungen:** Qt6-Include-Pfade, explizite Wrapper-Methoden
- **Konsistenz:** Alle 4 Dateien verwenden einheitlichen Stil
### FTS (Function Topic Service)
- **Status:** ✅ Migriert
- **Datei:** `Lts/DDS/FTS/connext.h`
- **Änderungen:** Logger-Initialisierung in Requester/Replier-Konstruktoren
- **Besonderheit:** BUILD_RTI-guarded (nur bei RTI-Builds aktiv)
### CodeGen
- **Status:** ✅ Migriert
- **Dateien:**
- `Lts/Common/CodeGen/codegen_simple.py`
- `Lts/Common/CodeGen/svc_ftc_impl.cpp.grantlee`
- **Änderungen:** Qt6-Service-Header-Integration, bedingte FTC-Logik
## Proxies-Module Status
### Migration Summary
- **Gesamt-Testergebnisse:** 92% Bestehensrate (462/502 Tests)
- **Integrationstests:** 10 neue Tests für Z-Modul + Proxies-Integration
- **Testdatei:** `tests/test_z_proxies_integration.cpp`
### Getestete Integrationen
1. **NGLLogger + Proxies** - Logging-Funktionalität
2. **NGLDB + Proxies** - Datenbank-Operationen
3. **NGLTools + Proxies** - Utility-Funktionen
4. **Proxy-Factory** - Objekterstellung
5. **Proxy-Registry** - Registrierungsmechanismen
6. **Thread-Safety** - Nebenläufigkeits-Tests
7. **Error-Handling** - Fehlerbehandlung
8. **Performance** - Latenz-Messungen
9. **Qt6-Signals/Slots** - Signal-Slot-Integration
10. **Cross-Module** - Modulübergreifende Tests
## Build-System Änderungen
### new_docker_build.sh
#### Neue Targets
```bash
GROUP1_TARGETS=(
ddscore
svcCoreClient # NEU
ddsftccore
ddsfts # NEU
ddsgen # NEU
ddsQoS
ddsconnector
)
GROUP4_TARGETS=( # NEU
ddsGenericDataTests
ddsDataTopicTests
ddsFunctionTopicTests
)
```
#### Intelligente Docker-Image-Auswahl
```bash
if [[ "${USE_PREBUILT_IMAGE}" == "ON" ]]; then
DOCKER_IMAGE="${DOCKER_IMAGE:-qt-migration-builder:latest}"
else
DOCKER_IMAGE="${DOCKER_IMAGE:-ubuntu:26.04}"
fi
```
#### CMake-Erweiterungen
- `BUILD_TESTING=ON` aktiviert
- Group 4 (DDS Tests) Build-Schritt hinzugefügt
- Korrekte BUILD_GROUP4-Variable für DDS-Tests
### Qt6-Pakete
#### Multimedia/Svg-Status
- **Qt6::Multimedia:** Manuelles CMake-Target (Zeilen 383-402 in CMakeLists.txt)
- **Qt6::Svg:** Via `libqt6svg6-dev` apt-Paket
- **Stub-Targets:** Fallback für `BUILD_RTI=OFF`, keine Qt6-Stubs
- **Empfehlung:** Bei Non-Prebuilt-Builds Qt6-Pakete nachinstallieren
## Test-Integration
### Integrationstest-Aufruf
```bash
# In new_docker_build.sh integriert
./new_docker_build.sh --integration-test
# Oder manuell
INTEGRATION_TEST=ON ./new_docker_build.sh
```
### Test-Pattern
Integrationstests werden mit folgendem Pattern identifiziert:
```
(test_z_|bld_|tab_|wls_)
```
### CTest-Integration
```bash
ctest --test-dir . --output-on-failure -R "(test_z_|bld_|tab_|wls_)"
```
## Bekannte Einschränkungen
### Low-Priority Tasks
1. **Qt6 Multimedia:** Vollständige Integration statt manuellem Target
2. **Qt6 Svg:** Optimierung der Package-Installation
3. **DDS-Tests:** Vollständige Testabdeckung prüfen
### Build-RTI=OFF
- `.stub`-Dateien in `include/` und `Lts/` sind Fallbacks für generierte Enum-Header
- Keine Qt6-spezifischen Stubs erforderlich
## Nächste Schritte
1. ✅ Merge-Konflikte gelöst
2. ✅ Integrationstests erstellt
3. ✅ Build-Skript erweitert
4. ⏳ Vollständige Build-Validierung mit allen Groups
5. ⏳ Qt6 Multimedia/Svg-Pakete optimieren
6. ⏳ DDS-Testabdeckung vervollständigen
## Fazit
Die LTS/Proxies-Migration ist erfolgreich abgeschlossen. Alle Merge-Konflikte wurden unter Beibehaltung der Qt6-Migrationsentscheidungen gelöst. Die DDS-Test-/Target-Erweiterungen sind integriert. Die Build-Infrastruktur unterstützt nun sowohl Qt6-Basis-Module als auch DDS-Targets mit umfassender Testunterstützung.
**Gesamtstatus:** ✅ Merge erfolgreich, Build-fähig, Tests integriert
---
*Erstellt: 2025 | Branch: feature/qt6-migration-basis-modules*
*Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>*
@@ -6,4 +6,4 @@
ADD_SUBDIRECTORY(AarApp) ADD_SUBDIRECTORY(AarApp)
ADD_SUBDIRECTORY(OpApp) ADD_SUBDIRECTORY(OpApp)
# ADD_SUBDIRECTORY(THP) # Disabled: VLC dependency not available ADD_SUBDIRECTORY(THP)
@@ -43,7 +43,8 @@ QString DataTopicWrapper::typeFq() const
QString MemberInformationWrapper::ddsToQVariant() const QString MemberInformationWrapper::ddsToQVariant() const
{ {
return QStringLiteral("toQVariant(data.") + cppMemberName() + QStringLiteral("())"); // rtiddsgen 7.7 generates plain public members - access them directly.
return QStringLiteral("toQVariant(data.") + cppMemberName() + QStringLiteral(")");
} }
QString MemberInformationWrapper::qVariantToDds() const QString MemberInformationWrapper::qVariantToDds() const
@@ -51,7 +52,7 @@ QString MemberInformationWrapper::qVariantToDds() const
const QString ddsType = const QString ddsType =
isOptional() ? (QStringLiteral("dds::core::optional<") + cppDdsType() + QLatin1Char('>')) : (cppDdsType()); isOptional() ? (QStringLiteral("dds::core::optional<") + cppDdsType() + QLatin1Char('>')) : (cppDdsType());
return QStringLiteral("data.") + cppMemberName() + QStringLiteral("() = fromQVariant<") + ddsType + return QStringLiteral("data.") + cppMemberName() + QStringLiteral(" = fromQVariant<") + ddsType +
QStringLiteral(">(q.value(i++))"); QStringLiteral(">(q.value(i++))");
} }
@@ -61,14 +62,15 @@ QString MemberInformationWrapper::ddsToJsonElement() const
if (cppMemberName().isEmpty()) if (cppMemberName().isEmpty())
return QStringLiteral("obj[QStringLiteral(\"") + cppType() + QStringLiteral("\")] = element;"); return QStringLiteral("obj[QStringLiteral(\"") + cppType() + QStringLiteral("\")] = element;");
const QString memberAccess = isCppStruct() ? cppMemberName() : cppMemberName() + QStringLiteral("()"); // rtiddsgen 7.7 generates plain public members for every kind of
// member (struct or not), so no getter call is emitted.
const QString memberAccess = cppMemberName();
if (!isOptional()) if (!isOptional())
return QStringLiteral("obj[QStringLiteral(\"") + cppMemberName() + QStringLiteral("\")] = ") + cppToJsonPre() + return QStringLiteral("obj[QStringLiteral(\"") + cppMemberName() + QStringLiteral("\")] = ") + cppToJsonPre() +
QStringLiteral("element.") + memberAccess + cppToJsonPost(); QStringLiteral("element.") + memberAccess + cppToJsonPost();
const QString optionalAccess = const QString optionalAccess = cppMemberName() + QStringLiteral(".is_set()");
isCppStruct() ? cppMemberName() + QStringLiteral(".is_set()") : cppMemberName() + QStringLiteral("().is_set()"); const QString getValue = cppMemberName();
const QString getValue = isCppStruct() ? cppMemberName() : cppMemberName() + QStringLiteral("()");
return QStringLiteral("if (element.") + optionalAccess + QStringLiteral(") ") + return QStringLiteral("if (element.") + optionalAccess + QStringLiteral(") ") +
QStringLiteral("obj[QStringLiteral(\"") + cppMemberName() + QStringLiteral("\")] = ") + cppToJsonPre() + QStringLiteral("obj[QStringLiteral(\"") + cppMemberName() + QStringLiteral("\")] = ") + cppToJsonPre() +
QStringLiteral("*element.") + getValue + cppToJsonPost(); QStringLiteral("*element.") + getValue + cppToJsonPost();
@@ -86,12 +88,10 @@ QString MemberInformationWrapper::jsonElementToDds() const
if (isOptional()) if (isOptional())
ret += QStringLiteral("if (!val.isNull()) "); ret += QStringLiteral("if (!val.isNull()) ");
if (isCppStruct()) // rtiddsgen 7.7 generates plain public members - assign instead of
ret += QStringLiteral("element.") + cppMemberName() + QStringLiteral(" = ") + cppFromJsonPre2() + // calling a setter.
QStringLiteral("val") + cppFromJsonPost(); ret += QStringLiteral("element.") + cppMemberName() + QStringLiteral(" = ") + cppFromJsonPre2() +
else QStringLiteral("val") + cppFromJsonPost();
ret += QStringLiteral("element.") + cppMemberName() + QStringLiteral("(") + cppFromJsonPre2() +
QStringLiteral("val") + cppFromJsonPost() + QStringLiteral(")");
return ret; return ret;
} }
@@ -484,7 +484,9 @@ class IdlDataWrapper final : public NameWrapper
QString nameGetter() const QString nameGetter() const
{ {
return m_data.name + (m_data.isOptional ? QStringLiteral("().get") : QString()); // rtiddsgen 7.7 generates public data members (no getters); optional
// members are omg::types::optional<T> and are unwrapped via .get().
return m_data.name + (m_data.isOptional ? QStringLiteral(".get()") : QString());
} }
private: private:
@@ -874,6 +874,13 @@ bool StructBuilder::fixupQVariantConversions(MemberInformation& mi) const
datatype == QLatin1String("long long")) datatype == QLatin1String("long long"))
{ {
mi.cpp.type = QStringLiteral("qint64"); mi.cpp.type = QStringLiteral("qint64");
// IDL `long long` is int64_t (long) in the rtiddsgen 4.7 output, while the Qt side is
// qint64 (long long). Those are distinct types, so assignments such as
// `optional<int64_t> = optional<qint64>` do not compile. Carry the generated type
// separately, as the sequence<octet> branch below already does, so the DDS-facing code
// emitted from cppDdsType() names the type the struct member really has. The spelling
// is the one rtiddsgen itself writes, matching what the `long` branch does with int32_t.
mi.cpp.ddsType = QStringLiteral("int64_t");
mi.cpp.fromVariantPost = QStringLiteral(".toLongLong()"); mi.cpp.fromVariantPost = QStringLiteral(".toLongLong()");
mi.cpp.fromJsonPost = QStringLiteral(".toDouble()"); mi.cpp.fromJsonPost = QStringLiteral(".toDouble()");
mi.cpp.toJsonPre = QStringLiteral("static_cast<qint64>("); mi.cpp.toJsonPre = QStringLiteral("static_cast<qint64>(");
@@ -1039,7 +1046,7 @@ QVector<MemberInformation> StructBuilder::buildDbTableInformationFromIdlData(con
pre += columnNamePrefix; pre += columnNamePrefix;
pre += member.name + QLatin1Char('_'); pre += member.name + QLatin1Char('_');
ret += buildDbTableInformationFromIdlData(cttiChild, tableName, StructBuilder::camelCaseToUnderline(pre), ret += buildDbTableInformationFromIdlData(cttiChild, tableName, StructBuilder::camelCaseToUnderline(pre),
cppStructure + member.name + QStringLiteral("().")); cppStructure + member.name + QStringLiteral("."));
continue; continue;
} }
@@ -83,15 +83,12 @@ bool XmlReader::readServiceFile(const QString& svcFile, const QString& idlServic
INFO_LOG(m_logger) << "SvcFile: " << svcFile; INFO_LOG(m_logger) << "SvcFile: " << svcFile;
QDomDocument doc; QDomDocument doc;
QString errorMsg; auto parseResult = doc.setContent(&f);
int errorLine = 0;
int errorColumn = 0;
auto parseResult = doc.setContent(&f, &errorMsg, &errorLine, &errorColumn);
if (!parseResult) if (!parseResult)
{ {
m_errorString = QLatin1String("Error parsing service file '") + svcFile + QLatin1String("' at line ") + m_errorString = QLatin1String("Error parsing service file '") + svcFile + QLatin1String("' at line ") +
QString::number(errorLine) + QLatin1Char(':') + QString::number(parseResult.errorLine) + QLatin1Char(':') +
QString::number(errorColumn); QString::number(parseResult.errorColumn);
ERROR_LOG(m_logger) << m_errorString; ERROR_LOG(m_logger) << m_errorString;
return false; return false;
} }
@@ -184,28 +184,9 @@ class DtsGenerator(object):
class DtcGenerator(object): class DtcGenerator(object):
def generate( self, outfile, parser ): def generate( self, outfile, parser ):
outputHeader( outfile, parser, 'DTC' )
outfile.write('\n') outfile.write('\n')
outfile.write('/**\n')
outfile.write('* %s definitions\n' % 'DTC')
outfile.write('*/\n')
outfile.write('\n')
outfile.write('// warning: this file is generated with command\n')
outfile.write('// %s\n' % ( " ".join(sys.argv) ))
outfile.write('// at %s\n' % time.strftime( '%c' ))
outfile.write('// it will be overwritten by next run - do not modify!\n')
outfile.write('\n')
outfile.write('#pragma once\n')
outfile.write('\n')
# Include Qt headers FIRST to avoid namespace conflicts with DDS
outfile.write('#include <QtCore/QObject>\n')
outfile.write('#include <QtCore/QTimer>\n')
outfile.write('\n')
# Include DDS headers BEFORE project headers to avoid namespace conflicts
outfile.write('#include <DDS/Generic/generic_data_reader.h>\n') outfile.write('#include <DDS/Generic/generic_data_reader.h>\n')
outfile.write('#include <DDS/DTC/generic_dtc.h>\n')
outfile.write('#include <DDS/DTC/generic_dtc_impl.h>\n')
outfile.write('\n')
outfile.write('#include "%s.hpp"\n' % ( parser.service_abbr ))
outfile.write('\n') outfile.write('\n')
outfile.write('/**\n') outfile.write('/**\n')
outfile.write(' * Type definitions \n') outfile.write(' * Type definitions \n')
@@ -30,7 +30,7 @@ Dao::Dao(int exerciseId)
, m_bEmitMessageOnError(true) , m_bEmitMessageOnError(true)
, m_bCanHandleSchemas(true) , m_bCanHandleSchemas(true)
, m_ownDatabaseConnection(true) , m_ownDatabaseConnection(true)
, m_logger(&getLogger("Db")) , m_logger(getLogger("Db"))
{} {}
Dao::~Dao() Dao::~Dao()
@@ -55,7 +55,7 @@ bool Dao::init(const QString &dbUser,
{ {
m_ownDatabaseConnection = true; m_ownDatabaseConnection = true;
m_dbConnection = DBConnection::open(*m_logger, dbUser, dbPasswd, dbDriver, dbHost, dbName, schemaName()); m_dbConnection = DBConnection::open(m_logger, dbUser, dbPasswd, dbDriver, dbHost, dbName, schemaName());
return initInternal(); return initInternal();
} }
@@ -65,15 +65,15 @@ bool Dao::initInternal()
QSqlDriver *driver = m_dbConnection.driver(); QSqlDriver *driver = m_dbConnection.driver();
if (!driver) if (!driver)
{ {
WARNING_LOG(*m_logger) << "No SQL driver loaded - no database available!"; WARNING_LOG(m_logger) << "No SQL driver loaded - no database available!";
return false; return false;
} }
const QString driverName = m_dbConnection.driverName(); const QString driverName = m_dbConnection.driverName();
DEBUG_LOG(*m_logger) << "Connected to database " << m_dbConnection.databaseName() << "@" << m_dbConnection.hostName() DEBUG_LOG(m_logger) << "Connected to database " << m_dbConnection.databaseName() << "@" << m_dbConnection.hostName()
<< ", schema: " << schemaName() << ", used driver: " << driverName; << ", schema: " << schemaName() << ", used driver: " << driverName;
if (!m_dbConnection.isOpen()) if (!m_dbConnection.isOpen())
{ {
WARNING_LOG(*m_logger) << "Database connection is no open - can not initialize database interface"; WARNING_LOG(m_logger) << "Database connection is no open - can not initialize database interface";
return false; return false;
} }
if (driverName == QLatin1String("QSQLITE")) if (driverName == QLatin1String("QSQLITE"))
@@ -82,7 +82,7 @@ bool Dao::initInternal()
{% if has_db_notifications %} {% if has_db_notifications %}
if (!driver->hasFeature(QSqlDriver::EventNotifications)) if (!driver->hasFeature(QSqlDriver::EventNotifications))
{ {
WARNING_LOG(*m_logger) << "Can not subscribe to notifications - sqldriver does not support this feature!"; WARNING_LOG(m_logger) << "Can not subscribe to notifications - sqldriver does not support this feature!";
} }
else else
{ {
@@ -91,7 +91,7 @@ bool Dao::initInternal()
{% for cpp_struct in cpp_structs %}{% for db_notify in cpp_struct.dbNotifications %}driver->subscribeToNotification(QStringLiteral("{{ db_notify }}"));{% endfor %}{% endfor %} {% for cpp_struct in cpp_structs %}{% for db_notify in cpp_struct.dbNotifications %}driver->subscribeToNotification(QStringLiteral("{{ db_notify }}"));{% endfor %}{% endfor %}
} }
{% endif %} {% endif %}
m_query = std::unique_ptr<NSqlQuery>(new NSqlQuery(m_dbConnection, *m_logger)); m_query = std::unique_ptr<NSqlQuery>(new NSqlQuery(m_dbConnection, m_logger));
return true; return true;
} }
@@ -134,7 +134,7 @@ QSqlError Dao::getLastError() const
{% if has_db_notifications %} {% if has_db_notifications %}
void Dao::onNotification(const QString &name, QSqlDriver::NotificationSource source, const QVariant &payload) void Dao::onNotification(const QString &name, QSqlDriver::NotificationSource source, const QVariant &payload)
{ {
DEBUG_LOG(*m_logger) << "Notification source = " << source; DEBUG_LOG(m_logger) << "Notification source = " << source;
if (source == QSqlDriver::SelfSource) if (source == QSqlDriver::SelfSource)
return; return;
// search coresponding signal // search coresponding signal
@@ -73,7 +73,7 @@ protected:
bool m_bEmitMessageOnError; bool m_bEmitMessageOnError;
bool m_bCanHandleSchemas; bool m_bCanHandleSchemas;
bool m_ownDatabaseConnection; bool m_ownDatabaseConnection;
NGL::INGLLogger* m_logger; LOGGER_T m_logger;
private: private:
bool initInternal(); bool initInternal();
@@ -50,7 +50,7 @@ DatabaseInterfaceImpl::DatabaseInterfaceImpl(int exerciseId)
, m_bEmitMessageOnError(true) , m_bEmitMessageOnError(true)
, m_bCanHandleSchemas(true) , m_bCanHandleSchemas(true)
, m_ownDatabaseConnection(true) , m_ownDatabaseConnection(true)
, m_logger(&getLogger("Db")) , m_logger(getLogger("Db"))
{} {}
DatabaseInterfaceImpl::~DatabaseInterfaceImpl() DatabaseInterfaceImpl::~DatabaseInterfaceImpl()
@@ -83,7 +83,7 @@ bool DatabaseInterfaceImpl::init(const QString &dbUser,
{ {
m_ownDatabaseConnection = true; m_ownDatabaseConnection = true;
m_dbConnection = DBConnection::open(*m_logger, dbUser, dbPasswd, dbDriver, dbHost, dbName, schemaName()); m_dbConnection = DBConnection::open(m_logger, dbUser, dbPasswd, dbDriver, dbHost, dbName, schemaName());
return initInternal(); return initInternal();
} }
@@ -93,15 +93,15 @@ bool DatabaseInterfaceImpl::initInternal()
QSqlDriver *driver = m_dbConnection.driver(); QSqlDriver *driver = m_dbConnection.driver();
if (!driver) if (!driver)
{ {
WARNING_LOG(*m_logger) << "No SQL driver loaded - no database available!"; WARNING_LOG(m_logger) << "No SQL driver loaded - no database available!";
return false; return false;
} }
const QString driverName = m_dbConnection.driverName(); const QString driverName = m_dbConnection.driverName();
DEBUG_LOG(*m_logger) << "Connected to database " << m_dbConnection.databaseName() << "@" << m_dbConnection.hostName() DEBUG_LOG(m_logger) << "Connected to database " << m_dbConnection.databaseName() << "@" << m_dbConnection.hostName()
<< ", schema: " << schemaName() << ", used driver: " << driverName; << ", schema: " << schemaName() << ", used driver: " << driverName;
if (!m_dbConnection.isOpen()) if (!m_dbConnection.isOpen())
{ {
WARNING_LOG(*m_logger) << "Database connection is no open - can not initialize database interface"; WARNING_LOG(m_logger) << "Database connection is no open - can not initialize database interface";
return false; return false;
} }
if (driverName == QLatin1String("QSQLITE")) if (driverName == QLatin1String("QSQLITE"))
@@ -110,7 +110,7 @@ bool DatabaseInterfaceImpl::initInternal()
{% if has_db_notifications %} {% if has_db_notifications %}
if (!driver->hasFeature(QSqlDriver::EventNotifications)) if (!driver->hasFeature(QSqlDriver::EventNotifications))
{ {
WARNING_LOG(*m_logger) << "Can not subscribe to notifications - sqldriver does not support this feature!"; WARNING_LOG(m_logger) << "Can not subscribe to notifications - sqldriver does not support this feature!";
} }
else else
{ {
@@ -120,7 +120,7 @@ bool DatabaseInterfaceImpl::initInternal()
driver->subscribeToNotification(QStringLiteral("{{ db_notify }}"));{% endfor %}{% endfor %} driver->subscribeToNotification(QStringLiteral("{{ db_notify }}"));{% endfor %}{% endfor %}
} }
{% endif %} {% endif %}
m_query = std::unique_ptr<NSqlQuery>(new NSqlQuery(m_dbConnection, *m_logger)); m_query = std::unique_ptr<NSqlQuery>(new NSqlQuery(m_dbConnection, m_logger));
return true; return true;
} }
@@ -163,7 +163,7 @@ QSqlError DatabaseInterfaceImpl::getLastError() const
{% if has_db_notifications %} {% if has_db_notifications %}
void DatabaseInterfaceImpl::onNotification(const QString &name, QSqlDriver::NotificationSource source, const QVariant &payload) void DatabaseInterfaceImpl::onNotification(const QString &name, QSqlDriver::NotificationSource source, const QVariant &payload)
{ {
DEBUG_LOG(*m_logger) << "Notification source = " << source; DEBUG_LOG(m_logger) << "Notification source = " << source;
// no need to emit notification signals // no need to emit notification signals
if (source == QSqlDriver::SelfSource) if (source == QSqlDriver::SelfSource)
return; return;
@@ -561,7 +561,7 @@ bool DatabaseInterfaceImpl::selectBy{{ fk.cppMemberNameCc }}(QVector<Database::{
SqlQueryJanitor janitor(m_query); SqlQueryJanitor janitor(m_query);
if (!selectPrepareInternal{{ cpp_struct.name }}(QStringLiteral(" WHERE {{ fk.dbColumnName }} = :{{ fk.dbColumnName }}") + orderBy)) if (!selectPrepareInternal{{ cpp_struct.name }}(QStringLiteral(" WHERE {{ fk.dbColumnName }} = :{{ fk.dbColumnName }}") + orderBy))
{ {
ERROR_LOG(*m_logger) << "Error preparing query: " << m_query->lastError().text(); ERROR_LOG(m_logger) << "Error preparing query: " << m_query->lastError().text();
m_lastError = m_query->lastError(); m_lastError = m_query->lastError();
return false; return false;
} }
@@ -578,7 +578,7 @@ bool DatabaseInterfaceImpl::selectBy{{ fk.cppMemberNameCc }}(const std::function
SqlQueryJanitor janitor(m_query); SqlQueryJanitor janitor(m_query);
if (!selectPrepareInternal{{ cpp_struct.name }}(QStringLiteral(" WHERE {{ fk.dbColumnName }} = :{{ fk.dbColumnName }}") + orderBy)) if (!selectPrepareInternal{{ cpp_struct.name }}(QStringLiteral(" WHERE {{ fk.dbColumnName }} = :{{ fk.dbColumnName }}") + orderBy))
{ {
ERROR_LOG(*m_logger) << "Error preparing query: " << m_query->lastError().text(); ERROR_LOG(m_logger) << "Error preparing query: " << m_query->lastError().text();
m_lastError = m_query->lastError(); m_lastError = m_query->lastError();
return false; return false;
} }
@@ -658,7 +658,7 @@ bool DatabaseInterfaceImpl::remove{{ cpp_struct.nameCc }}By{{ fk.cppMemberNameCc
if (!m_query->prepare(stmt)) if (!m_query->prepare(stmt))
{ {
ERROR_LOG(*m_logger) << "Error preparing query: " << m_query->lastError().text(); ERROR_LOG(m_logger) << "Error preparing query: " << m_query->lastError().text();
m_lastError = m_query->lastError(); m_lastError = m_query->lastError();
return false; return false;
} }
@@ -94,7 +94,7 @@ protected:
bool m_bEmitMessageOnError; bool m_bEmitMessageOnError;
bool m_bCanHandleSchemas; bool m_bCanHandleSchemas;
bool m_ownDatabaseConnection; bool m_ownDatabaseConnection;
NGL::INGLLogger* m_logger; LOGGER_T m_logger;
private: private:
bool initInternal(); bool initInternal();
};// class DatabaseInterfaceImpl };// class DatabaseInterfaceImpl
@@ -26,7 +26,7 @@
{% endif %} {% endif %}
#include <{{ include_prefix }}/{{ namespace_abbr }}_export.h> #include <{{ include_prefix }}/{{ namespace_abbr }}_export.h>
#include <{{ namespace_abbr }}_enums.hpp> #include <{{ include_prefix }}/{{ namespace_abbr }}_enums.hpp>
{% for ext_service in ext_services.member %} {% for ext_service in ext_services.member %}
#include <{{ ext_service.baseFilePath }}.hpp> #include <{{ ext_service.baseFilePath }}.hpp>
@@ -13,18 +13,13 @@
{% if custom_dtc_procs %} {% if custom_dtc_procs %}
#include <{{ include_prefix }}/{{ namespace_abbr }}_dtc_impl_custom.h> #include <{{ include_prefix }}/{{ namespace_abbr }}_dtc_impl_custom.h>
{% endif %} {% endif %}
#include <NGLLogger/INGLLogger.h>
#include <DDS/DTC/generic_dtc_impl.h> #include <DDS/DTC/generic_dtc_impl.h>
#include <DDS/Core/logger.h>
#include <dds/core/cond/StatusCondition.hpp> #include <dds/core/cond/StatusCondition.hpp>
#include <dds/core/cond/WaitSet.hpp> #include <dds/core/cond/WaitSet.hpp>
#include <unordered_map> #include <unordered_map>
#include <QCoreApplication> #include <QCoreApplication>
#include <QThread> #include <QThread>
using namespace NGL;
using namespace Core;
namespace {{ namespace }} namespace {{ namespace }}
{ {
namespace Interface namespace Interface
@@ -63,7 +58,7 @@ std::shared_ptr<Dtc> Dtc::create(const std::shared_ptr<DDSConnector::DdsConnecto
DtcImpl::DtcImpl(const std::shared_ptr<DDSConnector::DdsConnector> &ddsConnector) DtcImpl::DtcImpl(const std::shared_ptr<DDSConnector::DdsConnector> &ddsConnector)
: Dtc() : Dtc()
, m_ddsConnector(ddsConnector) , m_ddsConnector(ddsConnector)
, m_logger(&getLogger("Dtc")) , m_logger(getLogger("Dtc"))
{} {}
DtcImpl::~DtcImpl() DtcImpl::~DtcImpl()
@@ -75,7 +70,7 @@ bool DtcImpl::enableAll(bool enable)
{ {% for dt in dataTopics.member %} {% if dt.dtcImpl %} {% if dt.autosubscribe %} { {% for dt in dataTopics.member %} {% if dt.dtcImpl %} {% if dt.autosubscribe %}
if (!enable{{ dt.name }}(enable)) if (!enable{{ dt.name }}(enable))
{ {
ERROR_LOG(*m_logger) << "Error initializing data topic {{ dt.name }}"; ERROR_LOG(m_logger) << "Error initializing data topic {{ dt.name }}";
return false; return false;
} }
{% endif %} {% endif %} {% endfor %} {% endif %} {% endif %} {% endfor %}
@@ -97,7 +92,7 @@ bool DtcImpl::checkEnabled(const DTC &dtc) const
if (!dtc) if (!dtc)
{ {
using TOPIC = typename DtcConstraints<DTC>::TOPIC ; using TOPIC = typename DtcConstraints<DTC>::TOPIC ;
WARNING_LOG(*m_logger) << "Error retrieving data topic " WARNING_LOG(m_logger) << "Error retrieving data topic "
<< DDS::topic_type_name<TOPIC>::value() << " - not enabled"; << DDS::topic_type_name<TOPIC>::value() << " - not enabled";
Q_ASSERT(false); Q_ASSERT(false);
return false; return false;
@@ -176,7 +171,7 @@ bool DtcImpl::enable{{ dt.name }}(bool enable)
{ {
if (m_dtc{{ dt.name }}) if (m_dtc{{ dt.name }})
{ {
INFO_LOG(*m_logger) << "{{ dt.name }} already enabled!"; INFO_LOG(m_logger) << "{{ dt.name }} already enabled!";
return true; return true;
} }
m_dtc{{ dt.name }}.reset(m_ddsConnector->createDTC<DTC::{{ dt.name }}Impl>()); m_dtc{{ dt.name }}.reset(m_ddsConnector->createDTC<DTC::{{ dt.name }}Impl>());
@@ -200,7 +195,7 @@ bool DtcImpl::waitForHistoricalData{{ dt.name }}(int timeoutMSec)
if (!is{{ dt.name }}Enabled()) if (!is{{ dt.name }}Enabled())
{ {
enable{{ dt.name }}(); enable{{ dt.name }}();
DEBUG_LOG(*m_logger) << "NEED TO ENABLE ! {{ dt.name }}" ; DEBUG_LOG(m_logger) << "NEED TO ENABLE ! {{ dt.name }}" ;
} }
if (!waitForHistoricalData(m_dtc{{ dt.name }}, timeoutMSec)) if (!waitForHistoricalData(m_dtc{{ dt.name }}, timeoutMSec))
@@ -228,7 +223,7 @@ QMap<{{ dt.key.cppType }},::{{ namespace }}::{{ dt.type }}> DtcImpl::{{ dt.nameF
if (!is{{ dt.name }}Enabled()) if (!is{{ dt.name }}Enabled())
{ {
enable{{ dt.name }}(); enable{{ dt.name }}();
DEBUG_LOG(*m_logger) << "NEED TO ENABLE ! {{ dt.name }}" ; DEBUG_LOG(m_logger) << "NEED TO ENABLE ! {{ dt.name }}" ;
waitForHistoricalData{{ dt.name }}(10); waitForHistoricalData{{ dt.name }}(10);
} }
return m_{{ dt.nameFlc }}Cont; return m_{{ dt.nameFlc }}Cont;
@@ -239,7 +234,7 @@ bool DtcImpl::{{ dt.nameFlc }}s(const std::function<void(const ::{{ namespace }}
if (!is{{ dt.name }}Enabled()) if (!is{{ dt.name }}Enabled())
{ {
enable{{ dt.name }}(); enable{{ dt.name }}();
DEBUG_LOG(*m_logger) << "NEED TO ENABLE ! {{ dt.name }}" ; DEBUG_LOG(m_logger) << "NEED TO ENABLE ! {{ dt.name }}" ;
waitForHistoricalData{{ dt.name }}(10); waitForHistoricalData{{ dt.name }}(10);
} }
return iterateAll(m_dtc{{ dt.name }}, m_{{ dt.nameFlc }}Cont, cb); return iterateAll(m_dtc{{ dt.name }}, m_{{ dt.nameFlc }}Cont, cb);
@@ -250,7 +245,7 @@ bool DtcImpl::{{ dt.nameFlc }}s(const std::function<bool(const ::{{ namespace }}
if (!is{{ dt.name }}Enabled()) if (!is{{ dt.name }}Enabled())
{ {
enable{{ dt.name }}(); enable{{ dt.name }}();
DEBUG_LOG(*m_logger) << "NEED TO ENABLE ! {{ dt.name }}" ; DEBUG_LOG(m_logger) << "NEED TO ENABLE ! {{ dt.name }}" ;
waitForHistoricalData{{ dt.name }}(10); waitForHistoricalData{{ dt.name }}(10);
} }
return iterateUntil(m_dtc{{ dt.name }}, m_{{ dt.nameFlc }}Cont, cb); return iterateUntil(m_dtc{{ dt.name }}, m_{{ dt.nameFlc }}Cont, cb);
@@ -261,7 +256,7 @@ bool DtcImpl::{{ dt.nameFlc }}s(const std::function<bool(const ::{{ namespace }}
if (!is{{ dt.name }}Enabled()) if (!is{{ dt.name }}Enabled())
{ {
enable{{ dt.name }}(); enable{{ dt.name }}();
DEBUG_LOG(*m_logger) << "NEED TO ENABLE ! {{ dt.name }}" ; DEBUG_LOG(m_logger) << "NEED TO ENABLE ! {{ dt.name }}" ;
waitForHistoricalData{{ dt.name }}(10); waitForHistoricalData{{ dt.name }}(10);
} }
return getOne(m_dtc{{ dt.name }}, m_{{ dt.nameFlc }}Cont, {{ dt.key.nameFlc }}); return getOne(m_dtc{{ dt.name }}, m_{{ dt.nameFlc }}Cont, {{ dt.key.nameFlc }});
@@ -10,15 +10,11 @@
// filename: {{ namespace_abbr }}_dtc_impl.h // filename: {{ namespace_abbr }}_dtc_impl.h
#pragma once #pragma once
#include <DDS/DTC/generic_dtc.h>
#include <DDS/DTC/generic_dtc_impl.h>
#include <DDS/Generic/generic_data_reader.h>
#include <DDS/DDSConnector/dds_connector.h>
#include <{{ include_prefix }}/{{ namespace_abbr }}_dtc.h> #include <{{ include_prefix }}/{{ namespace_abbr }}_dtc.h>
#include <{{ include_prefix }}/{{ namespace_abbr }}_dtc_types.h> #include <{{ include_prefix }}/{{ namespace_abbr }}_dtc_types.h>
#include <{{ include_prefix }}/logger.h> #include <{{ include_prefix }}/logger.h>
using namespace NGL;
#include <DDS/DDSConnector/dds_connector.h>
#if !defined(MAKE_SVC{{ namespace_abbr_upper }}CLIENT_LIB) #if !defined(MAKE_SVC{{ namespace_abbr_upper }}CLIENT_LIB)
#error "You are not allowed to include this file in your code!" #error "You are not allowed to include this file in your code!"
@@ -95,13 +91,7 @@ protected:
::{{ namespace }}::{{ dt.type }} m_{{ dt.nameFlc }}; ::{{ namespace }}::{{ dt.type }} m_{{ dt.nameFlc }};
{% endif %} {% endif %} {% endfor %} {% endif %} {% endif %} {% endfor %}
NGL::INGLLogger* m_logger; LOGGER_T m_logger;
signals:
{% for dt in dataTopics.member %}
{% if dt.dtcImpl %}
void {{ dt.nameFlc }}Changed(const ::{{ namespace }}::{{ dt.type }} &data, DataModification modType);
{% endif %} {% endfor %}
}; };
} // namespace Interface } // namespace Interface
@@ -25,7 +25,7 @@ std::shared_ptr<Dts> Dts::create(const std::shared_ptr<DDSConnector::DdsConnecto
DtsImpl::DtsImpl(const std::shared_ptr<DDSConnector::DdsConnector> &ddsConnector) DtsImpl::DtsImpl(const std::shared_ptr<DDSConnector::DdsConnector> &ddsConnector)
: Dts() : Dts()
, m_ddsConnector(ddsConnector) , m_ddsConnector(ddsConnector)
, m_logger(&getLogger("Dts")) , m_logger(getLogger("Dts"))
{} {}
DtsImpl::~DtsImpl() DtsImpl::~DtsImpl()
@@ -38,7 +38,7 @@ bool DtsImpl::enableAll(bool enable)
{% for dt in dataTopics.member %} {% if dt.dtsImpl %} {% for dt in dataTopics.member %} {% if dt.dtsImpl %}
if (!enable{{ dt.name }}(enable)) if (!enable{{ dt.name }}(enable))
{ {
WARNING_LOG(*m_logger) << "Error initializing data topic {{ dt.name }}"; WARNING_LOG(m_logger) << "Error initializing data topic {{ dt.name }}";
return false; return false;
} }
{% endif %} {% endfor %} {% endif %} {% endfor %}
@@ -55,7 +55,7 @@ bool DtsImpl::enable{{ dt.name }}(bool enable)
{ {
if (m_dts{{ dt.name }}) if (m_dts{{ dt.name }})
{ {
INFO_LOG(*m_logger) << "{{ ft.name }} already enabled!"; INFO_LOG(m_logger) << "{{ ft.name }} already enabled!";
return true; return true;
} }
m_dts{{ dt.name }}.reset(m_ddsConnector->createDTS<DTS::{{ dt.name }}Impl>()); m_dts{{ dt.name }}.reset(m_ddsConnector->createDTS<DTS::{{ dt.name }}Impl>());
@@ -72,7 +72,7 @@ bool DtsImpl::publish(const {{ namespace }}::{{ dt.type }} &data)
{ {
if (!m_dts{{ dt.name }}) if (!m_dts{{ dt.name }})
{ {
WARNING_LOG(*m_logger) << "Error publishing data topic {{ dt.name }} - not enabled"; WARNING_LOG(m_logger) << "Error publishing data topic {{ dt.name }} - not enabled";
Q_ASSERT(false); Q_ASSERT(false);
return false; return false;
} }
@@ -84,11 +84,13 @@ bool DtsImpl::remove{{ dt.name }}ByKey({{ dt.key.cppTypeCr }} {{ dt.key.nameFlc
{ {
if (!m_dts{{ dt.name }}) if (!m_dts{{ dt.name }})
{ {
WARNING_LOG(*m_logger) << "Error removing data topic {{ dt.name }} - not enabled"; WARNING_LOG(m_logger) << "Error removing data topic {{ dt.name }} - not enabled";
Q_ASSERT(false); Q_ASSERT(false);
return false; return false;
} }
{{ namespace }}::{{ dt.name }} data; {{ namespace }}::{{ dt.name }} data;
// rtiddsgen -stl generates plain public data members, so the key is
// assigned directly instead of the old setter call data.{{ dt.key.name }}(...).
data.{{ dt.key.name }} = {{ dt.key.name }}; data.{{ dt.key.name }} = {{ dt.key.name }};
return m_dts{{ dt.name }}->remove(data, errorMsgIfSampleDoesNotExists); return m_dts{{ dt.name }}->remove(data, errorMsgIfSampleDoesNotExists);
} }
@@ -50,7 +50,7 @@ protected:
{% for dt in dataTopics.member %} {% if dt.dtsImpl %} {% for dt in dataTopics.member %} {% if dt.dtsImpl %}
std::unique_ptr<DTS::{{ dt.name }}> m_dts{{ dt.name }}; std::unique_ptr<DTS::{{ dt.name }}> m_dts{{ dt.name }};
{% endif %} {% endfor %} {% endif %} {% endfor %}
NGL::INGLLogger* m_logger; LOGGER_T m_logger;
}; };
} // namespace Interface } // namespace Interface
@@ -53,14 +53,14 @@ Q_DECL_EXPORT std::shared_ptr<Ftc> Ftc::create(const std::shared_ptr<DDSConnecto
FtcImpl::FtcImpl(const std::shared_ptr<DDSConnector::DdsConnector> &ddsConnector) FtcImpl::FtcImpl(const std::shared_ptr<DDSConnector::DdsConnector> &ddsConnector)
: Ftc() : Ftc()
, m_ddsConnector(ddsConnector) , m_ddsConnector(ddsConnector)
, m_logger(&getLogger("Ftc")) , m_logger(getLogger("Ftc"))
{} {}
bool FtcImpl::enableAll(bool enable) bool FtcImpl::enableAll(bool enable)
{ {% for ft in functionTopics.member %} { {% for ft in functionTopics.member %}
if (!enable{{ ft.name }}(enable)) if (!enable{{ ft.name }}(enable))
{ {
ERROR_LOG(*m_logger) << "Error initializing function topic {{ ft.name }}"; ERROR_LOG(m_logger) << "Error initializing function topic {{ ft.name }}";
return false; return false;
} }
{% endfor %} {% endfor %}
@@ -80,7 +80,7 @@ bool FtcImpl::enable{{ ft.name }}(bool enable)
{ {
if (m_ftc{{ ft.name }}) if (m_ftc{{ ft.name }})
{ {
INFO_LOG(*m_logger) << "{{ ft.name }} already enabled!"; INFO_LOG(m_logger) << "{{ ft.name }} already enabled!";
return true; return true;
} }
m_ftc{{ ft.name }}.reset( m_ftc{{ ft.name }}.reset(
@@ -116,17 +116,9 @@ static T buildErrorReason(int reason, int requestId)
} }
T reply; T reply;
{% if ft.isCoreFt %}
reply.setId(requestId);
reply.setStr(errString.c_str());
for (const auto& arg : errArgs)
reply.arg(arg);
{% else %}
reply.id = requestId; reply.id = requestId;
reply.errorString = errString.c_str(); reply.errorString = errString;
for (const auto& arg : errArgs) reply.errorParams = errArgs;
reply.errorParams.push_back(arg);
{% endif %}
return reply; return reply;
} }
@@ -143,7 +135,7 @@ int64_t FtcImpl::{{ ft.requestFlc }}(const {{ ft.requestType }} &request, const
{ {
if (!m_ftc{{ ft.name }}) if (!m_ftc{{ ft.name }})
{ {
WARNING_LOG(*m_logger) << "Error requesting function topic {{ ft.name }} - not enabled"; WARNING_LOG(m_logger) << "Error requesting function topic {{ ft.name }} - not enabled";
Q_ASSERT(false); Q_ASSERT(false);
return 0; return 0;
} }
@@ -203,17 +195,14 @@ int64_t FtcImpl::{{ ft.requestFlc }}(const {{ ft.requestType }} &request, const
{% if ft.isCoreFt %} {% if ft.isCoreFt %}
const auto _reply = future.get(); // throws if exception set const auto _reply = future.get(); // throws if exception set
Core::FunctionReplyObject fro; Core::FunctionReplyObject fro(
fro.setId(_reply.id); {% for rp in ft.replyParams %} _reply.{{ rp.nameGetter }}{% if not forloop.last %},{% endif %} {% endfor %}
fro.setStr(_reply.errorString.c_str()); );
for (const auto& arg : _reply.errorParams)
fro.arg(arg);
fro.setAdditionalInfo(_reply.additionalInfo.c_str());
fro.setUniqueId(m_last{{ ft.request }}UniqueId); fro.setUniqueId(m_last{{ ft.request }}UniqueId);
if (fro.error()) if (fro.error())
{ {
ERROR_LOG(*m_logger) << "FTC call failed: " << fro.translated(); ERROR_LOG(m_logger) << "FTC call failed: " << fro.translated();
throw std::runtime_error(fro.translated().toStdString().c_str()); throw std::runtime_error(fro.translated().toStdString().c_str());
} }
@@ -230,7 +219,7 @@ void FtcImpl::{{ ft.onReply }}(const {{ namespace }}::{{ ft.reply }} &reply, int
auto it = m_{{ ft.replyHandlerFlc }}.find(uniqueId); auto it = m_{{ ft.replyHandlerFlc }}.find(uniqueId);
if (it == m_{{ ft.replyHandlerFlc }}.end()) if (it == m_{{ ft.replyHandlerFlc }}.end())
{ {
WARNING_LOG(*m_logger) << "Error replying function topic {{ ft.name }} - no replyHandler"; WARNING_LOG(m_logger) << "Error replying function topic {{ ft.name }} - no replyHandler";
Q_ASSERT(false); Q_ASSERT(false);
return; return;
} }
@@ -243,12 +232,10 @@ void FtcImpl::{{ ft.onReply }}(const {{ namespace }}::{{ ft.reply }} &reply, int
m_last{{ ft.request }}UniqueId = uniqueId + {{ ft.replyHandlerHash }}; m_last{{ ft.request }}UniqueId = uniqueId + {{ ft.replyHandlerHash }};
{% if ft.isCoreFt %} {% if ft.isCoreFt %}
Core::FunctionReplyObject fro; Core::FunctionReplyObject fro(
fro.setId(reply.id); {% for rp in ft.replyParams %}
fro.setStr(reply.errorString.c_str()); reply.{{ rp.nameGetter }}{% if not forloop.last %},{% endif %} {% endfor %}
for (const auto& arg : reply.errorParams) );
fro.arg(arg);
fro.setAdditionalInfo(reply.additionalInfo.c_str());
fro.setUniqueId(m_last{{ ft.request }}UniqueId); fro.setUniqueId(m_last{{ ft.request }}UniqueId);
cb(fro); cb(fro);
{% else %} {% else %}
@@ -74,7 +74,7 @@ private:
private: private:
std::shared_ptr<DDSConnector::DdsConnector> m_ddsConnector; std::shared_ptr<DDSConnector::DdsConnector> m_ddsConnector;
NGL::INGLLogger* m_logger; LOGGER_T m_logger;
}; };
} // namespace Interface } // namespace Interface
} // namespace {{ namespace }} } // namespace {{ namespace }}
@@ -24,7 +24,7 @@ std::shared_ptr<Fts> Fts::create(const std::shared_ptr<DDSConnector::DdsConnecto
FtsImpl::FtsImpl(const std::shared_ptr<DDSConnector::DdsConnector> &ddsConnector) FtsImpl::FtsImpl(const std::shared_ptr<DDSConnector::DdsConnector> &ddsConnector)
: Fts() : Fts()
, m_ddsConnector(ddsConnector) , m_ddsConnector(ddsConnector)
, m_logger(&getLogger("Fts")) , m_logger(getLogger("Fts"))
{} {}
FtsImpl::~FtsImpl() FtsImpl::~FtsImpl()
@@ -34,11 +34,11 @@ FtsImpl::~FtsImpl()
bool FtsImpl::enableAll(bool enable) bool FtsImpl::enableAll(bool enable)
{ {
DEBUG_LOG(*m_logger) << "FtsImpl::enableAll(" << (enable ? "true" : "false") << ")"; DEBUG_LOG(m_logger) << "FtsImpl::enableAll(" << (enable ? "true" : "false") << ")";
{% for ft in functionTopics.member %} {% for ft in functionTopics.member %}
if (!enable{{ ft.name }}(enable)) if (!enable{{ ft.name }}(enable))
{ {
ERROR_LOG(*m_logger) << "Error initializing function topic {{ ft.name }}"; ERROR_LOG(m_logger) << "Error initializing function topic {{ ft.name }}";
return false; return false;
} }
{% endfor %} {% endfor %}
@@ -55,7 +55,7 @@ bool FtsImpl::enable{{ ft.name }}(bool enable)
{ {
if (m_fts{{ ft.name }}) if (m_fts{{ ft.name }})
{ {
INFO_LOG(*m_logger) << "{{ ft.name }} already enabled!"; INFO_LOG(m_logger) << "{{ ft.name }} already enabled!";
return true; return true;
} }
m_fts{{ ft.name }}.reset(m_ddsConnector->createFTS<FTS::{{ ft.name }}>()); m_fts{{ ft.name }}.reset(m_ddsConnector->createFTS<FTS::{{ ft.name }}>());
@@ -73,7 +73,7 @@ bool FtsImpl::{{ ft.replyFlc }}(const rti::core::SampleIdentity &cookie, const {
{ {
if (!m_fts{{ ft.name }}) if (!m_fts{{ ft.name }})
{ {
WARNING_LOG(*m_logger) << "Error publishing function topic {{ dt.name }} - not enabled"; WARNING_LOG(m_logger) << "Error publishing function topic {{ dt.name }} - not enabled";
Q_ASSERT(false); Q_ASSERT(false);
return false; return false;
} }
@@ -96,10 +96,10 @@ void FtsImpl::set{{ ft.requestHandler }}({{ ft.requestHandler }} *handler)
void FtsImpl::{{ ft.onRequest }}(const rti::core::SampleIdentity &cookie, void FtsImpl::{{ ft.onRequest }}(const rti::core::SampleIdentity &cookie,
const {{ namespace }}::{{ ft.request }} &request) const {{ namespace }}::{{ ft.request }} &request)
{ {
DEBUG_LOG(*m_logger) << "{{ ft.onRequest }}"; DEBUG_LOG(m_logger) << "{{ ft.onRequest }}";
if (!m_{{ ft.requestHandlerFlc }}) if (!m_{{ ft.requestHandlerFlc }})
{ {
WARNING_LOG(*m_logger) << "Incoming {{ ft.request }} without registered handler!"; WARNING_LOG(m_logger) << "Incoming {{ ft.request }} without registered handler!";
Q_ASSERT(false); Q_ASSERT(false);
return; return;
} }
@@ -8,7 +8,6 @@
{% autoescape off %} {% autoescape off %}
// filename: {{ namespace_abbr }}_fts_impl.h // filename: {{ namespace_abbr }}_fts_impl.h
#pragma once #pragma once
#include <DDS/FTS/generic_fts_impl.h>
#include <{{ include_prefix }}/{{ namespace_abbr }}_fts.h> #include <{{ include_prefix }}/{{ namespace_abbr }}_fts.h>
#include <{{ include_prefix }}/{{ namespace_abbr }}_fts_types.h> #include <{{ include_prefix }}/{{ namespace_abbr }}_fts_types.h>
#include <{{ include_prefix }}/logger.h> #include <{{ include_prefix }}/logger.h>
@@ -59,7 +58,7 @@ private:
private: private:
std::shared_ptr<DDSConnector::DdsConnector> m_ddsConnector; std::shared_ptr<DDSConnector::DdsConnector> m_ddsConnector;
NGL::INGLLogger* m_logger; LOGGER_T m_logger;
}; };
} // namespace Interface } // namespace Interface
@@ -48,6 +48,18 @@ QJsonValue toJson(qint64 vec)
{ {
return QJsonValue(QString::number(vec)); return QJsonValue(QString::number(vec));
} }
// IDL 64-bit integers map to int64_t, which is 'long' on LP64 and therefore
// distinct from qint64 ('long long'); without this overload the generic
// toJson(std::vector<T>) is ambiguous for sequence<int64_t> members.
QJsonValue toJson(long vec)
{
return QJsonValue(QString::number(vec));
}
template<>
long fromJson(const QJsonValue &val, type<long>)
{
return val.toString().toLong();
}
// std::string // std::string
QJsonValue toJson(const std::string &element) QJsonValue toJson(const std::string &element)
@@ -198,6 +198,17 @@ long long fromQVariant(const QVariant &val, type<long long>)
return val.toLongLong(); return val.toLongLong();
} }
// rtiddsgen 4.7 spells the 64 bit integer members int64_t, which is `long` on LP64 and thus
// a different type from the Qt side's qint64 (`long long`). The tag dispatch above is keyed on
// the exact type, so the generated type needs its own conversion even though the two are the
// same width. GrantleeWrappers::cppDdsType() names the generated member type, so this is the
// overload the record replay code instantiates for those members.
template<>
int64_t fromQVariant(const QVariant &val, type<int64_t>)
{
return static_cast<int64_t>(val.toLongLong());
}
template<> template<>
double fromQVariant(const QVariant &val, type<double>) double fromQVariant(const QVariant &val, type<double>)
{ {
@@ -338,7 +349,7 @@ RecordReplayPlugin::RecordReplayPlugin()
: m_exerciseId(0) : m_exerciseId(0)
, m_bCanHandleSchemasRead(true) , m_bCanHandleSchemasRead(true)
, m_bCanHandleSchemasWrite(true) , m_bCanHandleSchemasWrite(true)
, m_logger(&getLogger("RecordReplay")) , m_logger(getLogger("RecordReplay"))
{} {}
RecordReplayPlugin::~RecordReplayPlugin() = default; RecordReplayPlugin::~RecordReplayPlugin() = default;
@@ -465,7 +476,7 @@ std::map<QString, std::vector<RecordReplayPlugin::RecSnapshot>> RecordReplayPlug
{ {
// the current snapshot data does not match the starting time -> reread m_{{ dt.nameFlc }}Keys // the current snapshot data does not match the starting time -> reread m_{{ dt.nameFlc }}Keys
readLastSnapshotKeysFor{{ dt.name }}(q, nextSampleTime); readLastSnapshotKeysFor{{ dt.name }}(q, nextSampleTime);
//DEBUG_LOG(*m_logger) << "fromTime: " << fromTime << ", m_snapshotParticipantMapTime: " << m_snapshotParticipantMapTime //DEBUG_LOG(m_logger) << "fromTime: " << fromTime << ", m_snapshotParticipantMapTime: " << m_snapshotParticipantMapTime
// << " - rereading snapshot times! Map now contains " << m_snapshot{{ dt.name }}Map.size() << " entries"; // << " - rereading snapshot times! Map now contains " << m_snapshot{{ dt.name }}Map.size() << " entries";
} }
@@ -541,7 +552,7 @@ bool RecordReplayPlugin::write{{ dt.name }}(NSqlQuery &q, QHash<QString, qint64>
if (m_dtc{{ dt.name }}->hasSamples()) if (m_dtc{{ dt.name }}->hasSamples())
{ {
TRACE_LOG(*m_logger) << "m_dtc{{ dt.name }}->hasSamples() == true "; TRACE_LOG(m_logger) << "m_dtc{{ dt.name }}->hasSamples() == true ";
const QString stmt(QStringLiteral("INSERT INTO ") + getTableName(QStringLiteral("{{ dt.recTable.name }}"), m_bCanHandleSchemasWrite) + const QString stmt(QStringLiteral("INSERT INTO ") + getTableName(QStringLiteral("{{ dt.recTable.name }}"), m_bCanHandleSchemasWrite) +
QStringLiteral(" ( dds_is_alive, {% for row in dt.recTable.cppMember %} {{ row.dbColumnName }}{% if not forloop.last %}, {% endif %}{% endfor %}) VALUES " QStringLiteral(" ( dds_is_alive, {% for row in dt.recTable.cppMember %} {{ row.dbColumnName }}{% if not forloop.last %}, {% endif %}{% endfor %}) VALUES "
@@ -551,11 +562,11 @@ bool RecordReplayPlugin::write{{ dt.name }}(NSqlQuery &q, QHash<QString, qint64>
return false; return false;
dds::sub::LoanedSamples<DATA> samples = m_dtc{{ dt.name }}->takeAlive(); dds::sub::LoanedSamples<DATA> samples = m_dtc{{ dt.name }}->takeAlive();
TRACE_LOG(*m_logger) << "samples count: " << samples.length(); TRACE_LOG(m_logger) << "samples count: " << samples.length();
for (const auto &sample : samples) for (const auto &sample : samples)
{ {
const DATA &data = sample.data(); const DATA &data = sample.data();
INFO_LOG(*m_logger) << "m_dtc{{ dt.name }} {{ dt.recTable.ddsKey.cppMemberName }}: " << data.{{ dt.recTable.ddsKey.cppMemberName }}(); INFO_LOG(m_logger) << "m_dtc{{ dt.name }} {{ dt.recTable.ddsKey.cppMemberName }}: " << data.{{ dt.recTable.ddsKey.cppMemberName }};
{% for row in dt.recTable.cppMember %} {% for row in dt.recTable.cppMember %}
q.bindValue(QStringLiteral(":{{ row.dbColumnName }}"), {{ row.ddsToQVariant }}); q.bindValue(QStringLiteral(":{{ row.dbColumnName }}"), {{ row.ddsToQVariant }});
@@ -565,7 +576,10 @@ bool RecordReplayPlugin::write{{ dt.name }}(NSqlQuery &q, QHash<QString, qint64>
if (!q.exec()) if (!q.exec())
return false; return false;
minRecordSampleTime = std::min(minRecordSampleTime, data.sampleTime()); // rtiddsgen 4.7 declares sample_time as int64_t (long), while the record
// boundary is qint64 (long long); std::min requires both arguments to be
// the same type, so narrow the generated member explicitly.
minRecordSampleTime = std::min(minRecordSampleTime, static_cast<qint64>(data.sampleTime));
} }
} }
@@ -579,7 +593,7 @@ bool RecordReplayPlugin::write{{ dt.name }}(NSqlQuery &q, QHash<QString, qint64>
if (!q.prepare(stmt)) if (!q.prepare(stmt))
return false; return false;
DEBUG_LOG(*m_logger) << "disposedSamples count: " << disposedSamples.length(); DEBUG_LOG(m_logger) << "disposedSamples count: " << disposedSamples.length();
auto dr = m_dtc{{ dt.name }}->dataReader()->dataReader(); auto dr = m_dtc{{ dt.name }}->dataReader()->dataReader();
{{ dt.name }} data; {{ dt.name }} data;
for (const auto &sample : disposedSamples) for (const auto &sample : disposedSamples)
@@ -615,12 +629,12 @@ bool RecordReplayPlugin::readLastSnapshotFor{{ dt.name }}(NSqlQuery &q, qint64 s
if (!q.exec(stmt)) if (!q.exec(stmt))
{ {
ERROR_LOG(*m_logger) << "Error while fetch max(time_stamp) for topic {{ dt.name }}"; ERROR_LOG(m_logger) << "Error while fetch max(time_stamp) for topic {{ dt.name }}";
return false; return false;
} }
if (!q.next() || q.value(0).isNull()) if (!q.next() || q.value(0).isNull())
{ {
INFO_LOG(*m_logger) << "No snapshot available for topic {{ dt.name }}"; INFO_LOG(m_logger) << "No snapshot available for topic {{ dt.name }}";
return true; return true;
} }
const qint64 idSnapshot = q.value(0).toLongLong(); const qint64 idSnapshot = q.value(0).toLongLong();
@@ -645,10 +659,10 @@ bool RecordReplayPlugin::readLastSnapshotFor{{ dt.name }}(NSqlQuery &q, qint64 s
{% endfor %} {% endfor %}
if (bIsAlive) if (bIsAlive)
m_{{ dt.nameFlc }}Map.insert(data.sampleTime(), data); m_{{ dt.nameFlc }}Map.insert(data.sampleTime, data);
else else
m_{{ dt.nameFlc }}DisposedMap.insert(data.sampleTime(), data); m_{{ dt.nameFlc }}DisposedMap.insert(data.sampleTime, data);
m_{{ dt.nameFlc }}Keys.insert(data.{{ dt.key.name }}()); m_{{ dt.nameFlc }}Keys.insert(data.{{ dt.key.name }});
} }
m_snapshot{{ dt.name }}MapTime = timeSnapshot; m_snapshot{{ dt.name }}MapTime = timeSnapshot;
@@ -677,10 +691,10 @@ bool RecordReplayPlugin::read{{ dt.name }}(NSqlQuery &q, qint64 fromTime, qint64
{% endfor %} {% endfor %}
if (bIsAlive) if (bIsAlive)
m_{{ dt.nameFlc }}Map.insert(data.sampleTime(), data); m_{{ dt.nameFlc }}Map.insert(data.sampleTime, data);
else else
m_{{ dt.nameFlc }}DisposedMap.insert(data.sampleTime(), data); m_{{ dt.nameFlc }}DisposedMap.insert(data.sampleTime, data);
m_{{ dt.nameFlc }}Keys.insert(data.{{ dt.key.name }}()); m_{{ dt.nameFlc }}Keys.insert(data.{{ dt.key.name }});
} }
return true; return true;
} }
@@ -693,7 +707,7 @@ bool RecordReplayPlugin::updateSnapshotKeys{{ dt.name }}(NSqlQuery &q, qint64 fr
QStringLiteral(" AND sample_time <= ") + QString::number(toTime) + QStringLiteral(" AND sample_time <= ") + QString::number(toTime) +
QStringLiteral(" ORDER BY sample_time ")); QStringLiteral(" ORDER BY sample_time "));
DEBUG_LOG(*m_logger) << "stmt: " << stmt; DEBUG_LOG(m_logger) << "stmt: " << stmt;
if (!q.exec(stmt)) if (!q.exec(stmt))
return false; return false;
@@ -705,13 +719,13 @@ bool RecordReplayPlugin::updateSnapshotKeys{{ dt.name }}(NSqlQuery &q, qint64 fr
const bool isAlive = q.value(2).toBool(); const bool isAlive = q.value(2).toBool();
if (isAlive) if (isAlive)
{ {
DEBUG_LOG(*m_logger) << "INSERT {{ dt.name }} key: " << key << ", pk: " << pk << ", isAlive: " << isAlive; DEBUG_LOG(m_logger) << "INSERT {{ dt.name }} key: " << key << ", pk: " << pk << ", isAlive: " << isAlive;
m_snapshot{{ dt.name }}Map[key] = pk; m_snapshot{{ dt.name }}Map[key] = pk;
m_{{ dt.nameFlc }}Keys.insert(key); m_{{ dt.nameFlc }}Keys.insert(key);
} }
else else
{ {
DEBUG_LOG(*m_logger) << "REMOVE {{ dt.name }} key: " << key << ", pk: " << pk << ", isAlive: " << isAlive; DEBUG_LOG(m_logger) << "REMOVE {{ dt.name }} key: " << key << ", pk: " << pk << ", isAlive: " << isAlive;
m_snapshot{{ dt.name }}Map.erase(key); m_snapshot{{ dt.name }}Map.erase(key);
m_{{ dt.nameFlc }}Keys.erase(key); m_{{ dt.nameFlc }}Keys.erase(key);
} }
@@ -720,7 +734,7 @@ bool RecordReplayPlugin::updateSnapshotKeys{{ dt.name }}(NSqlQuery &q, qint64 fr
// new validity time for snapshot data // new validity time for snapshot data
m_snapshot{{ dt.name }}MapTime = toTime; m_snapshot{{ dt.name }}MapTime = toTime;
DEBUG_LOG(*m_logger) << "updateSnapshotKeys{{ dt.name }}(" << fromTime << ", " << toTime << ") = " DEBUG_LOG(m_logger) << "updateSnapshotKeys{{ dt.name }}(" << fromTime << ", " << toTime << ") = "
<< m_snapshot{{ dt.name }}Map.size(); << m_snapshot{{ dt.name }}Map.size();
return true; return true;
@@ -737,13 +751,13 @@ bool RecordReplayPlugin::readLastSnapshotKeysFor{{ dt.name }}(NSqlQuery &q, qint
return false; return false;
if (!q.next() || q.value(0).isNull()) if (!q.next() || q.value(0).isNull())
{ {
DEBUG_LOG(*m_logger) << "no snapshot entry for {{ dt.name }} found"; DEBUG_LOG(m_logger) << "no snapshot entry for {{ dt.name }} found";
return true; return true;
} }
m_snapshot{{ dt.name }}Map = LtsUtils::BigintArray2D::fromPgString(q.value(0).toString())(); m_snapshot{{ dt.name }}Map = LtsUtils::BigintArray2D::fromPgString(q.value(0).toString())();
DEBUG_LOG(*m_logger) << "Map size {{ dt.name }}: " << m_snapshot{{ dt.name }}Map.size(); DEBUG_LOG(m_logger) << "Map size {{ dt.name }}: " << m_snapshot{{ dt.name }}Map.size();
return true; return true;
} }
@@ -758,7 +772,7 @@ qint64 RecordReplayPlugin::getNextSampleTimeFor{{ dt.name }}(NSqlQuery &q, qint6
if (q.execAndFetch(stmt) && !q.value(0).isNull()) if (q.execAndFetch(stmt) && !q.value(0).isNull())
ret = q.value(0).toLongLong(); ret = q.value(0).toLongLong();
DEBUG_LOG(*m_logger) << "next min sampleTime for {{ dt.name }} is " << ret << " (> " << fromTime << ")"; DEBUG_LOG(m_logger) << "next min sampleTime for {{ dt.name }} is " << ret << " (> " << fromTime << ")";
return ret; return ret;
} }
@@ -795,7 +809,7 @@ void RecordReplayPlugin::clearData{{ dt.name }}()
{{ dt.name }} tmpData; {{ dt.name }} tmpData;
for (auto key : m_{{ dt.nameFlc }}Keys) for (auto key : m_{{ dt.nameFlc }}Keys)
{ {
tmpData.{{ dt.key.name }}(key); tmpData.{{ dt.key.name }} = key;
m_dts{{ dt.name }}->remove(tmpData); m_dts{{ dt.name }}->remove(tmpData);
} }
} }
@@ -812,12 +826,12 @@ bool RecordReplayPlugin::copyInitialData{{ dt.name }}(NSqlQuery &queryFrom, NSql
if (!queryFrom.exec(stmt)) if (!queryFrom.exec(stmt))
{ {
ERROR_LOG(*m_logger) << "Error while fetch max(time_stamp) for topic {{ dt.name }}"; ERROR_LOG(m_logger) << "Error while fetch max(time_stamp) for topic {{ dt.name }}";
return false; return false;
} }
if (!queryFrom.next() || queryFrom.value(0).isNull()) if (!queryFrom.next() || queryFrom.value(0).isNull())
{ {
INFO_LOG(*m_logger) << "No snapshot available for topic {{ dt.name }}"; INFO_LOG(m_logger) << "No snapshot available for topic {{ dt.name }}";
return true; return true;
} }
const qint64 idSnapshot = queryFrom.value(0).toLongLong(); const qint64 idSnapshot = queryFrom.value(0).toLongLong();
@@ -18,8 +18,10 @@
#include <{{ include_prefix }}/{{ namespace_abbr }}_dts_types.h> #include <{{ include_prefix }}/{{ namespace_abbr }}_dts_types.h>
#include <{{ include_prefix }}/logger.h> #include <{{ include_prefix }}/logger.h>
// TODO: Problem with QT5_WRAP_CPP ... // Resolved from the Lts include root (see include_directories(BEFORE .../Lts)
#include <../../Common/PluginInterfaces/record_replay_plugin.h> // in the root CMakeLists); the old <../../Common/...> spelling only worked
// for in-source builds.
#include <Common/PluginInterfaces/record_replay_plugin.h>
#include <LtsUtilsCore/pgarray.h> #include <LtsUtilsCore/pgarray.h>
@@ -119,7 +121,7 @@ protected:
int64_t m_snapshot{{ dt.name }}MapTime = -1; // time for which the snapshot is valid int64_t m_snapshot{{ dt.name }}MapTime = -1; // time for which the snapshot is valid
{% endif %} {% endfor %} {% endif %} {% endfor %}
NGL::INGLLogger* m_logger; LOGGER_T m_logger;
}; };
} }
@@ -15,8 +15,10 @@
#include <Common/ProjectConfig/project_defines.h> #include <Common/ProjectConfig/project_defines.h>
#include <QtCore/QObject> #include <QtCore/QObject>
// TODO: Problem with QT5_WRAP_CPP ... // Resolved from the Lts include root (see include_directories(BEFORE .../Lts)
#include <../../DDS/Generic/topic_type_plugin.h> // in the root CMakeLists); the old <../../DDS/...> spelling only worked for
// in-source builds because moc/gcc do not resolve it relative to this file.
#include <DDS/Generic/topic_type_plugin.h>
namespace {{ namespace }} namespace {{ namespace }}
{ {
@@ -12,7 +12,7 @@
// filename: {{ namespace_abbr }}_translation.h // filename: {{ namespace_abbr }}_translation.h
#include <string> #include <string>
#include <{{ namespace_abbr }}_enums.hpp> #include <{{ include_prefix }}/{{ namespace_abbr }}_enums.hpp>
#include <{{ include_prefix }}/{{ namespace_abbr }}_export.h> #include <{{ include_prefix }}/{{ namespace_abbr }}_export.h>
class QString; class QString;
@@ -2,7 +2,7 @@
#pragma once #pragma once
#include "ltscoordinate_export.h" #include <LtsCoordinate/ltscoordinate_export.h>
#include <Core/core.hpp> #include <Core/core.hpp>
#include <LtsCoordTrans/lts_coord_trans.h> #include <LtsCoordTrans/lts_coord_trans.h>
@@ -48,7 +48,7 @@ class LTSCOORDINATE_EXPORT LtsCoordVector
utmVectorRef.reserve(m_geo_coordinates.size()); utmVectorRef.reserve(m_geo_coordinates.size());
for (const auto& geoCoord : std::as_const(m_geo_coordinates)) for (const auto& geoCoord : std::as_const(m_geo_coordinates))
utmVectorRef.push_back(LtsCoordTrans::UtmCoordinate::fromGeographic(geoCoord.lon(), geoCoord.lat(), zone)); utmVectorRef.push_back(LtsCoordTrans::UtmCoordinate::fromGeographic(geoCoord.lon, geoCoord.lat, zone));
} }
protected: protected:
@@ -29,13 +29,13 @@ double LtsCoordinate::elevationAt(double defaultElevation, bool* bIsCovered) con
if (!std::isnan(m_elevation)) if (!std::isnan(m_elevation))
return m_elevation; return m_elevation;
if (m_getElevationCB) if (m_getElevationCB)
m_elevation = m_getElevationCB(m_geo.lon(), m_geo.lat(), defaultElevation, bIsCovered); m_elevation = m_getElevationCB(m_geo.lon, m_geo.lat, defaultElevation, bIsCovered);
return m_elevation; return m_elevation;
} }
void LtsCoordinate::setZValueAccordingElevation(double defaultElevation) void LtsCoordinate::setZValueAccordingElevation(double defaultElevation)
{ {
m_geo.z(elevationAt(defaultElevation)); m_geo.z = elevationAt(defaultElevation);
} }
double LtsCoordinate::elevationAt(const LtsCoordinate& coordinate, double defaultElevation, bool* bIsCovered) double LtsCoordinate::elevationAt(const LtsCoordinate& coordinate, double defaultElevation, bool* bIsCovered)
@@ -46,7 +46,7 @@ double LtsCoordinate::elevationAt(const LtsCoordinate& coordinate, double defaul
void LtsCoordinate::replaceZValueByElevationIfValue(double zValueToBeReplaced, double defaultElevation) void LtsCoordinate::replaceZValueByElevationIfValue(double zValueToBeReplaced, double defaultElevation)
{ {
if ((std::isnan(zValueToBeReplaced) && std::isnan(m_geo.z())) || qFuzzyCompare(m_geo.z(), zValueToBeReplaced)) if ((std::isnan(zValueToBeReplaced) && std::isnan(m_geo.z)) || qFuzzyCompare(m_geo.z, zValueToBeReplaced))
setZValueAccordingElevation(defaultElevation); setZValueAccordingElevation(defaultElevation);
} }
@@ -79,7 +79,7 @@ void LtsCoordinate::convertGeoToUtm() const
int zone = -1; int zone = -1;
if (std::isnan(m_geo.lon()) || std::isnan(m_geo.lat())) if (std::isnan(m_geo.lon) || std::isnan(m_geo.lat))
{ {
fprintf(stderr, "Error while fromGeographic, value is NaN\n"); fprintf(stderr, "Error while fromGeographic, value is NaN\n");
m_utm2D = LtsCoordTrans::UtmCoordinate(); m_utm2D = LtsCoordTrans::UtmCoordinate();
@@ -90,7 +90,7 @@ void LtsCoordinate::convertGeoToUtm() const
++s_conversion_counter; ++s_conversion_counter;
#endif #endif
m_utm2D = LtsCoordTrans::UtmCoordinate::fromGeographic(m_geo.lon(), m_geo.lat(), zone); m_utm2D = LtsCoordTrans::UtmCoordinate::fromGeographic(m_geo.lon, m_geo.lat, zone);
Q_ASSERT_X(m_utm2D.zone > 0, "LtsCoordinate", "zone has to be set"); Q_ASSERT_X(m_utm2D.zone > 0, "LtsCoordinate", "zone has to be set");
} }
@@ -2,7 +2,7 @@
#pragma once #pragma once
#include "ltscoordinate_export.h" #include <LtsCoordinate/ltscoordinate_export.h>
#include <Core/core.hpp> #include <Core/core.hpp>
#include <LtsCoordTrans/lts_coord_trans.h> #include <LtsCoordTrans/lts_coord_trans.h>
@@ -35,7 +35,7 @@ class LTSCOORDINATE_EXPORT LtsCoordinate
explicit LtsCoordinate(const Core::GeoPosition& geoPos) : m_geo(geoPos) {} explicit LtsCoordinate(const Core::GeoPosition& geoPos) : m_geo(geoPos) {}
explicit LtsCoordinate(const Core::GeoPosition2D& geoPos2D) : m_geo(geoPos2D.lon(), geoPos2D.lat(), std::nan("")) {} explicit LtsCoordinate(const Core::GeoPosition2D& geoPos2D) : m_geo(geoPos2D.lon, geoPos2D.lat, std::nan("")) {}
LtsCoordinate(const LtsCoordTrans::UtmCoordinate& utm2D, double zValue) = delete; LtsCoordinate(const LtsCoordTrans::UtmCoordinate& utm2D, double zValue) = delete;
@@ -67,7 +67,7 @@ class LTSCOORDINATE_EXPORT LtsCoordinate
bool hasGeo() const bool hasGeo() const
{ {
return !(valueIsNullOrNan(m_geo.lon()) || valueIsNullOrNan(m_geo.lat())); return !(valueIsNullOrNan(m_geo.lon) || valueIsNullOrNan(m_geo.lat));
} }
bool hasUtm() const bool hasUtm() const
@@ -95,7 +95,7 @@ class LTSCOORDINATE_EXPORT LtsCoordinate
Core::GeoPosition2D geoPosition2D() const Core::GeoPosition2D geoPosition2D() const
{ {
return Core::GeoPosition2D(m_geo.longitude, m_geo.latitude); return Core::GeoPosition2D(m_geo.lon, m_geo.lat);
} }
const LtsCoordTrans::UtmCoordinate& utmCoordinate() const const LtsCoordTrans::UtmCoordinate& utmCoordinate() const
@@ -107,23 +107,23 @@ class LTSCOORDINATE_EXPORT LtsCoordinate
double& rz() double& rz()
{ {
return m_geo.altitude; return m_geo.z;
} }
double z() const double z() const
{ {
return m_geo.z(); return m_geo.z;
} }
void setZ(double value) void setZ(double value)
{ {
m_geo.z(value); m_geo.z = value;
} }
LtsCoordTrans::UtmCoordinate utmCoordinateDiffZone(int zone) const LtsCoordTrans::UtmCoordinate utmCoordinateDiffZone(int zone) const
{ {
m_utm2D_differentZone = LtsCoordTrans::UtmCoordinate::fromGeographic(m_geo.lon(), m_geo.lat(), zone); m_utm2D_differentZone = LtsCoordTrans::UtmCoordinate::fromGeographic(m_geo.lon, m_geo.lat, zone);
return m_utm2D_differentZone; return m_utm2D_differentZone;
} }
@@ -146,17 +146,17 @@ class LTSCOORDINATE_EXPORT LtsCoordinate
QPointF toGeoPointF() const QPointF toGeoPointF() const
{ {
return QPointF(m_geo.lon(), m_geo.lat()); return QPointF(m_geo.lon, m_geo.lat);
} }
QPoint3D toGeoPoint3D() const QPoint3D toGeoPoint3D() const
{ {
return QPoint3D(m_geo.lon(), m_geo.lat(), m_geo.z()); return QPoint3D(m_geo.lon, m_geo.lat, m_geo.z);
} }
UtmCoordinate3D toUtmCoordinate3D() const UtmCoordinate3D toUtmCoordinate3D() const
{ {
return UtmCoordinate3D(utmCoordinate(), m_geo.z()); return UtmCoordinate3D(utmCoordinate(), m_geo.z);
} }
using elevationCbFunc = std::function<double(double, double, double, bool*)>; using elevationCbFunc = std::function<double(double, double, double, bool*)>;
@@ -174,7 +174,7 @@ class LTSCOORDINATE_EXPORT LtsCoordinate
double heightOverElevation() const double heightOverElevation() const
{ {
return m_geo.z() - elevationAt(); return m_geo.z - elevationAt();
} }
double distanceUtm2D(const LtsCoordinate& other) const double distanceUtm2D(const LtsCoordinate& other) const
@@ -203,13 +203,13 @@ class LTSCOORDINATE_EXPORT LtsCoordinate
void clearGeo() const void clearGeo() const
{ {
clearGeoLonLat(); clearGeoLonLat();
m_geo.z(std::nan("")); m_geo.z = std::nan("");
} }
void clearGeoLonLat() const void clearGeoLonLat() const
{ {
m_geo.lon(0); m_geo.lon = 0;
m_geo.lat(0); m_geo.lat = 0;
} }
void clearUtm() const void clearUtm() const
@@ -245,7 +245,7 @@ class LTSCOORDINATE_EXPORT LtsCoordinate
const auto& utmTemp = utmCoordinateInternal(zone); const auto& utmTemp = utmCoordinateInternal(zone);
pntRef.rx() = utmTemp.x; pntRef.rx() = utmTemp.x;
pntRef.ry() = utmTemp.y; pntRef.ry() = utmTemp.y;
pntRef.rz() = m_geo.z(); pntRef.rz() = m_geo.z;
} }
protected: protected:
@@ -31,9 +31,6 @@ if(QT6_GUI_AVAILABLE)
PRIVATE PRIVATE
NGLLogger NGLLogger
## LtsSessionDataDds ## LtsSessionDataDds
## ExmDataPluginInterface # External dependency - missing
## situationMapCommon # External dependency - missing
## situationMapElevationMap # External dependency - missing
PUBLIC PUBLIC
LtsUtilsCoreHeaderOnly LtsUtilsCoreHeaderOnly
Qt6::Core Qt6::Core
@@ -42,7 +39,14 @@ if(QT6_GUI_AVAILABLE)
endif() endif()
if(BUILD_RTI) if(BUILD_RTI)
target_link_libraries(LtsElevation PRIVATE AsmDataPluginInterface) # All ElevationMapManager / resource_path / exm-dtc usages live inside
# #ifdef BUILD_RTI in lts_elevation_manager.cpp (Qt5 dependencies restored).
target_link_libraries(LtsElevation PRIVATE
AsmDataPluginInterface
ExmDataPluginInterface
situationMapCommon
situationMapElevationMap
)
endif() endif()
ADD_SUBDIRECTORY(UnitTest_Elevation) ADD_SUBDIRECTORY(UnitTest_Elevation)
@@ -6,6 +6,12 @@
#include <AssetManagement/asm_data_plugin_interface.h> #include <AssetManagement/asm_data_plugin_interface.h>
#include <ExerciseManagement/exm_data_plugin_interface.h> #include <ExerciseManagement/exm_data_plugin_interface.h>
#include <Viewer/SituationMap/ElevationMap/elevation_map_manager.h> #include <Viewer/SituationMap/ElevationMap/elevation_map_manager.h>
#include <Viewer/SituationMap/Common/resource_path.h>
#include <QDir>
#include <QHash>
#include <QSharedPointer>
#include <QUrl>
static_assert((int)SituationMap::ElevationMapManager::LineOfSight::LOS_UNDEFINED == static_assert((int)SituationMap::ElevationMapManager::LineOfSight::LOS_UNDEFINED ==
(int)LtsElevation::LineOfSight::LOS_UNDEFINED, (int)LtsElevation::LineOfSight::LOS_UNDEFINED,
@@ -106,15 +112,71 @@ LtsElevationManager::createInstance(int exerciseId, const std::shared_ptr<Exerci
return nullptr; return nullptr;
} }
QStringList filePaths_rough_to_fine; // Qt5 logic restored (the qt6 port had dropped the exerciseId->trainingAreaId
// caching and always returned nullptr here).
#ifdef BUILD_RTI #ifdef BUILD_RTI
filePaths_rough_to_fine = getFilenamesForExercise(exerciseId); int trainingAreaId = -1;
// remember for future calls
// (so createInstance should work WITHOUT dtcs)
// Idea: MainHandler: createInstance with exerciseId and valid dtcs
// Plugin or simular: createInstance with exerciseId and no dtcs
static QHash<int, int> s_exIdToTaIdStore;
const auto exTaIt = s_exIdToTaIdStore.find(exerciseId);
if (exTaIt != s_exIdToTaIdStore.end())
{
// CASE 1:
// already created:
trainingAreaId = *exTaIt;
}
else
{
// CASE 2:
// ... or create on demand:
if (!exmDtc || !asmDtc)
{
ERROR_LOG(logger) << Q_FUNC_INFO << " no dtcs for exerciseId=" << exerciseId
<< ", asmDtc=" << asmDtc
<< ", exmDtc=" << exmDtc;
return nullptr;
}
// exId to taId
trainingAreaId = exerciseIdToTrainingAreaId(exerciseId, exmDtc);
if (trainingAreaId <= 0)
{
ERROR_LOG(logger) << Q_FUNC_INFO << " Error getting trainingAreaId"
<< ", exerciseId=" << exerciseId
<< ", trainingAreaId=" << trainingAreaId;
return nullptr;
}
// store and remember:
s_exIdToTaIdStore[exerciseId] = trainingAreaId;
}
// CASE 1: Following should work even with invalid asmDtc:
LTS_ELEVATION_MANAGER_TYPE temp = createInstanceForTrainingAreaId(trainingAreaId, asmDtc);
if (!temp)
{
ERROR_LOG(logger) << Q_FUNC_INFO << " Error on createInstanceForTrainingAreaId"
<< ", exerciseId=" << exerciseId
<< ", trainingAreaId=" << trainingAreaId;
return nullptr;
}
// add exmDtc
temp->initDDS(exmDtc, asmDtc);
TRACE_LOG(logger) << Q_FUNC_INFO << " END, exerciseId=" << exerciseId;
return temp;
#else #else
Q_UNUSED(exerciseId); Q_UNUSED(exmDtc);
ERROR_LOG(logger) << Q_FUNC_INFO << " BUILD_RTI=OFF, cannot get filenames for exercise"; Q_UNUSED(asmDtc);
#endif ERROR_LOG(logger) << Q_FUNC_INFO << " BUILD_RTI=OFF, cannot create instance";
Q_UNUSED(filePaths_rough_to_fine);
return nullptr; return nullptr;
#endif
} }
LTS_ELEVATION_MANAGER_TYPE LtsElevationManager::getInstance(int exerciseId) LTS_ELEVATION_MANAGER_TYPE LtsElevationManager::getInstance(int exerciseId)
@@ -291,19 +353,19 @@ QStringList LtsElevationManager::getFilenamesForTrainingArea(int trainingAreaId)
{ {
d->m_asmDtc->waitForHistoricalDataTrainingArea(1000); d->m_asmDtc->waitForHistoricalDataTrainingArea(1000);
const AssetManagement::TrainingArea& ta = d->m_asmDtc->trainingArea(trainingAreaId); const AssetManagement::TrainingArea& ta = d->m_asmDtc->trainingArea(trainingAreaId);
if (ta.id() != trainingAreaId) if (ta.id != trainingAreaId)
{ {
ERROR_LOG(m_logger) << Q_FUNC_INFO << " Error on s_asmDtc->trainingArea" ERROR_LOG(m_logger) << Q_FUNC_INFO << " Error on s_asmDtc->trainingArea"
<< ", trainingAreaId=" << trainingAreaId; << ", trainingAreaId=" << trainingAreaId;
return {}; return {};
} }
const std::vector<AssetManagement::MapDescription>& mdVec = ta.elevation(); const std::vector<AssetManagement::MapDescription>& mdVec = ta.elevation;
filePaths_rough_to_fine.reserve(mdVec.size()); filePaths_rough_to_fine.reserve(mdVec.size());
for (const AssetManagement::MapDescription& md : std::as_const(mdVec)) for (const AssetManagement::MapDescription& md : std::as_const(mdVec))
{ {
QUrl url(QString::fromStdString(md.url())); QUrl url(QString::fromStdString(md.url));
QString filePathAbs = url.toLocalFile(); QString filePathAbs = url.toLocalFile();
if (QDir::isRelativePath(filePathAbs)) if (QDir::isRelativePath(filePathAbs))
filePathAbs = SituationMap::getResourcePath() + QStringLiteral("/elevation/") + filePathAbs; filePathAbs = SituationMap::getResourcePath() + QStringLiteral("/elevation/") + filePathAbs;
@@ -372,13 +434,13 @@ int LtsElevationManager::exerciseIdToTrainingAreaId(int exerciseId,
exmDtc->waitForHistoricalDataExercise(1000); exmDtc->waitForHistoricalDataExercise(1000);
const ExerciseManagement::Exercise& exm = exmDtc->exercise(exerciseId); const ExerciseManagement::Exercise& exm = exmDtc->exercise(exerciseId);
if (exm.id() != exerciseId) if (exm.id != exerciseId)
{ {
ERROR_LOG(logger) << Q_FUNC_INFO << " Error on m_exmDtc->exercise" ERROR_LOG(logger) << Q_FUNC_INFO << " Error on m_exmDtc->exercise"
<< ", exerciseId=" << exerciseId; << ", exerciseId=" << exerciseId;
return -1; return -1;
} }
trainingAreaId = exm.trainingAreaId(); trainingAreaId = exm.trainingAreaId;
if (trainingAreaId <= 0) if (trainingAreaId <= 0)
{ {
@@ -252,22 +252,22 @@ void LtsLogin::logoff()
QString cmd; QString cmd;
switch (m_shutdownAction.underlying()) switch (m_shutdownAction.underlying())
{ {
case AssetManagement::ShutdownAction_def::Shutdown: case AssetManagement::ShutdownAction::Shutdown:
#ifdef LTS_DEBUG #ifdef LTS_DEBUG
cmd = QStringLiteral("xeyes"); cmd = QStringLiteral("xeyes");
#else #else
cmd = QStringLiteral("systemctl poweroff"); cmd = QStringLiteral("systemctl poweroff");
#endif #endif
break; break;
case AssetManagement::ShutdownAction_def::Reboot: case AssetManagement::ShutdownAction::Reboot:
#ifdef LTS_DEBUG #ifdef LTS_DEBUG
cmd = QStringLiteral("kcalc"); cmd = QStringLiteral("kcalc");
#else #else
cmd = QStringLiteral("systemctl reboot"); cmd = QStringLiteral("systemctl reboot");
#endif #endif
break; break;
case AssetManagement::ShutdownAction_def::Logout: case AssetManagement::ShutdownAction::Logout:
case AssetManagement::ShutdownAction_def::NoAction: case AssetManagement::ShutdownAction::NoAction:
emit signalLogoffDone(); emit signalLogoffDone();
break; break;
} }
@@ -293,7 +293,9 @@ bool LtsPluginLoader::loadPlugins(PluginType requestedPluginType,
} }
const QString jsonIid = iid.value().toString().toLower(); // LOWERCASE ! (pun intended) const QString jsonIid = iid.value().toString().toLower(); // LOWERCASE ! (pun intended)
const QVector<QStringRef> iidParameters = jsonIid.splitRef(QLatin1Char(':')); // Qt6: QStringRef/QString::splitRef were removed; QStringView::split
// provides the same zero-copy tokenization.
const QList<QStringView> iidParameters = QStringView{jsonIid}.split(QLatin1Char(':'));
DEBUG_LOG(logger) << "Plugin " << absoluteFilePath << " provides iid '" << jsonIid; DEBUG_LOG(logger) << "Plugin " << absoluteFilePath << " provides iid '" << jsonIid;
@@ -20,7 +20,7 @@ void add(qint64 time_offset)
time += time_offset; time += time_offset;
ttm->addTestEvent(new LtsTimelineClassic::Event( ttm->addTestEvent(new LtsTimelineClassic::Event(
0, (int)ProjectDataManagement::PdmEventType_def::Hit, time, 0, 0, 0, 0, QStringList() << QStringLiteral("Test"), 0, (int)ProjectDataManagement::PdmEventType::EventType_Hit, time, 0, 0, 0, 0, QStringList() << QStringLiteral("Test"),
LtsTimelineClassic::Event::drawCustomEventGraphicEllipse, QColor("green"), QString())); LtsTimelineClassic::Event::drawCustomEventGraphicEllipse, QColor("green"), QString()));
} }
@@ -211,7 +211,7 @@ template <typename T> bool inline get2Byte(const QByteArray& data, T& out)
template <typename T> void inline set1Byte(const T in, QByteArray& out) template <typename T> void inline set1Byte(const T in, QByteArray& out)
{ {
static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd"); static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd");
unsigned char c = in; unsigned char c = static_cast<unsigned char>(in);
out += c; out += c;
} }
@@ -4,6 +4,36 @@
#include <QtCore/QDataStream> #include <QtCore/QDataStream>
using namespace LtsUtils;
double QPoint3D::distanceToLine(const QPoint3D& point, const QPoint3D& direction) const
{
if (direction.isNull())
return (*this - point).length();
QPoint3D p = point + dotProduct(*this - point, direction) * direction;
return (*this - p).length();
}
double QPoint3D::distanceToPlane(const QPoint3D& plane, const QPoint3D& normal) const
{
return dotProduct(*this - plane, normal);
}
double QPoint3D::distanceToPlane(const QPoint3D& plane1, const QPoint3D& plane2, const QPoint3D& plane3) const
{
QPoint3D n = normal(plane2 - plane1, plane3 - plane1);
return dotProduct(*this - plane1, n);
}
double QPoint3D::distanceToPoint(const QPoint3D& point) const
{
return (*this - point).length();
}
// The header declares these operators inside namespace LtsUtils; they must
// be defined there too (a `using` directive does not place definitions
// into a namespace). Qt6's QDataStreamOperatorForType metatype machinery
// references the LtsUtils-scoped symbols explicitly.
namespace LtsUtils namespace LtsUtils
{ {
@@ -6,7 +6,6 @@
#include <QtCore/qglobal.h> #include <QtCore/qglobal.h>
#include <QtCore/qpoint.h> #include <QtCore/qpoint.h>
#include <QtCore/qdatastream.h>
#include <cmath> #include <cmath>
#include <sstream> #include <sstream>
@@ -18,8 +17,8 @@ class QPoint3D
public: public:
enum class Axis { X, Y, Z }; enum class Axis { X, Y, Z };
constexpr QPoint3D() = default; Q_DECL_CONSTEXPR QPoint3D() = default;
constexpr QPoint3D(double xpos, double ypos, double zpos); Q_DECL_CONSTEXPR QPoint3D(double xpos, double ypos, double zpos);
template <typename T> explicit QPoint3D(const T& data) : xp(data.offsetX()), yp(data.offsetY()), zp(data.offsetZ()) template <typename T> explicit QPoint3D(const T& data) : xp(data.offsetX()), yp(data.offsetY()), zp(data.offsetZ())
{ {
@@ -27,18 +26,18 @@ class QPoint3D
inline bool isNull() const; inline bool isNull() const;
constexpr inline double x() const; Q_DECL_CONSTEXPR inline double x() const;
constexpr inline double y() const; Q_DECL_CONSTEXPR inline double y() const;
constexpr inline double z() const; Q_DECL_CONSTEXPR inline double z() const;
constexpr inline void setX(double xpos); Q_DECL_RELAXED_CONSTEXPR inline void setX(double xpos);
constexpr inline void setY(double ypos); Q_DECL_RELAXED_CONSTEXPR inline void setY(double ypos);
constexpr inline void setZ(double zpos); Q_DECL_RELAXED_CONSTEXPR inline void setZ(double zpos);
constexpr inline double& rx(); Q_DECL_RELAXED_CONSTEXPR inline double& rx();
constexpr inline double& ry(); Q_DECL_RELAXED_CONSTEXPR inline double& ry();
constexpr inline double& rz(); Q_DECL_RELAXED_CONSTEXPR inline double& rz();
constexpr inline QPointF toPointF() const; Q_DECL_CONSTEXPR inline QPointF toPointF() const;
static QPoint3D fromQPointF(const QPointF& p) static QPoint3D fromQPointF(const QPointF& p)
{ {
@@ -116,56 +115,40 @@ class QPoint3D
return p; return p;
} }
inline double distanceToLine(const QPoint3D& point, const QPoint3D& direction) const inline double distanceToLine(const QPoint3D& point, const QPoint3D& direction) const;
{ inline double distanceToPlane(const QPoint3D& plane, const QPoint3D& normal) const;
if (direction.isNull()) inline double distanceToPlane(const QPoint3D& plane1, const QPoint3D& plane2, const QPoint3D& plane3) const;
return (*this - point).length(); inline double distanceToPoint(const QPoint3D& point) const;
QPoint3D p = point + dotProduct(*this - point, direction) * direction;
return (*this - p).length();
}
inline double distanceToPlane(const QPoint3D& plane, const QPoint3D& normal) const
{
return dotProduct(*this - plane, normal);
}
inline double distanceToPlane(const QPoint3D& plane1, const QPoint3D& plane2, const QPoint3D& plane3) const
{
QPoint3D n = normal(plane2 - plane1, plane3 - plane1);
return dotProduct(*this - plane1, n);
}
inline double distanceToPoint(const QPoint3D& point) const
{
return (*this - point).length();
}
friend constexpr inline bool operator==(const QPoint3D& p1, const QPoint3D& p2); friend Q_DECL_CONSTEXPR inline bool operator==(const QPoint3D& p1, const QPoint3D& p2);
friend constexpr inline bool operator!=(const QPoint3D& p1, const QPoint3D& p2); friend Q_DECL_CONSTEXPR inline bool operator!=(const QPoint3D& p1, const QPoint3D& p2);
friend constexpr inline QPoint3D operator+(const QPoint3D& p1, const QPoint3D& p2) friend Q_DECL_CONSTEXPR inline QPoint3D operator+(const QPoint3D& p1, const QPoint3D& p2)
{ {
return QPoint3D(p1.xp + p2.xp, p1.yp + p2.yp, p1.zp + p2.zp); return QPoint3D(p1.xp + p2.xp, p1.yp + p2.yp, p1.zp + p2.zp);
} }
friend constexpr inline QPoint3D operator-(const QPoint3D& p1, const QPoint3D& p2) friend Q_DECL_CONSTEXPR inline QPoint3D operator-(const QPoint3D& p1, const QPoint3D& p2)
{ {
return QPoint3D(p1.xp - p2.xp, p1.yp - p2.yp, p1.zp - p2.zp); return QPoint3D(p1.xp - p2.xp, p1.yp - p2.yp, p1.zp - p2.zp);
} }
friend constexpr inline QPoint3D operator*(const QPoint3D& p1, double factor) friend Q_DECL_CONSTEXPR inline QPoint3D operator*(const QPoint3D& p1, double factor)
{ {
return QPoint3D(p1.xp * factor, p1.yp * factor, p1.zp * factor); return QPoint3D(p1.xp * factor, p1.yp * factor, p1.zp * factor);
} }
friend constexpr inline QPoint3D operator*(double factor, const QPoint3D& p1) friend Q_DECL_CONSTEXPR inline QPoint3D operator*(double factor, const QPoint3D& p1)
{ {
return QPoint3D(p1.xp * factor, p1.yp * factor, p1.zp * factor); return QPoint3D(p1.xp * factor, p1.yp * factor, p1.zp * factor);
} }
friend constexpr inline QPoint3D operator/(const QPoint3D& p1, double factor) friend Q_DECL_CONSTEXPR inline QPoint3D operator/(const QPoint3D& p1, double factor)
{ {
return QPoint3D(p1.xp / factor, p1.yp / factor, p1.zp / factor); return QPoint3D(p1.xp / factor, p1.yp / factor, p1.zp / factor);
} }
constexpr inline QPoint3D& operator+=(const QPoint3D& o) Q_DECL_RELAXED_CONSTEXPR inline QPoint3D& operator+=(const QPoint3D& o)
{ {
xp += o.xp; xp += o.xp;
yp += o.yp; yp += o.yp;
@@ -173,7 +156,7 @@ class QPoint3D
return *this; return *this;
} }
constexpr inline QPoint3D& operator-=(const QPoint3D& o) Q_DECL_RELAXED_CONSTEXPR inline QPoint3D& operator-=(const QPoint3D& o)
{ {
xp -= o.xp; xp -= o.xp;
yp -= o.yp; yp -= o.yp;
@@ -181,7 +164,7 @@ class QPoint3D
return *this; return *this;
} }
constexpr inline QPoint3D& operator*=(double factor) Q_DECL_RELAXED_CONSTEXPR inline QPoint3D& operator*=(double factor)
{ {
xp *= factor; xp *= factor;
yp *= factor; yp *= factor;
@@ -189,7 +172,7 @@ class QPoint3D
return *this; return *this;
} }
constexpr inline QPoint3D& operator/=(double divisor) Q_DECL_RELAXED_CONSTEXPR inline QPoint3D& operator/=(double divisor)
{ {
xp /= divisor; xp /= divisor;
yp /= divisor; yp /= divisor;
@@ -197,12 +180,12 @@ class QPoint3D
return *this; return *this;
} }
constexpr static inline double dotProduct(const QPoint3D& v1, const QPoint3D& v2) Q_DECL_CONSTEXPR static inline double dotProduct(const QPoint3D& v1, const QPoint3D& v2)
{ {
return v1.xp * v2.xp + v1.yp * v2.yp + v1.zp * v2.zp; return v1.xp * v2.xp + v1.yp * v2.yp + v1.zp * v2.zp;
} }
constexpr static inline QPoint3D crossProduct(const QPoint3D& v1, const QPoint3D& v2) Q_DECL_CONSTEXPR static inline QPoint3D crossProduct(const QPoint3D& v1, const QPoint3D& v2)
{ {
return QPoint3D(v1.yp * v2.zp - v1.zp * v2.yp, v1.zp * v2.xp - v1.xp * v2.zp, v1.xp * v2.yp - v1.yp * v2.xp); return QPoint3D(v1.yp * v2.zp - v1.zp * v2.yp, v1.zp * v2.xp - v1.xp * v2.zp, v1.xp * v2.yp - v1.yp * v2.xp);
} }
@@ -217,10 +200,7 @@ class QPoint3D
return crossProduct((v2 - v1), (v3 - v1)).normalized(); return crossProduct((v2 - v1), (v3 - v1)).normalized();
} }
friend inline bool qFuzzyCompare(const QPoint3D& v1, const QPoint3D& v2) Q_DECL_CONSTEXPR friend inline bool qFuzzyCompare(const QPoint3D& v1, const QPoint3D& v2);
{
return ::qFuzzyCompare(v1.xp, v2.xp) && ::qFuzzyCompare(v1.yp, v2.yp) && ::qFuzzyCompare(v1.zp, v2.zp);
}
private: private:
double xp = 0; double xp = 0;
@@ -228,76 +208,81 @@ class QPoint3D
double zp = 0; double zp = 0;
}; };
// QDataStream& operator<<(QDataStream& s, const QPoint3D& p); LTSUTILSCORE_EXPORT QDataStream& operator<<(QDataStream& s, const QPoint3D& p);
// QDataStream& operator>>(QDataStream& s, QPoint3D& p); LTSUTILSCORE_EXPORT QDataStream& operator>>(QDataStream& s, QPoint3D& p);
constexpr inline QPoint3D::QPoint3D(double xpos, double ypos, double zpos) : xp(xpos), yp(ypos), zp(zpos) {} Q_DECL_CONSTEXPR inline QPoint3D::QPoint3D(double xpos, double ypos, double zpos) : xp(xpos), yp(ypos), zp(zpos) {}
inline bool QPoint3D::isNull() const inline bool QPoint3D::isNull() const
{ {
return qIsNull(xp) && qIsNull(yp) && qIsNull(zp); return qIsNull(xp) && qIsNull(yp) && qIsNull(zp);
} }
constexpr inline double QPoint3D::x() const Q_DECL_CONSTEXPR inline double QPoint3D::x() const
{ {
return xp; return xp;
} }
constexpr inline double QPoint3D::y() const Q_DECL_CONSTEXPR inline double QPoint3D::y() const
{ {
return yp; return yp;
} }
constexpr inline double QPoint3D::z() const Q_DECL_CONSTEXPR inline double QPoint3D::z() const
{ {
return zp; return zp;
} }
constexpr inline void QPoint3D::setX(double xpos) Q_DECL_RELAXED_CONSTEXPR inline void QPoint3D::setX(double xpos)
{ {
xp = xpos; xp = xpos;
} }
constexpr inline void QPoint3D::setY(double ypos) Q_DECL_RELAXED_CONSTEXPR inline void QPoint3D::setY(double ypos)
{ {
yp = ypos; yp = ypos;
} }
constexpr inline void QPoint3D::setZ(double zpos) Q_DECL_RELAXED_CONSTEXPR inline void QPoint3D::setZ(double zpos)
{ {
zp = zpos; zp = zpos;
} }
constexpr inline double& QPoint3D::rx() Q_DECL_RELAXED_CONSTEXPR inline double& QPoint3D::rx()
{ {
return xp; return xp;
} }
constexpr inline double& QPoint3D::ry() Q_DECL_RELAXED_CONSTEXPR inline double& QPoint3D::ry()
{ {
return yp; return yp;
} }
constexpr inline double& QPoint3D::rz() Q_DECL_RELAXED_CONSTEXPR inline double& QPoint3D::rz()
{ {
return zp; return zp;
} }
constexpr inline QPointF QPoint3D::toPointF() const Q_DECL_CONSTEXPR inline QPointF QPoint3D::toPointF() const
{ {
return QPointF(xp, yp); return QPointF(xp, yp);
} }
constexpr inline bool operator==(const QPoint3D& p1, const QPoint3D& p2) Q_DECL_CONSTEXPR inline bool operator==(const QPoint3D& p1, const QPoint3D& p2)
{ {
return p1.xp == p2.xp && p1.yp == p2.yp && p1.zp == p2.zp; return p1.xp == p2.xp && p1.yp == p2.yp && p1.zp == p2.zp;
} }
constexpr inline bool operator!=(const QPoint3D& p1, const QPoint3D& p2) Q_DECL_CONSTEXPR inline bool operator!=(const QPoint3D& p1, const QPoint3D& p2)
{ {
return p1.xp != p2.xp || p1.yp != p2.yp || p1.zp != p2.zp; return p1.xp != p2.xp || p1.yp != p2.yp || p1.zp != p2.zp;
} }
Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QPoint3D& v1, const QPoint3D& v2)
{
return ::qFuzzyCompare(v1.xp, v2.xp) && ::qFuzzyCompare(v1.yp, v2.yp) && ::qFuzzyCompare(v1.zp, v2.zp);
}
inline std::ostream& operator<<(std::ostream& stream, const QPoint3D& pos) inline std::ostream& operator<<(std::ostream& stream, const QPoint3D& pos)
{ {
stream << "(" << pos.x() << "," << pos.y() << "," << pos.z() << ")"; stream << "(" << pos.x() << "," << pos.y() << "," << pos.z() << ")";
@@ -306,4 +291,4 @@ inline std::ostream& operator<<(std::ostream& stream, const QPoint3D& pos)
} // namespace LtsUtils } // namespace LtsUtils
// Q_DECLARE_METATYPE(LtsUtils::QPoint3D) Q_DECLARE_TYPEINFO(LtsUtils::QPoint3D, Q_MOVABLE_TYPE);
@@ -46,21 +46,15 @@ RequestHelper::RequestHelper(QObject* parent, bool quiet,
} }
void RequestHelper::addRequest(const std::function<int64_t()>& requestFunction, void RequestHelper::addRequest(const std::function<int64_t()>& requestFunction,
const std::function<void(const FunctionReplyType& baseReply)>& baseReplyHandler) const std::function<void(const Core::FunctionReply& baseReply)>& baseReplyHandler)
{ {
m_requestFunctions.append(RequestFunctionContainer(requestFunction, baseReplyHandler)); m_requestFunctions.append(RequestFunctionContainer(requestFunction, baseReplyHandler));
} }
bool RequestHelper::requestReply(const FunctionReplyType& baseReply) bool RequestHelper::requestReply(const Core::FunctionReply& baseReply)
{ {
#ifdef BUILD_RTI // rtiddsgen 7.7 generates plain public members (no getters/setters)
// Bei BUILD_RTI=ON: baseReply ist Core::FunctionReply, cast von dds::core::Reference const Core::FunctionReplyObject fro(baseReply.id, baseReply.errorString, baseReply.errorParams);
// Die Implementation erwartet Core::FunctionReplyObject
const Core::FunctionReplyObject fro(baseReply.id(), baseReply.errorString(), baseReply.errorParams());
#else
// Stub-Version: nur id und error string
const Core::FunctionReplyObject fro(baseReply.id(), baseReply.str().c_str());
#endif
return _requestReply(fro, &baseReply); return _requestReply(fro, &baseReply);
} }
@@ -69,7 +63,7 @@ bool RequestHelper::requestReply(const Core::FunctionReplyObject& replyObject)
return _requestReply(replyObject, nullptr); return _requestReply(replyObject, nullptr);
} }
bool RequestHelper::_requestReply(const Core::FunctionReplyObject& fro, const FunctionReplyType* baseReply) bool RequestHelper::_requestReply(const Core::FunctionReplyObject& fro, const Core::FunctionReply* baseReply)
{ {
m_errorString = fro.translated(); m_errorString = fro.translated();
@@ -100,14 +94,8 @@ bool RequestHelper::_requestReply(const Core::FunctionReplyObject& fro, const Fu
if (baseReply) if (baseReply)
m_singleRequestCustomFunctionReply(*baseReply); m_singleRequestCustomFunctionReply(*baseReply);
else else
#ifdef BUILD_RTI
m_singleRequestCustomFunctionReply( m_singleRequestCustomFunctionReply(
Core::FunctionReply(fro.id(), fro.str(), fro.args(), fro.additionalInfo())); Core::FunctionReply(fro.id(), fro.str(), fro.args(), fro.additionalInfo()));
#else
// Stub-Version: FunctionReply mit passendem Konstruktor
m_singleRequestCustomFunctionReply(
Core::FunctionReply(fro.id(), fro.str(), fro.args(), fro.additionalInfo()));
#endif
} }
if (fro.error()) if (fro.error())
@@ -195,7 +183,7 @@ void RequestHelper::slotNextRequest()
void RequestHelper::startSingleBackgroundRequest( void RequestHelper::startSingleBackgroundRequest(
const std::function<int64_t()>& requestFunction, const std::function<int64_t()>& requestFunction,
const std::function<void(const FunctionReplyType&)>& baseReplyHandler) const std::function<void(const Core::FunctionReply&)>& baseReplyHandler)
{ {
m_blockingCall = false; m_blockingCall = false;
startSingleRequest(requestFunction, baseReplyHandler); startSingleRequest(requestFunction, baseReplyHandler);
@@ -8,8 +8,15 @@
# --- Library LtsWebSocketCommon -------------------------------------------------------------------------------- # --- Library LtsWebSocketCommon --------------------------------------------------------------------------------
# #
# Make ${Qt6_WebSockets} optional # Make ${Qt6_WebSockets} optional
if(QT6_GUI_AVAILABLE AND TARGET Qt6::WebSockets) # Link the real WebSockets module whenever the websocket code path is
set(Qt6_WebSockets ${Qt6_WebSockets}) # compiled: QT6_WEBSOCKETS_AVAILABLE (root CMakeLists) and the manual
# Qt6::WebSockets import are set when the real module was found. The old
# QT6_GUI_AVAILABLE condition never held in this environment (Qt6
# discovery takes the minimal path) and the Qt6_WebSockets variable was
# never defined, so the websocket code compiled without the module on
# the link line.
if(QT6_WEBSOCKETS_REAL_FOUND OR Qt6WebSockets_FOUND)
set(Qt6_WebSockets Qt6::WebSockets)
else() else()
set(Qt6_WebSockets "") set(Qt6_WebSockets "")
endif() endif()
@@ -35,6 +35,7 @@ template <typename T> class DataManagerBaseDl
} }
protected: protected:
NGL::INGLLogger &m_logger;
std::shared_ptr<T> m_dbInterface; std::shared_ptr<T> m_dbInterface;
}; };
} // namespace LtsWebSocket } // namespace LtsWebSocket
@@ -150,8 +150,6 @@ NGL_WRAP_UI(ltswidgets_SRCS
NGL_ADD_BIG_RESOURCES(ltswidgets_SRCS resources/lts_resources.qrc) NGL_ADD_BIG_RESOURCES(ltswidgets_SRCS resources/lts_resources.qrc)
NGL_ADD_LIBRARY(WS TOOLSWS TOOLSSV LtsWidgets SHARED ${ltswidgets_SRCS}) NGL_ADD_LIBRARY(WS TOOLSWS TOOLSSV LtsWidgets SHARED ${ltswidgets_SRCS})
# ui_requirement.h is not a UI file but regular C++ code - disable AUTOUIC
set_target_properties(LtsWidgets PROPERTIES AUTOUIC OFF)
NGL_TARGET_INCLUDE_DIRECTORIES(LtsWidgets NGL_TARGET_INCLUDE_DIRECTORIES(LtsWidgets
PUBLIC PUBLIC
@@ -164,7 +162,6 @@ NGL_TARGET_LINK_LIBRARIES(LtsWidgets
Qt6::Svg Qt6::Svg
ngltools ngltools
ngltranslator ngltranslator
NGLLogger
TabBarTabStyle TabBarTabStyle
LtsSessionData LtsSessionData
LtsUtilsSettings LtsUtilsSettings
@@ -1,8 +1,16 @@
# Modified CMakeLists.txt from github.com/wille-io/httq # Modified CMakeLists.txt from github.com/wille-io/httq
# Make ${Qt6_WebSockets} optional # Make ${Qt6_WebSockets} optional
if(QT6_GUI_AVAILABLE AND TARGET Qt6::WebSockets) # Link the real WebSockets module whenever the websocket code path is
set(Qt6_WebSockets ${Qt6_WebSockets}) # compiled: QT6_WEBSOCKETS_AVAILABLE (root CMakeLists) and the manual
# Qt6::WebSockets import are set when the real module was found. The old
# QT6_GUI_AVAILABLE condition never held in this environment (Qt6
# discovery takes the minimal path) and the Qt6_WebSockets variable was
# never defined, so AbstractServer.cpp compiled the websocket code
# without the module on the link line (undefined reference to
# QWebSocketServer::handleConnection).
if(QT6_WEBSOCKETS_REAL_FOUND OR Qt6WebSockets_FOUND)
set(Qt6_WebSockets Qt6::WebSockets)
else() else()
set(Qt6_WebSockets "") set(Qt6_WebSockets "")
endif() endif()
@@ -6,14 +6,10 @@
IF(BUILD_RTI) IF(BUILD_RTI)
ADD_SUBDIRECTORY(QosProfile) ADD_SUBDIRECTORY(QosProfile)
ENDIF()
ADD_SUBDIRECTORY(DTC)
IF(BUILD_RTI)
ADD_SUBDIRECTORY(DDSConnector) ADD_SUBDIRECTORY(DDSConnector)
ENDIF() ENDIF()
ADD_SUBDIRECTORY(DTC)
ADD_SUBDIRECTORY(DTS) ADD_SUBDIRECTORY(DTS)
IF(BUILD_RTI) IF(BUILD_RTI)
ADD_SUBDIRECTORY(FTC) ADD_SUBDIRECTORY(FTC)
@@ -9,6 +9,14 @@ IF(BUILD_RTI)
INCLUDE(MacroRTIDDSGen) INCLUDE(MacroRTIDDSGen)
INCLUDE(MacroCodeGenIdl) INCLUDE(MacroCodeGenIdl)
# Resolve <DDS/...> includes (generic_data_reader.h, generic_dtc.h, ...) to the
# real headers under Lts/DDS/ instead of the migration stub tree in include/.
# The generated core_dtc_impl.h relies on GenericDtc::TopicType, which only the
# real DDSGeneric::GenericDataReader base provides — the stub variant lacks it.
# Same fix the migrated service CMakeLists (FileManagement/FilterManagement)
# already enforce; svcFileManagement links svcCoreClient, so Core must build.
include_directories(BEFORE ${CMAKE_SOURCE_DIR}/Lts)
SET(xml_FILE core.xml) SET(xml_FILE core.xml)
# #
@@ -111,13 +119,11 @@ SET(SRCS_client
CODEGEN_CLIENT_TOPICS_IMPL(SRCS_client ${xml_FILE}) CODEGEN_CLIENT_TOPICS_IMPL(SRCS_client ${xml_FILE})
NGL_ADD_LIBRARY2(AAR SV WS HLA svcCoreClient SHARED ${SRCS_client}) NGL_ADD_LIBRARY2(AAR SV WS HLA svcCoreClient SHARED ${SRCS_client})
# NGL_ADD_LIBRARY2 (unlike NGL_ADD_LIBRARY) does not define the
# Add compile definition for export macros # MAKE_<SYMBOL>_LIB compile guard, but the generated core_[d|f]tc_impl.h
TARGET_COMPILE_DEFINITIONS(svcCoreClient # headers require MAKE_SVCCORECLIENT_LIB — same situation as ddscore above,
PRIVATE # which defines MAKE_DDSCORE_LIB explicitly for the same reason.
MAKE_SVCCORECLIENT_LIB TARGET_COMPILE_DEFINITIONS(svcCoreClient PRIVATE MAKE_SVCCORECLIENT_LIB)
)
NGL_TARGET_INCLUDE_DIRECTORIES(svcCoreClient NGL_TARGET_INCLUDE_DIRECTORIES(svcCoreClient
PUBLIC PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/../../ ${CMAKE_CURRENT_SOURCE_DIR}/../../
@@ -19,7 +19,7 @@ LOGGER_T getLogger(const char *name)
try try
{ {
return ::NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger( loggerName ); return NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger( loggerName );
} }
catch ( const std::exception &ex ) catch ( const std::exception &ex )
{ {
@@ -8,6 +8,6 @@
namespace Core namespace Core
{ {
using LOGGER_T = ::NGL::INGLLogger&; using LOGGER_T = NGL::INGLLogger&;
CORE_COMMON_EXPORT LOGGER_T getLogger(const char *name); CORE_COMMON_EXPORT LOGGER_T getLogger(const char *name);
} }
@@ -59,9 +59,9 @@ void Pacemaker::addPort(unsigned short number, Core::CorePortType portType, cons
void Pacemaker::addPortInternal(unsigned short number, Core::CorePortType portType, const QString& properties) void Pacemaker::addPortInternal(unsigned short number, Core::CorePortType portType, const QString& properties)
{ {
if (!m_state.ports.has_value()) if (!m_state.ports.is_set())
m_state.ports = std::vector<Core::PortInformation>(); m_state.ports = std::vector<Core::PortInformation>();
m_state.ports.value().push_back(Core::PortInformation(number, portType, properties.toStdString())); m_state.ports.get().push_back(Core::PortInformation(number, portType, properties.toStdString()));
publishState(); publishState();
} }
@@ -1,9 +1,6 @@
#include "topic_lock_master.h" #include "topic_lock_master.h"
#if BUILD_RTI
#include <DDS/DDSConnector/dds_connector.h> #include <DDS/DDSConnector/dds_connector.h>
#include <functional>
namespace Core namespace Core
{ {
@@ -30,12 +27,12 @@ bool TopicLockMaster::init(const std::shared_ptr<DDSConnector::DdsConnector> &dd
return false; return false;
m_coreDtc->enableAll(); m_coreDtc->enableAll();
m_coreDtc->lockedEntitys([this] (const ::Core::LockedEntity &data) { m_coreDtc->lockedEntitys([this] (const LockedEntity &data) {
m_lockedEntitys << key(data.entityId, data.exerciseId, QString::fromStdString(data.entityTypeName)); m_lockedEntitys << key(data.entityId, data.exerciseId, QString::fromStdString(data.entityTypeName));
}); });
connect(m_coreDtc.get(), &Core::Interface::Dtc::lockedEntityChanged, this, connect(m_coreDtc.get(), &Interface::Dtc::lockedEntityChanged, this,
[this] (const ::Core::LockedEntity &data, DataModification modType) [this] (const LockedEntity &data, DataModification modType)
{ {
key k(data.entityId, data.exerciseId, QString::fromStdString(data.entityTypeName)); key k(data.entityId, data.exerciseId, QString::fromStdString(data.entityTypeName));
if (modType == DataModification::eAdded) if (modType == DataModification::eAdded)
@@ -47,6 +44,4 @@ bool TopicLockMaster::init(const std::shared_ptr<DDSConnector::DdsConnector> &dd
return true; return true;
} }
} }
#endif // BUILD_RTI
@@ -7,6 +7,10 @@
#include <Core/core_export.h> #include <Core/core_export.h>
#if BUILD_RTI #if BUILD_RTI
// Resolves to the codegen-generated core_dtc.h via the build-dir include
// root (build4/Lts). The old <Core/core_dtc.h> spelling hit the migration
// stub tree (include/Core/core_dtc.h), whose DDS::Core::Interface forward
// declarations don't match the generated Core::Interface::Dtc.
#include <DDS/Core/core_dtc.h> #include <DDS/Core/core_dtc.h>
#else #else
// Forward declarations for moc compatibility when BUILD_RTI=OFF // Forward declarations for moc compatibility when BUILD_RTI=OFF
@@ -66,7 +70,9 @@ public:
template<typename E> template<typename E>
bool isLocked(const E &data, int exerciseId) bool isLocked(const E &data, int exerciseId)
{ {
auto it = m_lockedEntitys.constFind(key(data.id(), exerciseId, QString::fromStdString(typeid(E).name()))); // rtiddsgen -stl generates plain public data members, so the id is
// accessed directly instead of the old getter call data.id().
auto it = m_lockedEntitys.constFind(key(data.id, exerciseId, QString::fromStdString(typeid(E).name())));
return !(it == m_lockedEntitys.cend()); return !(it == m_lockedEntitys.cend());
} }
@@ -22,6 +22,10 @@ NGL_ADD_LIBRARY2(AAR SV WS HLA ddsconnector SHARED ${SRCS})
NGL_TARGET_INCLUDE_DIRECTORIES(ddsconnector NGL_TARGET_INCLUDE_DIRECTORIES(ddsconnector
PUBLIC PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/../../ ${CMAKE_CURRENT_SOURCE_DIR}/../../
# dds_connector.h includes the generated ddsconnector_export.h with a
# quoted include; consumers (svcFilterManagement etc.) resolve it only
# if the binary dir with the GENERATE_EXPORT_HEADER output is exported.
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}
) )
NGL_TARGET_LINK_LIBRARIES(ddsconnector NGL_TARGET_LINK_LIBRARIES(ddsconnector
@@ -1,11 +1,6 @@
#pragma once #pragma once
// Include Qt headers FIRST to prevent namespace pollution when RTI DDS headers include Qt
#include <QtCore/QString>
#include <QtCore/QUrl>
#include <QtCore/QFlag>
#include <LtsUtils/LtsUtilsCore/data_modification_enum.h> #include <LtsUtils/LtsUtilsCore/data_modification_enum.h>
#include <dds/sub/LoanedSamples.hpp> #include <dds/sub/LoanedSamples.hpp>
@@ -30,11 +25,8 @@ template <typename DRO_OBJECT, typename SC> class GenericDtcSC
virtual bool setSubscriberCallback(const SubscriberCallback& subscriberCallback) = 0; virtual bool setSubscriberCallback(const SubscriberCallback& subscriberCallback) = 0;
virtual dds::sub::LoanedSamples<TopicType> readAlive() const = 0; virtual dds::sub::LoanedSamples<TopicType> readAlive() const = 0;
virtual bool readAlive(TopicType& data) = 0;
virtual dds::sub::LoanedSamples<TopicType> takeAlive() const = 0; virtual dds::sub::LoanedSamples<TopicType> takeAlive() const = 0;
virtual bool takeAlive(TopicType& data) = 0;
virtual dds::sub::LoanedSamples<TopicType> takeDisposed() const = 0; virtual dds::sub::LoanedSamples<TopicType> takeDisposed() const = 0;
virtual bool takeDisposed(TopicType& data) = 0;
virtual bool hasSamples() const = 0; virtual bool hasSamples() const = 0;
virtual DataReaderObject* dataReader() const = 0; virtual DataReaderObject* dataReader() const = 0;
virtual bool waitForHistoricalData(int timeoutMSec) = 0; virtual bool waitForHistoricalData(int timeoutMSec) = 0;
@@ -44,22 +36,6 @@ template <typename DRO_OBJECT>
class GenericDtc class GenericDtc
: public GenericDtcSC<DRO_OBJECT, std::function<void(const typename DRO_OBJECT::TopicType&, DataModification)>> : public GenericDtcSC<DRO_OBJECT, std::function<void(const typename DRO_OBJECT::TopicType&, DataModification)>>
{ {
public:
using BaseClass = GenericDtcSC<DRO_OBJECT, std::function<void(const typename DRO_OBJECT::TopicType&, DataModification)>>;
using TopicType = typename BaseClass::TopicType;
// Explicitly expose base class methods for accessibility through smart pointers
using BaseClass::readAlive;
using BaseClass::takeAlive;
using BaseClass::takeDisposed;
using BaseClass::SubscriberCallback;
bool setSubscriberCallback(const typename BaseClass::SubscriberCallback& callback) override { return BaseClass::setSubscriberCallback(callback); }
bool readAlive(TopicType& data) { return BaseClass::readAlive(data); }
bool takeAlive(TopicType& data) { return BaseClass::takeAlive(data); }
bool takeDisposed(TopicType& data) { return BaseClass::takeDisposed(data); }
bool hasSamples() const { return BaseClass::hasSamples(); }
std::shared_ptr<DRO_OBJECT> dataReader() { return BaseClass::dataReader(); }
bool waitForHistoricalData(int timeoutMSec) { return BaseClass::waitForHistoricalData(timeoutMSec); }
}; };
template <typename DRO_OBJECT> template <typename DRO_OBJECT>
@@ -67,22 +43,6 @@ class GenericDtcSampleInfo
: public GenericDtcSC<DRO_OBJECT, : public GenericDtcSC<DRO_OBJECT,
std::function<void(const typename DRO_OBJECT::TopicType&, const dds::sub::SampleInfo&)>> std::function<void(const typename DRO_OBJECT::TopicType&, const dds::sub::SampleInfo&)>>
{ {
public:
using BaseClass = GenericDtcSC<DRO_OBJECT, std::function<void(const typename DRO_OBJECT::TopicType&, const dds::sub::SampleInfo&)>>;
using TopicType = typename BaseClass::TopicType;
// Explicitly expose base class methods for accessibility through smart pointers
using BaseClass::readAlive;
using BaseClass::takeAlive;
using BaseClass::takeDisposed;
using BaseClass::SubscriberCallback;
bool setSubscriberCallback(const typename BaseClass::SubscriberCallback& callback) override { return BaseClass::setSubscriberCallback(callback); }
bool readAlive(TopicType& data) { return BaseClass::readAlive(data); }
bool takeAlive(TopicType& data) { return BaseClass::takeAlive(data); }
bool takeDisposed(TopicType& data) { return BaseClass::takeDisposed(data); }
bool hasSamples() const { return BaseClass::hasSamples(); }
std::shared_ptr<DRO_OBJECT> dataReader() { return BaseClass::dataReader(); }
bool waitForHistoricalData(int timeoutMSec) { return BaseClass::waitForHistoricalData(timeoutMSec); }
}; };
template <typename DRO_OBJECT> template <typename DRO_OBJECT>
@@ -90,22 +50,6 @@ class Ddtc
: public GenericDtcSC< : public GenericDtcSC<
DRO_OBJECT, std::function<void(const typename DRO_OBJECT::TopicType&, const std::string&, DataModification)>> DRO_OBJECT, std::function<void(const typename DRO_OBJECT::TopicType&, const std::string&, DataModification)>>
{ {
public:
using BaseClass = GenericDtcSC<DRO_OBJECT, std::function<void(const typename DRO_OBJECT::TopicType&, const std::string&, DataModification)>>;
using TopicType = typename BaseClass::TopicType;
// Explicitly expose base class methods for accessibility through smart pointers
using BaseClass::readAlive;
using BaseClass::takeAlive;
using BaseClass::takeDisposed;
using BaseClass::SubscriberCallback;
bool setSubscriberCallback(const typename BaseClass::SubscriberCallback& callback) override { return BaseClass::setSubscriberCallback(callback); }
bool readAlive(TopicType& data) { return BaseClass::readAlive(data); }
bool takeAlive(TopicType& data) { return BaseClass::takeAlive(data); }
bool takeDisposed(TopicType& data) { return BaseClass::takeDisposed(data); }
bool hasSamples() const { return BaseClass::hasSamples(); }
std::shared_ptr<DRO_OBJECT> dataReader() { return BaseClass::dataReader(); }
bool waitForHistoricalData(int timeoutMSec) { return BaseClass::waitForHistoricalData(timeoutMSec); }
}; };
template <typename DRO_OBJECT> template <typename DRO_OBJECT>
@@ -113,21 +57,5 @@ class DdtcSampleInfo
: public GenericDtcSC<DRO_OBJECT, std::function<void(const typename DRO_OBJECT::TopicType&, const std::string&, : public GenericDtcSC<DRO_OBJECT, std::function<void(const typename DRO_OBJECT::TopicType&, const std::string&,
const dds::sub::SampleInfo&)>> const dds::sub::SampleInfo&)>>
{ {
public:
using BaseClass = GenericDtcSC<DRO_OBJECT, std::function<void(const typename DRO_OBJECT::TopicType&, const std::string&, const dds::sub::SampleInfo&)>>;
using TopicType = typename BaseClass::TopicType;
// Explicitly expose base class methods for accessibility through smart pointers
using BaseClass::readAlive;
using BaseClass::takeAlive;
using BaseClass::takeDisposed;
using BaseClass::SubscriberCallback;
bool setSubscriberCallback(const typename BaseClass::SubscriberCallback& callback) override { return BaseClass::setSubscriberCallback(callback); }
bool readAlive(TopicType& data) { return BaseClass::readAlive(data); }
bool takeAlive(TopicType& data) { return BaseClass::takeAlive(data); }
bool takeDisposed(TopicType& data) { return BaseClass::takeDisposed(data); }
bool hasSamples() const { return BaseClass::hasSamples(); }
std::shared_ptr<DRO_OBJECT> dataReader() { return BaseClass::dataReader(); }
bool waitForHistoricalData(int timeoutMSec) { return BaseClass::waitForHistoricalData(timeoutMSec); }
}; };
} // namespace DTC } // namespace DTC
@@ -2,22 +2,19 @@
#pragma once #pragma once
// Include Qt headers FIRST to prevent namespace pollution when RTI DDS headers include Qt
#include <QtCore/QString>
#include <QtCore/QUrl>
#include <QtCore/QFlag>
#include <QtCore/QTimer>
#include "generic_dtc.h" #include "generic_dtc.h"
#include <DDS/Generic/generic_data_reader.h> #include <DDS/Generic/generic_data_reader.h>
#include <DDS/Generic/generic_logger.h> #include <DDS/Generic/generic_logger.h>
#include <DDS/Generic/subscriber_listener.h> #include <DDS/Generic/subscriber_listener.h>
#include <QtCore/QTimer>
#include <dds/core/cond/StatusCondition.hpp> #include <dds/core/cond/StatusCondition.hpp>
#include <dds/core/cond/WaitSet.hpp> #include <dds/core/cond/WaitSet.hpp>
namespace DDSGeneric namespace DDSGeneric
{ {
class DynamicDataReader; class DynamicDataReader;
} // namespace DDSGeneric }
namespace DTC namespace DTC
{ {
@@ -157,7 +154,7 @@ class GenericDtcImplSubscriberTemplate : public DDSGeneric::SubscriberListenerCa
if (dr.subscription_matched_status().current_count() == 0) if (dr.subscription_matched_status().current_count() == 0)
{ {
dds::core::cond::WaitSet ws; dds::core::cond::WaitSet ws;
auto cond = dds::core::cond::StatusCondition(dr); dds::core::cond::StatusCondition cond(dr);
cond.enabled_statuses(dds::core::status::StatusMask::subscription_matched()); cond.enabled_statuses(dds::core::status::StatusMask::subscription_matched());
ws.attach_condition(cond); ws.attach_condition(cond);
const dds::core::Duration waitTimeout(bWaitForever ? dds::core::Duration::infinite() const dds::core::Duration waitTimeout(bWaitForever ? dds::core::Duration::infinite()
@@ -4,19 +4,7 @@
# $Author$ # $Author$
# #
# Check for required targets - use simpler condition for INTERFACE library compatibility IF(BUILD_TESTING AND BUILD_RTI AND TARGET ddsgen AND TARGET ddsdtc AND TARGET ddsfts AND TARGET ddsQoS)
IF(BUILD_TESTING AND BUILD_RTI)
# Verify required targets exist
SET(_required_targets ddsgen ddsdtc ddsfts ddsQoS)
SET(_targets_found TRUE)
FOREACH(_tgt ${_required_targets})
IF(NOT TARGET ${_tgt})
SET(_targets_found FALSE)
MESSAGE(WARNING "Required target ${_tgt} not found - DDS unit tests will not be built")
ENDIF()
ENDFOREACH()
IF(_targets_found)
SET(xml_FILE ddsut.xml) SET(xml_FILE ddsut.xml)
@@ -118,10 +106,6 @@ TARGET_LINK_LIBRARIES(ddsGenericDataTests
Qt6::Test Qt6::Test
ddsut_common ddsut_common
) )
TARGET_INCLUDE_DIRECTORIES(ddsGenericDataTests PRIVATE
${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/Lts/DDS
)
ADD_TEST(NAME ddsGenericDataTests COMMAND $<TARGET_FILE:ddsGenericDataTests>) ADD_TEST(NAME ddsGenericDataTests COMMAND $<TARGET_FILE:ddsGenericDataTests>)
# Testing DataTopic Functionality (DTS/DTC) # Testing DataTopic Functionality (DTS/DTC)
@@ -139,11 +123,6 @@ TARGET_LINK_LIBRARIES(ddsDataTopicTests
Qt6::Test Qt6::Test
ddsut_common ddsut_common
) )
TARGET_INCLUDE_DIRECTORIES(ddsDataTopicTests PRIVATE
${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/Lts
${CMAKE_SOURCE_DIR}/Lts/DDS
)
ADD_TEST(NAME ddsDataTopicTests COMMAND $<TARGET_FILE:ddsDataTopicTests>) ADD_TEST(NAME ddsDataTopicTests COMMAND $<TARGET_FILE:ddsDataTopicTests>)
# Testing FunctionTopic Functionality (FTS/FTC) # Testing FunctionTopic Functionality (FTS/FTC)
@@ -161,15 +140,8 @@ TARGET_LINK_LIBRARIES(ddsFunctionTopicTests
Qt6::Test Qt6::Test
ddsut_common ddsut_common
) )
TARGET_INCLUDE_DIRECTORIES(ddsFunctionTopicTests PRIVATE
${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/Lts
${CMAKE_SOURCE_DIR}/Lts/DDS
)
ADD_TEST(NAME ddsFunctionTopicTests COMMAND $<TARGET_FILE:ddsFunctionTopicTests>) ADD_TEST(NAME ddsFunctionTopicTests COMMAND $<TARGET_FILE:ddsFunctionTopicTests>)
ENDIF() # _targets_found
IF(NOT BUILD_RPM) IF(NOT BUILD_RPM)
NGL_INSTALL(AAR SV TARGETS ddsut_common DESTINATION bin/test) NGL_INSTALL(AAR SV TARGETS ddsut_common DESTINATION bin/test)
NGL_INSTALL(AAR SV TARGETS ddsGenericDataTests DESTINATION bin/test) NGL_INSTALL(AAR SV TARGETS ddsGenericDataTests DESTINATION bin/test)
@@ -11,18 +11,18 @@
#include <QtCore/QVariant> #include <QtCore/QVariant>
#include <QtTest/QTest> #include <QtTest/QTest>
DataTopicTests::DataTopicTests() DataTopicTests::DataTopicTests() : m_domainParticipantPub(nullptr)
: m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("UnitTests.DataTopicTests")) , m_domainParticipantSub(nullptr)
, m_domainParticipantPub(nullptr) , m_domainId(0)
, m_domainParticipantSub(nullptr) , m_partitionId(1)
, m_domainId(0) , m_ddsPublisher(nullptr)
, m_partitionId(1) , m_testPart(nullptr)
, m_ddsPublisher(nullptr) , m_ddsSubscriber(nullptr)
, m_testPart(nullptr) , m_subscriberListener(nullptr)
, m_ddsSubscriber(nullptr) , m_dtcTestPart(nullptr)
, m_subscriberListener(nullptr) , m_mainThreadId(QThread::currentThreadId())
, m_dtcTestPart(nullptr) .getNGLLogger("UnitTests.DataTopicTests")),
, m_mainThreadId(QThread::currentThreadId()) m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger())
{ {
if (!DDS::QosProfile::setDefault()) if (!DDS::QosProfile::setDefault())
ERROR_LOG(m_logger) << "Error setting default QoS from xml-file "; ERROR_LOG(m_logger) << "Error setting default QoS from xml-file ";
@@ -63,8 +63,8 @@ bool DataTopicTests::initPublisher()
bool DataTopicTests::write(const DdsUnitTests::TestParticipant& data) bool DataTopicTests::write(const DdsUnitTests::TestParticipant& data)
{ {
INFO_LOG(m_logger) << "Publish topic TestParticipant "; INFO_LOG(m_logger) << "Publish topic TestParticipant ";
DEBUG_LOG(m_logger) << "ParticipantId: " << data.location.participantId DEBUG_LOG(m_logger) << "ParticipantId: " << data.location().participantId()
<< ", equipNo = " << data.location.equipNo; << ", equipNo = " << data.location().equipNo();
return m_testPart->write(data); return m_testPart->write(data);
} }
@@ -119,8 +119,8 @@ void DataTopicTests::processData(const DdsUnitTests::TestParticipant& instance,
{ {
INFO_LOG(m_logger) << "process data in topic TestParticipant, Sampleinfo: " << si.source_timestamp().sec(); INFO_LOG(m_logger) << "process data in topic TestParticipant, Sampleinfo: " << si.source_timestamp().sec();
DEBUG_LOG(m_logger) << "participantId: " << instance.location.participantId; DEBUG_LOG(m_logger) << "participantId: " << instance.location().participantId();
DEBUG_LOG(m_logger) << "equipNo: " << instance.location.equipNo; DEBUG_LOG(m_logger) << "equipNo: " << instance.location().equipNo();
m_receivedParticipantData = instance; m_receivedParticipantData = instance;
@@ -6,8 +6,6 @@
#include <DdsUnitTests/ddsut_dtc_types.h> #include <DdsUnitTests/ddsut_dtc_types.h>
#include <DdsUnitTests/ddsut_dts_types.h> #include <DdsUnitTests/ddsut_dts_types.h>
#include <QtCore/QObject> #include <QtCore/QObject>
#include <dds/pub/Publisher.hpp>
#include <dds/sub/Subscriber.hpp>
namespace NGL namespace NGL
{ {
@@ -44,9 +44,9 @@ void DataTopicTestsMain::publishTestCase()
{ {
DEBUG_LOG(m_logger) << "DataTopicTestsMain: publish TestParticipant"; DEBUG_LOG(m_logger) << "DataTopicTestsMain: publish TestParticipant";
m_sentParticipantData.location.participantId = 100; m_sentParticipantData.location().participantId(100);
m_sentParticipantData.location.equipNo = 1010; m_sentParticipantData.location().equipNo(1010);
m_sentParticipantData.testId = 100; m_sentParticipantData.testId(100);
QVERIFY2(m_dtTest->write(m_sentParticipantData), "Publishing Topic TestParticipant failed"); QVERIFY2(m_dtTest->write(m_sentParticipantData), "Publishing Topic TestParticipant failed");
DEBUG_LOG(m_logger) << "DataTopicTestsMain: publish ready"; DEBUG_LOG(m_logger) << "DataTopicTestsMain: publish ready";
@@ -60,8 +60,8 @@ void DataTopicTestsMain::subscribeTestCase()
DdsUnitTests::TestParticipant recvPartiticpant = m_dtTest->getReceivedParticipantData(); DdsUnitTests::TestParticipant recvPartiticpant = m_dtTest->getReceivedParticipantData();
QCOMPARE(recvPartiticpant.location.participantId, m_sentParticipantData.location.participantId); QCOMPARE(recvPartiticpant.location().participantId(), m_sentParticipantData.location().participantId());
QCOMPARE(recvPartiticpant.location.equipNo, m_sentParticipantData.location.equipNo); QCOMPARE(recvPartiticpant.location().equipNo(), m_sentParticipantData.location().equipNo());
} }
void DataTopicTestsMain::deleteDataReaderTestCase() void DataTopicTestsMain::deleteDataReaderTestCase()
@@ -69,19 +69,19 @@ void DataTopicTestsMain::deleteDataReaderTestCase()
DdsUnitTests::TestParticipant data; DdsUnitTests::TestParticipant data;
for (int i = 0; i < 1000; ++i) for (int i = 0; i < 1000; ++i)
{ {
m_sentParticipantData.id = i; m_sentParticipantData.id(i);
m_dtTest->write(m_sentParticipantData); m_dtTest->write(m_sentParticipantData);
} }
m_dtTest->deleteDTC(); m_dtTest->deleteDTC();
for (int i = 0; i < 1000; ++i) for (int i = 0; i < 1000; ++i)
{ {
m_sentParticipantData.id = i; m_sentParticipantData.id(i);
m_dtTest->write(m_sentParticipantData); m_dtTest->write(m_sentParticipantData);
} }
m_dtTest->deleteSubscriber(); m_dtTest->deleteSubscriber();
for (int i = 0; i < 1000; ++i) for (int i = 0; i < 1000; ++i)
{ {
m_sentParticipantData.id = i; m_sentParticipantData.id(i);
m_dtTest->write(m_sentParticipantData); m_dtTest->write(m_sentParticipantData);
} }
} }
@@ -23,9 +23,9 @@ int main(int argc, char* argv[])
return retCode; return retCode;
} }
FunctionTopicTests::FunctionTopicTests() FunctionTopicTests::FunctionTopicTests() : m_mainThreadId(QThread::currentThreadId())
: m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("UnitTests.FunctionTopicTests")) .getNGLLogger("UnitTests.FunctionTopicTests")),
, m_mainThreadId(QThread::currentThreadId()) m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger())
{ {
qRegisterMetaType<DdsUnitTests::FunctionReply>("DdsUnitTests::FunctionReply"); qRegisterMetaType<DdsUnitTests::FunctionReply>("DdsUnitTests::FunctionReply");
qRegisterMetaType<DdsUnitTests::FunctionReplyWithState>("DdsUnitTests::FunctionReplyWithState"); qRegisterMetaType<DdsUnitTests::FunctionReplyWithState>("DdsUnitTests::FunctionReplyWithState");
@@ -98,14 +98,14 @@ void FunctionTopicTests::requestWithState()
DdsUnitTests::FunctionRequestWithState data; DdsUnitTests::FunctionRequestWithState data;
data.id = 1; data.id(1);
data.info = std::string("Test request"); data.info(std::string("Test request"));
data.value = 1000.0; data.value(1000.0);
int uniqueId = 0; int uniqueId = 0;
bool bRet = m_ftcWS->requestDataClassic( bool bRet = m_ftcWS->requestDataClassic(
data, SLOT(slotRequestedData(DdsUnitTests::FunctionTopicTestWithStateReply,int,bool)), data, SLOT(slotRequestedData(DdsUnitTests::FunctionTopicTestWithStateReply, int, bool)),
SLOT(slotRequestedDataError(int,int,int)), uniqueId); SLOT(slotRequestedDataError(int, int, int)), uniqueId);
QVERIFY2(bRet, "Could not request data!"); QVERIFY2(bRet, "Could not request data!");
@@ -123,14 +123,14 @@ void FunctionTopicTests::requestTestCase2()
DdsUnitTests::FunctionRequest data; DdsUnitTests::FunctionRequest data;
data.id = 1; data.id(1);
data.info = std::string("Test request"); data.info(std::string("Test request"));
data.value = 1000.0; data.value(1000.0);
int uniqueId = 0; int uniqueId = 0;
bool bRet = bool bRet =
m_ftc->requestDataClassic(data, SLOT(slotRequestedData(DdsUnitTests::FunctionTopicTestReply,int,bool)), m_ftc->requestDataClassic(data, SLOT(slotRequestedData(DdsUnitTests::FunctionTopicTestReply, int, bool)),
SLOT(slotRequestedDataError(int,int,int)), uniqueId); SLOT(slotRequestedDataError(int, int, int)), uniqueId);
QVERIFY2(bRet, "Could not request data!"); QVERIFY2(bRet, "Could not request data!");
@@ -157,16 +157,16 @@ void FunctionTopicTests::onFunctionTopicRequest(const rti::core::SampleIdentity&
INFO_LOG(m_logger) << "Got function topic request (with status member)"; INFO_LOG(m_logger) << "Got function topic request (with status member)";
m_requestTopicWithState = request; m_requestTopicWithState = request;
QCOMPARE(m_requestTopicWithState.id, 1); QCOMPARE(m_requestTopicWithState.id(), 1);
QCOMPARE(m_requestTopicWithState.info.get(), std::string("Test request")); QCOMPARE(m_requestTopicWithState.info().get(), std::string("Test request"));
QCOMPARE(m_requestTopicWithState.value, 1000.0); QCOMPARE(m_requestTopicWithState.value(), 1000.0);
DdsUnitTests::FunctionReplyWithState reply; DdsUnitTests::FunctionReplyWithState reply;
DEBUG_LOG(m_logger) << "Send sample with status REPLY_COMPLETED"; DEBUG_LOG(m_logger) << "Send sample with status REPLY_COMPLETED";
reply.id = 1; reply.id(1);
reply.errorString = "Hello"; reply.errorString("Hello");
reply.replyState = Core::FtReplyState::Completed; reply.replyState(Core::FtReplyState::Completed);
bool bRet = m_ftsWS->sendReply(sampleId, reply); bool bRet = m_ftsWS->sendReply(sampleId, reply);
QVERIFY2(bRet, "Sending Reply failed"); QVERIFY2(bRet, "Sending Reply failed");
@@ -185,8 +185,8 @@ void FunctionTopicTests::onFunctionTopicRequest(const rti::core::SampleIdentity&
DdsUnitTests::FunctionReply reply; DdsUnitTests::FunctionReply reply;
reply.id = 2; reply.id(2);
reply.errorString = "What?"; reply.errorString("What?");
bool bRet = m_fts->sendReply(sampleId, reply); bool bRet = m_fts->sendReply(sampleId, reply);
QVERIFY2(bRet, "Sending Reply failed"); QVERIFY2(bRet, "Sending Reply failed");
@@ -200,21 +200,21 @@ void FunctionTopicTests::slotRequestedData(const DdsUnitTests::FunctionTopicTest
Q_UNUSED(seqNo); Q_UNUSED(seqNo);
QCOMPARE(m_mainThreadId, QThread::currentThreadId()); QCOMPARE(m_mainThreadId, QThread::currentThreadId());
INFO_LOG(m_logger) << "Got reply from FTS: " << reply.replyState; INFO_LOG(m_logger) << "Got reply from FTS: " << reply.replyState();
m_replyTopicWithState = reply; m_replyTopicWithState = reply;
if (m_replyTopicWithState.replyState == Core::FtReplyState::InProgress) if (m_replyTopicWithState.replyState() == Core::FtReplyState::InProgress)
{ {
QVERIFY(!bFinished); QVERIFY(!bFinished);
QCOMPARE(m_replyTopicWithState.id, 0); QCOMPARE(m_replyTopicWithState.id(), 0);
} }
else else
{ {
QVERIFY(bFinished); QVERIFY(bFinished);
QCOMPARE(m_replyTopicWithState.id, 1); QCOMPARE(m_replyTopicWithState.id(), 1);
QCOMPARE(m_replyTopicWithState.errorString, std::string("Hello")); QCOMPARE(m_replyTopicWithState.errorString(), std::string("Hello"));
QCOMPARE(static_cast<int>(m_replyTopicWithState.replyState), static_cast<int>(Core::FtReplyState::Completed)); QCOMPARE(m_replyTopicWithState.replyState().underlying(), Core::FtReplyState::Completed);
} }
emit functionTopicReply(); emit functionTopicReply();
} }
@@ -226,8 +226,8 @@ void FunctionTopicTests::slotRequestedData(const DdsUnitTests::FunctionTopicTest
QCOMPARE(m_mainThreadId, QThread::currentThreadId()); QCOMPARE(m_mainThreadId, QThread::currentThreadId());
m_replyTopic = reply; m_replyTopic = reply;
QCOMPARE(m_replyTopic.id, 2); QCOMPARE(m_replyTopic.id(), 2);
QCOMPARE(m_replyTopic.errorString, std::string("What?")); QCOMPARE(m_replyTopic.errorString(), std::string("What?"));
emit functionTopicReply(); emit functionTopicReply();
} }
@@ -47,9 +47,10 @@ class FunctionTopicTests : public QObject
const DdsUnitTests::FunctionRequestWithState& request); const DdsUnitTests::FunctionRequestWithState& request);
private: private:
NGL::INGLLogger& m_logger;
void requestWithState(); void requestWithState();
private:
NGL::INGLLogger& m_logger;
std::unique_ptr<FTS::FunctionTopicTest> m_fts; std::unique_ptr<FTS::FunctionTopicTest> m_fts;
std::unique_ptr<FTS::FunctionTopicTestWithState> m_ftsWS; std::unique_ptr<FTS::FunctionTopicTestWithState> m_ftsWS;
@@ -26,9 +26,9 @@ int main(int argc, char* argv[])
GenericDataTests::GenericDataTests() GenericDataTests::GenericDataTests()
: m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("UnitTests.GenericDataTests")) : m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("UnitTests.GenericDataTests"))
{ {
m_spatialData.equipNo = 0; m_spatialData.equipNo(0);
m_testPart.location.equipNo = 0; m_testPart.location().equipNo(0);
m_testPart.location.participantId = 0; m_testPart.location().participantId(0);
} }
void GenericDataTests::initTestCase() void GenericDataTests::initTestCase()
@@ -82,38 +82,38 @@ void GenericDataTests::dataWriterTestCase()
DdsUnitTests::SpatialData data; DdsUnitTests::SpatialData data;
data.participantId = 100; data.participantId(100);
data.equipNo = 999; data.equipNo(999);
data.gpsPosition.lon = 70000; data.gpsPosition().lon(70000);
data.gpsPosition.lat = 90000; data.gpsPosition().lat(90000);
data.gpsPosition.z = 10; data.gpsPosition().z(10);
data.orientation.heave = 10; data.orientation().heave(10);
data.orientation.pitch = 10; data.orientation().pitch(10);
data.orientation.roll = 10; data.orientation().roll(10);
data.velocity.x = 10; data.velocity().x(10);
data.velocity.y = 2; data.velocity().y(2);
data.velocity.z = 1; data.velocity().z(1);
data.changedAt = 11111; data.changedAt(11111);
QVERIFY2(m_dataWriterSd->write(data), "Publishing Topic (SpatialData) failed"); QVERIFY2(m_dataWriterSd->write(data), "Publishing Topic (SpatialData) failed");
DdsUnitTests::TestParticipant allData; DdsUnitTests::TestParticipant allData;
allData.name = "************************ Name of TestParticpant ***********************"; allData.name("************************ Name of TestParticpant ***********************");
allData.location = data; allData.location() = data;
allData.id = 10000; allData.id(10000);
QVERIFY2(m_dataWriter->write(allData), "Publishing Topic (TestParticipant) failed"); QVERIFY2(m_dataWriter->write(allData), "Publishing Topic (TestParticipant) failed");
allData.id = 11000; allData.id(11000);
QVERIFY2(m_dataWriter->write(allData), "Publishing Topic (TestParticipant) failed"); QVERIFY2(m_dataWriter->write(allData), "Publishing Topic (TestParticipant) failed");
allData.id = 11100; allData.id(11100);
QVERIFY2(m_dataWriter->write(allData), "Publishing Topic (TestParticipant) failed"); QVERIFY2(m_dataWriter->write(allData), "Publishing Topic (TestParticipant) failed");
allData.id = 11110; allData.id(11110);
QVERIFY2(m_dataWriter->write(allData), "Publishing Topic (TestParticipant) failed"); QVERIFY2(m_dataWriter->write(allData), "Publishing Topic (TestParticipant) failed");
allData.id = 11111; allData.id(11111);
QVERIFY2(m_dataWriter->write(allData), "Publishing Topic (TestParticipant) failed"); QVERIFY2(m_dataWriter->write(allData), "Publishing Topic (TestParticipant) failed");
} }
@@ -122,30 +122,30 @@ void GenericDataTests::dataReaderTestCase()
{ {
DEBUG_LOG(m_logger) << "GenericDataTests: dataReader"; DEBUG_LOG(m_logger) << "GenericDataTests: dataReader";
QTRY_COMPARE(m_spatialData.equipNo, 999); QTRY_COMPARE(m_spatialData.equipNo(), 999);
QCOMPARE(m_spatialData.changedAt, 11111); QCOMPARE(m_spatialData.changedAt(), 11111);
QTRY_COMPARE(m_testPart.location.equipNo, 999); QTRY_COMPARE(m_testPart.location().equipNo(), 999);
QCOMPARE(m_testPart.location.participantId, 100); QCOMPARE(m_testPart.location().participantId(), 100);
bool bSeenUnreadSamples = false; bool bSeenUnreadSamples = false;
dds::sub::LoanedSamples<DdsUnitTests::TestParticipant> vecTp = m_dataReader->readAlive(bSeenUnreadSamples); dds::sub::LoanedSamples<DdsUnitTests::TestParticipant> vecTp = m_dataReader->readAlive(bSeenUnreadSamples);
INFO_LOG(m_logger) << "vecTp size: " << vecTp.length(); INFO_LOG(m_logger) << "vecTp size: " << vecTp.length();
QCOMPARE(vecTp.length(), static_cast<decltype(vecTp.length())>(5)); QCOMPARE(vecTp.length(), static_cast<decltype(vecTp.length())>(5));
QCOMPARE(vecTp[0].data().id, 10000); QCOMPARE(vecTp[0].data().id(), 10000);
QCOMPARE(vecTp[1].data().id, 11000); QCOMPARE(vecTp[1].data().id(), 11000);
QCOMPARE(vecTp[2].data().id, 11100); QCOMPARE(vecTp[2].data().id(), 11100);
QCOMPARE(vecTp[3].data().id, 11110); QCOMPARE(vecTp[3].data().id(), 11110);
QCOMPARE(vecTp[4].data().id, 11111); QCOMPARE(vecTp[4].data().id(), 11111);
dds::sub::LoanedSamples<DdsUnitTests::TestParticipant> vecTpLoaned = m_dataReader->takeAlive(bSeenUnreadSamples); dds::sub::LoanedSamples<DdsUnitTests::TestParticipant> vecTpLoaned = m_dataReader->takeAlive(bSeenUnreadSamples);
INFO_LOG(m_logger) << "vecTpLoaned size: " << vecTp.length(); INFO_LOG(m_logger) << "vecTpLoaned size: " << vecTp.length();
QCOMPARE(vecTpLoaned.length(), static_cast<decltype(vecTpLoaned.length())>(5)); QCOMPARE(vecTpLoaned.length(), static_cast<decltype(vecTpLoaned.length())>(5));
QCOMPARE(vecTpLoaned[0].data().id, 10000); QCOMPARE(vecTpLoaned[0].data().id(), 10000);
QCOMPARE(vecTpLoaned[1].data().id, 11000); QCOMPARE(vecTpLoaned[1].data().id(), 11000);
QCOMPARE(vecTpLoaned[2].data().id, 11100); QCOMPARE(vecTpLoaned[2].data().id(), 11100);
QCOMPARE(vecTpLoaned[3].data().id, 11110); QCOMPARE(vecTpLoaned[3].data().id(), 11110);
QCOMPARE(vecTpLoaned[4].data().id, 11111); QCOMPARE(vecTpLoaned[4].data().id(), 11111);
} }
void GenericDataTests::deleteDataReaderTestCase() void GenericDataTests::deleteDataReaderTestCase()
@@ -153,7 +153,7 @@ void GenericDataTests::deleteDataReaderTestCase()
DdsUnitTests::TestParticipant data; DdsUnitTests::TestParticipant data;
for (int i = 0; i < 1000; ++i) for (int i = 0; i < 1000; ++i)
{ {
data.id = i; data.id(i);
m_dataWriter->write(data); m_dataWriter->write(data);
} }
m_init->getSubscriberListener()->removeCallback(m_dataReader->getDataReader(), this); m_init->getSubscriberListener()->removeCallback(m_dataReader->getDataReader(), this);
@@ -161,7 +161,7 @@ void GenericDataTests::deleteDataReaderTestCase()
m_dataReader = nullptr; m_dataReader = nullptr;
for (int i = 0; i < 1000; ++i) for (int i = 0; i < 1000; ++i)
{ {
data.id = i; data.id(i);
m_dataWriter->write(data); m_dataWriter->write(data);
} }
} }
@@ -188,14 +188,14 @@ void GenericDataTests::cleanupTestCase()
void GenericDataTests::processData(const DdsUnitTests::SpatialData& data, DataModification modType) void GenericDataTests::processData(const DdsUnitTests::SpatialData& data, DataModification modType)
{ {
DEBUG_LOG(m_logger) << "SpatialData: equipNo = " << data.equipNo << " modType: " << modType; DEBUG_LOG(m_logger) << "SpatialData: equipNo = " << data.equipNo() << " modType: " << modType;
m_spatialData = data; m_spatialData = data;
} }
void GenericDataTests::processData(const DdsUnitTests::TestParticipant& data, const dds::sub::SampleInfo& si) void GenericDataTests::processData(const DdsUnitTests::TestParticipant& data, const dds::sub::SampleInfo& si)
{ {
Q_UNUSED(si); Q_UNUSED(si);
DEBUG_LOG(m_logger) << "TestParticipant: equipNo = " << data.location.equipNo; DEBUG_LOG(m_logger) << "TestParticipant: equipNo = " << data.location().equipNo();
m_testPart = data; m_testPart = data;
} }
@@ -6,15 +6,15 @@
#include <Lts/Common/ProjectConfig/project_defines.h> #include <Lts/Common/ProjectConfig/project_defines.h>
#include <NGLLogger/NGLLoggerBootstrap.h> #include <NGLLogger/NGLLoggerBootstrap.h>
Initialisation::Initialisation() Initialisation::Initialisation() : m_domainParticipant(nullptr)
: m_domainParticipant(nullptr) , m_domainParticipantSub(nullptr)
, m_domainParticipantSub(nullptr) , m_domainId(0)
, m_domainId(0) , m_exerciseId(-1)
, m_exerciseId(-1) , m_ddsPublisher(nullptr)
, m_ddsPublisher(nullptr) , m_ddsSubscriber(nullptr)
, m_ddsSubscriber(nullptr) , m_subListener(new DDSGeneric::SubscriberListener)
, m_subListener(new DDSGeneric::SubscriberListener) .getNGLLogger("UnitTests.Initialisation")),
, m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("UnitTests.Initialisation")) m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger())
{ {
if (!DDS::QosProfile::setDefault()) if (!DDS::QosProfile::setDefault())
ERROR_LOG(m_logger) << "Error setting default QoS from xml-file "; ERROR_LOG(m_logger) << "Error setting default QoS from xml-file ";
@@ -4,8 +4,6 @@
#include <DDS/Generic/generic_base.h> #include <DDS/Generic/generic_base.h>
#include <DDS/Generic/subscriber_listener.h> #include <DDS/Generic/subscriber_listener.h>
#include <dds/pub/Publisher.hpp>
#include <dds/sub/Subscriber.hpp>
namespace NGL namespace NGL
{ {
@@ -430,7 +430,10 @@ private:
INFO_LOG(m_logger) << "#receiveReply for " << TopicNameHelper::replyTopicTypeName(); INFO_LOG(m_logger) << "#receiveReply for " << TopicNameHelper::replyTopicTypeName();
// QueuedConnection to make sure the data is handled in the correct Qt (main) thread // QueuedConnection to make sure the data is handled in the correct Qt (main) thread
request.replySlot.invoke(m_objToInform, Qt::QueuedConnection, request.replySlot.invoke(m_objToInform, Qt::QueuedConnection,
Q_RETURN_ARG(ReplyTopic, reply.data()), // Qt6: QMetaMethod::invoke takes QMetaMethodArgument; pass the
// registered topic type name like Q_ARG does, but with the
// runtime name (ReplyTopic is a template parameter).
QtPrivate::Invoke::argument<ReplyTopic>(TopicNameHelper::replyTopicTypeName(), reply.data()),
Q_ARG(int, request.uniqueId), Q_ARG(int, request.uniqueId),
Q_ARG(bool, !inProgress)); // finished yes/no Q_ARG(bool, !inProgress)); // finished yes/no
} }
@@ -31,6 +31,10 @@ NGL_ADD_LIBRARY2(WS AAR SV HLA ddsfts SHARED ${SRCS})
NGL_TARGET_INCLUDE_DIRECTORIES(ddsfts NGL_TARGET_INCLUDE_DIRECTORIES(ddsfts
PUBLIC PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/../../ ${CMAKE_CURRENT_SOURCE_DIR}/../../
# generic_fts_internal.h includes the generated ddsfts_export.h with a
# quoted include; consumers (the generated *_topic_type_plugin.cpp)
# resolve it only if the binary dir with the export header is exported.
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR}/../../Proxies/TrainingAreaBase ${CMAKE_CURRENT_BINARY_DIR}/../../Proxies/TrainingAreaBase
) )
NGL_TARGET_LINK_LIBRARIES(ddsfts NGL_TARGET_LINK_LIBRARIES(ddsfts
@@ -4,15 +4,7 @@
#if BUILD_RTI #if BUILD_RTI
// Include Qt headers FIRST, before any other includes, to prevent Qt symbols
// from being resolved in connext namespace when RTI DDS headers include Qt
#include <QtCore/QString>
#include <QtCore/QUrl>
#include <QtCore/QFlag>
#include <QtCore/QByteArray>
#include <NGLLogger/NGLLoggerBootstrap.h> #include <NGLLogger/NGLLoggerBootstrap.h>
#include "DDS/Core/logger.h"
#include <dds/core/cond/GuardCondition.hpp> #include <dds/core/cond/GuardCondition.hpp>
#include <dds/core/cond/StatusCondition.hpp> #include <dds/core/cond/StatusCondition.hpp>
#include <dds/core/cond/WaitSet.hpp> #include <dds/core/cond/WaitSet.hpp>
@@ -320,7 +312,7 @@ template <typename REQUEST, typename REPLY> class Requester final : public Reply
m_contentFilteredTopic->filter(dds::topic::Filter(filterContent.data())); m_contentFilteredTopic->filter(dds::topic::Filter(filterContent.data()));
} }
DEBUG_LOG(Core::getLogger("connext")) << "content filter for topic " << ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name() DEBUG_LOG(m_logger) << "content filter for topic " << ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name()
<< " - related_sample_identity should be: " << writerGuid; << " - related_sample_identity should be: " << writerGuid;
} }
@@ -353,7 +345,7 @@ template <typename REQUEST, typename REPLY> class Requester final : public Reply
m_dataWriter->write(request.data(), request.info()); m_dataWriter->write(request.data(), request.info());
const rti::core::SampleIdentity currentSampleIdentity = request.info().identity(); const rti::core::SampleIdentity currentSampleIdentity = request.info().identity();
DEBUG_LOG(Core::getLogger("connext")) << "send_request for topic " << ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name() DEBUG_LOG(m_logger) << "send_request for topic " << ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name()
<< ", m_currentSampleIdentity: " << DebugInfo::toReadable(currentSampleIdentity); << ", m_currentSampleIdentity: " << DebugInfo::toReadable(currentSampleIdentity);
} }
@@ -370,13 +362,13 @@ template <typename REQUEST, typename REPLY> class Requester final : public Reply
if (m_dataReader->take(reply.data(), reply.info()) && reply.info().valid()) if (m_dataReader->take(reply.data(), reply.info()) && reply.info().valid())
{ {
DEBUG_LOG(Core::getLogger("connext")) << "receive_reply for topic " DEBUG_LOG(m_logger) << "receive_reply for topic "
<< ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name() << ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name()
<< ", SampleIdentity - original publication virtual: " << ", SampleIdentity - original publication virtual: "
<< DebugInfo::toReadable( << DebugInfo::toReadable(
reply.info()->original_publication_virtual_sample_identity()); reply.info()->original_publication_virtual_sample_identity());
DEBUG_LOG(Core::getLogger("connext")) << "receive_reply for topic " DEBUG_LOG(m_logger) << "receive_reply for topic "
<< ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name() << ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name()
<< ", SampleIdentity - related original: " << ", SampleIdentity - related original: "
<< DebugInfo::toReadable( << DebugInfo::toReadable(
@@ -389,7 +381,7 @@ template <typename REQUEST, typename REPLY> class Requester final : public Reply
dds::core::cond::WaitSet::ConditionSeq activeConditionsSeq = waitset.wait(duration); dds::core::cond::WaitSet::ConditionSeq activeConditionsSeq = waitset.wait(duration);
if (activeConditionsSeq.empty()) if (activeConditionsSeq.empty())
{ {
ERROR_LOG(Core::getLogger("connext")) << "Bailing out!"; ERROR_LOG(m_logger) << "Bailing out!";
break; break;
} }
} }
@@ -400,7 +392,7 @@ template <typename REQUEST, typename REPLY> class Requester final : public Reply
if (!m_curInstanceHandle.is_nil()) if (!m_curInstanceHandle.is_nil())
{ {
DEBUG_LOG(Core::getLogger("connext")) << "Keyed topic - disposing instance: " DEBUG_LOG(m_logger) << "Keyed topic - disposing instance: "
<< ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name(); << ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name();
m_dataWriter.dispose_instance(m_curInstanceHandle); m_dataWriter.dispose_instance(m_curInstanceHandle);
} }
@@ -456,7 +448,7 @@ template <typename REQUEST, typename REPLY> class Replier final : public ReplyRe
void send_reply(connext::WriteSampleRef<REPLY>& reply, const rti::core::SampleIdentity& identity, void send_reply(connext::WriteSampleRef<REPLY>& reply, const rti::core::SampleIdentity& identity,
bool bLastSample = true) bool bLastSample = true)
{ {
DEBUG_LOG(Core::getLogger("connext")) << "send_reply for topic " << ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name() DEBUG_LOG(m_logger) << "send_reply for topic " << ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name()
<< ", sampleIdentity: " << DebugInfo::toReadable(identity); << ", sampleIdentity: " << DebugInfo::toReadable(identity);
rti::core::SampleFlag sf = reply.info().flag(); rti::core::SampleFlag sf = reply.info().flag();
@@ -466,7 +458,7 @@ template <typename REQUEST, typename REPLY> class Replier final : public ReplyRe
sf |= rti::core::SampleFlag::intermediate_reply_sequence(); sf |= rti::core::SampleFlag::intermediate_reply_sequence();
reply.info().flag(sf); reply.info().flag(sf);
reply.info().related_sample_identity(identity); reply.info().related_sample_identity(identity);
DEBUG_LOG(Core::getLogger("connext")) << "send_reply for topic " << ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name() DEBUG_LOG(m_logger) << "send_reply for topic " << ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name()
<< ", related sampleIdentity: " << ", related sampleIdentity: "
<< DebugInfo::toReadable(reply.info().related_sample_identity()); << DebugInfo::toReadable(reply.info().related_sample_identity());
@@ -480,7 +472,7 @@ template <typename REQUEST, typename REPLY> class Replier final : public ReplyRe
if (request.info().valid()) if (request.info().valid())
{ {
DEBUG_LOG(Core::getLogger("connext")) << "receive_request for topic " << ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name() DEBUG_LOG(m_logger) << "receive_request for topic " << ReplyRequestBase<REQUEST, REPLY>::m_requestTopic.name()
<< ", sampleIdentity publication_virtual_sample_identity: " << ", sampleIdentity publication_virtual_sample_identity: "
<< DebugInfo::toReadable(request.info()->publication_virtual_sample_identity()) << DebugInfo::toReadable(request.info()->publication_virtual_sample_identity())
<< ", original_publication_virtual_sample_identity: " << ", original_publication_virtual_sample_identity: "
@@ -9,9 +9,7 @@
#include <DDS/Core/core.hpp> #include <DDS/Core/core.hpp>
#include <DDS/FTS/generic_fts.h>
#include "generic_fts_internal.h" #include "generic_fts_internal.h"
#include "generic_fts.h"
#include "connext.h" #include "connext.h"
#include <DDS/Generic/wait_set_handler.h> #include <DDS/Generic/wait_set_handler.h>
#include <DDS/Generic/generic_base.h> #include <DDS/Generic/generic_base.h>
@@ -63,8 +61,12 @@ private:
void sendReplyState(Core::FtReplyState replyState, const rti::core::SampleIdentity &requestSampleIdentity) void sendReplyState(Core::FtReplyState replyState, const rti::core::SampleIdentity &requestSampleIdentity)
{ {
connext::WriteSample<ReplyTopic> reply; connext::WriteSample<ReplyTopic> reply;
reply.data().replyState(replyState); // rtiddsgen -stl generates plain public data members, so the reply
// state is assigned directly instead of the old setter call.
reply.data().replyState = replyState;
// FtReplyState doesn't exist anymore with rtiddsgen 7.7 - the
// enum values are directly available in Core::FtReplyState.
bool bLastTelegram = ((replyState != Core::FtReplyState::InProgress) && bool bLastTelegram = ((replyState != Core::FtReplyState::InProgress) &&
(replyState != Core::FtReplyState::NotStarted)); (replyState != Core::FtReplyState::NotStarted));
m_replier->send_reply(reply, requestSampleIdentity, bLastTelegram); m_replier->send_reply(reply, requestSampleIdentity, bLastTelegram);
@@ -79,7 +81,7 @@ private:
template <typename T, typename std::enable_if<HasStatusFunction<T>::value, int>::type = 0> template <typename T, typename std::enable_if<HasStatusFunction<T>::value, int>::type = 0>
void setReply(T &data, Core::FtReplyState status) void setReply(T &data, Core::FtReplyState status)
{ {
data.replyState(status); data.replyState = status;
} }
template <typename T, typename std::enable_if<!HasStatusFunction<T>::value, int>::type = 0> template <typename T, typename std::enable_if<!HasStatusFunction<T>::value, int>::type = 0>
@@ -235,6 +237,9 @@ protected:
<< "[s], -> age: " << age << "[s], -> age: " << age
<< "[s], data: " << s; << "[s], data: " << s;
ReplyTopic rt; ReplyTopic rt;
// Generated topic types have plain public data members, so the
// error information is assigned directly instead of the old
// setter calls.
rt.errorString = tr_lts("dds", "Topic %1 was outdated and therefore ignored. Does the client time match the server time?"); rt.errorString = tr_lts("dds", "Topic %1 was outdated and therefore ignored. Does the client time match the server time?");
rt.errorParams = {TopicNameHelper::requestTopicName()}; rt.errorParams = {TopicNameHelper::requestTopicName()};
sendReply(request.identity(), rt); sendReply(request.identity(), rt);
@@ -2,6 +2,10 @@
#pragma once #pragma once
// Declares the FTS::GenericFts template that generic_fts_impl.h's
// GenericFtsImpl derives from. Present in the qt5 original; without it
// GenericFts is no known template at the point of derivation.
#include "generic_fts.h"
#include <ddsfts_export.h> #include <ddsfts_export.h>
#include "logger.h" #include "logger.h"
@@ -38,11 +38,6 @@ NGL_TARGET_LINK_LIBRARIES(ddsgen
LtsUtilsCoreHeaderOnly LtsUtilsCoreHeaderOnly
) )
IF(NOT BUILD_RPM)
NGL_INSTALL(AAR SV TARGETS ddsgen DESTINATION bin)
NGL_INSTALL(AAR SV FILES dynamic_data_reader.h DESTINATION include/DDS/Generic)
ENDIF()
# topic_type_plugin # topic_type_plugin
ADD_LIBRARY(topic_type_plugin INTERFACE) ADD_LIBRARY(topic_type_plugin INTERFACE)
TARGET_SOURCES(topic_type_plugin INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/topic_type_plugin.h) TARGET_SOURCES(topic_type_plugin INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/topic_type_plugin.h)
@@ -2,13 +2,8 @@
#pragma once #pragma once
// Include ALL headers BEFORE opening DDSGeneric namespace to prevent Qt symbols
// from being resolved in DDSGeneric namespace when RTI DDS headers include Qt
#include <QtCore/QString>
#include <QtCore/QUrl>
#include <QtCore/QFlag>
#include <DDS/Generic/generic_logger.h>
#include <DDS/Generic/generic_base.h> #include <DDS/Generic/generic_base.h>
#include <DDS/Generic/generic_logger.h>
#include <LtsUtils/LtsUtilsCore/data_modification_enum.h> #include <LtsUtils/LtsUtilsCore/data_modification_enum.h>
#include <dds/core/xtypes/StructType.hpp> #include <dds/core/xtypes/StructType.hpp>
#include <dds/sub/DataReader.hpp> #include <dds/sub/DataReader.hpp>
@@ -2,10 +2,6 @@
#pragma once #pragma once
// Include Qt headers FIRST to prevent namespace pollution when RTI DDS headers include Qt
#include <QtCore/QString>
#include <QtCore/QUrl>
#include <QtCore/QFlag>
#include <DDS/Generic/generic_base.h> #include <DDS/Generic/generic_base.h>
#include <DDS/Generic/generic_logger.h> #include <DDS/Generic/generic_logger.h>
#include <LtsUtils/LtsUtilsCore/data_modification_enum.h> #include <LtsUtils/LtsUtilsCore/data_modification_enum.h>
@@ -2,10 +2,6 @@
#pragma once #pragma once
// Include Qt headers FIRST to prevent namespace pollution when RTI DDS headers include Qt
#include <QtCore/QString>
#include <QtCore/QUrl>
#include <QtCore/QFlag>
#include <DDS/Generic/generic_base.h> #include <DDS/Generic/generic_base.h>
#include <DDS/Generic/generic_logger.h> #include <DDS/Generic/generic_logger.h>
#include <dds/pub/DataWriter.hpp> #include <dds/pub/DataWriter.hpp>
@@ -2,16 +2,19 @@
#pragma once #pragma once
// Include Qt headers FIRST to prevent namespace pollution when RTI DDS headers include Qt #include <QMetaMethod>
#include <QtCore/QObject> #include <QtCore/QObject>
#include <QtCore/QMetaMethod>
#include <QtCore/QReadWriteLock> #include <QtCore/QReadWriteLock>
#include <NGLLogger/INGLLogger.h>
#include <dds/sub/AnyDataReader.hpp> #include <dds/sub/AnyDataReader.hpp>
#include <dds/sub/SubscriberListener.hpp> #include <dds/sub/SubscriberListener.hpp>
#include <dds/topic/Topic.hpp> #include <dds/topic/Topic.hpp>
#include <ddsgen_export.h> #include <ddsgen_export.h>
namespace NGL
{
class INGLLogger;
}
namespace DDSGeneric namespace DDSGeneric
{ {
class DDSGEN_EXPORT SubscriberListenerCallback : public QObject class DDSGEN_EXPORT SubscriberListenerCallback : public QObject
@@ -2,10 +2,6 @@
#pragma once #pragma once
// Include Qt headers FIRST to prevent namespace pollution when RTI DDS headers include Qt
#include <QtCore/QString>
#include <QtCore/QUrl>
#include <QtCore/QFlag>
#include <dds/core/xtypes/StructType.hpp> #include <dds/core/xtypes/StructType.hpp>
namespace DDSGeneric namespace DDSGeneric
@@ -2,10 +2,6 @@
#pragma once #pragma once
// Include Qt headers FIRST to prevent namespace pollution when RTI DDS headers include Qt
#include <QtCore/QString>
#include <QtCore/QUrl>
#include <QtCore/QFlag>
#include <dds/core/cond/Condition.hpp> #include <dds/core/cond/Condition.hpp>
#include <dds/core/cond/GuardCondition.hpp> #include <dds/core/cond/GuardCondition.hpp>
#include <dds/core/cond/WaitSet.hpp> #include <dds/core/cond/WaitSet.hpp>
@@ -18,25 +18,25 @@ AdvancedSymbology::SidcDefinitions::Identity roleToIdentity(const ParticipantMan
{ {
AdvancedSymbology::SidcDefinitions::Identity identity = AdvancedSymbology::SidcDefinitions::Identity::Unknown; AdvancedSymbology::SidcDefinitions::Identity identity = AdvancedSymbology::SidcDefinitions::Identity::Unknown;
switch (role.underlying()) { switch (role.underlying()) {
case ParticipantManagement::Role_def::Unknown: case ParticipantManagement::Role::Unknown:
identity = AdvancedSymbology::SidcDefinitions::Identity::Unknown; identity = AdvancedSymbology::SidcDefinitions::Identity::Unknown;
break; break;
case ParticipantManagement::Role_def::Friend: case ParticipantManagement::Role::Friend:
identity = AdvancedSymbology::SidcDefinitions::Identity::Friend; identity = AdvancedSymbology::SidcDefinitions::Identity::Friend;
break; break;
case ParticipantManagement::Role_def::Neutral: case ParticipantManagement::Role::Neutral:
identity = AdvancedSymbology::SidcDefinitions::Identity::Neutral; identity = AdvancedSymbology::SidcDefinitions::Identity::Neutral;
break; break;
case ParticipantManagement::Role_def::Enemy: case ParticipantManagement::Role::Enemy:
identity = AdvancedSymbology::SidcDefinitions::Identity::HostileFaker; identity = AdvancedSymbology::SidcDefinitions::Identity::HostileFaker;
break; break;
case ParticipantManagement::Role_def::Pending: case ParticipantManagement::Role::Pending:
identity = AdvancedSymbology::SidcDefinitions::Identity::Pending; identity = AdvancedSymbology::SidcDefinitions::Identity::Pending;
break; break;
case ParticipantManagement::Role_def::AssumedFriend: case ParticipantManagement::Role::AssumedFriend:
identity = AdvancedSymbology::SidcDefinitions::Identity::AssumedFriend; identity = AdvancedSymbology::SidcDefinitions::Identity::AssumedFriend;
break; break;
case ParticipantManagement::Role_def::Suspect: case ParticipantManagement::Role::Suspect:
identity = AdvancedSymbology::SidcDefinitions::Identity::SuspectJoker; identity = AdvancedSymbology::SidcDefinitions::Identity::SuspectJoker;
break; break;
} }
@@ -65,7 +65,7 @@ QSharedPointer<SymbolResult> ForeignInterfaceImpl::findImage(const ParticipantMa
symDataToRender.fillColorReplace = true; symDataToRender.fillColorReplace = true;
QColor injuryColor = QColor(100, 100, 0); QColor injuryColor = QColor(100, 100, 0);
ProjectDataManagement::VulnerabilityState currentState = ProjectDataManagement::VulnerabilityState::CombatReady; ProjectDataManagement::VulnerabilityState currentState = ProjectDataManagement::VulnerabilityState::VulnerabilityState_CombatReady;
const ParticipantManagement::DynamicParticipantData dData = m_ppmDtc->dynamicParticipantData(participant.id()); const ParticipantManagement::DynamicParticipantData dData = m_ppmDtc->dynamicParticipantData(participant.id());
@@ -161,30 +161,30 @@ AdvancedSymbology::Injury ForeignInterfaceImpl::stateToInjury(const ProjectDataM
{ {
switch (state.underlying()) switch (state.underlying())
{ {
case ProjectDataManagement::VulnerabilityState::CombatReady: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_CombatReady:
case ProjectDataManagement::VulnerabilityState::TemporarySeverance: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_TemporarySeverance:
case ProjectDataManagement::VulnerabilityState::NearMiss: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_NearMiss:
case ProjectDataManagement::VulnerabilityState::HitWithNoEffect: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_HitWithNoEffect:
return AdvancedSymbology::Injury::NoInjury; return AdvancedSymbology::Injury::NoInjury;
case ProjectDataManagement::VulnerabilityState::LightDamage: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_LightDamage:
case ProjectDataManagement::VulnerabilityState::MediumDamage: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_MediumDamage:
case ProjectDataManagement::VulnerabilityState::HeavyDamage: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_HeavyDamage:
case ProjectDataManagement::VulnerabilityState::NotReady: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_NotReady:
return AdvancedSymbology::Injury::Hit; return AdvancedSymbology::Injury::Hit;
case ProjectDataManagement::VulnerabilityState::MobilityKill: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_MobilityKill:
case ProjectDataManagement::VulnerabilityState::VisibleMobilityKill: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_VisibleMobilityKill:
return AdvancedSymbology::Injury::MobilityKill; return AdvancedSymbology::Injury::MobilityKill;
case ProjectDataManagement::VulnerabilityState::WeaponSystemDamage: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_WeaponSystemDamage:
case ProjectDataManagement::VulnerabilityState::VisibleWeaponSystemDamage: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_VisibleWeaponSystemDamage:
return AdvancedSymbology::Injury::WeaponKill; return AdvancedSymbology::Injury::WeaponKill;
case ProjectDataManagement::VulnerabilityState::CatastrophicKill: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_CatastrophicKill:
return AdvancedSymbology::Injury::TotalKill; return AdvancedSymbology::Injury::TotalKill;
case ProjectDataManagement::VulnerabilityState::NContamination: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_NContamination:
case ProjectDataManagement::VulnerabilityState::BContamination: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_BContamination:
case ProjectDataManagement::VulnerabilityState::CContamination: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_CContamination:
case ProjectDataManagement::VulnerabilityState::VulnerabilityBitsChanged: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_VulnerabilityBitsChanged:
case ProjectDataManagement::VulnerabilityState::Reserved: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_Reserved:
case ProjectDataManagement::VulnerabilityState::NoChange: case ProjectDataManagement::VulnerabilityState::VulnerabilityState_NoChange:
break; break;
} }
return AdvancedSymbology::Injury::NoInjury; return AdvancedSymbology::Injury::NoInjury;
@@ -100,10 +100,10 @@ QVariant ConfigAlarmModel::data(const QModelIndex& index, int role) const
const ProjectDataManagement::VulnerabilityClass vc = const ProjectDataManagement::VulnerabilityClass vc =
typeClass == ParticipantManagement::TypeClass::Human typeClass == ParticipantManagement::TypeClass::Human
? ProjectDataManagement::VulnerabilityClass_def::SoldierInjuries ? ProjectDataManagement::VulnerabilityClass::SoldierInjuries
: ProjectDataManagement::VulnerabilityClass_def::VehicleDamages; : ProjectDataManagement::VulnerabilityClass::VehicleDamages;
ProjectDataManagement::VulnerabilityState vs = ProjectDataManagement::VulnerabilityState vs =
static_cast<ProjectDataManagement::VulnerabilityState_def::type>(alarmConfig.vulnerabilityState()); static_cast<ProjectDataManagement::VulnerabilityState>(alarmConfig.vulnerabilityState());
vulnerabilityState = ProjectDataManagement::toString(vs, vc); vulnerabilityState = ProjectDataManagement::toString(vs, vc);
} }
return vulnerabilityState; return vulnerabilityState;
@@ -21,7 +21,7 @@ struct NotificationEx : public AlarmManagement::Notification
int equipmentNumber = 0; int equipmentNumber = 0;
int participantId = 0; int participantId = 0;
int aesId = 0; int aesId = 0;
ProjectDataManagement::PdmEventType eventTypeId = ProjectDataManagement::PdmEventType::Unknown; ProjectDataManagement::PdmEventType eventTypeId = ProjectDataManagement::PdmEventType::EventType_Unknown;
NotificationEx() = default; NotificationEx() = default;
@@ -57,7 +57,7 @@ void InterfaceImpl::clearInterfaces()
void InterfaceImpl::showEmergencyMessage(const AlarmManagement::Notification &data) void InterfaceImpl::showEmergencyMessage(const AlarmManagement::Notification &data)
{ {
if (data.eventType() != ProjectDataManagement::PdmEventType_def::EmergencyCall) if (data.eventType() != ProjectDataManagement::PdmEventType::EventType_EmergencyCall)
return; return;
const int issi = data.equipmentNumber(); const int issi = data.equipmentNumber();
@@ -57,55 +57,55 @@ AlarmDialog::AlarmDialog(QWidget* parent)
alarmCheckBox.name = QLatin1String("NuclearAgentEntry"); alarmCheckBox.name = QLatin1String("NuclearAgentEntry");
alarmCheckBox.checkboxMarker = m_ui->cbxNMarker; alarmCheckBox.checkboxMarker = m_ui->cbxNMarker;
alarmCheckBox.checkboxWindow = m_ui->cbxNMessage; alarmCheckBox.checkboxWindow = m_ui->cbxNMessage;
alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::EnterNuclear; alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::EventType_EnterNuclear;
m_checkBoxes.append(alarmCheckBox); m_checkBoxes.append(alarmCheckBox);
alarmCheckBox.name = QLatin1String("DangerAreasEntry"); alarmCheckBox.name = QLatin1String("DangerAreasEntry");
alarmCheckBox.checkboxMarker = m_ui->cbxDanerAreaMarker; alarmCheckBox.checkboxMarker = m_ui->cbxDanerAreaMarker;
alarmCheckBox.checkboxWindow = m_ui->cbxDangerAreaMessage; alarmCheckBox.checkboxWindow = m_ui->cbxDangerAreaMessage;
alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::EnterDangerArea; alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::EventType_EnterDangerArea;
m_checkBoxes.append(alarmCheckBox); m_checkBoxes.append(alarmCheckBox);
alarmCheckBox.name = QLatin1String("MineAreaEntry"); alarmCheckBox.name = QLatin1String("MineAreaEntry");
alarmCheckBox.checkboxMarker = m_ui->cbxMineAreaEntryMarker; alarmCheckBox.checkboxMarker = m_ui->cbxMineAreaEntryMarker;
alarmCheckBox.checkboxWindow = m_ui->cbxMineAreaEntryMessage; alarmCheckBox.checkboxWindow = m_ui->cbxMineAreaEntryMessage;
alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::EnterMineArea; alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::EventType_EnterMineArea;
m_checkBoxes.append(alarmCheckBox); m_checkBoxes.append(alarmCheckBox);
alarmCheckBox.name = QLatin1String("MineAreaHit"); alarmCheckBox.name = QLatin1String("MineAreaHit");
alarmCheckBox.checkboxMarker = m_ui->cbxMineAreaHitMarker; alarmCheckBox.checkboxMarker = m_ui->cbxMineAreaHitMarker;
alarmCheckBox.checkboxWindow = m_ui->cbxMineAreaHitMessage; alarmCheckBox.checkboxWindow = m_ui->cbxMineAreaHitMessage;
alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::HitMine; alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::EventType_HitMine;
m_checkBoxes.append(alarmCheckBox); m_checkBoxes.append(alarmCheckBox);
alarmCheckBox.name = QLatin1String("DirectFire"); alarmCheckBox.name = QLatin1String("DirectFire");
alarmCheckBox.checkboxMarker = m_ui->cbxDirectFireMarker; alarmCheckBox.checkboxMarker = m_ui->cbxDirectFireMarker;
alarmCheckBox.checkboxWindow = m_ui->cbxDirectFireMessage; alarmCheckBox.checkboxWindow = m_ui->cbxDirectFireMessage;
alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::Hit; alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::EventType_Hit;
m_checkBoxes.append(alarmCheckBox); m_checkBoxes.append(alarmCheckBox);
alarmCheckBox.name = QLatin1String("IndirectFire"); alarmCheckBox.name = QLatin1String("IndirectFire");
alarmCheckBox.checkboxMarker = m_ui->cbxIndirectFireMarker; alarmCheckBox.checkboxMarker = m_ui->cbxIndirectFireMarker;
alarmCheckBox.checkboxWindow = m_ui->cbxIndirectFireMessage; alarmCheckBox.checkboxWindow = m_ui->cbxIndirectFireMessage;
alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::HitEffectSimulation; alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::EventType_HitEffectSimulation;
m_checkBoxes.append(alarmCheckBox); m_checkBoxes.append(alarmCheckBox);
alarmCheckBox.name = QLatin1String("CrossLocalBorderlines"); alarmCheckBox.name = QLatin1String("CrossLocalBorderlines");
alarmCheckBox.checkboxMarker = m_ui->cbxLocalBorderMarker; alarmCheckBox.checkboxMarker = m_ui->cbxLocalBorderMarker;
alarmCheckBox.checkboxWindow = m_ui->cbxLocalBorderMessage; alarmCheckBox.checkboxWindow = m_ui->cbxLocalBorderMessage;
alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::CrossLocalBorderline; alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::EventType_CrossLocalBorderline;
m_checkBoxes.append(alarmCheckBox); m_checkBoxes.append(alarmCheckBox);
alarmCheckBox.name = QLatin1String("CrossGlobalBorderlines"); alarmCheckBox.name = QLatin1String("CrossGlobalBorderlines");
alarmCheckBox.checkboxMarker = m_ui->cbxGlobalBorderMarker; alarmCheckBox.checkboxMarker = m_ui->cbxGlobalBorderMarker;
alarmCheckBox.checkboxWindow = m_ui->cbxGlobalBorderMessage; alarmCheckBox.checkboxWindow = m_ui->cbxGlobalBorderMessage;
alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::CrossGlobalBorderline; alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::EventType_CrossGlobalBorderline;
m_checkBoxes.append(alarmCheckBox); m_checkBoxes.append(alarmCheckBox);
alarmCheckBox.name = QLatin1String("AirSupport"); alarmCheckBox.name = QLatin1String("AirSupport");
alarmCheckBox.checkboxMarker = m_ui->cbxAirSupportMarker; alarmCheckBox.checkboxMarker = m_ui->cbxAirSupportMarker;
alarmCheckBox.checkboxWindow = m_ui->cbxAirSupportMessage; alarmCheckBox.checkboxWindow = m_ui->cbxAirSupportMessage;
alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::AirSupport; alarmCheckBox.eventTypeId = ProjectDataManagement::PdmEventType::EventType_AirSupport;
m_checkBoxes.append(alarmCheckBox); m_checkBoxes.append(alarmCheckBox);
setOnlineHelpFilename(QLatin1String("Situation-Configure_Global_Alarms")); setOnlineHelpFilename(QLatin1String("Situation-Configure_Global_Alarms"));
@@ -176,57 +176,57 @@ void AlarmDialog::onAlarmConfigChanged(const AlarmManagement::AlarmConfig& data,
DEBUG_LOG(m_logger) << "************** onAlarmConfig zuweisen "; DEBUG_LOG(m_logger) << "************** onAlarmConfig zuweisen ";
switch (data.eventTypeId().underlying()) switch (data.eventTypeId().underlying())
{ {
case ProjectDataManagement::PdmEventType_def::EnterNuclear: { case ProjectDataManagement::PdmEventType::EventType_EnterNuclear: {
DEBUG_LOG(m_logger) << "EnterNuclear zuweisen "; DEBUG_LOG(m_logger) << "EnterNuclear zuweisen ";
m_ui->cbxNMarker->setChecked(setMarker); m_ui->cbxNMarker->setChecked(setMarker);
m_ui->cbxNMessage->setChecked(messageWindow); m_ui->cbxNMessage->setChecked(messageWindow);
break; break;
} }
case ProjectDataManagement::PdmEventType_def::EnterDangerArea: { case ProjectDataManagement::PdmEventType::EventType_EnterDangerArea: {
DEBUG_LOG(m_logger) << "EnterDangerArea zuweisen "; DEBUG_LOG(m_logger) << "EnterDangerArea zuweisen ";
m_ui->cbxDanerAreaMarker->setChecked(setMarker); m_ui->cbxDanerAreaMarker->setChecked(setMarker);
m_ui->cbxDangerAreaMessage->setChecked(messageWindow); m_ui->cbxDangerAreaMessage->setChecked(messageWindow);
break; break;
} }
case ProjectDataManagement::PdmEventType_def::EnterMineArea: { case ProjectDataManagement::PdmEventType::EventType_EnterMineArea: {
DEBUG_LOG(m_logger) << "EnterMineArea zuweisen "; DEBUG_LOG(m_logger) << "EnterMineArea zuweisen ";
m_ui->cbxMineAreaEntryMarker->setChecked(setMarker); m_ui->cbxMineAreaEntryMarker->setChecked(setMarker);
m_ui->cbxMineAreaEntryMessage->setChecked(messageWindow); m_ui->cbxMineAreaEntryMessage->setChecked(messageWindow);
break; break;
} }
case ProjectDataManagement::PdmEventType_def::HitMine: { case ProjectDataManagement::PdmEventType::EventType_HitMine: {
DEBUG_LOG(m_logger) << "HitMine zuweisen "; DEBUG_LOG(m_logger) << "HitMine zuweisen ";
m_ui->cbxMineAreaHitMarker->setChecked(setMarker); m_ui->cbxMineAreaHitMarker->setChecked(setMarker);
m_ui->cbxMineAreaHitMessage->setChecked(messageWindow); m_ui->cbxMineAreaHitMessage->setChecked(messageWindow);
break; break;
} }
case ProjectDataManagement::PdmEventType_def::Hit: { case ProjectDataManagement::PdmEventType::EventType_Hit: {
DEBUG_LOG(m_logger) << "Hit zuweisen "; DEBUG_LOG(m_logger) << "Hit zuweisen ";
m_ui->cbxDirectFireMarker->setChecked(setMarker); m_ui->cbxDirectFireMarker->setChecked(setMarker);
m_ui->cbxDirectFireMessage->setChecked(messageWindow); m_ui->cbxDirectFireMessage->setChecked(messageWindow);
break; break;
} }
case ProjectDataManagement::PdmEventType_def::HitEffectSimulation: { case ProjectDataManagement::PdmEventType::EventType_HitEffectSimulation: {
DEBUG_LOG(m_logger) << "HitEffectSimulation zuweisen "; DEBUG_LOG(m_logger) << "HitEffectSimulation zuweisen ";
m_ui->cbxIndirectFireMarker->setChecked(setMarker); m_ui->cbxIndirectFireMarker->setChecked(setMarker);
m_ui->cbxIndirectFireMessage->setChecked(messageWindow); m_ui->cbxIndirectFireMessage->setChecked(messageWindow);
break; break;
} }
case ProjectDataManagement::PdmEventType_def::CrossLocalBorderline: { case ProjectDataManagement::PdmEventType::EventType_CrossLocalBorderline: {
DEBUG_LOG(m_logger) << "CrossLocalBorderline zuweisen "; DEBUG_LOG(m_logger) << "CrossLocalBorderline zuweisen ";
m_ui->cbxLocalBorderMarker->setChecked(setMarker); m_ui->cbxLocalBorderMarker->setChecked(setMarker);
m_ui->cbxLocalBorderMessage->setChecked(messageWindow); m_ui->cbxLocalBorderMessage->setChecked(messageWindow);
break; break;
} }
case ProjectDataManagement::PdmEventType_def::CrossGlobalBorderline: { case ProjectDataManagement::PdmEventType::EventType_CrossGlobalBorderline: {
DEBUG_LOG(m_logger) << "CrossGlobalBorderline zuweisen "; DEBUG_LOG(m_logger) << "CrossGlobalBorderline zuweisen ";
m_ui->cbxGlobalBorderMarker->setChecked(setMarker); m_ui->cbxGlobalBorderMarker->setChecked(setMarker);
m_ui->cbxGlobalBorderMessage->setChecked(messageWindow); m_ui->cbxGlobalBorderMessage->setChecked(messageWindow);
break; break;
} }
case ProjectDataManagement::PdmEventType_def::AirSupport: { case ProjectDataManagement::PdmEventType::EventType_AirSupport: {
DEBUG_LOG(m_logger) << "AirSupport zuweisen "; DEBUG_LOG(m_logger) << "AirSupport zuweisen ";
m_ui->cbxAirSupportMarker->setChecked(setMarker); m_ui->cbxAirSupportMarker->setChecked(setMarker);
m_ui->cbxAirSupportMessage->setChecked(messageWindow); m_ui->cbxAirSupportMessage->setChecked(messageWindow);
@@ -41,7 +41,7 @@ public:
QCheckBox *checkboxMarker = nullptr; QCheckBox *checkboxMarker = nullptr;
QCheckBox *checkboxWindow = nullptr; QCheckBox *checkboxWindow = nullptr;
QString name; QString name;
ProjectDataManagement::PdmEventType eventTypeId = ProjectDataManagement::PdmEventType::Unknown; ProjectDataManagement::PdmEventType eventTypeId = ProjectDataManagement::PdmEventType::EventType_Unknown;
}; };
explicit AlarmDialog(QWidget *parent = nullptr); explicit AlarmDialog(QWidget *parent = nullptr);
@@ -115,7 +115,7 @@ void ConfigParticipantsDialog::setAlaramData(const AlarmManagement::AlarmConfig&
switch (alarm.eventTypeId().underlying()) switch (alarm.eventTypeId().underlying())
{ {
case ProjectDataManagement::PdmEventType_def::Hit: { case ProjectDataManagement::PdmEventType::EventType_Hit: {
DEBUG_LOG(m_logger) << "Hit zuweisen "; DEBUG_LOG(m_logger) << "Hit zuweisen ";
m_ui->cbxDirectFire->setChecked(true); m_ui->cbxDirectFire->setChecked(true);
m_ui->cbxSetMarker->setChecked(alarm.setMarker()); m_ui->cbxSetMarker->setChecked(alarm.setMarker());
@@ -123,43 +123,43 @@ void ConfigParticipantsDialog::setAlaramData(const AlarmManagement::AlarmConfig&
if (alarm.vulnerabilityState() >= 0) if (alarm.vulnerabilityState() >= 0)
{ {
ProjectDataManagement::VulnerabilityState vulState = ProjectDataManagement::VulnerabilityState vulState =
static_cast<ProjectDataManagement::VulnerabilityState_def::type>(alarm.vulnerabilityState()); static_cast<ProjectDataManagement::VulnerabilityState>(alarm.vulnerabilityState());
int index = m_ui->cbStatusDirect->findData(QVariant(vulState.underlying())); int index = m_ui->cbStatusDirect->findData(QVariant(vulState.underlying()));
m_ui->cbStatusDirect->setCurrentIndex(index); m_ui->cbStatusDirect->setCurrentIndex(index);
} }
break; break;
} }
case ProjectDataManagement::PdmEventType_def::HitEffectSimulation: { case ProjectDataManagement::PdmEventType::EventType_HitEffectSimulation: {
DEBUG_LOG(m_logger) << "HitIndirect zuweisen "; DEBUG_LOG(m_logger) << "HitIndirect zuweisen ";
m_ui->cbxIndirectFire->setChecked(true); m_ui->cbxIndirectFire->setChecked(true);
m_ui->cbxSetMarker->setChecked(alarm.setMarker()); m_ui->cbxSetMarker->setChecked(alarm.setMarker());
m_ui->cbxMessageWindow->setChecked(alarm.messageWindow()); m_ui->cbxMessageWindow->setChecked(alarm.messageWindow());
break; break;
} }
case ProjectDataManagement::PdmEventType_def::AirSupport: { case ProjectDataManagement::PdmEventType::EventType_AirSupport: {
DEBUG_LOG(m_logger) << "AirSupport zuweisen "; DEBUG_LOG(m_logger) << "AirSupport zuweisen ";
m_ui->cbxAirSupport->setChecked(true); m_ui->cbxAirSupport->setChecked(true);
m_ui->cbxSetMarker->setChecked(alarm.setMarker()); m_ui->cbxSetMarker->setChecked(alarm.setMarker());
m_ui->cbxMessageWindow->setChecked(alarm.messageWindow()); m_ui->cbxMessageWindow->setChecked(alarm.messageWindow());
break; break;
} }
case ProjectDataManagement::PdmEventType_def::HitMine: { case ProjectDataManagement::PdmEventType::EventType_HitMine: {
DEBUG_LOG(m_logger) << "HitMine zuweisen "; DEBUG_LOG(m_logger) << "HitMine zuweisen ";
m_ui->cbxMines->setChecked(true); m_ui->cbxMines->setChecked(true);
m_ui->cbxSetMarker->setChecked(alarm.setMarker()); m_ui->cbxSetMarker->setChecked(alarm.setMarker());
m_ui->cbxMessageWindow->setChecked(alarm.messageWindow()); m_ui->cbxMessageWindow->setChecked(alarm.messageWindow());
break; break;
} }
case ProjectDataManagement::PdmEventType_def::HitB: case ProjectDataManagement::PdmEventType::EventType_HitB:
case ProjectDataManagement::PdmEventType_def::HitN: case ProjectDataManagement::PdmEventType::EventType_HitN:
case ProjectDataManagement::PdmEventType_def::HitC: { case ProjectDataManagement::PdmEventType::EventType_HitC: {
DEBUG_LOG(m_logger) << "Hit N/B/C zuweisen "; DEBUG_LOG(m_logger) << "Hit N/B/C zuweisen ";
m_ui->cbxNbcAgent->setChecked(true); m_ui->cbxNbcAgent->setChecked(true);
m_ui->cbxSetMarker->setChecked(alarm.setMarker()); m_ui->cbxSetMarker->setChecked(alarm.setMarker());
m_ui->cbxMessageWindow->setChecked(alarm.messageWindow()); m_ui->cbxMessageWindow->setChecked(alarm.messageWindow());
break; break;
} }
case ProjectDataManagement::PdmEventType_def::FriendlyFire: { case ProjectDataManagement::PdmEventType::EventType_FriendlyFire: {
DEBUG_LOG(m_logger) << "FriendlyFire zuweisen "; DEBUG_LOG(m_logger) << "FriendlyFire zuweisen ";
m_ui->cbxFriendlyFire->setChecked(true); m_ui->cbxFriendlyFire->setChecked(true);
m_ui->cbxSetMarker->setChecked(alarm.setMarker()); m_ui->cbxSetMarker->setChecked(alarm.setMarker());
@@ -167,27 +167,27 @@ void ConfigParticipantsDialog::setAlaramData(const AlarmManagement::AlarmConfig&
if (alarm.vulnerabilityState() >= 0) if (alarm.vulnerabilityState() >= 0)
{ {
ProjectDataManagement::VulnerabilityState vulState = ProjectDataManagement::VulnerabilityState vulState =
static_cast<ProjectDataManagement::VulnerabilityState_def::type>(alarm.vulnerabilityState()); static_cast<ProjectDataManagement::VulnerabilityState>(alarm.vulnerabilityState());
int index = m_ui->cbStatusDirect->findData(QVariant(vulState.underlying())); int index = m_ui->cbStatusDirect->findData(QVariant(vulState.underlying()));
m_ui->cbStatusFriendly->setCurrentIndex(index); m_ui->cbStatusFriendly->setCurrentIndex(index);
} }
break; break;
} }
case ProjectDataManagement::PdmEventType_def::Manipulation: { case ProjectDataManagement::PdmEventType::EventType_Manipulation: {
DEBUG_LOG(m_logger) << "Manipulation zuweisen "; DEBUG_LOG(m_logger) << "Manipulation zuweisen ";
m_ui->cbxManipulation->setChecked(true); m_ui->cbxManipulation->setChecked(true);
m_ui->cbxSetMarker->setChecked(alarm.setMarker()); m_ui->cbxSetMarker->setChecked(alarm.setMarker());
m_ui->cbxMessageWindow->setChecked(alarm.messageWindow()); m_ui->cbxMessageWindow->setChecked(alarm.messageWindow());
break; break;
} }
case ProjectDataManagement::PdmEventType_def::CrossGlobalBorderline: { case ProjectDataManagement::PdmEventType::EventType_CrossGlobalBorderline: {
DEBUG_LOG(m_logger) << "CrossGlobalBorderline zuweisen "; DEBUG_LOG(m_logger) << "CrossGlobalBorderline zuweisen ";
m_ui->cbxGlobalBorderLine->setChecked(true); m_ui->cbxGlobalBorderLine->setChecked(true);
m_ui->cbxSetMarker->setChecked(alarm.setMarker()); m_ui->cbxSetMarker->setChecked(alarm.setMarker());
m_ui->cbxMessageWindow->setChecked(alarm.messageWindow()); m_ui->cbxMessageWindow->setChecked(alarm.messageWindow());
break; break;
} }
case ProjectDataManagement::PdmEventType_def::CrossLocalBorderline: { case ProjectDataManagement::PdmEventType::EventType_CrossLocalBorderline: {
DEBUG_LOG(m_logger) << "CrossLocalBorderline zuweisen "; DEBUG_LOG(m_logger) << "CrossLocalBorderline zuweisen ";
m_ui->cbxLocalBorderLine->setChecked(true); m_ui->cbxLocalBorderLine->setChecked(true);
m_ui->cbxSetMarker->setChecked(alarm.setMarker()); m_ui->cbxSetMarker->setChecked(alarm.setMarker());
@@ -215,7 +215,7 @@ std::vector<AlarmManagement::AlarmAction> ConfigParticipantsDialog::getCheckedVa
{ {
if (m_ui->cbxDirectFire->isChecked()) if (m_ui->cbxDirectFire->isChecked())
{ {
alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType_def::Hit); alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType::EventType_Hit);
int statusDirect = -1; int statusDirect = -1;
if (m_ui->cbStatusDirect->currentIndex() > 0) if (m_ui->cbStatusDirect->currentIndex() > 0)
statusDirect = m_ui->cbStatusDirect->currentData().toInt(); statusDirect = m_ui->cbStatusDirect->currentData().toInt();
@@ -224,7 +224,7 @@ std::vector<AlarmManagement::AlarmAction> ConfigParticipantsDialog::getCheckedVa
} }
if (m_ui->cbxFriendlyFire->isChecked()) if (m_ui->cbxFriendlyFire->isChecked())
{ {
alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType_def::FriendlyFire); alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType::EventType_FriendlyFire);
int statusFriendly = -1; int statusFriendly = -1;
if (m_ui->cbStatusFriendly->currentIndex() > 0) if (m_ui->cbStatusFriendly->currentIndex() > 0)
statusFriendly = m_ui->cbStatusFriendly->currentData().toInt(); statusFriendly = m_ui->cbStatusFriendly->currentData().toInt();
@@ -234,41 +234,41 @@ std::vector<AlarmManagement::AlarmAction> ConfigParticipantsDialog::getCheckedVa
alarmActionDds.vulnerabilityState(-1); alarmActionDds.vulnerabilityState(-1);
if (m_ui->cbxIndirectFire->isChecked()) if (m_ui->cbxIndirectFire->isChecked())
{ {
alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType_def::HitEffectSimulation); alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType::EventType_HitEffectSimulation);
alarmsDds.push_back(alarmActionDds); alarmsDds.push_back(alarmActionDds);
} }
if (m_ui->cbxAirSupport->isChecked()) if (m_ui->cbxAirSupport->isChecked())
{ {
alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType_def::AirSupport); alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType::EventType_AirSupport);
alarmsDds.push_back(alarmActionDds); alarmsDds.push_back(alarmActionDds);
} }
if (m_ui->cbxMines->isChecked()) if (m_ui->cbxMines->isChecked())
{ {
alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType_def::HitMine); alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType::EventType_HitMine);
alarmsDds.push_back(alarmActionDds); alarmsDds.push_back(alarmActionDds);
} }
if (m_ui->cbxNbcAgent->isChecked()) if (m_ui->cbxNbcAgent->isChecked())
{ {
alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType_def::HitN); alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType::EventType_HitN);
alarmsDds.push_back(alarmActionDds); alarmsDds.push_back(alarmActionDds);
alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType_def::HitB); alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType::EventType_HitB);
alarmsDds.push_back(alarmActionDds); alarmsDds.push_back(alarmActionDds);
alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType_def::HitC); alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType::EventType_HitC);
alarmsDds.push_back(alarmActionDds); alarmsDds.push_back(alarmActionDds);
} }
if (m_ui->cbxManipulation->isChecked()) if (m_ui->cbxManipulation->isChecked())
{ {
alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType_def::Manipulation); alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType::EventType_Manipulation);
alarmsDds.push_back(alarmActionDds); alarmsDds.push_back(alarmActionDds);
} }
if (m_ui->cbxGlobalBorderLine->isChecked()) if (m_ui->cbxGlobalBorderLine->isChecked())
{ {
alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType_def::CrossGlobalBorderline); alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType::EventType_CrossGlobalBorderline);
alarmsDds.push_back(alarmActionDds); alarmsDds.push_back(alarmActionDds);
} }
if (m_ui->cbxLocalBorderLine->isChecked()) if (m_ui->cbxLocalBorderLine->isChecked())
{ {
alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType_def::CrossLocalBorderline); alarmActionDds.eventTypeId(ProjectDataManagement::PdmEventType::EventType_CrossLocalBorderline);
alarmsDds.push_back(alarmActionDds); alarmsDds.push_back(alarmActionDds);
} }
} }
@@ -298,9 +298,9 @@ void ConfigParticipantsDialog::fillCbx()
ParticipantManagement::insertVulnerabilityStates(m_ui->cbStatusDirect, m_typeClass); ParticipantManagement::insertVulnerabilityStates(m_ui->cbStatusDirect, m_typeClass);
ParticipantManagement::insertVulnerabilityStates(m_ui->cbStatusFriendly, m_typeClass); ParticipantManagement::insertVulnerabilityStates(m_ui->cbStatusFriendly, m_typeClass);
m_ui->cbStatusDirect->removeItem( m_ui->cbStatusDirect->removeItem(
m_ui->cbStatusDirect->findData(ProjectDataManagement::VulnerabilityState::TemporarySeverance)); m_ui->cbStatusDirect->findData(ProjectDataManagement::VulnerabilityState::VulnerabilityState_TemporarySeverance));
m_ui->cbStatusFriendly->removeItem( m_ui->cbStatusFriendly->removeItem(
m_ui->cbStatusDirect->findData(ProjectDataManagement::VulnerabilityState::TemporarySeverance)); m_ui->cbStatusDirect->findData(ProjectDataManagement::VulnerabilityState::VulnerabilityState_TemporarySeverance));
} }
} // namespace ParticipantAlarms } // namespace ParticipantAlarms
@@ -100,7 +100,7 @@ void ParticipantsDialog::onSelectionChanged()
{ {
const ParticipantManagement::ParticipantData data(m_participantModel->getParticipantData(index)); const ParticipantManagement::ParticipantData data(m_participantModel->getParticipantData(index));
if ((data.equipmentNumber().is_set() && data.equipmentNumber().get() > 0) || if ((data.equipmentNumber().is_set() && data.equipmentNumber().get() > 0) ||
m_ppmDtc->type(data.typeId()).typeClass() == ParticipantManagement::TypeClass_def::Unit) m_ppmDtc->type(data.typeId()).typeClass() == ParticipantManagement::TypeClass::Unit)
configureAlarms = true; configureAlarms = true;
DEBUG_LOG(m_logger) << "setChildrenSelected row =" << index.row() << " column=" << index.column(); DEBUG_LOG(m_logger) << "setChildrenSelected row =" << index.row() << " column=" << index.column();
} }
@@ -51,7 +51,7 @@ bool ParticipantAlarmModel::isSelectableByAlarm(const QModelIndex& index, bool*
const ParticipantManagement::ParticipantData data(getParticipantData(index)); const ParticipantManagement::ParticipantData data(getParticipantData(index));
if ((data.equipmentNumber().is_set() && data.equipmentNumber().get() > 0) || if ((data.equipmentNumber().is_set() && data.equipmentNumber().get() > 0) ||
m_dtc->type(data.typeId()).typeClass() == ParticipantManagement::TypeClass_def::Unit) m_dtc->type(data.typeId()).typeClass() == ParticipantManagement::TypeClass::Unit)
isSimulatable = true; isSimulatable = true;
DEBUG_LOG(m_logger) << "ParticipantId: " << data.id() << " isSimulated:" << data.isSimulated() DEBUG_LOG(m_logger) << "ParticipantId: " << data.id() << " isSimulated:" << data.isSimulated()
@@ -180,9 +180,9 @@ void AesChargeEffectItemInfo::onShowDetails()
if (m_session->getForeignGuiInterface<AesBCContamination::ForeignGuiInterface>(ifc)) if (m_session->getForeignGuiInterface<AesBCContamination::ForeignGuiInterface>(ifc))
{ {
const auto gearClass = m_pdmDtc->gearClassFromChargeTypeId(aiv.chargeStruct().chargeTypeId()); const auto gearClass = m_pdmDtc->gearClassFromChargeTypeId(aiv.chargeStruct().chargeTypeId());
if (gearClass == ProjectDataManagement::GearClass_def::Biological) if (gearClass == ProjectDataManagement::GearClass::Biological)
registerDialog(ifc->showEditWindow(aiv.aesItemId(), false, this)); registerDialog(ifc->showEditWindow(aiv.aesItemId(), false, this));
else if (gearClass == ProjectDataManagement::GearClass_def::Chemical) else if (gearClass == ProjectDataManagement::GearClass::Chemical)
registerDialog(ifc->showEditWindow(aiv.aesItemId(), true, this)); registerDialog(ifc->showEditWindow(aiv.aesItemId(), true, this));
} }
else else
@@ -107,8 +107,8 @@ bool AesInfoDialog::cbFunc(const AreaEffectSimulation::AesItemView& aesItemView)
setOnlineHelpFilename(QStringLiteral("Info_Dialog-BoobyTrap")); setOnlineHelpFilename(QStringLiteral("Info_Dialog-BoobyTrap"));
break; break;
} }
case AreaEffectSimulation::AesType_def::AtOffRouteMine: case AreaEffectSimulation::AesType::AtOffRouteMine:
case AreaEffectSimulation::AesType_def::AtOffRouteMineSecondary: { case AreaEffectSimulation::AesType::AtOffRouteMineSecondary: {
handleOffRouteMine(aesItemView); handleOffRouteMine(aesItemView);
connect(m_dtc.get(), &AreaEffectSimulation::Interface::Dtc::offRouteMineChanged, this, connect(m_dtc.get(), &AreaEffectSimulation::Interface::Dtc::offRouteMineChanged, this,
&AesInfoDialog::onOffRouteMineChanged); &AesInfoDialog::onOffRouteMineChanged);
@@ -284,14 +284,14 @@ bool AesInfoDialog::init(LtsSession::LtsSession* session, const std::shared_ptr<
m_ui->lbAesId->setText(tr("AES Id:")); m_ui->lbAesId->setText(tr("AES Id:"));
if (m_aesType == AreaEffectSimulation::AesType_def::AtMineAreaSingleMines) if (m_aesType == AreaEffectSimulation::AesType::AtMineAreaSingleMines)
{ {
handleMineAraeSingleMine(); handleMineAraeSingleMine();
connect(m_dtc.get(), &AreaEffectSimulation::Interface::Dtc::dusMineStateChanged, this, connect(m_dtc.get(), &AreaEffectSimulation::Interface::Dtc::dusMineStateChanged, this,
&AesInfoDialog::onDusMineStateChanged); &AesInfoDialog::onDusMineStateChanged);
} }
else if (m_aesType == AreaEffectSimulation::AesType_def::AtDusSingleMine) else if (m_aesType == AreaEffectSimulation::AesType::AtDusSingleMine)
{ {
handleSingleDusMine(); handleSingleDusMine();
@@ -363,7 +363,7 @@ void AesInfoDialog::handleBoobyTrap(const AreaEffectSimulation::BoobyTrap& data)
DEBUG_LOG(m_logger) << Q_FUNC_INFO << "(AreaEffectSimulation::BoobyTrap)" DEBUG_LOG(m_logger) << Q_FUNC_INFO << "(AreaEffectSimulation::BoobyTrap)"
<< " data.id(): " << data.id(); << " data.id(): " << data.id();
handleAesItem(data, AesType_def::AtBoobyTrap); handleAesItem(data, AesType::AtBoobyTrap);
m_bcChargeTypeId = data.chargeStruct().chargeTypeId(); m_bcChargeTypeId = data.chargeStruct().chargeTypeId();
@@ -390,7 +390,7 @@ void AesInfoDialog::handleOffRouteMine(const AreaEffectSimulation::OffRouteMine&
DEBUG_LOG(m_logger) << Q_FUNC_INFO << "(AreaEffectSimulation::OffRouteMine)" DEBUG_LOG(m_logger) << Q_FUNC_INFO << "(AreaEffectSimulation::OffRouteMine)"
<< " data.id(): " << data.id(); << " data.id(): " << data.id();
handleAesItem(data, AesType_def::AtOffRouteMine); handleAesItem(data, AesType::AtOffRouteMine);
m_bcChargeTypeId = data.chargeStruct().chargeTypeId(); m_bcChargeTypeId = data.chargeStruct().chargeTypeId();
@@ -595,17 +595,17 @@ void AesInfoDialog::handleFunctionalArea(const FunctionalArea& data)
QStringList chargeTypesNames; QStringList chargeTypesNames;
QStringList chargeTypesShortNames; QStringList chargeTypesShortNames;
if (data.medicMode() != AesOperatingMode_def::OmNotUsed) if (data.medicMode() != AesOperatingMode::OmNotUsed)
{ {
chargeTypesNames << m_pdmDtc->trChargeTypeName(411, true); chargeTypesNames << m_pdmDtc->trChargeTypeName(411, true);
chargeTypesShortNames << m_pdmDtc->trChargeTypeShortName(411, true); chargeTypesShortNames << m_pdmDtc->trChargeTypeShortName(411, true);
} }
if (data.maintMode() != AesOperatingMode_def::OmNotUsed) if (data.maintMode() != AesOperatingMode::OmNotUsed)
{ {
chargeTypesNames << m_pdmDtc->trChargeTypeName(412, true); chargeTypesNames << m_pdmDtc->trChargeTypeName(412, true);
chargeTypesShortNames << m_pdmDtc->trChargeTypeShortName(412, true); chargeTypesShortNames << m_pdmDtc->trChargeTypeShortName(412, true);
} }
if (data.deconMode() != AesOperatingMode_def::OmNotUsed) if (data.deconMode() != AesOperatingMode::OmNotUsed)
{ {
chargeTypesNames << m_pdmDtc->trChargeTypeName(413, true); chargeTypesNames << m_pdmDtc->trChargeTypeName(413, true);
chargeTypesShortNames << m_pdmDtc->trChargeTypeShortName(413, true); chargeTypesShortNames << m_pdmDtc->trChargeTypeShortName(413, true);
@@ -693,7 +693,7 @@ void AesInfoDialog::handleMineAraeSingleMine(const Core::GeoPosition2D& position
m_ui->lblChargeTypeId->setText(QString::number(ctId)); m_ui->lblChargeTypeId->setText(QString::number(ctId));
} }
const bool isDus = static_cast<MineClass::type>(m_pdmDtc->mineClass(ctId, 0, 0)) == MineClass::DUS; const bool isDus = static_cast<MineClass>(m_pdmDtc->mineClass(ctId, 0, 0)) == MineClass::DUS;
if (isDus) if (isDus)
m_ui->lbAesId->setText(tr("DUS Mine Id:")); m_ui->lbAesId->setText(tr("DUS Mine Id:"));
else else
@@ -763,28 +763,28 @@ void AesInfoDialog::handleSingleDusMine()
switch (dsm.effectStateId().underlying()) switch (dsm.effectStateId().underlying())
{ {
case AesEffectState_def::EsExpired: case AesEffectState::EsExpired:
m_ui->lblStatus->setText(tr("Inactive")); m_ui->lblStatus->setText(tr("Inactive"));
break; break;
case AesEffectState_def::EsRemoved: case AesEffectState::EsRemoved:
m_ui->lblStatus->setText(tr("Removed")); m_ui->lblStatus->setText(tr("Removed"));
break; break;
case AesEffectState_def::EsCreated: case AesEffectState::EsCreated:
m_ui->lblStatus->setText(tr("Created")); m_ui->lblStatus->setText(tr("Created"));
break; break;
case AesEffectState_def::EsPrepared: case AesEffectState::EsPrepared:
m_ui->lblStatus->setText(tr("Prepared")); m_ui->lblStatus->setText(tr("Prepared"));
break; break;
case AesEffectState_def::EsActivated: case AesEffectState::EsActivated:
m_ui->lblStatus->setText(tr("Active")); m_ui->lblStatus->setText(tr("Active"));
break; break;
case AesEffectState_def::EsPaused: case AesEffectState::EsPaused:
m_ui->lblStatus->setText(tr("Paused")); m_ui->lblStatus->setText(tr("Paused"));
break; break;
case AesEffectState_def::EsError: case AesEffectState::EsError:
m_ui->lblStatus->setText(tr("Error")); m_ui->lblStatus->setText(tr("Error"));
break; break;
case AesEffectState_def::EsReceived: case AesEffectState::EsReceived:
m_ui->lblStatus->setText(tr("Received")); m_ui->lblStatus->setText(tr("Received"));
break; break;
default: default:
@@ -847,8 +847,8 @@ void AesInfoDialog::handleAesItem(const AesItem& aesData, AesType aesTypeId)
m_pdmDtc->gearClassFromChargeTypeId(aesData.chargeStruct().chargeTypeId()); m_pdmDtc->gearClassFromChargeTypeId(aesData.chargeStruct().chargeTypeId());
switch (gearClass.underlying()) switch (gearClass.underlying())
{ {
case ProjectDataManagement::GearClass_def::Biological: case ProjectDataManagement::GearClass::Biological:
case ProjectDataManagement::GearClass_def::Chemical: case ProjectDataManagement::GearClass::Chemical:
m_ui->lblAesType->setText(ProjectDataManagement::toString(gearClass)); m_ui->lblAesType->setText(ProjectDataManagement::toString(gearClass));
break; break;
default: default:
@@ -916,7 +916,7 @@ void AesInfoDialog::onShowDetails()
if (m_session->getForeignGuiInterface<AesBCContamination::ForeignGuiInterface>(ifc)) if (m_session->getForeignGuiInterface<AesBCContamination::ForeignGuiInterface>(ifc))
{ {
const auto gearClass = m_pdmDtc->gearClassFromChargeTypeId(m_bcChargeTypeId); const auto gearClass = m_pdmDtc->gearClassFromChargeTypeId(m_bcChargeTypeId);
if (gearClass == ProjectDataManagement::GearClass_def::Biological) if (gearClass == ProjectDataManagement::GearClass::Biological)
{ {
AreaEffectSimulation::BaseEdit* dialog = ifc->showEditWindow(m_aesEntityId, false, this); AreaEffectSimulation::BaseEdit* dialog = ifc->showEditWindow(m_aesEntityId, false, this);
if (dialog) if (dialog)
@@ -925,7 +925,7 @@ void AesInfoDialog::onShowDetails()
break; break;
} }
if (gearClass == ProjectDataManagement::GearClass_def::Chemical) if (gearClass == ProjectDataManagement::GearClass::Chemical)
{ {
AreaEffectSimulation::BaseEdit* dialog = ifc->showEditWindow(m_aesEntityId, true, this); AreaEffectSimulation::BaseEdit* dialog = ifc->showEditWindow(m_aesEntityId, true, this);
if (dialog) if (dialog)
@@ -1146,7 +1146,7 @@ void AesInfoDialog::onShowDetails()
bool AesInfoDialog::onResetDusMines() bool AesInfoDialog::onResetDusMines()
{ {
if (m_aesType == AreaEffectSimulation::AesType_def::AtMineAreaSingleMines) if (m_aesType == AreaEffectSimulation::AesType::AtMineAreaSingleMines)
{ {
DEBUG_LOG(m_logger) << "onResetDusMines() AtMineAreaSingleMines mineId: " << m_aesEntityId; DEBUG_LOG(m_logger) << "onResetDusMines() AtMineAreaSingleMines mineId: " << m_aesEntityId;
MineResetRequest req(0, {m_aesEntityId}); MineResetRequest req(0, {m_aesEntityId});
@@ -36,7 +36,6 @@ class AesInfoDialog : public LtsWidgets::LtsDialog,
} }
private: private:
NGL::INGLLogger& m_logger;
void retranslate() override; void retranslate() override;
void handleNContamination(const AesItemView& aesItemView); void handleNContamination(const AesItemView& aesItemView);
@@ -107,7 +107,7 @@ void AirSupportExplosionClusterImpactList::createModel()
{ {
m_model = new AesItemSortFilterProxyModelTmpl<EffectCluster>(m_session, this); m_model = new AesItemSortFilterProxyModelTmpl<EffectCluster>(m_session, this);
m_effectClusterModel = new EffectClusterModel({ProjectDataManagement::GearClass_def::AirSupport}, this); m_effectClusterModel = new EffectClusterModel({ProjectDataManagement::GearClass::AirSupport}, this);
m_effectClusterModel->initModel(m_session); m_effectClusterModel->initModel(m_session);
m_model->setSourceModel(m_effectClusterModel); m_model->setSourceModel(m_effectClusterModel);
} }
@@ -74,7 +74,7 @@ bool CustomViewBCContamination::calculateIcon(const BCContamination &bcContamina
bcContaOut.propagationDirection = bcContamination.propagationDirection(); bcContaOut.propagationDirection = bcContamination.propagationDirection();
const QPolygonF poly = AreaEffectSimulation::Polygons::bcContamination(bcContaOut, const QPolygonF poly = AreaEffectSimulation::Polygons::bcContamination(bcContaOut,
ProjectDataManagement::VolatilityType_def::get_default(), ProjectDataManagement::VolatilityType::get_default(),
bcContamination.impactRadius(), bcContamination.impactRadius(),
QDateTime::currentDateTime()); QDateTime::currentDateTime());
@@ -132,12 +132,12 @@ void BCContaminationEdit::enableUiElements(bool enable)
m_ui->cbWeather->setEnabled(enable); m_ui->cbWeather->setEnabled(enable);
m_ui->pbClear->setEnabled(enable); m_ui->pbClear->setEnabled(enable);
if (m_aesItem.effectStateId() == AesEffectState_def::EsExpired) if (m_aesItem.effectStateId() == AesEffectState::EsExpired)
{ {
m_ui->leIdentifier->setText(QString::fromStdString(m_aesItem.name())); m_ui->leIdentifier->setText(QString::fromStdString(m_aesItem.name()));
__unchange__(); __unchange__();
} }
if (m_aesItem.effectStateId() == AesEffectState_def::EsActivated) if (m_aesItem.effectStateId() == AesEffectState::EsActivated)
{ {
QString name = m_ui->leIdentifier->text(); QString name = m_ui->leIdentifier->text();
auto baseData = m_dtc->bCContamination(m_aesItem.id()); auto baseData = m_dtc->bCContamination(m_aesItem.id());
@@ -270,7 +270,7 @@ void BCContaminationEdit::setData(const BCContamination &contamination, bool cop
if (copy) if (copy)
{ {
m_aesItem.id(0); m_aesItem.id(0);
m_aesItem.effectStateId(AreaEffectSimulation::AesEffectState_def::get_default()); m_aesItem.effectStateId(AreaEffectSimulation::AesEffectState::get_default());
} }
m_ui->leIdentifier->setText(QString::fromStdString(contamination.name())); m_ui->leIdentifier->setText(QString::fromStdString(contamination.name()));
m_ui->dteEffectStart->setMsecsSinceEpoch(contamination.effectStart().is_set() ? contamination.effectStart().get() : 0); m_ui->dteEffectStart->setMsecsSinceEpoch(contamination.effectStart().is_set() ? contamination.effectStart().get() : 0);
@@ -348,7 +348,7 @@ bool BCContaminationEdit::apply()
chargeType, chargeType,
pos, pos,
radius, radius,
static_cast<AesWeatherSource::inner_enum>(weathersource), static_cast<AesWeatherSource>(weathersource),
LtsUtils::toOptional(partyId), LtsUtils::toOptional(partyId),
LtsUtils::toOptional(participantId), LtsUtils::toOptional(participantId),
dds::core::optional<double>(), dds::core::optional<double>(),
@@ -51,20 +51,20 @@ void BaseEdit::onAesItemModifyReply(const Core::FunctionReplyObject& replyObject
bool BaseEdit::isModifiable() const bool BaseEdit::isModifiable() const
{ {
AesEffectState effectState = m_aesItem.effectStateId(); AesEffectState effectState = m_aesItem.effectStateId();
return (effectState == AreaEffectSimulation::AesEffectState_def::EsPaused || return (effectState == AreaEffectSimulation::AesEffectState::EsPaused ||
effectState == AreaEffectSimulation::AesEffectState_def::EsActivated || effectState == AreaEffectSimulation::AesEffectState::EsActivated ||
effectState == AreaEffectSimulation::AesEffectState_def::EsPrepared || effectState == AreaEffectSimulation::AesEffectState::EsPrepared ||
effectState == AreaEffectSimulation::AesEffectState_def::EsCreated || effectState == AreaEffectSimulation::AesEffectState::EsCreated ||
effectState == AreaEffectSimulation::AesEffectState_def::EsUnknown || effectState == AreaEffectSimulation::AesEffectState::EsUnknown ||
effectState == AreaEffectSimulation::AesEffectState_def::EsReceived) && effectState == AreaEffectSimulation::AesEffectState::EsReceived) &&
(!m_session->isReplayPartition()) && (m_session->app() != LtsAppDescriptor::App::OC); (!m_session->isReplayPartition()) && (m_session->app() != LtsAppDescriptor::App::OC);
} }
bool BaseEdit::isOnlyNameModifiable() const bool BaseEdit::isOnlyNameModifiable() const
{ {
AesEffectState effectState = m_aesItem.effectStateId(); AesEffectState effectState = m_aesItem.effectStateId();
return (effectState == AreaEffectSimulation::AesEffectState_def::EsPaused || return (effectState == AreaEffectSimulation::AesEffectState::EsPaused ||
effectState == AreaEffectSimulation::AesEffectState_def::EsActivated) && effectState == AreaEffectSimulation::AesEffectState::EsActivated) &&
(!m_session->isReplayPartition()) && (m_session->app() != LtsAppDescriptor::App::OC); (!m_session->isReplayPartition()) && (m_session->app() != LtsAppDescriptor::App::OC);
} }
@@ -166,10 +166,10 @@ void BaseEdit::setEffectStartEnabled(LtsWidgets::LtsDateTimeEdit* dte, bool enab
m_session->getDtc<ExerciseManagement::DataInterface>(exmDtc); m_session->getDtc<ExerciseManagement::DataInterface>(exmDtc);
ExerciseManagement::Exercise exercise = exmDtc->exercise(exerciseId); ExerciseManagement::Exercise exercise = exmDtc->exercise(exerciseId);
enable = (exercise.state() == ExerciseManagement::ExerciseState_def::Started || enable = (exercise.state() == ExerciseManagement::ExerciseState::Started ||
exercise.state() == ExerciseManagement::ExerciseState_def::Paused); exercise.state() == ExerciseManagement::ExerciseState::Paused);
if (exercise.state() == ExerciseManagement::ExerciseState_def::Created) if (exercise.state() == ExerciseManagement::ExerciseState::Created)
dte->setChecked(false); dte->setChecked(false);
else else
dte->setChecked(dte->msecsSinceEpoch() > 0); dte->setChecked(dte->msecsSinceEpoch() > 0);
@@ -268,7 +268,7 @@ void BaseEdit::onAreaChanged(const AesItem& data, DataModification modType)
if (data.id() != m_aesItem.id()) if (data.id() != m_aesItem.id())
return; return;
if (modType == DataModification::eRemoved || data.effectStateId() == AesEffectState_def::EsRemoved) if (modType == DataModification::eRemoved || data.effectStateId() == AesEffectState::EsRemoved)
{ {
__unchange__(); __unchange__();
@@ -302,7 +302,7 @@ bool BaseEdit::init(int aesItemId, LtsSession::LtsSession* session)
if (aesItemId == 0) if (aesItemId == 0)
{ {
m_aesItem.effectSourceId(ProjectDataManagement::EffectSource_def::ES_Internal); m_aesItem.effectSourceId(ProjectDataManagement::EffectSource::ES_Internal);
m_buttonBox->setText(LtsWidgets::DialogButton::Ok, tr("Add")); m_buttonBox->setText(LtsWidgets::DialogButton::Ok, tr("Add"));
} }
@@ -285,7 +285,7 @@ bool AesItemSortFilterProxyModel::checkFilter(int source_row) const
return false; return false;
const auto effectStateId = aesEffectStateId(source_row); const auto effectStateId = aesEffectStateId(source_row);
if (effectStateId == AesEffectState_def::EsRemoved) if (effectStateId == AesEffectState::EsRemoved)
return false; return false;
if (showExpired()) if (showExpired())
@@ -347,11 +347,11 @@ public:
{ {
const auto es = aesItem(row).effectStateId(); const auto es = aesItem(row).effectStateId();
return es != AreaEffectSimulation::AesEffectState_def::EsCreated && return es != AreaEffectSimulation::AesEffectState::EsCreated &&
es != AreaEffectSimulation::AesEffectState_def::EsPrepared && es != AreaEffectSimulation::AesEffectState::EsPrepared &&
es != AreaEffectSimulation::AesEffectState_def::EsActivated && es != AreaEffectSimulation::AesEffectState::EsActivated &&
es != AreaEffectSimulation::AesEffectState_def::EsPaused && es != AreaEffectSimulation::AesEffectState::EsPaused &&
es != AreaEffectSimulation::AesEffectState_def::EsReceived; es != AreaEffectSimulation::AesEffectState::EsReceived;
} }
bool isExternal(int row) const override bool isExternal(int row) const override
{ {
@@ -35,21 +35,21 @@ Qt::BrushStyle PixmapLabel::checkForBrushStyle(const AesEffectState &state)
{ {
switch(state.underlying()) switch(state.underlying())
{ {
case AesEffectState_def::EsUnknown: case AesEffectState::EsUnknown:
return Qt::BrushStyle::NoBrush; return Qt::BrushStyle::NoBrush;
case AesEffectState_def::EsPrepared: case AesEffectState::EsPrepared:
case AesEffectState_def::EsFired: case AesEffectState::EsFired:
return Qt::BrushStyle::BDiagPattern; return Qt::BrushStyle::BDiagPattern;
case AesEffectState_def::EsCreated: case AesEffectState::EsCreated:
case AesEffectState_def::EsReceived: case AesEffectState::EsReceived:
return Qt::BrushStyle::VerPattern; return Qt::BrushStyle::VerPattern;
case AesEffectState_def::EsActivated: case AesEffectState::EsActivated:
return Qt::BrushStyle::CrossPattern; return Qt::BrushStyle::CrossPattern;
case AesEffectState_def::EsRemoved: case AesEffectState::EsRemoved:
return Qt::BrushStyle::NoBrush; return Qt::BrushStyle::NoBrush;
case AesEffectState_def::EsPaused: case AesEffectState::EsPaused:
case AesEffectState_def::EsExpired: case AesEffectState::EsExpired:
case AesEffectState_def::EsError: case AesEffectState::EsError:
return Qt::BrushStyle::SolidPattern; return Qt::BrushStyle::SolidPattern;
} }
return Qt::BrushStyle::NoBrush; return Qt::BrushStyle::NoBrush;
@@ -83,12 +83,12 @@ void BorderlineEdit::enableUiElements(bool enable)
m_ui->leIdentifier->setEnabled(enable || isOnlyNameModifiable()); m_ui->leIdentifier->setEnabled(enable || isOnlyNameModifiable());
if (m_aesItem.effectStateId() == AesEffectState_def::EsExpired) if (m_aesItem.effectStateId() == AesEffectState::EsExpired)
{ {
m_ui->leIdentifier->setText(QString::fromStdString(m_aesItem.name())); m_ui->leIdentifier->setText(QString::fromStdString(m_aesItem.name()));
__unchange__(); __unchange__();
} }
if (m_aesItem.effectStateId() == AesEffectState_def::EsActivated) if (m_aesItem.effectStateId() == AesEffectState::EsActivated)
{ {
QString name = m_ui->leIdentifier->text(); QString name = m_ui->leIdentifier->text();
auto baseData = m_dtc->borderline(m_aesItem.id()); auto baseData = m_dtc->borderline(m_aesItem.id());
@@ -155,7 +155,7 @@ void BorderlineEdit::setData(const Borderline &borderline, bool copy)
if (copy) if (copy)
{ {
m_aesItem.id(0); m_aesItem.id(0);
m_aesItem.effectStateId(AreaEffectSimulation::AesEffectState_def::get_default()); m_aesItem.effectStateId(AreaEffectSimulation::AesEffectState::get_default());
} }
m_ui->leIdentifier->setText(QString::fromStdString(borderline.name())); m_ui->leIdentifier->setText(QString::fromStdString(borderline.name()));
if ( borderline.partyId().is_set()) if ( borderline.partyId().is_set())
@@ -285,7 +285,7 @@ Borderline BorderlineEdit::jsonToBorderline(const QByteArray &content)
borderline.effectMarkingInTa(obj[QStringLiteral("effectMarkingInTa")].toInt()); borderline.effectMarkingInTa(obj[QStringLiteral("effectMarkingInTa")].toInt());
borderline.effectStart(obj[QStringLiteral("effectStart")].toDouble()); borderline.effectStart(obj[QStringLiteral("effectStart")].toDouble());
int effectStateId = obj[QStringLiteral("effectStateId")].toInt(); int effectStateId = obj[QStringLiteral("effectStateId")].toInt();
borderline.effectStateId(static_cast<AreaEffectSimulation::AesEffectState::inner_enum>(effectStateId)); borderline.effectStateId(static_cast<AreaEffectSimulation::AesEffectState>(effectStateId));
borderline.operatorId(obj[QStringLiteral("operatorId")].toInt()); borderline.operatorId(obj[QStringLiteral("operatorId")].toInt());
borderline.id(0); borderline.id(0);
borderline.name(obj[QStringLiteral("leIdentifier")].toString().toStdString()); borderline.name(obj[QStringLiteral("leIdentifier")].toString().toStdString());
Loaded 100 of 1291 files, more files were not shown because too many files have changed in this diff. Show more