HSIDisplay.cc 37.1 KB
Newer Older
1 2
/*=====================================================================

3
QGroundControl Open Source Ground Control Station
4

5
(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
6

7
This file is part of the QGROUNDCONTROL project
8

9
    QGROUNDCONTROL is free software: you can redistribute it and/or modify
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,
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/>.
21 22 23 24 25 26 27 28 29 30 31 32 33

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

/**
 * @file
 *   @brief Implementation of Horizontal Situation Indicator class
 *
 *   @author Lorenz Meier <mavteam@student.ethz.ch>
 *
 */

#include <QFile>
#include <QStringList>
34
#include <QPainter>
35 36 37
#include <QGraphicsScene>
#include <QHBoxLayout>
#include <QDoubleSpinBox>
38 39
#include "UASManager.h"
#include "HSIDisplay.h"
40
#include "QGC.h"
pixhawk's avatar
pixhawk committed
41
#include "Waypoint.h"
42
#include "UASWaypointManager.h"
43
#include "Waypoint2DIcon.h"
44 45 46

#include <QDebug>

47
HSIDisplay::HSIDisplay(QWidget *parent) :
pixhawk's avatar
pixhawk committed
48
        HDDisplay(NULL, "HSI", parent),
pixhawk's avatar
pixhawk committed
49
        gpsSatellites(),
50 51 52 53 54 55 56 57
        satellitesUsed(0),
        attXSet(0),
        attYSet(0),
        attYawSet(0),
        altitudeSet(1.0),
        posXSet(0),
        posYSet(0),
        posZSet(0),
lm's avatar
lm committed
58 59 60 61 62
        attXSaturation(0.5f),
        attYSaturation(0.5f),
        attYawSaturation(0.5f),
        posXSaturation(0.05),
        posYSaturation(0.05),
63 64 65 66 67 68 69 70
        altitudeSaturation(1.0),
        lat(0),
        lon(0),
        alt(0),
        globalAvailable(0),
        x(0),
        y(0),
        z(0),
71 72 73 74 75
        vx(0),
        vy(0),
        vz(0),
        speed(0),
        localAvailable(0),
76 77 78
        roll(0.0f),
        pitch(0.0f),
        yaw(0.0f),
79 80 81 82 83 84 85 86
        bodyXSetCoordinate(0.0f),
        bodyYSetCoordinate(0.0f),
        bodyZSetCoordinate(0.0f),
        bodyYawSet(0.0f),
        uiXSetCoordinate(0.0f),
        uiYSetCoordinate(0.0f),
        uiZSetCoordinate(0.0f),
        uiYawSet(0.0f),
pixhawk's avatar
pixhawk committed
87
        metricWidth(4.0f),
lm's avatar
lm committed
88 89 90
        positionLock(false),
        attControlEnabled(false),
        xyControlEnabled(false),
pixhawk's avatar
pixhawk committed
91
        zControlEnabled(false),
92 93 94 95 96
        yawControlEnabled(false),
        positionFix(0),
        gpsFix(0),
        visionFix(0),
        laserFix(0),
pixhawk's avatar
pixhawk committed
97
        mavInitialized(false),
98
        bottomMargin(10.0f),
99 100
        topMargin(12.0f),
        userSetPointSet(false)
101
{
102
    refreshTimer->setInterval(updateInterval);
103

pixhawk's avatar
pixhawk committed
104
    columns = 1;
105
    this->setAutoFillBackground(true);
106

pixhawk's avatar
pixhawk committed
107 108 109
    vwidth = 80;
    vheight = 80;

110
    xCenterPos = vwidth/2.0f;
pixhawk's avatar
pixhawk committed
111
    yCenterPos = vheight/2.0f + topMargin - bottomMargin;
112
    //qDebug() << "CENTER" << xCenterPos << yCenterPos;
113 114 115 116 117 118 119 120

    // Add interaction elements
    QHBoxLayout* layout = new QHBoxLayout(this);
    layout->setMargin(2);
    layout->setSpacing(0);
    QDoubleSpinBox* spinBox = new QDoubleSpinBox(this);
    spinBox->setMinimum(0.1);
    spinBox->setMaximum(9999);
121
    spinBox->setMaximumWidth(50);
122 123 124
    spinBox->setValue(metricWidth);
    spinBox->setToolTip(tr("Ground width in meters shown on instrument"));
    spinBox->setStatusTip(tr("Ground width in meters shown on instrument"));
125 126 127
    connect(spinBox, SIGNAL(valueChanged(double)), this, SLOT(setMetricWidth(double)));
    connect(this, SIGNAL(metricWidthChanged(double)), spinBox, SLOT(setValue(double)));
    layout->addWidget(spinBox);
128
    layout->setAlignment(spinBox, Qt::AlignBottom | Qt::AlignRight);
129 130
    this->setLayout(layout);

131 132 133
    uas = NULL;
    resetMAVState();

134 135
    // Do first update
    setMetricWidth(metricWidth);
136 137
}

138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
void HSIDisplay::resetMAVState()
{
    mavInitialized = false;
    attControlKnown = false;
    attControlEnabled = false;
    xyControlKnown = false;
    xyControlEnabled = false;
    zControlKnown = false;
    zControlEnabled = false;
    yawControlKnown = false;
    yawControlEnabled = false;

    // Draw position lock indicators
    positionFixKnown = false;
    positionFix = 0;
    visionFixKnown = false;
    visionFix = 0;
    gpsFixKnown = false;
    gpsFix = 0;
    iruFixKnown = false;
    iruFix = 0;

    // Data
    setPointKnown = false;
    localAvailable = 0;
    globalAvailable = 0;
164 165 166 167

    // Setpoints
    positionSetPointKnown = false;
    setPointKnown = false;
168 169
}

lm's avatar
lm committed
170 171 172 173
void HSIDisplay::paintEvent(QPaintEvent * event)
{
    Q_UNUSED(event);
    //paintGL();
174 175 176
//    static quint64 interval = 0;
//    //qDebug() << "INTERVAL:" << MG::TIME::getGroundTimeNow() - interval << __FILE__ << __LINE__;
//    interval = MG::TIME::getGroundTimeNow();
177
    renderOverlay();
lm's avatar
lm committed
178 179
}

