Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Services/AreaEffectSimulation/object_effector.cpp
T
torstenandCopilot b774f4035c Qt6 Migration: DDS-Stubs, Logger-Fixes, Export-Header Korrekturen
- NGL_ADD_LIBRARY2: 87 CMakeLists.txt konvertiert für Export-Header Generierung
- 44 Export-Header Include-Pfade korrigiert (_export.h)
- 81 DDS-Stub-Header generiert (*_dtc.h, *_fts.h, *_dts.h, *_ftc.h)
- INGLLogger: Duplikat gelöscht, m_logger Member entfernt, variadische Makros
- Q_FUNC_INFO Redefinition behoben (Qt6 definiert bereits)
- FATAL_LOG Makro hinzugefügt
- InfrastructureManagement DDS-Stubs (ism.hpp, ism_enums.hpp, ism_ftc.h)
- FilterManagement DDS-Stubs (flt_ftc.h, flt_dts.h)
- AreaEffectSimulation DDS-Stubs (aes.hpp, aes_enums.hpp)
- SymbolAppearance Klasse vollständig definiert mit content() Methode
- BuildingComponentFilter Klasse definiert mit Copy-Konstruktor
- Ftc Factory: nullptr Return (abstract class)
- AesFilter Klasse in aes.hpp hinzugefügt
- Dtc Klasse in ppm.hpp mit participantChanged Signal
- AesType Enum: alle 15 At* Werte definiert
- AesEffectState_def: EsReceived hinzugefügt
- DataModification Enum: eAdded/eModified/eRemoved
- function_reply_object.h → core_types.h Include-Pfad (72 Dateien)
- Enum-Class-Streaming Template-Operator in INGLLogger.h
- ism_mounting_point.h: QImage → QtGui/QImage, QGuiApplication/QScreen
- ism_data_plugin_interface.h: QSet Include, Include-Reihenfolge
- QRegExp → QRegularExpression in tpm_js_parser.cpp
- .underlying() Aufrufe zu direktem Enum-Vergleich korrigiert
- Include-Pfade: aes.hpp in symbol_appearance_settings_impl.h und aes_display_filter_impl.h

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-08-19 06:06:24 +02:00

228 lines
6.9 KiB
C++
Executable File

