HUD.h 10.7 KB
Newer Older
pixhawk's avatar
pixhawk committed
1 2
/*=====================================================================

3
QGroundControl Open Source Ground Control Station
pixhawk's avatar
pixhawk committed
4

5
(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
pixhawk's avatar
pixhawk committed
6

7
This file is part of the QGROUNDCONTROL project
pixhawk's avatar
pixhawk committed
8

9
    QGROUNDCONTROL is free software: you can redistribute it and/or modify
pixhawk's avatar
pixhawk committed
10 11 12 13
    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.

14
    QGROUNDCONTROL is distributed in the hope that it will be useful,
pixhawk's avatar
pixhawk committed
15 16 17 18 19
    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
20
    along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
pixhawk's avatar
pixhawk committed
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

======================================================================*/

/**
 * @file
 *   @brief Definition of Head up display
 *
 *   @author Lorenz Meier <mavteam@student.ethz.ch>
 *
 */

#ifndef HUD_H
#define HUD_H

#include <QImage>
36
#include <QWidget>
37
#include <QLabel>
pixhawk's avatar
pixhawk committed
38 39 40
#include <QPainter>
#include <QFontDatabase>
#include <QTimer>
41
#include <QVector3D>
42

pixhawk's avatar
pixhawk committed
43
#include "UASInterface.h"
44
#include "MainWindow.h"
45
#include "Vehicle.h"
pixhawk's avatar
pixhawk committed
46 47 48 49 50 51 52 53

/**
 * @brief Displays a Head Up Display (HUD)
 *
 * This class represents a head up display (HUD) and draws this HUD in an OpenGL widget (QGLWidget).
 * It can superimpose the HUD over the current live image stream (any arriving image stream will be auto-
 * matically used as background), or it draws the classic blue-brown background known from instruments.
 */