180
void HSIDisplay::renderOverlay()
181
{
182 183 184
#if (QGC_EVENTLOOP_DEBUG)
    qDebug() << "EVENTLOOP:" << __FILE__ << __LINE__;
#endif
185 186
    // Center location of the HSI gauge items

187
    //float bottomMargin = 3.0f;
188 189

    // Size of the ring instrument
190
    //const float margin = 0.1f;  // 10% margin of total width on each side
pixhawk's avatar
pixhawk committed
191
    float baseRadius = (vheight - topMargin - bottomMargin) / 2.0f - bottomMargin / 2.0f;
192

193 194 195 196 197 198 199 200
    // Draw instruments
    // TESTING THIS SHOULD BE MOVED INTO A QGRAPHICSVIEW
    // Update scaling factor
    // adjust scaling to fit both horizontally and vertically
    scalingFactor = this->width()/vwidth;
    double scalingFactorH = this->height()/vheight;
    if (scalingFactorH < scalingFactor) scalingFactor = scalingFactorH;

201
    QPainter painter(viewport());
202 203
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setRenderHint(QPainter::HighQualityAntialiasing, true);
204

205 206
    // Draw base instrument
    // ----------------------
lm's avatar
lm committed
207
    painter.setBrush(Qt::NoBrush);
208
    const QColor ringColor = QColor(200, 250, 200);
lm's avatar
lm committed
209 210 211 212
    QPen pen;
    pen.setColor(ringColor);
    pen.setWidth(refLineWidthToPen(0.1f));
    painter.setPen(pen);
lm's avatar
lm committed
213 214 215
    const int ringCount = 2;
    for (int i = 0; i < ringCount; i++)
    {
216
        float radius = (vwidth - (topMargin + bottomMargin)*0.3f) / (1.3f * i+1) / 2.0f - bottomMargin / 2.0f;
217
        drawCircle(xCenterPos, yCenterPos, radius, 0.1f, ringColor, &painter);
lm's avatar
lm committed
218 219
    }

220 221 222
    // Draw orientation labels
    // Translate and rotate coordinate frame
    painter.translate((xCenterPos)*scalingFactor, (yCenterPos)*scalingFactor);
223
    painter.rotate((yaw/(M_PI))*180.0f);
224 225
    paintText(tr("N"), ringColor, 3.5f, - 1.0f, - baseRadius - 5.5f, &painter);
    paintText(tr("S"), ringColor, 3.5f, - 1.0f, + baseRadius + 1.5f, &painter);
226
    paintText(tr("E"), ringColor, 3.5f, + baseRadius + 2.0f, - 1.25f, &painter);
227
    paintText(tr("W"), ringColor, 3.5f, - baseRadius - 5.5f, - 1.75f, &painter);
228
    painter.rotate((-yaw/(M_PI))*180.0f);
229 230
    painter.translate(-(xCenterPos)*scalingFactor, -(yCenterPos)*scalingFactor);

lm's avatar
lm committed
231
    // Draw center indicator
232
    QPolygonF p(3);
233 234 235
    p.replace(0, QPointF(xCenterPos, yCenterPos-4.0f));
    p.replace(1, QPointF(xCenterPos-4.0f, yCenterPos+3.5f));
    p.replace(2, QPointF(xCenterPos+4.0f, yCenterPos+3.5f));
236
    drawPolygon(p, &painter);
237 238

    // ----------------------
239

240 241 242
    // Draw satellites
    drawGPS(painter);

243 244 245
    // Draw state indicator

    // Draw position
246
    QColor positionColor(20, 20, 200);
247
    drawPositionDirection(xCenterPos, yCenterPos, baseRadius, positionColor, &painter);
248 249 250

    // Draw attitude
    QColor attitudeColor(200, 20, 20);
251
    drawAttitudeDirection(xCenterPos, yCenterPos, baseRadius, attitudeColor, &painter);
252 253


254
    // Draw position setpoints in body coordinates
lm's avatar
lm committed
255

256
    if (userSetPointSet)
257 258 259 260 261
    {
        QColor spColor(150, 150, 150);
        drawSetpointXY(uiXSetCoordinate, uiYSetCoordinate, uiYawSet, spColor, painter);
    }

262
    if (positionSetPointKnown)
263 264
    {
        // Draw setpoint
265
        drawSetpointXY(bodyXSetCoordinate, bodyYSetCoordinate, bodyYawSet, QGC::colorCyan, painter);
266 267
        // Draw travel direction line
        QPointF m(bodyXSetCoordinate, bodyYSetCoordinate);
lm's avatar
lm committed
268 269 270
        // Transform from body to world coordinates
        m = metricWorldToBody(m);
        // Scale from metric body to screen reference units
271
        QPointF s = metricBodyToRef(m);
272
        drawLine(s.x(), s.y(), xCenterPos, yCenterPos, 1.5f, QGC::colorCyan, &painter);
273 274 275
    }

    // Labels on outer part and bottom
276

277 278 279 280
    // Draw waypoints
    drawWaypoints(painter);

    // Draw status flags
281 282 283 284
    drawStatusFlag(2,  1, tr("ATT"), attControlEnabled, attControlKnown, painter);
    drawStatusFlag(22, 1, tr("PXY"), xyControlEnabled,  xyControlKnown,  painter);
    drawStatusFlag(44, 1, tr("PZ"),  zControlEnabled,   zControlKnown,   painter);
    drawStatusFlag(66, 1, tr("YAW"), yawControlEnabled, yawControlKnown, painter);
285

286
    // Draw position lock indicators
287 288 289 290
    drawPositionLock(2,  5, tr("POS"), positionFix, positionFixKnown, painter);
    drawPositionLock(22, 5, tr("VIS"), visionFix,   visionFixKnown,   painter);
    drawPositionLock(44, 5, tr("GPS"), gpsFix,      gpsFixKnown,      painter);
    drawPositionLock(66, 5, tr("IRU"), iruFix,      iruFixKnown,      painter);
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321

    // Draw speed to top left
    paintText(tr("SPEED"), QGC::colorCyan, 2.2f, 2, 11, &painter);
    paintText(tr("%1 m/s").arg(speed, 2, 'f', 2, '0'), Qt::white, 2.2f, 14, 11, &painter);

    // Draw crosstrack error to top right
    float crossTrackError = 0;
    paintText(tr("XTRACK"), QGC::colorCyan, 2.2f, 62, 11, &painter);
    paintText(tr("%1 m").arg(crossTrackError, 2, 'f', 2, '0'), Qt::white, 2.2f, 75, 11, &painter);

    // Draw position to bottom left
    if (localAvailable > 0 && globalAvailable == 0)
    {
        // Position
        QString str;
        str.sprintf("%05.2f %05.2f %05.2f m", x, y, z);
        paintText(tr("POS"), QGC::colorCyan, 2.6f, 2, vheight- 5.0f, &painter);
        paintText(str, Qt::white, 2.6f, 10, vheight - 5.0f, &painter);
    }

    if (globalAvailable > 0)
    {
        // Position
        QString str;
        str.sprintf("%05.2f lat %06.2f lon %06.2f alt", lat, lon, alt);
        paintText(tr("GPS"), QGC::colorCyan, 2.6f, 2, vheight- 5.0f, &painter);
        paintText(str, Qt::white, 2.6f, 10, vheight - 5.0f, &painter);
    }

    // Draw Field of view to bottom right
    paintText(tr("FOV"), QGC::colorCyan, 2.6f, 62, vheight- 5.0f, &painter);
322
}
323

