/** * MainHandler for TetraRadio * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2016-04-14 */ #pragma once #include #include "main_handler.h" #include #include #include "training_area_telegrams.h" #include "logger.h" namespace TrainingAreaBase { class PositionHandler : public QObject { Q_OBJECT public: explicit PositionHandler(MainHandler *mainHandler); struct ParticipantPosition { TrainingAreaBase::TabPosition pos; int mountPointTypeId = 0; int buildingId = 0; int roomId = 0; qint64 time = 0; }; bool init(); Core::GeoPosition2D relativeToGeographic2D(const TetraIcd::RelativePosition &p) const; Core::GeoPosition relativeToGeographic(const TetraIcd::RelativePosition &p) const; QPointF geographicToRelativePointF(const Core::GeoPosition &p) const; QPointF geographicToRelativePointF(const Core::GeoPosition2D &p) const; TetraIcd::RelativePosition geographicToRelative(const Core::GeoPosition &p) const; TetraIcd::RelativePosition geographicToRelative(const Core::GeoPosition2D &p, double z) const; const LtsCoordTrans::UtmCoordinate &baseCoordinate() const; // checks if position was marked as invalid by sfm (0x800000 / 0x800000) static bool isPositionMarkedInvalid(const TetraIcd::RelativePosition &p) { static_assert(std::is_integral::value, "RelativePosition.offsetX must be an integer!"); static_assert(std::is_integral::value, "RelativePosition.offsetY must be an integer!"); static constexpr int invalidPos = 0x800000; static constexpr int threeBytes = 0xffffff; return ((invalidPos == (p.offsetX & threeBytes)) || (invalidPos == (p.offsetY & threeBytes))); } // Speed after Last Position to actual position double speed(const TetraIcd::RelativePosition &relPos, const int equipNo, const qint64 timeStamp) const; bool isTimeToPerformSpeedCheckExceeded(const int equipNo, const qint64 timeStamp, const int maxTime) const; void setLastPosition(int equipNo, const TrainingAreaBase::TabPosition &pos); void setLastMountPointTypeId(int equipNo, const int lastMountPointTypeId); void setLastBuildingId(int equipNo, const int lastBuildingId); void setLastRoomId(int equipNo, const int lastRoomId); void setLastTime(int equipNo, const qint64 time); TrainingAreaBase::TabPosition lastPosition(int equipNo) const; int lastMountPointTypeId(const int equipNo) const; int lastBuildingId(const int equipNo) const; int lastRoomId(const int equipNo) const; bool isInTrainingArea(const TetraIcd::RelativePosition &relPos) const; private: bool initCoordinateConversion() const; private: MainHandler *m_mainHandler; mutable std::shared_ptr m_dtcAsm; mutable LtsCoordTrans::UtmCoordinate m_utm2Geographic; QHash m_lastPosition; mutable QPointF m_relPosBottomLeft; mutable QPointF m_relPosTopRight; LOGGER_T m_logger; }; } // namespace TrainingAreaBase