/** * Convert Json from WLS to internal telegrams * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2016-09-26 */ #include "hla_handler_rx.h" #include "hla_dispatcher.h" #include #include namespace HlaJson { HlaHandlerRx::HlaHandlerRx(const std::shared_ptr &recvFromTabCb, HlaDispatcher *dispatcher) : m_rxHandler(recvFromTabCb) , m_dispatcher(dispatcher) , m_bWarnedOnce(false) , m_logger(getLogger("HlaHandlerRx")) {} bool HlaHandlerRx::handleTelegram(const QByteArray &baJson) { using namespace TrainingAreaBase::TetraIcd; if (baJson.isEmpty()) return false; const QJsonObject obj = QJsonDocument::fromJson(baJson).object(); TRACE_LOG(m_logger) << "incoming telegram: " << baJson; // const QJsonValue sendCounter = obj.value(QStringLiteral("counter")); // if (!sendCounter.isUndefined()) // { // if (!sendCounter.isDouble()) // return false; // recvCounter = sendCounter.toInt(-1); // DEBUG_LOG(m_logger) << "Incoming telegram with Id " << obj.value(QStringLiteral("type")).toString(); // if (recvCounter < 0) // return false; // } const QJsonValue typeId = obj.value(QStringLiteral("typeId")); if (!typeId.isDouble()) { ERROR_LOG(m_logger) << "Can not read type id: " << baJson; return false; } const QJsonObject data = obj.value(QStringLiteral("data")).toObject(); try { switch (typeId.toInt()) { case Constraints::id(): // 21 rxData(PositionReport::fromJson(data)); break; case Constraints::id(): // 2013 m_dispatcher->onHlaExternalConnectionStateChanged(ProxyConnectionState::fromJson(data).connectedToSystem); break; case Constraints::id(): // 2 rxData(ManipulationReport::fromJson(data)); break; case Constraints::id(): // 7 rxData(EquipmentOperationalState::fromJson(data)); break; case Constraints::id(): // 11 rxData(EquipmentConfigurationReport::fromJson(data)); break; case Constraints::id(): // 12 rxData(CtaDataError::fromJson(data)); break; case Constraints::id(): // 41 rxData(MineTriggered::fromJson(data)); break; case Constraints::id(): // 43 rxData(DefinitionIed::fromJson(data)); break; case Constraints::id(): // 44 rxData(StateIed::fromJson(data)); break; case Constraints::id(): // 45 rxData(DusSingleMineState::fromJson(data)); break; case Constraints::id(): // 52 rxData(StateChangeDirect::fromJson(data)); break; case Constraints::id(): // 53 rxData(StateChangeIndirect::fromJson(data)); break; case Constraints::id(): // 55 rxData(OperatorAction::fromJson(data)); break; case Constraints::id(): // 61 rxData(StateChange::fromJson(data)); break; case Constraints::id(): // 185 rxData(EquipmentEvent::fromJson(data)); break; case Constraints::id(): // 200 rxData(EquipmentGearAssignment::fromJson(data)); break; case Constraints::id(): // 202 rxData(EquipmentGearChargeState::fromJson(data)); break; case Constraints::id(): // 205 rxData(BiteReport::fromJson(data)); break; case Constraints::id(): // 210 rxData(EquipmentGearEvent::fromJson(data)); break; case Constraints::id(): // 213 rxData(ParticipantSwVersions::fromJson(data)); break; case Constraints::id(): // 231 rxData(ParticipantModeReport::fromJson(data)); break; case Constraints::id(): // 233 rxData(ParticipantConfigurationReport::fromJson(data)); break; case Constraints::id(): // 3004 { const auto tele = WlsParticipantsConnectionState::fromJson(data); emit participantConnectionState(tele.equipmentNumber, tele.dataCommunicationPossible); break; } default: return false; } } catch (const std::exception &e) { WARNING_LOG(m_logger) << "Could not parse json: " << e.what() << " (" << baJson << ")"; return false; } return true; } template void HlaHandlerRx::rxData(const T &data) { if (!m_rxHandler) { if (!m_bWarnedOnce) { ERROR_LOG(m_logger) << "No RecvFromTab available"; m_bWarnedOnce = true; } return; } emit m_dispatcher->wlsTelegramReceived(&data); return m_rxHandler->rxData(data); } } // namespace HlaJson