From 3028302f7b9446e68264543dd5499227c85305b7 Mon Sep 17 00:00:00 2001 From: Torsten Wierschin Date: Tue, 15 Sep 2026 18:20:51 +0000 Subject: [PATCH] Qt6 Migration: Merge latest Qt5 devel content and apply migration fixes - Merged 292 changed files from dlbo snapshot - Fixed IDL enum collisions (PortType, PdmEventType) - Fixed Grantlee template for C++11 scoped enums - Fixed CMake VERSION_GREATER syntax - Added missing directories (THP, LtsRestClient, etc.) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .gitlab-ci.yml | 4 +- Lts/Common/CMakeLists.txt | 34 +- .../CodeGen/svc_translation.cpp.grantlee | 2 +- .../LtsAppDescriptor/lts_app_descriptor.h | 1 + .../LtsPluginManager/lts_plugin_loader.cpp | 6 +- .../LtsPluginManager/lts_plugin_loader.h | 2 + Lts/Common/LtsRestClient/CMakeLists.txt | 27 ++ Lts/Common/LtsRestClient/lts_rest_client.cpp | 172 ++++++++++ Lts/Common/LtsRestClient/lts_rest_client.h | 51 +++ Lts/Common/LtsSession/lts_session_data_dds.h | 2 +- .../LtsSession/lts_session_lock_handler.h | 2 +- .../LtsUtilsGuiDds/request_helper.h | 4 +- Lts/Common/LtsWidgets/CMakeLists.txt | 3 + Lts/DDS/Core/pacemaker.h | 2 +- Lts/DDS/FTC/generic_ftc.h | 2 +- Lts/DDS/FTC/generic_ftc_impl.h | 2 +- Lts/DDS/FTS/generic_fts_impl.h | 2 +- .../Explosion/aes_explosions_edit_adler.cpp | 2 + .../aes_explosions_edit_adler_standalone.cpp | 31 +- .../Gui/Explosion/aes_rocket_utility.cpp | 4 +- .../HQReports/flm_hq_report_converter.cpp | 188 +++++----- .../HQReports/flm_hq_report_converter.h | 39 ++- .../Explorer/HQReports/flm_hq_report_edit.cpp | 50 +-- .../Explorer/HQReports/flm_hq_report_edit.ui | 2 +- .../HQReports/flm_hq_report_model.cpp | 324 +++++++++++++----- .../Explorer/HQReports/flm_hq_report_model.h | 45 ++- .../Gui/MarkerEdit/mrk_edit_gui_plugin.h | 2 +- .../ParticipantManagement/CMakeLists.txt | 8 + .../Gui/ParticipantInfo/CMakeLists.txt | 2 + .../participant_info_dialog.cpp | 32 ++ .../ParticipantInfo/participant_info_dialog.h | 1 + .../Gui/PartyEdit/ppm_party_edit.cpp | 2 +- .../Gui/PartyEdit/ppm_party_model.cpp | 9 +- .../participant_info_gui_element_interface.h | 23 ++ .../Script/ScriptEditor/pre_script_dialog.h | 2 +- .../ScriptTimelineEditor/pre_script_dialog.h | 2 +- .../Data/srm_data_plugin.cpp | 4 +- .../Gui/ReplayManagement/replay_dialog.h | 2 +- .../ReplayManagement/replay_dialog_model.h | 2 +- .../srm_data_plugin_interface.h | 2 +- Lts/Projects/Guez/lts-cc.conf | 4 + Lts/Proxies/Buildings/dds_handler.cpp | 2 +- Lts/Proxies/Buildings/main_handler.cpp | 2 +- Lts/Proxies/CombatNetRadio/dds_handler.cpp | 2 +- Lts/Proxies/CombatNetRadio/main_handler.cpp | 2 +- Lts/Proxies/ComponentMonitor/dds_handler.cpp | 2 +- Lts/Proxies/ComponentMonitor/dds_handler.h | 2 +- Lts/Proxies/ComponentMonitor/main_handler.cpp | 2 +- Lts/Proxies/DifferentialGPS/dds_handler.cpp | 2 +- Lts/Proxies/DifferentialGPS/mainthread.cpp | 2 +- Lts/Proxies/GuezNasat/initialization.cpp | 2 +- .../Apache/dds_handler.cpp | 2 +- .../Apache/dds_handler.h | 2 +- .../Apache/main_handler.cpp | 2 +- .../Guez/dds_handler.cpp | 2 +- .../HighLevelArchitecture/Guez/dds_handler.h | 2 +- .../Guez/main_handler.cpp | 2 +- .../Hla_test_tool/main_handler.cpp | 2 +- .../Plugins/AdlerJson/aes_handler.cpp | 8 +- .../Plugins/AdlerJson/aes_handler.h | 2 +- .../Plugins/AdlerJson/json_dispatcher.cpp | 82 ++--- .../Plugins/AdlerJson/json_dispatcher.h | 3 +- .../Plugins/AdlerJson/json_handler_rx.cpp | 26 +- .../Plugins/AdlerJson/main_dispatcher.cpp | 2 +- .../Plugins/AdlerJson/main_dispatcher.h | 2 +- .../Plugins/AdlerJson/telegrams.cpp | 32 +- .../Plugins/AdlerJson/telegrams.h | 32 +- .../Plugins/ApacheHlaJson/dds_handler.cpp | 2 +- .../Plugins/ApacheHlaJson/hla_dispatcher.h | 2 +- .../Plugins/ApacheHlaJson/main_dispatcher.h | 2 +- .../DebugJsonDir/directory_dispatcher.h | 2 +- .../Plugins/HlaJson/hla_dispatcher.h | 2 +- .../Plugins/HlaJson/main_dispatcher.h | 2 +- .../Plugins/Nmea/main_dispatcher.h | 2 +- .../Plugins/Nmea/nmea_dispatcher.h | 2 +- .../Plugins/UAS/plugin_instance.h | 2 +- .../Plugins/WlsTetra/main_dispatcher.h | 2 +- .../Plugins/WlsTetra/tetra_dispatcher.h | 2 +- .../Plugins/WlsTetra/wls_dispatcher.h | 2 +- Lts/Proxies/TrainingAreaBase/dds_handler.cpp | 2 +- Lts/Proxies/TrainingAreaBase/dds_handler.h | 2 +- Lts/Proxies/TrainingAreaBase/main_handler.cpp | 2 +- .../TrainingAreaBase/recv_from_dds_fts.cpp | 5 +- .../TrainingAreaBaseOC/dds_handler.cpp | 2 +- Lts/Proxies/TrainingAreaBaseOC/dds_handler.h | 2 +- .../TrainingAreaBaseOC/main_handler.cpp | 2 +- .../WarehouseManagement/dds_handler.cpp | 2 +- .../dds_handler_exercise.cpp | 2 +- .../WarehouseManagement/main_handler.cpp | 2 +- .../WirelessLocationSystem/dds_handler.cpp | 2 +- .../WirelessLocationSystem/main_handler.cpp | 2 +- Lts/Services/AlarmManagement/dds_handler.h | 4 +- .../AlarmManagement/object_emergency_call.h | 2 +- .../abstract_firing_strategy.cpp | 20 +- .../abstract_firing_strategy.h | 4 +- .../default_firing_strategy.cpp | 39 ++- .../default_firing_strategy.h | 2 +- .../dm72_firing_strategy.cpp | 34 +- .../dm72_firing_strategy.h | 2 +- .../gmlrs_firing_strategy.cpp | 12 +- .../gmlrs_firing_strategy.h | 2 +- .../smart_firing_strategy.cpp | 35 +- .../smart_firing_strategy.h | 2 +- .../ModuleTest_Limits/limits_module_test.cpp | 2 +- .../AreaEffectSimulation/dds_handler.cpp | 4 +- .../AreaEffectSimulation/dds_handler.h | 4 +- .../handler_charge_administration.cpp | 6 +- .../AreaEffectSimulation/main_handler.cpp | 2 +- .../mine_corridor_creator.h | 2 +- .../AreaEffectSimulation/object_base.h | 2 +- .../AreaEffectSimulation/object_borderline.h | 2 +- .../object_charge_effect.h | 2 +- .../AreaEffectSimulation/object_effector.cpp | 13 +- .../AreaEffectSimulation/object_gas_pipe.h | 2 +- Lts/Services/AssetManagement/dds_handler.cpp | 2 +- Lts/Services/AssetManagement/dds_handler.h | 2 +- Lts/Services/AssetManagement/main_handler.cpp | 2 +- Lts/Services/AssetManagement/object_asset.h | 2 +- .../AssetManagement/object_map_description.h | 2 +- .../AssetManagement/object_relay_info.h | 2 +- .../AssetManagement/object_training_area.h | 2 +- .../AudioVideoManagement/dds_handler.cpp | 2 +- .../AudioVideoManagement/dds_handler.h | 4 +- .../AudioVideoManagement/main_handler.cpp | 2 +- .../object_menu_struct.cpp | 2 +- .../Plugins/Explosions/handler_explosions.cpp | 19 +- .../Plugins/TargetAreas/dds_handler.cpp | 2 +- .../Plugins/TargetAreas/dds_handler.h | 4 +- .../CentralEffectSimulation/dds_handler.cpp | 2 +- .../CentralEffectSimulation/dds_handler.h | 4 +- .../handler_participant.cpp | 11 +- .../CentralEffectSimulation/main_handler.cpp | 2 +- .../CentralEffectSimulation/point_helpers.h | 2 +- .../CodificationManagement/dds_handler.h | 2 +- .../CodificationManagement/initialization.cpp | 2 +- Lts/Services/EffectShowClient/dds_handler.cpp | 2 +- Lts/Services/EffectShowClient/dds_handler.h | 2 +- .../EffectShowClient/main_handler.cpp | 2 +- Lts/Services/EffectShowClient/object_order.h | 2 +- .../EffectShowManagement/dds_handler.h | 6 +- .../EffectShowManagement/object_aes_data.h | 2 +- .../EffectShowManagement/object_effect_show.h | 2 +- .../object_effect_show_actor_relocation.h | 2 +- .../object_effect_show_vehicle_status.h | 2 +- Lts/Services/Evaluations/dds_handler.cpp | 2 +- Lts/Services/Evaluations/initialization.cpp | 2 +- Lts/Services/Evaluations/object_comment.h | 2 +- Lts/Services/Evaluations/object_criterium.h | 2 +- .../Evaluations/object_evaluation_element.h | 2 +- .../Evaluations/object_san_category_line.h | 2 +- .../Evaluations/object_san_nine_liner.h | 2 +- .../ExerciseEventManagement/dds_handler.h | 2 +- .../ExerciseEventManagement/main_handler.cpp | 2 +- .../ExerciseManagement/dds_handler.cpp | 2 +- Lts/Services/ExerciseManagement/dds_handler.h | 2 +- .../ExerciseManagement/main_handler.cpp | 2 +- .../ExerciseManagement/object_exercise.h | 2 +- .../object_exercise_phase.h | 2 +- Lts/Services/FileManagement/dds_handler.cpp | 2 +- Lts/Services/FileManagement/dds_handler.h | 2 +- Lts/Services/FileManagement/main_handler.cpp | 2 +- .../FileManagement/object_file_content.h | 2 +- .../FileManagement/object_file_type_info.h | 2 +- Lts/Services/FileManagement/object_folder.h | 2 +- Lts/Services/FilterManagement/dds_handler.cpp | 2 +- Lts/Services/FilterManagement/dds_handler.h | 2 +- .../FilterManagement/main_handler.cpp | 2 +- .../GuezIedManagement/dds_handler.cpp | 2 +- Lts/Services/GuezIedManagement/dds_handler.h | 2 +- .../GuezIedManagement/main_handler.cpp | 2 +- Lts/Services/GuezIedManagement/object_ied.h | 2 +- .../GuezMinelayerProcessing/dds_handler.cpp | 2 +- .../GuezMinelayerProcessing/dds_handler.h | 2 +- .../InfrastructureManagement/dds_handler.cpp | 2 +- .../InfrastructureManagement/dds_handler.h | 2 +- .../InfrastructureManagement/main_handler.cpp | 2 +- .../object_effect_area.h | 2 +- .../object_instrumentation_asset.h | 2 +- .../object_main_schedule.h | 2 +- .../object_main_structure_element.h | 2 +- .../object_mounting_point_asset.h | 2 +- .../object_special_area.h | 2 +- .../object_structure_element.h | 2 +- Lts/Services/MarkerManagement/dds_handler.h | 2 +- Lts/Services/MarkerManagement/object_marker.h | 2 +- .../MarkerManagement/object_snapshot.h | 2 +- Lts/Services/Messaging/dds_handler.cpp | 2 +- Lts/Services/Messaging/dds_handler.h | 4 +- Lts/Services/Messaging/main_handler.cpp | 2 +- .../MeteoDataManagement/dds_handler.cpp | 2 +- .../MeteoDataManagement/dds_handler.h | 2 +- .../MeteoDataManagement/main_handler.cpp | 2 +- Lts/Services/NmeaManagement/dds_handler.cpp | 2 +- Lts/Services/NmeaManagement/dds_handler.h | 6 +- .../NotificationManagement/dds_handler.cpp | 2 +- .../NotificationManagement/dds_handler.h | 4 +- .../NotificationManagement/main_handler.cpp | 2 +- .../object_notification.h | 2 +- .../Messages/client_message.h | 2 +- .../Messages/reply_message.h | 2 +- Lts/Services/OcBaseDownload/dds_handler.cpp | 2 +- Lts/Services/OcBaseDownload/dds_handler.h | 4 +- .../OcBaseDownload/handler_base_download.cpp | 2 +- Lts/Services/OcBaseDownload/main_handler.cpp | 2 +- .../Messages/client_message.h | 2 +- .../Messages/reply_message.h | 2 +- .../OcSituationClient/dds_handler.cpp | 2 +- Lts/Services/OcSituationClient/dds_handler.h | 4 +- .../OcSituationClient/main_handler.cpp | 2 +- .../OcSituationServer/dds_handler.cpp | 2 +- Lts/Services/OcSituationServer/dds_handler.h | 2 +- .../OcSituationServer/main_handler.cpp | 2 +- .../OperatorManagement/dds_handler.cpp | 2 +- Lts/Services/OperatorManagement/dds_handler.h | 2 +- .../handler_locked_topics.cpp | 2 +- .../handler_locked_topics.h | 6 +- .../OperatorManagement/main_handler.cpp | 2 +- .../object_access_control_level.h | 2 +- .../OperatorManagement/object_group.h | 2 +- .../OperatorManagement/object_operator.h | 2 +- .../firing_unit_validator.h | 2 +- .../object_target_information.h | 2 +- .../ParticipantManagement/dds_handler.cpp | 2 +- .../ParticipantManagement/dds_handler.h | 2 +- .../ParticipantManagement/exercise_time.h | 2 +- .../ParticipantManagement/main_handler.cpp | 2 +- .../PresentationManagement/dds_handler.h | 2 +- .../object_presentation.h | 2 +- .../ProjectDataManagement/dds_handler.cpp | 2 +- .../ProjectDataManagement/dds_handler.h | 2 +- .../ProjectDataManagement/main_handler.cpp | 2 +- .../RecordingManagement/dds_handler.cpp | 2 +- .../RecordingManagement/main_handler.cpp | 2 +- .../Analyzer/main_handler.cpp | 2 +- .../Generator/handler_report_data.cpp | 2 +- .../Generator/main_handler.cpp | 2 +- .../Generator/object_report_info.h | 2 +- Lts/Services/ReportManagement/dds_handler.cpp | 2 +- Lts/Services/ReportManagement/dds_handler.h | 4 +- .../RoutingServiceNG/main_handler.cpp | 2 +- .../Messages/reply_message.h | 2 +- Lts/Services/ServiceManagement/group.h | 2 +- .../ServiceManagement/heartbeat_listener.h | 2 +- .../ServiceManagement/service_process.h | 2 +- Lts/Services/SituationReplay/dds_handler.h | 2 +- .../SituationReplay/object_situation_replay.h | 2 +- Lts/Services/SoundManagement/dds_handler.cpp | 2 +- Lts/Services/SoundManagement/dds_handler.h | 6 +- Lts/Services/SoundManagement/main_handler.cpp | 2 +- Lts/Services/TargetManagement/dds_handler.cpp | 2 +- Lts/Services/TargetManagement/dds_handler.h | 6 +- .../TargetManagement/main_handler.cpp | 2 +- .../TargetManagement/object_shootback_area.h | 2 +- .../object_shootback_target.h | 2 +- .../object_target_area_assignment.h | 2 +- .../VideoOverlayManagement/dds_handler.cpp | 2 +- .../VideoOverlayManagement/main_handler.cpp | 2 +- .../Messages/reply_message.h | 2 +- Lts/Services/WarehouseGuez/dds_handler.h | 4 +- .../WarehouseGuez/object_equipment_type_wh.h | 2 +- .../WarehouseGuez/object_injury_model.h | 2 +- Lts/Services/skeleton/base/dds_handler.cpp | 2 +- Lts/Services/skeleton/base/dds_handler.h | 2 +- Lts/Services/skeleton/stub/object_xxx.h | 2 +- .../guez_pdm/GUEZ_EXC_PDM_werte.xlsm | Bin 166163 -> 166502 bytes .../guez_pdm/building_charge_effect.csv | 8 + .../guez_pdm/charge_type.csv | 22 +- ...rge_type_igniter_type_igniter_function.csv | 32 +- .../guez_pdm_charge_type_update.sql | 19 +- .../guez_pdm_values.sql | 73 ++-- .../WebSocketSimulator/awss_icd_test.cpp | 57 +++ .../Adler/WebSocketSimulator/awss_icd_test.h | 3 + Lts/Tools/CMakeLists.txt | 3 + Lts/Tools/DBUpdate/CMakeLists.txt | 1 + ...uez_DM72_update_charge_type_properties.upd | 4 +- .../guez/2.183_guez_pdm_charge_type.upd | 48 +++ .../updates/guez/2.184_guez_charge.upd | 29 ++ Lts/Tools/Examples/Plugins/CMakeLists.txt | 18 + Lts/Tools/Examples/Plugins/app/CMakeLists.txt | 6 + Lts/Tools/Examples/Plugins/app/main.cpp | 112 ++++++ .../Plugins/interfaces/child_interface.h | 25 ++ .../Plugins/interfaces/parent_interface.h | 22 ++ .../Examples/Plugins/plugins/CMakeLists.txt | 4 + .../Plugins/plugins/child_beta/CMakeLists.txt | 10 + .../Plugins/plugins/child_beta/child_beta.cpp | 36 ++ .../Plugins/plugins/child_beta/child_beta.h | 33 ++ .../plugins/child_beta/child_beta.json | 3 + .../plugins/child_gamma/CMakeLists.txt | 10 + .../plugins/child_gamma/child_gamma.cpp | 37 ++ .../Plugins/plugins/child_gamma/child_gamma.h | 33 ++ .../plugins/child_gamma/child_gamma.json | 3 + .../plugins/parent_alpha/CMakeLists.txt | 10 + .../plugins/parent_alpha/parent_alpha.cpp | 31 ++ .../plugins/parent_alpha/parent_alpha.h | 35 ++ .../plugins/parent_alpha/parent_alpha.json | 3 + Lts/Tools/Examples/Plugins/readme.txt | 3 + .../Examples/TestGuiElement/CMakeLists.txt | 31 ++ .../Examples/TestGuiElement/custom_widget.cpp | 33 ++ .../Examples/TestGuiElement/custom_widget.h | 24 ++ .../Examples/TestGuiElement/custom_widget.ui | 70 ++++ .../TestGuiElement/gui_element_plugin.cpp | 60 ++++ .../TestGuiElement/gui_element_plugin.h | 36 ++ Lts/Tools/RestClientUi/CMakeLists.txt | 38 ++ Lts/Tools/RestClientUi/main.cpp | 22 ++ Lts/Tools/RestClientUi/main_window.cpp | 301 ++++++++++++++++ Lts/Tools/RestClientUi/main_window.h | 38 ++ Lts/Tools/RestClientUi/main_window.ui | 215 ++++++++++++ .../rest_templates/01_itemsKeys.json | 5 + specs/external/ctc_devel_tds_qt5-1.0.spec | 4 +- translations/tds_de_DE.ts | 16 +- 310 files changed, 2823 insertions(+), 740 deletions(-) create mode 100644 Lts/Common/LtsRestClient/CMakeLists.txt create mode 100644 Lts/Common/LtsRestClient/lts_rest_client.cpp create mode 100644 Lts/Common/LtsRestClient/lts_rest_client.h create mode 100644 Lts/Plugins/ParticipantManagement/participant_info_gui_element_interface.h create mode 100644 Lts/Tools/DBUpdate/updates/guez/2.183_guez_pdm_charge_type.upd create mode 100644 Lts/Tools/DBUpdate/updates/guez/2.184_guez_charge.upd create mode 100644 Lts/Tools/Examples/Plugins/CMakeLists.txt create mode 100644 Lts/Tools/Examples/Plugins/app/CMakeLists.txt create mode 100644 Lts/Tools/Examples/Plugins/app/main.cpp create mode 100644 Lts/Tools/Examples/Plugins/interfaces/child_interface.h create mode 100644 Lts/Tools/Examples/Plugins/interfaces/parent_interface.h create mode 100644 Lts/Tools/Examples/Plugins/plugins/CMakeLists.txt create mode 100644 Lts/Tools/Examples/Plugins/plugins/child_beta/CMakeLists.txt create mode 100644 Lts/Tools/Examples/Plugins/plugins/child_beta/child_beta.cpp create mode 100644 Lts/Tools/Examples/Plugins/plugins/child_beta/child_beta.h create mode 100644 Lts/Tools/Examples/Plugins/plugins/child_beta/child_beta.json create mode 100644 Lts/Tools/Examples/Plugins/plugins/child_gamma/CMakeLists.txt create mode 100644 Lts/Tools/Examples/Plugins/plugins/child_gamma/child_gamma.cpp create mode 100644 Lts/Tools/Examples/Plugins/plugins/child_gamma/child_gamma.h create mode 100644 Lts/Tools/Examples/Plugins/plugins/child_gamma/child_gamma.json create mode 100644 Lts/Tools/Examples/Plugins/plugins/parent_alpha/CMakeLists.txt create mode 100644 Lts/Tools/Examples/Plugins/plugins/parent_alpha/parent_alpha.cpp create mode 100644 Lts/Tools/Examples/Plugins/plugins/parent_alpha/parent_alpha.h create mode 100644 Lts/Tools/Examples/Plugins/plugins/parent_alpha/parent_alpha.json create mode 100644 Lts/Tools/Examples/Plugins/readme.txt create mode 100644 Lts/Tools/Examples/TestGuiElement/CMakeLists.txt create mode 100644 Lts/Tools/Examples/TestGuiElement/custom_widget.cpp create mode 100644 Lts/Tools/Examples/TestGuiElement/custom_widget.h create mode 100644 Lts/Tools/Examples/TestGuiElement/custom_widget.ui create mode 100644 Lts/Tools/Examples/TestGuiElement/gui_element_plugin.cpp create mode 100644 Lts/Tools/Examples/TestGuiElement/gui_element_plugin.h create mode 100644 Lts/Tools/RestClientUi/CMakeLists.txt create mode 100644 Lts/Tools/RestClientUi/main.cpp create mode 100644 Lts/Tools/RestClientUi/main_window.cpp create mode 100644 Lts/Tools/RestClientUi/main_window.h create mode 100644 Lts/Tools/RestClientUi/main_window.ui create mode 100644 Lts/Tools/RestClientUi/rest_templates/01_itemsKeys.json diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a2584ce1..fa2f09fa 100755 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -22,7 +22,7 @@ variables: BUILD_IMAGE: 'asset-repository.sf.defence-elec.de/docker-rme/livesim/guez' CHECKOUT_IMAGE: 'asset-repository.sf.defence-elec.de/docker-local/docker/docker:git' ARTIFACTORY: 'http://asset-repository.sf.defence-elec.de:80/artifactory' - ARTIFACTORY_PATH: 'generic-rme/livesim/guez/master' + ARTIFACTORY_PATH: 'generic-rme/livesim/guez/dlbo' RUNNER_TAG: '' stages: @@ -77,7 +77,7 @@ build: variables: BUILD_VERSION: $VERSION VERSION_DATE: $CI_COMMIT_TIMESTAMP - PROJECT_BASE_DIR: /builds/projects-domain-live/guez/legatus + PROJECT_BASE_DIR: /builds/projects-domain-live/guez/dlbo/legatus EMERGE_VERBOSE: 1 # Verbosity level 0:warning 1:info 2:debug script: - export BUILD_NUMBER=$(date +%Y%m%d%H) diff --git a/Lts/Common/CMakeLists.txt b/Lts/Common/CMakeLists.txt index d9f00c8e..51874006 100755 --- a/Lts/Common/CMakeLists.txt +++ b/Lts/Common/CMakeLists.txt @@ -6,30 +6,28 @@ ADD_SUBDIRECTORY(CodeGen) ADD_SUBDIRECTORY(httq) -#ADD_SUBDIRECTORY(LtsBotan) -ADD_SUBDIRECTORY(LtsCommandLineParser) -ADD_SUBDIRECTORY(LtsCoordTrans) -ADD_SUBDIRECTORY(LtsCoordinate) -ADD_SUBDIRECTORY(LtsElevation) -ADD_SUBDIRECTORY(LtsLicence) -ADD_SUBDIRECTORY(LtsPluginManager) -ADD_SUBDIRECTORY(LtsSession) -ADD_SUBDIRECTORY(LtsUtils) -ADD_SUBDIRECTORY(LtsWidgets) ADD_SUBDIRECTORY(LtsAppDescriptor) ADD_SUBDIRECTORY(LtsAppManager) -ADD_SUBDIRECTORY(LtsMultiMonitor) +ADD_SUBDIRECTORY(LtsCommandLineParser) +ADD_SUBDIRECTORY(LtsCoordinate) +ADD_SUBDIRECTORY(LtsCoordTrans) +ADD_SUBDIRECTORY(LtsElevation) +ADD_SUBDIRECTORY(LtsLicence) ADD_SUBDIRECTORY(LtsLogin) +ADD_SUBDIRECTORY(LtsMultiMonitor) ADD_SUBDIRECTORY(LtsNotification) -ADD_SUBDIRECTORY(LtsTimeline) +ADD_SUBDIRECTORY(LtsPluginManager) ADD_SUBDIRECTORY(LtsPrinting) -ADD_SUBDIRECTORY(LtsSerialPortQuerry) -ADD_SUBDIRECTORY(LtsScriptTimeline) -ADD_SUBDIRECTORY(LtsWebSocket) ADD_SUBDIRECTORY(LtsProjectionWorkstation) +ADD_SUBDIRECTORY(LtsRestClient) +ADD_SUBDIRECTORY(LtsScriptTimeline) +ADD_SUBDIRECTORY(LtsSerialPortQuerry) +ADD_SUBDIRECTORY(LtsSession) +ADD_SUBDIRECTORY(LtsTimeline) +ADD_SUBDIRECTORY(LtsUtils) ADD_SUBDIRECTORY(LtsVirtualKeyboard) +ADD_SUBDIRECTORY(LtsWebSocket) +ADD_SUBDIRECTORY(LtsWidgets) ADD_SUBDIRECTORY(PluginInterfaces) ADD_SUBDIRECTORY(ProjectConfig) -ADD_SUBDIRECTORY(TopicEditorBase) # TODO: rename / move ? -#ADD_SUBDIRECTORY(LtsEventTimeline) -#ADD_SUBDIRECTORY(LtsTranslator) +ADD_SUBDIRECTORY(TopicEditorBase) diff --git a/Lts/Common/CodeGen/svc_translation.cpp.grantlee b/Lts/Common/CodeGen/svc_translation.cpp.grantlee index 3b7fdc2b..ebf6bea7 100755 --- a/Lts/Common/CodeGen/svc_translation.cpp.grantlee +++ b/Lts/Common/CodeGen/svc_translation.cpp.grantlee @@ -22,7 +22,7 @@ QString toString({{ idl_enum.name }} state) { switch(state.underlying()) {{% for idl_member in idl_enum.member %} - case {{ idl_enum.name }}::{{ idl_member.key }}: return QCoreApplication::translate("{{ idl_enum.name }}", "{{ idl_member.key }}"); + case {{ idl_enum.name }}_def::{{ idl_member.key }}: return QCoreApplication::translate("{{ idl_enum.name }}", "{{ idl_member.key }}"); {% endfor %} default: break; } diff --git a/Lts/Common/LtsAppDescriptor/lts_app_descriptor.h b/Lts/Common/LtsAppDescriptor/lts_app_descriptor.h index 5b2464c9..6c677bd7 100755 --- a/Lts/Common/LtsAppDescriptor/lts_app_descriptor.h +++ b/Lts/Common/LtsAppDescriptor/lts_app_descriptor.h @@ -61,6 +61,7 @@ struct PluginInfo UNKNOWN, DATA, GUI, + GUI_ELEMENT, }; enum class Flag diff --git a/Lts/Common/LtsPluginManager/lts_plugin_loader.cpp b/Lts/Common/LtsPluginManager/lts_plugin_loader.cpp index 210503ea..8dfe3e00 100755 --- a/Lts/Common/LtsPluginManager/lts_plugin_loader.cpp +++ b/Lts/Common/LtsPluginManager/lts_plugin_loader.cpp @@ -258,7 +258,8 @@ bool LtsPluginLoader::loadPlugins(PluginType requestedPluginType, QStringLiteral("topic_type"), QStringLiteral("project"), QStringLiteral("style"), - QStringLiteral("special")}); // #warning TODO: recordreplay is a data plugin ? + QStringLiteral("special"), + QStringLiteral("gui_element")}); // #warning TODO: recordreplay is a data plugin ? QDirIterator pluginDir(libPath, nameFilter, QDir::Files); while (pluginDir.hasNext()) @@ -335,6 +336,9 @@ bool LtsPluginLoader::loadPlugins(PluginType requestedPluginType, case 5: // special pluginType = PluginType::SPECIAL; break; + case 6: // gui_element + pluginType = PluginType::GUI_ELEMENT; + break; default: break; } diff --git a/Lts/Common/LtsPluginManager/lts_plugin_loader.h b/Lts/Common/LtsPluginManager/lts_plugin_loader.h index 4c7f6898..a5e96f82 100755 --- a/Lts/Common/LtsPluginManager/lts_plugin_loader.h +++ b/Lts/Common/LtsPluginManager/lts_plugin_loader.h @@ -49,6 +49,8 @@ enum class PluginType PROJECT, STYLE, SPECIAL, // TODO: rm + GUI_ELEMENT, + }; diff --git a/Lts/Common/LtsRestClient/CMakeLists.txt b/Lts/Common/LtsRestClient/CMakeLists.txt new file mode 100644 index 00000000..c7834baf --- /dev/null +++ b/Lts/Common/LtsRestClient/CMakeLists.txt @@ -0,0 +1,27 @@ +# +# Lightweight REST Client Framework +# $Id$ +# $HeadURL$ +# $Author$ +# Created by Hannes Fritsche, ESZS, 2026-08-21 + +# +# --- Library LtsRestClient -------------------------------------------------------------------------------- +# +SET(LtsRestClient_SRCS + lts_rest_client.cpp + lts_rest_client.h +) + +NGL_ADD_LIBRARY2(ALL LtsRestClient SHARED ${LtsRestClient_SRCS}) + +NGL_TARGET_INCLUDE_DIRECTORIES(LtsRestClient + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/../ +) + +NGL_TARGET_LINK_LIBRARIES(LtsRestClient + PUBLIC + Qt5::Core + Qt5::Network +) diff --git a/Lts/Common/LtsRestClient/lts_rest_client.cpp b/Lts/Common/LtsRestClient/lts_rest_client.cpp new file mode 100644 index 00000000..ca95d69f --- /dev/null +++ b/Lts/Common/LtsRestClient/lts_rest_client.cpp @@ -0,0 +1,172 @@ +/** + * Lightweight REST Client Framework + * $Id$ + * $HeadURL$ + * $Author$ + * Created by Hannes Fritsche, ESZS, 2026-08-21 + */ + +#include "lts_rest_client.h" +#include +#include +#include +#include +#include + +namespace LtsCommon +{ + +LtsRestClient::LtsRestClient(const QString &baseUrl, QObject *parent) + : QObject(parent) + , m_baseUrl(baseUrl) + , m_manager(new QNetworkAccessManager(this)) +{ +} + +void LtsRestClient::ping(PingSuccessCallback onSuccess, ErrorCallback onError, int timeoutMs) +{ + const QNetworkRequest request((QUrl(m_baseUrl))); + QNetworkReply *reply = m_manager->head(request); + + if (!reply) + { + if (onError) + onError(QStringLiteral("Failed to initiate ping.")); + + return; + } + + // 1. Setup the timer (parented to reply for auto-cleanup) + QTimer *timeoutTimer = new QTimer(reply); + timeoutTimer->setSingleShot(true); + + // 2. Connect the timeout signal to abort the request + connect(timeoutTimer, &QTimer::timeout, this, [reply]() + { + if (reply && reply->isRunning()) + reply->abort(); // Triggers finished() with OperationCanceledError + }); + + // 3. Connect the finished signal to handle the response + connect(reply, + &QNetworkReply::finished, + this, + [reply, timeoutTimer, onSuccess, onError]() + { + timeoutTimer->stop(); + reply->deleteLater(); + + if (reply->error() != QNetworkReply::NoError) + { + if (onError) + { + if (reply->error() == QNetworkReply::OperationCanceledError) + onError(QStringLiteral("Ping timed out.")); + else + onError(reply->errorString()); + } + + return; + } + + const int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + + if (onSuccess) + onSuccess(statusCode); + }); + + // 4. Start the timer only after all connections are successfully established + timeoutTimer->start(timeoutMs); +} + +void LtsRestClient::get(const QString &endpoint, SuccessCallback onSuccess, ErrorCallback onError) +{ + sendRequest(QStringLiteral("GET"), endpoint, QByteArray(), onSuccess, onError); +} + +void LtsRestClient::post(const QString &endpoint, const QJsonDocument &json, SuccessCallback onSuccess, ErrorCallback onError) +{ + sendRequest(QStringLiteral("POST"), endpoint, json.toJson(), onSuccess, onError); +} + +void LtsRestClient::put(const QString &endpoint, const QJsonDocument &json, SuccessCallback onSuccess, ErrorCallback onError) +{ + sendRequest(QStringLiteral("PUT"), endpoint, json.toJson(), onSuccess, onError); +} + +void LtsRestClient::del(const QString &endpoint, SuccessCallback onSuccess, ErrorCallback onError) +{ + sendRequest(QStringLiteral("DELETE"), endpoint, QByteArray(), onSuccess, onError); +} + +void LtsRestClient::sendRequest(const QString &method, const QString &endpoint, const QByteArray &data, SuccessCallback onSuccess, ErrorCallback onError) +{ + QUrl url(m_baseUrl); + url.setPath(url.path() + endpoint); + + QNetworkRequest request(url); + request.setHeader(QNetworkRequest::ContentTypeHeader, QStringLiteral("application/json")); + + QNetworkReply *reply = nullptr; + + if (method == QStringLiteral("GET")) + reply = m_manager->get(request); + else if (method == QStringLiteral("POST")) + reply = m_manager->post(request, data); + else if (method == QStringLiteral("PUT")) + reply = m_manager->put(request, data); + else if (method == QStringLiteral("DELETE")) + reply = m_manager->deleteResource(request); + + if (!reply) + { + if (onError) + onError(QStringLiteral("Failed to initiate request.")); + + return; + } + + connect(reply, + &QNetworkReply::finished, + this, + [reply, onSuccess, onError]() + { + reply->deleteLater(); + + // Handle network errors + if (reply->error() != QNetworkReply::NoError) + { + if (onError) + onError(reply->errorString()); + + return; + } + + // Handle HTTP errors + const int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + if (statusCode >= 400) + { + if (onError) + onError(QStringLiteral("HTTP Error %1").arg(statusCode)); + + return; + } + + // Parse JSON safely + QJsonParseError parseError; + const QJsonDocument doc = QJsonDocument::fromJson(reply->readAll(), &parseError); + + if (parseError.error != QJsonParseError::NoError) + { + if (onError) + onError(QStringLiteral("JSON Parse Error: ") + parseError.errorString()); + + return; + } + + if (onSuccess) + onSuccess(doc); + }); +} + +} // namespace LtsCommon diff --git a/Lts/Common/LtsRestClient/lts_rest_client.h b/Lts/Common/LtsRestClient/lts_rest_client.h new file mode 100644 index 00000000..9b838b22 --- /dev/null +++ b/Lts/Common/LtsRestClient/lts_rest_client.h @@ -0,0 +1,51 @@ +/** + * Lightweight REST Client Framework + * $Id$ + * $HeadURL$ + * $Author$ + * Created by Hannes Fritsche, ESZS, 2026-08-21 + */ + +// Short documentation on how to use it can be found at https://confluence-classified.rh-int.de/spaces/LEG/pages/207915647/HOWTO+LtsRestClient + +#pragma once + +#include +#include +#include +#include +#include + +class QNetworkAccessManager; + +namespace LtsCommon +{ + +class LTSRESTCLIENT_EXPORT LtsRestClient : public QObject +{ + Q_OBJECT + + public: + explicit LtsRestClient(const QString &baseUrl, QObject *parent = nullptr); + + // type aliases + using PingSuccessCallback = std::function; + using SuccessCallback = std::function; + using ErrorCallback = std::function; + + // HTTP Header Ping to m_baseUrl to check server availability + void ping(PingSuccessCallback onSuccess, ErrorCallback onError = nullptr, int timeoutMs = 3000); + + // HTTP Methods + void get(const QString &endpoint, SuccessCallback onSuccess, ErrorCallback onError = nullptr); + void post(const QString &endpoint, const QJsonDocument &json, SuccessCallback onSuccess, ErrorCallback onError = nullptr); + void put(const QString &endpoint, const QJsonDocument &json, SuccessCallback onSuccess, ErrorCallback onError = nullptr); + void del(const QString &endpoint, SuccessCallback onSuccess, ErrorCallback onError = nullptr); + + private: + void sendRequest(const QString &method, const QString &endpoint, const QByteArray &data, SuccessCallback onSuccess, ErrorCallback onError); + + QString m_baseUrl; + QNetworkAccessManager *m_manager; +}; // class RestClient +} // namespace LtsCommon diff --git a/Lts/Common/LtsSession/lts_session_data_dds.h b/Lts/Common/LtsSession/lts_session_data_dds.h index 6ce3d5dd..b799a849 100755 --- a/Lts/Common/LtsSession/lts_session_data_dds.h +++ b/Lts/Common/LtsSession/lts_session_data_dds.h @@ -14,7 +14,7 @@ #include #include #include -#include +#include //#include #include #include diff --git a/Lts/Common/LtsSession/lts_session_lock_handler.h b/Lts/Common/LtsSession/lts_session_lock_handler.h index a2e1146b..85bfd565 100755 --- a/Lts/Common/LtsSession/lts_session_lock_handler.h +++ b/Lts/Common/LtsSession/lts_session_lock_handler.h @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include diff --git a/Lts/Common/LtsUtils/LtsUtilsGui/LtsUtilsGuiDds/request_helper.h b/Lts/Common/LtsUtils/LtsUtilsGui/LtsUtilsGuiDds/request_helper.h index 8ecb26f3..719fda9d 100755 --- a/Lts/Common/LtsUtils/LtsUtilsGui/LtsUtilsGuiDds/request_helper.h +++ b/Lts/Common/LtsUtils/LtsUtilsGui/LtsUtilsGuiDds/request_helper.h @@ -15,8 +15,8 @@ #define LTSUTILSGUIDDS_INTERNAL_EXPORT LTSUTILSDDS_EXPORT #endif -#include -#include // Core::FunctionReply (base reply) +#include +#include // Core::FunctionReply (base reply) #include #include diff --git a/Lts/Common/LtsWidgets/CMakeLists.txt b/Lts/Common/LtsWidgets/CMakeLists.txt index 47b50f47..b899cdce 100755 --- a/Lts/Common/LtsWidgets/CMakeLists.txt +++ b/Lts/Common/LtsWidgets/CMakeLists.txt @@ -108,6 +108,8 @@ SET(ltswidgets_SRCS lts_text_editor2.h lts_text_editor2.cpp + + LtsImageCropper/lts_image_cropper.cpp ) @@ -148,6 +150,7 @@ NGL_WRAP_UI(ltswidgets_SRCS NGL_ADD_BIG_RESOURCES(ltswidgets_SRCS resources/lts_resources.qrc) NGL_ADD_LIBRARY(WS TOOLSWS TOOLSSV LtsWidgets SHARED ${ltswidgets_SRCS}) + NGL_TARGET_INCLUDE_DIRECTORIES(LtsWidgets PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../ diff --git a/Lts/DDS/Core/pacemaker.h b/Lts/DDS/Core/pacemaker.h index 5a209d0e..1de2806e 100755 --- a/Lts/DDS/Core/pacemaker.h +++ b/Lts/DDS/Core/pacemaker.h @@ -10,7 +10,7 @@ #include #include -#include +#include #include "core_export.h" namespace DDSConnector diff --git a/Lts/DDS/FTC/generic_ftc.h b/Lts/DDS/FTC/generic_ftc.h index f4528b6c..99f15c15 100755 --- a/Lts/DDS/FTC/generic_ftc.h +++ b/Lts/DDS/FTC/generic_ftc.h @@ -8,7 +8,7 @@ #pragma once -#include +#include #include diff --git a/Lts/DDS/FTC/generic_ftc_impl.h b/Lts/DDS/FTC/generic_ftc_impl.h index 049caf1f..9e1627e6 100755 --- a/Lts/DDS/FTC/generic_ftc_impl.h +++ b/Lts/DDS/FTC/generic_ftc_impl.h @@ -11,7 +11,7 @@ #include "abstract_requester.h" #include "generic_ftc_threading.h" -#include +#include #include #include #include diff --git a/Lts/DDS/FTS/generic_fts_impl.h b/Lts/DDS/FTS/generic_fts_impl.h index ab717f9f..77547207 100755 --- a/Lts/DDS/FTS/generic_fts_impl.h +++ b/Lts/DDS/FTS/generic_fts_impl.h @@ -7,7 +7,7 @@ */ #pragma once -#include +#include #include "generic_fts_internal.h" #include "connext.h" diff --git a/Lts/Plugins/AreaEffectSimulation/Gui/Explosion/aes_explosions_edit_adler.cpp b/Lts/Plugins/AreaEffectSimulation/Gui/Explosion/aes_explosions_edit_adler.cpp index 81209475..fd94fca0 100755 --- a/Lts/Plugins/AreaEffectSimulation/Gui/Explosion/aes_explosions_edit_adler.cpp +++ b/Lts/Plugins/AreaEffectSimulation/Gui/Explosion/aes_explosions_edit_adler.cpp @@ -470,6 +470,8 @@ void ExplosionsEditAdler::onEffectClusterChanged(const EffectCluster &ecData, Da m_ui->pbStateChange->setEnabled(false); m_ui->gbEffectMarkingInTa->setEnabled(false); } + + __unchange__(); } QPointF ExplosionsEditAdler::centerOfFiringUnitGeo(int particpantUnitId) diff --git a/Lts/Plugins/AreaEffectSimulation/Gui/Explosion/aes_explosions_edit_adler_standalone.cpp b/Lts/Plugins/AreaEffectSimulation/Gui/Explosion/aes_explosions_edit_adler_standalone.cpp index ac585d1b..6a5e3b0f 100755 --- a/Lts/Plugins/AreaEffectSimulation/Gui/Explosion/aes_explosions_edit_adler_standalone.cpp +++ b/Lts/Plugins/AreaEffectSimulation/Gui/Explosion/aes_explosions_edit_adler_standalone.cpp @@ -283,6 +283,15 @@ ExplosionsEditAdlerStandAlone::ExplosionsEditAdlerStandAlone(const QString &menu if (enableRocket) m_gearClassFilter += ProjectDataManagement::GearClass::Rocket; m_uiRequirements->addRequirement({m_ui->lblPosition, [this]() { return (!m_coord.isNull()); }}); + m_uiRequirements->addRequirement({m_ui->lblPosition_2, [this]() { + // Im Fall (Zielgeometrie == Linear) ist positionEdit_2 enabled. Ansonsten disabled. + // Daher: Wenn enabled, muss auch ein Wert enthalten sein. + // Andernfalls wird in apply() die cornerBottomLeft aufgrund fehlerhafter Werte berechnet. + // Die dabei resultierenden Werte haben bereits mal zu einem Absturz gefuehrt. + // LS-693 [Stand-Alone] Koordinatenberechnung Linear... + return (!m_ui->positionEdit_2->isEnabled()) || // Ok, wenn disabled + (!m_ui->positionEdit_2->coordinate().isNull()); } // oder coordinate not null + }); m_uiRequirements->addRequirement({m_ui->lblRadiusBreite, [this]() { return (m_ui->sbDimensionX_BreiteRadius->value() >= s_minWidth); }}); m_uiRequirements->addRequirement({m_ui->lblDimensionY_Tiefe, [this]() { return (m_ui->sbDimensionY_Tiefe->value() >= s_minHeight); }}); // m_uiRequirements->addRequirement({m_ui->lblName, [this]() { return (!m_ui->leElement->text().isEmpty()); }}); @@ -1669,6 +1678,13 @@ void ExplosionsEditAdlerStandAlone::onEffectClusterChanged(const EffectCluster & if (m_aesItem.effectStateId() == AreaEffectSimulation::AesEffectState::EsCreated || m_aesItem.effectStateId() == AreaEffectSimulation::AesEffectState::EsPrepared) enableUiElements(!unchangeable()); + else if (m_aesItem.effectStateId() == AreaEffectSimulation::AesEffectState::EsExpired || + m_aesItem.effectStateId() == AreaEffectSimulation::AesEffectState::EsFired || + m_aesItem.effectStateId() == AreaEffectSimulation::AesEffectState::EsActivated) + { + if (hasUnsavedChanges()) + __unchange__(); + } if(!unchangeable()) setFireBtnState(); @@ -2107,12 +2123,8 @@ bool ExplosionsEditAdlerStandAlone::apply() if (m_ui->dteEffectStart->isChecked() && m_ui->dteEffectStart->isVisible()) { - const FiringType::type firingType = static_cast(m_ui->cbFiringType->currentData().toInt()); - if (firingType != FiringType::FireWithIndicationTTF) - { - // we use the effect start as usual - request.effectStart().set(m_ui->dteEffectStart->msecsSinceEpoch()); - } + // we use the effect start as usual + request.effectStart().set(m_ui->dteEffectStart->msecsSinceEpoch()); } if (m_ui->sbDurationSec->isVisible()) request.effectDuration(m_ui->sbDurationSec->value() * 1000); @@ -2293,13 +2305,16 @@ bool ExplosionsEditAdlerStandAlone::apply() const QString properties = QString::fromUtf8(QJsonDocument(propertiesObj).toJson()); DEBUG_LOG(m_logger) << "properties: " << properties; request.properties(properties.toStdString()); - DEBUG_LOG(m_logger) << "request abschicken"; + // Rocket-Spezifika: const QVariant currentData = m_ui->cbGearClass->currentData(); const ProjectDataManagement::GearClass::type currentGearClass = static_cast(currentData.toInt()); - if (currentGearClass == ProjectDataManagement::GearClass::Rocket) + { RocketUtility::addRocketPropertiesToRequest(request, m_ppmDtc); + } + + DEBUG_LOG(m_logger) << "request abschicken, request = '" << request << "'"; m_requestHelper->addRequest([this, request]() { return m_ftc->effectClusterModifyRequest(request, this); }); diff --git a/Lts/Plugins/AreaEffectSimulation/Gui/Explosion/aes_rocket_utility.cpp b/Lts/Plugins/AreaEffectSimulation/Gui/Explosion/aes_rocket_utility.cpp index aeda7631..dbb8843b 100755 --- a/Lts/Plugins/AreaEffectSimulation/Gui/Explosion/aes_rocket_utility.cpp +++ b/Lts/Plugins/AreaEffectSimulation/Gui/Explosion/aes_rocket_utility.cpp @@ -179,6 +179,7 @@ void addRocketPropertiesForLinearGeometry(EffectClusterModifyRequest &request, c const double flightTimeStep = currentEffector.flightTime() / static_cast(trajectoryWithoutTime.size()); double currentFlightTime = 0.0; + currentEffector.trajectoryRelative().clear(); // LS_711_akkumulierende_flugkurven_bei_rakete const LtsCoordTrans::UtmCoordinate utmStartPos = LtsCoordTrans::UtmCoordinate::fromGeographic(participantPosition.pos().lon(), participantPosition.pos().lat()); for (const Core::GeoPosition &pos : trajectoryWithoutTime) { @@ -240,6 +241,7 @@ void addRocketPropertiesForPointGeometry(EffectClusterModifyRequest &request, co const double flightTimeStep = currentEffector.flightTime() / static_cast(trajectoryWithoutTime.size()); double currentFlightTime = 0.0; + currentEffector.trajectoryRelative().clear(); // LS_711_akkumulierende_flugkurven_bei_rakete const LtsCoordTrans::UtmCoordinate utmStartPos = LtsCoordTrans::UtmCoordinate::fromGeographic(participantPosition.pos().lon(), participantPosition.pos().lat()); for (const Core::GeoPosition &pos : trajectoryWithoutTime) { @@ -250,7 +252,7 @@ void addRocketPropertiesForPointGeometry(EffectClusterModifyRequest &request, co currentFlightTime += flightTimeStep; } - } + } // for (EffectorData ¤tEffector : request.effectors()) } } // namespace RocketUtility diff --git a/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_converter.cpp b/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_converter.cpp index 1a47f385..48eb8fd7 100755 --- a/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_converter.cpp +++ b/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_converter.cpp @@ -1,8 +1,8 @@ #include "flm_hq_report_converter.h" +#include #include #include -#include #include #include @@ -11,20 +11,20 @@ #include -#include #include #include +#include -#include #include +#include namespace FileManagement { -FlmHqReportConverter::FlmHqReportConverter() : m_logger(getLogger("HQReportConverter")) +FlmHqReportConverter::FlmHqReportConverter() + : m_logger(getLogger("HQReportConverter")) { - connect(this, &FlmHqReportConverter::allRequestsFinished, - this, &FlmHqReportConverter::onRequestsFinished); + connect(this, &FlmHqReportConverter::allRequestsFinished, this, &FlmHqReportConverter::onRequestsFinished); } bool FlmHqReportConverter::init(LtsSession::LtsSession *session, int currentPartyId) @@ -82,11 +82,20 @@ bool FlmHqReportConverter::init(LtsSession::LtsSession *session, int currentPart return true; } -void FlmHqReportConverter::addHqToPlanIds(const QMap> &hqToPlanIds) +void FlmHqReportConverter::addHqToPlanIds(const QMap> &hqToPlanIds) { for (auto it = hqToPlanIds.constBegin(); it != hqToPlanIds.constEnd(); ++it) { - m_hqToPlanIds[it.key()].append(it.value()); + int planFileId = it.key(); + const QSet &hqMessageIds = it.value(); + + for (int id : hqMessageIds) + { + if (id == planFileId) // Eventueller Eintrag in Map wegen QTreeView verhindern + continue; + + m_hqToPlanIds[planFileId].append(id); + } } } @@ -94,15 +103,17 @@ void FlmHqReportConverter::processCollectedHqs() { for (auto it = m_hqToPlanIds.constBegin(); it != m_hqToPlanIds.constEnd(); ++it) { - m_pendingRequests += it.value().size(); + int planId = it.key(); + for (int id : it.value()) + m_pendingRequests++; } for (auto it = m_hqToPlanIds.constBegin(); it != m_hqToPlanIds.constEnd(); ++it) { int planId = it.key(); - const QList &reportIds = it.value(); - // Request file content for each HqReport - for (int id : reportIds) + const QList &hqMessageIds = it.value(); + + for (int id : hqMessageIds) { DEBUG_LOG(m_logger) << "Request File with ID: " << id << " from plan with ID: " << planId; FileManagement::GetFileContentDataRequest request(id); @@ -110,46 +121,21 @@ void FlmHqReportConverter::processCollectedHqs() } } } - -void FlmHqReportConverter::createGeometryFromReport(const HqReportData &data) -{ - m_symbolFactory.build(data.art, data, m_geometryModel); -} +void FlmHqReportConverter::createGeometryFromReport(const HqReportData &data) { m_symbolFactory.build(data.art, data, m_geometryModel); } void FlmHqReportConverter::checkIfAllFinished() { - if (m_pendingRequests <= 0) emit allRequestsFinished(); + if (m_pendingRequests <= 0) + emit allRequestsFinished(); } -void FlmHqReportConverter::onGetFileContentDataReply( - const FileManagement::GetFileContentDataReply &reply) +void FlmHqReportConverter::onGetFileContentDataReply(const FileManagement::GetFileContentDataReply &reply) { m_pendingRequests--; - if (reply.errorString().size() > 0) - { - ERROR_LOG(m_logger) << "Got onGetFileContentDataReply error: " << reply.errorString(); - return; - } - - int id = static_cast(reply.id()); + const int id = static_cast(reply.id()); int planId = -1; - DEBUG_LOG(m_logger) << "Reply File with ID: " << id << " from plan with ID: " << planId; - - INFO_LOG(m_logger) << "Got reply with id " << id << " and errorString " << reply.errorString(); - - QByteArray fileContent = QByteArray(reinterpret_cast(reply.content().data()), reply.content().size()); - - FlmHqReportJsonParser m_parser = FlmHqReportJsonParser(); - - HqReportData data = m_parser.parse(fileContent); - data.contentFileId = id; - - DEBUG_LOG(m_logger) << "Party: " << m_partyId << " has Color: "<< QColor::fromRgb(QRgb(m_ppmDtc->party(m_partyId).color())).value(); - - data.partyColor = QColor::fromRgb(QRgb(m_ppmDtc->party(m_partyId).color())); - for (auto it = m_hqToPlanIds.constBegin(); it != m_hqToPlanIds.constEnd(); ++it) { if (it.value().contains(id)) @@ -159,7 +145,24 @@ void FlmHqReportConverter::onGetFileContentDataReply( } } - m_convertedHqToPlanIds[planId].append(data); + DEBUG_LOG(m_logger) << "Reply File with ID: " << id << " from plan with ID: " << planId; + INFO_LOG(m_logger) << "Got reply with id " << id; + + QByteArray fileContent = QByteArray::fromRawData(reinterpret_cast(reply.content().data()), reply.content().size()); + + DEBUG_LOG(m_logger) << "fileContent: " << fileContent; + + FileManagement::FileContent flc = m_flmDtc->fileContent(reply.id()); + + DEBUG_LOG(m_logger) << "FlmHqReportConverter::onGetFileContentDataReply FILECONTENTNAME: " << flc.name(); + + HqReportData data = m_parser.parse(fileContent); + data.contentFileId = id; + data.name = QString::fromStdString(flc.name()); + + data.partyColor = QColor::fromRgb(m_ppmDtc->party(m_partyId).color()); + + m_convertedHqToPlanIds[planId].append(std::move(data)); DEBUG_LOG(m_logger) << "Content size: " << reply.content().size(); @@ -171,10 +174,7 @@ void FlmHqReportConverter::onFileContentModifyReply(const Core::FunctionReplyObj DEBUG_LOG(m_logger) << "Got FileContentModify Reply: " << reply.translated(); if (reply.error()) - { - ERROR_LOG(m_logger) << "Error while insert HX Message: " << reply.translated() - << ", error: " << reply.error(); - } + ERROR_LOG(m_logger) << "Error while insert HX Message: " << reply.translated() << ", error: " << reply.error(); } void FlmHqReportConverter::onFileContentRemoveReply(const Core::FunctionReplyObject &reply) @@ -182,49 +182,83 @@ void FlmHqReportConverter::onFileContentRemoveReply(const Core::FunctionReplyObj DEBUG_LOG(m_logger) << "Got FileContentRemove Reply: " << reply.translated(); if (reply.error()) - { - ERROR_LOG(m_logger) << "Error while insert HX Message: " << reply.translated() - << ", error: " << reply.error(); - } + ERROR_LOG(m_logger) << "Error while insert HX Message: " << reply.translated() << ", error: " << reply.error(); } void FlmHqReportConverter::onRequestsFinished() { - DEBUG_LOG(m_logger) << "ALL REQUESTS FINISHED"; + DEBUG_LOG(m_logger) << "ALL REQUESTS FINISHED -> STARTING CONTENT FETCH"; for (auto it = m_convertedHqToPlanIds.constBegin(); it != m_convertedHqToPlanIds.constEnd(); ++it) { int planId = it.key(); - const QList &reportDatas = it.value(); + QList reportDatas = it.value(); + const FileManagement::FileContent flc = m_flmDtc->fileContent(planId); + FileManagement::GetFileContentDataRequest req; + req.fileContentId(planId); - for (auto &reportData : reportDatas) - { - DEBUG_LOG(m_logger) << "createGeometryFromReport :" << reportData.art; - createGeometryFromReport(reportData); - } + m_flmFtc->getFileContentDataRequest(req, + [this, planId, reportDatas = std::move(reportDatas), flc = std::move(flc)](const FileManagement::GetFileContentDataReply &reply) + { + const auto &fetchedFlc = reply; + if (fetchedFlc.content().size() > 0) + { + QByteArray existingContent + = QByteArray::fromRawData(reinterpret_cast(fetchedFlc.content().data()), fetchedFlc.content().size()); - const FileManagement::FileContent &flc = m_flmDtc->fileContent(planId); + if (!m_geometryModel->fromByteArray(existingContent)) + WARNING_LOG(m_logger) << "Could not load existing geometry content for planId" << planId; + } - FileManagement::FileContentModifyRequest data; + QJsonArray jsonNameArray; + QJsonDocument existingDocs = QJsonDocument::fromJson(QByteArray::fromRawData(flc.properties().data(), flc.properties().size())); - DEBUG_LOG(m_logger) << "FILE CONTENT: " << flc.name() << " " << flc.folderId(); + if (existingDocs.isArray()) + jsonNameArray = existingDocs.array(); - data.id(flc.id()); - data.name(flc.name()); - data.isTemplate(false); - data.isHidden(false); - data.folderId(flc.folderId()); - data.fileStatus(FileManagement::FileStatus::Valid); - data.fileCategory(FileManagement::FileCategory::Exercise); - data.fileType(FileManagement::FileType::TacticalPlan); - data.operatorId(LtsSessionData::LtsSessionData::getInstance()->getOperatorId()); - data.lastModified(QDateTime::currentMSecsSinceEpoch()); - data.content(LtsUtils::convert>(m_geometryModel->toByteArray())); - data.exerciseId(m_session->exerciseId()); + for (const auto &reportData : reportDatas) + { - m_flmFtc->fileContentModifyRequest(data, this); - - m_geometryModel->clearModel(); + bool alreadyExists = false; + for (const QJsonValue &value : jsonNameArray) + { + if (value.toString() == reportData.name) + { + alreadyExists = true; + break; + } + } + + if (!alreadyExists) + { + createGeometryFromReport(reportData); + jsonNameArray.append(reportData.name); + } + } + + QJsonDocument jsonDoc(jsonNameArray); + QString combinedNames = QString::fromUtf8(jsonDoc.toJson(QJsonDocument::Compact)); + + FileManagement::FileContentModifyRequest data; + + DEBUG_LOG(m_logger) << "FILE CONTENT: " << flc.name() << " " << flc.folderId(); + + data.id(flc.id()); + data.name(flc.name()); + data.isTemplate(false); + data.isHidden(false); + data.folderId(flc.folderId()); + data.fileStatus(FileManagement::FileStatus::Valid); + data.fileCategory(FileManagement::FileCategory::Exercise); + data.fileType(FileManagement::FileType::TacticalPlan); + data.operatorId(LtsSessionData::LtsSessionData::getInstance()->getOperatorId()); + data.lastModified(QDateTime::currentMSecsSinceEpoch()); + data.content(LtsUtils::convert>(m_geometryModel->toByteArray())); + data.exerciseId(m_session->exerciseId()); + data.properties(combinedNames.toStdString()); + m_flmFtc->fileContentModifyRequest(data, this); + m_geometryModel->clearModel(); + }); } } -} // namespace FileManagement +} // namespace FileManagement diff --git a/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_converter.h b/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_converter.h index 28ea8225..8ef54213 100755 --- a/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_converter.h +++ b/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_converter.h @@ -16,15 +16,16 @@ namespace Interface { class Dtc; class Ftc; -} // namespace Interface +} // namespace Interface -class FlmHqReportConverter : public QObject, - public Interface::Ftc::GetFileContentDataReplyHandler, - public Interface::Ftc::FileContentModifyReplyHandler, - public Interface::Ftc::FileContentRemoveReplyHandler +class FlmHqReportConverter + : public QObject + , public Interface::Ftc::GetFileContentDataReplyHandler + , public Interface::Ftc::FileContentModifyReplyHandler + , public Interface::Ftc::FileContentRemoveReplyHandler { Q_OBJECT -public: + public: FlmHqReportConverter(); ~FlmHqReportConverter() = default; @@ -33,7 +34,7 @@ public: * @brief add hqToPlanIds to m_hqToPlanIds * @param const QMap> &hqToPlanIds -> > */ - void addHqToPlanIds(const QMap> &hqToPlanIds); + void addHqToPlanIds(const QMap> &hqToPlanIds); /** * @brief Iterate and send GetFileContentDataRequest to get File Information HQ */ @@ -44,27 +45,27 @@ public: */ void createGeometryFromReport(const HqReportData &data); -private: + private: void checkIfAllFinished(); -protected: + protected: void onGetFileContentDataReply(const FileManagement::GetFileContentDataReply &reply) override; void onFileContentModifyReply(const Core::FunctionReplyObject &reply) override; void onFileContentRemoveReply(const Core::FunctionReplyObject &reply) override; -public slots: + public slots: void onRequestsFinished(); -signals: + signals: /** * @brief checks if all getFileContentDataRequests are finished */ void allRequestsFinished(); -private: + private: LOGGER_T m_logger; LtsSession::LtsSession *m_session{nullptr}; std::shared_ptr m_flmDtc; std::shared_ptr m_flmFtc; - std::shared_ptr m_ppmDtc; + std::shared_ptr m_ppmDtc; SituationMap::GeometryModel *m_geometryModel{nullptr}; QList m_planNodes; @@ -72,9 +73,9 @@ private: int m_partyId; int m_pendingRequests{0}; - - QMap> m_hqToPlanIds; /// Map> - QMap m_hqToPlanIdsLookup; /// Map for Lookup - QMap> m_convertedHqToPlanIds; /// Map> -}; // class FlmHqReportConverter -} // namespace FileManagement + FlmHqReportJsonParser m_parser; + QMap> m_hqToPlanIds; /// Map> + QMap m_hqToPlanIdsLookup; /// Map for Lookup + QMap> m_convertedHqToPlanIds; /// Map> +}; // class FlmHqReportConverter +} // namespace FileManagement diff --git a/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_edit.cpp b/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_edit.cpp index 3981d417..eed5ceb6 100755 --- a/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_edit.cpp +++ b/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_edit.cpp @@ -136,7 +136,7 @@ bool HQReportEdit::init(LtsSession::LtsSession *session, int partyId) m_ui->listViewPlan->setDragDropMode(QAbstractItemView::DropOnly); m_ui->listViewPlan->setDefaultDropAction(Qt::CopyAction); m_ui->listViewPlan->setDropIndicatorShown(true); - + m_ui->listViewPlan->setHeaderHidden(true); // configure listViewMessage m_ui->listViewMessage->setDragDropMode(QAbstractItemView::DragOnly); m_ui->listViewMessage->setDefaultDropAction(Qt::CopyAction); @@ -151,31 +151,6 @@ bool HQReportEdit::init(LtsSession::LtsSession *session, int partyId) return false; } - // init models - qDeleteAll(m_hqModels); - m_hqModels.clear(); - - qDeleteAll(m_planModels); - m_planModels.clear(); - - for (int index = 0; index < m_ui->cboParties->count(); ++index) - { - const int partyId = m_ui->cboParties->itemData(index).toInt(); - createModels(partyId); - } - - // configure listViewPlan - m_ui->listViewPlan->setDragDropMode(QAbstractItemView::DropOnly); - m_ui->listViewPlan->setDefaultDropAction(Qt::MoveAction); - m_ui->listViewPlan->setDropIndicatorShown(true); - - // configure listViewMessage - m_ui->listViewMessage->setDragDropMode(QAbstractItemView::DragOnly); - m_ui->listViewMessage->setDefaultDropAction(Qt::MoveAction); - m_ui->listViewMessage->setDropIndicatorShown(true); - - onPartyChanged(); - connect(m_ui->cboParties, qOverload(&QComboBox::currentIndexChanged), this, &HQReportEdit::onPartyChanged); int partyIndex = m_ui->cboParties->findData(partyId); // in case of notification: onPartyChanged() is called when index changes @@ -190,11 +165,16 @@ void HQReportEdit::createModels(const int partyId) if (partyFolderId == 0) { WARNING_LOG(m_logger) << "No partyFolderId found for partyId " << partyId; + delete m_planModels.take(partyId); + delete m_hqModels.take(partyId); return; } const int hqReportFolderId = m_flmDtc->findFolder(partyFolderId, QStringLiteral("Messages")); + delete m_planModels.take(partyId); + delete m_hqModels.take(partyId); + auto *planModel = new FlmHQReportModel(m_ui->listViewPlan); if (!planModel->init(m_session, partyFolderId, FileType::inner_enum::TacticalPlan)) { @@ -220,17 +200,15 @@ void HQReportEdit::createModels(const int partyId) bool HQReportEdit::apply() { - QMap> allHqToPlanIds; + QMap> allHqToPlanIds; for (auto it = m_planModels.begin(); it != m_planModels.end(); ++it) { - QMap> hqToPlanIds = it.value()->getHQToPlan(); // + QMap> hqToPlanIds = it.value()->getChangedPlans(); // - for (auto planId : hqToPlanIds.keys()) + for (auto it = hqToPlanIds.constBegin(); it != hqToPlanIds.constEnd(); ++it) { - allHqToPlanIds[planId].append(hqToPlanIds[planId]); - - it.value()->clearMovedData(); + allHqToPlanIds[it.key()] += it.value(); } } @@ -254,14 +232,10 @@ void HQReportEdit::retranslate() { translate(m_ui, tr("HQ Report")); } void HQReportEdit::onPartyChanged(int index) { Q_UNUSED(index); - const int currentPartyId = m_ui->cboParties->currentData().toInt(); + DEBUG_LOG(m_logger) << "onPartyChanged " << currentPartyId; - if (!m_planModels.contains(currentPartyId) || !m_hqModels.contains(currentPartyId)) - { - INFO_LOG(m_logger) << "Models for party" << currentPartyId << "not found. Attempting to create..."; - createModels(currentPartyId); - } + createModels(currentPartyId); QAbstractItemModel *hqModel = m_hqModels.value(currentPartyId, nullptr); QAbstractItemModel *planModel = m_planModels.value(currentPartyId, nullptr); diff --git a/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_edit.ui b/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_edit.ui index e3031bf1..8994f963 100755 --- a/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_edit.ui +++ b/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_edit.ui @@ -15,7 +15,7 @@ - + diff --git a/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_model.cpp b/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_model.cpp index a82f1b76..3f5ea4de 100755 --- a/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_model.cpp +++ b/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_model.cpp @@ -1,14 +1,15 @@ #include "flm_hq_report_model.h" +#include +#include #include #include - namespace FileManagement { FlmHQReportModel::FlmHQReportModel(QObject *parent) - : QAbstractListModel(parent) - , m_logger(getLogger("HQReportModel")) -{ + : QAbstractItemModel(parent) + , m_logger(getLogger("HQReportModel")) +{ } bool FlmHQReportModel::init(LtsSession::LtsSession *session, int contentFolderId, const FileType &fileType) @@ -32,7 +33,7 @@ bool FlmHQReportModel::init(LtsSession::LtsSession *session, int contentFolderId m_flmDtc->enableFileContent(); m_flmDtc->waitForHistoricalDataFileContent(3000); - m_flmDtc->fileContents([this](const FileContent &content){onFileContentChanged(content, DataModification::eAdded);}); + m_flmDtc->fileContents([this](const FileContent &content) { onFileContentChanged(content, DataModification::eAdded); }); connect(m_flmDtc.get(), &Interface::Dtc::fileContentChanged, this, &FlmHQReportModel::onFileContentChanged); @@ -41,25 +42,74 @@ bool FlmHQReportModel::init(LtsSession::LtsSession *session, int contentFolderId int FlmHQReportModel::rowCount(const QModelIndex &parent) const { - if (parent.isValid()) + if (!parent.isValid()) + return m_data.count(); + + if (parent.internalId() != 0) return 0; - return m_data.count(); + + if (parent.row() >= 0 && parent.row() < m_data.size()) + { + const HQData &data = m_data.at(parent.row()); + auto it = m_movedData.constFind(data.id); + if (it != m_movedData.constEnd()) + return it.value().count(); + } + return 0; +} + +QModelIndex FlmHQReportModel::parent(const QModelIndex &index) const +{ + + if (!index.isValid()) + return QModelIndex(); + + quintptr internalId = index.internalId(); + + if (internalId == 0) + return QModelIndex(); + + int parentRow = static_cast(internalId) - 1; + + return createIndex(parentRow, 0, quintptr(0)); } QVariant FlmHQReportModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) - return QVariant(); + return {}; if (role == Qt::DisplayRole) - return createText(index.row()); + { + quintptr internalId = index.internalId(); - return QVariant(); + if (internalId == 0) + { + if (index.row() >= 0 && index.row() < m_data.size()) + return m_data.at(index.row()).name; + } + else // Child-Item + { + int parentRow = static_cast(internalId) - 1; + if (parentRow >= 0 && parentRow < m_data.size()) + { + const HQData &parentData = m_data.at(parentRow); + auto it = m_movedData.constFind(parentData.id); + if (it != m_movedData.constEnd()) + { + const QList &children = it.value(); + if (index.row() >= 0 && index.row() < children.size()) + return children.at(index.row()).name; + } + } + } + } + return {}; } Qt::ItemFlags FlmHQReportModel::flags(const QModelIndex &index) const { - Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index); + Qt::ItemFlags defaultFlags = QAbstractItemModel::flags(index); if (!index.isValid()) return defaultFlags; @@ -67,15 +117,9 @@ Qt::ItemFlags FlmHQReportModel::flags(const QModelIndex &index) const return defaultFlags | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; } -Qt::DropActions FlmHQReportModel::supportedDropActions() const -{ - return Qt::CopyAction; -} +Qt::DropActions FlmHQReportModel::supportedDropActions() const { return Qt::CopyAction; } -Qt::DropActions FlmHQReportModel::supportedDragActions() const -{ - return Qt::CopyAction; -} +Qt::DropActions FlmHQReportModel::supportedDragActions() const { return Qt::CopyAction; } QStringList FlmHQReportModel::mimeTypes() const { @@ -109,8 +153,34 @@ QMimeData *FlmHQReportModel::mimeData(const QList &indexes) const { if (index.isValid()) { - HQData md = m_data.at(index.row()); - stream << md.id << md.name;// Serialize your custom metadata to QByteArray + HQData md; + QString visibleName = index.data(Qt::DisplayRole).toString(); + + if (index.internalId() != 0) + { + int parentRow = static_cast(index.internalId()) - 1; + if (parentRow >= 0 && parentRow < m_data.size()) + { + const HQData &parentData = m_data.at(parentRow); + const auto &children = m_movedData.value(parentData.id); + if (index.row() >= 0 && index.row() < children.size()) + { + md = children.at(index.row()); + } + } + } + else + { + if (index.row() >= 0 && index.row() < m_data.size()) + { + const HQData &originalData = m_data.at(index.row()); + md.id = originalData.id; + md.name = visibleName; + md.properties = originalData.properties; + } + } + md.name = visibleName; + stream << md.id << md.name; } } mimeData->setData(mimeType, encodedData); @@ -128,17 +198,20 @@ bool FlmHQReportModel::dropMimeData(const QMimeData *data, Qt::DropAction action QByteArray encodedData = data->data(mimeType); QDataStream stream(&encodedData, QIODevice::ReadOnly); + if (parent.isValid() && parent.row() >= 0 && parent.row() < m_data.size()) + DEBUG_LOG(m_logger) << "DROP ZIEL (Parent im Tree): " << m_data.at(parent.row()).name; + while (!stream.atEnd()) { HQData md; - stream >> md.id >> md.name; - addMovedData(parent.row(), md); + DEBUG_LOG(m_logger) << "DROP INHALT aus Stream -> ID: " << md.id << ", NAME: " << md.name; + + addMovedData(parent, md); } emit dataAddedOrRemoved(); - return true; } @@ -147,52 +220,106 @@ bool FlmHQReportModel::canDropMimeData(const QMimeData *data, Qt::DropAction act Q_UNUSED(row) Q_UNUSED(column) - if (!parent.isValid() || - !data->hasFormat(mimeType) || - action != Qt::CopyAction || - parent.row() < 0 || - parent.row() >= m_data.size()) + if (!parent.isValid() || !data->hasFormat(mimeType) || action != Qt::CopyAction || parent.row() < 0 || parent.row() >= m_data.size()) return false; QByteArray encodedData = data->data(mimeType); QDataStream stream(&encodedData, QIODevice::ReadOnly); - const HQData ¤tData = m_data.at(parent.row()); - if (!m_movedData.contains(currentData.id)) + const HQData ¤tParentData = m_data.at(parent.row()); + + if (!m_movedData.contains(currentParentData.id)) return true; - const QList &movedDataListForCurrentData = m_movedData.value(currentData.id); + const QList &existingChildren = m_movedData.value(currentParentData.id); while (!stream.atEnd()) { - HQData movedData; + HQData incomingData; + stream >> incomingData.id >> incomingData.name; - stream >> movedData.id >> movedData.name; - - if (movedDataListForCurrentData.contains(movedData)) // we do not allow double entries - return false; + for (const HQData &child : existingChildren) + { + if (child.id == incomingData.id) + return false; + } } - return true; } +QModelIndex FlmHQReportModel::index(int row, int column, const QModelIndex &parent) const +{ + if (!hasIndex(row, column, parent)) + return QModelIndex(); + + if (!parent.isValid()) + { + if (row >= 0 && row < m_data.size()) + return createIndex(row, column, quintptr(0)); // internalId = 0 für Parents + } + else + { + if (parent.internalId() == 0) + { + int parentRow = parent.row(); + return createIndex(row, column, quintptr(parentRow + 1)); + } + } + + return QModelIndex(); +} void FlmHQReportModel::addHQReportData(const HQData &data) { - beginInsertRows(QModelIndex(), rowCount(), rowCount()); - m_data.append(data); + QList childProperties; + HQData copyData = data; + + if (!data.properties.empty()) + { + QJsonDocument doc = QJsonDocument::fromJson(QByteArray::fromStdString(data.properties)); + // Hole Einträge aus den properties + if (doc.isArray()) + { + QJsonArray jsonArray = doc.array(); + for (const QJsonValue &value : jsonArray) + { + QString prop = value.toString().trimmed(); + if (!prop.isEmpty() && prop != data.name) + { + HQData childData; + childData.id = data.id; + childData.name = prop; + copyData.children.insert(childData.id); + childProperties.append(childData); + } + } + } + else + { + QString prop = QString::fromStdString(data.properties).trimmed(); + if (!prop.isEmpty() && prop != data.name) + { + HQData childData; + childData.id = data.id; + childData.name = prop; + childProperties.append(childData); + } + } + } + + beginInsertRows(QModelIndex(), m_data.count(), m_data.count()); + m_data.append(copyData); + + if (!childProperties.isEmpty()) + m_movedData.insert(data.id, childProperties); endInsertRows(); } void FlmHQReportModel::deleteHQReportData(const HQData &data) { - beginInsertRows(QModelIndex(), rowCount(), rowCount()); - endInsertRows(); - const int zeile = m_data.indexOf(data); - if (zeile == -1) { + if (zeile == -1) return; - } beginRemoveRows(QModelIndex(), zeile, zeile); m_data.removeAt(zeile); @@ -202,41 +329,54 @@ void FlmHQReportModel::deleteHQReportData(const HQData &data) void FlmHQReportModel::onFileContentChanged(const FileContent &content, DataModification modType) { + if (content.folderId() != m_contentFolderId || content.fileType() != m_fileType) + return; + HQData data; data.id = content.id(); data.name = QString::fromStdString(content.name()); - if (content.folderId() != m_contentFolderId || content.fileType() != m_fileType) - return; + data.properties = content.properties(); - if (content.fileStatus() == FileStatus::Deleted) { - if (modType == DataModification::eModified || modType == DataModification::eAdded) { - deleteHQReportData(data); - } - } else if (modType == DataModification::eAdded) { - addHQReportData(data); + DEBUG_LOG(m_logger) << "FlmHQReportModel::onFileContentChanged " << "properties " << data.properties << " " << " Name: " << data.name; + + if (content.fileStatus() == FileStatus::Deleted) + { + if (modType == DataModification::eModified || modType == DataModification::eAdded) + deleteHQReportData(data); + } + else if (modType == DataModification::eAdded) + { + addHQReportData(data); } } -int FlmHQReportModel::folderId() const -{ - return m_contentFolderId; -} +int FlmHQReportModel::folderId() const { return m_contentFolderId; } -QMap> FlmHQReportModel::getHQToPlan() const +QMap> FlmHQReportModel::getChangedPlans() const { - QMap> hqToPlan; + QMap> hqToPlan; for (auto it = m_movedData.constBegin(); it != m_movedData.constEnd(); ++it) { const QList &movedData = it.value(); - QList hqIds; + QSet hqIds; hqIds.reserve(movedData.size()); for (const HQData ¤tData : movedData) - hqIds.append(currentData.id); + hqIds.insert(currentData.id); - hqToPlan.insert(it.key(), hqIds); + HQData myPlan; + for (const auto &plan : m_data) + { + if (plan.id == it.key()) + { + myPlan = plan; + break; + } + } + if (myPlan.children != hqIds) + hqToPlan.insert(it.key(), hqIds); } return hqToPlan; @@ -244,51 +384,47 @@ QMap> FlmHQReportModel::getHQToPlan() const void FlmHQReportModel::clearMovedData() { + if (m_movedData.isEmpty()) + return; + + beginResetModel(); m_movedData.clear(); + endResetModel(); emit dataAddedOrRemoved(); - emit dataChanged(index(0, 0), index(rowCount() - 1, 0)); } -QString FlmHQReportModel::createText(int dataIndex) const +void FlmHQReportModel::addMovedData(const QModelIndex &parentIndex, const HQData &movedData) { - DEBUG_LOG(m_logger) << LOGFUNCTION << " dataIndex: " << dataIndex; - - if (dataIndex < 0 || dataIndex >= m_data.size()) - return QString(); - - const HQData &data = m_data.at(dataIndex); - - if (!m_movedData.contains(data.id)) - { - DEBUG_LOG(m_logger) << "No moved data for " << data.name; - return data.name; - } - - const QList &movedData = m_movedData.value(data.id); - QStringList movedDataNames; - - movedDataNames.reserve(movedData.size()); - - for (const HQData ¤tMovedData : movedData) - movedDataNames.append(currentMovedData.name); - - return QString(QStringLiteral("%1 (%2)")).arg(data.name).arg(movedDataNames.join(QLatin1Char(','))); -} - -void FlmHQReportModel::addMovedData(int dataIndex, const HQData &movedData) -{ - DEBUG_LOG(m_logger) << LOGFUNCTION << " dataIndex: " << dataIndex << ", movedData.id: " << movedData.id << ", movedData.name: " << movedData.name; - + int dataIndex = parentIndex.row(); if (dataIndex < 0 || dataIndex >= m_data.size()) return; const HQData &data = m_data.at(dataIndex); + if (data.id == movedData.id) + { + DEBUG_LOG(m_logger) << "DROP ABGEWIESEN: PlanId entspricht der ReportId (" << data.id << ")"; + return; + } + if (!m_movedData.contains(data.id)) m_movedData.insert(data.id, QList()); - m_movedData[data.id].append(movedData); -} + const QList &existingChildren = m_movedData[data.id]; + for (const HQData &child : existingChildren) + { + if (child.id == movedData.id || child.name.trimmed() == movedData.name.trimmed()) + { + DEBUG_LOG(m_logger) << "DROP ABGEWIESEN: Element '" << movedData.name << "' ist bereits vorhanden."; + return; + } + } + int newRow = m_movedData[data.id].size(); + + beginInsertRows(parentIndex, newRow, newRow); + m_movedData[data.id].append(movedData); + endInsertRows(); } +} // namespace FileManagement diff --git a/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_model.h b/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_model.h index e9be248e..0ac140c6 100755 --- a/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_model.h +++ b/Lts/Plugins/FileManagement/Gui/Explorer/HQReports/flm_hq_report_model.h @@ -1,14 +1,13 @@ #pragma once - -#include #include -#include -#include -#include #include #include +#include +#include +#include +#include #include #include @@ -22,7 +21,7 @@ namespace Interface { class Dtc; } -} +} // namespace FileManagement namespace LtsSession { @@ -33,21 +32,19 @@ namespace FileManagement { struct HQData { - int id; + int id{0}; QString name; + std::string properties; + QSet children; - bool operator==(const HQData &other) const - { - return id == other.id && - name == other.name; - } + bool operator==(const HQData &other) const { return id == other.id && name == other.name; } }; -class FlmHQReportModel : public QAbstractListModel +class FlmHQReportModel : public QAbstractItemModel { Q_OBJECT -public: + public: explicit FlmHQReportModel(QObject *parent = nullptr); bool init(LtsSession::LtsSession *session, int contentFolderId, const FileManagement::FileType &fileType); @@ -63,35 +60,37 @@ public: QMimeData *mimeData(const QList &indexes) const override; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override; bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const override; + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override { return 1; } + QModelIndex parent(const QModelIndex &index) const override; void addHQReportData(const HQData &data); void deleteHQReportData(const HQData &data); int folderId() const; - QMap> getHQToPlan() const; + QMap> getChangedPlans() const; void clearMovedData(); -private: - QString createText(int dataIndex) const; - void addMovedData(int dataIndex, const HQData &movedData); + private: + void addMovedData(const QModelIndex &parentIndex, const HQData &movedData); -private Q_SLOTS: + private Q_SLOTS: void onFileContentChanged(const FileContent &content, DataModification modType); -Q_SIGNALS: + Q_SIGNALS: void dataAddedOrRemoved(); -private: + private: QList m_data; QMap> m_movedData; const QString mimeType = QStringLiteral("application/x-custom-hqdata"); - int m_contentFolderId {-1}; + int m_contentFolderId{-1}; FileManagement::FileType m_fileType; std::shared_ptr m_flmDtc; LOGGER_T m_logger; }; -}//namespace FileManagement +} // namespace FileManagement Q_DECLARE_METATYPE(FileManagement::HQData) diff --git a/Lts/Plugins/MarkerManagement/Gui/MarkerEdit/mrk_edit_gui_plugin.h b/Lts/Plugins/MarkerManagement/Gui/MarkerEdit/mrk_edit_gui_plugin.h index 8440bd9a..e3bbea11 100755 --- a/Lts/Plugins/MarkerManagement/Gui/MarkerEdit/mrk_edit_gui_plugin.h +++ b/Lts/Plugins/MarkerManagement/Gui/MarkerEdit/mrk_edit_gui_plugin.h @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Lts/Plugins/ParticipantManagement/CMakeLists.txt b/Lts/Plugins/ParticipantManagement/CMakeLists.txt index ce156296..ca6177b8 100755 --- a/Lts/Plugins/ParticipantManagement/CMakeLists.txt +++ b/Lts/Plugins/ParticipantManagement/CMakeLists.txt @@ -101,3 +101,11 @@ ADD_INTERFACE_LIBRARY( ${CMAKE_CURRENT_SOURCE_DIR}/../../ ) ENDIF() + +# GuiElementInterface +ADD_INTERFACE_LIBRARY( + GuiElementInterface + ${CMAKE_CURRENT_SOURCE_DIR}/participant_info_gui_element_interface.h + ${CMAKE_CURRENT_SOURCE_DIR}/.. + Qt5::Core LtsWidgets +) diff --git a/Lts/Plugins/ParticipantManagement/Gui/ParticipantInfo/CMakeLists.txt b/Lts/Plugins/ParticipantManagement/Gui/ParticipantInfo/CMakeLists.txt index affdb345..07e52932 100755 --- a/Lts/Plugins/ParticipantManagement/Gui/ParticipantInfo/CMakeLists.txt +++ b/Lts/Plugins/ParticipantManagement/Gui/ParticipantInfo/CMakeLists.txt @@ -100,6 +100,8 @@ NGL_TARGET_LINK_LIBRARIES(PpmParticipantInfoGuiPlugin AesDataPluginInterface LtsDataView IsmDataPluginInterface + LtsPluginLoader + GuiElementInterface ) NGL_INSTALL_TARGET(PpmParticipantInfoGuiPlugin) diff --git a/Lts/Plugins/ParticipantManagement/Gui/ParticipantInfo/participant_info_dialog.cpp b/Lts/Plugins/ParticipantManagement/Gui/ParticipantInfo/participant_info_dialog.cpp index 6b1035c3..91d9346d 100755 --- a/Lts/Plugins/ParticipantManagement/Gui/ParticipantInfo/participant_info_dialog.cpp +++ b/Lts/Plugins/ParticipantManagement/Gui/ParticipantInfo/participant_info_dialog.cpp @@ -33,8 +33,10 @@ #include #include #include +#include #include +#include #include #include @@ -471,8 +473,38 @@ bool ParticipantInfoDialog::setUiValues() ERROR_LOG(m_logger) << LOGFUNCTION << m_typeClass; } +#if LTS_DEBUG + //-- start Test Gui Elment plugin + + auto cb = [this](const LtsPluginManager::PluginInstance &pi) { return loadGuiElementPLugin(pi);}; + LtsPluginManager::LtsPluginLoader::getInstance()->loadPlugins(LtsPluginManager::PluginType::GUI_ELEMENT, + cb, + QStringList()); + + //-- end Test Gui Element plugin +#endif return true; } + +bool ParticipantInfoDialog::loadGuiElementPLugin(const LtsPluginManager::PluginInstance &pi) +{ + WARNING_LOG(m_logger)<<">>>> GUI Element pluginName: "<(pi.plugin); + + if (guiElement->pluginName() == QStringLiteral("KeyValueGuiElement_XY")) + { + if (!guiElement->init(m_session, m_participant.id())) + return false; + + m_ui->gridLayout_2->addWidget(guiElement->createGuiElement(this)); + return true; + } + + + + + return false; +} //SLOTS void ParticipantInfoDialog::onDynamicParticipantDataChanged(const DynamicParticipantData &data, DataModification modType) diff --git a/Lts/Plugins/ParticipantManagement/Gui/ParticipantInfo/participant_info_dialog.h b/Lts/Plugins/ParticipantManagement/Gui/ParticipantInfo/participant_info_dialog.h index ab9f5aa3..12271b20 100755 --- a/Lts/Plugins/ParticipantManagement/Gui/ParticipantInfo/participant_info_dialog.h +++ b/Lts/Plugins/ParticipantManagement/Gui/ParticipantInfo/participant_info_dialog.h @@ -110,6 +110,7 @@ private: bool initTargetConfig(bool bShow); // Target (L400) bool initTargetConfigL400(bool bShow); + bool loadGuiElementPLugin(const LtsPluginManager::PluginInstance &pi); private Q_SLOTS: diff --git a/Lts/Plugins/ParticipantManagement/Gui/PartyEdit/ppm_party_edit.cpp b/Lts/Plugins/ParticipantManagement/Gui/PartyEdit/ppm_party_edit.cpp index 71c16a63..7957f2dc 100755 --- a/Lts/Plugins/ParticipantManagement/Gui/PartyEdit/ppm_party_edit.cpp +++ b/Lts/Plugins/ParticipantManagement/Gui/PartyEdit/ppm_party_edit.cpp @@ -54,7 +54,7 @@ PartyEdit::~PartyEdit() void PartyEdit::retranslate() { - translate(m_ui, m_dtc->party(m_partyId), tr("Party")); + translate(m_ui, m_dtc->party(m_partyId), trPartyName(m_dtc->party(m_partyId).name()), tr("Party")); m_ppmGuiCbxIfc->fillRoleComboBox(m_ui->cbRole); m_ppmGuiCbxIfc->fillHlaForceIdentifierComboBox(m_ui->cbHlaForceIdentifier); } diff --git a/Lts/Plugins/ParticipantManagement/Gui/PartyEdit/ppm_party_model.cpp b/Lts/Plugins/ParticipantManagement/Gui/PartyEdit/ppm_party_model.cpp index 89a8d0c4..27a0c909 100755 --- a/Lts/Plugins/ParticipantManagement/Gui/PartyEdit/ppm_party_model.cpp +++ b/Lts/Plugins/ParticipantManagement/Gui/PartyEdit/ppm_party_model.cpp @@ -105,14 +105,11 @@ QVariant PartyModel::data(const QModelIndex &index, int role) const QString connectState; switch (status.underlying()) { - case ParticipantManagement::ConnectState::Connected: - connectState = tr("Connected"); - break; - case ParticipantManagement::ConnectState::NoHeartbeat: - connectState = tr("No Heartbeat"); + case ParticipantManagement::ConnectState::Undefined: + connectState = QStringLiteral(""); break; default: - connectState = QStringLiteral(""); + connectState = ParticipantManagement::toString(status); break; } return connectState; diff --git a/Lts/Plugins/ParticipantManagement/participant_info_gui_element_interface.h b/Lts/Plugins/ParticipantManagement/participant_info_gui_element_interface.h new file mode 100644 index 00000000..df06b694 --- /dev/null +++ b/Lts/Plugins/ParticipantManagement/participant_info_gui_element_interface.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include + +namespace LtsSession +{ +class LtsSession; +} + +class GuiElementInterface +{ +public: + GuiElementInterface() = default; + virtual ~GuiElementInterface() = default; + virtual QString pluginName() = 0; + virtual QWidget* createGuiElement(QWidget *parent = nullptr) = 0; + virtual bool init(LtsSession::LtsSession *session, int participantId = 0) = 0; +}; + +// Eindeutige ID für das Qt-Plugin-System +#define IGuiElementPlugin "gui_element:3:participantInfo.guiElement" +Q_DECLARE_INTERFACE(GuiElementInterface, IGuiElementPlugin) diff --git a/Lts/Plugins/PresentationManagement/Gui/Script/ScriptEditor/pre_script_dialog.h b/Lts/Plugins/PresentationManagement/Gui/Script/ScriptEditor/pre_script_dialog.h index 81d65f1e..66f0c464 100755 --- a/Lts/Plugins/PresentationManagement/Gui/Script/ScriptEditor/pre_script_dialog.h +++ b/Lts/Plugins/PresentationManagement/Gui/Script/ScriptEditor/pre_script_dialog.h @@ -15,7 +15,7 @@ #include "pre_storyboard.h" // QPointer #include "filter_topic.h" -#include +#include #include #include #include diff --git a/Lts/Plugins/PresentationManagement/Gui/Script/ScriptTimelineEditor/pre_script_dialog.h b/Lts/Plugins/PresentationManagement/Gui/Script/ScriptTimelineEditor/pre_script_dialog.h index a020bee6..c693b6f4 100755 --- a/Lts/Plugins/PresentationManagement/Gui/Script/ScriptTimelineEditor/pre_script_dialog.h +++ b/Lts/Plugins/PresentationManagement/Gui/Script/ScriptTimelineEditor/pre_script_dialog.h @@ -14,7 +14,7 @@ #include "pre_journal_types.h" #include "pre_utils.h" -#include +#include #include #include #include diff --git a/Lts/Plugins/SituationReplayManagement/Data/srm_data_plugin.cpp b/Lts/Plugins/SituationReplayManagement/Data/srm_data_plugin.cpp index baac544e..1c4d8c31 100755 --- a/Lts/Plugins/SituationReplayManagement/Data/srm_data_plugin.cpp +++ b/Lts/Plugins/SituationReplayManagement/Data/srm_data_plugin.cpp @@ -9,12 +9,12 @@ #include "srm_data_plugin.h" -#include +#include #include #include #include #include -#include +#include #include #include #include diff --git a/Lts/Plugins/SituationReplayManagement/Gui/ReplayManagement/replay_dialog.h b/Lts/Plugins/SituationReplayManagement/Gui/ReplayManagement/replay_dialog.h index e2ac7d0b..31553369 100755 --- a/Lts/Plugins/SituationReplayManagement/Gui/ReplayManagement/replay_dialog.h +++ b/Lts/Plugins/SituationReplayManagement/Gui/ReplayManagement/replay_dialog.h @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Lts/Plugins/SituationReplayManagement/Gui/ReplayManagement/replay_dialog_model.h b/Lts/Plugins/SituationReplayManagement/Gui/ReplayManagement/replay_dialog_model.h index e9dace6a..04a1805a 100755 --- a/Lts/Plugins/SituationReplayManagement/Gui/ReplayManagement/replay_dialog_model.h +++ b/Lts/Plugins/SituationReplayManagement/Gui/ReplayManagement/replay_dialog_model.h @@ -10,7 +10,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Lts/Plugins/SituationReplayManagement/srm_data_plugin_interface.h b/Lts/Plugins/SituationReplayManagement/srm_data_plugin_interface.h index 5154e216..84d9a076 100755 --- a/Lts/Plugins/SituationReplayManagement/srm_data_plugin_interface.h +++ b/Lts/Plugins/SituationReplayManagement/srm_data_plugin_interface.h @@ -11,7 +11,7 @@ #include #include -#include +#include namespace Core { diff --git a/Lts/Projects/Guez/lts-cc.conf b/Lts/Projects/Guez/lts-cc.conf index 5e7f4a51..ff2ea17a 100755 --- a/Lts/Projects/Guez/lts-cc.conf +++ b/Lts/Projects/Guez/lts-cc.conf @@ -457,6 +457,10 @@ UsePvSan=true # Default -> @Point(0 0) ;webSocketServerPortRange/3=@Point(0 0) +# ADLER WebSocket +# sets the interval, in milliseconds, after which the ADLER WebSocket connection is reported as disconnected. +AdlerKeepalive=30000 + ############################# # IPS/OPS GPS transition # DistanceIpsToGps=0 Distance of the first GPS coordinate to the building after an IPS position default = 0 [m] (int) diff --git a/Lts/Proxies/Buildings/dds_handler.cpp b/Lts/Proxies/Buildings/dds_handler.cpp index cc648a44..158a4d09 100755 --- a/Lts/Proxies/Buildings/dds_handler.cpp +++ b/Lts/Proxies/Buildings/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace Buildings { diff --git a/Lts/Proxies/Buildings/main_handler.cpp b/Lts/Proxies/Buildings/main_handler.cpp index ac379629..4919fcf3 100755 --- a/Lts/Proxies/Buildings/main_handler.cpp +++ b/Lts/Proxies/Buildings/main_handler.cpp @@ -8,7 +8,7 @@ #include "main_handler.h" #include "settings.h" -#include +#include #include #include diff --git a/Lts/Proxies/CombatNetRadio/dds_handler.cpp b/Lts/Proxies/CombatNetRadio/dds_handler.cpp index 06feb5ab..37008bf7 100755 --- a/Lts/Proxies/CombatNetRadio/dds_handler.cpp +++ b/Lts/Proxies/CombatNetRadio/dds_handler.cpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include namespace CombatNetRadio { diff --git a/Lts/Proxies/CombatNetRadio/main_handler.cpp b/Lts/Proxies/CombatNetRadio/main_handler.cpp index 97386beb..eaa4b05c 100755 --- a/Lts/Proxies/CombatNetRadio/main_handler.cpp +++ b/Lts/Proxies/CombatNetRadio/main_handler.cpp @@ -11,7 +11,7 @@ #include "active_exercises.h" #include "exercise_manager.h" #include "WebSocketInterface/websocket_interface_handler.h" -#include +#include using namespace CombatNetRadio; diff --git a/Lts/Proxies/ComponentMonitor/dds_handler.cpp b/Lts/Proxies/ComponentMonitor/dds_handler.cpp index c1c8b9f1..782c8ad0 100755 --- a/Lts/Proxies/ComponentMonitor/dds_handler.cpp +++ b/Lts/Proxies/ComponentMonitor/dds_handler.cpp @@ -12,7 +12,7 @@ #include "cmo_fts.h" #include -#include +#include #include diff --git a/Lts/Proxies/ComponentMonitor/dds_handler.h b/Lts/Proxies/ComponentMonitor/dds_handler.h index d74005ad..fe139c04 100755 --- a/Lts/Proxies/ComponentMonitor/dds_handler.h +++ b/Lts/Proxies/ComponentMonitor/dds_handler.h @@ -9,7 +9,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Lts/Proxies/ComponentMonitor/main_handler.cpp b/Lts/Proxies/ComponentMonitor/main_handler.cpp index 2c010922..94868e31 100755 --- a/Lts/Proxies/ComponentMonitor/main_handler.cpp +++ b/Lts/Proxies/ComponentMonitor/main_handler.cpp @@ -10,7 +10,7 @@ #include #include -#include +#include namespace ComponentMonitor { diff --git a/Lts/Proxies/DifferentialGPS/dds_handler.cpp b/Lts/Proxies/DifferentialGPS/dds_handler.cpp index 5a0f44d3..a40a1fa4 100755 --- a/Lts/Proxies/DifferentialGPS/dds_handler.cpp +++ b/Lts/Proxies/DifferentialGPS/dds_handler.cpp @@ -7,7 +7,7 @@ */ #include "dds_handler.h" -#include +#include namespace DifferentialGPS { diff --git a/Lts/Proxies/DifferentialGPS/mainthread.cpp b/Lts/Proxies/DifferentialGPS/mainthread.cpp index fcfcd5ab..04bd1b3b 100755 --- a/Lts/Proxies/DifferentialGPS/mainthread.cpp +++ b/Lts/Proxies/DifferentialGPS/mainthread.cpp @@ -11,7 +11,7 @@ #include #include -#include +#include namespace DifferentialGPS { diff --git a/Lts/Proxies/GuezNasat/initialization.cpp b/Lts/Proxies/GuezNasat/initialization.cpp index e76e4665..85bba163 100755 --- a/Lts/Proxies/GuezNasat/initialization.cpp +++ b/Lts/Proxies/GuezNasat/initialization.cpp @@ -19,7 +19,7 @@ #include #include -#include +#include #include diff --git a/Lts/Proxies/HighLevelArchitecture/Apache/dds_handler.cpp b/Lts/Proxies/HighLevelArchitecture/Apache/dds_handler.cpp index 2f2b7bbe..f5edb473 100755 --- a/Lts/Proxies/HighLevelArchitecture/Apache/dds_handler.cpp +++ b/Lts/Proxies/HighLevelArchitecture/Apache/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include #include namespace HighLevelArchitecture diff --git a/Lts/Proxies/HighLevelArchitecture/Apache/dds_handler.h b/Lts/Proxies/HighLevelArchitecture/Apache/dds_handler.h index 7afdbcf6..e56c803a 100755 --- a/Lts/Proxies/HighLevelArchitecture/Apache/dds_handler.h +++ b/Lts/Proxies/HighLevelArchitecture/Apache/dds_handler.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Lts/Proxies/HighLevelArchitecture/Apache/main_handler.cpp b/Lts/Proxies/HighLevelArchitecture/Apache/main_handler.cpp index 5d4fddeb..413f8dac 100755 --- a/Lts/Proxies/HighLevelArchitecture/Apache/main_handler.cpp +++ b/Lts/Proxies/HighLevelArchitecture/Apache/main_handler.cpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include namespace HighLevelArchitecture { diff --git a/Lts/Proxies/HighLevelArchitecture/Guez/dds_handler.cpp b/Lts/Proxies/HighLevelArchitecture/Guez/dds_handler.cpp index 295b21cb..5bac9e97 100755 --- a/Lts/Proxies/HighLevelArchitecture/Guez/dds_handler.cpp +++ b/Lts/Proxies/HighLevelArchitecture/Guez/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include #include namespace HighLevelArchitecture diff --git a/Lts/Proxies/HighLevelArchitecture/Guez/dds_handler.h b/Lts/Proxies/HighLevelArchitecture/Guez/dds_handler.h index 9ffbc352..caa5a772 100755 --- a/Lts/Proxies/HighLevelArchitecture/Guez/dds_handler.h +++ b/Lts/Proxies/HighLevelArchitecture/Guez/dds_handler.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Lts/Proxies/HighLevelArchitecture/Guez/main_handler.cpp b/Lts/Proxies/HighLevelArchitecture/Guez/main_handler.cpp index 6e3a30d4..ea552f05 100755 --- a/Lts/Proxies/HighLevelArchitecture/Guez/main_handler.cpp +++ b/Lts/Proxies/HighLevelArchitecture/Guez/main_handler.cpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include namespace HighLevelArchitecture { diff --git a/Lts/Proxies/HighLevelArchitecture/Hla_test_tool/main_handler.cpp b/Lts/Proxies/HighLevelArchitecture/Hla_test_tool/main_handler.cpp index 040f9a7a..b68b9db1 100755 --- a/Lts/Proxies/HighLevelArchitecture/Hla_test_tool/main_handler.cpp +++ b/Lts/Proxies/HighLevelArchitecture/Hla_test_tool/main_handler.cpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include namespace HighLevelArchitecture { diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/aes_handler.cpp b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/aes_handler.cpp index 6cfc4454..89d1cab7 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/aes_handler.cpp +++ b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/aes_handler.cpp @@ -8,7 +8,7 @@ */ #include "aes_handler.h" -#include "Core/function_reply_object.h" +#include "DDS/Core/function_reply_object.h" #include "aes.hpp" #include "json_dispatcher.h" #include @@ -525,7 +525,11 @@ void AesHandler::handleEffectCluster(const WirkfeldplanungData &data, int wsId) // maye wrong? // not only maybe.. we need to swap .. yes.. area.height(data.zieldaten.breiteRadius); - area.width(data.zieldaten.tiefe); + if (data.zieldaten.tiefe > 0) + area.width(data.zieldaten.tiefe); + else + if (data.zieldaten.geometrie == ProjectDataManagement::L4_TargetGeometry::Linear) + area.width(5); // E01562-472 [Verbund] ImpactWidth invalid. Ein Wirkfeld mit der Zielgeometrie "Linear" kann nicht verarbeitet werden. } if (!createArea) diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/aes_handler.h b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/aes_handler.h index 28a64c01..0a71f3f2 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/aes_handler.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/aes_handler.h @@ -9,7 +9,7 @@ #pragma once -#include "Core/function_reply_object.h" +#include "DDS/Core/function_reply_object.h" #include "logger.h" #include "main_dispatcher.h" #include "telegrams.h" diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/json_dispatcher.cpp b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/json_dispatcher.cpp index 903e6c88..56fcf829 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/json_dispatcher.cpp +++ b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/json_dispatcher.cpp @@ -477,25 +477,17 @@ void JsonDispatcher::onSAASQWS(const int wsId, const Waffensystemdaten &exSQWS) const bool isVerbund = true; auto saa = getSAAByWs(wsId); int partyId = saa->getPartyId(); - QStringList args; - const ParticipantManagement::Participant &part = m_ppmHandler->findParticipantByInternalName(exSQWS.einheit.verein, partyId, isVerbund); - QString content = QString::fromUtf8(tr_lts("Notification","Show Participant Info
Unit: %2/%3/%4")); - args.append(QString::number(part.id())); - args.append(ortsIdMap.key(exSQWS.einheit.oi)); - args.append(QString::number(exSQWS.einheit.r)); - args.append(exSQWS.einheit.verein); - - DEBUG_LOG(m_logger) << "Stellungsmeldung Waffensystem content=" << content; - createNotificationRequest(wsId, - QString::fromUtf8(tr_lts("Notification","Weapon System Position Report")), - NotificationManagement::MessageType_def::Info, - NotificationManagement::NotificationType::AdlerNotification, - content, - args); - // Parse in party SAA m_ppmHandler->parseSQWS(exSQWS, wsId); + if (part.id() > 0) + { + sendParticipantInfoNotification(wsId, partyId, isVerbund, exSQWS.einheit); + return; + } + QTimer::singleShot(5000, this, [this, wsId, partyId, isVerbund, exSQWS]() { + sendParticipantInfoNotification(wsId, partyId, isVerbund, exSQWS.einheit); + }); } void JsonDispatcher::onSAASQFS(const int wsId, const Feuerstellungsdaten &exSQFS) @@ -504,25 +496,17 @@ void JsonDispatcher::onSAASQFS(const int wsId, const Feuerstellungsdaten &exSQFS auto saa = getSAAByWs(wsId); int partyId = saa->getPartyId(); const bool isVerbund = true; - QStringList args; - const ParticipantManagement::Participant &part = m_ppmHandler->findParticipantByInternalName(exSQFS.feuereinheit.verein, partyId, isVerbund); - - QString content = QString::fromUtf8(tr_lts("Notification","Show Participant Info
Unit: %2/%3/%4")); - args.append(QString::number(part.id())); - args.append(ortsIdMap.key(exSQFS.feuereinheit.oi)); - args.append(QString::number(exSQFS.feuereinheit.r)); - args.append(exSQFS.feuereinheit.verein); - - DEBUG_LOG(m_logger) << "Stellungsmeldung Feuerstellung content=" << content; - createNotificationRequest(wsId, - QString::fromUtf8(tr_lts("Notification","Position Report: Firing Unit")), - NotificationManagement::MessageType_def::Info, - NotificationManagement::NotificationType::AdlerNotification, - content, - args); - // Parse in party SAA m_ppmHandler->parseSQFS(exSQFS, wsId); + const ParticipantManagement::Participant &part = m_ppmHandler->findParticipantByInternalName(exSQFS.feuereinheit.verein, partyId, isVerbund); + if (part.id() > 0) + { + sendParticipantInfoNotification(wsId, partyId, isVerbund, exSQFS.feuereinheit); + return; + } + QTimer::singleShot(5000, this, [this, wsId, partyId, isVerbund, exSQFS]() { + sendParticipantInfoNotification(wsId, partyId, isVerbund, exSQFS.feuereinheit); + }); } void JsonDispatcher::onSAASQLP(const int wsId, const Ladeplatzdaten &exSQLP) @@ -531,17 +515,35 @@ void JsonDispatcher::onSAASQLP(const int wsId, const Ladeplatzdaten &exSQLP) auto saa = getSAAByWs(wsId); int partyId = saa->getPartyId(); const bool isVerbund = true; - QStringList args; const ParticipantManagement::Participant &part = m_ppmHandler->findParticipantByInternalName(exSQLP.einheit.verein, partyId, isVerbund); - DEBUG_LOG(m_logger) << "ParticipantId=" << part.id(); + + + m_ppmHandler->parseSQLP(exSQLP, wsId); + if (part.id() > 0) + { + sendParticipantInfoNotification(wsId, partyId, isVerbund, exSQLP.einheit); + return; + } + QTimer::singleShot(5000, this, [this, wsId, partyId, exSQLP]() { + sendParticipantInfoNotification(wsId, partyId, isVerbund, exSQLP.einheit); + }); +} + +void JsonDispatcher::sendParticipantInfoNotification(const int wsId, const int partyId, const bool isVerbund, const Einheit &einheit) +{ + DEBUG_LOG(m_logger) << "sendParticipantInfoNotification"; + QStringList args; + + const ParticipantManagement::Participant &part = m_ppmHandler->findParticipantByInternalName(einheit.verein, partyId, isVerbund); + DEBUG_LOG(m_logger) << "sendParticipantInfoNotification ParticipantId=" << part.id(); QString content = QString::fromUtf8(tr_lts("Notification","Show Participant Info
Unit: %2/%3/%4")); args.append(QString::number(part.id())); - args.append(ortsIdMap.key(exSQLP.einheit.oi)); - args.append(QString::number(exSQLP.einheit.r)); - args.append(exSQLP.einheit.verein); + args.append(ortsIdMap.key(einheit.oi)); + args.append(QString::number(einheit.r)); + args.append(einheit.verein); createNotificationRequest(wsId, QString::fromUtf8(tr_lts("Notification","Loading Point Position Report")), @@ -549,9 +551,7 @@ void JsonDispatcher::onSAASQLP(const int wsId, const Ladeplatzdaten &exSQLP) NotificationManagement::NotificationType::AdlerNotification, content, args); - DEBUG_LOG(m_logger) << "Stellungsmeldung Ladeplatz content=" << content; - // Parse in party SAA - m_ppmHandler->parseSQLP(exSQLP, wsId); + DEBUG_LOG(m_logger) << "Stellungsmeldung content=" << content; } void JsonDispatcher::onSAATrajectoryData(const int wsId, const Flugbahndaten &exFlugbahndaten, const QString referenceUuid) diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/json_dispatcher.h b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/json_dispatcher.h index a4f359dc..9e134b0f 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/json_dispatcher.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/json_dispatcher.h @@ -13,7 +13,7 @@ #include #include #include -#include // tr_lts +#include // tr_lts #include // #include "logger.h" #include "aes_handler.h" @@ -98,6 +98,7 @@ class JsonDispatcher final void onSAASQWS(const int wsId, const Waffensystemdaten &exSQWS); void onSAASQFS(const int wsId, const Feuerstellungsdaten &exSQFS); void onSAASQLP(const int wsId, const Ladeplatzdaten &exSQLP); + void sendParticipantInfoNotification(const int wsId, const int partyId, const bool isVerbund, const Einheit &einheit); void onSAAHXGuidingLines(const int wsId, const Koordinierungsdaten &koordinierungsdaten); void onSAAHXGuidingLinesAndBoundaries(const int wsId, const Fuehrungsdaten &fuehrungsdaten); void onSSAEXFIREHALT(const int wsId, const FeuerHaltDaten &feuerhaltdaten); diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/json_handler_rx.cpp b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/json_handler_rx.cpp index 6c87d427..2e12cdad 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/json_handler_rx.cpp +++ b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/json_handler_rx.cpp @@ -89,16 +89,16 @@ bool JsonHandlerRx::handleTelegram(int wsId, const QJsonObject &telegram, int &e m_dispatcher->onSAAStatus(wsId, exStatus); break; } - case TelegramIds::EX_TQ(): // Technische Quittierung - { - WARNING_LOG(m_logger) << "[EX_TQ] Technische Quittierung -------------------------------------"; - const auto data = telegram[JsonKeys::DATA()].toObject(); - bool bOk = true; - TechnischeDaten technischeDaten; - AdlerJson::technischeDatenFromJson(data, technischeDaten, bOk); - m_dispatcher->onSAAExceptionStatus(wsId, technischeDaten); - break; - } + case TelegramIds::EX_TQ(): // Technische Quittierung + { + WARNING_LOG(m_logger) << "[EX_TQ] Technische Quittierung -------------------------------------"; + const auto data = telegram[JsonKeys::DATA()].toObject(); + bool bOk = true; + TechnischeDaten technischeDaten; + AdlerJson::technischeDatenFromJson(data, technischeDaten, bOk); + m_dispatcher->onSAAExceptionStatus(wsId, technischeDaten); + break; + } case TelegramIds::EX_FIRE(): // EX-FQ(FN) Feuern { WARNING_LOG(m_logger) << "[EX-FQ(FN)] EX-Feuern -------------------------------------"; @@ -203,12 +203,13 @@ bool JsonHandlerRx::handleTelegram(int wsId, const QJsonObject &telegram, int &e { DEBUG_LOG(m_logger) << "[EX_GUIDING_LINES] EX-HQ Koordinierungsmassnahmen"; auto data = telegram[JsonKeys::DATA()].toObject(); + const QString artStr = data.value(JsonKeys::ART()).toString(QStringLiteral("Koordinierungsmassnahmen")); Koordinierungsdaten koordinierungsdaten; bool bOk = true; koordinierungsdatenFromJson(data, koordinierungsdaten, bOk); if (koordinierungsdaten.name.isEmpty()) - koordinierungsdaten.name = QString(QStringLiteral("%1 - %2")).arg(typeName).arg(uuid); + koordinierungsdaten.name = QString(QStringLiteral("%1 - %2")).arg(typeName).arg(artStr); else koordinierungsdaten.name = QString(QStringLiteral("%1 - %2")).arg(typeName).arg(koordinierungsdaten.name); @@ -219,12 +220,13 @@ bool JsonHandlerRx::handleTelegram(int wsId, const QJsonObject &telegram, int &e { DEBUG_LOG(m_logger) << "[EX_GUIDING_LINES_AND_BOUNDARIES] EX-HQ(G)Fuehrungslinien und Grenzen "; auto data = telegram[JsonKeys::DATA()].toObject(); + const QString artStr = data.value(JsonKeys::ART()).toString(QStringLiteral("Fuehrungslinien und Grenzen")); Fuehrungsdaten fuehrungsdaten; bool bOk = true; fuehrungsdatenFromJson(data, fuehrungsdaten, bOk); if (fuehrungsdaten.name.isEmpty()) - fuehrungsdaten.name = QString(QStringLiteral("%1 - %2")).arg(typeName).arg(uuid); + fuehrungsdaten.name = QString(QStringLiteral("%1 - %2")).arg(typeName).arg(artStr); else fuehrungsdaten.name = QString(QStringLiteral("%1 - %2")).arg(typeName).arg(fuehrungsdaten.name); diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/main_dispatcher.cpp b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/main_dispatcher.cpp index a586fcae..655a932f 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/main_dispatcher.cpp +++ b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/main_dispatcher.cpp @@ -12,7 +12,7 @@ #include "json_dispatcher.h" //#include "json_handler_tx.h" #include -#include +#include #include namespace AdlerJson diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/main_dispatcher.h b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/main_dispatcher.h index 21adee34..1cf82cb8 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/main_dispatcher.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/main_dispatcher.h @@ -11,7 +11,7 @@ #include #include -#include // tr_lts +#include // tr_lts #include //#include "logger.h" #include "ppm_handler.h" diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/telegrams.cpp b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/telegrams.cpp index 2b62a79f..438474e2 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/telegrams.cpp +++ b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/telegrams.cpp @@ -1916,33 +1916,13 @@ Szenarstatus strToSzenarstatus(QString status) { return szenarstatusMap.value(st int getFeuerkommandoRaketeEffectDurationMsec(const QJsonObject &data) { - bool bOk = false; - int wirkzeitMsec; - switch (toInteger(data[JsonKeys::WIRKZEIT()], bOk)){ - case 1: - wirkzeitMsec = 3 * 60 * 60 * 1000; - break; - case 2: - wirkzeitMsec = 6 * 60 * 60 * 1000; - break; - case 3: - wirkzeitMsec = 12 * 60 * 60 * 1000; - break; - case 4: - wirkzeitMsec = 24 * 60 * 60 * 1000; - break; - case 5: - wirkzeitMsec = 48 * 60 * 60 * 1000; - break; - case 6: - wirkzeitMsec = 96 * 60 * 60 * 1000; - break; - default: - wirkzeitMsec = 3 * 60 * 60 * 1000; - break; - } + constexpr int hourToMsec = 60 * 60 * 1000; + constexpr int defaultWirkzeitMsec = 3 * hourToMsec; - return wirkzeitMsec; + bool bOk = false; + int wirkzeitHour = toInteger(data[JsonKeys::WIRKZEIT()], bOk); + + return (bOk ? wirkzeitHour * hourToMsec : defaultWirkzeitMsec); } } // namespace AdlerJson diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/telegrams.h b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/telegrams.h index eb88f223..bd034d53 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/telegrams.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/AdlerJson/telegrams.h @@ -383,15 +383,15 @@ template <> QJsonObject EXStatus::toJsonInternal(); // EX-L13 struct SAATELEGRAMS_EXPORT Koordinate { - double latitude; // -90.0…90.0 - double longitude; // -180.0…180.0 + double latitude {0.0}; // -90.0…90.0 + double longitude {0.0}; // -180.0…180.0 }; // EX-L14 struct SAATELEGRAMS_EXPORT KoordinateMitHoehe { Koordinate koordinate; // EX-L13 - int hoehe; // EX-L5 -399…9999 Meter + int hoehe {0}; // EX-L5 -399…9999 Meter }; // EX-L6 Abfeuerungsart @@ -683,10 +683,10 @@ struct SAATELEGRAMS_EXPORT FeuerkommandoGeschosse QString ladung; // EX-L10 (table pdm_load_type) QString zuender; // EX-L11 (table pdm_igniter_type) QString zuenderFunktion; // EX-L41 (table pdm_igniter_function) - double zuenderZeit; // [ms] - int anzahl; - int ladungsNummer; - double intervall; // [s] + double zuenderZeit {0.0};// [ms] + int anzahl {-1}; + int ladungsNummer {-1}; + double intervall {0.0}; // [s] }; // EX-L35 Flugbahnpunkt @@ -744,22 +744,22 @@ struct SAATELEGRAMS_EXPORT WirkmittelFeuerkommando struct SAATELEGRAMS_EXPORT Treffpunkt { KoordinateMitHoehe koordinate; // EX-L14 - int anzahl; + int anzahl {-1}; }; // EX-L49 Wirkmittel Feuerkommando Rakete struct SAATELEGRAMS_EXPORT WirkmittelFeuerkommandoRakete { - ProjectDataManagement::L27_EffectorId kenner; // EX-L27 + ProjectDataManagement::L27_EffectorId kenner {ProjectDataManagement::L27_EffectorId_def::get_default()}; // EX-L27 QVector treffpunkte; - double flugzeit; - int gipfelhoehe; - double schussrichtung; - int fallwinkel; - ProjectDataManagement::L48_TrajectoryRocket anflug; + double flugzeit {0.0}; + int gipfelhoehe {0}; + double schussrichtung {0.0}; + int fallwinkel {0}; + ProjectDataManagement::L48_TrajectoryRocket anflug {ProjectDataManagement::L48_TrajectoryRocket_def::get_default()}; FeuerkommandoGeschosse geschoss; - ProjectDataManagement::L46_GpsFrequency gps; - int wirkzeit; + ProjectDataManagement::L46_GpsFrequency gps {ProjectDataManagement::L46_GpsFrequency_def::get_default()}; + int wirkzeit {-1}; }; // EX-L33 Feuerkommando diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/ApacheHlaJson/dds_handler.cpp b/Lts/Proxies/TrainingAreaBase/Plugins/ApacheHlaJson/dds_handler.cpp index 884c47b7..d7fd5bf2 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/ApacheHlaJson/dds_handler.cpp +++ b/Lts/Proxies/TrainingAreaBase/Plugins/ApacheHlaJson/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace ApHlaJson { diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/ApacheHlaJson/hla_dispatcher.h b/Lts/Proxies/TrainingAreaBase/Plugins/ApacheHlaJson/hla_dispatcher.h index 708401a1..e26f6e53 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/ApacheHlaJson/hla_dispatcher.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/ApacheHlaJson/hla_dispatcher.h @@ -11,7 +11,7 @@ #include #include #include -#include // tr_lts +#include // tr_lts #include "logger.h" #include "ppm_handler.h" #include "aes_handler.h" diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/ApacheHlaJson/main_dispatcher.h b/Lts/Proxies/TrainingAreaBase/Plugins/ApacheHlaJson/main_dispatcher.h index 9c98d71b..51feada4 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/ApacheHlaJson/main_dispatcher.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/ApacheHlaJson/main_dispatcher.h @@ -10,7 +10,7 @@ #include #include -#include // tr_lts +#include // tr_lts #include "dds_handler.h" #include "logger.h" #include "ppm_handler.h" diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/DebugJsonDir/directory_dispatcher.h b/Lts/Proxies/TrainingAreaBase/Plugins/DebugJsonDir/directory_dispatcher.h index f1639b5a..001e53c1 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/DebugJsonDir/directory_dispatcher.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/DebugJsonDir/directory_dispatcher.h @@ -10,7 +10,7 @@ #include #include -#include +#include #include "../TetraJson/convert_from_json.h" #include "convert_to_json_file.h" diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/HlaJson/hla_dispatcher.h b/Lts/Proxies/TrainingAreaBase/Plugins/HlaJson/hla_dispatcher.h index 64e319fe..c2a63f89 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/HlaJson/hla_dispatcher.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/HlaJson/hla_dispatcher.h @@ -11,7 +11,7 @@ #include #include #include -#include // tr_lts +#include // tr_lts #include "logger.h" class QTimer; diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/HlaJson/main_dispatcher.h b/Lts/Proxies/TrainingAreaBase/Plugins/HlaJson/main_dispatcher.h index 15f5f3ae..c9bd5441 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/HlaJson/main_dispatcher.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/HlaJson/main_dispatcher.h @@ -10,7 +10,7 @@ #include #include -#include // tr_lts +#include // tr_lts #include "logger.h" namespace HlaJson diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/Nmea/main_dispatcher.h b/Lts/Proxies/TrainingAreaBase/Plugins/Nmea/main_dispatcher.h index 48b1e78b..1bb322ab 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/Nmea/main_dispatcher.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/Nmea/main_dispatcher.h @@ -10,7 +10,7 @@ #include #include -#include // tr_lts +#include // tr_lts #include "logger.h" namespace Nmea diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/Nmea/nmea_dispatcher.h b/Lts/Proxies/TrainingAreaBase/Plugins/Nmea/nmea_dispatcher.h index cbcc6b7e..7900e545 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/Nmea/nmea_dispatcher.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/Nmea/nmea_dispatcher.h @@ -15,7 +15,7 @@ #include #include #include -#include // tr_lts +#include // tr_lts #include "logger.h" namespace Nmea diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/UAS/plugin_instance.h b/Lts/Proxies/TrainingAreaBase/Plugins/UAS/plugin_instance.h index 78f60666..641874dc 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/UAS/plugin_instance.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/UAS/plugin_instance.h @@ -12,7 +12,7 @@ #include #include -#include // tr_lts +#include // tr_lts #include diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/WlsTetra/main_dispatcher.h b/Lts/Proxies/TrainingAreaBase/Plugins/WlsTetra/main_dispatcher.h index 6f355664..85d4ae38 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/WlsTetra/main_dispatcher.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/WlsTetra/main_dispatcher.h @@ -10,7 +10,7 @@ #include #include -#include // tr_lts +#include // tr_lts #include "logger.h" namespace WlsTetra diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/WlsTetra/tetra_dispatcher.h b/Lts/Proxies/TrainingAreaBase/Plugins/WlsTetra/tetra_dispatcher.h index deb5a623..4f961738 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/WlsTetra/tetra_dispatcher.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/WlsTetra/tetra_dispatcher.h @@ -14,7 +14,7 @@ #include #include #include -#include // tr_lts +#include // tr_lts #include "tetra_prtcnv.h" #include "logger.h" diff --git a/Lts/Proxies/TrainingAreaBase/Plugins/WlsTetra/wls_dispatcher.h b/Lts/Proxies/TrainingAreaBase/Plugins/WlsTetra/wls_dispatcher.h index f44ecc08..96c78bc1 100755 --- a/Lts/Proxies/TrainingAreaBase/Plugins/WlsTetra/wls_dispatcher.h +++ b/Lts/Proxies/TrainingAreaBase/Plugins/WlsTetra/wls_dispatcher.h @@ -11,7 +11,7 @@ #include #include #include -#include // tr_lts +#include // tr_lts #include "logger.h" class QTimer; diff --git a/Lts/Proxies/TrainingAreaBase/dds_handler.cpp b/Lts/Proxies/TrainingAreaBase/dds_handler.cpp index 8d23cce5..d64e3d56 100755 --- a/Lts/Proxies/TrainingAreaBase/dds_handler.cpp +++ b/Lts/Proxies/TrainingAreaBase/dds_handler.cpp @@ -10,7 +10,7 @@ #include #include -#include +#include #include #include diff --git a/Lts/Proxies/TrainingAreaBase/dds_handler.h b/Lts/Proxies/TrainingAreaBase/dds_handler.h index d83fcf8e..a21c763a 100755 --- a/Lts/Proxies/TrainingAreaBase/dds_handler.h +++ b/Lts/Proxies/TrainingAreaBase/dds_handler.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Lts/Proxies/TrainingAreaBase/main_handler.cpp b/Lts/Proxies/TrainingAreaBase/main_handler.cpp index 25a11c89..363d7292 100755 --- a/Lts/Proxies/TrainingAreaBase/main_handler.cpp +++ b/Lts/Proxies/TrainingAreaBase/main_handler.cpp @@ -13,7 +13,7 @@ #include "WebSocketInterface/json_keys.h" #include -#include +#include #include #include #include diff --git a/Lts/Proxies/TrainingAreaBase/recv_from_dds_fts.cpp b/Lts/Proxies/TrainingAreaBase/recv_from_dds_fts.cpp index e2288b9a..50433ccd 100755 --- a/Lts/Proxies/TrainingAreaBase/recv_from_dds_fts.cpp +++ b/Lts/Proxies/TrainingAreaBase/recv_from_dds_fts.cpp @@ -310,7 +310,10 @@ void RecvFromDdsFts::onSendCesHitRequest(const rti::core::SampleIdentity &cookie //data.aesTetraIdUnused = m_mainHandler->aesHandler()->tetraIdFromDdsId(request.aesId()); data.aesDdsId = request.aesId(); //TODO: !!!!!! Use new EventType to check which AreaEffectSimulationType will be chosen. - data.aesType = m_mainHandler->aesHandler()->aesTypeFromId(request.aesId()); + if (request.eventType() == ProjectDataManagement::EventType::ExplosionCluster) + data.aesType = TetraIcd::AreaEffectSimulationType::ExplosionArea; + else + data.aesType = m_mainHandler->aesHandler()->aesTypeFromId(request.aesId()); /*! \brief Take the new event type attribute to check if its is a HazardArea(DangerZone/Gefahrenbereich) * diff --git a/Lts/Proxies/TrainingAreaBaseOC/dds_handler.cpp b/Lts/Proxies/TrainingAreaBaseOC/dds_handler.cpp index 574c7ef6..6d5590ee 100755 --- a/Lts/Proxies/TrainingAreaBaseOC/dds_handler.cpp +++ b/Lts/Proxies/TrainingAreaBaseOC/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace TrainingAreaBaseOC { diff --git a/Lts/Proxies/TrainingAreaBaseOC/dds_handler.h b/Lts/Proxies/TrainingAreaBaseOC/dds_handler.h index b9322284..07c686eb 100755 --- a/Lts/Proxies/TrainingAreaBaseOC/dds_handler.h +++ b/Lts/Proxies/TrainingAreaBaseOC/dds_handler.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Lts/Proxies/TrainingAreaBaseOC/main_handler.cpp b/Lts/Proxies/TrainingAreaBaseOC/main_handler.cpp index 07705de9..c0646643 100755 --- a/Lts/Proxies/TrainingAreaBaseOC/main_handler.cpp +++ b/Lts/Proxies/TrainingAreaBaseOC/main_handler.cpp @@ -9,7 +9,7 @@ #include "main_handler.h" #include "settings.h" #include "logger.h" -#include +#include namespace TrainingAreaBaseOC { diff --git a/Lts/Proxies/WarehouseManagement/dds_handler.cpp b/Lts/Proxies/WarehouseManagement/dds_handler.cpp index abd36329..7ad6797d 100755 --- a/Lts/Proxies/WarehouseManagement/dds_handler.cpp +++ b/Lts/Proxies/WarehouseManagement/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace WarehouseManagement { diff --git a/Lts/Proxies/WarehouseManagement/dds_handler_exercise.cpp b/Lts/Proxies/WarehouseManagement/dds_handler_exercise.cpp index e321f9b3..0f7c66a8 100755 --- a/Lts/Proxies/WarehouseManagement/dds_handler_exercise.cpp +++ b/Lts/Proxies/WarehouseManagement/dds_handler_exercise.cpp @@ -8,7 +8,7 @@ #include "dds_handler_exercise.h" -#include +#include #include namespace WarehouseManagement diff --git a/Lts/Proxies/WarehouseManagement/main_handler.cpp b/Lts/Proxies/WarehouseManagement/main_handler.cpp index 6d6d5109..ad454836 100755 --- a/Lts/Proxies/WarehouseManagement/main_handler.cpp +++ b/Lts/Proxies/WarehouseManagement/main_handler.cpp @@ -6,7 +6,7 @@ * Created by Christian Ehrlicher, SLSE, 2016-04-14 */ #include "main_handler.h" -#include +#include namespace WarehouseManagement { diff --git a/Lts/Proxies/WirelessLocationSystem/dds_handler.cpp b/Lts/Proxies/WirelessLocationSystem/dds_handler.cpp index fc3a9f09..fba1de9e 100755 --- a/Lts/Proxies/WirelessLocationSystem/dds_handler.cpp +++ b/Lts/Proxies/WirelessLocationSystem/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace WirelessLocationSystem { diff --git a/Lts/Proxies/WirelessLocationSystem/main_handler.cpp b/Lts/Proxies/WirelessLocationSystem/main_handler.cpp index a94a0c05..c48118ff 100755 --- a/Lts/Proxies/WirelessLocationSystem/main_handler.cpp +++ b/Lts/Proxies/WirelessLocationSystem/main_handler.cpp @@ -8,7 +8,7 @@ #include "main_handler.h" #include "settings.h" -#include +#include namespace WirelessLocationSystem { diff --git a/Lts/Services/AlarmManagement/dds_handler.h b/Lts/Services/AlarmManagement/dds_handler.h index f6df12cf..c815b4b6 100755 --- a/Lts/Services/AlarmManagement/dds_handler.h +++ b/Lts/Services/AlarmManagement/dds_handler.h @@ -8,8 +8,8 @@ #pragma once #include -#include -#include +#include +#include #include #include #include diff --git a/Lts/Services/AlarmManagement/object_emergency_call.h b/Lts/Services/AlarmManagement/object_emergency_call.h index bb69543d..b7ab6192 100755 --- a/Lts/Services/AlarmManagement/object_emergency_call.h +++ b/Lts/Services/AlarmManagement/object_emergency_call.h @@ -4,7 +4,7 @@ #include #include "logger.h" -#include +#include //Generated #include diff --git a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/abstract_firing_strategy.cpp b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/abstract_firing_strategy.cpp index 8d0bbf58..ab50de78 100755 --- a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/abstract_firing_strategy.cpp +++ b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/abstract_firing_strategy.cpp @@ -40,19 +40,19 @@ AbstractFiringStrategy::~AbstractFiringStrategy() TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } -void AbstractFiringStrategy::calculateDispersionTrajectory() +bool AbstractFiringStrategy::calculateDispersionTrajectory() { DEBUG_LOG(m_logger) << "calculateDispersionTrajectory"; // 1. Neuen Zielpunkt berechnen - const auto &intendendTrajectory = m_effector->intendendTrajectory(); + const auto intendendTrajectory = m_effector->intendendTrajectory(); // sanity check: if (intendendTrajectory.size() < 2) { ERROR_LOG(m_logger) << LOGFUNCTION << " size of intendendTrajectory not sufficiant, size=" << intendendTrajectory.size(); - return; + return false; } LtsUtils::QPoint3D newTarget = intendendTrajectory.last().position; @@ -66,6 +66,16 @@ void AbstractFiringStrategy::calculateDispersionTrajectory() // 2. Neue Trajektorie berechnen m_transformedTrajectory = TrajectoryTransform::transformToNewTarget(intendendTrajectory, newTarget); + + // sanity check: + if (m_transformedTrajectory.size() < 2) + { + ERROR_LOG(m_logger) << LOGFUNCTION + << " size of m_transformedTrajectory not sufficiant, size=" << m_transformedTrajectory.size(); + return false; + } + + return true; } std::vector AbstractFiringStrategy::buildTrajectoryGeometry(const QVector &relativeTrajectory) @@ -135,7 +145,7 @@ int AbstractFiringStrategy::sendChargeEffect(const TrajectoryTimeAware &trajecto { DEBUG_LOG(m_logger) << "sendChargeEffect"; - const auto &trajGeometry = trajectoryTimeAware.geometry(); + const auto trajGeometry = trajectoryTimeAware.geometry(); // sanity check: if (trajGeometry.size() < 2) @@ -165,7 +175,7 @@ int AbstractFiringStrategy::sendChargeEffect(const TrajectoryTimeAware &trajecto chargeEffect.trajectoryTimeAware(trajectoryTimeAware); const auto &reply = m_effector->mainHandler()->chargeEffectHandler()->createChargeEffect(chargeEffect); - DEBUG_LOG(m_logger) << "reply.id=" << reply.id() << ", str:" << reply.str() << ", uniqueId:" << reply.uniqueId(); + DEBUG_LOG(m_logger) << LOGFUNCTION << " reply.id=" << reply.id() << ", str:" << reply.str() << ", uniqueId:" << reply.uniqueId(); return reply.id(); } diff --git a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/abstract_firing_strategy.h b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/abstract_firing_strategy.h index a8d25422..3b4dd439 100755 --- a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/abstract_firing_strategy.h +++ b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/abstract_firing_strategy.h @@ -44,7 +44,7 @@ public: explicit AbstractFiringStrategy(ObjectEffector *parent); virtual ~AbstractFiringStrategy(); - virtual void doFiring() = 0; + virtual bool doFiring() = 0; Q_SIGNALS: // Has to be emitted in doFiring() implementation! @@ -52,7 +52,7 @@ Q_SIGNALS: protected: // methods: - void calculateDispersionTrajectory(); + bool calculateDispersionTrajectory(); std::vector buildTrajectoryGeometry(const QVector &trajectory); TrajectoryTimeAware buildTrajectoryTimeAware(const std::vector &trajectoryGeometry, qint64 curTime, int index = 0); diff --git a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/default_firing_strategy.cpp b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/default_firing_strategy.cpp index df9488ed..39970902 100755 --- a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/default_firing_strategy.cpp +++ b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/default_firing_strategy.cpp @@ -29,19 +29,50 @@ DefaultFiringStrategy::~DefaultFiringStrategy() TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } -void DefaultFiringStrategy::doFiring() +bool DefaultFiringStrategy::doFiring() { - calculateDispersionTrajectory(); + // 1: calculateDispersionTrajectory + if (!calculateDispersionTrajectory()) + { + ERROR_LOG(m_logger) << LOGFUNCTION << " Error on calculateDispersionTrajectory"; + return false; + } + if (m_transformedTrajectory.size() < 2) + { + ERROR_LOG(m_logger) << LOGFUNCTION << " transformedTrajectory is not sufficiant" + << ", m_transformedTrajectory.size()" << m_transformedTrajectory.size(); + return false; + } + + // 2: getStartTime const qint64 trajectoryStartTime = getStartTime(); - const auto &geometry = buildTrajectoryGeometry(m_transformedTrajectory); - const auto &trajTimeAware = buildTrajectoryTimeAware(geometry, trajectoryStartTime); + // 3a buildTrajectoryGeometry + const auto geometry = buildTrajectoryGeometry(m_transformedTrajectory); + // 3b: buildTrajectoryTimeAware + const auto trajTimeAware = buildTrajectoryTimeAware(geometry, trajectoryStartTime); + // to be bullet-proof: + if (trajTimeAware.geometry().size() < 2) + { + ERROR_LOG(m_logger) << LOGFUNCTION << " trajTimeAware is empty"; + return false; + } + + // 4: sendChargeEffect const int chargeEffectId = sendChargeEffect(trajTimeAware); + if (chargeEffectId < 0) + { + ERROR_LOG(m_logger) << LOGFUNCTION << " sendChargeEffect failed"; + return false; + } + // 5: signalFired emit signalFired(m_effector->participantId(), m_effector->aesItemId(), {chargeEffectId}); + DEBUG_LOG(m_logger) << "created ChargeEffectId: " << chargeEffectId; + return true; } } //namespace AreaEffectSimulation diff --git a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/default_firing_strategy.h b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/default_firing_strategy.h index 11c26e96..b0c12d66 100755 --- a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/default_firing_strategy.h +++ b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/default_firing_strategy.h @@ -22,7 +22,7 @@ public: explicit DefaultFiringStrategy(ObjectEffector *effector); virtual ~DefaultFiringStrategy(); - void doFiring() override; + bool doFiring() override; }; // class DefaultFiringStrategy } // namespace AreaEffectSimulation diff --git a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/dm72_firing_strategy.cpp b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/dm72_firing_strategy.cpp index f6d544a0..0ed801a7 100755 --- a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/dm72_firing_strategy.cpp +++ b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/dm72_firing_strategy.cpp @@ -32,35 +32,57 @@ Dm72FiringStrategy::Dm72FiringStrategy(ObjectEffector *effector) DEBUG_LOG(m_logger) << "using Dm72FiringStrategy"; } -void Dm72FiringStrategy::doFiring() +bool Dm72FiringStrategy::doFiring() { m_transformedTrajectory = TrajectoryTransform::transformToNewTarget(m_effector->intendendTrajectory(), m_impactPoints.at(m_impactPointIndex++)); + if (m_transformedTrajectory.size() < 2) + { + ERROR_LOG(m_logger) << LOGFUNCTION << " transformedTrajectory is not sufficiant" + << ", m_transformedTrajectory.size()" << m_transformedTrajectory.size(); + return false; + } + if (m_impactPointIndex >= m_impactPoints.size()) m_impactPointIndex = 0; const qint64 trajectoryStartTime = getStartTime(); - const auto &geometry = buildTrajectoryGeometry(m_transformedTrajectory); - const auto &trajTimeAware = buildTrajectoryTimeAware(geometry, trajectoryStartTime); + const auto geometry = buildTrajectoryGeometry(m_transformedTrajectory); + const auto trajTimeAware = buildTrajectoryTimeAware(geometry, trajectoryStartTime); QJsonObject props{{QStringLiteral("effectDurationMsec"), m_effectDurationMsec}}; const int chargeEffectId = sendChargeEffect(trajTimeAware, props); + if (chargeEffectId < 0) + { + ERROR_LOG(m_logger) << LOGFUNCTION << " sendChargeEffect failed"; + return false; + } emit signalFired(m_effector->participantId(), m_effector->aesItemId(), {chargeEffectId}); + + return true; } void Dm72FiringStrategy::init() { + DEBUG_LOG(m_logger) << LOGFUNCTION << " START" + << ", m_effector->participantId=" << m_effector->participantId() + << ", m_effector->aesItemId=" << m_effector->aesItemId(); + using namespace AdlerJson; using namespace LtsCoordTrans; m_impactPointIndex = 0; m_impactPoints.clear(); - bool bOk; + bool bOk = false; WirkmittelFeuerkommandoRakete wirkmittel; - const QJsonObject properties = QJsonDocument::fromJson(QByteArray::fromStdString(m_effector->effectorData().properties())).object(); + + const std::string propertiesStdStr = m_effector->effectorData().properties(); + DEBUG_LOG(m_logger) << LOGFUNCTION << " START" << ", propertiesStdStr= '" << propertiesStdStr << "'"; + + const QJsonObject properties = QJsonDocument::fromJson(QByteArray::fromStdString(propertiesStdStr)).object(); const Core::GeoPosition geoStartPos = participantPosition(m_effector->participantId()); const UtmCoordinate utmStartPos = UtmCoordinate::fromGeographic(geoStartPos.lon(), geoStartPos.lat()); @@ -99,6 +121,8 @@ void Dm72FiringStrategy::init() } DEBUG_LOG(m_logger) << "Got " << m_impactPoints.size() << " impact points"; + + TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } QVector Dm72FiringStrategy::mineLayingCentroids() const diff --git a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/dm72_firing_strategy.h b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/dm72_firing_strategy.h index adf8a374..1ab91f78 100755 --- a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/dm72_firing_strategy.h +++ b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/dm72_firing_strategy.h @@ -24,7 +24,7 @@ class Dm72FiringStrategy : public AbstractFiringStrategy public: explicit Dm72FiringStrategy(ObjectEffector *effector); - void doFiring() override final; + bool doFiring() final; private: // methods void init(); diff --git a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/gmlrs_firing_strategy.cpp b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/gmlrs_firing_strategy.cpp index 1b4ddc6b..05a6dd0a 100755 --- a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/gmlrs_firing_strategy.cpp +++ b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/gmlrs_firing_strategy.cpp @@ -36,7 +36,7 @@ GmlrsFiringStrategy::~GmlrsFiringStrategy() TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } -void GmlrsFiringStrategy::doFiring() +bool GmlrsFiringStrategy::doFiring() { m_transformedTrajectory = TrajectoryTransform::transformToNewTarget(m_effector->intendendTrajectory(), m_impactPoints.at(m_impactPointIndex++)); @@ -45,12 +45,18 @@ void GmlrsFiringStrategy::doFiring() const qint64 trajectoryStartTime = getStartTime(); - const auto &geometry = buildTrajectoryGeometry(m_transformedTrajectory); - const auto &trajTimeAware = buildTrajectoryTimeAware(geometry, trajectoryStartTime); + const auto geometry = buildTrajectoryGeometry(m_transformedTrajectory); + const auto trajTimeAware = buildTrajectoryTimeAware(geometry, trajectoryStartTime); const int chargeEffectId = sendChargeEffect(trajTimeAware); + if (chargeEffectId < 0) + { + ERROR_LOG(m_logger) << LOGFUNCTION << " sendChargeEffect failed"; + return false; + } emit signalFired(m_effector->participantId(), m_effector->aesItemId(), {chargeEffectId}); + return true; } void GmlrsFiringStrategy::init() diff --git a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/gmlrs_firing_strategy.h b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/gmlrs_firing_strategy.h index b162edc1..ed205835 100755 --- a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/gmlrs_firing_strategy.h +++ b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/gmlrs_firing_strategy.h @@ -28,7 +28,7 @@ public: explicit GmlrsFiringStrategy(ObjectEffector *effector); virtual ~GmlrsFiringStrategy(); - void doFiring() override; + bool doFiring() override; private: // methods void init(); diff --git a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/smart_firing_strategy.cpp b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/smart_firing_strategy.cpp index 9cdee395..31b32547 100755 --- a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/smart_firing_strategy.cpp +++ b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/smart_firing_strategy.cpp @@ -35,7 +35,7 @@ SmartFiringStrategy::~SmartFiringStrategy() TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } -void SmartFiringStrategy::doFiring() +bool SmartFiringStrategy::doFiring() { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; @@ -59,13 +59,19 @@ void SmartFiringStrategy::doFiring() // convert from intendendTrajectory (relativ) to TRAJECTORY_TYPE (absolute) // The TrajectorySplitter needs TRAJECTORY_TYPE // using TRAJECTORY_TYPE = std::vector; - const auto &intendendTrajectory = m_effector->intendendTrajectory(); - const auto &trajGeometry = buildTrajectoryGeometry(intendendTrajectory); + const auto intendendTrajectory = m_effector->intendendTrajectory(); + const auto trajGeometry = buildTrajectoryGeometry(intendendTrajectory); + if (trajGeometry.size() < 2) + { + ERROR_LOG(m_logger) << LOGFUNCTION << " transformedTrajectory is not sufficiant" + << ", size=" << trajGeometry.size(); + return false; + } // split and avoid copying: const TrajectorySplitter> splitter(trajGeometry); - const auto &trajGeo1 = splitter.getTrajectory1(); - const auto &trajGeo2 = splitter.getTrajectory2(); + const auto trajGeo1 = splitter.getTrajectory1(); + const auto trajGeo2 = splitter.getTrajectory2(); DEBUG_LOG(m_logger) << "splitter: " << " intendendTrajectory.size = " << intendendTrajectory.size(); DEBUG_LOG(m_logger) << "splitter: " << " trajGeometry.size = " << trajGeometry.size(); @@ -76,27 +82,32 @@ void SmartFiringStrategy::doFiring() // // and second, process both Trajectories/Impacts // - - // ToDo: Check, how oftem signalFired should be fired? QVector chargeEffectIds; if (trajGeo1.size() > 2) { - const auto &trajTimeAware = buildTrajectoryTimeAware(trajGeo1, trajectoryStartTime, 0); + const auto trajTimeAware = buildTrajectoryTimeAware(trajGeo1, trajectoryStartTime, 0); const int chargeEffectId = sendChargeEffect(trajTimeAware); - chargeEffectIds << chargeEffectId; + if (chargeEffectId < 0) + WARNING_LOG(m_logger) << LOGFUNCTION << " sendChargeEffect failed"; + else + chargeEffectIds << chargeEffectId; DEBUG_LOG(m_logger) << "Trajectory1 - created ChargeEffectId: " << chargeEffectId; } if (trajGeo2.size() > 2) { - const auto &trajTimeAware = buildTrajectoryTimeAware(trajGeo2, trajectoryStartTime, 1); + const auto trajTimeAware = buildTrajectoryTimeAware(trajGeo2, trajectoryStartTime, 1); const int chargeEffectId = sendChargeEffect(trajTimeAware); - chargeEffectIds << chargeEffectId; + if (chargeEffectId < 0) + WARNING_LOG(m_logger) << LOGFUNCTION << " sendChargeEffect failed"; + else + chargeEffectIds << chargeEffectId; DEBUG_LOG(m_logger) << "Trajectory2 - created ChargeEffectId: " << chargeEffectId; } - if (chargeEffectIds.size()) + if (!chargeEffectIds.empty()) emit signalFired(m_effector->participantId(), m_effector->aesItemId(), chargeEffectIds); TRACE_LOG(m_logger) << LOGFUNCTION << " END"; + return true; } } // namespace AreaEffectSimulation diff --git a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/smart_firing_strategy.h b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/smart_firing_strategy.h index 0522e844..9c48013b 100755 --- a/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/smart_firing_strategy.h +++ b/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/smart_firing_strategy.h @@ -27,7 +27,7 @@ public: explicit SmartFiringStrategy(ObjectEffector *effector); virtual ~SmartFiringStrategy(); - void doFiring() override; + bool doFiring() override; private: // methods diff --git a/Lts/Services/AreaEffectSimulation/ModuleTest_Limits/limits_module_test.cpp b/Lts/Services/AreaEffectSimulation/ModuleTest_Limits/limits_module_test.cpp index 79f3d510..f6e95751 100755 --- a/Lts/Services/AreaEffectSimulation/ModuleTest_Limits/limits_module_test.cpp +++ b/Lts/Services/AreaEffectSimulation/ModuleTest_Limits/limits_module_test.cpp @@ -13,7 +13,7 @@ // AES #include -#include +#include #include diff --git a/Lts/Services/AreaEffectSimulation/dds_handler.cpp b/Lts/Services/AreaEffectSimulation/dds_handler.cpp index 6dcf0586..c1dd6103 100755 --- a/Lts/Services/AreaEffectSimulation/dds_handler.cpp +++ b/Lts/Services/AreaEffectSimulation/dds_handler.cpp @@ -9,8 +9,8 @@ #include "aes_dts.h" #include "aes_fts.h" -#include -#include +#include +#include #include #include #include diff --git a/Lts/Services/AreaEffectSimulation/dds_handler.h b/Lts/Services/AreaEffectSimulation/dds_handler.h index ceba25ce..22d4a536 100755 --- a/Lts/Services/AreaEffectSimulation/dds_handler.h +++ b/Lts/Services/AreaEffectSimulation/dds_handler.h @@ -9,8 +9,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include diff --git a/Lts/Services/AreaEffectSimulation/handler_charge_administration.cpp b/Lts/Services/AreaEffectSimulation/handler_charge_administration.cpp index 8a2a47f9..a5793188 100755 --- a/Lts/Services/AreaEffectSimulation/handler_charge_administration.cpp +++ b/Lts/Services/AreaEffectSimulation/handler_charge_administration.cpp @@ -133,9 +133,11 @@ Core::FunctionReplyObject HandlerChargeAdministration::consumeCharge(int chargeT ParticipantManagement::ConnectState connectState = m_mainHandler->dds()->ppmDtc()->saaConnectedState(partyId); DEBUG_LOG(m_logger) << "connectState: " << connectState; - if (m_mainHandler->dds()->ppmDtc()->isPartyAdlerVerbund(partyId) && connectState == ParticipantManagement::ConnectState::Connected) + if (m_mainHandler->dds()->ppmDtc()->isPartyAdlerVerbund(partyId) && connectState == ParticipantManagement::ConnectState::Connected + && m_mainHandler->dds()->pdmDtc()->isAdlerChargeType(chargeTypeId)) effectSource = ProjectDataManagement::EffectSource::ES_ADLER; - else if (!m_mainHandler->dds()->ppmDtc()->isPartyAdlerVerbund(partyId) && connectState == ParticipantManagement::ConnectState::Connected) + else if (!m_mainHandler->dds()->ppmDtc()->isPartyAdlerVerbund(partyId) && connectState == ParticipantManagement::ConnectState::Connected + && m_mainHandler->dds()->pdmDtc()->isAdlerChargeType(chargeTypeId)) effectSource = ProjectDataManagement::EffectSource::ES_ADLER_STANDALONE; DEBUG_LOG(m_logger) << "effectSource: " << effectSource; diff --git a/Lts/Services/AreaEffectSimulation/main_handler.cpp b/Lts/Services/AreaEffectSimulation/main_handler.cpp index 626239dc..267f22e7 100755 --- a/Lts/Services/AreaEffectSimulation/main_handler.cpp +++ b/Lts/Services/AreaEffectSimulation/main_handler.cpp @@ -37,7 +37,7 @@ #include #include -#include +#include #include #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) diff --git a/Lts/Services/AreaEffectSimulation/mine_corridor_creator.h b/Lts/Services/AreaEffectSimulation/mine_corridor_creator.h index 5ae76de8..d5f1dc5b 100755 --- a/Lts/Services/AreaEffectSimulation/mine_corridor_creator.h +++ b/Lts/Services/AreaEffectSimulation/mine_corridor_creator.h @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include "logger.h" diff --git a/Lts/Services/AreaEffectSimulation/object_base.h b/Lts/Services/AreaEffectSimulation/object_base.h index 49e4a95c..2b3ad543 100755 --- a/Lts/Services/AreaEffectSimulation/object_base.h +++ b/Lts/Services/AreaEffectSimulation/object_base.h @@ -16,7 +16,7 @@ #include "special_area_provider.h" #include "logger.h" -#include +#include #include #include diff --git a/Lts/Services/AreaEffectSimulation/object_borderline.h b/Lts/Services/AreaEffectSimulation/object_borderline.h index 528bbb55..8a7019cc 100755 --- a/Lts/Services/AreaEffectSimulation/object_borderline.h +++ b/Lts/Services/AreaEffectSimulation/object_borderline.h @@ -10,7 +10,7 @@ #include #include "object_base.h" -#include +#include #include diff --git a/Lts/Services/AreaEffectSimulation/object_charge_effect.h b/Lts/Services/AreaEffectSimulation/object_charge_effect.h index ef8bc1e8..c1defb55 100755 --- a/Lts/Services/AreaEffectSimulation/object_charge_effect.h +++ b/Lts/Services/AreaEffectSimulation/object_charge_effect.h @@ -11,7 +11,7 @@ #include "logger.h" -#include +#include #include #include #include diff --git a/Lts/Services/AreaEffectSimulation/object_effector.cpp b/Lts/Services/AreaEffectSimulation/object_effector.cpp index 13132470..efcdbf0e 100755 --- a/Lts/Services/AreaEffectSimulation/object_effector.cpp +++ b/Lts/Services/AreaEffectSimulation/object_effector.cpp @@ -183,11 +183,17 @@ void ObjectEffector::onEffectorFired() if (m_firingStrategy == nullptr) { ERROR_LOG(m_logger) << "Not possible to fire. No firing strategy specified."; - return; } - m_firingStrategy->doFiring(); + const bool bDoFiringSuccess = m_firingStrategy->doFiring(); + if (!bDoFiringSuccess) + { + ERROR_LOG(m_logger) << "doFiring failed" + << ", participantId=" << m_participantId + << ", aesItemId=" << m_aesItemId + << ", intendendTrajectory().size()=" << this->intendendTrajectory().size(); + } } // Anhand der EX-L39 Streuungsdaten wird eine Trajektorie für diesen @@ -209,7 +215,8 @@ void ObjectEffector::setIndendedTrajectory(const std::vector #include "object_base.h" -#include +#include #include diff --git a/Lts/Services/AssetManagement/dds_handler.cpp b/Lts/Services/AssetManagement/dds_handler.cpp index 577d7ca4..53361494 100755 --- a/Lts/Services/AssetManagement/dds_handler.cpp +++ b/Lts/Services/AssetManagement/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace AssetManagement { diff --git a/Lts/Services/AssetManagement/dds_handler.h b/Lts/Services/AssetManagement/dds_handler.h index 84feccdc..74c56177 100755 --- a/Lts/Services/AssetManagement/dds_handler.h +++ b/Lts/Services/AssetManagement/dds_handler.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Lts/Services/AssetManagement/main_handler.cpp b/Lts/Services/AssetManagement/main_handler.cpp index 4d88ad69..100983a5 100755 --- a/Lts/Services/AssetManagement/main_handler.cpp +++ b/Lts/Services/AssetManagement/main_handler.cpp @@ -15,7 +15,7 @@ #include "settings.h" #include -#include +#include #include namespace AssetManagement diff --git a/Lts/Services/AssetManagement/object_asset.h b/Lts/Services/AssetManagement/object_asset.h index c834ba0b..1a97a53b 100755 --- a/Lts/Services/AssetManagement/object_asset.h +++ b/Lts/Services/AssetManagement/object_asset.h @@ -10,7 +10,7 @@ #include "dds_handler.h" #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Services/AssetManagement/object_map_description.h b/Lts/Services/AssetManagement/object_map_description.h index bc41ed9c..3f45ebc2 100755 --- a/Lts/Services/AssetManagement/object_map_description.h +++ b/Lts/Services/AssetManagement/object_map_description.h @@ -8,7 +8,7 @@ #pragma once #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Services/AssetManagement/object_relay_info.h b/Lts/Services/AssetManagement/object_relay_info.h index b9609e7e..ae48cba1 100755 --- a/Lts/Services/AssetManagement/object_relay_info.h +++ b/Lts/Services/AssetManagement/object_relay_info.h @@ -10,7 +10,7 @@ #include "dds_handler.h" #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Services/AssetManagement/object_training_area.h b/Lts/Services/AssetManagement/object_training_area.h index c25619b6..e2503bc9 100755 --- a/Lts/Services/AssetManagement/object_training_area.h +++ b/Lts/Services/AssetManagement/object_training_area.h @@ -10,7 +10,7 @@ #include #include "dds_handler.h" #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Services/AudioVideoManagement/dds_handler.cpp b/Lts/Services/AudioVideoManagement/dds_handler.cpp index d1219645..c297a26e 100755 --- a/Lts/Services/AudioVideoManagement/dds_handler.cpp +++ b/Lts/Services/AudioVideoManagement/dds_handler.cpp @@ -18,7 +18,7 @@ #include #include -#include +#include namespace AudioVideoManagement diff --git a/Lts/Services/AudioVideoManagement/dds_handler.h b/Lts/Services/AudioVideoManagement/dds_handler.h index c2526d5b..9c58179c 100755 --- a/Lts/Services/AudioVideoManagement/dds_handler.h +++ b/Lts/Services/AudioVideoManagement/dds_handler.h @@ -9,11 +9,11 @@ #include "logger.h" #include -#include +#include #include #include -#include +#include #include #include diff --git a/Lts/Services/AudioVideoManagement/main_handler.cpp b/Lts/Services/AudioVideoManagement/main_handler.cpp index fcea092f..ff4d9dec 100755 --- a/Lts/Services/AudioVideoManagement/main_handler.cpp +++ b/Lts/Services/AudioVideoManagement/main_handler.cpp @@ -32,7 +32,7 @@ #include #include -#include +#include using namespace AudioVideoManagement; diff --git a/Lts/Services/AudioVideoManagement/object_menu_struct.cpp b/Lts/Services/AudioVideoManagement/object_menu_struct.cpp index 8917db8b..71b15111 100755 --- a/Lts/Services/AudioVideoManagement/object_menu_struct.cpp +++ b/Lts/Services/AudioVideoManagement/object_menu_struct.cpp @@ -13,7 +13,7 @@ #include "logger.h" #include #include -#include +#include #include #include #include diff --git a/Lts/Services/CentralEffectSimulation/Plugins/Explosions/handler_explosions.cpp b/Lts/Services/CentralEffectSimulation/Plugins/Explosions/handler_explosions.cpp index 876a2b7f..83650bde 100755 --- a/Lts/Services/CentralEffectSimulation/Plugins/Explosions/handler_explosions.cpp +++ b/Lts/Services/CentralEffectSimulation/Plugins/Explosions/handler_explosions.cpp @@ -115,7 +115,7 @@ void HandlerExplosions::onAesItemViewChanged(const AreaEffectSimulation::AesItem // if (m_ddsHandler->dtcPdm()->gearClassFromChargeTypeId(data.chargeTypeId()) == ProjectDataManagement::GearClass_def::AirSupport) // return; - static const QVector validAesTypes = {AesType_def::AtExplosionAreaSingleExplosions, AesType_def::AtExplosionSingle, AesType_def::AtExplosionCluster}; + static const QVector validAesTypes = {AesType_def::AtEffectCluster, AesType_def::AtExplosionAreaSingleExplosions, AesType_def::AtExplosionSingle, AesType_def::AtExplosionCluster}; if (!validAesTypes.contains(data.aesTypeId())) return; @@ -159,6 +159,12 @@ void HandlerExplosions::onAesItemViewChanged(const AreaEffectSimulation::AesItem DEBUG_LOG(m_logger) << "explosionCluster"; break; } + case AreaEffectSimulation::AesType::AtEffectCluster: + { + isCentral = true; + DEBUG_LOG(m_logger) << "effectCluster"; + break; + } default: DEBUG_LOG(m_logger) << "default, data.aesTypeId=" << aesTypeId; } // switch @@ -268,7 +274,7 @@ void HandlerExplosions::onAesItemViewChanged(const AreaEffectSimulation::AesItem // a) Aiv changes to EsActivated or // b) Effects ? // So be prepared and calculate hazardDistanceForm already at EsPrepared - if (aesTypeId == AreaEffectSimulation::AesType_def::AtExplosionCluster) + if (aesTypeId == AreaEffectSimulation::AesType_def::AtExplosionCluster || aesTypeId == AreaEffectSimulation::AesType_def::AtEffectCluster) { // useHazardDistance = (aesTypeId == AreaEffectSimulation::AesType_def::AtExplosionCluster); @@ -384,7 +390,10 @@ void HandlerExplosions::calculateImpact(const AreaEffectSimulation::ChargeEffect requestTab.equipmentNumber(equipNo); requestTab.participantId(pPos.participantId()); requestTab.chargeTypeId(data.chargeTypeId()); + //default requestTab.aesId(0); + requestTab.eventType(ProjectDataManagement::EventType_def::FireEvent); + // if (data.originatorTypeId() == ProjectDataManagement::StateChangeOriginator::Participant) { // if we get the equipmentNumber from the participant we will send this (needed by tab) @@ -402,10 +411,14 @@ void HandlerExplosions::calculateImpact(const AreaEffectSimulation::ChargeEffect { requestTab.originatorEquipmentNumber(data.originatorId()); } + else if (data.originatorTypeId() == ProjectDataManagement::StateChangeOriginator::AreaEffectSimulation) + { + requestTab.aesId(data.originatorId()); + requestTab.eventType(ProjectDataManagement::EventType_def::ExplosionCluster); + } requestTab.remainEffectPercent(remainEffectPercent); requestTab.position(tabPosition); requestTab.effectTime(data.effectStart() / 1000); - requestTab.eventType(ProjectDataManagement::EventType_def::FireEvent); ParticipantManagement::Participant originator = m_ddsHandler->dtcPpm()->participant(data.originatorId()); requestTab.partyId(originator.partyId()); requestTab.mineId(0); diff --git a/Lts/Services/CentralEffectSimulation/Plugins/TargetAreas/dds_handler.cpp b/Lts/Services/CentralEffectSimulation/Plugins/TargetAreas/dds_handler.cpp index d15ad395..5f5591f3 100755 --- a/Lts/Services/CentralEffectSimulation/Plugins/TargetAreas/dds_handler.cpp +++ b/Lts/Services/CentralEffectSimulation/Plugins/TargetAreas/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace TargetAreas { diff --git a/Lts/Services/CentralEffectSimulation/Plugins/TargetAreas/dds_handler.h b/Lts/Services/CentralEffectSimulation/Plugins/TargetAreas/dds_handler.h index 60aa0e62..1e2d5c44 100755 --- a/Lts/Services/CentralEffectSimulation/Plugins/TargetAreas/dds_handler.h +++ b/Lts/Services/CentralEffectSimulation/Plugins/TargetAreas/dds_handler.h @@ -9,8 +9,8 @@ #include #include -#include -#include +#include +#include #include #include #include diff --git a/Lts/Services/CentralEffectSimulation/dds_handler.cpp b/Lts/Services/CentralEffectSimulation/dds_handler.cpp index 90f23adc..034d2335 100755 --- a/Lts/Services/CentralEffectSimulation/dds_handler.cpp +++ b/Lts/Services/CentralEffectSimulation/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace CentralEffectSimulation { diff --git a/Lts/Services/CentralEffectSimulation/dds_handler.h b/Lts/Services/CentralEffectSimulation/dds_handler.h index ba82e608..c48faff8 100755 --- a/Lts/Services/CentralEffectSimulation/dds_handler.h +++ b/Lts/Services/CentralEffectSimulation/dds_handler.h @@ -9,8 +9,8 @@ #include #include -#include -#include +#include +#include #include #include #include diff --git a/Lts/Services/CentralEffectSimulation/handler_participant.cpp b/Lts/Services/CentralEffectSimulation/handler_participant.cpp index 11ddadb9..218b5010 100755 --- a/Lts/Services/CentralEffectSimulation/handler_participant.cpp +++ b/Lts/Services/CentralEffectSimulation/handler_participant.cpp @@ -118,11 +118,16 @@ void HandlerParticipant::onParticipantPositionChanged(const ParticipantManagemen } else { + ParticipantManagement::TypeClass typeClass = typeClassFromTypeId(data.participantTypeId()); + if (typeClass == ParticipantManagement::TypeClass_def::SupportEntity + || typeClass == ParticipantManagement::TypeClass_def::SupportUnit + || typeClass == ParticipantManagement::TypeClass_def::Unit + || typeClass == ParticipantManagement::TypeClass_def::Unknown) + return; + // [GUEZE-3102] Aufgesessene Teilnehmer bekommen den Schaden vom Fahrzeug, auf dem sie aufgesessen sind. - if ( data.mountedOn().is_set()) - { + if (data.mountedOn().is_set()) return; - } int floorId = m_handlerBuildingData->getFloorIdFromRoomId(data.roomId()); int lastFloorId; CesParticipantData partPos(data); diff --git a/Lts/Services/CentralEffectSimulation/main_handler.cpp b/Lts/Services/CentralEffectSimulation/main_handler.cpp index 4d2776cd..78c1805d 100755 --- a/Lts/Services/CentralEffectSimulation/main_handler.cpp +++ b/Lts/Services/CentralEffectSimulation/main_handler.cpp @@ -9,7 +9,7 @@ #include "main_handler.h" #include "settings.h" -#include +#include #include #include diff --git a/Lts/Services/CentralEffectSimulation/point_helpers.h b/Lts/Services/CentralEffectSimulation/point_helpers.h index fae12950..0aa7d4c5 100755 --- a/Lts/Services/CentralEffectSimulation/point_helpers.h +++ b/Lts/Services/CentralEffectSimulation/point_helpers.h @@ -11,7 +11,7 @@ #include #include #include -#include +#include namespace CentralEffectSimulation { diff --git a/Lts/Services/CodificationManagement/dds_handler.h b/Lts/Services/CodificationManagement/dds_handler.h index b15c7a6b..28d29aee 100755 --- a/Lts/Services/CodificationManagement/dds_handler.h +++ b/Lts/Services/CodificationManagement/dds_handler.h @@ -9,7 +9,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Lts/Services/CodificationManagement/initialization.cpp b/Lts/Services/CodificationManagement/initialization.cpp index bec7e806..879c753d 100755 --- a/Lts/Services/CodificationManagement/initialization.cpp +++ b/Lts/Services/CodificationManagement/initialization.cpp @@ -12,7 +12,7 @@ #include #include -#include +#include using namespace CodificationManagement; diff --git a/Lts/Services/EffectShowClient/dds_handler.cpp b/Lts/Services/EffectShowClient/dds_handler.cpp index 5f9b0be0..1b869108 100755 --- a/Lts/Services/EffectShowClient/dds_handler.cpp +++ b/Lts/Services/EffectShowClient/dds_handler.cpp @@ -7,7 +7,7 @@ */ #include "dds_handler.h" -#include +#include namespace EffectShowClient { diff --git a/Lts/Services/EffectShowClient/dds_handler.h b/Lts/Services/EffectShowClient/dds_handler.h index 0777d576..b3f0b6b8 100755 --- a/Lts/Services/EffectShowClient/dds_handler.h +++ b/Lts/Services/EffectShowClient/dds_handler.h @@ -9,7 +9,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Lts/Services/EffectShowClient/main_handler.cpp b/Lts/Services/EffectShowClient/main_handler.cpp index 2c1b29f6..ba11402c 100755 --- a/Lts/Services/EffectShowClient/main_handler.cpp +++ b/Lts/Services/EffectShowClient/main_handler.cpp @@ -14,7 +14,7 @@ #include "handler_vehicle.h" #include "control_unit_handler.h" #include "settings.h" -#include +#include namespace EffectShowClient { diff --git a/Lts/Services/EffectShowClient/object_order.h b/Lts/Services/EffectShowClient/object_order.h index 854c1206..5c568434 100755 --- a/Lts/Services/EffectShowClient/object_order.h +++ b/Lts/Services/EffectShowClient/object_order.h @@ -11,7 +11,7 @@ #include #include -#include +#include // Generated #include diff --git a/Lts/Services/EffectShowManagement/dds_handler.h b/Lts/Services/EffectShowManagement/dds_handler.h index d5ae4927..6200abbf 100755 --- a/Lts/Services/EffectShowManagement/dds_handler.h +++ b/Lts/Services/EffectShowManagement/dds_handler.h @@ -9,9 +9,9 @@ #pragma once #include -#include -#include -#include +#include +#include +#include #include #include diff --git a/Lts/Services/EffectShowManagement/object_aes_data.h b/Lts/Services/EffectShowManagement/object_aes_data.h index 2735f186..7304666c 100755 --- a/Lts/Services/EffectShowManagement/object_aes_data.h +++ b/Lts/Services/EffectShowManagement/object_aes_data.h @@ -10,7 +10,7 @@ #include "dds_handler.h" #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Services/EffectShowManagement/object_effect_show.h b/Lts/Services/EffectShowManagement/object_effect_show.h index 483c9d50..254c0f7d 100755 --- a/Lts/Services/EffectShowManagement/object_effect_show.h +++ b/Lts/Services/EffectShowManagement/object_effect_show.h @@ -12,7 +12,7 @@ #include "esm_convert_from_tab.h" #include "logger.h" -#include +#include #include #include diff --git a/Lts/Services/EffectShowManagement/object_effect_show_actor_relocation.h b/Lts/Services/EffectShowManagement/object_effect_show_actor_relocation.h index 996b7bff..692177f8 100755 --- a/Lts/Services/EffectShowManagement/object_effect_show_actor_relocation.h +++ b/Lts/Services/EffectShowManagement/object_effect_show_actor_relocation.h @@ -10,7 +10,7 @@ #include "esm_convert_to_tab.h" #include "logger.h" -#include +#include #include #include diff --git a/Lts/Services/EffectShowManagement/object_effect_show_vehicle_status.h b/Lts/Services/EffectShowManagement/object_effect_show_vehicle_status.h index 7c15b69d..9887827e 100755 --- a/Lts/Services/EffectShowManagement/object_effect_show_vehicle_status.h +++ b/Lts/Services/EffectShowManagement/object_effect_show_vehicle_status.h @@ -11,7 +11,7 @@ #include "handler_ppm_data.h" #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Services/Evaluations/dds_handler.cpp b/Lts/Services/Evaluations/dds_handler.cpp index 05e3fdae..5e395b78 100755 --- a/Lts/Services/Evaluations/dds_handler.cpp +++ b/Lts/Services/Evaluations/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace Evaluations { diff --git a/Lts/Services/Evaluations/initialization.cpp b/Lts/Services/Evaluations/initialization.cpp index 05fa0b07..41dd0ca6 100755 --- a/Lts/Services/Evaluations/initialization.cpp +++ b/Lts/Services/Evaluations/initialization.cpp @@ -13,7 +13,7 @@ #include #include -#include +#include namespace Evaluations { diff --git a/Lts/Services/Evaluations/object_comment.h b/Lts/Services/Evaluations/object_comment.h index 739ff504..8b6d5360 100755 --- a/Lts/Services/Evaluations/object_comment.h +++ b/Lts/Services/Evaluations/object_comment.h @@ -9,7 +9,7 @@ #include "dds_handler.h" #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Services/Evaluations/object_criterium.h b/Lts/Services/Evaluations/object_criterium.h index 744308a7..3566e4f9 100755 --- a/Lts/Services/Evaluations/object_criterium.h +++ b/Lts/Services/Evaluations/object_criterium.h @@ -9,7 +9,7 @@ #include "dds_handler.h" #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Services/Evaluations/object_evaluation_element.h b/Lts/Services/Evaluations/object_evaluation_element.h index 4e5c1a03..ddc2060d 100755 --- a/Lts/Services/Evaluations/object_evaluation_element.h +++ b/Lts/Services/Evaluations/object_evaluation_element.h @@ -9,7 +9,7 @@ #include "dds_handler.h" #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Services/Evaluations/object_san_category_line.h b/Lts/Services/Evaluations/object_san_category_line.h index 14dd4b62..fa79a944 100755 --- a/Lts/Services/Evaluations/object_san_category_line.h +++ b/Lts/Services/Evaluations/object_san_category_line.h @@ -9,7 +9,7 @@ #include "dds_handler.h" #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Services/Evaluations/object_san_nine_liner.h b/Lts/Services/Evaluations/object_san_nine_liner.h index 925bfa9c..31c4c8af 100755 --- a/Lts/Services/Evaluations/object_san_nine_liner.h +++ b/Lts/Services/Evaluations/object_san_nine_liner.h @@ -9,7 +9,7 @@ #include "dds_handler.h" #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Services/ExerciseEventManagement/dds_handler.h b/Lts/Services/ExerciseEventManagement/dds_handler.h index 061704e6..f6165336 100755 --- a/Lts/Services/ExerciseEventManagement/dds_handler.h +++ b/Lts/Services/ExerciseEventManagement/dds_handler.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include #include "logger.h" diff --git a/Lts/Services/ExerciseEventManagement/main_handler.cpp b/Lts/Services/ExerciseEventManagement/main_handler.cpp index 18d21ab3..5d24395e 100755 --- a/Lts/Services/ExerciseEventManagement/main_handler.cpp +++ b/Lts/Services/ExerciseEventManagement/main_handler.cpp @@ -14,7 +14,7 @@ #include "web_socket_avs.h" #include "web_socket_server.h" -#include +#include #include #include #include diff --git a/Lts/Services/ExerciseManagement/dds_handler.cpp b/Lts/Services/ExerciseManagement/dds_handler.cpp index 2abc9a93..84be6d90 100755 --- a/Lts/Services/ExerciseManagement/dds_handler.cpp +++ b/Lts/Services/ExerciseManagement/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace ExerciseManagement { diff --git a/Lts/Services/ExerciseManagement/dds_handler.h b/Lts/Services/ExerciseManagement/dds_handler.h index 85c9115b..3f99cf01 100755 --- a/Lts/Services/ExerciseManagement/dds_handler.h +++ b/Lts/Services/ExerciseManagement/dds_handler.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include #include diff --git a/Lts/Services/ExerciseManagement/main_handler.cpp b/Lts/Services/ExerciseManagement/main_handler.cpp index 18d58da8..affebfcf 100755 --- a/Lts/Services/ExerciseManagement/main_handler.cpp +++ b/Lts/Services/ExerciseManagement/main_handler.cpp @@ -13,7 +13,7 @@ #include "settings.h" #include -#include +#include #include namespace ExerciseManagement diff --git a/Lts/Services/ExerciseManagement/object_exercise.h b/Lts/Services/ExerciseManagement/object_exercise.h index 7e7d1795..14dcb2b4 100755 --- a/Lts/Services/ExerciseManagement/object_exercise.h +++ b/Lts/Services/ExerciseManagement/object_exercise.h @@ -8,7 +8,7 @@ #include #include "dds_handler.h" -#include +#include // Generated #include diff --git a/Lts/Services/ExerciseManagement/object_exercise_phase.h b/Lts/Services/ExerciseManagement/object_exercise_phase.h index e57410b1..6525bc33 100755 --- a/Lts/Services/ExerciseManagement/object_exercise_phase.h +++ b/Lts/Services/ExerciseManagement/object_exercise_phase.h @@ -8,7 +8,7 @@ */ #pragma once -#include +#include // Generated #include diff --git a/Lts/Services/FileManagement/dds_handler.cpp b/Lts/Services/FileManagement/dds_handler.cpp index ae20ffcb..3e867269 100755 --- a/Lts/Services/FileManagement/dds_handler.cpp +++ b/Lts/Services/FileManagement/dds_handler.cpp @@ -9,7 +9,7 @@ #include "dds_handler.h" -#include +#include namespace FileManagement { diff --git a/Lts/Services/FileManagement/dds_handler.h b/Lts/Services/FileManagement/dds_handler.h index cfc8d269..827061ee 100755 --- a/Lts/Services/FileManagement/dds_handler.h +++ b/Lts/Services/FileManagement/dds_handler.h @@ -10,7 +10,7 @@ #pragma once #include -#include +#include #include #include #include diff --git a/Lts/Services/FileManagement/main_handler.cpp b/Lts/Services/FileManagement/main_handler.cpp index 3df9cee2..1b8cb8f5 100755 --- a/Lts/Services/FileManagement/main_handler.cpp +++ b/Lts/Services/FileManagement/main_handler.cpp @@ -17,7 +17,7 @@ #include "pdf_server.h" #include -#include +#include namespace FileManagement { diff --git a/Lts/Services/FileManagement/object_file_content.h b/Lts/Services/FileManagement/object_file_content.h index d837e698..a0d1ba93 100755 --- a/Lts/Services/FileManagement/object_file_content.h +++ b/Lts/Services/FileManagement/object_file_content.h @@ -11,7 +11,7 @@ #include "base.h" -#include +#include // Generated #include diff --git a/Lts/Services/FileManagement/object_file_type_info.h b/Lts/Services/FileManagement/object_file_type_info.h index 480e9b0a..4c73a99f 100755 --- a/Lts/Services/FileManagement/object_file_type_info.h +++ b/Lts/Services/FileManagement/object_file_type_info.h @@ -11,7 +11,7 @@ #include "base.h" -#include +#include // Generated #include diff --git a/Lts/Services/FileManagement/object_folder.h b/Lts/Services/FileManagement/object_folder.h index d2f4fea2..9293d16f 100755 --- a/Lts/Services/FileManagement/object_folder.h +++ b/Lts/Services/FileManagement/object_folder.h @@ -11,7 +11,7 @@ #include "base.h" -#include +#include // Generated #include diff --git a/Lts/Services/FilterManagement/dds_handler.cpp b/Lts/Services/FilterManagement/dds_handler.cpp index d5c9dab1..eb435583 100755 --- a/Lts/Services/FilterManagement/dds_handler.cpp +++ b/Lts/Services/FilterManagement/dds_handler.cpp @@ -7,7 +7,7 @@ */ #include "dds_handler.h" -#include +#include namespace FilterManagement diff --git a/Lts/Services/FilterManagement/dds_handler.h b/Lts/Services/FilterManagement/dds_handler.h index 878f5982..93f77d32 100755 --- a/Lts/Services/FilterManagement/dds_handler.h +++ b/Lts/Services/FilterManagement/dds_handler.h @@ -9,7 +9,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Lts/Services/FilterManagement/main_handler.cpp b/Lts/Services/FilterManagement/main_handler.cpp index 0aa28263..86570807 100755 --- a/Lts/Services/FilterManagement/main_handler.cpp +++ b/Lts/Services/FilterManagement/main_handler.cpp @@ -8,7 +8,7 @@ #include "settings.h" -#include +#include #include diff --git a/Lts/Services/GuezIedManagement/dds_handler.cpp b/Lts/Services/GuezIedManagement/dds_handler.cpp index a739537c..ae312140 100755 --- a/Lts/Services/GuezIedManagement/dds_handler.cpp +++ b/Lts/Services/GuezIedManagement/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace GuezIedManagement { diff --git a/Lts/Services/GuezIedManagement/dds_handler.h b/Lts/Services/GuezIedManagement/dds_handler.h index 634cb87a..c9800834 100755 --- a/Lts/Services/GuezIedManagement/dds_handler.h +++ b/Lts/Services/GuezIedManagement/dds_handler.h @@ -9,7 +9,7 @@ #pragma once #include -#include +#include #include #include #include "logger.h" diff --git a/Lts/Services/GuezIedManagement/main_handler.cpp b/Lts/Services/GuezIedManagement/main_handler.cpp index ed6aa9c7..3a33d5c2 100755 --- a/Lts/Services/GuezIedManagement/main_handler.cpp +++ b/Lts/Services/GuezIedManagement/main_handler.cpp @@ -10,7 +10,7 @@ #include -#include +#include #include #include #include diff --git a/Lts/Services/GuezIedManagement/object_ied.h b/Lts/Services/GuezIedManagement/object_ied.h index 43355378..695adc04 100755 --- a/Lts/Services/GuezIedManagement/object_ied.h +++ b/Lts/Services/GuezIedManagement/object_ied.h @@ -10,7 +10,7 @@ #include "dds_handler.h" #include "logger.h" -#include +#include #include // Generated diff --git a/Lts/Services/GuezMinelayerProcessing/dds_handler.cpp b/Lts/Services/GuezMinelayerProcessing/dds_handler.cpp index 2028f9ed..65a3fd18 100755 --- a/Lts/Services/GuezMinelayerProcessing/dds_handler.cpp +++ b/Lts/Services/GuezMinelayerProcessing/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace GuezMinelayerProcessing { diff --git a/Lts/Services/GuezMinelayerProcessing/dds_handler.h b/Lts/Services/GuezMinelayerProcessing/dds_handler.h index 9fd1db59..83cb11f2 100755 --- a/Lts/Services/GuezMinelayerProcessing/dds_handler.h +++ b/Lts/Services/GuezMinelayerProcessing/dds_handler.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include "logger.h" namespace GuezMinelayerProcessing diff --git a/Lts/Services/InfrastructureManagement/dds_handler.cpp b/Lts/Services/InfrastructureManagement/dds_handler.cpp index eb94e81b..400fc370 100755 --- a/Lts/Services/InfrastructureManagement/dds_handler.cpp +++ b/Lts/Services/InfrastructureManagement/dds_handler.cpp @@ -9,7 +9,7 @@ #include "dds_handler.h" -#include +#include namespace InfrastructureManagement { diff --git a/Lts/Services/InfrastructureManagement/dds_handler.h b/Lts/Services/InfrastructureManagement/dds_handler.h index 64c4dfdd..67cb07a6 100755 --- a/Lts/Services/InfrastructureManagement/dds_handler.h +++ b/Lts/Services/InfrastructureManagement/dds_handler.h @@ -10,7 +10,7 @@ #pragma once #include -#include +#include #include #include #include "logger.h" diff --git a/Lts/Services/InfrastructureManagement/main_handler.cpp b/Lts/Services/InfrastructureManagement/main_handler.cpp index a7d265ef..88f7c7b4 100755 --- a/Lts/Services/InfrastructureManagement/main_handler.cpp +++ b/Lts/Services/InfrastructureManagement/main_handler.cpp @@ -19,7 +19,7 @@ #include "settings.h" #include -#include +#include #include #include diff --git a/Lts/Services/InfrastructureManagement/object_effect_area.h b/Lts/Services/InfrastructureManagement/object_effect_area.h index 10a2cbb1..2bd6913d 100755 --- a/Lts/Services/InfrastructureManagement/object_effect_area.h +++ b/Lts/Services/InfrastructureManagement/object_effect_area.h @@ -10,7 +10,7 @@ #pragma once #include "base.h" -#include +#include #include diff --git a/Lts/Services/InfrastructureManagement/object_instrumentation_asset.h b/Lts/Services/InfrastructureManagement/object_instrumentation_asset.h index e8b3f2fa..2d0575ea 100755 --- a/Lts/Services/InfrastructureManagement/object_instrumentation_asset.h +++ b/Lts/Services/InfrastructureManagement/object_instrumentation_asset.h @@ -10,7 +10,7 @@ #pragma once #include "base.h" -#include +#include #include diff --git a/Lts/Services/InfrastructureManagement/object_main_schedule.h b/Lts/Services/InfrastructureManagement/object_main_schedule.h index 37fc246d..a858b9da 100755 --- a/Lts/Services/InfrastructureManagement/object_main_schedule.h +++ b/Lts/Services/InfrastructureManagement/object_main_schedule.h @@ -10,7 +10,7 @@ #pragma once #include "base.h" -#include +#include #include diff --git a/Lts/Services/InfrastructureManagement/object_main_structure_element.h b/Lts/Services/InfrastructureManagement/object_main_structure_element.h index 5ae4547b..c3244f48 100755 --- a/Lts/Services/InfrastructureManagement/object_main_structure_element.h +++ b/Lts/Services/InfrastructureManagement/object_main_structure_element.h @@ -12,7 +12,7 @@ #include #include #include "base.h" -#include +#include #include diff --git a/Lts/Services/InfrastructureManagement/object_mounting_point_asset.h b/Lts/Services/InfrastructureManagement/object_mounting_point_asset.h index b33e0cef..f8ffeec0 100755 --- a/Lts/Services/InfrastructureManagement/object_mounting_point_asset.h +++ b/Lts/Services/InfrastructureManagement/object_mounting_point_asset.h @@ -10,7 +10,7 @@ #pragma once #include "base.h" -#include +#include #include diff --git a/Lts/Services/InfrastructureManagement/object_special_area.h b/Lts/Services/InfrastructureManagement/object_special_area.h index 97290fee..18f93291 100755 --- a/Lts/Services/InfrastructureManagement/object_special_area.h +++ b/Lts/Services/InfrastructureManagement/object_special_area.h @@ -10,7 +10,7 @@ #pragma once #include "base.h" -#include +#include #include diff --git a/Lts/Services/InfrastructureManagement/object_structure_element.h b/Lts/Services/InfrastructureManagement/object_structure_element.h index 3b2fb224..dd69e9f4 100755 --- a/Lts/Services/InfrastructureManagement/object_structure_element.h +++ b/Lts/Services/InfrastructureManagement/object_structure_element.h @@ -10,7 +10,7 @@ #pragma once #include "base.h" -#include +#include #include #include diff --git a/Lts/Services/MarkerManagement/dds_handler.h b/Lts/Services/MarkerManagement/dds_handler.h index ebccd956..c62b9748 100755 --- a/Lts/Services/MarkerManagement/dds_handler.h +++ b/Lts/Services/MarkerManagement/dds_handler.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include #include "logger.h" diff --git a/Lts/Services/MarkerManagement/object_marker.h b/Lts/Services/MarkerManagement/object_marker.h index fea4e5ab..8091db8b 100755 --- a/Lts/Services/MarkerManagement/object_marker.h +++ b/Lts/Services/MarkerManagement/object_marker.h @@ -10,7 +10,7 @@ #include "dds_handler.h" #include "mrk_db.h" -#include +#include // Generated #include diff --git a/Lts/Services/MarkerManagement/object_snapshot.h b/Lts/Services/MarkerManagement/object_snapshot.h index 2aedef24..3be96e5a 100755 --- a/Lts/Services/MarkerManagement/object_snapshot.h +++ b/Lts/Services/MarkerManagement/object_snapshot.h @@ -11,7 +11,7 @@ #include #include "dds_handler.h" #include "mrk_db.h" -#include +#include // Generated #include diff --git a/Lts/Services/Messaging/dds_handler.cpp b/Lts/Services/Messaging/dds_handler.cpp index e3cdcac8..c1e5c2dc 100755 --- a/Lts/Services/Messaging/dds_handler.cpp +++ b/Lts/Services/Messaging/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace Messaging { diff --git a/Lts/Services/Messaging/dds_handler.h b/Lts/Services/Messaging/dds_handler.h index 82879910..4d6afd3a 100755 --- a/Lts/Services/Messaging/dds_handler.h +++ b/Lts/Services/Messaging/dds_handler.h @@ -8,8 +8,8 @@ #pragma once #include -#include -#include +#include +#include #include diff --git a/Lts/Services/Messaging/main_handler.cpp b/Lts/Services/Messaging/main_handler.cpp index 75345f9c..67b3cd39 100755 --- a/Lts/Services/Messaging/main_handler.cpp +++ b/Lts/Services/Messaging/main_handler.cpp @@ -9,7 +9,7 @@ #include "main_handler.h" #include "settings.h" -#include +#include #include namespace Messaging diff --git a/Lts/Services/MeteoDataManagement/dds_handler.cpp b/Lts/Services/MeteoDataManagement/dds_handler.cpp index cdb97815..b6b00cf9 100755 --- a/Lts/Services/MeteoDataManagement/dds_handler.cpp +++ b/Lts/Services/MeteoDataManagement/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace MeteoDataManagement { diff --git a/Lts/Services/MeteoDataManagement/dds_handler.h b/Lts/Services/MeteoDataManagement/dds_handler.h index 77ccf323..b8128263 100755 --- a/Lts/Services/MeteoDataManagement/dds_handler.h +++ b/Lts/Services/MeteoDataManagement/dds_handler.h @@ -12,7 +12,7 @@ #include #include -#include +#include #include "logger.h" diff --git a/Lts/Services/MeteoDataManagement/main_handler.cpp b/Lts/Services/MeteoDataManagement/main_handler.cpp index 3d352eff..e40314e9 100755 --- a/Lts/Services/MeteoDataManagement/main_handler.cpp +++ b/Lts/Services/MeteoDataManagement/main_handler.cpp @@ -9,7 +9,7 @@ #include "main_handler.h" #include "settings.h" -#include +#include #include #include diff --git a/Lts/Services/NmeaManagement/dds_handler.cpp b/Lts/Services/NmeaManagement/dds_handler.cpp index bd786981..4569f0cf 100755 --- a/Lts/Services/NmeaManagement/dds_handler.cpp +++ b/Lts/Services/NmeaManagement/dds_handler.cpp @@ -12,7 +12,7 @@ #include "nme_fts.h" #include -#include +#include namespace NmeaManagement { diff --git a/Lts/Services/NmeaManagement/dds_handler.h b/Lts/Services/NmeaManagement/dds_handler.h index f9e48e24..fbd2267b 100755 --- a/Lts/Services/NmeaManagement/dds_handler.h +++ b/Lts/Services/NmeaManagement/dds_handler.h @@ -10,9 +10,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include #include diff --git a/Lts/Services/NotificationManagement/dds_handler.cpp b/Lts/Services/NotificationManagement/dds_handler.cpp index b534364a..d27dba81 100755 --- a/Lts/Services/NotificationManagement/dds_handler.cpp +++ b/Lts/Services/NotificationManagement/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace NotificationManagement { diff --git a/Lts/Services/NotificationManagement/dds_handler.h b/Lts/Services/NotificationManagement/dds_handler.h index 10941109..0ab3dd64 100755 --- a/Lts/Services/NotificationManagement/dds_handler.h +++ b/Lts/Services/NotificationManagement/dds_handler.h @@ -7,8 +7,8 @@ */ #pragma once -#include -#include +#include +#include #include #include "logger.h" diff --git a/Lts/Services/NotificationManagement/main_handler.cpp b/Lts/Services/NotificationManagement/main_handler.cpp index 9841ea31..abe51024 100755 --- a/Lts/Services/NotificationManagement/main_handler.cpp +++ b/Lts/Services/NotificationManagement/main_handler.cpp @@ -9,7 +9,7 @@ #include "main_handler.h" #include "settings.h" -#include +#include #include namespace NotificationManagement diff --git a/Lts/Services/NotificationManagement/object_notification.h b/Lts/Services/NotificationManagement/object_notification.h index 2b27c601..537a0f9d 100755 --- a/Lts/Services/NotificationManagement/object_notification.h +++ b/Lts/Services/NotificationManagement/object_notification.h @@ -10,7 +10,7 @@ #include "dds_handler.h" //#include "nom_db.h" -#include +#include // Generated #include diff --git a/Lts/Services/OcBaseDownload/WebSocketInterface/Messages/client_message.h b/Lts/Services/OcBaseDownload/WebSocketInterface/Messages/client_message.h index 5febcf3b..8d9bc417 100755 --- a/Lts/Services/OcBaseDownload/WebSocketInterface/Messages/client_message.h +++ b/Lts/Services/OcBaseDownload/WebSocketInterface/Messages/client_message.h @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include diff --git a/Lts/Services/OcBaseDownload/WebSocketInterface/Messages/reply_message.h b/Lts/Services/OcBaseDownload/WebSocketInterface/Messages/reply_message.h index 48b742b2..20cdc0fa 100755 --- a/Lts/Services/OcBaseDownload/WebSocketInterface/Messages/reply_message.h +++ b/Lts/Services/OcBaseDownload/WebSocketInterface/Messages/reply_message.h @@ -10,7 +10,7 @@ #include -#include +#include #include #include diff --git a/Lts/Services/OcBaseDownload/dds_handler.cpp b/Lts/Services/OcBaseDownload/dds_handler.cpp index 14f71954..96992567 100755 --- a/Lts/Services/OcBaseDownload/dds_handler.cpp +++ b/Lts/Services/OcBaseDownload/dds_handler.cpp @@ -9,7 +9,7 @@ #include "dds_handler.h" #include -#include +#include namespace OcBaseDownload { diff --git a/Lts/Services/OcBaseDownload/dds_handler.h b/Lts/Services/OcBaseDownload/dds_handler.h index 95d5e099..2ab4b6f7 100755 --- a/Lts/Services/OcBaseDownload/dds_handler.h +++ b/Lts/Services/OcBaseDownload/dds_handler.h @@ -9,8 +9,8 @@ #pragma once #include -#include -#include +#include +#include #include #include "logger.h" diff --git a/Lts/Services/OcBaseDownload/handler_base_download.cpp b/Lts/Services/OcBaseDownload/handler_base_download.cpp index 68638af9..aa4545e3 100755 --- a/Lts/Services/OcBaseDownload/handler_base_download.cpp +++ b/Lts/Services/OcBaseDownload/handler_base_download.cpp @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include #include "copy_database.h" diff --git a/Lts/Services/OcBaseDownload/main_handler.cpp b/Lts/Services/OcBaseDownload/main_handler.cpp index fcc10f1f..ec9520bb 100755 --- a/Lts/Services/OcBaseDownload/main_handler.cpp +++ b/Lts/Services/OcBaseDownload/main_handler.cpp @@ -7,7 +7,7 @@ #include "main_handler.h" -#include +#include #include namespace OcBaseDownload diff --git a/Lts/Services/OcSituationClient/WebSocketInterface/Messages/client_message.h b/Lts/Services/OcSituationClient/WebSocketInterface/Messages/client_message.h index a7d4e470..0d3a3f91 100755 --- a/Lts/Services/OcSituationClient/WebSocketInterface/Messages/client_message.h +++ b/Lts/Services/OcSituationClient/WebSocketInterface/Messages/client_message.h @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include diff --git a/Lts/Services/OcSituationClient/WebSocketInterface/Messages/reply_message.h b/Lts/Services/OcSituationClient/WebSocketInterface/Messages/reply_message.h index 7a880828..a21033b2 100755 --- a/Lts/Services/OcSituationClient/WebSocketInterface/Messages/reply_message.h +++ b/Lts/Services/OcSituationClient/WebSocketInterface/Messages/reply_message.h @@ -10,7 +10,7 @@ #include -#include +#include #include #include diff --git a/Lts/Services/OcSituationClient/dds_handler.cpp b/Lts/Services/OcSituationClient/dds_handler.cpp index 8d3eb709..4cdcac7b 100755 --- a/Lts/Services/OcSituationClient/dds_handler.cpp +++ b/Lts/Services/OcSituationClient/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace OcSituationClient { diff --git a/Lts/Services/OcSituationClient/dds_handler.h b/Lts/Services/OcSituationClient/dds_handler.h index 9c09984d..118c7d49 100755 --- a/Lts/Services/OcSituationClient/dds_handler.h +++ b/Lts/Services/OcSituationClient/dds_handler.h @@ -9,8 +9,8 @@ #pragma once #include -#include -#include +#include +#include #include diff --git a/Lts/Services/OcSituationClient/main_handler.cpp b/Lts/Services/OcSituationClient/main_handler.cpp index 46c884c4..98a45f21 100755 --- a/Lts/Services/OcSituationClient/main_handler.cpp +++ b/Lts/Services/OcSituationClient/main_handler.cpp @@ -8,7 +8,7 @@ #include "main_handler.h" -#include +#include #include "handler_oc_data.h" #include "settings.h" diff --git a/Lts/Services/OcSituationServer/dds_handler.cpp b/Lts/Services/OcSituationServer/dds_handler.cpp index 7d21a457..dad19cab 100755 --- a/Lts/Services/OcSituationServer/dds_handler.cpp +++ b/Lts/Services/OcSituationServer/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace OcSituationServer { diff --git a/Lts/Services/OcSituationServer/dds_handler.h b/Lts/Services/OcSituationServer/dds_handler.h index 5e96631c..04713d28 100755 --- a/Lts/Services/OcSituationServer/dds_handler.h +++ b/Lts/Services/OcSituationServer/dds_handler.h @@ -9,7 +9,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Lts/Services/OcSituationServer/main_handler.cpp b/Lts/Services/OcSituationServer/main_handler.cpp index 73742307..c6eec627 100755 --- a/Lts/Services/OcSituationServer/main_handler.cpp +++ b/Lts/Services/OcSituationServer/main_handler.cpp @@ -8,7 +8,7 @@ #include "main_handler.h" -#include +#include #include "handler_oc_data.h" #include "position_converter.h" diff --git a/Lts/Services/OperatorManagement/dds_handler.cpp b/Lts/Services/OperatorManagement/dds_handler.cpp index 033e5442..7cf0eb4d 100755 --- a/Lts/Services/OperatorManagement/dds_handler.cpp +++ b/Lts/Services/OperatorManagement/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace OperatorManagement { diff --git a/Lts/Services/OperatorManagement/dds_handler.h b/Lts/Services/OperatorManagement/dds_handler.h index fc9128d2..fb0f1cd0 100755 --- a/Lts/Services/OperatorManagement/dds_handler.h +++ b/Lts/Services/OperatorManagement/dds_handler.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include #include diff --git a/Lts/Services/OperatorManagement/handler_locked_topics.cpp b/Lts/Services/OperatorManagement/handler_locked_topics.cpp index 6f6ef471..56d6e9d3 100755 --- a/Lts/Services/OperatorManagement/handler_locked_topics.cpp +++ b/Lts/Services/OperatorManagement/handler_locked_topics.cpp @@ -11,7 +11,7 @@ #include "handler_operator.h" #include #include -#include +#include #include diff --git a/Lts/Services/OperatorManagement/handler_locked_topics.h b/Lts/Services/OperatorManagement/handler_locked_topics.h index 7a5c479d..2dc36990 100755 --- a/Lts/Services/OperatorManagement/handler_locked_topics.h +++ b/Lts/Services/OperatorManagement/handler_locked_topics.h @@ -11,9 +11,9 @@ #include "logger.h" #include "opm_db.h" -#include -#include -#include +#include +#include +#include #include #include diff --git a/Lts/Services/OperatorManagement/main_handler.cpp b/Lts/Services/OperatorManagement/main_handler.cpp index caa128f4..9d145270 100755 --- a/Lts/Services/OperatorManagement/main_handler.cpp +++ b/Lts/Services/OperatorManagement/main_handler.cpp @@ -15,7 +15,7 @@ #include "settings.h" #include -#include +#include #include namespace OperatorManagement diff --git a/Lts/Services/OperatorManagement/object_access_control_level.h b/Lts/Services/OperatorManagement/object_access_control_level.h index b4f444c7..ba2450db 100755 --- a/Lts/Services/OperatorManagement/object_access_control_level.h +++ b/Lts/Services/OperatorManagement/object_access_control_level.h @@ -6,7 +6,7 @@ */ #pragma once -#include +#include // Generated #include diff --git a/Lts/Services/OperatorManagement/object_group.h b/Lts/Services/OperatorManagement/object_group.h index 953d8905..7f39e1eb 100755 --- a/Lts/Services/OperatorManagement/object_group.h +++ b/Lts/Services/OperatorManagement/object_group.h @@ -6,7 +6,7 @@ */ #pragma once -#include +#include // Generated #include diff --git a/Lts/Services/OperatorManagement/object_operator.h b/Lts/Services/OperatorManagement/object_operator.h index b0b112ab..a6fc03d8 100755 --- a/Lts/Services/OperatorManagement/object_operator.h +++ b/Lts/Services/OperatorManagement/object_operator.h @@ -6,7 +6,7 @@ */ #pragma once -#include +#include #include // Generated diff --git a/Lts/Services/ParticipantManagement/ParticipantHandling/firing_unit_validator.h b/Lts/Services/ParticipantManagement/ParticipantHandling/firing_unit_validator.h index 33db1137..1d11b83d 100755 --- a/Lts/Services/ParticipantManagement/ParticipantHandling/firing_unit_validator.h +++ b/Lts/Services/ParticipantManagement/ParticipantHandling/firing_unit_validator.h @@ -11,7 +11,7 @@ #include #include -#include +#include namespace ParticipantManagement { diff --git a/Lts/Services/ParticipantManagement/TargetHandling/object_target_information.h b/Lts/Services/ParticipantManagement/TargetHandling/object_target_information.h index 687c49b9..17789106 100755 --- a/Lts/Services/ParticipantManagement/TargetHandling/object_target_information.h +++ b/Lts/Services/ParticipantManagement/TargetHandling/object_target_information.h @@ -10,7 +10,7 @@ #include "dds_handler.h" #include -#include +#include // Generated #include diff --git a/Lts/Services/ParticipantManagement/dds_handler.cpp b/Lts/Services/ParticipantManagement/dds_handler.cpp index e4339ea1..9ea7c079 100755 --- a/Lts/Services/ParticipantManagement/dds_handler.cpp +++ b/Lts/Services/ParticipantManagement/dds_handler.cpp @@ -10,7 +10,7 @@ #include "exercise_time.h" -#include +#include #include #include diff --git a/Lts/Services/ParticipantManagement/dds_handler.h b/Lts/Services/ParticipantManagement/dds_handler.h index a9c93463..0db18dd8 100755 --- a/Lts/Services/ParticipantManagement/dds_handler.h +++ b/Lts/Services/ParticipantManagement/dds_handler.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include #include diff --git a/Lts/Services/ParticipantManagement/exercise_time.h b/Lts/Services/ParticipantManagement/exercise_time.h index b4231f46..5a307105 100755 --- a/Lts/Services/ParticipantManagement/exercise_time.h +++ b/Lts/Services/ParticipantManagement/exercise_time.h @@ -10,7 +10,7 @@ #include #include -#include +#include #include "dds_handler.h" diff --git a/Lts/Services/ParticipantManagement/main_handler.cpp b/Lts/Services/ParticipantManagement/main_handler.cpp index 63f70d1f..207d331f 100755 --- a/Lts/Services/ParticipantManagement/main_handler.cpp +++ b/Lts/Services/ParticipantManagement/main_handler.cpp @@ -13,7 +13,7 @@ #include "WebSocketInterface/websocket_interface_handler.h" #include "settings.h" -#include +#include #include namespace ParticipantManagement diff --git a/Lts/Services/PresentationManagement/dds_handler.h b/Lts/Services/PresentationManagement/dds_handler.h index 0f43a0fe..ba2690cb 100755 --- a/Lts/Services/PresentationManagement/dds_handler.h +++ b/Lts/Services/PresentationManagement/dds_handler.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include #include "logger.h" diff --git a/Lts/Services/PresentationManagement/object_presentation.h b/Lts/Services/PresentationManagement/object_presentation.h index d808fd54..221ee712 100755 --- a/Lts/Services/PresentationManagement/object_presentation.h +++ b/Lts/Services/PresentationManagement/object_presentation.h @@ -10,7 +10,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Lts/Services/ProjectDataManagement/dds_handler.cpp b/Lts/Services/ProjectDataManagement/dds_handler.cpp index fb03bc41..ddfa335f 100755 --- a/Lts/Services/ProjectDataManagement/dds_handler.cpp +++ b/Lts/Services/ProjectDataManagement/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace ProjectDataManagement { diff --git a/Lts/Services/ProjectDataManagement/dds_handler.h b/Lts/Services/ProjectDataManagement/dds_handler.h index 708f84e5..cf3fd8ac 100755 --- a/Lts/Services/ProjectDataManagement/dds_handler.h +++ b/Lts/Services/ProjectDataManagement/dds_handler.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Lts/Services/ProjectDataManagement/main_handler.cpp b/Lts/Services/ProjectDataManagement/main_handler.cpp index 8540a03a..29de893b 100755 --- a/Lts/Services/ProjectDataManagement/main_handler.cpp +++ b/Lts/Services/ProjectDataManagement/main_handler.cpp @@ -12,7 +12,7 @@ #include "convert_db_to_dds.h" #include -#include +#include #include #include "static_pvsan_import.h" diff --git a/Lts/Services/RecordingManagement/dds_handler.cpp b/Lts/Services/RecordingManagement/dds_handler.cpp index e039a236..e792e7c9 100755 --- a/Lts/Services/RecordingManagement/dds_handler.cpp +++ b/Lts/Services/RecordingManagement/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" #include -#include +#include namespace RecordingManagement { diff --git a/Lts/Services/RecordingManagement/main_handler.cpp b/Lts/Services/RecordingManagement/main_handler.cpp index 4fdf090d..efdc1f81 100755 --- a/Lts/Services/RecordingManagement/main_handler.cpp +++ b/Lts/Services/RecordingManagement/main_handler.cpp @@ -9,7 +9,7 @@ #include "settings.h" #include "logger.h" #include -#include +#include #include namespace RecordingManagement diff --git a/Lts/Services/ReportManagement/Analyzer/main_handler.cpp b/Lts/Services/ReportManagement/Analyzer/main_handler.cpp index a251a5c4..1ae8b469 100755 --- a/Lts/Services/ReportManagement/Analyzer/main_handler.cpp +++ b/Lts/Services/ReportManagement/Analyzer/main_handler.cpp @@ -9,7 +9,7 @@ #include "settings.h" #include "logger.h" #include -#include +#include #include namespace ReportManagement diff --git a/Lts/Services/ReportManagement/Generator/handler_report_data.cpp b/Lts/Services/ReportManagement/Generator/handler_report_data.cpp index ffa7e61c..cf4386ba 100755 --- a/Lts/Services/ReportManagement/Generator/handler_report_data.cpp +++ b/Lts/Services/ReportManagement/Generator/handler_report_data.cpp @@ -19,7 +19,7 @@ #include #include #include -#include +#include using namespace ReportManagement; //----------------------------------------------------------------------------- diff --git a/Lts/Services/ReportManagement/Generator/main_handler.cpp b/Lts/Services/ReportManagement/Generator/main_handler.cpp index 751eaf4e..a23c26eb 100755 --- a/Lts/Services/ReportManagement/Generator/main_handler.cpp +++ b/Lts/Services/ReportManagement/Generator/main_handler.cpp @@ -9,7 +9,7 @@ #include "settings.h" #include "logger.h" #include -#include +#include #include #include diff --git a/Lts/Services/ReportManagement/Generator/object_report_info.h b/Lts/Services/ReportManagement/Generator/object_report_info.h index 04d612dd..24952d0a 100755 --- a/Lts/Services/ReportManagement/Generator/object_report_info.h +++ b/Lts/Services/ReportManagement/Generator/object_report_info.h @@ -9,7 +9,7 @@ #include #include "dds_handler.h" -#include +#include // Generated #include diff --git a/Lts/Services/ReportManagement/dds_handler.cpp b/Lts/Services/ReportManagement/dds_handler.cpp index 527b8a56..3476f000 100755 --- a/Lts/Services/ReportManagement/dds_handler.cpp +++ b/Lts/Services/ReportManagement/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace ReportManagement { diff --git a/Lts/Services/ReportManagement/dds_handler.h b/Lts/Services/ReportManagement/dds_handler.h index 0284d2fc..d4230252 100755 --- a/Lts/Services/ReportManagement/dds_handler.h +++ b/Lts/Services/ReportManagement/dds_handler.h @@ -8,8 +8,8 @@ #pragma once #include -#include -#include +#include +#include #include #include diff --git a/Lts/Services/RoutingServiceNG/main_handler.cpp b/Lts/Services/RoutingServiceNG/main_handler.cpp index ef43e68c..c0e7a52d 100755 --- a/Lts/Services/RoutingServiceNG/main_handler.cpp +++ b/Lts/Services/RoutingServiceNG/main_handler.cpp @@ -16,7 +16,7 @@ #include #include -#include +#include #include namespace RoutingService diff --git a/Lts/Services/ServiceManagement/WebSocketInterface/Messages/reply_message.h b/Lts/Services/ServiceManagement/WebSocketInterface/Messages/reply_message.h index f05a47e9..e3e2f396 100755 --- a/Lts/Services/ServiceManagement/WebSocketInterface/Messages/reply_message.h +++ b/Lts/Services/ServiceManagement/WebSocketInterface/Messages/reply_message.h @@ -10,7 +10,7 @@ #include -#include +#include #include #include diff --git a/Lts/Services/ServiceManagement/group.h b/Lts/Services/ServiceManagement/group.h index b573a9f0..0f5473e5 100755 --- a/Lts/Services/ServiceManagement/group.h +++ b/Lts/Services/ServiceManagement/group.h @@ -13,7 +13,7 @@ #include #include -#include +#include #include "logger.h" #include "dds_handler.h" diff --git a/Lts/Services/ServiceManagement/heartbeat_listener.h b/Lts/Services/ServiceManagement/heartbeat_listener.h index 2b38bbbd..420d6550 100755 --- a/Lts/Services/ServiceManagement/heartbeat_listener.h +++ b/Lts/Services/ServiceManagement/heartbeat_listener.h @@ -10,7 +10,7 @@ #include "logger.h" #include -#include +#include namespace Core { diff --git a/Lts/Services/ServiceManagement/service_process.h b/Lts/Services/ServiceManagement/service_process.h index 580677f1..44760297 100755 --- a/Lts/Services/ServiceManagement/service_process.h +++ b/Lts/Services/ServiceManagement/service_process.h @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include "logger.h" diff --git a/Lts/Services/SituationReplay/dds_handler.h b/Lts/Services/SituationReplay/dds_handler.h index 388c24ca..23aa50b5 100755 --- a/Lts/Services/SituationReplay/dds_handler.h +++ b/Lts/Services/SituationReplay/dds_handler.h @@ -12,7 +12,7 @@ #include #include -#include +#include #include "logger.h" namespace SituationReplay diff --git a/Lts/Services/SituationReplay/object_situation_replay.h b/Lts/Services/SituationReplay/object_situation_replay.h index 9a20f419..4e1ca8c4 100755 --- a/Lts/Services/SituationReplay/object_situation_replay.h +++ b/Lts/Services/SituationReplay/object_situation_replay.h @@ -11,7 +11,7 @@ #include #include "dds_handler.h" #include "db_reader.h" -#include +#include // Generated #include diff --git a/Lts/Services/SoundManagement/dds_handler.cpp b/Lts/Services/SoundManagement/dds_handler.cpp index 95f6cb11..4afef2f6 100755 --- a/Lts/Services/SoundManagement/dds_handler.cpp +++ b/Lts/Services/SoundManagement/dds_handler.cpp @@ -9,7 +9,7 @@ #include "dds_handler.h" #include -#include +#include namespace SoundManagement { diff --git a/Lts/Services/SoundManagement/dds_handler.h b/Lts/Services/SoundManagement/dds_handler.h index 9287d464..2e897eb4 100755 --- a/Lts/Services/SoundManagement/dds_handler.h +++ b/Lts/Services/SoundManagement/dds_handler.h @@ -10,9 +10,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include #include diff --git a/Lts/Services/SoundManagement/main_handler.cpp b/Lts/Services/SoundManagement/main_handler.cpp index 98dbc9a5..ee5ce3ee 100755 --- a/Lts/Services/SoundManagement/main_handler.cpp +++ b/Lts/Services/SoundManagement/main_handler.cpp @@ -8,7 +8,7 @@ #include "main_handler.h" #include -#include +#include #include #include "som_db.h" diff --git a/Lts/Services/TargetManagement/dds_handler.cpp b/Lts/Services/TargetManagement/dds_handler.cpp index 585262d6..d721a8b8 100755 --- a/Lts/Services/TargetManagement/dds_handler.cpp +++ b/Lts/Services/TargetManagement/dds_handler.cpp @@ -9,7 +9,7 @@ #include "dds_handler.h" #include -#include +#include namespace TargetManagement { diff --git a/Lts/Services/TargetManagement/dds_handler.h b/Lts/Services/TargetManagement/dds_handler.h index b98996c2..1522a4f4 100755 --- a/Lts/Services/TargetManagement/dds_handler.h +++ b/Lts/Services/TargetManagement/dds_handler.h @@ -10,9 +10,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include #include diff --git a/Lts/Services/TargetManagement/main_handler.cpp b/Lts/Services/TargetManagement/main_handler.cpp index f1a2881d..61fc4875 100755 --- a/Lts/Services/TargetManagement/main_handler.cpp +++ b/Lts/Services/TargetManagement/main_handler.cpp @@ -8,7 +8,7 @@ #include "main_handler.h" #include -#include +#include #include #include "settings.h" diff --git a/Lts/Services/TargetManagement/object_shootback_area.h b/Lts/Services/TargetManagement/object_shootback_area.h index 59a67c23..bd7c071c 100755 --- a/Lts/Services/TargetManagement/object_shootback_area.h +++ b/Lts/Services/TargetManagement/object_shootback_area.h @@ -10,7 +10,7 @@ #include "dds_handler.h" #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Services/TargetManagement/object_shootback_target.h b/Lts/Services/TargetManagement/object_shootback_target.h index 4389eac3..09397dc6 100755 --- a/Lts/Services/TargetManagement/object_shootback_target.h +++ b/Lts/Services/TargetManagement/object_shootback_target.h @@ -10,7 +10,7 @@ #include "dds_handler.h" #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Services/TargetManagement/object_target_area_assignment.h b/Lts/Services/TargetManagement/object_target_area_assignment.h index b65d7ce9..4251788b 100755 --- a/Lts/Services/TargetManagement/object_target_area_assignment.h +++ b/Lts/Services/TargetManagement/object_target_area_assignment.h @@ -10,7 +10,7 @@ #include "dds_handler.h" #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Services/VideoOverlayManagement/dds_handler.cpp b/Lts/Services/VideoOverlayManagement/dds_handler.cpp index 38645fac..a2c0f74e 100755 --- a/Lts/Services/VideoOverlayManagement/dds_handler.cpp +++ b/Lts/Services/VideoOverlayManagement/dds_handler.cpp @@ -8,7 +8,7 @@ #include "dds_handler.h" -#include +#include namespace VideoOverlayManagement { diff --git a/Lts/Services/VideoOverlayManagement/main_handler.cpp b/Lts/Services/VideoOverlayManagement/main_handler.cpp index e0386c30..120d93b1 100755 --- a/Lts/Services/VideoOverlayManagement/main_handler.cpp +++ b/Lts/Services/VideoOverlayManagement/main_handler.cpp @@ -11,7 +11,7 @@ #include -#include +#include using namespace VideoOverlayManagement; diff --git a/Lts/Services/WarehouseGuez/WsBaseDataInterface/Messages/reply_message.h b/Lts/Services/WarehouseGuez/WsBaseDataInterface/Messages/reply_message.h index 4efdae38..61e161ee 100755 --- a/Lts/Services/WarehouseGuez/WsBaseDataInterface/Messages/reply_message.h +++ b/Lts/Services/WarehouseGuez/WsBaseDataInterface/Messages/reply_message.h @@ -10,7 +10,7 @@ #include -#include +#include #include #include diff --git a/Lts/Services/WarehouseGuez/dds_handler.h b/Lts/Services/WarehouseGuez/dds_handler.h index c0b69d7f..c04fb5ab 100755 --- a/Lts/Services/WarehouseGuez/dds_handler.h +++ b/Lts/Services/WarehouseGuez/dds_handler.h @@ -9,8 +9,8 @@ #pragma once #include -#include -#include +#include +#include #include #include diff --git a/Lts/Services/WarehouseGuez/object_equipment_type_wh.h b/Lts/Services/WarehouseGuez/object_equipment_type_wh.h index c91a7b48..29cecd5c 100755 --- a/Lts/Services/WarehouseGuez/object_equipment_type_wh.h +++ b/Lts/Services/WarehouseGuez/object_equipment_type_wh.h @@ -9,7 +9,7 @@ #include "logger.h" #include "main_handler.h" -#include +#include namespace WarehouseGuez { diff --git a/Lts/Services/WarehouseGuez/object_injury_model.h b/Lts/Services/WarehouseGuez/object_injury_model.h index f5c56738..c6b3b273 100755 --- a/Lts/Services/WarehouseGuez/object_injury_model.h +++ b/Lts/Services/WarehouseGuez/object_injury_model.h @@ -9,7 +9,7 @@ #include "logger.h" #include "main_handler.h" -#include +#include namespace WarehouseGuez { diff --git a/Lts/Services/skeleton/base/dds_handler.cpp b/Lts/Services/skeleton/base/dds_handler.cpp index f9d9b669..a4a606cb 100755 --- a/Lts/Services/skeleton/base/dds_handler.cpp +++ b/Lts/Services/skeleton/base/dds_handler.cpp @@ -12,7 +12,7 @@ #include "xxx_fts.h" #include -#include +#include namespace XxxXxxXxx { diff --git a/Lts/Services/skeleton/base/dds_handler.h b/Lts/Services/skeleton/base/dds_handler.h index 3f7fbc3d..f8060af1 100755 --- a/Lts/Services/skeleton/base/dds_handler.h +++ b/Lts/Services/skeleton/base/dds_handler.h @@ -9,7 +9,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Lts/Services/skeleton/stub/object_xxx.h b/Lts/Services/skeleton/stub/object_xxx.h index b5cccfdc..9630ad71 100755 --- a/Lts/Services/skeleton/stub/object_xxx.h +++ b/Lts/Services/skeleton/stub/object_xxx.h @@ -10,7 +10,7 @@ #include "dds_handler.h" #include "logger.h" -#include +#include // Generated #include diff --git a/Lts/Tests/DatabaseInitialisation/guez_pdm/GUEZ_EXC_PDM_werte.xlsm b/Lts/Tests/DatabaseInitialisation/guez_pdm/GUEZ_EXC_PDM_werte.xlsm index 6d2a0af7d55fb4b7e3d1d2a4ce546eca438f8d87..3b3f3bbdca8dfacc10b33a7f16abdfc17cc219f6 100755 GIT binary patch delta 140931 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

