Skip to content
Snippets Groups Projects
HDDisplay.h 6.39 KiB
Newer Older
  • Learn to ignore specific revisions
  • pixhawk's avatar
    pixhawk committed
    /*=====================================================================
    
    PIXHAWK Micro Air Vehicle Flying Robotics Toolkit
    
    (c) 2009, 2010 PIXHAWK PROJECT  <http://pixhawk.ethz.ch>
    
    This file is part of the PIXHAWK project
    
        PIXHAWK 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.
    
        PIXHAWK 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 PIXHAWK. If not, see <http://www.gnu.org/licenses/>.
    
    ======================================================================*/
    
    /**
     * @file
     *   @brief Definition of Head Down Display (HDD)
     *
     *   @author Lorenz Meier <mavteam@student.ethz.ch>
     *
     */
    
    #ifndef HDDISPLAY_H
    #define HDDISPLAY_H
    
    #include <QtGui/QWidget>
    #include <QColor>
    #include <QTimer>
    #include <QFontDatabase>
    
    pixhawk's avatar
    pixhawk committed
    #include <QMap>
    #include <QPair>
    
    pixhawk's avatar
    pixhawk committed
    #include <cmath>
    
    #include "UASInterface.h"
    
    namespace Ui {
        class HDDisplay;
    }
    
    class HDDisplay : public QWidget {
        Q_OBJECT
    public:
    
    pixhawk's avatar
    pixhawk committed
        HDDisplay(QStringList* plotList, QWidget *parent = 0);
    
    pixhawk's avatar
    pixhawk committed
        ~HDDisplay();
    
    public slots:
        /** @brief Update a HDD value */
        void updateValue(UASInterface* uas, QString name, double value, quint64 msec);
        void start();
        void stop();
        void setActiveUAS(UASInterface* uas);
    
        protected slots:
        void paintGL();
    
    pixhawk's avatar
    pixhawk committed
    
    protected:
        void changeEvent(QEvent *e);
        void paintEvent(QPaintEvent * event);
        float refLineWidthToPen(float line);
        float refToScreenX(float x);
        float refToScreenY(float y);
        void rotatePolygonClockWiseRad(QPolygonF& p, float angle, QPointF origin);
        void drawPolygon(QPolygonF refPolygon, QPainter* painter);
        void drawLine(float refX1, float refY1, float refX2, float refY2, float width, const QColor& color, QPainter* painter);
        void drawEllipse(float refX, float refY, float radiusX, float radiusY, float startDeg, float endDeg, float lineWidth, const QColor& color, QPainter* painter);
        void drawCircle(float refX, float refY, float radius, float startDeg, float endDeg, float lineWidth, const QColor& color, QPainter* painter);
    
        void drawChangeRateStrip(float xRef, float yRef, float height, float minRate, float maxRate, float value, QPainter* painter);
        void drawChangeIndicatorGauge(float xRef, float yRef, float radius, float expectedMaxChange, float value, const QColor& color, QPainter* painter, bool solid=true);
        void drawGauge(float xRef, float yRef, float radius, float min, float max, const QString name, float value, const QColor& color, QPainter* painter, QPair<float, float> goodRange, QPair<float, float> criticalRange, bool solid=true);
        void drawSystemIndicator(float xRef, float yRef, int maxNum, float maxWidth, float maxHeight, QPainter* painter);
        void paintText(QString text, QColor color, float fontSize, float refX, float refY, QPainter* painter);
    
    
        UASInterface* uas;                 ///< The uas currently monitored
        QMap<QString, float> values;       ///< The variables this HUD displays
        QMap<QString, float> valuesDot;    ///< First derivative of the variable
        QMap<QString, float> valuesMean;   ///< Mean since system startup for this variable
        QMap<QString, int> valuesCount;    ///< Number of values received so far
    
    pixhawk's avatar
    pixhawk committed
        QMap<QString, quint64> lastUpdate; ///< The last update time for this variable
    
        QMap<QString, float> minValues;    ///< The minimum value this variable is assumed to have
        QMap<QString, float> maxValues;    ///< The maximum value this variable is assumed to have
    
    pixhawk's avatar
    pixhawk committed
        QMap<QString, QPair<float, float> > goodRanges; ///< The range of good values
        QMap<QString, QPair<float, float> > critRanges; ///< The range of critical values
    
        double scalingFactor;      ///< Factor used to scale all absolute values to screen coordinates
    
    pixhawk's avatar
    pixhawk committed
        float xCenterOffset, yCenterOffset; ///< Offset from center of window in mm coordinates
    
        float vwidth;              ///< Virtual width of this window, 200 mm per default. This allows to hardcode positions and aspect ratios. This virtual image plane is then scaled to the window size.
        float vheight;             ///< Virtual height of this window, 150 mm per default
    
    pixhawk's avatar
    pixhawk committed
    
    
        int xCenter;               ///< Center of the HUD instrument in pixel coordinates. Allows to off-center the whole instrument in its OpenGL window, e.g. to fit another instrument
        int yCenter;               ///< Center of the HUD instrument in pixel coordinates. Allows to off-center the whole instrument in its OpenGL window, e.g. to fit another instrument
    
    pixhawk's avatar
    pixhawk committed
    
        // HUD colors
        QColor backgroundColor;    ///< Background color
        QColor defaultColor;       ///< Color for most HUD elements, e.g. pitch lines, center cross, change rate gauges
        QColor setPointColor;      ///< Color for the current control set point, e.g. yaw desired
        QColor warningColor;       ///< Color for warning messages
        QColor criticalColor;      ///< Color for caution messages
        QColor infoColor;          ///< Color for normal/default messages
        QColor fuelColor;          ///< Current color for the fuel message, can be info, warning or critical color
    
        // Blink rates
        int warningBlinkRate;      ///< Blink rate of warning messages, will be rounded to the refresh rate
    
        QTimer* refreshTimer;      ///< The main timer, controls the update rate
        QPainter* hudPainter;
        QFont font;                ///< The HUD font, per default the free Bitstream Vera SANS, which is very close to actual HUD fonts
        QFontDatabase fontDatabase;///< Font database, only used to load the TrueType font file (the HUD font is directly loaded from file rather than from the system)
        bool hardwareAcceleration; ///< Enable hardware acceleration
    
        float strongStrokeWidth;   ///< Strong line stroke width, used throughout the HUD
        float normalStrokeWidth;   ///< Normal line stroke width, used throughout the HUD
        float fineStrokeWidth;     ///< Fine line stroke width, used throughout the HUD
    
    
    pixhawk's avatar
    pixhawk committed
        QStringList* acceptList;   ///< Variable names to plot
    
    
        quint64 lastPaintTime;     ///< Last time this widget was refreshed
    
    
    pixhawk's avatar
    pixhawk committed
    private:
        Ui::HDDisplay *m_ui;
    };
    
    #endif // HDDISPLAY_H