Files
qt5-legatus-legacy/Lts/Services/AreaEffectSimulation/EffectorFiringStrategy/smart_firing_strategy.cpp
T
2026-08-13 18:33:10 +02:00

103 lines
3.3 KiB
C++
Executable File

/**
* Effector Firing Strategy for SMart
* $Id$
* $HeadURL$
* $Author$
* Created by Norbert Thoden, ESVG, 2026-05-20
*/
#include "smart_firing_strategy.h"
#include "object_effector.h"
#include <LtsCoordTrans/lts_coord_trans.h>
#include <TrainingAreaBase/Plugins/AdlerJson/telegrams.h>
#include <TrajectorySplitter/trajectory_splitter.h>
#include <QJsonDocument>
#include <QJsonObject>
namespace AreaEffectSimulation
{
SmartFiringStrategy::SmartFiringStrategy(ObjectEffector *effector)
: BaseClass(effector)
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
DEBUG_LOG(m_logger) << "using SmartFiringStrategy";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
SmartFiringStrategy::~SmartFiringStrategy()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
void SmartFiringStrategy::doFiring()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
// by default, following is done
// - calculateDispersionTrajectory
// - calc new target
// - calc matching trajectory
// (intendendTrajectory -> m_transformedTrajectory)
// - sendChargeEffect
// - emit signalFired
// for SMArt, calculateDispersionTrajectory is not necessary
// But we have to split the tow-in-one trajectory:
const qint64 trajectoryStartTime = getStartTime();
//
// first check, if trajectory is a tow-in-one trajectory:
//
// convert from intendendTrajectory (relativ) to TRAJECTORY_TYPE (absolute)
// The TrajectorySplitter needs TRAJECTORY_TYPE
// using TRAJECTORY_TYPE = std::vector<Core::GeoPositionRelativeTime>;
const auto &intendendTrajectory = m_effector->intendendTrajectory();
const auto &trajGeometry = buildTrajectoryGeometry(intendendTrajectory);
// split and avoid copying:
const TrajectorySplitter<std::vector<Core::GeoPositionRelativeTime>> splitter(trajGeometry);
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();
DEBUG_LOG(m_logger) << "splitter: " << " rawTrajectorySize = " << splitter.rawTrajectorySize();
DEBUG_LOG(m_logger) << "splitter: " << " trajGeo1 = " << trajGeo1.size();
DEBUG_LOG(m_logger) << "splitter: " << " trajGeo2 = " << trajGeo2.size();
//
// and second, process both Trajectories/Impacts
//
// ToDo: Check, how oftem signalFired should be fired?
QVector<int> chargeEffectIds;
if (trajGeo1.size() > 2)
{
const auto &trajTimeAware = buildTrajectoryTimeAware(trajGeo1, trajectoryStartTime, 0);
const int chargeEffectId = sendChargeEffect(trajTimeAware);
chargeEffectIds << chargeEffectId;
DEBUG_LOG(m_logger) << "Trajectory1 - created ChargeEffectId: " << chargeEffectId;
}
if (trajGeo2.size() > 2)
{
const auto &trajTimeAware = buildTrajectoryTimeAware(trajGeo2, trajectoryStartTime, 1);
const int chargeEffectId = sendChargeEffect(trajTimeAware);
chargeEffectIds << chargeEffectId;
DEBUG_LOG(m_logger) << "Trajectory2 - created ChargeEffectId: " << chargeEffectId;
}
if (chargeEffectIds.size())
emit signalFired(m_effector->participantId(), m_effector->aesItemId(), chargeEffectIds);
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
} // namespace AreaEffectSimulation