Skip to content
Snippets Groups Projects
HSIDisplay.h 9.09 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*=====================================================================
    
    
    QGroundControl Open Source Ground Control Station
    
    (c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
    
    This file is part of the QGROUNDCONTROL project
    
        QGROUNDCONTROL is free software: you can redistribute it and/or modify
    
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation, either version 3 of the License, or
        (at your option) any later version.
    
    
        QGROUNDCONTROL is distributed in the hope that it will be useful,
    
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
    
        You should have received a copy of the GNU General Public License
    
        along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
    
    
    ======================================================================*/
    
    /**
     * @file
     *   @brief Definition of of Horizontal Situation Indicator class
     *
     *   @author Lorenz Meier <mavteam@student.ethz.ch>
     *
     */
    
    #ifndef HSIDISPLAY_H
    #define HSIDISPLAY_H
    
    #include <QtGui/QWidget>
    #include <QColor>
    #include <QTimer>
    #include <QMap>
    #include <QPair>
    
    #include <QMouseEvent>
    
    #include <cmath>
    
    #include "HDDisplay.h"
    
    lm's avatar
    lm committed
    #include "MG.h"
    
    
    class HSIDisplay : public HDDisplay {
        Q_OBJECT
    public:
    
        HSIDisplay(QWidget *parent = 0);
    
    lm's avatar
    lm committed
        // ~HSIDisplay();
    
    
    public slots:
        void setActiveUAS(UASInterface* uas);
    
        /** @brief Set the width in meters this widget shows from top */
        void setMetricWidth(double width);
    
    lm's avatar
    lm committed
        void updateSatellite(int uasid, int satid, float azimuth, float direction, float snr, bool used);
    
        void updateAttitudeSetpoints(UASInterface*, double rollDesired, double pitchDesired, double yawDesired, double thrustDesired, quint64 usec);
    
    lm's avatar
    lm committed
        void updateAttitude(UASInterface* uas, double roll, double pitch, double yaw, quint64 time);
    
    lm's avatar
    lm committed
        void updatePositionSetpoints(int uasid, float xDesired, float yDesired, float zDesired, float yawDesired, quint64 usec);
    
        void updateLocalPosition(UASInterface*, double x, double y, double z, quint64 usec);
        void updateGlobalPosition(UASInterface*, double lat, double lon, double alt, quint64 usec);
    
        void updateSpeed(UASInterface* uas, double vx, double vy, double vz, quint64 time);
    
    lm's avatar
    lm committed
        void updatePositionLock(UASInterface* uas, bool lock);
    
    pixhawk's avatar
    pixhawk committed
        void updateAttitudeControllerEnabled(bool enabled);
        void updatePositionXYControllerEnabled(bool enabled);
        void updatePositionZControllerEnabled(bool enabled);
    
    pixhawk's avatar
    pixhawk committed
        /** @brief Heading control enabled/disabled */
    
        void updatePositionYawControllerEnabled(bool enabled);
    
        /** @brief Localization quality changed */
    
    pixhawk's avatar
    pixhawk committed
        void updateLocalization(UASInterface* uas, int localization);
    
        /** @brief GPS localization quality changed */
    
    pixhawk's avatar
    pixhawk committed
        void updateGpsLocalization(UASInterface* uas, int localization);
    
        /** @brief Vision localization quality changed */
    
    pixhawk's avatar
    pixhawk committed
        void updateVisionLocalization(UASInterface* uas, int localization);
    
    
        /** @brief Ultrasound/Infrared localization changed */
        void updateInfraredUltrasoundLocalization(UASInterface* uas, int fix);
    
    
    lm's avatar
    lm committed
        void paintEvent(QPaintEvent * event);
    
        /** @brief Update state from joystick */
        void updateJoystick(double roll, double pitch, double yaw, double thrust, int xHat, int yHat);
        void pressKey(int key);
    
    signals:
        void metricWidthChanged(double width);
    
    
    protected slots:
    
        void drawGPS(QPainter &painter);
        void drawObjects(QPainter &painter);
        void drawPositionDirection(float xRef, float yRef, float radius, const QColor& color, QPainter* painter);
        void drawAttitudeDirection(float xRef, float yRef, float radius, const QColor& color, QPainter* painter);
    
        void drawAltitudeSetpoint(float xRef, float yRef, float radius, const QColor& color, QPainter* painter);
    
        void drawStatusFlag(float x, float y, QString label, bool status, QPainter& painter);
        void drawPositionLock(float x, float y, QString label, int status, QPainter& painter);
    
        void setBodySetpointCoordinateXY(double x, double y);
        void setBodySetpointCoordinateZ(double z);
        /** @brief Send the current ui setpoint coordinates as new setpoint to the MAV */
        void sendBodySetPointCoordinates();
        /** @brief Draw one setpoint */
        void drawSetpointXY(float x, float y, float yaw, const QColor &color, QPainter &painter);
    
        /** @brief Draw waypoints of this system */
        void drawWaypoints(QPainter& painter);
    
        /** @brief Draw the limiting safety area */
        void drawSafetyArea(const QPointF &topLeft, const QPointF &bottomRight,  const QColor &color, QPainter &painter);
    
    pixhawk's avatar
    pixhawk committed
        /** @brief Receive mouse clicks */
    
        void mouseDoubleClickEvent(QMouseEvent* event);
    
        /** @brief Receive mouse wheel events */
        void wheelEvent(QWheelEvent* event);
    
    pixhawk's avatar
    pixhawk committed
        /** @brief Get color from GPS signal-to-noise colormap */
    
    lm's avatar
    lm committed
        static QColor getColorForSNR(float snr);
    
    pixhawk's avatar
    pixhawk committed
        /** @brief Metric world coordinates to metric body coordinates */
        QPointF metricWorldToBody(QPointF world);
        /** @brief Metric body coordinates to metric world coordinates */
        QPointF metricBodyToWorld(QPointF body);
    
        /** @brief Screen coordinates of widget to metric coordinates in body frame */
        QPointF screenToMetricBody(QPointF ref);
        /** @brief Reference coordinates to metric coordinates */
        QPointF refToMetricBody(QPointF &ref);
        /** @brief Metric coordinates to reference coordinates */
    
    pixhawk's avatar
    pixhawk committed
        QPointF metricBodyToRef(QPointF &metric);
        /** @brief Metric body coordinates to screen coordinates */
        QPointF metricBodyToScreen(QPointF metric);
    
    lm's avatar
    lm committed
    
        /**
         * @brief Private data container class to be used within the HSI widget
         */
        class GPSSatellite
        {
        public:
    
    lm's avatar
    lm committed
            GPSSatellite(int id, float elevation, float azimuth, float snr, bool used) :
    
    lm's avatar
    lm committed
                    id(id),
    
    lm's avatar
    lm committed
                    elevation(elevation),
    
    lm's avatar
    lm committed
                    azimuth(azimuth),
                    snr(snr),
    
    lm's avatar
    lm committed
                    used(used),
                    lastUpdate(MG::TIME::getGroundTimeNowUsecs())
    
    lm's avatar
    lm committed
            {
    
            }
    
    
    lm's avatar
    lm committed
            void update(int id, float elevation, float azimuth, float snr, bool used)
    
    lm's avatar
    lm committed
            {
                this->id = id;
    
    lm's avatar
    lm committed
                this->elevation = elevation;
    
    lm's avatar
    lm committed
                this->azimuth = azimuth;
                this->snr = snr;
                this->used = used;
    
    lm's avatar
    lm committed
                this->lastUpdate = MG::TIME::getGroundTimeNowUsecs();
    
    lm's avatar
    lm committed
            }
    
            int id;
    
    lm's avatar
    lm committed
            float elevation;
    
    lm's avatar
    lm committed
            float azimuth;
            float snr;
            bool used;
    
    lm's avatar
    lm committed
            quint64 lastUpdate;
    
    lm's avatar
    lm committed
    
            friend class HSIDisplay;
        };
    
    
    lm's avatar
    lm committed
        QMap<int, GPSSatellite*> gpsSatellites;
    
    pixhawk's avatar
    pixhawk committed
        unsigned int satellitesUsed;
    
        // Current controller values
        float attXSet;
        float attYSet;
        float attYawSet;
        float altitudeSet;
    
        float posXSet;
        float posYSet;
        float posZSet;
    
        // Controller saturation values
        float attXSaturation;
        float attYSaturation;
        float attYawSaturation;
    
        float posXSaturation;
        float posYSaturation;
        float altitudeSaturation;
    
        // Position
        float lat;
        float lon;
        float alt;
    
        quint64 globalAvailable;   ///< Last global position update time
    
        float x;
        float y;
        float z;
    
        float vx;
        float vy;
        float vz;
        float speed;
        quint64 localAvailable;    ///< Last local position update time
        float roll;
        float pitch;
        float yaw;
        float bodyXSetCoordinate;  ///< X Setpoint coordinate active on the MAV
        float bodyYSetCoordinate;  ///< Y Setpoint coordinate active on the MAV
        float bodyZSetCoordinate;  ///< Z Setpoint coordinate active on the MAV
        float bodyYawSet;          ///< Yaw setpoint coordinate active on the MAV
        float uiXSetCoordinate;    ///< X Setpoint coordinate wanted by the UI
        float uiYSetCoordinate;    ///< Y Setpoint coordinate wanted by the UI
        float uiZSetCoordinate;    ///< Z Setpoint coordinate wanted by the UI
        float uiYawSet;            ///< Yaw Setpoint wanted by the UI
    
        double metricWidth;        ///< Width the instrument represents in meters (the width of the ground shown by the widget)
    
        float xCenterPos;         ///< X center of instrument in virtual coordinates
        float yCenterPos;         ///< Y center of instrument in virtual coordinates
    
    lm's avatar
    lm committed
        bool positionLock;
    
        bool attControlEnabled;   ///< Attitude control enabled
        bool xyControlEnabled;    ///< Horizontal control enabled
        bool zControlEnabled;     ///< Vertical control enabled
        bool yawControlEnabled;   ///< Yaw angle position control enabled
        int positionFix;          ///< Total dimensions the MAV is localizaed in
        int gpsFix;               ///< Localization dimensions based on GPS
        int visionFix;            ///< Localizaiton dimensions based on computer vision
        int laserFix;             ///< Localization dimensions based on laser
        int iruFix;               ///< Localization dimensions based on ultrasound
    
    pixhawk's avatar
    pixhawk committed
        bool mavInitialized;      ///< The MAV is initialized once the setpoint has been received
    
    pixhawk's avatar
    pixhawk committed
        float bottomMargin;       ///< Margin on the bottom of the page, in virtual coordinates
        float topMargin;          ///< Margin on top of the page, in virtual coordinates
    
    lm's avatar
    lm committed
    
    
    private:
    };
    
    #endif // HSIDISPLAY_H