- 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>
228 lines
6.9 KiB
C++
Executable File
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
|