!oa~78zkH4N$RkdI{y@X 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 z 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 #include +#include +#include +#include +#include + #include #include @@ -41,6 +46,7 @@ ICDTest::ICDTest(QWidget *parent) generatePositionReportsPage(); generateTextMessagePage(); generateErkundungsergebnissePage(); + generateFilePage(); connect(m_ui->tbTrash, &QToolButton::clicked, m_ui->textEdit, &QTextEdit::clear); connect(m_ui->tbRestart, &QToolButton::clicked, this, &ICDTest::doRestart); connect(&m_heartbeatTimer, &QTimer::timeout, this, &ICDTest::generateConnectionTestMessage); @@ -1170,6 +1176,57 @@ void ICDTest::generateErkundungsergebnissePage() m_ui->toolBox->addItem(widget, tr("Erkundungsergebnisse")); } +void ICDTest::selectAndSendJson() { + // 1. QSettings initialisieren + QSettings settings(QStringLiteral("Legatus"), QStringLiteral("JsonWebsocketSender")); + + // 2. Letzten Pfad auslesen (Standard: leerer String) + QString lastDir = settings.value(QStringLiteral("lastDirectory"), QStringLiteral("")).toString(); + + // 3. Dialog mit dem letzten Pfad öffnen + QString filePath = QFileDialog::getOpenFileName(this, + tr("Select JSON file"), + lastDir, // Hier wird der gemerkte Pfad übergeben + tr("JSON Files (.json);;Text Files (.txt)")); + + if (filePath.isEmpty()) return; + + // 4. Neuen Pfad für das nächste Mal speichern + QFileInfo fileInfo(filePath); + settings.setValue(QStringLiteral("lastDirectory"), fileInfo.absolutePath()); + + // 5. Datei einlesen + QFile file(filePath); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QMessageBox::critical(this, tr("Error"), tr("Couldn't open file")); + return; + } + + m_pendingData = file.readAll(); + file.close(); + + QString message = QString::fromUtf8(m_pendingData); + m_ui->textEdit->append(message); + emit messsageToProxy(message); + +} + +void ICDTest::generateFilePage() +{ + QVBoxLayout *lay = new QVBoxLayout(this); + QSpacerItem *item = new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding); + QWidget *widget = new QWidget(this); + + QPushButton *btnEXAQ = new QPushButton(tr("JSON Files")); + connect(btnEXAQ, &QPushButton::clicked, this, &ICDTest::selectAndSendJson); + lay->addWidget(btnEXAQ); + + lay->addItem(item); + widget->setLayout(lay); + m_ui->toolBox->addItem(widget, tr("Load JSON File")); +} + + void ICDTest::generateStatusPage() { QVBoxLayout *lay = new QVBoxLayout(this); diff --git a/Lts/Tools/Adler/WebSocketSimulator/awss_icd_test.h b/Lts/Tools/Adler/WebSocketSimulator/awss_icd_test.h index d66c5904..4347ab10 100755 --- a/Lts/Tools/Adler/WebSocketSimulator/awss_icd_test.h +++ b/Lts/Tools/Adler/WebSocketSimulator/awss_icd_test.h @@ -82,6 +82,7 @@ class ICDTest : public QWidget void generateEXFlugbahnberechnung(); // Flugbahnberechnung void generateEXFlugbahndaten(); // Flugbahndaten void onSendHeartbeatChanged(); + void selectAndSendJson(); private: void generateConnectionPage(); @@ -91,6 +92,7 @@ class ICDTest : public QWidget void generateTrajectoryGenerationPage(); void generateTextMessagePage(); void generateErkundungsergebnissePage(); + void generateFilePage(); void generateStatusPage(); void generateEXSQWS_1WS(const QString &verein, const QString &kenner); @@ -101,6 +103,7 @@ class ICDTest : public QWidget QTimer m_heartbeatTimer; QString m_lastFeuerkampfReferenz; QString m_fixedReference; + QByteArray m_pendingData; }; } // namespace AdlerWebSocketSimulator diff --git a/Lts/Tools/CMakeLists.txt b/Lts/Tools/CMakeLists.txt index c3322769..a14903ae 100755 --- a/Lts/Tools/CMakeLists.txt +++ b/Lts/Tools/CMakeLists.txt @@ -23,6 +23,7 @@ ADD_SUBDIRECTORY(ParticipantDataGenerator) ADD_SUBDIRECTORY(ProjectSettingsEditor) ADD_SUBDIRECTORY(QLedLine) ADD_SUBDIRECTORY(QLedMatrix) +ADD_SUBDIRECTORY(RestClientUi) ADD_SUBDIRECTORY(ScreenIdShow) ADD_SUBDIRECTORY(SerialToTcpConverter) ADD_SUBDIRECTORY(Splash) @@ -34,6 +35,8 @@ ADD_SUBDIRECTORY(VapixConfig) ADD_SUBDIRECTORY(Automount) ADD_SUBDIRECTORY(EgcuSimulator) ADD_SUBDIRECTORY(TextEditorTest) +#ADD_SUBDIRECTORY(Examples/Plugins) +ADD_SUBDIRECTORY(Examples/TestGuiElement) #ADD_SUBDIRECTORY(VideoImport) ADD_SUBDIRECTORY(VulnerabilityStateGenerator) diff --git a/Lts/Tools/DBUpdate/CMakeLists.txt b/Lts/Tools/DBUpdate/CMakeLists.txt index e75df6a7..e2c97618 100755 --- a/Lts/Tools/DBUpdate/CMakeLists.txt +++ b/Lts/Tools/DBUpdate/CMakeLists.txt @@ -278,6 +278,7 @@ SET(UPDATES_GUEZ updates/guez/2.178_guez_pdm_target_type_target_subtype.upd updates/guez/2.179_guez_ppm_uas_update.upd updates/guez/2.180_guez_ex_rec_uas.upd + updates/guez/2.183_guez_pdm_charge_type.upd ) SET(UPDATES_QATAR diff --git a/Lts/Tools/DBUpdate/updates/guez/2.177_guez_DM72_update_charge_type_properties.upd b/Lts/Tools/DBUpdate/updates/guez/2.177_guez_DM72_update_charge_type_properties.upd index fa2c60e4..48591235 100755 --- a/Lts/Tools/DBUpdate/updates/guez/2.177_guez_DM72_update_charge_type_properties.upd +++ b/Lts/Tools/DBUpdate/updates/guez/2.177_guez_DM72_update_charge_type_properties.upd @@ -9,8 +9,8 @@ -- GLOBAL: PDM; BEGIN; -UPDATE pdm_charge_type SET properties = '{"adlerChargeTypeName": "Mine DM72", "impactRadius":25, "impactEdgeLength":25, "hazardDistance": 250, "fuseTypes": [{"fuseType": 1, "chargeLegacyId": 395}], "mineLaying":{"appearanceTimeOffset" : 19.2, "appearanceJitter": 3.4, "armingTimeOffset": 29.6, "armingJitter" : 2.3, "mineChargeTypeId": 216, "pattern": [ {"id": 1, "positions": [{"easting": -28, "northing": -30}, {"easting": -34, "northing": -36}, {"easting": -46, "northing": -48}, {"easting": -43, "northing": -44}, {"easting": -61, "northing": -43}, {"easting": -34, "northing": -35}, {"easting": 78, "northing": -77}, {"easting": 78, "northing": -77}, {"easting": 82, "northing": -81}, {"easting": 113, "northing": -112}, {"easting": 105, "northing": -105}, {"easting": 104, "northing": -102}, {"easting": 55, "northing": -53}, {"easting": 61, "northing": -60}, {"easting": 61, "northing": -59}, {"easting": 65, "northing": -64}, {"easting": 71, "northing": -76}, {"easting": 88, "northing": -93}, {"easting": -12, "northing": -13}, {"easting": -4, "northing": -3}, {"easting": 2, "northing": -16}, {"easting": -16, "northing": -3}, {"easting": -11, "northing": -11}, {"easting": -12, "northing": 5}, {"easting": 7, "northing": -40}, {"easting": 8, "northing": -13}, {"easting": 5, "northing": -21}, {"easting": -33, "northing": 44}]}, {"id": 2, "positions": [{"easting": 34, "northing": -238}, {"easting": 16, "northing": -132}, {"easting": -108, "northing": -57}, {"easting": 64, "northing": -262}, {"easting": -12, "northing": -122}, {"easting": 2, "northing": -143}, {"easting": 125, "northing": -235}, {"easting": 39, "northing": -108}, {"easting": 32, "northing": -261}, {"easting": 69, "northing": -248}, {"easting": 56, "northing": -253}, {"easting": 121, "northing": -170}, {"easting": 53, "northing": -268}, {"easting": 116, "northing": -115}, {"easting": 46, "northing": -258}, {"easting": -117, "northing": -53}, {"easting": 49, "northing": -229}, {"easting": 131, "northing": -155}, {"easting": 143, "northing": -236}, {"easting": 137, "northing": -236}, {"easting": 131, "northing": -248}, {"easting": 39, "northing": -100}, {"easting": 22, "northing": -238}, {"easting": 51, "northing": -251}, {"easting": 139, "northing": -139}, {"easting": 73, "northing": -274}, {"easting": 28, "northing": -224}, {"easting": 53, "northing": -234}]}, {"id": 3, "positions": [{"easting": -61, "northing": -520}, {"easting": -58, "northing": -409}, {"easting": -74, "northing": -474}, {"easting": -69, "northing": -393}, {"easting": -5, "northing": -448}, {"easting": -37, "northing": -504}, {"easting": -37, "northing": -397}, {"easting": -55, "northing": -378}, {"easting": -5, "northing": -467}, {"easting": 19, "northing": -342}, {"easting": -26, "northing": -496}, {"easting": -26, "northing": -487}, {"easting": -43, "northing": -445}, {"easting": -69, "northing": -400}, {"easting": -43, "northing": -389}, {"easting": -13, "northing": -463}, {"easting": -52, "northing": -500}, {"easting": -40, "northing": -520}, {"easting": -19, "northing": -444}, {"easting": -38, "northing": -464}, {"easting": 38, "northing": -356}, {"easting": 27, "northing": -354}, {"easting": 47, "northing": -359}, {"easting": -91, "northing": -362}, {"easting": -36, "northing": -540}, {"easting": 27, "northing": -365}, {"easting": 100, "northing": -391}, {"easting": 97, "northing": -365}]}, {"id": 4, "positions": [{"easting": 16, "northing": 221}, {"easting": -125, "northing": 164}, {"easting": 13, "northing": 224}, {"easting": 23, "northing": 214}, {"easting": -91, "northing": 350}, {"easting": 15, "northing": 233}, {"easting": -83, "northing": 365}, {"easting": -63, "northing": 358}, {"easting": 32, "northing": 216}, {"easting": -1, "northing": 236}, {"easting": -26, "northing": 244}, {"easting": -31, "northing": 241}, {"easting": -77, "northing": 184}, {"easting": -79, "northing": 323}, {"easting": -128, "northing": 167}, {"easting": -130, "northing": 158}, {"easting": -97, "northing": 360}, {"easting": 42, "northing": 210}, {"easting": -111, "northing": 329}, {"easting": -32, "northing": 233}, {"easting": -102, "northing": 342}, {"easting": -25, "northing": 231}, {"easting": -81, "northing": 202}, {"easting": -113, "northing": 340}, {"easting": 31, "northing": 202}, {"easting": -67, "northing": 219}, {"easting": -50, "northing": 213}, {"easting": -45, "northing": 210}]}, {"id": 5, "positions": [{"easting": -69, "northing": 5}, {"easting": -53, "northing": 22}, {"easting": -25, "northing": -1}, {"easting": -48, "northing": 48}, {"easting": -103, "northing": 83}, {"easting": -43, "northing": 69}, {"easting": -30, "northing": 43}, {"easting": -137, "northing": 19}, {"easting": -89, "northing": 89}, {"easting": -128, "northing": 41}, {"easting": -81, "northing": 79}, {"easting": -130, "northing": 9}, {"easting": -6, "northing": -7}, {"easting": -121, "northing": 63}, {"easting": -59, "northing": 73}, {"easting": -90, "northing": 35}, {"easting": -20, "northing": 20}, {"easting": -111, "northing": 37}, {"easting": -83, "northing": 82}, {"easting": -135, "northing": 7}, {"easting": -110, "northing": 11}, {"easting": -106, "northing": 22}, {"easting": -73, "northing": -24}, {"easting": -138, "northing": 67}, {"easting": -35, "northing": 34}, {"easting": -140, "northing": 42}, {"easting": -152, "northing": 19}, {"easting": -61, "northing": 64}]}, {"id": 6, "positions": [{"easting": -72, "northing": 522}, {"easting": -63, "northing": 409}, {"easting": 25, "northing": 472}, {"easting": 61, "northing": 391}, {"easting": -13, "northing": 446}, {"easting": -44, "northing": 500}, {"easting": -42, "northing": 400}, {"easting": 46, "northing": 377}, {"easting": -8, "northing": 468}, {"easting": -30, "northing": 341}, {"easting": -33, "northing": 497}, {"easting": -31, "northing": 486}, {"easting": -50, "northing": 443}, {"easting": 55, "northing": 399}, {"easting": -53, "northing": 389}, {"easting": 5, "northing": 464}, {"easting": -61, "northing": 499}, {"easting": -52, "northing": 521}, {"easting": 9, "northing": 446}, {"easting": -49, "northing": 463}, {"easting": 29, "northing": 357}, {"easting": 16, "northing": 356}, {"easting": 36, "northing": 356}, {"easting": 81, "northing": 359}, {"easting": -47, "northing": 542}, {"easting": 19, "northing": 364}, {"easting": 2, "northing": 459}, {"easting": -59, "northing": 487}]}]}}' WHERE id=395; - +UPDATE pdm_charge_type SET properties = '{"impactRadius": 25, "hazardDistance": 250, "impactEdgeLength": 25, "fuseTypes": [{"fuseType": 1, "chargeLegacyId": 395}], "mineLaying": {"pattern": [ { "id": 1, "positions": [ {"easting": 111, "northing": -30}, {"easting": 111, "northing": -36}, {"easting": 120, "northing": -48}, {"easting": 101, "northing": -45}, {"easting": 61, "northing": -44}, {"easting": 87, "northing": -35}, {"easting": -78, "northing": -36}, {"easting": -78, "northing": -35}, {"easting": -82, "northing": -39}, {"easting": -113, "northing": -27}, {"easting": -105, "northing": -15}, {"easting": -104, "northing": -1}, {"easting": -93, "northing": -54}, {"easting": -91, "northing": -60}, {"easting": -89, "northing": -59}, {"easting": -81, "northing": -64}, {"easting": -78, "northing": -69}, {"easting": -95, "northing": -86}, {"easting": 11, "northing": -70}, {"easting": -4, "northing": -90}, {"easting": 2, "northing": -16}, {"easting": -3, "northing": 16}, {"easting": -11, "northing": 11}, {"easting": -12, "northing": 5}, {"easting": 7, "northing": -40}, {"easting": 8, "northing": -13}, {"easting": -21, "northing": 6}, {"easting": 44, "northing": -34} ] }, { "id": 2, "positions": [ {"easting": -239, "northing": -31}, {"easting": -132, "northing": 17}, {"easting": -108, "northing": -57}, {"easting": -261, "northing": 67}, {"easting": -123, "northing": 14}, {"easting": -143, "northing": 5}, {"easting": -233, "northing": 125}, {"easting": -109, "northing": -37}, {"easting": -261, "northing": 37}, {"easting": -247, "northing": 73}, {"easting": -253, "northing": 60}, {"easting": -168, "northing": 124}, {"easting": -267, "northing": 57}, {"easting": -115, "northing": 3}, {"easting": -258, "northing": 49}, {"easting": -117, "northing": -53}, {"easting": -230, "northing": -45}, {"easting": -153, "northing": 131}, {"easting": -234, "northing": 146}, {"easting": -234, "northing": 138}, {"easting": -246, "northing": 132}, {"easting": -100, "northing": -38}, {"easting": -239, "northing": -18}, {"easting": -251, "northing": 53}, {"easting": -137, "northing": 160}, {"easting": -274, "northing": 75}, {"easting": -225, "northing": -23}, {"easting": -234, "northing": 58} ] }, { "id": 3, "positions": [ {"easting": -521, "northing": -54}, {"easting": -409, "northing": -50}, {"easting": -473, "northing": 44}, {"easting": -392, "northing": 76}, {"easting": -447, "northing": 1}, {"easting": -503, "northing": -27}, {"easting": -399, "northing": -31}, {"easting": -377, "northing": 61}, {"easting": -466, "northing": 10}, {"easting": -342, "northing": -15}, {"easting": -497, "northing": -17}, {"easting": -487, "northing": -18}, {"easting": -445, "northing": -38}, {"easting": -398, "northing": 72}, {"easting": -392, "northing": -38}, {"easting": -464, "northing": 19}, {"easting": -502, "northing": -45}, {"easting": -522, "northing": -31}, {"easting": -444, "northing": 23}, {"easting": -467, "northing": -33}, {"easting": -355, "northing": 40}, {"easting": -353, "northing": 30}, {"easting": -358, "northing": 49}, {"easting": -360, "northing": 94}, {"easting": -538, "northing": -30}, {"easting": -364, "northing": 31}, {"easting": -391, "northing": -95}, {"easting": -366, "northing": -90} ] }, { "id": 4, "positions": [ {"easting": 221, "northing": -20}, {"easting": 163, "northing": -127}, {"easting": 224, "northing": -17}, {"easting": 214, "northing": -26}, {"easting": 349, "northing": -97}, {"easting": 232, "northing": -18}, {"easting": 364, "northing": -89}, {"easting": 358, "northing": -70}, {"easting": 215, "northing": -37}, {"easting": 236, "northing": -3}, {"easting": 243, "northing": 21}, {"easting": 241, "northing": -35}, {"easting": 183, "northing": -80}, {"easting": 322, "northing": -84}, {"easting": 166, "northing": -130}, {"easting": 157, "northing": -133}, {"easting": 358, "northing": -104}, {"easting": 209, "northing": -45}, {"easting": 329, "northing": -118}, {"easting": 227, "northing": -37}, {"easting": 342, "northing": -108}, {"easting": 230, "northing": -29}, {"easting": 201, "northing": -83}, {"easting": 339, "northing": -116}, {"easting": 201, "northing": -35}, {"easting": 208, "northing": -70}, {"easting": 212, "northing": -55}, {"easting": 205, "northing": -48} ] }, { "id": 5, "positions": [ {"easting": -69, "northing": 6}, {"easting": -53, "northing": 22}, {"easting": -25, "northing": -1}, {"easting": 43, "northing": 48}, {"easting": -82, "northing": 103}, {"easting": 70, "northing": 42}, {"easting": 43, "northing": 29}, {"easting": -136, "northing": 20}, {"easting": -61, "northing": 90}, {"easting": -128, "northing": 41}, {"easting": 71, "northing": 79}, {"easting": -130, "northing": 10}, {"easting": -6, "northing": -7}, {"easting": -63, "northing": 121}, {"easting": 73, "northing": 58}, {"easting": 35, "northing": 90}, {"easting": -14, "northing": 20}, {"easting": -111, "northing": 38}, {"easting": 58, "northing": 82}, {"easting": -135, "northing": 8}, {"easting": -110, "northing": 12}, {"easting": -107, "northing": 23}, {"easting": -73, "northing": -24}, {"easting": -66, "northing": 140}, {"easting": -13, "northing": 35}, {"easting": -139, "northing": 43}, {"easting": -153, "northing": 20}, {"easting": 65, "northing": 60} ] }, { "id": 6, "positions": [ {"easting": 525, "northing": 64}, {"easting": 408, "northing": 56}, {"easting": 470, "northing": -33}, {"easting": 390, "northing": -68}, {"easting": 445, "northing": 6}, {"easting": 500, "northing": 35}, {"easting": 401, "northing": 36}, {"easting": 376, "northing": -51}, {"easting": 468, "northing": 0}, {"easting": 343, "northing": 25}, {"easting": 497, "northing": 26}, {"easting": 486, "northing": 25}, {"easting": 442, "northing": 44}, {"easting": 399, "northing": -62}, {"easting": 390, "northing": 47}, {"easting": 463, "northing": -13}, {"easting": 501, "northing": 54}, {"easting": 522, "northing": 44}, {"easting": 446, "northing": -15}, {"easting": 468, "northing": 41}, {"easting": 357, "northing": -35}, {"easting": 356, "northing": -21}, {"easting": 356, "northing": -41}, {"easting": 359, "northing": -87}, {"easting": 541, "northing": 38}, {"easting": 365, "northing": -24}, {"easting": 458, "northing": -9}, {"easting": 488, "northing": 52} ] }], "armingJitter": 2.3, "appearanceJitter": 3.4, "armingTimeOffset": 29.6, "mineChargeTypeId": 216, "appearanceTimeOffset": 19.2}}' WHERE ID = 395; +UPDATE pdm_charge_type SET properties = '{"impactRadius": 25, "hazardDistance": 250, "impactEdgeLength": 25, "adlerChargeTypeName": "Mine DM72", "fuseTypes": [{"fuseType": 1, "chargeLegacyId": 395}], "mineLaying": {"pattern": [ { "id": 1, "positions": [ {"easting": 111, "northing": -30}, {"easting": 111, "northing": -36}, {"easting": 120, "northing": -48}, {"easting": 101, "northing": -45}, {"easting": 61, "northing": -44}, {"easting": 87, "northing": -35}, {"easting": -78, "northing": -36}, {"easting": -78, "northing": -35}, {"easting": -82, "northing": -39}, {"easting": -113, "northing": -27}, {"easting": -105, "northing": -15}, {"easting": -104, "northing": -1}, {"easting": -93, "northing": -54}, {"easting": -91, "northing": -60}, {"easting": -89, "northing": -59}, {"easting": -81, "northing": -64}, {"easting": -78, "northing": -69}, {"easting": -95, "northing": -86}, {"easting": 11, "northing": -70}, {"easting": -4, "northing": -90}, {"easting": 2, "northing": -16}, {"easting": -3, "northing": 16}, {"easting": -11, "northing": 11}, {"easting": -12, "northing": 5}, {"easting": 7, "northing": -40}, {"easting": 8, "northing": -13}, {"easting": -21, "northing": 6}, {"easting": 44, "northing": -34} ] }, { "id": 2, "positions": [ {"easting": -239, "northing": -31}, {"easting": -132, "northing": 17}, {"easting": -108, "northing": -57}, {"easting": -261, "northing": 67}, {"easting": -123, "northing": 14}, {"easting": -143, "northing": 5}, {"easting": -233, "northing": 125}, {"easting": -109, "northing": -37}, {"easting": -261, "northing": 37}, {"easting": -247, "northing": 73}, {"easting": -253, "northing": 60}, {"easting": -168, "northing": 124}, {"easting": -267, "northing": 57}, {"easting": -115, "northing": 3}, {"easting": -258, "northing": 49}, {"easting": -117, "northing": -53}, {"easting": -230, "northing": -45}, {"easting": -153, "northing": 131}, {"easting": -234, "northing": 146}, {"easting": -234, "northing": 138}, {"easting": -246, "northing": 132}, {"easting": -100, "northing": -38}, {"easting": -239, "northing": -18}, {"easting": -251, "northing": 53}, {"easting": -137, "northing": 160}, {"easting": -274, "northing": 75}, {"easting": -225, "northing": -23}, {"easting": -234, "northing": 58} ] }, { "id": 3, "positions": [ {"easting": -521, "northing": -54}, {"easting": -409, "northing": -50}, {"easting": -473, "northing": 44}, {"easting": -392, "northing": 76}, {"easting": -447, "northing": 1}, {"easting": -503, "northing": -27}, {"easting": -399, "northing": -31}, {"easting": -377, "northing": 61}, {"easting": -466, "northing": 10}, {"easting": -342, "northing": -15}, {"easting": -497, "northing": -17}, {"easting": -487, "northing": -18}, {"easting": -445, "northing": -38}, {"easting": -398, "northing": 72}, {"easting": -392, "northing": -38}, {"easting": -464, "northing": 19}, {"easting": -502, "northing": -45}, {"easting": -522, "northing": -31}, {"easting": -444, "northing": 23}, {"easting": -467, "northing": -33}, {"easting": -355, "northing": 40}, {"easting": -353, "northing": 30}, {"easting": -358, "northing": 49}, {"easting": -360, "northing": 94}, {"easting": -538, "northing": -30}, {"easting": -364, "northing": 31}, {"easting": -391, "northing": -95}, {"easting": -366, "northing": -90} ] }, { "id": 4, "positions": [ {"easting": 221, "northing": -20}, {"easting": 163, "northing": -127}, {"easting": 224, "northing": -17}, {"easting": 214, "northing": -26}, {"easting": 349, "northing": -97}, {"easting": 232, "northing": -18}, {"easting": 364, "northing": -89}, {"easting": 358, "northing": -70}, {"easting": 215, "northing": -37}, {"easting": 236, "northing": -3}, {"easting": 243, "northing": 21}, {"easting": 241, "northing": -35}, {"easting": 183, "northing": -80}, {"easting": 322, "northing": -84}, {"easting": 166, "northing": -130}, {"easting": 157, "northing": -133}, {"easting": 358, "northing": -104}, {"easting": 209, "northing": -45}, {"easting": 329, "northing": -118}, {"easting": 227, "northing": -37}, {"easting": 342, "northing": -108}, {"easting": 230, "northing": -29}, {"easting": 201, "northing": -83}, {"easting": 339, "northing": -116}, {"easting": 201, "northing": -35}, {"easting": 208, "northing": -70}, {"easting": 212, "northing": -55}, {"easting": 205, "northing": -48} ] }, { "id": 5, "positions": [ {"easting": -69, "northing": 6}, {"easting": -53, "northing": 22}, {"easting": -25, "northing": -1}, {"easting": 43, "northing": 48}, {"easting": -82, "northing": 103}, {"easting": 70, "northing": 42}, {"easting": 43, "northing": 29}, {"easting": -136, "northing": 20}, {"easting": -61, "northing": 90}, {"easting": -128, "northing": 41}, {"easting": 71, "northing": 79}, {"easting": -130, "northing": 10}, {"easting": -6, "northing": -7}, {"easting": -63, "northing": 121}, {"easting": 73, "northing": 58}, {"easting": 35, "northing": 90}, {"easting": -14, "northing": 20}, {"easting": -111, "northing": 38}, {"easting": 58, "northing": 82}, {"easting": -135, "northing": 8}, {"easting": -110, "northing": 12}, {"easting": -107, "northing": 23}, {"easting": -73, "northing": -24}, {"easting": -66, "northing": 140}, {"easting": -13, "northing": 35}, {"easting": -139, "northing": 43}, {"easting": -153, "northing": 20}, {"easting": 65, "northing": 60} ] }, { "id": 6, "positions": [ {"easting": 525, "northing": 64}, {"easting": 408, "northing": 56}, {"easting": 470, "northing": -33}, {"easting": 390, "northing": -68}, {"easting": 445, "northing": 6}, {"easting": 500, "northing": 35}, {"easting": 401, "northing": 36}, {"easting": 376, "northing": -51}, {"easting": 468, "northing": 0}, {"easting": 343, "northing": 25}, {"easting": 497, "northing": 26}, {"easting": 486, "northing": 25}, {"easting": 442, "northing": 44}, {"easting": 399, "northing": -62}, {"easting": 390, "northing": 47}, {"easting": 463, "northing": -13}, {"easting": 501, "northing": 54}, {"easting": 522, "northing": 44}, {"easting": 446, "northing": -15}, {"easting": 468, "northing": 41}, {"easting": 357, "northing": -35}, {"easting": 356, "northing": -21}, {"easting": 356, "northing": -41}, {"easting": 359, "northing": -87}, {"easting": 541, "northing": 38}, {"easting": 365, "northing": -24}, {"easting": 458, "northing": -9}, {"easting": 488, "northing": 52} ] }], "armingJitter": 2.3, "appearanceJitter": 3.4, "armingTimeOffset": 29.6, "mineChargeTypeId": 216, "appearanceTimeOffset": 19.2}}' WHERE ID = 369; COMMIT; -- EXERCISE: NONE; diff --git a/Lts/Tools/DBUpdate/updates/guez/2.183_guez_pdm_charge_type.upd b/Lts/Tools/DBUpdate/updates/guez/2.183_guez_pdm_charge_type.upd new file mode 100644 index 00000000..cecc906e --- /dev/null +++ b/Lts/Tools/DBUpdate/updates/guez/2.183_guez_pdm_charge_type.upd @@ -0,0 +1,48 @@ +-- $Id: 2.89_guez_pdm_charge_type.upd 62864 2024-05-24 08:23:59Z rathje $ +-- $HeadURL$ +-- $Author: rathje $ + +------------------------------------------------------------------------- +-- INFO: Add table pdm_load_type / pdm_charge_type_load_type +-- PROJECT: Guez +-- DATE: 2026-06-26 +-- VERSION: 2.183 +------------------------------------------------------------------------- + +-- GLOBAL: PDM; +BEGIN; + +-- delete +DELETE FROM pdm_charge_type_igniter_type_igniter_function WHERE charge_type_id IN (368,369,373,394,395); + +-- updates +UPDATE pdm_charge_type SET predefined_name = NULL, name = 'GMLRS Unitary M31', short_name = 'GMLRS', properties = '{"impactRadius":25, "impactEdgeLength":25, "hazardDistance": 250, "fuseTypes" : [ { "fuseType" : 1, "chargeLegacyId" : 394}]}', dis_entity = '2.255.201.3.0.0.0', charge_legacy_id = NULL WHERE ID = 394; +UPDATE pdm_charge_type SET predefined_name = NULL, name = 'Mine DM72', short_name = 'DM72', properties = '{"impactRadius":25, "impactEdgeLength":25, "hazardDistance": 250, "fuseTypes": [{"fuseType": 1, "chargeLegacyId": 395}], "mineLaying":{"appearanceTimeOffset" : 19.2, "appearanceJitter": 3.4, "armingTimeOffset": 29.6, "armingJitter" : 2.3, "mineChargeTypeId": 216, "pattern": [ {"id": 1, "positions": [{"easting": -28, "northing": -30}, {"easting": -34, "northing": -36}, {"easting": -46, "northing": -48}, {"easting": -43, "northing": -44}, {"easting": -61, "northing": -43}, {"easting": -34, "northing": -35}, {"easting": 78, "northing": -77}, {"easting": 78, "northing": -77}, {"easting": 82, "northing": -81}, {"easting": 113, "northing": -112}, {"easting": 105, "northing": -105}, {"easting": 104, "northing": -102}, {"easting": 55, "northing": -53}, {"easting": 61, "northing": -60}, {"easting": 61, "northing": -59}, {"easting": 65, "northing": -64}, {"easting": 71, "northing": -76}, {"easting": 88, "northing": -93}, {"easting": -12, "northing": -13}, {"easting": -4, "northing": -3}, {"easting": 2, "northing": -16}, {"easting": -16, "northing": -3}, {"easting": -11, "northing": -11}, {"easting": -12, "northing": 5}, {"easting": 7, "northing": -40}, {"easting": 8, "northing": -13}, {"easting": 5, "northing": -21}, {"easting": -33, "northing": 44}]}, {"id": 2, "positions": [{"easting": 34, "northing": -238}, {"easting": 16, "northing": -132}, {"easting": -108, "northing": -57}, {"easting": 64, "northing": -262}, {"easting": -12, "northing": -122}, {"easting": 2, "northing": -143}, {"easting": 125, "northing": -235}, {"easting": 39, "northing": -108}, {"easting": 32, "northing": -261}, {"easting": 69, "northing": -248}, {"easting": 56, "northing": -253}, {"easting": 121, "northing": -170}, {"easting": 53, "northing": -268}, {"easting": 116, "northing": -115}, {"easting": 46, "northing": -258}, {"easting": -117, "northing": -53}, {"easting": 49, "northing": -229}, {"easting": 131, "northing": -155}, {"easting": 143, "northing": -236}, {"easting": 137, "northing": -236}, {"easting": 131, "northing": -248}, {"easting": 39, "northing": -100}, {"easting": 22, "northing": -238}, {"easting": 51, "northing": -251}, {"easting": 139, "northing": -139}, {"easting": 73, "northing": -274}, {"easting": 28, "northing": -224}, {"easting": 53, "northing": -234}]}, {"id": 3, "positions": [{"easting": -61, "northing": -520}, {"easting": -58, "northing": -409}, {"easting": -74, "northing": -474}, {"easting": -69, "northing": -393}, {"easting": -5, "northing": -448}, {"easting": -37, "northing": -504}, {"easting": -37, "northing": -397}, {"easting": -55, "northing": -378}, {"easting": -5, "northing": -467}, {"easting": 19, "northing": -342}, {"easting": -26, "northing": -496}, {"easting": -26, "northing": -487}, {"easting": -43, "northing": -445}, {"easting": -69, "northing": -400}, {"easting": -43, "northing": -389}, {"easting": -13, "northing": -463}, {"easting": -52, "northing": -500}, {"easting": -40, "northing": -520}, {"easting": -19, "northing": -444}, {"easting": -38, "northing": -464}, {"easting": 38, "northing": -356}, {"easting": 27, "northing": -354}, {"easting": 47, "northing": -359}, {"easting": -91, "northing": -362}, {"easting": -36, "northing": -540}, {"easting": 27, "northing": -365}, {"easting": 100, "northing": -391}, {"easting": 97, "northing": -365}]}, {"id": 4, "positions": [{"easting": 16, "northing": 221}, {"easting": -125, "northing": 164}, {"easting": 13, "northing": 224}, {"easting": 23, "northing": 214}, {"easting": -91, "northing": 350}, {"easting": 15, "northing": 233}, {"easting": -83, "northing": 365}, {"easting": -63, "northing": 358}, {"easting": 32, "northing": 216}, {"easting": -1, "northing": 236}, {"easting": -26, "northing": 244}, {"easting": -31, "northing": 241}, {"easting": -77, "northing": 184}, {"easting": -79, "northing": 323}, {"easting": -128, "northing": 167}, {"easting": -130, "northing": 158}, {"easting": -97, "northing": 360}, {"easting": 42, "northing": 210}, {"easting": -111, "northing": 329}, {"easting": -32, "northing": 233}, {"easting": -102, "northing": 342}, {"easting": -25, "northing": 231}, {"easting": -81, "northing": 202}, {"easting": -113, "northing": 340}, {"easting": 31, "northing": 202}, {"easting": -67, "northing": 219}, {"easting": -50, "northing": 213}, {"easting": -45, "northing": 210}]}, {"id": 5, "positions": [{"easting": -69, "northing": 5}, {"easting": -53, "northing": 22}, {"easting": -25, "northing": -1}, {"easting": -48, "northing": 48}, {"easting": -103, "northing": 83}, {"easting": -43, "northing": 69}, {"easting": -30, "northing": 43}, {"easting": -137, "northing": 19}, {"easting": -89, "northing": 89}, {"easting": -128, "northing": 41}, {"easting": -81, "northing": 79}, {"easting": -130, "northing": 9}, {"easting": -6, "northing": -7}, {"easting": -121, "northing": 63}, {"easting": -59, "northing": 73}, {"easting": -90, "northing": 35}, {"easting": -20, "northing": 20}, {"easting": -111, "northing": 37}, {"easting": -83, "northing": 82}, {"easting": -135, "northing": 7}, {"easting": -110, "northing": 11}, {"easting": -106, "northing": 22}, {"easting": -73, "northing": -24}, {"easting": -138, "northing": 67}, {"easting": -35, "northing": 34}, {"easting": -140, "northing": 42}, {"easting": -152, "northing": 19}, {"easting": -61, "northing": 64}]}, {"id": 6, "positions": [{"easting": -72, "northing": 522}, {"easting": -63, "northing": 409}, {"easting": 25, "northing": 472}, {"easting": 61, "northing": 391}, {"easting": -13, "northing": 446}, {"easting": -44, "northing": 500}, {"easting": -42, "northing": 400}, {"easting": 46, "northing": 377}, {"easting": -8, "northing": 468}, {"easting": -30, "northing": 341}, {"easting": -33, "northing": 497}, {"easting": -31, "northing": 486}, {"easting": -50, "northing": 443}, {"easting": 55, "northing": 399}, {"easting": -53, "northing": 389}, {"easting": 5, "northing": 464}, {"easting": -61, "northing": 499}, {"easting": -52, "northing": 521}, {"easting": 9, "northing": 446}, {"easting": -49, "northing": 463}, {"easting": 29, "northing": 357}, {"easting": 16, "northing": 356}, {"easting": 36, "northing": 356}, {"easting": 81, "northing": 359}, {"easting": -47, "northing": 542}, {"easting": 19, "northing": 364}, {"easting": 2, "northing": 459}, {"easting": -59, "northing": 487}]}]}}', dis_entity = '2.255.201.3.0.0.0 ', charge_legacy_id = NULL WHERE ID = 395; + + + +INSERT INTO pdm_charge_type (id, predefined_name, name, short_name, properties, dis_entity, charge_legacy_id) VALUES (368, NULL, 'GMLRS Unitary M31', 'GMLRS', '{"adlerChargeTypeName": "Unitary M31", "isAdlerChargeType": true, "impactRadius":25, "impactEdgeLength":25, "hazardDistance": 250, "fuseTypes" : [ { "fuseType" : 1, "chargeLegacyId" : 394}]}', '2.255.201.3.0.0.0', 394); +INSERT INTO pdm_charge_type (id, predefined_name, name, short_name, properties, dis_entity, charge_legacy_id) VALUES (369, NULL, 'Mine DM72', 'DM72', '{"adlerChargeTypeName": "Mine DM72","isAdlerChargeType": true, "impactRadius":25, "impactEdgeLength":25, "hazardDistance": 250, "fuseTypes": [{"fuseType": 1, "chargeLegacyId": 395}], "mineLaying":{"appearanceTimeOffset" : 19.2, "appearanceJitter": 3.4, "armingTimeOffset": 29.6, "armingJitter" : 2.3, "mineChargeTypeId": 216, "pattern": [{"id": 1, "positions": [{"easting": -28, "northing": -30}, {"easting": -34, "northing": -36}, {"easting": -46, "northing": -48}, {"easting": -43, "northing": -44}, {"easting": -61, "northing": -43}, {"easting": -34, "northing": -35}, {"easting": 78, "northing": -77}, {"easting": 78, "northing": -77}, {"easting": 82, "northing": -81}, {"easting": 113, "northing": -112}, {"easting": 105, "northing": -105}, {"easting": 104, "northing": -102}, {"easting": 55, "northing": -53}, {"easting": 61, "northing": -60}, {"easting": 61, "northing": -59}, {"easting": 65, "northing": -64}, {"easting": 71, "northing": -76}, {"easting": 88, "northing": -93}, {"easting": -12, "northing": -13}, {"easting": -4, "northing": -3}, {"easting": 2, "northing": -16}, {"easting": -16, "northing": -3}, {"easting": -11, "northing": -11}, {"easting": -12, "northing": 5}, {"easting": 7, "northing": -40}, {"easting": 8, "northing": -13}, {"easting": 5, "northing": -21}, {"easting": -33, "northing": 44}]}, {"id": 2, "positions": [{"easting": 34, "northing": -238}, {"easting": 16, "northing": -132}, {"easting": -108, "northing": -57}, {"easting": 64, "northing": -262}, {"easting": -12, "northing": -122}, {"easting": 2, "northing": -143}, {"easting": 125, "northing": -235}, {"easting": 39, "northing": -108}, {"easting": 32, "northing": -261}, {"easting": 69, "northing": -248}, {"easting": 56, "northing": -253}, {"easting": 121, "northing": -170}, {"easting": 53, "northing": -268}, {"easting": 116, "northing": -115}, {"easting": 46, "northing": -258}, {"easting": -117, "northing": -53}, {"easting": 49, "northing": -229}, {"easting": 131, "northing": -155}, {"easting": 143, "northing": -236}, {"easting": 137, "northing": -236}, {"easting": 131, "northing": -248}, {"easting": 39, "northing": -100}, {"easting": 22, "northing": -238}, {"easting": 51, "northing": -251}, {"easting": 139, "northing": -139}, {"easting": 73, "northing": -274}, {"easting": 28, "northing": -224}, {"easting": 53, "northing": -234}]}, {"id": 3, "positions": [{"easting": -61, "northing": -520}, {"easting": -58, "northing": -409}, {"easting": -74, "northing": -474}, {"easting": -69, "northing": -393}, {"easting": -5, "northing": -448}, {"easting": -37, "northing": -504}, {"easting": -37, "northing": -397}, {"easting": -55, "northing": -378}, {"easting": -5, "northing": -467}, {"easting": 19, "northing": -342}, {"easting": -26, "northing": -496}, {"easting": -26, "northing": -487}, {"easting": -43, "northing": -445}, {"easting": -69, "northing": -400}, {"easting": -43, "northing": -389}, {"easting": -13, "northing": -463}, {"easting": -52, "northing": -500}, {"easting": -40, "northing": -520}, {"easting": -19, "northing": -444}, {"easting": -38, "northing": -464}, {"easting": 38, "northing": -356}, {"easting": 27, "northing": -354}, {"easting": 47, "northing": -359}, {"easting": -91, "northing": -362}, {"easting": -36, "northing": -540}, {"easting": 27, "northing": -365}, {"easting": 100, "northing": -391}, {"easting": 97, "northing": -365}]}, {"id": 4, "positions": [{"easting": 16, "northing": 221}, {"easting": -125, "northing": 164}, {"easting": 13, "northing": 224}, {"easting": 23, "northing": 214}, {"easting": -91, "northing": 350}, {"easting": 15, "northing": 233}, {"easting": -83, "northing": 365}, {"easting": -63, "northing": 358}, {"easting": 32, "northing": 216}, {"easting": -1, "northing": 236}, {"easting": -26, "northing": 244}, {"easting": -31, "northing": 241}, {"easting": -77, "northing": 184}, {"easting": -79, "northing": 323}, {"easting": -128, "northing": 167}, {"easting": -130, "northing": 158}, {"easting": -97, "northing": 360}, {"easting": 42, "northing": 210}, {"easting": -111, "northing": 329}, {"easting": -32, "northing": 233}, {"easting": -102, "northing": 342}, {"easting": -25, "northing": 231}, {"easting": -81, "northing": 202}, {"easting": -113, "northing": 340}, {"easting": 31, "northing": 202}, {"easting": -67, "northing": 219}, {"easting": -50, "northing": 213}, {"easting": -45, "northing": 210}]}, {"id": 5, "positions": [{"easting": -69, "northing": 5}, {"easting": -53, "northing": 22}, {"easting": -25, "northing": -1}, {"easting": -48, "northing": 48}, {"easting": -103, "northing": 83}, {"easting": -43, "northing": 69}, {"easting": -30, "northing": 43}, {"easting": -137, "northing": 19}, {"easting": -89, "northing": 89}, {"easting": -128, "northing": 41}, {"easting": -81, "northing": 79}, {"easting": -130, "northing": 9}, {"easting": -6, "northing": -7}, {"easting": -121, "northing": 63}, {"easting": -59, "northing": 73}, {"easting": -90, "northing": 35}, {"easting": -20, "northing": 20}, {"easting": -111, "northing": 37}, {"easting": -83, "northing": 82}, {"easting": -135, "northing": 7}, {"easting": -110, "northing": 11}, {"easting": -106, "northing": 22}, {"easting": -73, "northing": -24}, {"easting": -138, "northing": 67}, {"easting": -35, "northing": 34}, {"easting": -140, "northing": 42}, {"easting": -152, "northing": 19}, {"easting": -61, "northing": 64}]}, {"id": 6, "positions": [{"easting": -72, "northing": 522}, {"easting": -63, "northing": 409}, {"easting": 25, "northing": 472}, {"easting": 61, "northing": 391}, {"easting": -13, "northing": 446}, {"easting": -44, "northing": 500}, {"easting": -42, "northing": 400}, {"easting": 46, "northing": 377}, {"easting": -8, "northing": 468}, {"easting": -30, "northing": 341}, {"easting": -33, "northing": 497}, {"easting": -31, "northing": 486}, {"easting": -50, "northing": 443}, {"easting": 55, "northing": 399}, {"easting": -53, "northing": 389}, {"easting": 5, "northing": 464}, {"easting": -61, "northing": 499}, {"easting": -52, "northing": 521}, {"easting": 9, "northing": 446}, {"easting": -49, "northing": 463}, {"easting": 29, "northing": 357}, {"easting": 16, "northing": 356}, {"easting": 36, "northing": 356}, {"easting": 81, "northing": 359}, {"easting": -47, "northing": 542}, {"easting": 19, "northing": 364}, {"easting": 2, "northing": 459}, {"easting": -59, "northing": 487}]}]}}', '2.255.201.3.0.0.0', 395); +INSERT INTO pdm.pdm_gear_type_charge_type (gear_type_id, charge_type_id, max_range) VALUES (901, 368, 25190); +INSERT INTO pdm.pdm_gear_type_charge_type (gear_type_id, charge_type_id, max_range) VALUES (901, 369, 25190); + + +-- inserts pdm_charge_type_igniter_type_igniter_function +INSERT INTO pdm_charge_type_igniter_type_igniter_function (charge_type_id, igniter_type_id, igniter_function_id, impact_area, impact_radius, hazard_distance, charge_legacy_id, igniter_function_base_id, properties) VALUES (368, 0, 2, NULL, 25, 250, 394, 2, NULL); +INSERT INTO pdm_charge_type_igniter_type_igniter_function (charge_type_id, igniter_type_id, igniter_function_id, impact_area, impact_radius, hazard_distance, charge_legacy_id, igniter_function_base_id, properties) VALUES (368, 0, 5, NULL, 25, 250, 394, 0, NULL); +INSERT INTO pdm_charge_type_igniter_type_igniter_function (charge_type_id, igniter_type_id, igniter_function_id, impact_area, impact_radius, hazard_distance, charge_legacy_id, igniter_function_base_id, properties) VALUES (368, 0, 6, NULL, 25, 250, 394, 0, NULL); +INSERT INTO pdm_charge_type_igniter_type_igniter_function (charge_type_id, igniter_type_id, igniter_function_id, impact_area, impact_radius, hazard_distance, charge_legacy_id, igniter_function_base_id, properties) VALUES (368, 0, 7, NULL, 25, 250, 394, 0, NULL); +INSERT INTO pdm_charge_type_igniter_type_igniter_function (charge_type_id, igniter_type_id, igniter_function_id, impact_area, impact_radius, hazard_distance, charge_legacy_id, igniter_function_base_id, properties) VALUES (368, 0, 8, NULL, 25, 250, 394, 0, NULL); +INSERT INTO pdm_charge_type_igniter_type_igniter_function (charge_type_id, igniter_type_id, igniter_function_id, impact_area, impact_radius, hazard_distance, charge_legacy_id, igniter_function_base_id, properties) VALUES (369, 0, 0, NULL, 25, 250, 395, 0, NULL); +INSERT INTO pdm_charge_type_igniter_type_igniter_function (charge_type_id, igniter_type_id, igniter_function_id, impact_area, impact_radius, hazard_distance, charge_legacy_id, igniter_function_base_id, properties) VALUES (394, 102, 0, NULL, 25, 250, 394, 0, NULL); +INSERT INTO pdm_charge_type_igniter_type_igniter_function (charge_type_id, igniter_type_id, igniter_function_id, impact_area, impact_radius, hazard_distance, charge_legacy_id, igniter_function_base_id, properties) VALUES (395, 102, 0, NULL, 25, 250, 395, 0, NULL); +INSERT INTO pdm_charge_type_igniter_type_igniter_function (charge_type_id, igniter_type_id, igniter_function_id, impact_area, impact_radius, hazard_distance, charge_legacy_id, igniter_function_base_id, properties) VALUES (373, 101, 0, NULL, 25, 0, 3, 4, NULL); +INSERT INTO pdm_charge_type_igniter_type_igniter_function (charge_type_id, igniter_type_id, igniter_function_id, impact_area, impact_radius, hazard_distance, charge_legacy_id, igniter_function_base_id, properties) VALUES (373, 102, 0, NULL, 25, 0, 3, 2, NULL); +INSERT INTO pdm_charge_type_igniter_type_igniter_function (charge_type_id, igniter_type_id, igniter_function_id, impact_area, impact_radius, hazard_distance, charge_legacy_id, igniter_function_base_id, properties) VALUES (373, 103, 0, NULL, 25, 0, 3, 3, NULL); +INSERT INTO pdm_charge_type_igniter_type_igniter_function (charge_type_id, igniter_type_id, igniter_function_id, impact_area, impact_radius, hazard_distance, charge_legacy_id, igniter_function_base_id, properties) VALUES (373, 104, 0, NULL, 25, 0, 3, 1, NULL); + +COMMIT; + +-- EXERCISE: NONE; +BEGIN; +COMMIT; diff --git a/Lts/Tools/DBUpdate/updates/guez/2.184_guez_charge.upd b/Lts/Tools/DBUpdate/updates/guez/2.184_guez_charge.upd new file mode 100644 index 00000000..17dbb972 --- /dev/null +++ b/Lts/Tools/DBUpdate/updates/guez/2.184_guez_charge.upd @@ -0,0 +1,29 @@ + +-- $Id: 2.184_guez_charge.upd$ +-- $HeadURL$ +-- $Author: rudolphus $ + +------------------------------------------------------------------------- +-- INFO: update pdm_charge_type_igniter_type_igniter_function and pdm_charge_type +-- PROJECT: Guez +-- DATE: 2026-07-15 +-- VERSION: 2.184 +------------------------------------------------------------------------- + +-- GLOBAL: PDM; +BEGIN; + +UPDATE pdm_charge_type_igniter_type_igniter_function set impact_radius = 10 where charge_type_id = 2050; +UPDATE pdm_charge_type_igniter_type_igniter_function set charge_legacy_id = 1 where charge_legacy_id = 394; +UPDATE pdm_charge_type_igniter_type_igniter_function set charge_legacy_id = 1 where charge_legacy_id = 395; + +UPDATE pdm_charge_type set charge_legacy_id = 1 where id = 368; +UPDATE pdm_charge_type set charge_legacy_id = 1 where id = 369; + + +COMMIT; + +-- EXERCISE: NONE; +BEGIN; +COMMIT; + diff --git a/Lts/Tools/Examples/Plugins/CMakeLists.txt b/Lts/Tools/Examples/Plugins/CMakeLists.txt new file mode 100644 index 00000000..e61c137a --- /dev/null +++ b/Lts/Tools/Examples/Plugins/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.10) +project(QtPluginSystemDemo CXX) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) + +find_package(Qt5 REQUIRED COMPONENTS Core Widgets) + +# Ausgabepfad für Plugins definieren +set(PLUGIN_OUTPUT_DIR "${CMAKE_BINARY_DIR}/plugins") + +add_subdirectory(plugins) +add_subdirectory(app) + diff --git a/Lts/Tools/Examples/Plugins/app/CMakeLists.txt b/Lts/Tools/Examples/Plugins/app/CMakeLists.txt new file mode 100644 index 00000000..c06763da --- /dev/null +++ b/Lts/Tools/Examples/Plugins/app/CMakeLists.txt @@ -0,0 +1,6 @@ +add_executable(DlboTestPluginApp main.cpp) +target_link_libraries(DlboTestPluginApp PRIVATE Qt5::Widgets) + +# Kopiert die Interfaces virtuell via Include-Pfad (keine statische Link-Abhängigkeit zu .cpp Dateien) +target_include_directories(DlboTestPluginApp PRIVATE ${CMAKE_SOURCE_DIR}/interfaces) + diff --git a/Lts/Tools/Examples/Plugins/app/main.cpp b/Lts/Tools/Examples/Plugins/app/main.cpp new file mode 100644 index 00000000..15768ff2 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/app/main.cpp @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "../interfaces/child_interface.h" +#include "../interfaces/parent_interface.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + QMainWindow mainWindow; + QWidget *centralWidget = new QWidget(&mainWindow); + QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget); + mainWindow.setCentralWidget(centralWidget); + + // Ordnerstruktur auflösen (.../build-.../plugins/) + QDir baseDir(QCoreApplication::applicationDirPath()); + baseDir.cdUp(); + QDir pluginsDir = baseDir; + if (!pluginsDir.cd(QStringLiteral("plugins"))) + { + qCritical() << "Plugins-Ordner nicht gefunden!"; + return -1; + } + + QMap parentPlugins; + QList childPlugins; + + // Nur .so-Dateien auflisten (verhindert das Einlesen von cmake_install.cmake) + QStringList filters; + filters << QStringLiteral("*.so"); +#ifdef Q_OS_WIN + filters << QStringLiteral("*.dll"); +#else + filters << QStringLiteral("*.so"); +#endif + + // 1. Durchlauf: Plugins laden und katalogisieren + for (const QString &fileName : pluginsDir.entryList(filters, QDir::Files)) + { + QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); + QObject *pluginInstance = loader.instance(); + + if (!pluginInstance) + { + qDebug() << "Überspringe Datei:" << fileName << loader.errorString(); + continue; + } + + // Ist es ein Parent? + auto *parent = qobject_cast(pluginInstance); + if (parent) + { + parentPlugins[parent->pluginName()] = parent; + mainLayout->addWidget(parent->widget()); + qDebug() << "Eltern-Plugin registriert:" << parent->pluginName(); + continue; + } + + // Ist es ein Child? + auto *child = qobject_cast(pluginInstance); + if (child) + { + childPlugins.append(child); + qDebug() << "Kind-Plugin zwischengespeichert:" << child->childName(); + } + } + + // 2. Durchlauf: Zuordnen, Daten übergeben und Signale verbinden + for (ChildInterface *child : childPlugins) + { + QString target = child->targetParentName(); + + if (parentPlugins.contains(target)) + { + ParentInterface *parent = parentPlugins[target]; + + // A. Widget zuweisen + parent->addChildWidget(child->widget()); + qDebug() << "Kind" << child->childName() << "wurde" << target << "zugeordnet."; + + // B. Initiale Parameterübergabe + child->setParentData(QStringLiteral("Konfig-Paket via %1").arg(parent->pluginName())); + + // C. Dynamische Signal-Slot Live-Verbindung (Absturzsicher via Pointer-Check) + QObject *parentObj = parent->qobjectInstance(); + QObject *childObj = dynamic_cast(child); + + if (parentObj && childObj) + { + bool connected = QObject::connect(parentObj, SIGNAL(dataChangedLive(QString)), childObj, SLOT(updateLiveData(QString))); + if (connected) + qDebug() << "Live-Signal verbunden für:" << child->childName(); + else + qWarning() << "Verbindung fehlgeschlagen für:" << child->childName(); + } + else + qWarning() << "Fehler beim Casten des Plugins" << child->childName() << "zu QObject!"; + } + else + qDebug() << "Warnung: Kein Parent gefunden für" << child->childName(); + } + + mainWindow.resize(500, 450); + mainWindow.show(); + return app.exec(); +} diff --git a/Lts/Tools/Examples/Plugins/interfaces/child_interface.h b/Lts/Tools/Examples/Plugins/interfaces/child_interface.h new file mode 100644 index 00000000..5dde5e61 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/interfaces/child_interface.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include + +class ChildInterface +{ +public: + virtual ~ChildInterface() = default; + virtual QString childName() const = 0; + virtual QString targetParentName() const = 0; + virtual QWidget* widget() = 0; + + // Für die einmalige Übergabe direkt nach dem Laden + virtual void setParentData(const QString& data) = 0; + + // Für die dynamischen Live-Updates zur Laufzeit + virtual void updateLiveData(const QString& text) = 0; +}; + +QT_BEGIN_NAMESPACE +Q_DECLARE_INTERFACE(ChildInterface, "gui:3:ChildInterface") +QT_END_NAMESPACE + diff --git a/Lts/Tools/Examples/Plugins/interfaces/parent_interface.h b/Lts/Tools/Examples/Plugins/interfaces/parent_interface.h new file mode 100644 index 00000000..7cbdd243 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/interfaces/parent_interface.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include +#include + +class ParentInterface +{ + public: + virtual ~ParentInterface() = default; + virtual QString pluginName() const = 0; + virtual QWidget *widget() = 0; + virtual void addChildWidget(QWidget *childWidget) = 0; + + // Ermöglicht der App den Zugriff auf das QObject für connect() + virtual QObject *qobjectInstance() = 0; +}; + +QT_BEGIN_NAMESPACE +Q_DECLARE_INTERFACE(ParentInterface, "gui:3:ParentInterface") +QT_END_NAMESPACE + diff --git a/Lts/Tools/Examples/Plugins/plugins/CMakeLists.txt b/Lts/Tools/Examples/Plugins/plugins/CMakeLists.txt new file mode 100644 index 00000000..24e8fbcf --- /dev/null +++ b/Lts/Tools/Examples/Plugins/plugins/CMakeLists.txt @@ -0,0 +1,4 @@ +add_subdirectory(parent_alpha) +add_subdirectory(child_beta) +add_subdirectory(child_gamma) + diff --git a/Lts/Tools/Examples/Plugins/plugins/child_beta/CMakeLists.txt b/Lts/Tools/Examples/Plugins/plugins/child_beta/CMakeLists.txt new file mode 100644 index 00000000..035ec3e0 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/plugins/child_beta/CMakeLists.txt @@ -0,0 +1,10 @@ +add_library(childBetaGui MODULE child_beta.cpp child_beta.h) +target_link_libraries(childBetaGui PRIVATE Qt5::Widgets) +target_include_directories(childBetaGui PRIVATE ${CMAKE_SOURCE_DIR}/interfaces) + +# Plugin in den Laufzeit-Ordner verschieben +set_target_properties(childBetaGui PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${PLUGIN_OUTPUT_DIR}" + RUNTIME_OUTPUT_DIRECTORY "${PLUGIN_OUTPUT_DIR}" +) + diff --git a/Lts/Tools/Examples/Plugins/plugins/child_beta/child_beta.cpp b/Lts/Tools/Examples/Plugins/plugins/child_beta/child_beta.cpp new file mode 100644 index 00000000..026d2719 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/plugins/child_beta/child_beta.cpp @@ -0,0 +1,36 @@ +#include "child_beta.h" +#include + +namespace DLBO +{ +ChildBeta::ChildBeta() +{ + m_widget = new QWidget(); + QVBoxLayout *layout = new QVBoxLayout(m_widget); + m_widget->setStyleSheet(QStringLiteral("border: 1px solid green; background-color: #f0fff0; margin: 5px;")); + + QLabel *title = new QLabel(QStringLiteral("Kind-Widget 1")); + title->setStyleSheet(QStringLiteral("font-weight: bold; color: green;")); + + m_staticLabel = new QLabel(QStringLiteral("Warte auf Init-Daten...")); + m_liveLabel = new QLabel(QStringLiteral("Warte auf Live-Text...")); + + layout->addWidget(title); + layout->addWidget(m_staticLabel); + layout->addWidget(m_liveLabel); +} + +void ChildBeta::setParentData(const QString &data) +{ + if (m_staticLabel) + m_staticLabel->setText(QStringLiteral("Init-Wert: %1").arg(data)); +} + +void ChildBeta::updateLiveData(const QString &text) +{ + if (m_liveLabel) + { + m_liveLabel->setText(text.isEmpty() ? QStringLiteral("Warte auf Live-Text...") : QStringLiteral("Beta Live: ") + text); + } +} +} diff --git a/Lts/Tools/Examples/Plugins/plugins/child_beta/child_beta.h b/Lts/Tools/Examples/Plugins/plugins/child_beta/child_beta.h new file mode 100644 index 00000000..dda3e123 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/plugins/child_beta/child_beta.h @@ -0,0 +1,33 @@ +#pragma once + +#include "../../interfaces/child_interface.h" +#include +#include + +namespace DLBO +{ +class ChildBeta + : public QObject + , public ChildInterface +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "gui:3:ChildInterface") + Q_INTERFACES(ChildInterface) + + public: + ChildBeta(); + QString childName() const override { return QStringLiteral("BetaChild"); } + QString targetParentName() const override { return QStringLiteral("AlphaParent"); } + QWidget *widget() override { return m_widget; } + + void setParentData(const QString &data) override; + + public slots: + void updateLiveData(const QString &text) override; + + private: + QWidget *m_widget; + QLabel *m_staticLabel; + QLabel *m_liveLabel; +}; +} diff --git a/Lts/Tools/Examples/Plugins/plugins/child_beta/child_beta.json b/Lts/Tools/Examples/Plugins/plugins/child_beta/child_beta.json new file mode 100644 index 00000000..2c7d34a5 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/plugins/child_beta/child_beta.json @@ -0,0 +1,3 @@ +{ + "Keys": ["child_beta"] +} diff --git a/Lts/Tools/Examples/Plugins/plugins/child_gamma/CMakeLists.txt b/Lts/Tools/Examples/Plugins/plugins/child_gamma/CMakeLists.txt new file mode 100644 index 00000000..dafb9cd0 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/plugins/child_gamma/CMakeLists.txt @@ -0,0 +1,10 @@ +add_library(childGammaGui MODULE child_gamma.cpp child_gamma.h) +target_link_libraries(childGammaGui PRIVATE Qt5::Widgets) +target_include_directories(childGammaGui PRIVATE ${CMAKE_SOURCE_DIR}/interfaces) + +# Plugin in den Laufzeit-Ordner verschieben +set_target_properties(childGammaGui PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${PLUGIN_OUTPUT_DIR}" + RUNTIME_OUTPUT_DIRECTORY "${PLUGIN_OUTPUT_DIR}" +) + diff --git a/Lts/Tools/Examples/Plugins/plugins/child_gamma/child_gamma.cpp b/Lts/Tools/Examples/Plugins/plugins/child_gamma/child_gamma.cpp new file mode 100644 index 00000000..2e3ff0b0 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/plugins/child_gamma/child_gamma.cpp @@ -0,0 +1,37 @@ +#include "child_gamma.h" +#include + +namespace DLBO +{ +ChildGamma::ChildGamma() +{ + m_widget = new QWidget(); + QVBoxLayout *layout = new QVBoxLayout(m_widget); + m_widget->setStyleSheet(QStringLiteral("border: 1px solid purple; background-color: #faf0ff; margin: 5px;")); + + QLabel *title = new QLabel(QStringLiteral("Kind-Widget 2")); + title->setStyleSheet(QStringLiteral("font-weight: bold; color: purple;")); + + m_staticLabel = new QLabel(QStringLiteral("Warte auf Init-Daten...")); + m_liveLabel = new QLabel(QStringLiteral("Warte auf Live-Text...")); + + layout->addWidget(title); + layout->addWidget(m_staticLabel); + layout->addWidget(m_liveLabel); +} + +void ChildGamma::setParentData(const QString &data) +{ + if (m_staticLabel) + m_staticLabel->setText(QStringLiteral("Init-Wert: %1").arg(data)); +} + +void ChildGamma::updateLiveData(const QString &text) +{ + if (m_liveLabel) + { + m_liveLabel->setText(text.isEmpty() ? QStringLiteral("Warte auf Live-Text...") : QStringLiteral("Gamma Live: ") + text); + } +} + +} diff --git a/Lts/Tools/Examples/Plugins/plugins/child_gamma/child_gamma.h b/Lts/Tools/Examples/Plugins/plugins/child_gamma/child_gamma.h new file mode 100644 index 00000000..cbdd8432 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/plugins/child_gamma/child_gamma.h @@ -0,0 +1,33 @@ +#pragma once + +#include "../../interfaces/child_interface.h" +#include +#include + +namespace DLBO +{ +class ChildGamma + : public QObject + , public ChildInterface +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "gui:3:ChildInterface") + Q_INTERFACES(ChildInterface) + + public: + ChildGamma(); + QString childName() const override { return QStringLiteral("GammaChild"); } + QString targetParentName() const override { return QStringLiteral("AlphaParent"); } + QWidget *widget() override { return m_widget; } + + void setParentData(const QString &data) override; + + public slots: + void updateLiveData(const QString &text) override; + + private: + QWidget *m_widget; + QLabel *m_staticLabel; + QLabel *m_liveLabel; +}; +} diff --git a/Lts/Tools/Examples/Plugins/plugins/child_gamma/child_gamma.json b/Lts/Tools/Examples/Plugins/plugins/child_gamma/child_gamma.json new file mode 100644 index 00000000..13be3450 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/plugins/child_gamma/child_gamma.json @@ -0,0 +1,3 @@ +{ + "Keys": ["child_gamma"] +} diff --git a/Lts/Tools/Examples/Plugins/plugins/parent_alpha/CMakeLists.txt b/Lts/Tools/Examples/Plugins/plugins/parent_alpha/CMakeLists.txt new file mode 100644 index 00000000..c3fb8284 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/plugins/parent_alpha/CMakeLists.txt @@ -0,0 +1,10 @@ +add_library(parentAlphaGui MODULE parent_alpha.cpp parent_alpha.h) +target_link_libraries(parentAlphaGui PRIVATE Qt5::Widgets) +target_include_directories(parentAlphaGui PRIVATE ${CMAKE_SOURCE_DIR}/interfaces) + +# Plugin in den Laufzeit-Ordner verschieben +set_target_properties(parentAlphaGui PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${PLUGIN_OUTPUT_DIR}" + RUNTIME_OUTPUT_DIRECTORY "${PLUGIN_OUTPUT_DIR}" +) + diff --git a/Lts/Tools/Examples/Plugins/plugins/parent_alpha/parent_alpha.cpp b/Lts/Tools/Examples/Plugins/plugins/parent_alpha/parent_alpha.cpp new file mode 100644 index 00000000..b030acae --- /dev/null +++ b/Lts/Tools/Examples/Plugins/plugins/parent_alpha/parent_alpha.cpp @@ -0,0 +1,31 @@ +#include "parent_alpha.h" +#include + +namespace DLBO +{ +ParentAlpha::ParentAlpha() +{ + m_widget = new QWidget(); + m_layout = new QVBoxLayout(m_widget); + m_widget->setStyleSheet(QStringLiteral("border: 2px solid blue; padding: 10px; margin: 5px;")); + + QLabel *label = new QLabel(QStringLiteral("Eltern-Widget (AlphaParent)\nBsp.: Tln-Info-Fenster")); + label->setStyleSheet(QStringLiteral("font-weight: bold; color: blue; font-size: 14px;")); + m_layout->addWidget(label); + + m_inputField = new QLineEdit(); + m_inputField->setPlaceholderText(QStringLiteral("Live-Eingabe für alle Kinder...")); + m_layout->addWidget(m_inputField); + + connect(m_inputField, &QLineEdit::textChanged, this, &ParentAlpha::dataChangedLive); +} + +void ParentAlpha::addChildWidget(QWidget *childWidget) +{ + if (childWidget) + { + m_layout->addWidget(childWidget); + } +} + +} diff --git a/Lts/Tools/Examples/Plugins/plugins/parent_alpha/parent_alpha.h b/Lts/Tools/Examples/Plugins/plugins/parent_alpha/parent_alpha.h new file mode 100644 index 00000000..5f86b7b8 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/plugins/parent_alpha/parent_alpha.h @@ -0,0 +1,35 @@ +#pragma once + +#include "../../interfaces/parent_interface.h" +#include +#include +#include + +namespace DLBO +{ +class ParentAlpha + : public QObject + , public ParentInterface +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "gui:3:ParentInterface") + Q_INTERFACES(ParentInterface) + + public: + ParentAlpha(); + QString pluginName() const override { return QStringLiteral("AlphaParent"); } + QWidget *widget() override { return m_widget; } + void addChildWidget(QWidget *childWidget) override; + QObject *qobjectInstance() override { return this; } + + signals: + void dataChangedLive(const QString &text); + + private: + QWidget *m_widget; + QVBoxLayout *m_layout; + QLineEdit *m_inputField; +}; + +} + diff --git a/Lts/Tools/Examples/Plugins/plugins/parent_alpha/parent_alpha.json b/Lts/Tools/Examples/Plugins/plugins/parent_alpha/parent_alpha.json new file mode 100644 index 00000000..7baab993 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/plugins/parent_alpha/parent_alpha.json @@ -0,0 +1,3 @@ +{ + "Keys": ["parent_alpha"] +} diff --git a/Lts/Tools/Examples/Plugins/readme.txt b/Lts/Tools/Examples/Plugins/readme.txt new file mode 100644 index 00000000..77de2f46 --- /dev/null +++ b/Lts/Tools/Examples/Plugins/readme.txt @@ -0,0 +1,3 @@ +Confluence: https://confluence-classified.rh-int.de/spaces/GUEZDLBO/pages/186346247/Plugin+Konzept + +Jira: https://devhub.defence-elec.de/jira/browse/LS-671 diff --git a/Lts/Tools/Examples/TestGuiElement/CMakeLists.txt b/Lts/Tools/Examples/TestGuiElement/CMakeLists.txt new file mode 100644 index 00000000..a3c439ba --- /dev/null +++ b/Lts/Tools/Examples/TestGuiElement/CMakeLists.txt @@ -0,0 +1,31 @@ +cmake_minimum_required(VERSION 3.16) +project(GuiElementPlugin CXX) + +set(CMAKE_AUTOMOC ON) + + +SET(gui_element_SRCS + custom_widget.cpp + custom_widget.h + gui_element_plugin.cpp + gui_element_plugin.h +) + +NGL_WRAP_UI(gui_element_SRCS + custom_widget.ui +) + +NGL_ADD_LIBRARY(WS GuiElementPlugin MODULE ${gui_element_SRCS}) +# Pfad zum Interface-Ordner bekannt machen +NGL_TARGET_INCLUDE_DIRECTORIES(GuiElementPlugin PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..) + +NGL_TARGET_LINK_LIBRARIES(GuiElementPlugin + Qt5::Widgets + LtsWidgets + LtsSession + LtsSessionData + GuiElementInterface + PpmDataPluginInterface + PpmCommon + LtsCoordTrans + ) diff --git a/Lts/Tools/Examples/TestGuiElement/custom_widget.cpp b/Lts/Tools/Examples/TestGuiElement/custom_widget.cpp new file mode 100644 index 00000000..8f8512ad --- /dev/null +++ b/Lts/Tools/Examples/TestGuiElement/custom_widget.cpp @@ -0,0 +1,33 @@ +#include "custom_widget.h" +#include "LtsCoordTrans/lts_coord_trans.h" +#include "ui_custom_widget.h" +#include + +CustomWidget::CustomWidget(QWidget *parent) + : QWidget(parent) + , m_ui(new Ui::CustomWidget) +{ + m_ui->setupUi(this); + + connect(m_ui->pbFindOnMap, &QToolButton::clicked, this, &CustomWidget::finOnMapClicked); +} + +CustomWidget::~CustomWidget() +{ + delete m_ui; +} + +void CustomWidget::onPositionChanged(const Core::GeoPosition &position, int participantId) +{ + if (participantId == 0 || std::isnan(position.lon()) || std::isnan(position.lat())) + m_ui->lblPos->setText(tr("Invalid Position")); + else + { + QString mgrs = LtsCoordTrans::mgrsFromGeographic(position.lon(), position.lat()); + + if (!qFuzzyIsNull(position.z())) + mgrs += QStringLiteral(" | ") + QString::number(position.z(), 'f', 2); + + m_ui->lblPos->setText(mgrs); + } +} diff --git a/Lts/Tools/Examples/TestGuiElement/custom_widget.h b/Lts/Tools/Examples/TestGuiElement/custom_widget.h new file mode 100644 index 00000000..7dfb3251 --- /dev/null +++ b/Lts/Tools/Examples/TestGuiElement/custom_widget.h @@ -0,0 +1,24 @@ +#pragma once + +#include "Core/core.hpp" +#include + +namespace Ui { +class CustomWidget; +} + +class CustomWidget : public QWidget +{ + Q_OBJECT + +public: + explicit CustomWidget(QWidget *parent = nullptr); + ~CustomWidget(); + void onPositionChanged(const Core::GeoPosition &position, int participantId); + +signals: + void finOnMapClicked(); +private: + Ui::CustomWidget *m_ui; +}; + diff --git a/Lts/Tools/Examples/TestGuiElement/custom_widget.ui b/Lts/Tools/Examples/TestGuiElement/custom_widget.ui new file mode 100644 index 00000000..cbcdb4e0 --- /dev/null +++ b/Lts/Tools/Examples/TestGuiElement/custom_widget.ui @@ -0,0 +1,70 @@ + + + CustomWidget + + + + 0 + 0 + 268 + 88 + + + + Form + + + + + + Plugin-Test-DEBUG ONLY + + + + + + Position: + + + + + + + <Position> + + + + + + + + 40 + 40 + + + + Find on map + + + <TIME OVER TARGET> + + + + :/style/center_to_object.svg:/style/center_to_object.svg + + + + 40 + 40 + + + + + + + + + + + + diff --git a/Lts/Tools/Examples/TestGuiElement/gui_element_plugin.cpp b/Lts/Tools/Examples/TestGuiElement/gui_element_plugin.cpp new file mode 100644 index 00000000..7dbb5429 --- /dev/null +++ b/Lts/Tools/Examples/TestGuiElement/gui_element_plugin.cpp @@ -0,0 +1,60 @@ +#include +#include +#include + +#include "gui_element_plugin.h" +#include "custom_widget.h" + + + +#include + +GuiElementPlugin::GuiElementPlugin() +{ + +} + +QWidget *GuiElementPlugin::createGuiElement(QWidget *parent) +{ + m_customWidget = new CustomWidget(parent); + if (!m_ppmDtc) + { + qCritical()<<" ppmDtc not yet init!!!"; + return nullptr; + } + + connect(m_customWidget, &CustomWidget::finOnMapClicked, this, &GuiElementPlugin::onFindOnMap); + connect(m_ppmDtc.get(), &ParticipantManagement::Interface::Dtc::participantPositionChanged, + m_customWidget, [=](const ParticipantManagement::ParticipantPosition &ppPos){ + m_customWidget->onPositionChanged(ppPos.pos(), m_participantId); + }, Qt::UniqueConnection); + m_customWidget->onPositionChanged(m_ppmDtc->participantPosition(m_participantId).pos(), m_participantId); + return m_customWidget; +} + + +bool GuiElementPlugin::init(LtsSession::LtsSession *session, int participantId) +{ + m_session = session; + + if (!m_session->getDtc(m_ppmDtc)) + { + qCritical()<<"couln't init ppmDtc for gui element "; + return false; + } + + if (!session->getForeignGuiInterface(m_sitMapGuiIfc)) + { + qCritical()<<"couln't init sitMapGuiIfc for gui element "; + return false; + } + + m_participantId = participantId; + return true; +} + +void GuiElementPlugin::onFindOnMap() +{ + if (m_sitMapGuiIfc) + m_sitMapGuiIfc->centerMapToParticipant(m_participantId); +} diff --git a/Lts/Tools/Examples/TestGuiElement/gui_element_plugin.h b/Lts/Tools/Examples/TestGuiElement/gui_element_plugin.h new file mode 100644 index 00000000..77c5f33c --- /dev/null +++ b/Lts/Tools/Examples/TestGuiElement/gui_element_plugin.h @@ -0,0 +1,36 @@ +#pragma once +#include +#include +#include +#include +#include + + + +class CustomWidget; + +class GuiElementPlugin : public QObject, public GuiElementInterface +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID IGuiElementPlugin) + Q_INTERFACES(GuiElementInterface) + +public: + GuiElementPlugin(); + + QString pluginName() {return QStringLiteral("KeyValueGuiElement_XY");} + QWidget* createGuiElement(QWidget *parent = nullptr); + + bool init(LtsSession::LtsSession *session, int participantId = 0); + void onFindOnMap(); + + +private: + LtsSession::LtsSession *m_session; + std::shared_ptr m_ppmDtc; + std::shared_ptr m_sitMapGuiIfc; + CustomWidget *m_customWidget; + int m_participantId = 0; +}; + + diff --git a/Lts/Tools/RestClientUi/CMakeLists.txt b/Lts/Tools/RestClientUi/CMakeLists.txt new file mode 100644 index 00000000..9184c736 --- /dev/null +++ b/Lts/Tools/RestClientUi/CMakeLists.txt @@ -0,0 +1,38 @@ +# +# Tool for sending http-requests to a REST API +# $Id$ +# $HeadURL$ +# $Author$ +# Created by Hannes Fritsche, ESZS, 2026-08-25 +# + +SET(SRCS + main_window.cpp + main_window.h + main.cpp +) + +NGL_WRAP_UI(SRCS main_window.ui) + +NGL_ADD_EXECUTABLE(TOOLSWS RestClientUi ${SRCS}) + +NGL_INSTALL(WS DIRECTORY rest_templates/ DESTINATION bin/updates/) + +NGL_TARGET_LINK_LIBRARIES(RestClientUi + Qt5::Widgets + Qt5::Gui + LtsRestClient +) + +NGL_INSTALL_TARGET(RestClientUi) + +IF (BUILD_TOOLSWS) + SET(TEMPLATES_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/rest_templates") + SET(TEMPLATES_DESTINATION "${CMAKE_BINARY_DIR}/bin/rest_templates") + + ADD_CUSTOM_COMMAND( + TARGET RestClientUi POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory "${TEMPLATES_SOURCE}" "${TEMPLATES_DESTINATION}" + COMMENT "Copy ${TEMPLATES_SOURCE} to ${TEMPLATES_DESTINATION}" + ) +ENDIF() diff --git a/Lts/Tools/RestClientUi/main.cpp b/Lts/Tools/RestClientUi/main.cpp new file mode 100644 index 00000000..7779f08f --- /dev/null +++ b/Lts/Tools/RestClientUi/main.cpp @@ -0,0 +1,22 @@ +/* + * main for RestClientUi + * $Id$ + * $HeadURL$ + * $Author$ + * Created by Hannes Fritsche, ESZS, 2026-08-25 + */ + +#include +#include "main_window.h" + +// Documentation on how to use it can be found at https://confluence-classified.rh-int.de/spaces/LEG/pages/207919552/HOWTO+RestClientUi+Tool + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + MainWindow window; + window.show(); + + return app.exec(); +} diff --git a/Lts/Tools/RestClientUi/main_window.cpp b/Lts/Tools/RestClientUi/main_window.cpp new file mode 100644 index 00000000..484e986f --- /dev/null +++ b/Lts/Tools/RestClientUi/main_window.cpp @@ -0,0 +1,301 @@ +#include "main_window.h" +#include "LtsRestClient/lts_rest_client.h" +#include "ui_main_window.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Documentation on how to use it can be found at https://confluence-classified.rh-int.de/spaces/LEG/pages/207919552/HOWTO+RestClientUi+Tool + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); + + // Connect core HTTP actions + connect(ui->m_getBtn, &QPushButton::clicked, this, &MainWindow::onGetClicked); + connect(ui->m_postBtn, &QPushButton::clicked, this, &MainWindow::onPostClicked); + connect(ui->m_putBtn, &QPushButton::clicked, this, &MainWindow::onPutClicked); + connect(ui->m_deleteBtn, &QPushButton::clicked, this, &MainWindow::onDeleteClicked); + + // Connect logging output actions + connect(ui->m_clearResponseBtn, &QPushButton::clicked, this, &MainWindow::onClearResponseClicked); + connect(ui->m_exportResponseBtn, &QPushButton::clicked, this, &MainWindow::onExportResponseClicked); + + loadRequestTemplates(); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::onClearResponseClicked() +{ + ui->m_responseOutput->clear(); +} + +void MainWindow::onExportResponseClicked() +{ + const QString content = ui->m_responseOutput->toPlainText().trimmed(); + + if (content.isEmpty()) + { + QMessageBox::warning(this, QStringLiteral("Export Failed"), QStringLiteral("There is no response data available to export.")); + + return; + } + + const QString fileName = QFileDialog::getSaveFileName(this, + QStringLiteral("Save Response as JSON"), + QDir::homePath() + QStringLiteral("/response.json"), + QStringLiteral("JSON Files (*.json);;All Files (*)")); + + if (fileName.isEmpty()) + return; + + QJsonParseError parseError; + const QJsonDocument jsonDoc = QJsonDocument::fromJson(content.toUtf8(), &parseError); + QByteArray dataToWrite; + + if (parseError.error == QJsonParseError::NoError) + dataToWrite = jsonDoc.toJson(QJsonDocument::Indented); + else + dataToWrite = content.toUtf8(); + + QFile file(fileName); + + if (file.open(QIODevice::WriteOnly | QIODevice::Text)) + { + file.write(dataToWrite); + file.close(); + + QMessageBox::information(this, QStringLiteral("Success"), QStringLiteral("File saved successfully.")); + } + else + QMessageBox::critical(this, QStringLiteral("Error"), QStringLiteral("Could not write to file:\n") + file.errorString()); +} + +void MainWindow::highlightMethodButton(const QString &method) +{ + // Reset stylesheets for all HTTP method buttons back to default + ui->m_getBtn->setStyleSheet(QString()); + ui->m_postBtn->setStyleSheet(QString()); + ui->m_putBtn->setStyleSheet(QString()); + ui->m_deleteBtn->setStyleSheet(QString()); + + // Modern green border highlight style string + const QString highlightStyle = QStringLiteral("border: 2px solid #2ecc71; font-weight: bold; background-color: #e8f8f5;"); + + // Apply style based on the uppercase method string + const QString upperMethod = method.toUpper().trimmed(); + if (upperMethod == QStringLiteral("GET")) + ui->m_getBtn->setStyleSheet(highlightStyle); + else if (upperMethod == QStringLiteral("POST")) + ui->m_postBtn->setStyleSheet(highlightStyle); + else if (upperMethod == QStringLiteral("PUT")) + ui->m_putBtn->setStyleSheet(highlightStyle); + else if (upperMethod == QStringLiteral("DELETE") + || upperMethod == QStringLiteral("DEL")) + ui->m_deleteBtn->setStyleSheet(highlightStyle); +} + +void MainWindow::loadRequestTemplates() +{ + const QString templatePath = QCoreApplication::applicationDirPath() + QStringLiteral("/templates"); + QDir directory(templatePath); + + if (!directory.exists()) + directory.mkpath(QStringLiteral(".")); + + QStringList filters; + filters << QStringLiteral("*.json"); + directory.setNameFilters(filters); + + const QFileInfoList fileList = directory.entryInfoList(QDir::Files); + + int insertIndex = 0; + for (const QFileInfo &fileInfo : fileList) + { + const QString absolutePath = fileInfo.absoluteFilePath(); + + QFile file(absolutePath); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + continue; + } + + const QByteArray fileContent = file.readAll(); + file.close(); + + QJsonParseError parseError; + const QJsonDocument metaDoc = QJsonDocument::fromJson(fileContent, &parseError); + + if (parseError.error != QJsonParseError::NoError + || !metaDoc.isObject()) + continue; + + const QJsonObject metaObj = metaDoc.object(); + + QString displayName = metaObj.value(QStringLiteral("name")).toString(); + if (displayName.isEmpty()) + displayName = fileInfo.fileName(); + + const QString targetEndpoint = metaObj.value(QStringLiteral("endpoint")).toString(); + const QString targetMethod = metaObj.value(QStringLiteral("method")).toString().toUpper().trimmed(); + + QPushButton *templateBtn = new QPushButton(displayName, this); + + connect(templateBtn, &QPushButton::clicked, this, [this, metaObj, targetEndpoint, targetMethod]() + { + // 1. Fill values into fields + ui->m_endpointInput->setText(targetEndpoint); + ui->m_jsonInput->clear(); + + if (metaObj.contains(QStringLiteral("payload"))) + { + const QJsonValue payloadValue = metaObj.value(QStringLiteral("payload")); + + if (payloadValue.isObject()) + { + const QJsonDocument doc(payloadValue.toObject()); + ui->m_jsonInput->setPlainText(QString::fromUtf8(doc.toJson(QJsonDocument::Indented))); + } + else if (payloadValue.isArray()) + { + const QJsonDocument doc(payloadValue.toArray()); + ui->m_jsonInput->setPlainText(QString::fromUtf8(doc.toJson(QJsonDocument::Indented))); + } + else + { + ui->m_jsonInput->setPlainText(payloadValue.toVariant().toString()); + } + } + + // 2. Visually focus the matching HTTP button + highlightMethodButton(targetMethod); + + // 3. NEW: Optional Auto-Submit trigger chain execution + if (ui->m_autoSubmitCheck->isChecked()) + { + if (targetMethod == QStringLiteral("GET")) + ui->m_getBtn->animateClick(); // animateClick provides nice visual feedback + else if (targetMethod == QStringLiteral("POST")) + ui->m_postBtn->animateClick(); + else if (targetMethod == QStringLiteral("PUT")) + ui->m_putBtn->animateClick(); + else if (targetMethod == QStringLiteral("DELETE") + || targetMethod == QStringLiteral("DEL")) + ui->m_deleteBtn->animateClick(); + } + }); + + ui->templateButtonContainer->insertWidget(insertIndex++, templateBtn); + } +} + +LtsCommon::LtsRestClient *MainWindow::createClient() +{ + return new LtsCommon::LtsRestClient(ui->m_urlInput->text(), this); +} + +void MainWindow::showSuccess(const QJsonDocument &json) +{ + ui->m_responseOutput->setTextColor(QColor(Qt::darkGreen)); + ui->m_responseOutput->setText(QString::fromLatin1(json.toJson(QJsonDocument::Indented))); +} + +void MainWindow::showError(const QString &error) +{ + ui->m_responseOutput->setTextColor(QColor(Qt::red)); + ui->m_responseOutput->setText(QStringLiteral("Error: ") + error); +} + +void MainWindow::onGetClicked() +{ + ui->m_responseOutput->clear(); + LtsCommon::LtsRestClient *client = createClient(); + client->get( + ui->m_endpointInput->text(), + [this](const QJsonDocument &json) + { + showSuccess(json); + }, + [this](const QString &err) + { + showError(err); + }); +} + +void MainWindow::onPostClicked() +{ + ui->m_responseOutput->clear(); + QJsonParseError parseError; + QJsonDocument jsonDoc = QJsonDocument::fromJson(ui->m_jsonInput->toPlainText().toUtf8(), &parseError); + + if (parseError.error != QJsonParseError::NoError) + { + showError(QStringLiteral("Invalid JSON input syntax: ") + parseError.errorString()); + return; + } + + LtsCommon::LtsRestClient *client = createClient(); + client->post( + ui->m_endpointInput->text(), jsonDoc, + [this](const QJsonDocument &json) + { + showSuccess(json); + }, + [this](const QString &err) + { + showError(err); + }); +} + +void MainWindow::onPutClicked() +{ + ui->m_responseOutput->clear(); + QJsonParseError parseError; + QJsonDocument jsonDoc = QJsonDocument::fromJson(ui->m_jsonInput->toPlainText().toUtf8(), &parseError); + + if (parseError.error != QJsonParseError::NoError) + { + showError(QStringLiteral("Invalid JSON input syntax: ") + parseError.errorString()); + return; + } + + LtsCommon::LtsRestClient *client = createClient(); + client->put( + ui->m_endpointInput->text(), jsonDoc, + [this](const QJsonDocument &json) + { + showSuccess(json); + }, + [this](const QString &err) + { + showError(err); + }); +} + +void MainWindow::onDeleteClicked() +{ + ui->m_responseOutput->clear(); + LtsCommon::LtsRestClient *client = createClient(); + client->del( + ui->m_endpointInput->text(), + [this](const QJsonDocument &json) + { + showSuccess(json); + }, + [this](const QString &err) + { + showError(err); + }); +} diff --git a/Lts/Tools/RestClientUi/main_window.h b/Lts/Tools/RestClientUi/main_window.h new file mode 100644 index 00000000..081895ed --- /dev/null +++ b/Lts/Tools/RestClientUi/main_window.h @@ -0,0 +1,38 @@ +#pragma once + +#include "LtsRestClient/lts_rest_client.h" +#include +#include + +// Documentation on how to use it can be found at https://confluence-classified.rh-int.de/spaces/LEG/pages/207919552/HOWTO+RestClientUi+Tool + +namespace Ui +{ +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + + public: + explicit MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + + private slots: + void onGetClicked(); + void onPostClicked(); + void onPutClicked(); + void onDeleteClicked(); + void onClearResponseClicked(); + void onExportResponseClicked(); + + private: + void loadRequestTemplates(); + LtsCommon::LtsRestClient *createClient(); + void showSuccess(const QJsonDocument &json); + void showError(const QString &error); + void highlightMethodButton(const QString &method); + + Ui::MainWindow *ui; +}; // class MainWindow diff --git a/Lts/Tools/RestClientUi/main_window.ui b/Lts/Tools/RestClientUi/main_window.ui new file mode 100644 index 00000000..45fdc01d --- /dev/null +++ b/Lts/Tools/RestClientUi/main_window.ui @@ -0,0 +1,215 @@ + + + MainWindow + + + + 0 + 0 + 750 + 580 + + + + Qt REST Client GUI + + + + + + + + 180 + 0 + + + + + 220 + 16777215 + + + + + + + + true + + + + JSON Templates: + + + + + + + true + + + + + 0 + 0 + 200 + 520 + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + + + + + + + + + + + + + + Basis URL: + + + + + + + http://localhost:8080 + + + + + + + Endpunkt: + + + + + + + /posts + + + + + + + + + JSON Input (for POST / PUT): + + + + + + + + + + Submit automatically on template click + + + + + + + + + GET + + + + + + + POST + + + + + + + PUT + + + + + + + DELETE + + + + + + + + + Server Response / Error Log: + + + + + + + true + + + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + + Clear Log + + + + + + + Export as JSON... + + + + + + + + + + + + + diff --git a/Lts/Tools/RestClientUi/rest_templates/01_itemsKeys.json b/Lts/Tools/RestClientUi/rest_templates/01_itemsKeys.json new file mode 100644 index 00000000..9aa9c7a7 --- /dev/null +++ b/Lts/Tools/RestClientUi/rest_templates/01_itemsKeys.json @@ -0,0 +1,5 @@ +{ + "name": "itemsKeys", + "method": "GET", + "endpoint": "/uncat/itemsKeys" +} diff --git a/specs/external/ctc_devel_tds_qt5-1.0.spec b/specs/external/ctc_devel_tds_qt5-1.0.spec index 726b442a..4ad11db1 100755 --- a/specs/external/ctc_devel_tds_qt5-1.0.spec +++ b/specs/external/ctc_devel_tds_qt5-1.0.spec @@ -17,7 +17,7 @@ Summary: CTC Development Meta-Package (Qt5 development) Name: ctc_devel_tds_qt5 Version: 1.0 -Release: 25 +Release: 27 License: proprietary Group: Applications/Communications Source: ctc_devel_tds_qt5.tgz @@ -44,6 +44,7 @@ Requires: ctc_schusstafel Requires: gdb Requires: git Requires: grantlee5-devel +Requires: gtest Requires: pkgconfig(gstreamer-1.0) Requires: pkgconfig(gstreamer-app-1.0) Requires: pkgconfig(gstreamer-video-1.0) @@ -86,6 +87,7 @@ Requires: rpm-build Requires: subversion Requires: subversion-tools Requires: subversion-bash-completion +Requires: tacticalapi-devel Requires: valgrind Requires: vlc-devel Requires: xsd diff --git a/translations/tds_de_DE.ts b/translations/tds_de_DE.ts index 31940771..584ba12e 100755 --- a/translations/tds_de_DE.ts +++ b/translations/tds_de_DE.ts @@ -323,7 +323,7 @@ HQ Report - HQ Bericht + HQ Meldung @@ -9615,27 +9615,27 @@ Die Parameter können nicht geändert werden! Undefined - Undefiniert + undefiniert Disconnecting - Trennen + trennen Disconnected - Getrennt + nicht verbunden Connecting - Verbinden + verbinden Connected - Verbunden + verbunden @@ -17308,7 +17308,7 @@ Die zu ladende Datei ist nicht lesbar (%1). HQ Report - HQ Bericht + HQ Meldung @@ -17343,7 +17343,7 @@ Die zu ladende Datei ist nicht lesbar (%1). HQ Report - HQ Bericht + HQ Meldung