2 changed files with 251 additions and 0 deletions
@ -0,0 +1,186 @@
@@ -0,0 +1,186 @@
|
||||
/*=====================================================================
|
||||
|
||||
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 Implementation of Horizontal Situation Indicator class
|
||||
* |
||||
* @author Lorenz Meier <mavteam@student.ethz.ch> |
||||
* |
||||
*/ |
||||
|
||||
#include <QFile> |
||||
#include <QStringList> |
||||
#include "UASManager.h" |
||||
#include "HSIDisplay.h" |
||||
#include "MG.h" |
||||
|
||||
#include <QDebug> |
||||
|
||||
HSIDisplay::HSIDisplay(QStringList* plotList, QWidget *parent) : |
||||
HDDisplay(plotList, parent), |
||||
{ |
||||
|
||||
} |
||||
|
||||
void HSIDisplay::paintDisplay() |
||||
{ |
||||
quint64 refreshInterval = 100; |
||||
quint64 currTime = MG::TIME::getGroundTimeNow(); |
||||
if (currTime - lastPaintTime < refreshInterval) |
||||
{ |
||||
// FIXME Need to find the source of the spurious paint events
|
||||
//return;
|
||||
} |
||||
lastPaintTime = currTime; |
||||
// 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; |
||||
|
||||
QPainter painter(this); |
||||
painter.setRenderHint(QPainter::Antialiasing, true); |
||||
painter.setRenderHint(QPainter::HighQualityAntialiasing, true); |
||||
painter.fillRect(QRect(0, 0, width(), height()), backgroundColor); |
||||
const int columns = 3; |
||||
const float spacing = 0.4f; // 40% of width
|
||||
const float gaugeWidth = vwidth / (((float)columns) + (((float)columns+1) * spacing + spacing * 0.1f)); |
||||
const QColor gaugeColor = QColor(200, 200, 200); |
||||
//drawSystemIndicator(10.0f-gaugeWidth/2.0f, 20.0f, 10.0f, 40.0f, 15.0f, &painter);
|
||||
//drawGauge(15.0f, 15.0f, gaugeWidth/2.0f, 0, 1.0f, "thrust", values.value("thrust", 0.0f), gaugeColor, &painter, qMakePair(0.45f, 0.8f), qMakePair(0.8f, 1.0f), true);
|
||||
//drawGauge(15.0f+gaugeWidth*1.7f, 15.0f, gaugeWidth/2.0f, 0, 10.0f, "altitude", values.value("altitude", 0.0f), gaugeColor, &painter, qMakePair(1.0f, 2.5f), qMakePair(0.0f, 0.5f), true);
|
||||
|
||||
// Left spacing from border / other gauges, measured from left edge to center
|
||||
// float leftSpacing = gaugeWidth * spacing;
|
||||
// float xCoord = leftSpacing + gaugeWidth/2.0f;
|
||||
//
|
||||
// float topSpacing = leftSpacing;
|
||||
// float yCoord = topSpacing + gaugeWidth/2.0f;
|
||||
//
|
||||
// for (int i = 0; i < acceptList->size(); ++i)
|
||||
// {
|
||||
// QString value = acceptList->at(i);
|
||||
// drawGauge(xCoord, yCoord, gaugeWidth/2.0f, minValues.value(value, -1.0f), maxValues.value(value, 1.0f), value, values.value(value, minValues.value(value, 0.0f)), gaugeColor, &painter, goodRanges.value(value, qMakePair(0.0f, 0.5f)), critRanges.value(value, qMakePair(0.7f, 1.0f)), true);
|
||||
// xCoord += gaugeWidth + leftSpacing;
|
||||
// // Move one row down if necessary
|
||||
// if (xCoord + gaugeWidth > vwidth)
|
||||
// {
|
||||
// yCoord += topSpacing + gaugeWidth;
|
||||
// xCoord = leftSpacing + gaugeWidth/2.0f;
|
||||
// }
|
||||
// }
|
||||
} |
||||
|
||||
/**
|
||||
* |
||||
* @param uas the UAS/MAV to monitor/display with the HUD |
||||
*/ |
||||
void HSIDisplay::setActiveUAS(UASInterface* uas) |
||||
{ |
||||
HDDisplay::setActiveUAS(uas); |
||||
//qDebug() << "ATTEMPTING TO SET UAS";
|
||||
if (this->uas != NULL && this->uas != uas) |
||||
{ |
||||
// Disconnect any previously connected active MAV
|
||||
//disconnect(uas, SIGNAL(valueChanged(UASInterface*,QString,double,quint64)), this, SLOT(updateValue(UASInterface*,QString,double,quint64)));
|
||||
} |
||||
|
||||
// Now connect the new UAS
|
||||
|
||||
//if (this->uas != uas)
|
||||
// {
|
||||
//qDebug() << "UAS SET!" << "ID:" << uas->getUASID();
|
||||
// Setup communication
|
||||
//connect(uas, SIGNAL(valueChanged(UASInterface*,QString,double,quint64)), this, SLOT(updateValue(UASInterface*,QString,double,quint64)));
|
||||
//}
|
||||
} |
||||
|
||||
void HSIDisplay::drawGPS() |
||||
{ |
||||
|
||||
} |
||||
|
||||
void HSIDisplay::drawObjects() |
||||
{ |
||||
|
||||
} |
||||
|
||||
void HSIDisplay::drawBaseLines(float xRef, float yRef, float radius, float yaw, const QColor& color, QPainter* painter, bool solid) |
||||
{ |
||||
// Draw the circle
|
||||
QPen circlePen(Qt::SolidLine); |
||||
if (!solid) circlePen.setStyle(Qt::DotLine); |
||||
circlePen.setWidth(refLineWidthToPen(0.5f)); |
||||
circlePen.setColor(defaultColor); |
||||
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);
|
||||
|
||||
QString label; |
||||
label.sprintf("%05.1f", value); |
||||
|
||||
// Draw the value
|
||||
paintText(label, color, 4.5f, xRef-7.5f, yRef-2.0f, painter); |
||||
|
||||
// Draw the needle
|
||||
// Scale the rotation so that the gauge does one revolution
|
||||
// per max. change
|
||||
const float rangeScale = (2.0f * M_PI); |
||||
const float maxWidth = radius / 10.0f; |
||||
const float minWidth = maxWidth * 0.3f; |
||||
|
||||
QPolygonF p(6); |
||||
|
||||
p.replace(0, QPointF(xRef-maxWidth/2.0f, yRef-radius * 0.5f)); |
||||
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.5f)); |
||||
p.replace(4, QPointF(xRef, yRef-radius * 0.46f)); |
||||
p.replace(5, QPointF(xRef-maxWidth/2.0f, yRef-radius * 0.5f)); |
||||
|
||||
rotatePolygonClockWiseRad(p, yaw*rangeScale, QPointF(xRef, yRef)); |
||||
|
||||
QBrush indexBrush; |
||||
indexBrush.setColor(defaultColor); |
||||
indexBrush.setStyle(Qt::SolidPattern); |
||||
painter->setPen(Qt::SolidLine); |
||||
painter->setPen(defaultColor); |
||||
painter->setBrush(indexBrush); |
||||
drawPolygon(p, painter); |
||||
} |
||||
|
||||
void HDDisplay::changeEvent(QEvent *e) |
||||
{ |
||||
QWidget::changeEvent(e); |
||||
switch (e->type()) { |
||||
case QEvent::LanguageChange: |
||||
m_ui->retranslateUi(this); |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
} |
@ -0,0 +1,65 @@
@@ -0,0 +1,65 @@
|
||||
/*=====================================================================
|
||||
|
||||
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 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 <cmath> |
||||
|
||||
#include "HDDisplay.h" |
||||
|
||||
class HSIDisplay : public HDDisplay { |
||||
Q_OBJECT |
||||
public: |
||||
HSIDisplay(QStringList* plotList, QWidget *parent = 0); |
||||
~HSIDisplay(); |
||||
|
||||
public slots: |
||||
void setActiveUAS(UASInterface* uas); |
||||
|
||||
protected slots: |
||||
void paintDisplay(); |
||||
void drawGPS(); |
||||
void drawObjects(); |
||||
void drawBaseLines(float xRef, float yRef, float radius, float yaw, const QColor& color, QPainter* painter, bool solid); |
||||
|
||||
|
||||
protected: |
||||
|
||||
private: |
||||
}; |
||||
|
||||
#endif // HSIDISPLAY_H
|
Loading…
Reference in new issue