#include "from_tab.h" #include "uav_ia_manager.h" #include #include #include #include #include namespace UAS { FromTab::FromTab(const std::shared_ptr &ddsHandler, const std::shared_ptr &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::id()) { return HandleState::YesConsume; } if (telegramId == Constraints::id()) { return HandleState::YesConsume; } if (telegramId == Constraints::id()) { return HandleState::YesShare; } if (telegramId == Constraints::id()) { return HandleState::YesConsume; } if (telegramId == Constraints::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; } }