Adds NmeaManagement tests, fixes codegen includes and Qt6 SerialPort CMake target.
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 <QtCore/QJsonDocument>
|
|
#include <QtCore/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)
|
|
.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::VulnerabilityState_CombatReady;
|
|
|
|
m_sendToDds->rxData(msg);
|
|
return true;
|
|
}
|
|
|
|
|
|
bool FromTab::txData(const TrainingAreaBase::TetraIcd::UAVPerformMission &data)
|
|
{
|
|
const int eqId = data.header.equipmentNumber;
|
|
DEBUG_LOG(m_logger) << "eqId: " << eqId;
|
|
const ParticipantManagement::Participant p = m_dtcPpm->participant(m_dtcPpm->participantIdByEquipmentNumber(eqId));
|
|
|
|
if (p.id() <= 0)
|
|
{
|
|
WARNING_LOG(m_logger) << "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(m_logger) << "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(m_logger) << "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(m_logger) << "data.chargeTasCodeDirect = " << data.chargeTasCodeDirect;
|
|
|
|
|
|
if (!m_dtcPdm->isJamming(data.chargeTasCodeDirect,0,0))
|
|
{
|
|
WARNING_LOG(m_logger) << "not jamming";
|
|
return false;
|
|
}
|
|
|
|
DEBUG_LOG(m_logger) << "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(m_logger) << "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::VulnerabilityState_CatastrophicKill;
|
|
msg.originatorId = data.originatorEquipmentNumber;
|
|
|
|
DEBUG_LOG(m_logger) << "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::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;
|
|
}
|
|
|
|
}
|