324
void HSIDisplay::drawStatusFlag(float x, float y, QString label, bool status, bool known, QPainter& painter)
325
{
326
    paintText(label, QGC::colorCyan, 2.6f, x, y+0.8f, &painter);
327 328 329
    QColor statusColor(250, 250, 250);
    if(status)
    {
pixhawk's avatar
pixhawk committed
330
        painter.setBrush(QGC::colorGreen);
331 332 333
    }
    else
    {
334
        painter.setBrush(QGC::colorDarkYellow);
335 336
    }
    painter.setPen(Qt::NoPen);
337 338 339 340 341

    float indicatorWidth = refToScreenX(7.0f);
    float indicatorHeight = refToScreenY(4.0f);

    painter.drawRect(QRect(refToScreenX(x+7.3f), refToScreenY(y+0.05), indicatorWidth, indicatorHeight));
342
    paintText((status) ? tr("ON") : tr("OFF"), statusColor, 2.6f, x+7.9f, y+0.8f, &painter);
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362
    // Cross out instrument if state unknown
    if (!known)
    {
        QPen pen(Qt::yellow);
        pen.setWidth(2);
        painter.setPen(pen);
        // Top left to bottom right
        QPointF p1, p2, p3, p4;
        p1.setX(refToScreenX(x));
        p1.setY(refToScreenX(y));
        p2.setX(p1.x()+indicatorWidth+refToScreenX(7.3f));
        p2.setY(p1.y()+indicatorHeight);
        painter.drawLine(p1, p2);
        // Bottom left to top right
        p3.setX(refToScreenX(x));
        p3.setY(refToScreenX(y)+indicatorHeight);
        p4.setX(p1.x()+indicatorWidth+refToScreenX(7.3f));
        p4.setY(p1.y());
        painter.drawLine(p3, p4);
    }
363 364
}

365
void HSIDisplay::drawPositionLock(float x, float y, QString label, int status, bool known, QPainter& painter)
366
{
367
        paintText(label, QGC::colorCyan, 2.6f, x, y+0.8f, &painter);
368
        QColor negStatusColor(200, 20, 20);
369
        QColor intermediateStatusColor (Qt::yellow);
370 371
        QColor posStatusColor(20, 200, 20);
        QColor statusColor(250, 250, 250);
372
        if (status == 3)
373 374 375
        {
            painter.setBrush(posStatusColor);
        }
376 377 378 379
        else if (status == 2)
        {
            painter.setBrush(intermediateStatusColor.dark(150));
        }
380 381 382 383
        else
        {
            painter.setBrush(negStatusColor);
        }
384

385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401
        // Lock text
        QString lockText;
        switch (status)
        {
        case 1:
            lockText = tr("LOC");
            break;
        case 2:
            lockText = tr("2D");
            break;
        case 3:
            lockText = tr("3D");
            break;
        default:
            lockText = tr("NO");
            break;
        }
402

403 404 405 406 407
        float indicatorWidth = refToScreenX(7.0f);
        float indicatorHeight = refToScreenY(4.0f);

        painter.setPen(Qt::NoPen);
        painter.drawRect(QRect(refToScreenX(x+7.3f), refToScreenY(y+0.05), refToScreenX(7.0f), refToScreenY(4.0f)));
408
        paintText(lockText, statusColor, 2.6f, x+7.9f, y+0.8f, &painter);
409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428
        // Cross out instrument if state unknown
        if (!known)
        {
            QPen pen(Qt::yellow);
            pen.setWidth(2);
            painter.setPen(pen);
            // Top left to bottom right
            QPointF p1, p2, p3, p4;
            p1.setX(refToScreenX(x));
            p1.setY(refToScreenX(y));
            p2.setX(p1.x()+indicatorWidth+refToScreenX(7.3f));
            p2.setY(p1.y()+indicatorHeight);
            painter.drawLine(p1, p2);
            // Bottom left to top right
            p3.setX(refToScreenX(x));
            p3.setY(refToScreenX(y)+indicatorHeight);
            p4.setX(p1.x()+indicatorWidth+refToScreenX(7.3f));
            p4.setY(p1.y());
            painter.drawLine(p3, p4);
        }
429 430
}

lm's avatar
lm committed
431 432
void HSIDisplay::updatePositionLock(UASInterface* uas, bool lock)
{
433
    Q_UNUSED(uas);
lm's avatar
lm committed
434 435 436
    positionLock = lock;
}

pixhawk's avatar
pixhawk committed
437
void HSIDisplay::updateAttitudeControllerEnabled(bool enabled)
lm's avatar
lm committed
438 439
{
    attControlEnabled = enabled;
440
    attControlKnown = true;
lm's avatar
lm committed
441 442
}

pixhawk's avatar
pixhawk committed
443
void HSIDisplay::updatePositionXYControllerEnabled(bool enabled)
lm's avatar
lm committed
444 445
{
    xyControlEnabled = enabled;
446
    xyControlKnown = true;
lm's avatar
lm committed
447 448
}

pixhawk's avatar
pixhawk committed
449
void HSIDisplay::updatePositionZControllerEnabled(bool enabled)
lm's avatar
lm committed
450 451
{
    zControlEnabled = enabled;
452
    zControlKnown = true;
lm's avatar
lm committed
453 454
}

