1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-01-18 03:52:11 +01:00

Settings for SVG analog dials all finalized except actual connection to UAVObjects. The test code randomly assigns values to the dials to demonstrate smooth needle rotation. Let me know if you like it!

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@570 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
edouard 2010-05-02 14:07:00 +00:00 committed by edouard
parent 2ab8ea6eb3
commit 61804f91dd
5 changed files with 169 additions and 56 deletions

View File

@ -48,6 +48,11 @@ AirspeedGadget::~AirspeedGadget()
void AirspeedGadget::loadConfiguration(IUAVGadgetConfiguration* config)
{
AirspeedGadgetConfiguration *m = qobject_cast<AirspeedGadgetConfiguration*>(config);
m_widget->setDialFile(m->dialFile());
m_widget->setDialFile(m->dialFile(), m->dialBackground(), m->dialForeground(), m->dialNeedle1(),
m->dialNeedle2());
m_widget->setN1Min(m->getN1Min());
m_widget->setN1Max(m->getN1Max());
m_widget->setN2Min(m->getN2Min());
m_widget->setN2Max(m->getN2Max());
}

View File

@ -55,6 +55,10 @@ QWidget *AirspeedGadgetOptionsPage::createPage(QWidget *parent)
options_page->foregroundID->setText(m_config->dialForeground());
options_page->needle1ID->setText(m_config->dialNeedle1());
options_page->needle2ID->setText(m_config->dialNeedle2());
options_page->needle1Min->setValue(m_config->getN1Min());
options_page->needle1Max->setValue(m_config->getN1Max());
options_page->needle2Min->setValue(m_config->getN2Min());
options_page->needle2Max->setValue(m_config->getN2Max());
connect(options_page->loadFile, SIGNAL(clicked()), this, SLOT(on_loadFile_clicked()));
@ -70,6 +74,14 @@ QWidget *AirspeedGadgetOptionsPage::createPage(QWidget *parent)
void AirspeedGadgetOptionsPage::apply()
{
m_config->setDialFile(options_page->svgSourceFile->text());
m_config->setDialBackgroundID(options_page->backgroundID->text());
m_config->setDialForegroundID(options_page->foregroundID->text());
m_config->setDialNeedleID1(options_page->needle1ID->text());
m_config->setDialNeedleID2(options_page->needle2ID->text());
m_config->setN1Min(options_page->needle1Min->value());
m_config->setN1Max(options_page->needle1Max->value());
m_config->setN2Min(options_page->needle2Min->value());
m_config->setN2Max(options_page->needle2Max->value());
}

View File

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>513</width>
<width>486</width>
<height>300</height>
</rect>
</property>
@ -24,11 +24,14 @@
<rect>
<x>-1</x>
<y>-1</y>
<width>511</width>
<width>481</width>
<height>339</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,0,0,0,0,0">
<property name="sizeConstraint">
<enum>QLayout::SetMinimumSize</enum>
</property>
<property name="leftMargin">
<number>10</number>
</property>
@ -137,7 +140,14 @@
</widget>
</item>
<item>
<widget class="QLineEdit" name="needle1ID"/>
<widget class="QLineEdit" name="needle1ID">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_6">
@ -147,7 +157,17 @@
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="needle1Min"/>
<widget class="QDoubleSpinBox" name="needle1Min">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<double>100000.000000000000000</double>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_7">
@ -157,7 +177,17 @@
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="needle1Max"/>
<widget class="QDoubleSpinBox" name="needle1Max">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<double>100000.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
@ -174,7 +204,7 @@
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_4"/>
<widget class="QLineEdit" name="uavObject1"/>
</item>
<item>
<widget class="QLabel" name="label_9">
@ -184,7 +214,7 @@
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_5"/>
<widget class="QLineEdit" name="objectField1"/>
</item>
</layout>
</item>
@ -225,7 +255,14 @@
</widget>
</item>
<item>
<widget class="QLineEdit" name="needle2ID"/>
<widget class="QLineEdit" name="needle2ID">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_18">
@ -235,7 +272,17 @@
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="needle2Min"/>
<widget class="QDoubleSpinBox" name="needle2Min">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<double>100000.000000000000000</double>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_19">
@ -245,7 +292,17 @@
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="needle2Max"/>
<widget class="QDoubleSpinBox" name="needle2Max">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<double>100000.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
@ -262,7 +319,7 @@
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_10"/>
<widget class="QLineEdit" name="uavObject2"/>
</item>
<item>
<widget class="QLabel" name="label_21">
@ -272,7 +329,7 @@
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_11"/>
<widget class="QLineEdit" name="objectField2"/>
</item>
</layout>
</item>

