/** * Convert telegrams to Json and sent to WLS proxy * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2016-09-26 */ #include "wls_handler_tx.h" #include "wls_dispatcher.h" #include #include #include #include #include namespace WlsTetra { WlsHandlerTx::WlsHandlerTx(TrainingAreaBase::Plugin::DataProvider *pdp, WlsDispatcher *dispatcher) : m_pdp(pdp) , m_webSocket(nullptr) , m_dispatcher(dispatcher) , m_bWlsConnectedToExternalSystem(false) , m_logger(getLogger("WlsHandlerTx")) {} void WlsHandlerTx::onWlsConnected(QWebSocket *webSocket) { m_webSocket = webSocket; if (!m_webSocket) return; NOTICE_LOG(m_logger) << "Connected to WLS - sending exercise state data and exequipment exercise mapping"; const auto eea = m_pdp->exerciseEquipmentAssignment(); sendToTx(&eea, true); const auto esd = m_pdp->exerciseStateData(); sendToTx(&esd, true); } void WlsHandlerTx::onWlsDisconnected() { m_webSocket = nullptr; } void WlsHandlerTx::onWlsConnectedToExternalSystem(bool bConnected) { m_bWlsConnectedToExternalSystem = bConnected; } TrainingAreaBase::SendToTab::HandleState WlsHandlerTx::canHandleTelegram(int equipmentNumber, int telegramId) const { if (!m_webSocket || !m_bWlsConnectedToExternalSystem) 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() || telegramId == Constraints::id() || telegramId == Constraints::id() || 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 WlsHandlerTx::resetSendCounter() { // nothing to do } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::Acknowledge &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::DemandBite &data) { return sendToTxBinary(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::Init &data) { return sendToTxBinary(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::SetVulnerabilityModel &data) { return sendToTxBinary(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::DemandEquipmentConfigurationReport &data) { return sendToTxBinary(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::DemandVulnerabilityStateChange &data) { return sendToTxBinary(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::LanguageSelection &data) { return sendToTxBinary(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::EquipmentMessage &data) { return sendToTxBinary(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::EquipmentMessageOC &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::CreateSingleExplosion &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::CreateAreaExplosion &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::CreateMineArea &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::MineAreaSingleMineState &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::CreateNContamination &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::CreateCContamination &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::DeactivateEffectSimulation &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::ModifyAreaEffectSimulationName &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::PauseEffectSimulation &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::ResumeEffectSimulation &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::MineTriggered &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::DusMineReactivation &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::CreateFunctionalArea &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::CreateDusSingleMine &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::ExerciseEnvironmentData &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::ExerciseStateData &data) { return sendToTx(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::OpaquePayloadDataOut &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::ParticipantSwVersionsRequest &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::TechnicalArea &data) { Q_UNUSED(data); return false; // only for Tetra - really? } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::CesHitInformation &data) { Q_UNUSED(data); return false; } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::CesHitRequest &data) { return sendToTxBinary(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::ParticipantMode &data) { return sendToTxBinary(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::DemandParticipantMode &data) { return sendToTxBinary(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::ParticipantConfiguration &data) { return sendToTxBinary(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::DemandParticipantConfiguration &data) { return sendToTxBinary(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::ExerciseEquipmentAssignmentComplete &data) { return sendToTx(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::Sanitation &data) { return sendToTx(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::SelectiveReammunition &data) { return sendToTx(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::SelectiveReammunition &data) { return sendToTx(&data); } bool WlsHandlerTx::txData(const TrainingAreaBase::TetraIcd::UAVPerformMission &data) { Q_UNUSED(data); return false; } void WlsHandlerTx::onParticipantConnectionState(int equipmentNumber, bool dataCommunicationPossible) { DEBUG_LOG(m_logger) << "onParticipantConnectionState - " << equipmentNumber << ", communication possible: " << dataCommunicationPossible; m_dataCommunicationPossible[equipmentNumber] = dataCommunicationPossible; } template bool WlsHandlerTx::sendToTxBinary(const T *data) { if (!m_webSocket || !m_bWlsConnectedToExternalSystem || !data) return false; using namespace N_CoPrtCnv; CoPrtCnvRadioTelegram *radio = CoPrtCnvTelegramConverter::convertToRadio(data); if (!radio) return false; emit m_dispatcher->wlsTelegramSent(data); TrainingAreaBase::TetraIcd::WlsBinarySfmData tele; tele.header = data->header; const int offset = CoPrtCnvRadioTelegram::DATA_IND_REQ_HEADER_LENGTH; const char *dataPtr = radio->getData() + offset; tele.payload.resize(radio->getSize() - offset); memcpy(tele.payload.data(), dataPtr, tele.payload.size()); delete radio; return sendToTx(&tele, false, true); } bool WlsHandlerTx::sendToTx(const TrainingAreaBase::TetraIcd::TrainingAreaTelegram *data, bool bForce, bool bIsAlreadyLogged) { if (!m_webSocket || (!m_bWlsConnectedToExternalSystem && !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)); if (!bIsAlreadyLogged) emit m_dispatcher->wlsTelegramSent(data); return true; } } // namespace WlsTetra