54
class HUD : public QLabel
pixhawk's avatar
pixhawk committed
55 56 57 58 59 60 61
{
    Q_OBJECT
public:
    HUD(int width = 640, int height = 480, QWidget* parent = NULL);
    ~HUD();

    void setImageSize(int width, int height, int depth, int channels);
62
    void resize(int w, int h);
pixhawk's avatar
pixhawk committed
63 64

public slots:
65
    void styleChanged(bool styleIsDark);
pixhawk's avatar
pixhawk committed
66

67
    /** @brief Attitude from main autopilot / system state */
pixhawk's avatar
pixhawk committed
68
    void updateAttitude(UASInterface* uas, double roll, double pitch, double yaw, quint64 timestamp);
69 70
    /** @brief Attitude from one specific component / redundant autopilot */
    void updateAttitude(UASInterface* uas, int component, double roll, double pitch, double yaw, quint64 timestamp);
71
//    void updateAttitudeThrustSetPoint(UASInterface*, double rollDesired, double pitchDesired, double yawDesired, double thrustDesired, quint64 usec);
dongfang's avatar
dongfang committed
72
    void updateBattery(UASInterface*, double, double, double, int);
pixhawk's avatar
pixhawk committed
73 74 75
    void receiveHeartbeat(UASInterface*);
    void updateThrust(UASInterface*, double);
    void updateLocalPosition(UASInterface*,double,double,double,quint64);
76
    void updateGlobalPosition(UASInterface*,double,double,double,double,quint64);
pixhawk's avatar
pixhawk committed
77
    void updateSpeed(UASInterface*,double,double,double,quint64);
78
    void updateState(UASInterface*,QString);
79
    void updateMode(int id,QString mode, QString description);
pixhawk's avatar
pixhawk committed
80
    void updateLoad(UASInterface*, double);
81
    void selectWaypoint(int uasId, int id);
pixhawk's avatar
pixhawk committed
82 83 84 85 86 87

    void startImage(int imgid, int width, int height, int depth, int channels);
    void setPixels(int imgid, const unsigned char* imageData, int length, int startIndex);
    void finishImage();
    void saveImage();
    void saveImage(QString fileName);
88
    void saveImages(bool save);
89 90 91 92 93 94
    /** @brief Select directory where to load the offline files from */
    void selectOfflineDirectory();
    /** @brief Enable the HUD instruments */
    void enableHUDInstruments(bool enabled);
    /** @brief Enable Video */
    void enableVideo(bool enabled);
LM's avatar
LM committed
95
    /** @brief Copy an image from the current active UAS */
Lorenz Meier's avatar
Lorenz Meier committed
96
    void copyImage(UASInterface* uas);
97

pixhawk's avatar
pixhawk committed
98 99

protected slots:
100
    void _activeVehicleChanged(Vehicle* vehicle);
pixhawk's avatar
pixhawk committed
101 102 103 104 105 106
    void paintRollPitchStrips();
    void paintPitchLines(float pitch, QPainter* painter);
    /** @brief Paint text on top of the image and OpenGL drawings */
    void paintText(QString text, QColor color, float fontSize, float refX, float refY, QPainter* painter);
    /** @brief Setup the OpenGL view for drawing a sub-component of the HUD */
    void setupGLView(float referencePositionX, float referencePositionY, float referenceWidth, float referenceHeight);
107
    void paintHUD();
pixhawk's avatar
pixhawk committed
108 109 110 111 112 113 114
    void paintPitchLinePos(QString text, float refPosX, float refPosY, QPainter* painter);
    void paintPitchLineNeg(QString text, float refPosX, float refPosY, 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);

115
    void drawChangeRateStrip(float xRef, float yRef, float height, float minRate, float maxRate, float value, QPainter* painter,bool reverse = false);
pixhawk's avatar
pixhawk committed
116 117 118 119
    void drawChangeIndicatorGauge(float xRef, float yRef, float radius, float expectedMaxChange, float value, const QColor& color, QPainter* painter, bool solid=true);

    void drawPolygon(QPolygonF refPolygon, QPainter* painter);

LM's avatar
LM committed
120 121 122
signals:
    void visibilityChanged(bool visible);

pixhawk's avatar
pixhawk committed
123 124 125 126 127 128 129 130 131 132
protected:
    void commitRawDataToGL();
    /** @brief Convert reference coordinates to screen coordinates */
    float refToScreenX(float x);
    /** @brief Convert reference coordinates to screen coordinates */
    float refToScreenY(float y);
    /** @brief Convert mm line widths to QPen line widths */
    float refLineWidthToPen(float line);
    /** @brief Rotate a polygon around a point clockwise */
    void rotatePolygonClockWiseRad(QPolygonF& p, float angle, QPointF origin);
133 134
    /** @brief Preferred Size */
    QSize sizeHint() const;
135
    /** @brief Start updating widget */
136
    void showEvent(QShowEvent* event);
137 138
    /** @brief Stop updating widget */
    void hideEvent(QHideEvent* event);
139 140
    void contextMenuEvent (QContextMenuEvent* event);
    void createActions();
141

142
    static const int updateInterval = 100;
pixhawk's avatar
pixhawk committed
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185

    QImage* image; ///< Double buffer image
    QImage glImage; ///< The background / camera image
    UASInterface* uas; ///< The uas currently monitored
    float yawInt; ///< The yaw integral. Used to damp the yaw indication.
    QString mode; ///< The current vehicle mode
    QString state; ///< The current vehicle state
    QString fuelStatus; ///< Current fuel level / battery voltage
    double scalingFactor; ///< Factor used to scale all absolute values to screen coordinates
    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
    float vGaugeSpacing; ///< Virtual spacing of the gauges from the center, 50 mm per default
    float vPitchPerDeg; ///< Virtual pitch to mm conversion. Currently one degree is 3 mm up/down in the pitch markings

    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

    // Image buffers
    unsigned char* rawBuffer1; ///< Double buffer 1 for the image
    unsigned char* rawBuffer2; ///< Double buffer 2 for the image
    unsigned char* rawImage;   ///< Pointer to current complete image
    int rawLastIndex;          ///< The last byte index received of the image
    int rawExpectedBytes;      ///< Number of raw image bytes expected. Calculated by: image depth * channels * widht * height / 8
    int bytesPerLine;          ///< Bytes per image line. Is calculated as: image depth * channels * width / 8
    bool imageStarted;         ///< If an image is currently in transmission
    int receivedDepth;         ///< Image depth in bit for the current image
    int receivedChannels;      ///< Number of color channels
    int receivedWidth;         ///< Width in pixels of the current image
    int receivedHeight;        ///< Height in pixels of the current image

    // HUD colors
    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
186
    QPainter* HUDPainter;
pixhawk's avatar
pixhawk committed
187 188 189 190 191 192 193 194 195 196
    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 noCamera;             ///< No camera images available, draw the ground/sky box to indicate the horizon
    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

    QString waypointName;      ///< Waypoint name displayed in HUD
197 198 199
    float roll;
    float pitch;
    float yaw;
200
    QMap<uint8_t, QVector3D> attitudes;
201 202 203 204 205 206 207 208 209 210
    float rollLP;
    float pitchLP;
    float yawLP;
    double yawDiff;
    double xPos;
    double yPos;
    double zPos;
    double xSpeed;
    double ySpeed;
    double zSpeed;
pixhawk's avatar
pixhawk committed
211 212 213
    quint64 lastSpeedUpdate;
    double totalSpeed;
    double totalAcc;
214 215 216 217
    double lat;
    double lon;
    double alt;
    float load;
218 219
    QString offlineDirectory;
    QString nextOfflineImage;
220
    bool HUDInstrumentsEnabled;
221
    bool videoEnabled;
222
    bool imageLoggingEnabled;
223 224 225 226 227 228
    float xImageFactor;
    float yImageFactor;
    QAction* enableHUDAction;
    QAction* enableVideoAction;
    QAction* selectOfflineDirectoryAction;
    QAction* selectVideoChannelAction;
229
    QAction* selectSaveDirectoryAction;
pixhawk's avatar
pixhawk committed
230
    void paintEvent(QPaintEvent *event);
231
    bool imageRequested;
232 233
    QString imageLogDirectory;
    unsigned int imageLogCounter;
pixhawk's avatar
pixhawk committed
234 235 236
};

#endif // HUD_H