pixhawk's avatar
pixhawk committed
455 456 457 458
QPointF HSIDisplay::metricWorldToBody(QPointF world)
{
    // First translate to body-centered coordinates
    // Rotate around -yaw
459 460
    float angle = yaw + M_PI;
    QPointF result(cos(angle) * (x - world.x()) - sin(angle) * (y - world.y()), sin(angle) * (x - world.x()) + cos(angle) * (y - world.y()));
pixhawk's avatar
pixhawk committed
461 462 463 464 465 466 467
    return result;
}

QPointF HSIDisplay::metricBodyToWorld(QPointF body)
{
    // First rotate into world coordinates
    // then translate to world position
468
    QPointF result((cos(yaw) * body.x()) + (sin(yaw) * body.y()) + x, (-sin(yaw) * body.x()) + (cos(yaw) * body.y()) + y);
pixhawk's avatar
pixhawk committed
469
    return result;
470
}
471

472 473
QPointF HSIDisplay::screenToMetricBody(QPointF ref)
{
lm's avatar
lm committed
474
    return QPointF(-((screenToRefY(ref.y()) - yCenterPos)/ vwidth) * metricWidth - x, ((screenToRefX(ref.x()) - xCenterPos) / vwidth) * metricWidth - y);
475 476 477 478
}

QPointF HSIDisplay::refToMetricBody(QPointF &ref)
{
lm's avatar
lm committed
479
    return QPointF(-((ref.y() - yCenterPos)/ vwidth) * metricWidth - x, ((ref.x() - xCenterPos) / vwidth) * metricWidth - y);
480 481 482 483 484
}

/**
 * @see refToScreenX()
 */
485
QPointF HSIDisplay::metricBodyToRef(QPointF &metric)
486 487 488 489
{
    return QPointF(((metric.y())/ metricWidth) * vwidth + xCenterPos, ((-metric.x()) / metricWidth) * vwidth + yCenterPos);
}

490 491 492 493 494 495 496 497
QPointF HSIDisplay::metricBodyToScreen(QPointF metric)
{
    QPointF ref = metricBodyToRef(metric);
    ref.setX(refToScreenX(ref.x()));
    ref.setY(refToScreenY(ref.y()));
    return ref;
}

498 499 500 501 502 503 504 505 506 507 508 509 510 511 512
void HSIDisplay::mouseDoubleClickEvent(QMouseEvent * event)
{
    static bool dragStarted;
    static float startX;

    if (event->MouseButtonDblClick)
    {
        //setBodySetpointCoordinateXY(-refToMetric(screenToRefY(event->y()) - yCenterPos), refToMetric(screenToRefX(event->x()) - xCenterPos));

        QPointF p = screenToMetricBody(event->posF());
        setBodySetpointCoordinateXY(p.x(), p.y());
        qDebug() << "Double click at x: " << screenToRefX(event->x()) - xCenterPos << "y:" << screenToRefY(event->y()) - yCenterPos;
    }
    else if (event->MouseButtonPress)
    {
513
        startX = event->globalX();
514 515
        if (event->button() == Qt::RightButton)
        {
516 517
            // Start tracking mouse move
            dragStarted = true;
518 519 520 521 522 523
        }
        else if (event->button() == Qt::LeftButton)
        {

        }
    }
524 525 526 527
    else if (event->MouseButtonRelease)
    {
        dragStarted = false;
    }
pixhawk's avatar
pixhawk committed
528 529
    else if (event->MouseMove)
    {
530
        if (dragStarted) uiYawSet += (startX - event->globalX()) / this->frameSize().width();
pixhawk's avatar
pixhawk committed
531
    }
532 533
}

534 535 536 537 538 539 540 541 542
void HSIDisplay::setMetricWidth(double width)
{
    if (width != metricWidth)
    {
        metricWidth = width;
        emit metricWidthChanged(metricWidth);
    }
}

543 544 545 546 547 548
/**
 *
 * @param uas the UAS/MAV to monitor/display with the HUD
 */
