/** * NgsHandler for HighLevelArchitecture * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2017-04-07 */ #include "ngs_handler.h" #include #include "ngs_connector.h" #include "socketreader.h" #include #include #include namespace HighLevelArchitecture { NgsHandler::NgsHandler(QObject *parent) : QObject(parent) , m_ddsHandler(nullptr) , m_logger(getLogger("NgsHandler")) {} NgsHandler::~NgsHandler() { m_ppmHandler = nullptr; m_aesHandler = nullptr; m_ngsConnector = nullptr; m_ddsHandler = nullptr; } bool NgsHandler::init(const std::shared_ptr &ddsHandler) { // initialize DDS m_ddsHandler = ddsHandler; QMap protToStr; protToStr.insert(ngs::IObserver::ProtocolType::DIS, QStringLiteral("DIS")); protToStr.insert(ngs::IObserver::ProtocolType::HLA, QStringLiteral("HLA")); protToStr.insert(ngs::IObserver::ProtocolType::CORBANOTIFY, QStringLiteral("CORBA")); ngs::IObserver::ProtocolType protocol = Settings::hlaProtocol(); INFO_LOG(m_logger) << "Protocol = " << protToStr.value(protocol, QStringLiteral("UNKNOWN")); m_ngsConnector = /* (protocol == ngs::IObserver::ProtocolType::DIS) ? std::make_shared(Settings::federationName(), this) : */ std::make_shared(Settings::federationName(), this); connect(m_ngsConnector.get(), &NgsConnector::firstTickFinished, this, &NgsHandler::onFirstTickFinished, Qt::UniqueConnection); return m_ngsConnector->initialize(protocol, QHostInfo::localHostName().toUpper(), QCoreApplication::applicationDirPath()); } bool NgsHandler::isConnectedToHla() const { return m_ngsConnector && m_ngsConnector->canPublishData(); } void NgsHandler::onFirstTickFinished() { m_ppmHandler = std::make_shared(this); m_aesHandler = std::make_shared(this); if (!m_ppmHandler->init()) ERROR_LOG(m_logger) << "Could not init ppm handler - not able to publish participants to HLA"; if (!m_aesHandler->init()) ERROR_LOG(m_logger) << "Could not init ppm handler - not able to publish area effect simulations to HLA"; connect(m_ppmHandler.get(), &PpmHandler::externalEquipmentNumberAdded, this, &NgsHandler::externalEquipmentNumberAdded); connect(m_ppmHandler.get(), &PpmHandler::externalEquipmentNumberRemoved, this, &NgsHandler::externalEquipmentNumberRemoved); connect(this, &NgsHandler::participantInitRequest, m_ppmHandler.get(), &PpmHandler::participantInitRequest); connect(this, &NgsHandler::participantVulnerabilityStateRequest, m_ppmHandler.get(), &PpmHandler::participantVulnerabilityStateRequest); connect(this, &NgsHandler::participantCesHitInformationRequest, m_ppmHandler.get(), &PpmHandler::participantCesHitInformationRequest); initSocketReaders(); } void NgsHandler::initSocketReaders() { if (!m_socketReaders.isEmpty()) deInitSocketReaders(); for (const Settings::SocketData& sd : Settings::socketDataList()) { SocketReader *sr = new SocketReader(); if ( sr->init(sd.hostname, sd.port, sd.hlaRequestIdentifier) ) { sr->start(); connect(sr, &SocketReader::newData, this, &NgsHandler::onNewSocketReaderData); m_socketReaders.append(sr); INFO_LOG(m_logger) << "SocketReader with ID " << sd.hlaRequestIdentifier << " connected"; } else { ERROR_LOG(m_logger) << "Could not initialize SocketReader " << sd.hlaRequestIdentifier; } } } void NgsHandler::deInitSocketReaders() { for (SocketReader *sr : qAsConst(m_socketReaders)) sr->stopThread(); // calls deleteLater(), therefore we can m_socketReaders.clear(); // drop the pointers here } void NgsHandler::onNewSocketReaderData(const QByteArray &data, int hlaRequestIdentifier) { // Todo: Statically sending to to IDT now. Map this by Reader-Instance and RequestIdentifier later? m_ngsConnector->sendData(Settings::hlaPlayerIdIDT(), data, hlaRequestIdentifier); } } // namespace HighLevelArchitecture