/** * Convert telegrams to Json and sent to WLS proxy * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2016-09-26 */ #include "hla_handler_tx.h" #include #include namespace HlaJson { HlaHandlerTx::HlaHandlerTx(TrainingAreaBase::Plugin::DataProvider *pdp) : m_pdp(pdp) , m_webSocket(nullptr) , m_bHlaConnectedToExternalSystem(false) , m_logger(getLogger("HlaHandlerTx")) {} void HlaHandlerTx::onHlaConnected(QWebSocket *webSocket) { m_webSocket = webSocket; if (!m_webSocket) return; NOTICE_LOG(m_logger) << "Connected to HLA - sending exercise state data"; const auto tele = m_pdp->exerciseStateData(); sendToTx(&tele, true); } void HlaHandlerTx::onHlaDisconnected() { m_webSocket = nullptr; } void HlaHandlerTx::onHlaConnectedToExternalSystem(bool bConnected) { m_bHlaConnectedToExternalSystem = bConnected; } TrainingAreaBase::SendToTab::HandleState HlaHandlerTx::canHandleTelegram(int equipmentNumber, int telegramId) const { if (!m_webSocket || !m_bHlaConnectedToExternalSystem) return HandleState::No; using namespace TrainingAreaBase::TetraIcd; if (telegramId == Constraints::id() || telegramId == Constraints::id()) return HandleState::YesShare; if (equipmentNumber <= 0 || !m_dataCommunicationPossible.value(equipmentNumber, false)) return HandleState::No; if (telegramId == Constraints::id() || telegramId == Constraints::id() || telegramId == Constraints::id() || telegramId == Constraints::id() || telegramId == Constraints::id() ) return HandleState::YesConsume; // currently no data to wls, TODO return HandleState::No; } void HlaHandlerTx::resetSendCounter() { // nothing to do } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::Acknowledge &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::DemandBite &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::Init &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::SetVulnerabilityModel &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::DemandEquipmentConfigurationReport &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::DemandVulnerabilityStateChange &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::LanguageSelection &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::EquipmentMessage &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::EquipmentMessageOC &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::CreateSingleExplosion &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::CreateAreaExplosion &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::CreateMineArea &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::MineAreaSingleMineState &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::CreateNContamination &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::CreateCContamination &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::DeactivateEffectSimulation &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::ModifyAreaEffectSimulationName &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::PauseEffectSimulation &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::ResumeEffectSimulation &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::MineTriggered &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::DusMineReactivation &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::CreateFunctionalArea &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::CreateDusSingleMine &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::ExerciseEnvironmentData &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::ExerciseStateData &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::OpaquePayloadDataOut &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::ParticipantSwVersionsRequest &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::TechnicalArea &data) { Q_UNUSED(data); return false; // only for Tetra - really? } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::SetDevicePowerRequest &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::UAVPerformMission &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::UAVChangeState &data) { Q_UNUSED(data); return false; } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::CesHitInformation &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::CesHitRequest &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::ParticipantMode &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::DemandParticipantMode &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::ParticipantConfiguration &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::DemandParticipantConfiguration &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::ExerciseEquipmentAssignmentComplete &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::Sanitation &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::SelectiveReammunition &data) { return sendToTx(&data); } bool HlaHandlerTx::txData(const TrainingAreaBase::TetraIcd::OcCommand &data) { return sendToTx(&data); } void HlaHandlerTx::onParticipantConnectionState(int equipmentNumber, bool dataCommunicationPossible) { INFO_LOG(m_logger) << "onParticipantConnectionState - " << equipmentNumber << ", communication possible: " << dataCommunicationPossible; if (equipmentNumber == -1) m_dataCommunicationPossible.clear(); m_dataCommunicationPossible[equipmentNumber] = dataCommunicationPossible; } bool HlaHandlerTx::sendToTx(const TrainingAreaBase::TetraIcd::TrainingAreaTelegram *data, bool bForce) { if (!m_webSocket || (!m_bHlaConnectedToExternalSystem && !bForce)) return false; QJsonObject obj; obj[QStringLiteral("data")] = data->toJson(); obj[QStringLiteral("type")] = data->type(); obj[QStringLiteral("typeId")] = data->id(); // if (data->id() != TrainingAreaBase::TetraIcd::TelegramId::BESTAETIGUNG) // obj[QStringLiteral("counter")] = m_sendCounter++; const QByteArray ba = QJsonDocument(obj).toJson(QJsonDocument::Compact); if (data->id() != TrainingAreaBase::TetraIcd::TelegramId::BESTAETIGUNG) DEBUG_LOG(m_logger) << "Sending tele: " << ba; m_webSocket->sendTextMessage(QString::fromUtf8(ba)); return true; } } // namespace HlaJson