void HSIDisplay::setActiveUAS(UASInterface* uas)
{
549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568
        if (this->uas != NULL)
        {
            disconnect(this->uas, SIGNAL(gpsSatelliteStatusChanged(int,int,float,float,float,bool)), this, SLOT(updateSatellite(int,int,float,float,float,bool)));
            disconnect(this->uas, SIGNAL(localPositionChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateLocalPosition(UASInterface*,double,double,double,quint64)));
            disconnect(this->uas, SIGNAL(globalPositionChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateGlobalPosition(UASInterface*,double,double,double,quint64)));
            disconnect(this->uas, SIGNAL(attitudeThrustSetPointChanged(UASInterface*,double,double,double,double,quint64)), this, SLOT(updateAttitudeSetpoints(UASInterface*,double,double,double,double,quint64)));
            disconnect(this->uas, SIGNAL(positionSetPointsChanged(int,float,float,float,float,quint64)), this, SLOT(updatePositionSetpoints(int,float,float,float,float,quint64)));
            disconnect(this->uas, SIGNAL(speedChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateSpeed(UASInterface*,double,double,double,quint64)));
            disconnect(this->uas, SIGNAL(attitudeChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateAttitude(UASInterface*,double,double,double,quint64)));

            disconnect(this->uas, SIGNAL(attitudeControlEnabled(bool)), this, SLOT(updateAttitudeControllerEnabled(bool)));
            disconnect(this->uas, SIGNAL(positionXYControlEnabled(bool)), this, SLOT(updatePositionXYControllerEnabled(bool)));
            disconnect(this->uas, SIGNAL(positionZControlEnabled(bool)), this, SLOT(updatePositionZControllerEnabled(bool)));
            disconnect(this->uas, SIGNAL(positionYawControlEnabled(bool)), this, SLOT(updatePositionYawControllerEnabled(bool)));

            disconnect(this->uas, SIGNAL(localizationChanged(UASInterface*,int)), this, SLOT(updateLocalization(UASInterface*,int)));
            disconnect(this->uas, SIGNAL(visionLocalizationChanged(UASInterface*,int)), this, SLOT(updateVisionLocalization(UASInterface*,int)));
            disconnect(this->uas, SIGNAL(gpsLocalizationChanged(UASInterface*,int)), this, SLOT(updateGpsLocalization(UASInterface*,int)));
            disconnect(this->uas, SIGNAL(irUltraSoundLocalizationChanged(UASInterface*,int)), this, SLOT(updateInfraredUltrasoundLocalization(UASInterface*,int)));
        }
569

570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588
        connect(uas, SIGNAL(gpsSatelliteStatusChanged(int,int,float,float,float,bool)), this, SLOT(updateSatellite(int,int,float,float,float,bool)));
        connect(uas, SIGNAL(localPositionChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateLocalPosition(UASInterface*,double,double,double,quint64)));
        connect(uas, SIGNAL(globalPositionChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateGlobalPosition(UASInterface*,double,double,double,quint64)));
        connect(uas, SIGNAL(attitudeThrustSetPointChanged(UASInterface*,double,double,double,double,quint64)), this, SLOT(updateAttitudeSetpoints(UASInterface*,double,double,double,double,quint64)));
        connect(uas, SIGNAL(positionSetPointsChanged(int,float,float,float,float,quint64)), this, SLOT(updatePositionSetpoints(int,float,float,float,float,quint64)));
        connect(uas, SIGNAL(speedChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateSpeed(UASInterface*,double,double,double,quint64)));
        connect(uas, SIGNAL(attitudeChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateAttitude(UASInterface*,double,double,double,quint64)));

        connect(uas, SIGNAL(attitudeControlEnabled(bool)), this, SLOT(updateAttitudeControllerEnabled(bool)));
        connect(uas, SIGNAL(positionXYControlEnabled(bool)), this, SLOT(updatePositionXYControllerEnabled(bool)));
        connect(uas, SIGNAL(positionZControlEnabled(bool)), this, SLOT(updatePositionZControllerEnabled(bool)));
        connect(uas, SIGNAL(positionYawControlEnabled(bool)), this, SLOT(updatePositionYawControllerEnabled(bool)));

        connect(uas, SIGNAL(localizationChanged(UASInterface*,int)), this, SLOT(updateLocalization(UASInterface*,int)));
        connect(uas, SIGNAL(visionLocalizationChanged(UASInterface*,int)), this, SLOT(updateVisionLocalization(UASInterface*,int)));
        connect(uas, SIGNAL(gpsLocalizationChanged(UASInterface*,int)), this, SLOT(updateGpsLocalization(UASInterface*,int)));
        connect(uas, SIGNAL(irUltraSoundLocalizationChanged(UASInterface*,int)), this, SLOT(updateInfraredUltrasoundLocalization(UASInterface*,int)));

        this->uas = uas;
589 590

        resetMAVState();
591 592
}

593 594 595 596 597 598 599
void HSIDisplay::updateSpeed(UASInterface* uas, double vx, double vy, double vz, quint64 time)
{
    Q_UNUSED(uas);
    Q_UNUSED(time);
    this->vx = vx;
    this->vy = vy;
    this->vz = vz;
600
    this->speed = sqrt(pow(vx, 2.0) + pow(vy, 2.0) + pow(vz, 2.0));
601 602 603 604 605 606
}

void HSIDisplay::setBodySetpointCoordinateXY(double x, double y)
{
    // Set coordinates and send them out to MAV

lm's avatar
lm committed
607 608 609 610 611
    QPointF sp(x, y);
    sp = metricBodyToWorld(sp);
    uiXSetCoordinate = sp.x();
    uiYSetCoordinate = sp.y();

pixhawk's avatar
pixhawk committed
612 613 614
    qDebug() << "Attempting to set new setpoint at x: " << x << "metric y:" << y;

    if (uas && mavInitialized)
pixhawk's avatar
pixhawk committed
615 616 617 618
    {
        uas->setLocalPositionSetpoint(uiXSetCoordinate, uiYSetCoordinate, uiZSetCoordinate, uiYawSet);
        qDebug() << "Setting new setpoint at x: " << x << "metric y:" << y;
    }
619 620 621 622 623 624 625 626 627 628 629 630 631
}

void HSIDisplay::setBodySetpointCoordinateZ(double z)
{
    // Set coordinates and send them out to MAV
    uiZSetCoordinate = z;
}

void HSIDisplay::sendBodySetPointCoordinates()
{
    // Send the coordinates to the MAV
}

632
void HSIDisplay::updateAttitudeSetpoints(UASInterface* uas, double rollDesired, double pitchDesired, double yawDesired, double thrustDesired, quint64 usec)
633
{
634 635 636 637 638 639
    Q_UNUSED(uas);
    Q_UNUSED(usec);
    attXSet = pitchDesired;
    attYSet = rollDesired;
    attYawSet = yawDesired;
    altitudeSet = thrustDesired;
640 641
}

lm's avatar
lm committed
642 643 644 645 646 647 648 649 650
void HSIDisplay::updateAttitude(UASInterface* uas, double roll, double pitch, double yaw, quint64 time)
{
    Q_UNUSED(uas);
    Q_UNUSED(time);
    this->roll = roll;
    this->pitch = pitch;
    this->yaw = yaw;
}

lm's avatar
lm committed
651
void HSIDisplay::updatePositionSetpoints(int uasid, float xDesired, float yDesired, float zDesired, float yawDesired, quint64 usec)
652
{
653 654
    Q_UNUSED(usec);
    Q_UNUSED(uasid);
655 656 657 658
    bodyXSetCoordinate = xDesired;
    bodyYSetCoordinate = yDesired;
    bodyZSetCoordinate = zDesired;
    bodyYawSet = yawDesired;
pixhawk's avatar
pixhawk committed
659
    mavInitialized = true;
660
    setPointKnown = true;
661
    positionSetPointKnown = true;
pixhawk's avatar
pixhawk committed
662

663 664 665 666 667
    //    qDebug() << "Received setpoint at x: " << x << "metric y:" << y;
    //    posXSet = xDesired;
    //    posYSet = yDesired;
    //    posZSet = zDesired;
    //    posYawSet = yawDesired;
668 669 670 671
}

void HSIDisplay::updateLocalPosition(UASInterface*, double x, double y, double z, quint64 usec)
{
672 673 674 675
    this->x = x;
    this->y = y;
    this->z = z;
    localAvailable = usec;
676 677 678 679
}

void HSIDisplay::updateGlobalPosition(UASInterface*, double lat, double lon, double alt, quint64 usec)
{
680 681 682 683
    this->lat = lat;
    this->lon = lon;
    this->alt = alt;
    globalAvailable = usec;
684 685
}

lm's avatar
lm committed
686
void HSIDisplay::updateSatellite(int uasid, int satid, float elevation, float azimuth, float snr, bool used)
lm's avatar
lm committed
687 688
{
    Q_UNUSED(uasid);
lm's avatar
lm committed
689
    //qDebug() << "UPDATED SATELLITE";
lm's avatar
lm committed
690
    // If slot is empty, insert object
lm's avatar
lm committed
691
    if (gpsSatellites.contains(satid))
lm's avatar
lm committed
692
    {
lm's avatar
lm committed
693
        gpsSatellites.value(satid)->update(satid, elevation, azimuth, snr, used);
lm's avatar
lm committed
694 695 696
    }
    else
    {
lm's avatar
lm committed
697
        gpsSatellites.insert(satid, new GPSSatellite(satid, elevation, azimuth, snr, used));
lm's avatar
lm committed
698 699 700
    }
}

701 702 703
void HSIDisplay::updatePositionYawControllerEnabled(bool enabled)
{
    yawControlEnabled = enabled;
704
    yawControlKnown = true;
705 706 707 708 709 710 711 712 713
}

/**
 * @param fix 0: lost, 1: 2D local position hold, 2: 2D localization, 3: 3D localization
 */
void HSIDisplay::updateLocalization(UASInterface* uas, int fix)
{
    Q_UNUSED(uas);
    positionFix = fix;
714
    positionFixKnown = true;
715
    //qDebug() << "LOCALIZATION FIX CALLED";
716 717 718 719 720 721 722 723
}
/**
 * @param fix 0: lost, 1: at least one satellite, but no GPS fix, 2: 2D localization, 3: 3D localization
 */
void HSIDisplay::updateGpsLocalization(UASInterface* uas, int fix)
{
    Q_UNUSED(uas);
    gpsFix = fix;
724
    gpsFixKnown = true;
725 726 727 728 729 730 731 732
}
/**
 * @param fix 0: lost, 1: 2D local position hold, 2: 2D localization, 3: 3D localization
 */
void HSIDisplay::updateVisionLocalization(UASInterface* uas, int fix)
{
    Q_UNUSED(uas);
    visionFix = fix;
733
    visionFixKnown = true;
734
    //qDebug() << "VISION FIX GOT CALLED";
735 736
}

737 738 739 740 741 742 743
/**
 * @param fix 0: lost, 1-N: Localized with N ultrasound or infrared sensors
 */
void HSIDisplay::updateInfraredUltrasoundLocalization(UASInterface* uas, int fix)
{
    Q_UNUSED(uas);
    iruFix = fix;
744
    iruFixKnown = true;
745 746
}

lm's avatar
lm committed
747 748
QColor HSIDisplay::getColorForSNR(float snr)
{
lm's avatar
lm committed
749
    QColor color;
lm's avatar
lm committed
750 751 752 753 754
    if (snr > 0 && snr < 30)
    {
        color = QColor(250, 10, 10);
    }
    else if (snr >= 30 && snr < 35)
lm's avatar
lm committed
755
    {
lm's avatar
lm committed
756
        color = QColor(230, 230, 10);
lm's avatar
lm committed
757
    }
lm's avatar
lm committed
758
    else if (snr >= 35 && snr < 40)
lm's avatar
lm committed
759
    {
lm's avatar
lm committed
760
        color = QColor(90, 200, 90);
lm's avatar
lm committed
761
    }
lm's avatar
lm committed
762
    else if (snr >= 40)
lm's avatar
lm committed
763
    {
lm's avatar
lm committed
764
        color = QColor(20, 200, 20);
lm's avatar
lm committed
765 766 767 768 769 770
    }
    else
    {
        color = QColor(180, 180, 180);
    }
    return color;
lm's avatar
lm committed
771 772
}

773
void HSIDisplay::drawSetpointXY(float x, float y, float yaw, const QColor &color, QPainter &painter)
774
{
775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793
    if (setPointKnown)
    {
        float radius = vwidth / 20.0f;
        QPen pen(color);
        pen.setWidthF(refLineWidthToPen(0.4f));
        pen.setColor(color);
        painter.setPen(pen);
        painter.setBrush(Qt::NoBrush);
        QPointF in(x, y);
        // Transform from body to world coordinates
        in = metricWorldToBody(in);
        // Scale from metric to screen reference coordinates
        QPointF p = metricBodyToRef(in);
        drawCircle(p.x(), p.y(), radius, 0.4f, color, &painter);
        radius *= 0.8;
        drawLine(p.x(), p.y(), p.x()+sin(yaw) * radius, p.y()-cos(yaw) * radius, refLineWidthToPen(0.4f), color, &painter);
        painter.setBrush(color);
        drawCircle(p.x(), p.y(), radius * 0.1f, 0.1f, color, &painter);
    }
794 795
}

796 797
void HSIDisplay::drawWaypoints(QPainter& painter)
{
798
    if (uas)
pixhawk's avatar
pixhawk committed
799
    {
pixhawk's avatar
pixhawk committed
800
		const QVector<Waypoint*>& list = uas->getWaypointManager()->getWaypointList();
801 802 803 804 805 806 807 808 809 810 811 812
        //        for (int i = 0; i < list.size(); i++)
        //        {
        //            QPointF in(list.at(i)->getX(), list.at(i)->getY());
        //            // Transform from world to body coordinates
        //            in = metricWorldToBody(in);
        //            // Scale from metric to screen reference coordinates
        //            QPointF p = metricBodyToRef(in);
        //            Waypoint2DIcon* wp = new Waypoint2DIcon();
        //            wp->setLocalPosition(list.at(i)->getX(), list.at(i)->getY());
        //            wp->setPos(0, 0);
        //            scene()->addItem(wp);
        //        }
813 814 815

        QColor color;
        painter.setBrush(Qt::NoBrush);
pixhawk's avatar
pixhawk committed
816

817
        QPointF lastWaypoint;
pixhawk's avatar
pixhawk committed
818

819
        for (int i = 0; i < list.size(); i++)
pixhawk's avatar
pixhawk committed
820
        {
821 822 823 824 825 826 827 828 829 830 831 832 833
            QPointF in;
            if (list.at(i)->getFrame() == MAV_FRAME_LOCAL)
            {
                // Do not transform
                in = QPointF(list.at(i)->getX(), list.at(i)->getY());
            }
            else
            {
                // Transform to local coordinates first
                double x = list.at(i)->getX();
                double y = list.at(i)->getY();
                in = QPointF(x, y);
            }
834 835 836 837 838
            // Transform from world to body coordinates
            in = metricWorldToBody(in);
            // Scale from metric to screen reference coordinates
            QPointF p = metricBodyToRef(in);

839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854
            // Setup pen
            QPen pen(color);
            painter.setBrush(Qt::NoBrush);

            // DRAW WAYPOINT
            //drawCircle(p.x(), p.y(), radius, 0.4f, color, &painter);
            float waypointSize = vwidth / 20.0f * 2.0f;
            QPolygonF poly(4);
            // Top point
            poly.replace(0, QPointF(p.x(), p.y()-waypointSize/2.0f));
            // Right point
            poly.replace(1, QPointF(p.x()+waypointSize/2.0f, p.y()));
            // Bottom point
            poly.replace(2, QPointF(p.x(), p.y() + waypointSize/2.0f));
            poly.replace(3, QPointF(p.x() - waypointSize/2.0f, p.y()));

855 856 857
            // Select color based on if this is the current waypoint
            if (list.at(i)->getCurrent())
            {
858 859
                color = QGC::colorCyan;//uas->getColor();
                pen.setWidthF(refLineWidthToPen(0.8f));
860 861 862 863
            }
            else
            {
                color = uas->getColor();
864
                pen.setWidthF(refLineWidthToPen(0.4f));
865 866
            }

867
            pen.setColor(color);
868
            painter.setPen(pen);
869
            float radius = (waypointSize/2.0f) * 0.8 * (1/sqrt(2.0f));
870
            drawLine(p.x(), p.y(), p.x()+sin(list.at(i)->getYaw()+yaw) * radius, p.y()-cos(list.at(i)->getYaw()+yaw) * radius, refLineWidthToPen(0.4f), color, &painter);
871
            drawPolygon(poly, &painter);
872

873
            // DRAW CONNECTING LINE
874 875 876
            // Draw line from last waypoint to this one
            if (!lastWaypoint.isNull())
            {
877 878 879
                pen.setWidthF(refLineWidthToPen(0.4f));
                painter.setPen(pen);
                color = uas->getColor();
880 881 882
                drawLine(lastWaypoint.x(), lastWaypoint.y(), p.x(), p.y(), refLineWidthToPen(0.4f), color, &painter);
            }
            lastWaypoint = p;
pixhawk's avatar
pixhawk committed
883 884
        }
    }
885 886
}

887 888 889 890 891 892
void HSIDisplay::drawSafetyArea(const QPointF &topLeft, const QPointF &bottomRight, const QColor &color, QPainter &painter)
{
    QPen pen(color);
    pen.setWidthF(refLineWidthToPen(0.1f));
    pen.setColor(color);
    painter.setPen(pen);
893
    painter.drawRect(QRectF(metricBodyToScreen(metricWorldToBody(topLeft)), metricBodyToScreen(metricWorldToBody(bottomRight))));
894
}
lm's avatar
lm committed
895

896 897 898 899
void HSIDisplay::drawGPS(QPainter &painter)
{
    float xCenter = xCenterPos;
    float yCenter = xCenterPos;
lm's avatar
lm committed
900 901
    // Max satellite circle radius

lm's avatar
lm committed
902 903 904
    const float margin = 0.15f;  // 20% margin of total width on each side
    float radius = (vwidth - vwidth * 2.0f * margin) / 2.0f;
    quint64 currTime = MG::TIME::getGroundTimeNowUsecs();
lm's avatar
lm committed
905

pixhawk's avatar
pixhawk committed
906 907 908 909 910
    // Draw satellite labels
    //    QString label;
    //    label.sprintf("%05.1f", value);
    //    paintText(label, color, 4.5f, xRef-7.5f, yRef-2.0f, painter);

lm's avatar
lm committed
911 912
    QMapIterator<int, GPSSatellite*> i(gpsSatellites);
    while (i.hasNext())
lm's avatar
lm committed
913
    {
lm's avatar
lm committed
914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932
        i.next();
        GPSSatellite* sat = i.value();

        // Check if update is not older than 5 seconds, else delete satellite
        if (sat->lastUpdate + 1000000 < currTime)
        {
            // Delete and go to next satellite
            gpsSatellites.remove(i.key());
            if (i.hasNext())
            {
                i.next();
                sat = i.value();
            }
            else
            {
                continue;
            }
        }

lm's avatar
lm committed
933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950
        if (sat)
        {
            // Draw satellite
            QBrush brush;
            QColor color = getColorForSNR(sat->snr);
            brush.setColor(color);
            if (sat->used)
            {
                brush.setStyle(Qt::SolidPattern);
            }
            else
            {
                brush.setStyle(Qt::NoBrush);
            }
            painter.setPen(Qt::SolidLine);
            painter.setPen(color);
            painter.setBrush(brush);

lm's avatar
lm committed
951 952
            float xPos = xCenter + (sin(((sat->azimuth/255.0f)*360.0f)/180.0f * M_PI) * cos(sat->elevation/180.0f * M_PI)) * radius;
            float yPos = yCenter - (cos(((sat->azimuth/255.0f)*360.0f)/180.0f * M_PI) * cos(sat->elevation/180.0f * M_PI)) * radius;
lm's avatar
lm committed
953

954
            // Draw circle for satellite, filled for used satellites
lm's avatar
lm committed
955
            drawCircle(xPos, yPos, vwidth*0.02f, 1.0f, color, &painter);
956
            // Draw satellite PRN
lm's avatar
lm committed
957
            paintText(QString::number(sat->id), QColor(255, 255, 255), 2.9f, xPos+1.7f, yPos+2.0f, &painter);
lm's avatar
lm committed
958 959
        }
    }
960 961
}

962
void HSIDisplay::drawObjects(QPainter &painter)
963
{
964
    Q_UNUSED(painter);
965 966
}

