mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-02-21 11:54:15 +01:00
OP-82: PFD vertical speed scale is now working. Will require optimizations and polishing, but you can test it. Displays in km/h.
git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@976 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
parent
6f6a8e50ee
commit
08b27b7549
@ -50,8 +50,12 @@ PFDGadgetWidget::PFDGadgetWidget(QWidget *parent) : QGraphicsView(parent)
|
|||||||
obj3 = NULL;
|
obj3 = NULL;
|
||||||
*/
|
*/
|
||||||
// This timer mechanism makes needles rotate smoothly
|
// This timer mechanism makes needles rotate smoothly
|
||||||
connect(&dialTimer, SIGNAL(timeout()), this, SLOT(rotateNeedles()));
|
connect(&dialTimer, SIGNAL(timeout()), this, SLOT(moveNeedles()));
|
||||||
dialTimer.start(20);
|
dialTimer.start(20);
|
||||||
|
/*
|
||||||
|
connect(&dialTimer2,SIGNAL(timeout()), this, SLOT(moveVerticalScales()));
|
||||||
|
dialTimer2.start(20);
|
||||||
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +142,8 @@ void PFDGadgetWidget::updateHeading(UAVObject *object1) {
|
|||||||
field = object1->getField(heading);
|
field = object1->getField(heading);
|
||||||
if (field) {
|
if (field) {
|
||||||
// The speed scale represents 30km/h (6 * 5)
|
// The speed scale represents 30km/h (6 * 5)
|
||||||
groundspeedTarget = field->getDouble()*speedScaleHeight/(-30);
|
// 3.6 : convert m/s to km/h
|
||||||
|
groundspeedTarget = 3.6*field->getDouble()*speedScaleHeight/(-30);
|
||||||
}
|
}
|
||||||
if (!dialTimer.isActive())
|
if (!dialTimer.isActive())
|
||||||
dialTimer.start(); // Rearm the dial Timer which might be stopped.
|
dialTimer.start(); // Rearm the dial Timer which might be stopped.
|
||||||
@ -188,7 +193,7 @@ void PFDGadgetWidget::setDialFile(QString dfn)
|
|||||||
- Next point: nextwaypoint
|
- Next point: nextwaypoint
|
||||||
- Home point bearing: homewaypoint-bearing
|
- Home point bearing: homewaypoint-bearing
|
||||||
- Next point bearing: nextwaypoint-bearing
|
- Next point bearing: nextwaypoint-bearing
|
||||||
- Speed rectangle (left side): speed-bg (part of FOREGROUND)
|
- Speed rectangle (left side): speed-bg
|
||||||
- Speed scale: speed-scale.
|
- Speed scale: speed-scale.
|
||||||
- Black speed window: speed-window.
|
- Black speed window: speed-window.
|
||||||
*/
|
*/
|
||||||
@ -279,34 +284,48 @@ void PFDGadgetWidget::setDialFile(QString dfn)
|
|||||||
|
|
||||||
// Note: speed-scale should contain exactly 6 major ticks
|
// Note: speed-scale should contain exactly 6 major ticks
|
||||||
// for 30km/h
|
// for 30km/h
|
||||||
m_speedscale = new QGraphicsSvgItem();
|
m_speedscale = new QGraphicsItemGroup();
|
||||||
m_speedscale->setSharedRenderer(m_renderer);
|
|
||||||
m_speedscale->setElementId("speed-scale");
|
|
||||||
speedScaleHeight = compassMatrix.mapRect(m_renderer->boundsOnElement("speed-scale")).height();
|
|
||||||
startX = compassMatrix.mapRect(m_renderer->boundsOnElement("speed-bg")).width();
|
|
||||||
startX -= m_renderer->matrixForElement("speed-scale").mapRect((
|
|
||||||
m_renderer->boundsOnElement("speed-scale"))).width();
|
|
||||||
m_speedscale->setParentItem(m_speedbg);
|
m_speedscale->setParentItem(m_speedbg);
|
||||||
|
|
||||||
|
QGraphicsSvgItem *speedscalelines = new QGraphicsSvgItem();
|
||||||
|
speedscalelines->setSharedRenderer(m_renderer);
|
||||||
|
speedscalelines->setElementId("speed-scale");
|
||||||
|
speedScaleHeight = m_renderer->matrixForElement("speed-scale").mapRect(
|
||||||
|
m_renderer->boundsOnElement("speed-scale")).height();
|
||||||
|
startX = compassMatrix.mapRect(m_renderer->boundsOnElement("speed-bg")).width();
|
||||||
|
startX -= m_renderer->matrixForElement("speed-scale").mapRect(
|
||||||
|
m_renderer->boundsOnElement("speed-scale")).width();
|
||||||
|
//speedscalelines->setParentItem(m_speedbg);
|
||||||
matrix.reset();
|
matrix.reset();
|
||||||
matrix.translate(startX,0);
|
matrix.translate(startX,0);
|
||||||
m_speedscale->setTransform(matrix,false);
|
speedscalelines->setTransform(matrix,false);
|
||||||
|
// Quick way to reposition the item before putting it in the group:
|
||||||
//// WORK IN PROGRESS
|
speedscalelines->setParentItem(m_speedbg);
|
||||||
|
m_speedscale->addToGroup(speedscalelines); // (reparents the item)
|
||||||
|
|
||||||
// Add the scale text elements:
|
// Add the scale text elements:
|
||||||
QGraphicsTextItem *speed0 = new QGraphicsTextItem("000");
|
QGraphicsTextItem *speed0 = new QGraphicsTextItem("0");
|
||||||
|
speed0->setDefaultTextColor(QColor("White"));
|
||||||
|
speed0->setFont(QFont("Arial",(int) speedScaleHeight/30));
|
||||||
matrix.reset();
|
matrix.reset();
|
||||||
matrix.translate(compassMatrix.mapRect(m_renderer->boundsOnElement("speed-bg")).width()/10,0);
|
matrix.translate(compassMatrix.mapRect(m_renderer->boundsOnElement("speed-bg")).width()/10,-speedScaleHeight/30);
|
||||||
speed0->setTransform(matrix,false);
|
speed0->setTransform(matrix,false);
|
||||||
speed0->setParentItem(m_speedbg);
|
speed0->setParentItem(m_speedbg);
|
||||||
|
m_speedscale->addToGroup(speed0);
|
||||||
for (int i=0; i<6;i++) {
|
for (int i=0; i<6;i++) {
|
||||||
speed0 = new QGraphicsTextItem("000");
|
speed0 = new QGraphicsTextItem("");
|
||||||
speed0->setPlainText(QString().setNum(i*5));
|
speed0->setDefaultTextColor(QColor("White"));
|
||||||
|
speed0->setFont(QFont("Arial",(int) speedScaleHeight/30));
|
||||||
|
speed0->setPlainText(QString().setNum(i*5+1));
|
||||||
matrix.translate(0,speedScaleHeight/6);
|
matrix.translate(0,speedScaleHeight/6);
|
||||||
speed0->setTransform(matrix,false);
|
speed0->setTransform(matrix,false);
|
||||||
speed0->setParentItem(m_speedbg);
|
speed0->setParentItem(m_speedbg);
|
||||||
|
m_speedscale->addToGroup(speed0);
|
||||||
}
|
}
|
||||||
|
// Now vertically center the speed scale on the speed background
|
||||||
|
QRectF rectB = m_speedbg->boundingRect();
|
||||||
|
QRectF rectN = speedscalelines->boundingRect();
|
||||||
|
m_speedscale->setPos(0,rectB.height()/2-rectN.height()/2);
|
||||||
|
|
||||||
l_scene->setSceneRect(m_background->boundingRect());
|
l_scene->setSceneRect(m_background->boundingRect());
|
||||||
|
|
||||||
@ -314,8 +333,8 @@ void PFDGadgetWidget::setDialFile(QString dfn)
|
|||||||
// center of the background:
|
// center of the background:
|
||||||
|
|
||||||
// 1) Move the center of the needle to the center of the background.
|
// 1) Move the center of the needle to the center of the background.
|
||||||
QRectF rectB = m_background->boundingRect();
|
rectB = m_background->boundingRect();
|
||||||
QRectF rectN = m_world->boundingRect();
|
rectN = m_world->boundingRect();
|
||||||
m_world->setPos(rectB.width()/2-rectN.width()/2,rectB.height()/2-rectN.height()/2);
|
m_world->setPos(rectB.width()/2-rectN.width()/2,rectB.height()/2-rectN.height()/2);
|
||||||
// 2) Put the transform origin point of the needle at its center.
|
// 2) Put the transform origin point of the needle at its center.
|
||||||
m_world->setTransformOriginPoint(rectN.width()/2,rectN.height()/2);
|
m_world->setTransformOriginPoint(rectN.width()/2,rectN.height()/2);
|
||||||
@ -370,11 +389,18 @@ void PFDGadgetWidget::resizeEvent(QResizeEvent *event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Update method for the vertical scales
|
||||||
|
*/
|
||||||
|
void PFDGadgetWidget::moveVerticalScales() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Take an input value and move the elements accordingly.
|
// Take an input value and move the elements accordingly.
|
||||||
// Movement is smooth, starts fast and slows down when
|
// Movement is smooth, starts fast and slows down when
|
||||||
// approaching the target.
|
// approaching the target.
|
||||||
//
|
//
|
||||||
void PFDGadgetWidget::rotateNeedles()
|
void PFDGadgetWidget::moveNeedles()
|
||||||
{
|
{
|
||||||
int dialCount = 4; // Gets decreased by one for each element
|
int dialCount = 4; // Gets decreased by one for each element
|
||||||
// which has finished moving
|
// which has finished moving
|
||||||
@ -441,13 +467,10 @@ void PFDGadgetWidget::rotateNeedles()
|
|||||||
//
|
//
|
||||||
// TODO: find a way to move the speed scale faster if we are far
|
// TODO: find a way to move the speed scale faster if we are far
|
||||||
// from the target, maybe a separate timer would be useful there?
|
// from the target, maybe a separate timer would be useful there?
|
||||||
|
// What is the consequence on CPU usage?
|
||||||
//////
|
//////
|
||||||
if ((abs((groundspeedValue-groundspeedTarget)*10) > 5)) {
|
if ((abs((groundspeedValue-groundspeedTarget)*10) > 5)) {
|
||||||
if (groundspeedValue>groundspeedTarget) {
|
groundspeedValue += (groundspeedTarget-groundspeedValue)/5;
|
||||||
groundspeedValue -= speedScaleHeight/60;
|
|
||||||
} else {
|
|
||||||
groundspeedValue += speedScaleHeight/60;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
groundspeedValue = groundspeedTarget;
|
groundspeedValue = groundspeedTarget;
|
||||||
dialCount--;
|
dialCount--;
|
||||||
@ -455,6 +478,19 @@ void PFDGadgetWidget::rotateNeedles()
|
|||||||
qreal x = m_speedscale->transform().dx();
|
qreal x = m_speedscale->transform().dx();
|
||||||
opd = QPointF(x,fmod(groundspeedValue,speedScaleHeight/6));
|
opd = QPointF(x,fmod(groundspeedValue,speedScaleHeight/6));
|
||||||
m_speedscale->setTransform(QTransform::fromTranslate(opd.x(),opd.y()), false);
|
m_speedscale->setTransform(QTransform::fromTranslate(opd.x(),opd.y()), false);
|
||||||
|
// TODO: optimize this by skipping if not necessary...
|
||||||
|
// Now update the text elements inside the scale:
|
||||||
|
// (Qt documentation states that the list has the same order
|
||||||
|
// as the item add order in the QGraphicsItemGroup)
|
||||||
|
QList <QGraphicsItem *> textList = m_speedscale->childItems();
|
||||||
|
qreal val = -5*ceil(groundspeedValue/speedScaleHeight*6)-15;
|
||||||
|
foreach( QGraphicsItem * item, textList) {
|
||||||
|
if (QGraphicsTextItem *text = qgraphicsitem_cast<QGraphicsTextItem *>(item)) {
|
||||||
|
QString s = (val<0) ? QString() : QString().sprintf("%.0f",val);
|
||||||
|
text->setPlainText(s);
|
||||||
|
val += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//update();
|
//update();
|
||||||
if (!dialCount)
|
if (!dialCount)
|
||||||
|
@ -70,7 +70,8 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void rotateNeedles();
|
void moveNeedles();
|
||||||
|
void moveVerticalScales();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QSvgRenderer *m_renderer;
|
QSvgRenderer *m_renderer;
|
||||||
@ -98,7 +99,7 @@ private:
|
|||||||
// Vertical speed frame:
|
// Vertical speed frame:
|
||||||
QGraphicsSvgItem *m_speedbg;
|
QGraphicsSvgItem *m_speedbg;
|
||||||
// Vertical Speed scale:
|
// Vertical Speed scale:
|
||||||
QGraphicsSvgItem *m_speedscale;
|
QGraphicsItemGroup *m_speedscale;
|
||||||
// Vertical altitude frame:
|
// Vertical altitude frame:
|
||||||
QGraphicsSvgItem *m_altitudebg;
|
QGraphicsSvgItem *m_altitudebg;
|
||||||
// Vertical altitude scale:
|
// Vertical altitude scale:
|
||||||
@ -136,6 +137,7 @@ private:
|
|||||||
|
|
||||||
// Rotation timer
|
// Rotation timer
|
||||||
QTimer dialTimer;
|
QTimer dialTimer;
|
||||||
|
QTimer dialTimer2;
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif /* PFDGADGETWIDGET_H_ */
|
#endif /* PFDGADGETWIDGET_H_ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user