Commit 06485564 authored by dogmaphobic's avatar dogmaphobic

Eliminating unnecessary value updates in main flight display.

parent 7411b3c3
...@@ -35,7 +35,7 @@ This file is part of the QGROUNDCONTROL project ...@@ -35,7 +35,7 @@ This file is part of the QGROUNDCONTROL project
#include "QGCFlightDisplay.h" #include "QGCFlightDisplay.h"
#include "UASManager.h" #include "UASManager.h"
#define UPDATE_TIMER 50 #define UPDATE_TIMER 100
const char* kMainFlightDisplayGroup = "MainFlightDisplay"; const char* kMainFlightDisplayGroup = "MainFlightDisplay";
...@@ -58,8 +58,6 @@ QGCFlightDisplay::QGCFlightDisplay(QWidget *parent) ...@@ -58,8 +58,6 @@ QGCFlightDisplay::QGCFlightDisplay(QWidget *parent)
, _latitude(37.803784f) , _latitude(37.803784f)
, _longitude(-122.462276f) , _longitude(-122.462276f)
, _refreshTimer(new QTimer(this)) , _refreshTimer(new QTimer(this))
, _valuesChanged(false)
, _valuesLastPainted(0)
{ {
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
setObjectName("MainFlightDisplay"); setObjectName("MainFlightDisplay");
...@@ -148,47 +146,47 @@ void QGCFlightDisplay::_updateAttitude(UASInterface*, double roll, double pitch, ...@@ -148,47 +146,47 @@ void QGCFlightDisplay::_updateAttitude(UASInterface*, double roll, double pitch,
if (isinf(roll)) { if (isinf(roll)) {
_roll = std::numeric_limits<double>::quiet_NaN(); _roll = std::numeric_limits<double>::quiet_NaN();
} else { } else {
bool update = false; float rolldeg = _oneDecimal(roll * (180.0 / M_PI));
float rolldeg = roll * (180.0 / M_PI);
if (fabs(roll - rolldeg) > 1.0) { if (fabs(roll - rolldeg) > 1.0) {
update = true; _roll = rolldeg;
if(_refreshTimer->isActive()) {
emit rollChanged();
}
} }
_roll = rolldeg; if(_roll != rolldeg) {
if (update) _roll = rolldeg;
{ _addChange(ROLL_CHANGED);
if(_refreshTimer->isActive()) emit rollChanged();
_valuesChanged = true;
} }
} }
if (isinf(pitch)) { if (isinf(pitch)) {
_pitch = std::numeric_limits<double>::quiet_NaN(); _pitch = std::numeric_limits<double>::quiet_NaN();
} else { } else {
bool update = false; float pitchdeg = _oneDecimal(pitch * (180.0 / M_PI));
float pitchdeg = pitch * (180.0 / M_PI);
if (fabs(pitch - pitchdeg) > 1.0) { if (fabs(pitch - pitchdeg) > 1.0) {
update = true; _pitch = pitchdeg;
if(_refreshTimer->isActive()) {
emit pitchChanged();
}
} }
_pitch = pitchdeg; if(_pitch != pitchdeg) {
if (update) _pitch = pitchdeg;
{ _addChange(PITCH_CHANGED);
if(_refreshTimer->isActive()) emit pitchChanged();
_valuesChanged = true;
} }
} }
if (isinf(yaw)) { if (isinf(yaw)) {
_heading = std::numeric_limits<double>::quiet_NaN(); _heading = std::numeric_limits<double>::quiet_NaN();
} else { } else {
bool update = false; yaw = _oneDecimal(yaw * (180.0 / M_PI));
yaw = yaw * (180.0 / M_PI);
if (yaw < 0) yaw += 360; if (yaw < 0) yaw += 360;
if (fabs(_heading - yaw) > 10.0) { if (fabs(_heading - yaw) > 1.0) {
update = true; _heading = yaw;
if(_refreshTimer->isActive()) {
emit headingChanged();
}
} }
_heading = yaw; if(_heading != yaw) {
if (update) _heading = yaw;
{ _addChange(HEADING_CHANGED);
if(_refreshTimer->isActive()) emit headingChanged();
_valuesChanged = true;
} }
} }
} }
...@@ -200,47 +198,74 @@ void QGCFlightDisplay::_updateAttitude(UASInterface* uas, int, double roll, doub ...@@ -200,47 +198,74 @@ void QGCFlightDisplay::_updateAttitude(UASInterface* uas, int, double roll, doub
void QGCFlightDisplay::_updateSpeed(UASInterface*, double groundSpeed, double airSpeed, quint64) void QGCFlightDisplay::_updateSpeed(UASInterface*, double groundSpeed, double airSpeed, quint64)
{ {
double oldgroundSpeed = _groundSpeed; groundSpeed = _oneDecimal(groundSpeed);
double oldairSpeed = _airSpeed; if (fabs(_groundSpeed - groundSpeed) > 0.5) {
_groundSpeed = groundSpeed; _groundSpeed = groundSpeed;
_airSpeed = airSpeed; if(_refreshTimer->isActive()) {
if (fabs(oldgroundSpeed - groundSpeed) > 0.5) { emit groundSpeedChanged();
if(_refreshTimer->isActive()) emit groundSpeedChanged(); }
_valuesChanged = true; }
airSpeed = _oneDecimal(airSpeed);
if (fabs(_airSpeed - airSpeed) > 1.0) {
_airSpeed = airSpeed;
if(_refreshTimer->isActive()) {
emit airSpeedChanged();
}
} }
if (fabs(oldairSpeed - airSpeed) > 1.0) { if(_groundSpeed != groundSpeed) {
if(_refreshTimer->isActive()) emit airSpeedChanged(); _groundSpeed = groundSpeed;
_valuesChanged = true; _addChange(GROUNDSPEED_CHANGED);
}
if(_airSpeed != airSpeed) {
_airSpeed = airSpeed;
_addChange(AIRSPEED_CHANGED);
} }
} }
void QGCFlightDisplay::_updateAltitude(UASInterface*, double altitudeAMSL, double altitudeWGS84, double altitudeRelative, double climbRate, quint64) { void QGCFlightDisplay::_updateAltitude(UASInterface*, double altitudeAMSL, double altitudeWGS84, double altitudeRelative, double climbRate, quint64) {
double oldclimbRate = _climbRate; altitudeAMSL = _oneDecimal(altitudeAMSL);
double oldaltitudeRelative = _altitudeRelative; if (fabs(_altitudeAMSL - altitudeAMSL) > 0.5) {
double oldaltitudeWGS84 = _altitudeWGS84; _altitudeAMSL = altitudeAMSL;
double oldaltitudeAMSL = _altitudeAMSL; if(_refreshTimer->isActive()) {
_climbRate = climbRate; emit altitudeAMSLChanged();
_altitudeRelative = altitudeRelative; }
_altitudeWGS84 = altitudeWGS84; }
_altitudeAMSL = altitudeAMSL; altitudeWGS84 = _oneDecimal(altitudeWGS84);
if(_climbRate > -0.01 && _climbRate < 0.01) { if (fabs(_altitudeWGS84 - altitudeWGS84) > 0.5) {
_climbRate = 0.0; _altitudeWGS84 = altitudeWGS84;
if(_refreshTimer->isActive()) {
emit altitudeWGS84Changed();
}
}
altitudeRelative = _oneDecimal(altitudeRelative);
if (fabs(_altitudeRelative - altitudeRelative) > 0.5) {
_altitudeRelative = altitudeRelative;
if(_refreshTimer->isActive()) {
emit altitudeRelativeChanged();
}
}
climbRate = _oneDecimal(climbRate);
if (fabs(_climbRate - climbRate) > 0.5) {
_climbRate = climbRate;
if(_refreshTimer->isActive()) {
emit climbRateChanged();
}
} }
if (fabs(oldaltitudeAMSL - altitudeAMSL) > 0.5) { if(_altitudeAMSL != altitudeAMSL) {
if(_refreshTimer->isActive()) emit altitudeAMSLChanged(); _altitudeAMSL = altitudeAMSL;
_valuesChanged = true; _addChange(ALTITUDEAMSL_CHANGED);
} }
if (fabs(oldaltitudeWGS84 - altitudeWGS84) > 0.5) { if(_altitudeWGS84 != altitudeWGS84) {
if(_refreshTimer->isActive()) emit altitudeWGS84Changed(); _altitudeWGS84 = altitudeWGS84;
_valuesChanged = true; _addChange(ALTITUDEWGS84_CHANGED);
} }
if (fabs(oldaltitudeRelative - altitudeRelative) > 0.5) { if(_altitudeRelative != altitudeRelative) {
if(_refreshTimer->isActive()) emit altitudeRelativeChanged(); _altitudeRelative = altitudeRelative;
_valuesChanged = true; _addChange(ALTITUDERELATIVE_CHANGED);
} }
if (fabs(oldclimbRate - climbRate) > 0.5) { if(_climbRate != climbRate) {
if(_refreshTimer->isActive()) emit climbRateChanged(); _climbRate = climbRate;
_valuesChanged = true; _addChange(CLIMBRATE_CHANGED);
} }
} }
...@@ -275,36 +300,34 @@ bool QGCFlightDisplay::_shouldDisplayNavigationData() { ...@@ -275,36 +300,34 @@ bool QGCFlightDisplay::_shouldDisplayNavigationData() {
void QGCFlightDisplay::showEvent(QShowEvent* event) void QGCFlightDisplay::showEvent(QShowEvent* event)
{ {
// React only to internal (pre-display) events // Enable updates
QWidget::showEvent(event); QWidget::showEvent(event);
_refreshTimer->start(UPDATE_TIMER); _refreshTimer->start(UPDATE_TIMER);
} }
void QGCFlightDisplay::hideEvent(QHideEvent* event) void QGCFlightDisplay::hideEvent(QHideEvent* event)
{ {
// React only to internal (pre-display) events // Disable updates
_refreshTimer->stop(); _refreshTimer->stop();
QWidget::hideEvent(event); QWidget::hideEvent(event);
} }
void QGCFlightDisplay::_checkUpdate() void QGCFlightDisplay::_addChange(int id)
{ {
if (_mav && (_valuesChanged || (QGC::groundTimeMilliseconds() - _valuesLastPainted) > 260)) { if(!_changes.contains(id)) {
_valuesChanged = false; _changes.append(id);
_valuesLastPainted = QGC::groundTimeMilliseconds();
emit rollChanged();
emit pitchChanged();
emit headingChanged();
emit altitudeAMSLChanged();
emit altitudeWGS84Changed();
emit altitudeRelativeChanged();
emit climbRateChanged();
emit groundSpeedChanged();
emit airSpeedChanged();
emit repaintRequestedChanged();
emit latitudeChanged();
emit longitudeChanged();
} }
}
float QGCFlightDisplay::_oneDecimal(float value)
{
int i = (value * 10);
return (float)i / 10.0;
}
void QGCFlightDisplay::_checkUpdate()
{
// Update current location
if(_mav) { if(_mav) {
if(_latitude != _mav->getLatitude()) { if(_latitude != _mav->getLatitude()) {
_latitude = _mav->getLatitude(); _latitude = _mav->getLatitude();
...@@ -315,5 +338,43 @@ void QGCFlightDisplay::_checkUpdate() ...@@ -315,5 +338,43 @@ void QGCFlightDisplay::_checkUpdate()
emit longitudeChanged(); emit longitudeChanged();
} }
} }
// Check for changes
// Significant changes, that is, whole number changes, are updated immediatelly.
// For every message however, we set a flag for what changed and this timer updates
// them to bring everything up-to-date. This prevents an avalanche of UI updates.
foreach(int i, _changes) {
switch (i) {
case ROLL_CHANGED:
emit rollChanged();
break;
case PITCH_CHANGED:
emit pitchChanged();
break;
case HEADING_CHANGED:
emit headingChanged();
break;
case GROUNDSPEED_CHANGED:
emit groundSpeedChanged();
break;
case AIRSPEED_CHANGED:
emit airSpeedChanged();
break;
case CLIMBRATE_CHANGED:
emit climbRateChanged();
break;
case ALTITUDERELATIVE_CHANGED:
emit altitudeRelativeChanged();
break;
case ALTITUDEWGS84_CHANGED:
emit altitudeWGS84Changed();
break;
case ALTITUDEAMSL_CHANGED:
emit altitudeAMSLChanged();
break;
default:
break;
}
}
_changes.clear();
} }
...@@ -41,6 +41,18 @@ public: ...@@ -41,6 +41,18 @@ public:
QGCFlightDisplay(QWidget* parent = NULL); QGCFlightDisplay(QWidget* parent = NULL);
~QGCFlightDisplay(); ~QGCFlightDisplay();
enum {
ROLL_CHANGED,
PITCH_CHANGED,
HEADING_CHANGED,
GROUNDSPEED_CHANGED,
AIRSPEED_CHANGED,
CLIMBRATE_CHANGED,
ALTITUDERELATIVE_CHANGED,
ALTITUDEWGS84_CHANGED,
ALTITUDEAMSL_CHANGED
};
Q_PROPERTY(float roll READ roll NOTIFY rollChanged) Q_PROPERTY(float roll READ roll NOTIFY rollChanged)
Q_PROPERTY(float pitch READ pitch NOTIFY pitchChanged) Q_PROPERTY(float pitch READ pitch NOTIFY pitchChanged)
Q_PROPERTY(float heading READ heading NOTIFY headingChanged) Q_PROPERTY(float heading READ heading NOTIFY headingChanged)
...@@ -110,6 +122,8 @@ private slots: ...@@ -110,6 +122,8 @@ private slots:
private: private:
bool _isAirplane (); bool _isAirplane ();
bool _shouldDisplayNavigationData (); bool _shouldDisplayNavigationData ();
void _addChange (int id);
float _oneDecimal (float value);
private: private:
UASInterface* _mav; UASInterface* _mav;
...@@ -135,8 +149,7 @@ private: ...@@ -135,8 +149,7 @@ private:
float _longitude; float _longitude;
QTimer* _refreshTimer; QTimer* _refreshTimer;
bool _valuesChanged; QList<int> _changes;
quint64 _valuesLastPainted;
}; };
......
...@@ -43,8 +43,9 @@ QGCMovableItem { ...@@ -43,8 +43,9 @@ QGCMovableItem {
//---------------------------------------------------- //----------------------------------------------------
//-- Artificial Horizon //-- Artificial Horizon
QGCArtificialHorizon { QGCArtificialHorizon {
rollAngle: root.rollAngle rollAngle: root.rollAngle
pitchAngle: root.pitchAngle pitchAngle: root.pitchAngle
anchors.fill: parent
} }
//---------------------------------------------------- //----------------------------------------------------
//-- Pointer //-- Pointer
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment