diff --git a/ground/openpilotgcs/share/openpilotgcs/pfd/default/AltitudeScale.qml b/ground/openpilotgcs/share/openpilotgcs/pfd/default/AltitudeScale.qml index a8f4d66b2..4d0ef2c89 100644 --- a/ground/openpilotgcs/share/openpilotgcs/pfd/default/AltitudeScale.qml +++ b/ground/openpilotgcs/share/openpilotgcs/pfd/default/AltitudeScale.qml @@ -24,10 +24,10 @@ Item { anchors.verticalCenter: parent.verticalCenter // The altitude scale represents 30 meters, // move it in 0..5m range - anchors.verticalCenterOffset: -height/30 * (PositionActual.Down-Math.floor(PositionActual.Down/5)*5) + anchors.verticalCenterOffset: -height/30 * (PositionActual.Down-Math.floor(PositionActual.Down/5*qmlWidget.altitudeFactor)*5) anchors.left: parent.left - property int topNumber: 15-Math.floor(PositionActual.Down/5)*5 + property int topNumber: 15-Math.floor(PositionActual.Down/5*qmlWidget.altitudeFactor)*5 // Altitude numbers Column { @@ -52,7 +52,6 @@ Item { } } - SvgElementImage { id: altitude_window clip: true @@ -69,7 +68,7 @@ Item { Text { id: altitude_text - text: Math.floor(-PositionActual.Down).toFixed() + text: Math.floor(-PositionActual.Down * qmlWidget.altitudeFactor).toFixed() color: "white" font { family: "Arial" @@ -78,4 +77,26 @@ Item { anchors.centerIn: parent } } + + SvgElementImage { + id: altitude_unit + elementName: "altitude-unit" + sceneSize: sceneItem.sceneSize + clip: true + + x: Math.floor(scaledBounds.x * sceneItem.width) + y: Math.floor(scaledBounds.y * sceneItem.height) + + Text { + id: altitude_unit_text + text: qmlWidget.altitudeUnit + color: "white" + font { + family: "Arial" + pixelSize: parent.height + } + anchors.right: parent.right + } + } + } diff --git a/ground/openpilotgcs/share/openpilotgcs/pfd/default/PfdIndicators.qml b/ground/openpilotgcs/share/openpilotgcs/pfd/default/PfdIndicators.qml index 8d821e7c3..6824d5a7c 100644 --- a/ground/openpilotgcs/share/openpilotgcs/pfd/default/PfdIndicators.qml +++ b/ground/openpilotgcs/share/openpilotgcs/pfd/default/PfdIndicators.qml @@ -31,7 +31,7 @@ Item { Text { id: gps_text - text: "GPS: " + GPSPosition.Satellites + "\nPDP: " + GPSPosition.PDOP + text: "GPS: " + GPSPosition.Satellites + "\nPDP: " + Math.round(GPSPosition.PDOP*1000)/1000 color: "white" font.family: "Arial" font.pixelSize: telemetry_status.height * 0.75 diff --git a/ground/openpilotgcs/share/openpilotgcs/pfd/default/SpeedScale.qml b/ground/openpilotgcs/share/openpilotgcs/pfd/default/SpeedScale.qml index 804319181..6d8643e66 100644 --- a/ground/openpilotgcs/share/openpilotgcs/pfd/default/SpeedScale.qml +++ b/ground/openpilotgcs/share/openpilotgcs/pfd/default/SpeedScale.qml @@ -3,7 +3,7 @@ import Qt 4.7 Item { id: sceneItem property variant sceneSize - property real groundSpeed : Math.sqrt(Math.pow(VelocityActual.North,2)+ + property real groundSpeed : qmlWidget.speedFactor * Math.sqrt(Math.pow(VelocityActual.North,2)+ Math.pow(VelocityActual.East,2)) SvgElementImage { @@ -58,7 +58,6 @@ Item { } } - SvgElementImage { id: speed_window clip: true @@ -82,4 +81,25 @@ Item { anchors.centerIn: parent } } + + SvgElementImage { + id: speed_unit + elementName: "speed-unit" + sceneSize: sceneItem.sceneSize + clip: true + + x: Math.floor(scaledBounds.x * sceneItem.width) + y: Math.floor(scaledBounds.y * sceneItem.height) + + Text { + id: speed_unit_text + text: qmlWidget.speedUnit + color: "white" + font { + family: "Arial" + pixelSize: parent.height + } + anchors.right: parent.right + } + } } diff --git a/ground/openpilotgcs/share/openpilotgcs/pfd/default/pfd.svg b/ground/openpilotgcs/share/openpilotgcs/pfd/default/pfd.svg index abdc4f8c5..2b7ff19bd 100644 --- a/ground/openpilotgcs/share/openpilotgcs/pfd/default/pfd.svg +++ b/ground/openpilotgcs/share/openpilotgcs/pfd/default/pfd.svg @@ -14,8 +14,8 @@ height="707.56323" id="svg2" version="1.1" - inkscape:version="0.48.3.1 r9886" - sodipodi:docname="pfd-11.svg" + inkscape:version="0.48.4 r9939" + sodipodi:docname="pfd.svg" style="display:inline" inkscape:export-filename="C:\Users\Nuno\Desktop\OpenPilot\PFD\PFD-4.png" inkscape:export-xdpi="71.993568" @@ -1616,15 +1616,15 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1.1617336" - inkscape:cx="415.72223" - inkscape:cy="353.78162" + inkscape:cx="613.40088" + inkscape:cy="388.21292" inkscape:document-units="px" - inkscape:current-layer="svg2" + inkscape:current-layer="foreground" showgrid="false" inkscape:window-width="1920" inkscape:window-height="1017" - inkscape:window-x="-4" - inkscape:window-y="-4" + inkscape:window-x="-8" + inkscape:window-y="-8" inkscape:window-maximized="1" showguides="false" inkscape:guide-bbox="true" @@ -1953,8 +1953,7 @@ id="layer3" inkscape:label="foreground" style="display:inline" - transform="translate(230.4171,-2.5493479)" - sodipodi:insensitive="true"> + transform="translate(230.4171,-2.5493479)"> @@ -1980,7 +1979,7 @@ + transform="translate(19.192898,0)"> + transform="translate(184.16754,0)"> + + + - ALT - m/s - m + inkscape:label="rect2816" + style="display:inline"> setLatitude(m->latitude()); m_widget->setLongitude(m->longitude()); m_widget->setAltitude(m->altitude()); + m_widget->setSpeedFactor(m->speedFactor()); + m_widget->setSpeedUnit(m->speedUnit()); + m_widget->setAltitudeFactor(m->altitudeFactor()); + m_widget->setAltitudeUnit(m->altitudeUnit()); // setting OSGEARTH_CACHE_ONLY seems to work the most reliably // between osgEarth versions I tried diff --git a/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetconfiguration.cpp b/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetconfiguration.cpp index e00e52a1d..d3efb6a42 100644 --- a/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetconfiguration.cpp +++ b/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetconfiguration.cpp @@ -31,8 +31,19 @@ PfdQmlGadgetConfiguration::PfdQmlGadgetConfiguration(QString classId, QSettings m_latitude(0), m_longitude(0), m_altitude(0), - m_cacheOnly(false) + m_cacheOnly(false), + m_speedFactor(1.0), + m_altitudeFactor(1.0) { + + m_speedMap[1.0] = "m/s"; + m_speedMap[3.6] = "km/h"; + m_speedMap[2.2369] = "mph"; + m_speedMap[1.9438] = "knots"; + + m_altitudeMap[1.0] = "m"; + m_altitudeMap[3.2808] = "ft"; + // if a saved configuration exists load it if (qSettings != 0) { m_qmlFile = qSettings->value("qmlFile").toString(); @@ -48,6 +59,8 @@ PfdQmlGadgetConfiguration::PfdQmlGadgetConfiguration(QString classId, QSettings m_longitude = qSettings->value("longitude").toDouble(); m_altitude = qSettings->value("altitude").toDouble(); m_cacheOnly = qSettings->value("cacheOnly").toBool(); + m_speedFactor = qSettings->value("speedFactor").toDouble(); + m_altitudeFactor = qSettings->value("altitudeFactor").toDouble(); } } @@ -68,6 +81,8 @@ IUAVGadgetConfiguration *PfdQmlGadgetConfiguration::clone() m->m_longitude = m_longitude; m->m_altitude = m_altitude; m->m_cacheOnly = m_cacheOnly; + m->m_speedFactor = m_speedFactor; + m->m_altitudeFactor = m_altitudeFactor; return m; } @@ -91,4 +106,6 @@ void PfdQmlGadgetConfiguration::saveConfig(QSettings *qSettings) const qSettings->setValue("longitude", m_longitude); qSettings->setValue("altitude", m_altitude); qSettings->setValue("cacheOnly", m_cacheOnly); + qSettings->setValue("speedFactor", m_speedFactor); + qSettings->setValue("altitudeFactor", m_altitudeFactor); } diff --git a/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetconfiguration.h b/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetconfiguration.h index f09e4a0ad..7171c3bd9 100644 --- a/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetconfiguration.h +++ b/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetconfiguration.h @@ -18,6 +18,7 @@ #define PFDQMLGADGETCONFIGURATION_H #include +#include using namespace Core; @@ -62,6 +63,14 @@ public: { m_cacheOnly = flag; } + void setSpeedFactor(double factor) + { + m_speedFactor = factor; + } + void setAltitudeFactor(double factor) + { + m_altitudeFactor = factor; + } QString qmlFile() const { @@ -99,6 +108,34 @@ public: { return m_cacheOnly; } + double speedFactor() const + { + return m_speedFactor; + } + double altitudeFactor() const + { + return m_altitudeFactor; + } + + QString speedUnit() const + { + return m_speedMap[m_speedFactor]; + } + + QString altitudeUnit() const + { + return m_altitudeMap[m_altitudeFactor]; + } + + QMapIterator speedMapIterator() + { + return QMapIterator(m_speedMap); + } + + QMapIterator altitudeMapIterator() + { + return QMapIterator(m_altitudeMap); + } void saveConfig(QSettings *settings) const; IUAVGadgetConfiguration *clone(); @@ -113,6 +150,10 @@ private: double m_longitude; double m_altitude; bool m_cacheOnly; + double m_speedFactor; + double m_altitudeFactor; + QMap m_speedMap; + QMap m_altitudeMap; }; #endif // PfdQmlGADGETCONFIGURATION_H diff --git a/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetoptionspage.cpp b/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetoptionspage.cpp index 0b20b8480..99fb40501 100644 --- a/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetoptionspage.cpp @@ -62,6 +62,23 @@ QWidget *PfdQmlGadgetOptionsPage::createPage(QWidget *parent) options_page->altitude->setText(QString::number(m_config->altitude())); options_page->useOnlyCache->setChecked(m_config->cacheOnly()); + //Setup units combos + QMapIterator iter = m_config->speedMapIterator(); + while(iter.hasNext()) + { + iter.next(); + options_page->speedUnitCombo->addItem(iter.value(), iter.key()); + } + options_page->speedUnitCombo->setCurrentIndex(options_page->speedUnitCombo->findData(m_config->speedFactor())); + + iter = m_config->altitudeMapIterator(); + while(iter.hasNext()) + { + iter.next(); + options_page->altUnitCombo->addItem(iter.value(), iter.key()); + } + options_page->altUnitCombo->setCurrentIndex(options_page->altUnitCombo->findData(m_config->altitudeFactor())); + #ifndef USE_OSG options_page->showTerrain->setChecked(false); options_page->showTerrain->setVisible(false); @@ -93,6 +110,9 @@ void PfdQmlGadgetOptionsPage::apply() m_config->setLongitude(options_page->longitude->text().toDouble()); m_config->setAltitude(options_page->altitude->text().toDouble()); m_config->setCacheOnly(options_page->useOnlyCache->isChecked()); + + m_config->setSpeedFactor(options_page->speedUnitCombo->itemData(options_page->speedUnitCombo->currentIndex()).toDouble()); + m_config->setAltitudeFactor(options_page->altUnitCombo->itemData(options_page->altUnitCombo->currentIndex()).toDouble()); } void PfdQmlGadgetOptionsPage::finish() diff --git a/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetoptionspage.ui b/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetoptionspage.ui index 20d617e9b..bb136c6e1 100644 --- a/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetoptionspage.ui +++ b/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetoptionspage.ui @@ -6,8 +6,8 @@ 0 0 - 457 - 436 + 636 + 558 @@ -19,11 +19,11 @@ Form - + 0 - + QFrame::NoFrame @@ -39,15 +39,15 @@ 0 0 - 457 - 436 + 636 + 558 - + 0 - + 10 @@ -77,7 +77,7 @@ - + Use OpenGL @@ -87,7 +87,45 @@ - + + + + + + Speed Unit: + + + + + + + Altitude Unit: + + + + + + + + 150 + 16777215 + + + + + + + + + 150 + 16777215 + + + + + + + Show Terrain: @@ -223,7 +261,7 @@ - + Qt::Vertical diff --git a/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetwidget.cpp index 60fe0539c..b28e1e418 100644 --- a/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetwidget.cpp @@ -39,7 +39,11 @@ PfdQmlGadgetWidget::PfdQmlGadgetWidget(QWidget *parent) : m_actualPositionUsed(false), m_latitude(46.671478), m_longitude(10.158932), - m_altitude(2000) + m_altitude(2000), + m_speedUnit("m/s"), + m_speedFactor(1.0), + m_altitudeUnit("m"), + m_altitudeFactor(1.0) { setMinimumSize(64, 64); setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); @@ -121,6 +125,38 @@ void PfdQmlGadgetWidget::setTerrainEnabled(bool arg) } } +void PfdQmlGadgetWidget::setSpeedUnit(QString unit) +{ + if (m_speedUnit != unit) { + m_speedUnit = unit; + emit speedUnitChanged(unit); + } +} + +void PfdQmlGadgetWidget::setSpeedFactor(double factor) +{ + if (m_speedFactor != factor) { + m_speedFactor = factor; + emit speedFactorChanged(factor); + } +} + +void PfdQmlGadgetWidget::setAltitudeUnit(QString unit) +{ + if (m_altitudeUnit != unit) { + m_altitudeUnit = unit; + emit altitudeUnitChanged(unit); + } +} + +void PfdQmlGadgetWidget::setAltitudeFactor(double factor) +{ + if (m_altitudeFactor != factor) { + m_altitudeFactor = factor; + emit altitudeFactorChanged(factor); + } +} + void PfdQmlGadgetWidget::setOpenGLEnabled(bool arg) { if (m_openGLEnabled != arg) { diff --git a/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetwidget.h b/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetwidget.h index 77ab49f9d..46d540345 100644 --- a/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetwidget.h +++ b/ground/openpilotgcs/src/plugins/pfdqml/pfdqmlgadgetwidget.h @@ -26,6 +26,11 @@ class PfdQmlGadgetWidget : public QDeclarativeView { Q_PROPERTY(bool actualPositionUsed READ actualPositionUsed WRITE setActualPositionUsed NOTIFY actualPositionUsedChanged) + Q_PROPERTY(QString speedUnit READ speedUnit WRITE setSpeedUnit NOTIFY speedUnitChanged) + Q_PROPERTY(double speedFactor READ speedFactor WRITE setSpeedFactor NOTIFY speedFactorChanged) + Q_PROPERTY(QString altitudeUnit READ altitudeUnit WRITE setAltitudeUnit NOTIFY altitudeUnitChanged) + Q_PROPERTY(double altitudeFactor READ altitudeFactor WRITE setAltitudeFactor NOTIFY altitudeFactorChanged) + // pre-defined fallback position Q_PROPERTY(double latitude READ latitude WRITE setLatitude NOTIFY latitudeChanged) Q_PROPERTY(double longitude READ longitude WRITE setLongitude NOTIFY longitudeChanged) @@ -45,6 +50,23 @@ public: return m_terrainEnabled && m_openGLEnabled; } + QString speedUnit() const + { + return m_speedUnit; + } + double speedFactor() const + { + return m_speedFactor; + } + QString altitudeUnit() const + { + return m_altitudeUnit; + } + double altitudeFactor() const + { + return m_altitudeFactor; + } + bool actualPositionUsed() const { return m_actualPositionUsed; @@ -65,6 +87,12 @@ public: public slots: void setEarthFile(QString arg); void setTerrainEnabled(bool arg); + + void setSpeedUnit(QString unit); + void setSpeedFactor(double factor); + void setAltitudeUnit(QString unit); + void setAltitudeFactor(double factor); + void setOpenGLEnabled(bool arg); void setLatitude(double arg); @@ -82,6 +110,11 @@ signals: void longitudeChanged(double arg); void altitudeChanged(double arg); + void speedUnitChanged(QString arg); + void speedFactorChanged(double arg); + void altitudeUnitChanged(QString arg); + void altitudeFactorChanged(double arg); + private: QString m_qmlFileName; QString m_earthFile; @@ -92,6 +125,11 @@ private: double m_latitude; double m_longitude; double m_altitude; + + QString m_speedUnit; + double m_speedFactor; + QString m_altitudeUnit; + double m_altitudeFactor; }; #endif /* PFDQMLGADGETWIDGET_H_ */