/** * @RDE_HEADER@ * Interface * $Id$ * $HeadURL$ * $Author$ */ #pragma once // Qwn #include "sim_to_situation_map_tmpl.h" #include "pdm_handler.h" #include #include #include #include #include #include #include #include #include namespace SituationMap { struct HitlineInfo // For info dialog { qint32 participantId = -1; ParticipantManagement::ParticipantPosition participantPosition; ParticipantManagement::StateInformation participantState; // contains originatorId ParticipantManagement::ParticipantPosition originatorPosition; qint32 injuryPartyId = -1; }; class LayerFactory; class PdmHandler; //------------------------------------------------------------------------------ class Participant2SituationMap final : public Sim2SituationMap , protected DdsFilterHandling { Q_OBJECT using BaseClass = SituationMap::Sim2SituationMap; using FilterClass = DdsFilterHandling; struct InternalPosition final : public ParticipantManagement::UnitPosition { Core::PositionReportingSource reportingSource; bool isUnit = true; bool bShowCenter = false; bool bIsMountedOn = false; bool bHasMountedParticipants = false; inline const Core::GeoPosition &position() const OMG_NOEXCEPT { return (isUnit && bShowCenter) ? positionCenter() : positionLeader(); } inline rti::core::int64 sampleTime() const OMG_NOEXCEPT { return (isUnit && bShowCenter) ? sampleTimeCenter() : sampleTimeLeader(); } InternalPosition() = default; explicit InternalPosition(const ParticipantManagement::UnitPosition &unitPos_param, bool bCenter) : ParticipantManagement::UnitPosition(unitPos_param) , bShowCenter(bCenter) {} }; public: Participant2SituationMap(PdmHandler *pdmHandler, ObjectFactory &objFac, const QString &layername, const char *loggerName); ~Participant2SituationMap(); // ppmParticipantInfoIfc and ocParticipantInfoIfc are optional bool init(LayerFactory *layerFactory, PluginProvider *pluginProvider); bool run() override; void stop() override; bool mapObjectsClicked(const QVector &uniqueMapIds) override; bool unifiedMapObjectData(UniqueMapId uniqueMapId, UnifiedMapObjectData &umodOut) const override; void setMovementTrackManager(const QPointer &mtMgr) { m_movementTrackManager = mtMgr; } bool enableFireEventFlashing(bool enable); bool isFireEventFlashingEnabled() const; // for hitlineInfo: bool isParticipantVisible(const int32_t participantId, bool *bParticipantExists) const; Q_SIGNALS: void hitlineOccured(const HitlineInfo &hitlineInfo); // to create Hitline (and its info dialog) void participantPositionChanged(const int32_t participantId, const Point3D &newPos); void participantOwnPositionChanged(const Point3D &newPos, int64_t sampleTime); // For filtering out the own position of tablet via Nmea public Q_SLOTS: void onParticipantFakeGearEventChanged(int participantId, qint64 sampleTime, SpecialChargeType specialChargeType); protected Q_SLOTS: void onPartitionTimeChanged(qint64 newPartitionTime); void onFireEventFlashTimer(); void onTypesChanged(const ParticipantManagement::Type &data, DataModification modType); void onParticipantChanged(const ParticipantManagement::Participant &data, DataModification modType); void onPositionChanged(const ParticipantManagement::ParticipantPosition &data, DataModification modType); void onUnitPositionChanged(const ParticipantManagement::UnitPosition &data, DataModification modType); void updateParticipantPosition(int participantId, bool bHandleSymbolAppearanceSettingsParticipant = true); void updateParticipantPosition(const InternalPosition &pos, bool bHandleSymbolAppearanceSettingsParticipant = true); // void updateParticipantPosition(RefPointer mapObj, int participantId); void onDynamicParticipantDataChanged(const ParticipantManagement::DynamicParticipantData &data, DataModification modType); void onBiteChanged(const ParticipantManagement::Bite &data, DataModification modType); void onParticipantGearEventChanged(const ParticipantManagement::ParticipantGearEvent &data, DataModification modType); void onAesItemViewChanged(const AreaEffectSimulation::AesItemView &data, DataModification modType); void onDusMineStateChanged(const AreaEffectSimulation::DusMineState &data, DataModification modType); void onMovementTrackActivityChanged(int trackId, bool active); void onMovementTrackRemoved(int trackId); void addToUpdateNotify(const RefPointer &mapObj); void notifyMapAboutModifedObjects(); protected: void updateHierarchyLevels(); int participantHierachyLevel(const ParticipantManagement::Participant &data) const; QString layernameWithHierachy(qint32 hierachyLevel) const; QString layernameWithHierachy(const Sim2SituationMap::DDS_T &ddsData) const override; bool isElapsed(const ParticipantManagement::Participant &data) const override; void checkForUnknownOriginatorsParticipant(int possibleOriginatorParticipantId); void checkForUnknownOriginatorsAes(int possibleOriginatorEffectSimId); bool updateDynamicParticipantData(RefPointer mapObj, const ParticipantManagement::DynamicParticipantData &data); int32_t getSimId(const Sim2SituationMap::DDS_T &ddsData) const override; bool updateElementImpl(const ParticipantManagement::Participant &ddsData, RefPointer mapObj) override; bool removeElement(const int32_t simId) override; void updateGearEvents(bool doUpdateView = false); // to let the participant flash void updateGearEventInternal(bool doUpdateView, qint64 curPartitionTimeMSec, qint64 fireEventFlashingDurationMSec, const QSet &particpantIdsWithGearEvents); bool symbolAppearanceSettingsChangesAreRelevant(const FilterManagement::SymbolAppearanceSettings::Settings & /*newSas*/) const override { return true; } void handleSymbolAppearanceSettings(RefPointer &mapObj) override; void onSymbolAppearanceSettingsChanged(FilterManagement::SymbolAppearanceSettings::Part part) override; bool hasBitError(const ParticipantManagement::DynamicParticipantData &dpd) const; bool isOutOfDate(const InternalPosition &pos) const; bool isSimulatedPosition(const InternalPosition &pos) const; void handleSymbolAppearanceSettingsParticipant(int participantId); void handleSymbolAppearanceSettingsParticipant(RefPointer &mapObj, const ParticipantManagement::Participant &participant); void handleSymbolAppearanceSettingsParticipant(RefPointer &mapObj, const ParticipantManagement::Participant &participant, const InternalPosition &pPos, const ParticipantManagement::DynamicParticipantData &dpd); private: LayerFactory *m_layerFactory = nullptr; PluginProvider *m_pluginProvider = nullptr; QTimer *m_notifiyTimer = nullptr; std::shared_ptr m_aesDtc; std::shared_ptr m_ppmDtc; std::shared_ptr m_ppmParticipantInfoIfc; std::shared_ptr m_ocParticipantInfoIfc; // some lookupTables: QHash m_types; QHash m_participants; QHash m_participantPositions; QHash m_participantDynamicData; QHash m_participantGearEvents; // for fireEventFlashing, QHash m_lrfParticipantFakeGearEvents; // for fireEventFlashing, / caused by Hitline(LRF, LTD) QHash m_ltdParticipantFakeGearEvents; // for fireEventFlashing, / caused by Hitline(LRF, LTD) QHash m_participantsWithProperties; // participantId, isArtillery(feuereinheit) QVector> m_unknownOriginatorsParticipant; // QVector> m_unknownOriginatorsAes; // QSet m_participantWithMaybeMissingPartyId; // originatorType==DusMine QHash m_aesItemView2PartyId; // QVector> m_objectsToUpdate; QSet m_hasBiteError; PdmHandler *m_pdmHandler; bool m_bShowCenterPositions = false; QTimer *m_fireEventFlashTimer = nullptr; int m_fireEventFlashTriState = 0; bool m_fireEventFlashEnable = true; QPointer m_movementTrackManager; }; } // namespace