View File

@ -40,17 +40,22 @@ AirspeedGadgetWidget::AirspeedGadgetWidget(QWidget *parent) : QGraphicsView(pare
m_renderer = new QSvgRenderer();
m_background = new QGraphicsSvgItem();
m_foreground = new QGraphicsSvgItem();
m_desired = new QGraphicsSvgItem();
m_actual = new QGraphicsSvgItem();
//setDialFile(QFileDialog::getOpenFileName(qobject_cast<QWidget*>(this),
// tr("Airspeed Dial"), "../artwork/", tr("SVG File (*.svg)")) );
//setDialFile(QString("/usr/src/openpilot/artwork/Dials/extracts/speed-complete.svg"));
m_needle1 = new QGraphicsSvgItem();
m_needle2 = new QGraphicsSvgItem();
paint();
needle1Target = 0;
needle2Target = 0;
needle1Value = 0;
needle2Value = 0;
connect(&dialTimer, SIGNAL(timeout()), this, SLOT(rotateNeedles()));
dialTimer.start(30);
// Test code for timer to rotate the needle
testSpeed=0;
connect(&m_testTimer, SIGNAL(timeout()), this, SLOT(testRotate()));
m_testTimer.start(60);
m_testTimer.start(4000);
}
AirspeedGadgetWidget::~AirspeedGadgetWidget()
@ -58,24 +63,26 @@ AirspeedGadgetWidget::~AirspeedGadgetWidget()
// Do nothing
}
void AirspeedGadgetWidget::setDialFile(QString dfn)
void AirspeedGadgetWidget::setDialFile(QString dfn, QString bg, QString fg, QString n1, QString n2)
{
if (QFile::exists(dfn))
{
m_renderer->load(dfn);
if(m_renderer->isValid())
{
m_background->setSharedRenderer(m_renderer);
m_background->setElementId(QString("background"));
m_background->setElementId(bg);
m_foreground->setSharedRenderer(m_renderer);
m_foreground->setElementId(QString("foreground"));
m_foreground->setElementId(fg);
m_desired->setSharedRenderer(m_renderer);
m_desired->setElementId(QString("desired"));
m_needle1->setSharedRenderer(m_renderer);
m_needle1->setElementId(n1);
m_needle2->setSharedRenderer(m_renderer);
m_needle2->setElementId(n2);
m_actual->setSharedRenderer(m_renderer);
m_actual->setElementId(QString("needle"));
std::cout<<"Dial file loaded"<<std::endl;
QGraphicsScene *l_scene = scene();
@ -94,8 +101,8 @@ void AirspeedGadgetWidget::paint()
l_scene->clear();
l_scene->addItem(m_background);
l_scene->addItem(m_desired);
l_scene->addItem(m_actual);
l_scene->addItem(m_needle1);
l_scene->addItem(m_needle2);
l_scene->addItem(m_foreground);
l_scene->setSceneRect(m_background->boundingRect());
@ -120,33 +127,46 @@ void AirspeedGadgetWidget::resizeEvent(QResizeEvent *event)
fitInView(m_background, Qt::KeepAspectRatio );
}
// Take a unitless speed value and sets the actual needle accordingly
// scale fixed at 0-90 for now
void AirspeedGadgetWidget::setActual(int speed)
void AirspeedGadgetWidget::setNeedle1(double value) {
needle1Target = value;
}
void AirspeedGadgetWidget::setNeedle2(double value) {
needle2Target = value;
}
// Take an input value and rotate the dial accordingly
void AirspeedGadgetWidget::rotateNeedles()
{
m_actual->resetTransform();
QRectF rect = m_actual->boundingRect();
m_actual->translate(rect.width()/2,rect.height()/2);
m_actual->rotate(speed*3);
m_actual->translate(-rect.width()/2,-rect.height()/2);
if (needle2Value != needle2Target) {
(needle2Value > needle2Target) ? needle2Value-- : needle2Value++;
m_needle2->resetTransform();
QRectF rect = m_needle2->boundingRect();
m_needle2->translate(rect.width()/2,rect.height()/2);
m_needle2->rotate(360*needle2Value/n2MaxValue);
m_needle2->translate(-rect.width()/2,-rect.height()/2);
}
if (needle1Value != needle1Target) {
(needle1Value > needle1Target) ? needle1Value-- : needle1Value++;
m_needle1->resetTransform();
QRectF rect = m_needle1->boundingRect();
m_needle1->translate(rect.width()/2,rect.height()/2);
m_needle1->rotate(360*needle1Value/n1MaxValue);
m_needle1->translate(-rect.width()/2,-rect.height()/2);
}
update();
}
// Take a unitless speed value and sets the desired needle accordingly
// scale fixed at 0-90 for now
void AirspeedGadgetWidget::setDesired(int speed)
{
m_desired->resetTransform();
QRectF rect = m_desired->boundingRect();
m_desired->translate(rect.width()/2,rect.height()/2);
m_desired->rotate(speed*3);
m_desired->translate(-rect.width()/2,-rect.height()/2);
update();
}
// Test function for timer to rotate needles
void AirspeedGadgetWidget::testRotate()
{
if(testSpeed==90) testSpeed=0;
setActual(testSpeed++);
int testVal1 = rand() % (int)n1MaxValue;
int testVal2 = rand() % (int)n2MaxValue;
setNeedle1((double)testVal1);
setNeedle2((double)testVal2);
}

View File

@ -28,6 +28,7 @@
#ifndef AIRSPEEDGADGETWIDGET_H_
#define AIRSPEEDGADGETWIDGET_H_
#include "airspeedgadgetconfiguration.h"
#include <QGraphicsView>
#include <QtSvg/QSvgRenderer>
#include <QtSvg/QGraphicsSvgItem>
@ -43,10 +44,16 @@ class AirspeedGadgetWidget : public QGraphicsView
public:
AirspeedGadgetWidget(QWidget *parent = 0);
~AirspeedGadgetWidget();
void setDialFile(QString dfn);
void setDialFile(QString dfn, QString bg, QString fg, QString n1, QString n2);
void paint();
void setActual(int speed);
void setDesired(int speed);
// setNeedle1 and setNeedle2 use a timer to simulate
// needle inertia
void setNeedle1(double value);
void setNeedle2(double value);
void setN1Min(double value) {n1MinValue = value;}
void setN1Max(double value) {n1MaxValue = value;}
void setN2Min(double value) {n1MinValue = value;}
void setN2Max(double value) {n2MaxValue = value;}
protected:
void paintEvent(QPaintEvent *event);
@ -54,17 +61,29 @@ protected:
private:
// Test functions
private slots:
// Test function
void testRotate();
// End test functions
void rotateNeedles();
private:
QSvgRenderer *m_renderer;
QGraphicsSvgItem *m_background;
QGraphicsSvgItem *m_foreground;
QGraphicsSvgItem *m_desired;
QGraphicsSvgItem *m_actual;
QGraphicsSvgItem *m_needle1;
QGraphicsSvgItem *m_needle2;
double n1MinValue;
double n1MaxValue;
double n2MinValue;
double n2MaxValue;
double needle1Target;
double needle1Value;
double needle2Target;
double needle2Value;
// Rotation timer
QTimer dialTimer;
// Test variables
int testSpeed;