/**
* Object class for ObjectEffector
* $Id$
* $HeadURL$
* $Author$
*/
#include "object_effector.h"
#include "main_handler.h"
#include "EffectorFiringStrategy/abstract_firing_strategy.h"
#include "EffectorFiringStrategy/firing_strategy_factory.h"
#include <LtsUtilsCore/qpoint3d.h>
namespace AreaEffectSimulation
{
//-----------------------------------------------------------------------------
ObjectEffector::ObjectEffector(MainHandler *mainHandler, QObject *parent)
: QObject(parent)
, m_mainHandler(mainHandler)
, m_logger(getLogger(QStringLiteral("ObjectEffector")))
{
}
bool ObjectEffector::init(int participantId)
{
m_participantId = participantId;
return true;
}
AesEffectorState ObjectEffector::currentEffectorState()
{
if (!m_effectorStateMachine)
return AesEffectorState::EsNotReadyToFire;
return m_effectorStateMachine->getCurrentState();
}
MainHandler *ObjectEffector::mainHandler() const
{
return m_mainHandler;
}
int ObjectEffector::aesItemId() const
{
return m_aesItemId;
}
int ObjectEffector::participantId() const
{
return m_participantId;
}
QVector<TrajectoryPoint> ObjectEffector::intendendTrajectory() const
{
return m_intendendTrajectory;
}
EffectorData ObjectEffector::effectorData() const
{
return m_effectorData;
}
void ObjectEffector::assignAesItemRequest(int aesItemId)
{
DEBUG_LOG() << "assignAesItemRequest aesItemId=" << aesItemId;
m_aesItemId = aesItemId;
// Statemachine mit new anlegen
if (m_effectorStateMachine)
{
delete m_effectorStateMachine;
m_effectorStateMachine = nullptr;
}
m_effectorStateMachine = new EffectorStateMachine(AreaEffectSimulation::AesEffectorState::EsNotReadyToFire, this);
connect(m_effectorStateMachine, &EffectorStateMachine::signalNotReadyToFire, this, [this]() { emit signalNotReadyToFire(m_participantId, m_aesItemId); });
connect(m_effectorStateMachine, &EffectorStateMachine::signalReadyToFire, this, [this]() { emit signalReadyToFire(m_participantId, m_aesItemId); });
connect(m_effectorStateMachine, &EffectorStateMachine::signalReceivedOrder, this, [this]() { emit signalReceivedOrder(m_participantId, m_aesItemId); });
connect(m_effectorStateMachine, &EffectorStateMachine::signalReportedFired, this, [this]() { emit signalReportedFired(m_participantId, m_aesItemId); });
connect(m_effectorStateMachine, &EffectorStateMachine::signalFired, this, &ObjectEffector::onEffectorFired);
connect(m_effectorStateMachine, &EffectorStateMachine::signalNotReadyToFire, this, &ObjectEffector::sendEffectorToDds);
connect(m_effectorStateMachine, &EffectorStateMachine::signalReadyToFire, this, &ObjectEffector::sendEffectorToDds);
connect(m_effectorStateMachine, &EffectorStateMachine::signalReceivedOrder, this, &ObjectEffector::sendEffectorToDds);
connect(m_effectorStateMachine, &EffectorStateMachine::signalReportedFired, this, &ObjectEffector::sendEffectorToDds);
connect(m_effectorStateMachine, &EffectorStateMachine::signalFired, this, &ObjectEffector::sendEffectorToDds);
connect(m_effectorStateMachine, &EffectorStateMachine::logMessage, this, &ObjectEffector::logMessage);
m_effectorStateMachine->init();
// Zuweisung im Objekt veranlassen
// ggf. Trajektorie berechnen
// publish Trajectory
}
void ObjectEffector::deleteAssignmentAesItem()
{
DEBUG_LOG() << "deleteAssignmentAesItem";
if (m_effectorStateMachine)
{
delete m_effectorStateMachine;
m_effectorStateMachine = nullptr;
}
m_aesItemId = 0;
}
bool ObjectEffector::reportFireReadinessRequest() // Feuerbereitschaft melden
{
if (!m_effectorStateMachine)
return false;
return m_effectorStateMachine->reportFireReadiness();
}
void ObjectEffector::fireOrderRequest() // Feuerbefehl erhalten
{
DEBUG_LOG() << "fireOrderRequest";
if (!m_effectorStateMachine)
return;
m_effectorStateMachine->fireOrder();
}
void ObjectEffector::fireRequest() // Feuern
{
DEBUG_LOG() << "fireRequest";
if (!m_effectorStateMachine)
return;
m_effectorStateMachine->fire();
}
bool ObjectEffector::reportFiredRequest() // Abgefeuert melden
{
DEBUG_LOG() << "reportFiredRequest";
if (!m_effectorStateMachine)
return false;
return m_effectorStateMachine->reportFired();
}
void ObjectEffector::reportEmptyChargeRequest(bool emptyCharge) // Munition leer
{
DEBUG_LOG() << "reportEmptyChargeRequest";
if (!m_effectorStateMachine)
return;
m_effectorStateMachine->setEmptyCharge(emptyCharge);
}
bool ObjectEffector::overrideReadynessTimerMinMax(int newMillisecondsMin, int newMillisecondsMax)
{
if (!m_effectorStateMachine)
return false;
return m_effectorStateMachine->overrideReportFireReadinessMinMax(newMillisecondsMin, newMillisecondsMax);
}
void ObjectEffector::resetReadynessTimer()
{
if (m_effectorStateMachine)
m_effectorStateMachine->resetReportFireReadinessMinMax();
}
void ObjectEffector::sendEffectorToDds()
{
// Effector Effector;
DEBUG_LOG() << "sendEffectorToDds NewState= " << m_effectorStateMachine->getCurrentStateStr() << ", participantId=" << m_participantId
<< ", aesItemId=" << m_aesItemId;
AreaEffectSimulation::Effector effector;
effector.id(m_participantId);
effector.effectorState(m_effectorStateMachine->getCurrentState());
effector.aesItemId(m_aesItemId);
effector.participantId(m_participantId);
m_mainHandler->dds()->dts()->publish(effector);
}
void ObjectEffector::onEffectorFired()
{
DEBUG_LOG() << "onEffectorFired";
if (m_firingStrategy == nullptr)
{
ERROR_LOG() << "Not possible to fire. No firing strategy specified.";
return;
}
m_firingStrategy->doFiring();
}
// Anhand der EX-L39 Streuungsdaten wird eine Trajektorie für diesen
// Schuss berechnet.
// Input: SAA-Format, relativ zum Geschoss in metern und die Zeit relativ zur Abschusszeit
void ObjectEffector::setIndendedTrajectory(const std::vector<Core::RelativePositionRelativeTime> &geometryRelativeToLaunchOrigin)
{
DEBUG_LOG() << "setTrajectory #points=" << geometryRelativeToLaunchOrigin.size();
m_intendendTrajectory.clear();
for (const Core::RelativePositionRelativeTime &geoPosRelTime : geometryRelativeToLaunchOrigin)
{
double t = geoPosRelTime.relativeTime();
double x = geoPosRelTime.offsetX();
double y = geoPosRelTime.offsetY();
double z = geoPosRelTime.offsetZ();
m_intendendTrajectory.push_back({LtsUtils::QPoint3D(x, y, z), t});
}
}
void ObjectEffector::setEffectorData(const EffectorData &effectorData)
{
DEBUG_LOG() << "setEffectorData";
m_effectorData = effectorData;
setIndendedTrajectory(effectorData.trajectoryRelative());
delete m_firingStrategy;
m_firingStrategy = FiringStrategyFactory::createFiringStrategy(this);
connect(m_firingStrategy, &AbstractFiringStrategy::signalFired,
this, &ObjectEffector::signalFired);
reportFireReadinessRequest();
}
void ObjectEffector::logMessage(QString message)
{
DEBUG_LOG() << "EffectorStateMachine logMessage=" << message << ", aesItemId=" << m_aesItemId << ", m_participantId=" << m_participantId;
}
} // namespace AreaEffectSimulation