- 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>
243 lines
6.0 KiB
C++
Executable File
243 lines
6.0 KiB
C++
Executable File
|
|
|
|
|
|
#include "from_tab.h"
|
|
#include "uav_ia_manager.h"
|
|
|
|
#include <NGLLogger/NGLLoggerBootstrap.h>
|
|
#include <ProjectDataManagement/pdm_dtc.h>
|
|
#include <TrainingAreaBase/recv_from_tab.h>
|
|
|
|
#include <QJsonDocument>
|
|
#include <QJsonObject>
|
|
|
|
|
|
namespace UAS
|
|
{
|
|
FromTab::FromTab(const std::shared_ptr<TrainingAreaBase::DdsHandler> &ddsHandler,
|
|
const std::shared_ptr<TrainingAreaBase::RecvFromTab> &sendToDds,
|
|
UAVInterfaceAdapterManager *uavIAManager, int exerciseId)
|
|
: m_isConnected(false)
|
|
, m_dtcPdm(ProjectDataManagement::Interface::Dtc::create(ddsHandler->ddsConnector()))
|
|
, m_dtcPpm(ParticipantManagement::Interface::Dtc::create(ddsHandler->ddsConnector()))
|
|
, m_sendToDds(sendToDds)
|
|
, m_uavIAManager(uavIAManager)
|
|
, m_exerciseId(exerciseId)
|
|
, m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("FromTab"))
|
|
{
|
|
m_dtcPpm->enableUAS();
|
|
m_dtcPpm->enableParticipant();
|
|
}
|
|
|
|
|
|
TrainingAreaBase::SendToTab::HandleState FromTab::canHandleTelegram(int equipmentNumber, int telegramId) const
|
|
{
|
|
bool found = false;
|
|
const auto &uasList = m_dtcPpm->uASs();
|
|
|
|
for (const auto &uas : uasList)
|
|
{
|
|
if (uas.exerciseId() != m_exerciseId)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
const auto &part = m_dtcPpm->participant(uas.participantId());
|
|
if (!part.equipmentNumber().is_set())
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (part.equipmentNumber().get() == equipmentNumber)
|
|
{
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
using namespace TrainingAreaBase::TetraIcd;
|
|
|
|
if (!found)
|
|
{
|
|
return HandleState::No;
|
|
}
|
|
|
|
if (telegramId == Constraints<UAVPerformMission>::id())
|
|
{
|
|
return HandleState::YesConsume;
|
|
}
|
|
|
|
if (telegramId == Constraints<UAVChangeState>::id())
|
|
{
|
|
return HandleState::YesConsume;
|
|
}
|
|
|
|
if (telegramId == Constraints<CesHitRequest>::id())
|
|
{
|
|
return HandleState::YesShare;
|
|
}
|
|
|
|
if (telegramId == Constraints<DemandVulnerabilityStateChange>::id())
|
|
{
|
|
return HandleState::YesConsume;
|
|
}
|
|
|
|
if (telegramId == Constraints<Init>::id())
|
|
{
|
|
return HandleState::YesConsume;
|
|
}
|
|
|
|
return HandleState::No;
|
|
}
|
|
|
|
bool FromTab::txData(const TrainingAreaBase::TetraIcd::Init &data)
|
|
{
|
|
if (!data.resetVulnerabilityState)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
|
|
TrainingAreaBase::TetraIcd::StateChange msg;
|
|
msg.header.equipmentNumber = data.header.equipmentNumber;
|
|
msg.header.timeStamp = QDateTime::currentMSecsSinceEpoch();
|
|
msg.originatorId = data.workstationId;
|
|
msg.originatorType = TrainingAreaBase::TetraIcd::OriginatorType::ExerciseControl;
|
|
msg.tasVitality = 100;
|
|
msg.vulnerabilityBits = 0;
|
|
msg.vulnerabilityState = TrainingAreaBase::TetraIcd::VulnerabilityState::CombatReady;
|
|
|
|
m_sendToDds->rxData(msg);
|
|
return true;
|
|
}
|
|
|
|
|
|
bool FromTab::txData(const TrainingAreaBase::TetraIcd::UAVPerformMission &data)
|
|
{
|
|
const int eqId = data.header.equipmentNumber;
|
|
DEBUG_LOG() << "eqId: " << eqId;
|
|
const ParticipantManagement::Participant p = m_dtcPpm->participant(m_dtcPpm->participantIdByEquipmentNumber(eqId));
|
|
|
|
if (p.id() <= 0)
|
|
{
|
|
WARNING_LOG() << "participant not found - stop";
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
const auto &action = data.actions.front();
|
|
|
|
if (!m_uavIAManager->waypoint(p.id(), action.absPosition, QStringLiteral("%1_%2").arg(data.missionId).arg(data.missionName)))
|
|
{
|
|
WARNING_LOG() << "sending waypoint failed!";
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
bool FromTab::txData(const TrainingAreaBase::TetraIcd::UAVChangeState &data)
|
|
{
|
|
const int eqId = data.header.equipmentNumber;
|
|
const ParticipantManagement::Participant p = m_dtcPpm->participant(m_dtcPpm->participantIdByEquipmentNumber(eqId));
|
|
|
|
if (p.id() <= 0)
|
|
{
|
|
WARNING_LOG() << "participant not found - stop";
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
switch (data.requestedState)
|
|
{
|
|
case TrainingAreaBase::TetraIcd::UAVState::Auto:
|
|
return m_uavIAManager->tryChangeModeToAuto(p.id());
|
|
default:
|
|
return true;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
bool FromTab::txData(const TrainingAreaBase::TetraIcd::CesHitRequest &data)
|
|
{
|
|
|
|
|
|
DEBUG_LOG() << "data.chargeTasCodeDirect = " << data.chargeTasCodeDirect;
|
|
|
|
|
|
if (!m_dtcPdm->isJamming(data.chargeTasCodeDirect,0,0))
|
|
{
|
|
WARNING_LOG() << "not jamming";
|
|
return false;
|
|
}
|
|
|
|
DEBUG_LOG() << "participantEventChanged: JAMMING! chargetasCodeDirect = " << data.chargeTasCodeDirect;
|
|
|
|
const int eqId = data.header.equipmentNumber;
|
|
const ParticipantManagement::Participant p = m_dtcPpm->participant(m_dtcPpm->participantIdByEquipmentNumber(eqId));
|
|
|
|
if (p.id() <= 0)
|
|
{
|
|
WARNING_LOG() << "participant not found - stop";
|
|
return false;
|
|
}
|
|
|
|
m_uavIAManager->kill(p.id());
|
|
|
|
TrainingAreaBase::TetraIcd::StateChangeDirect msg;
|
|
msg.chargeTypeId = data.chargeTasCodeDirect;
|
|
msg.header.equipmentNumber = eqId;
|
|
msg.header.timeStamp = data.header.timeStamp;
|
|
msg.vulnerabilityState = TrainingAreaBase::TetraIcd::VulnerabilityState::CatastrophicKill;
|
|
msg.originatorId = data.originatorEquipmentNumber;
|
|
|
|
DEBUG_LOG() << "sending state change direct (kill) with jamming for eqId " << msg.header.equipmentNumber;
|
|
|
|
m_sendToDds->rxData(msg);
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
bool FromTab::txData(const TrainingAreaBase::TetraIcd::DemandVulnerabilityStateChange &data)
|
|
{
|
|
const auto p = m_dtcPpm->participantIdByEquipmentNumber(data.header.equipmentNumber);
|
|
|
|
|
|
|
|
const auto &pData = m_dtcPpm->dynamicParticipantData(p);
|
|
for (const auto &dyn : pData.stateHistory())
|
|
{
|
|
if (dyn.vulnerabilityState() == ProjectDataManagement::VulnerabilityState::CatastrophicKill)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
TrainingAreaBase::TetraIcd::StateChange msg;
|
|
msg.header.equipmentNumber = data.header.equipmentNumber;
|
|
msg.header.timeStamp = QDateTime::currentMSecsSinceEpoch();
|
|
msg.originatorId = data.workstationId;
|
|
msg.originatorType = TrainingAreaBase::TetraIcd::OriginatorType::ExerciseControl;
|
|
msg.tasVitality = 0;
|
|
msg.vulnerabilityBits = 0;
|
|
msg.vulnerabilityState = data.reqestedState;
|
|
|
|
m_sendToDds->rxData(msg);
|
|
return true;
|
|
}
|
|
|
|
bool FromTab::txData(const TrainingAreaBase::TetraIcd::OcCommand &data)
|
|
{
|
|
Q_UNUSED(data)
|
|
return false;
|
|
}
|
|
|
|
}
|