Files
qt5-legatus-legacy/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/gmlrs_firing_strategy.cpp
T
torstenandCopilot 3028302f7b 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>
2026-09-15 18:20:51 +00:00

94 lines
3.1 KiB
C++
Executable File

/**
* Effector Firing Strategy for GMLRS
* $Id$
* $HeadURL$
* $Author$
* Created by Hannes Fritsche, ESZS, 2026-05-12
*/
#include "gmlrs_firing_strategy.h"
#include "object_effector.h"
#include <TrainingAreaBase/Plugins/AdlerJson/telegrams.h>
#include <Trajectory/trajectory_transform.h>
#include <LtsCoordTrans/lts_coord_trans.h>
#include <QJsonDocument>
#include <QJsonObject>
namespace AreaEffectSimulation
{
GmlrsFiringStrategy::GmlrsFiringStrategy(ObjectEffector *effector)
: BaseClass(effector)
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
init();
DEBUG_LOG(m_logger) << "using GmlrsFiringStrategy";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
GmlrsFiringStrategy::~GmlrsFiringStrategy()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
bool GmlrsFiringStrategy::doFiring()
{
m_transformedTrajectory = TrajectoryTransform::transformToNewTarget(m_effector->intendendTrajectory(), m_impactPoints.at(m_impactPointIndex++));
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 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()
{
using namespace AdlerJson;
m_impactPointIndex = 0;
m_impactPoints.clear();
const QJsonObject &properties = QJsonDocument::fromJson(QByteArray::fromStdString(m_effector->effectorData().properties())).object();
const Core::GeoPosition &geoStartPos = participantPosition(m_effector->participantId());
const LtsCoordTrans::UtmCoordinate &utmStartPos = LtsCoordTrans::UtmCoordinate::fromGeographic(geoStartPos.lon(), geoStartPos.lat());
bool bOk = false;
WirkmittelFeuerkommandoRakete wirkmittel;
wirkmittelFeuerkommandoRaketeFromJson(properties, wirkmittel, bOk);
for (const Treffpunkt &treffpunkt : qAsConst(wirkmittel.treffpunkte))
{
const LtsCoordTrans::UtmCoordinate utmTreffpunkt =
LtsCoordTrans::UtmCoordinate::fromGeographic(treffpunkt.koordinate.koordinate.longitude * LtsCoordTrans::deg2rad(),
treffpunkt.koordinate.koordinate.latitude * LtsCoordTrans::deg2rad());
const LtsUtils::QPoint3D relImpactPoint(utmTreffpunkt.x - utmStartPos.x,
utmTreffpunkt.y - utmStartPos.y,
treffpunkt.koordinate.hoehe);
for (int anzahlCounter = 1; anzahlCounter <= treffpunkt.anzahl; ++anzahlCounter)
m_impactPoints.append(relImpactPoint);
}
DEBUG_LOG(m_logger) << "Got " << m_impactPoints.size() << " impact points";
}
} // namespace AreaEffectSimulation