967
void HSIDisplay::drawPositionDirection(float xRef, float yRef, float radius, const QColor& color, QPainter* painter)
968
{
969 970 971 972 973
    if (xyControlKnown && xyControlEnabled)
    {
        // Draw the needle
        const float maxWidth = radius / 10.0f;
        const float minWidth = maxWidth * 0.3f;
974

975 976
        float angle = atan2(posXSet, -posYSet);
        angle -= M_PI/2.0f;
977

978
        QPolygonF p(6);
979

980
        //radius *= ((posXSaturation + posYSaturation) - sqrt(pow(posXSet, 2), pow(posYSet, 2))) / (2*posXSaturation);
lm's avatar
lm committed
981

982
        radius *= sqrt(pow(posXSet, 2) + pow(posYSet, 2)) / sqrt(posXSaturation + posYSaturation);
lm's avatar
lm committed
983

984 985 986 987 988 989
        p.replace(0, QPointF(xRef-maxWidth/2.0f, yRef-radius * 0.4f));
        p.replace(1, QPointF(xRef-minWidth/2.0f, yRef-radius * 0.9f));
        p.replace(2, QPointF(xRef+minWidth/2.0f, yRef-radius * 0.9f));
        p.replace(3, QPointF(xRef+maxWidth/2.0f, yRef-radius * 0.4f));
        p.replace(4, QPointF(xRef,               yRef-radius * 0.36f));
        p.replace(5, QPointF(xRef-maxWidth/2.0f, yRef-radius * 0.4f));
990

991
        rotatePolygonClockWiseRad(p, angle, QPointF(xRef, yRef));
992

993 994 995 996 997 998 999
        QBrush indexBrush;
        indexBrush.setColor(color);
        indexBrush.setStyle(Qt::SolidPattern);
        painter->setPen(Qt::SolidLine);
        painter->setPen(color);
        painter->setBrush(indexBrush);
        drawPolygon(p, painter);
lm's avatar
lm committed
1000

1001 1002
        //qDebug() << "DRAWING POS SETPOINT X:" << posXSet << "Y:" << posYSet << angle;
    }
1003 1004
}

1005
void HSIDisplay::drawAttitudeDirection(float xRef, float yRef, float radius, const QColor& color, QPainter* painter)
1006
{
1007 1008 1009 1010 1011
    if (attControlKnown && attControlEnabled)
    {
        // Draw the needle
        const float maxWidth = radius / 10.0f;
        const float minWidth = maxWidth * 0.3f;
1012

1013 1014
        float angle = atan2(attXSet, attYSet);
        angle -= M_PI/2.0f;
lm's avatar
lm committed
1015

1016
        radius *= sqrt(pow(attXSet, 2) + pow(attYSet, 2)) / sqrt(attXSaturation + attYSaturation);
1017

1018
        QPolygonF p(6);
1019

1020 1021 1022 1023 1024 1025
        p.replace(0, QPointF(xRef-maxWidth/2.0f, yRef-radius * 0.4f));
        p.replace(1, QPointF(xRef-minWidth/2.0f, yRef-radius * 0.9f));
        p.replace(2, QPointF(xRef+minWidth/2.0f, yRef-radius * 0.9f));
        p.replace(3, QPointF(xRef+maxWidth/2.0f, yRef-radius * 0.4f));
        p.replace(4, QPointF(xRef,               yRef-radius * 0.36f));
        p.replace(5, QPointF(xRef-maxWidth/2.0f, yRef-radius * 0.4f));
1026

1027
        rotatePolygonClockWiseRad(p, angle, QPointF(xRef, yRef));
1028

1029 1030 1031 1032 1033 1034 1035
        QBrush indexBrush;
        indexBrush.setColor(color);
        indexBrush.setStyle(Qt::SolidPattern);
        painter->setPen(Qt::SolidLine);
        painter->setPen(color);
        painter->setBrush(indexBrush);
        drawPolygon(p, painter);
1036

1037
        // TODO Draw Yaw indicator
lm's avatar
lm committed
1038

1039 1040
        //qDebug() << "DRAWING ATT SETPOINT X:" << attXSet << "Y:" << attYSet << angle;
    }
1041 1042 1043 1044
}

void HSIDisplay::drawAltitudeSetpoint(float xRef, float yRef, float radius, const QColor& color, QPainter* painter)
{
1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060
    if (zControlKnown && zControlEnabled)
    {
        // Draw the circle
        QPen circlePen(Qt::SolidLine);
        circlePen.setWidth(refLineWidthToPen(0.5f));
        circlePen.setColor(color);
        painter->setBrush(Qt::NoBrush);
        painter->setPen(circlePen);
        drawCircle(xRef, yRef, radius, 200.0f, color, painter);
        //drawCircle(xRef, yRef, radius, 200.0f, 170.0f, 1.0f, color, painter);

        //    // Draw the value
        //    QString label;
        //    label.sprintf("%05.1f", value);
        //    paintText(label, color, 4.5f, xRef-7.5f, yRef-2.0f, painter);
    }
1061
}
1062

1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
void HSIDisplay::wheelEvent(QWheelEvent* event)
{
    double zoomScale = 0.005; // Scaling of zoom value
    if(event->delta() > 0)
    {
        // Reduce width -> Zoom in
        metricWidth -= event->delta() * zoomScale;
    }
    else
    {
        // Increase width -> Zoom out
        metricWidth -= event->delta() * zoomScale;
    }
    metricWidth = qBound(0.1, metricWidth, 9999.0);
    emit metricWidthChanged(metricWidth);
}
pixhawk's avatar
pixhawk committed
1079

1080 1081 1082 1083
void HSIDisplay::showEvent(QShowEvent* event)
{
    // React only to internal (pre-display)
    // events
1084
    Q_UNUSED(event)
1085
    {
1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096
        refreshTimer->start(updateInterval);
    }
}

void HSIDisplay::hideEvent(QHideEvent* event)
{
    // React only to internal (post-display)
    // events
    Q_UNUSED(event)
    {
        refreshTimer->stop();
1097 1098 1099
    }
}

1100 1101
void HSIDisplay::updateJoystick(double roll, double pitch, double yaw, double thrust, int xHat, int yHat)
{
1102 1103 1104 1105 1106 1107
    Q_UNUSED(roll);
    Q_UNUSED(pitch);
    Q_UNUSED(yaw);
    Q_UNUSED(thrust);
    Q_UNUSED(xHat);
    Q_UNUSED(yHat);
1108 1109 1110 1111
}

void HSIDisplay::pressKey(int key)
{
1112
    Q_UNUSED(key);
1113
}
pixhawk's avatar
pixhawk committed
1114 1115