/** * Retrieve data from InfrastructeManagement * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2016-04-14 */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include "logger.h" namespace TrainingAreaBase { class MainHandler; class PositionHandler; class IsmHandler : public QObject { Q_OBJECT public: struct OpsData { int opsCode = 0; int assetId = 0; // for lookup int structureElementId = 0; // for lookup int mainStructureElementId = 0; // buildingId int roomId = 0; bool opsTunnel = false; int mountingPointTypeId = 0; Core::GeoPosition position; // above ground }; explicit IsmHandler(MainHandler *mainHandler); bool init(); OpsData dataFromOpsCode(int ipsCode) ; int getAssetTypeIdFromStructureElementId (int structureElementId) {return m_structure_ElementId2AssetTypeId.value(structureElementId);} // IPS-GPS-crossing // if last valid position-report is an ips-position, next possible GPS-position is valid, if the participant has a distance to the building. bool posInExtendedBuildingFootprint(int mainStructureElementId, const Core::GeoPosition &position, const int mountPointTypeId) const; private Q_SLOTS: void onInstrumentationAssetChanged(const InfrastructureManagement::InstrumentationAsset &data, DataModification modType = DataModification::eAdded); void onMountingPointAssetChanged(const InfrastructureManagement::MountingPointAsset &data, DataModification modType = DataModification::eAdded); void onMainStructureElementChanged(const InfrastructureManagement::MainStructureElement &data, DataModification modType = DataModification::eAdded); void onMainFootprintChanged(const InfrastructureManagement::MainFootprint &data, DataModification modType); private: void rotateBuildingFootprint(int mseId); void removeOpsDataByStructureElementId(int structureElementId); void removeOpsAsset(int assetId); int getOpsCodeFromJSon(const std::string &s) const; bool getIsOpsTunnel(const std::string &s) const; void updateOpsData(OpsData &data, bool force = false); double distancePointLine(const QPointF &p, const QPointF &l1, const QPointF &l2) const; static double squareLen(const QPointF &p1, const QPointF &p2); private: MainHandler *m_mainHandler; QHash m_opsData; // key=optical Code value = OpsData //QMap m_opsAssets; // assetId -> OpsData //QMap m_opsCode2AssetId; // opsCode -> assetId QMap m_structure_ElementId2AssetTypeId; QMap m_structureElementId2AssetId; QMap m_assetId2StructureElementId; //QMap m_mainStructureElements; // key = MainStructureElementId //QMap m_mainFootprints; // key = MainStructureElementId QMap m_buildingBoundingBoxes; // key = MainStructureElementId QMap m_relBuildingFootprints; // key = MainStructureElementId QMap m_relBuildingFootprintsRotated; // key = MainStructureElementId QMap m_buildingBoundingBoxesMgrs; // key = MainStructureElementId QMap m_relBuildingFootprintsRotatedMgrs; // key = MainStructureElementId std::shared_ptr m_dtcIsm; int m_distanceIpsToGps; // IPS to GPS: minimal distance to the building to receive valid GPS messages again int m_distanceOpsToGps; // IPS to GPS: minimal distance to the building to receive valid GPS messages again LOGGER_T m_logger; }; } // namespace TrainingAreaBase