/** * Send Participant data to NGS * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2017-04-07 */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ngs_connector.h" #include namespace LtsUtils { class RequestHelper; } namespace HighLevelArchitecture { class NgsHandler; class PpmHandler : public QObject , protected ParticipantManagement::Interface::Ftc::ModifyParticipantDataReplyHandler , protected TrainingAreaBase::Interface::Ftc::DemandInitReplyHandler , protected TrainingAreaBase::Interface::Ftc::DemandBiteReplyHandler , protected TrainingAreaBase::Interface::Ftc::SendParticipantModeReplyHandler { Q_OBJECT public: explicit PpmHandler(NgsHandler *ngsHandler); ~PpmHandler(); bool init(); ParticipantManagement::Role roleForPartyId(int partyId); ProjectDataManagement::ChargeType chargeTypeFromId(int chargeTypeId); ProjectDataManagement::ChargeType chargeTypeFromDisEntity(const std::string &disEntity); ProjectDataManagement::ChargeType chargeTypeFromDisEntity(const QString &disEntity) { return chargeTypeFromDisEntity(disEntity.toStdString()); } int partyIdFromForceIdentifier(rpr2::ForceIdentifierEnum8::ET fi); rpr2::ForceIdentifierEnum8::ET forceIdentifierFromPartyId(int partyId); void onModifyParticipantDataReply(const Core::FunctionReplyObject &replyObject) override final; void onDemandInitReply(const Core::FunctionReplyObject &reply) override final; void onSendParticipantModeReply(const Core::FunctionReplyObject &reply) override final; void onDemandBiteReply(const Core::FunctionReplyObject &reply) override final; QMap externalEquipmentNumbers() const { return m_externalEquipmentNumbers; } Q_SIGNALS: void externalEquipmentNumberAdded(int equipNo); void externalEquipmentNumberRemoved(int equipNo); private Q_SLOTS: void onTypeChanged(const ParticipantManagement::Type &data, DataModification modType); void onDynamicParticipantDataChanged(const ParticipantManagement::DynamicParticipantData &data, DataModification modType); void onParticipantChanged(const ParticipantManagement::Participant &data, DataModification modType); void onParticipantPositionChanged(const ParticipantManagement::ParticipantPosition &data, DataModification modType); void onPartyChanged(const ParticipantManagement::Party &data, DataModification modType); void onParticipantGearEventChanged(const ParticipantManagement::ParticipantGearEvent &data, DataModification modType); void onChargeTypeChanged(const ProjectDataManagement::ChargeType &data, DataModification modType); void onEquipmentBiteChanged(const TrainingAreaBase::EquipmentBite &data, DataModification modType); void onSpatialChanged(int eqId, const ParticipantPosition &pos, qint64 simTimeMSecs); bool onMarkingChanged(int eqId, const QString &marking, qint64 simTimeMSecs); void onParticipantHit(const GuezHitStruct &hitStruct); void onParticipantInit(int eqNo, bool resetManipulation, bool resupplyAmmo, bool resetVulnerabilityState); bool onExconInit(int eqNo, rpr2::ResetPlayerEnum8::ET rp, rpr2::ActivateHelmetObservationEnum8::ET aho); bool onBiteReport(const TrainingAreaBase::EquipmentBite &report); bool onBiteRequest(const TrainingAreaBase::DemandBiteRequest &request); void onManipulationChanged(int eqNo, bool playerIsManipulated, qint64 sampleTime); void onParticipantReceivedInit(int eqId, qint64 simTimeMSecs); void onWeaponFire(const TrainingAreaBase::EquipmentGearEvent &event); void onIsPartOfChanged(int eqNo, int eqNoHost, qint64 simTimeMSecs); void startPublishToNgs(); public slots: void participantInitRequest(const TrainingAreaBase::TetraIcd::Init &request); void participantBiteRequest(const TrainingAreaBase::TetraIcd::DemandBite &request); private: void createParticipant(const ParticipantManagement::Participant &participant); bool createHuman(const ParticipantManagement::Participant &participant); bool createGroundVehicle(const ParticipantManagement::Participant &participant); bool createObserverController(const ParticipantManagement::Participant &participant); bool removeParticipant(const ParticipantManagement::Participant &participant); rpr2::TacticalStatusStruct currentTacticalStatus(int participantId) const; ParticipantManagement::StateInformation currentParticipantStateInformation(int participantId) const; static ParticipantManagement::StateInformation currentParticipantStateInformation(const ParticipantManagement::DynamicParticipantData &data); std::vector currentParticipantGearInformation(int participantId) const; std::vector currentParticipantManipulationInformation(int participantId) const; ParticipantPosition getParticipantPosition(int participantId) const; int getEquipmentNo(int participantId) const; int getParticipantIdByExternalId(int externalId) const; rpr2::ForceIdentifierEnum8::ET getRprForceIdentifierFromPpmForceIdentifier(const ParticipantManagement::HlaForceIdentifierEnum &ppmForceIdentifier) const; ParticipantManagement::Type getParticipantType(int typeId); TypeStruct getTypestruct(int typeId); private: NgsHandler *m_ngsHandler; std::shared_ptr m_dtcPpm; std::shared_ptr m_ftcPpm; std::shared_ptr m_dtcPdm; std::shared_ptr m_dtsTab; std::shared_ptr m_dtcTab; std::shared_ptr m_ftcTab; std::shared_ptr m_dtcAes; QMap m_types; // By typeId QMap m_dynPartData; // By participantId QMap m_partData; // By participantId QMap m_externalEquipmentNumbers; // participantId, equipmentNumber QMap m_partPosData; // By participantId -- Positions for own Players QMap m_partyData; // By partyId QMap m_observerPositions; // By equipmentNo -- Only foreign entities QMap m_isMountedOn; // By equipmentNo of mounted participant. Value = Host QSet m_createdParticipantIds; LtsUtils::RequestHelper *m_requestHelper; QMap m_chargeTypes; NGL::INGLLogger &m_logger; }; } // namespace HighLevelArchitecture