Commit b4688783 authored by Lorenz Meier's avatar Lorenz Meier

Do not allow the PFD to turn QGC into a CPU hog

parent 6ba52995
...@@ -141,7 +141,9 @@ PrimaryFlightDisplay::PrimaryFlightDisplay(int width, int height, QWidget *paren ...@@ -141,7 +141,9 @@ PrimaryFlightDisplay::PrimaryFlightDisplay(int width, int height, QWidget *paren
instrumentOpagueBackground(QColor::fromHsvF(0, 0, 0.3, 1.0)), instrumentOpagueBackground(QColor::fromHsvF(0, 0, 0.3, 1.0)),
font("Bitstream Vera Sans"), font("Bitstream Vera Sans"),
refreshTimer(new QTimer(this)) refreshTimer(new QTimer(this)),
_valuesChanged(false),
_valuesLastPainted(QGC::groundTimeMilliseconds())
{ {
Q_UNUSED(width); Q_UNUSED(width);
Q_UNUSED(height); Q_UNUSED(height);
...@@ -159,7 +161,7 @@ PrimaryFlightDisplay::PrimaryFlightDisplay(int width, int height, QWidget *paren ...@@ -159,7 +161,7 @@ PrimaryFlightDisplay::PrimaryFlightDisplay(int width, int height, QWidget *paren
// Refresh timer // Refresh timer
refreshTimer->setInterval(updateInterval); refreshTimer->setInterval(updateInterval);
// connect(refreshTimer, SIGNAL(timeout()), this, SLOT(paintHUD())); // connect(refreshTimer, SIGNAL(timeout()), this, SLOT(paintHUD()));
connect(refreshTimer, SIGNAL(timeout()), this, SLOT(update())); connect(refreshTimer, SIGNAL(timeout()), this, SLOT(checkUpdate()));
} }
PrimaryFlightDisplay::~PrimaryFlightDisplay() PrimaryFlightDisplay::~PrimaryFlightDisplay()
...@@ -224,6 +226,15 @@ void PrimaryFlightDisplay::paintEvent(QPaintEvent *event) ...@@ -224,6 +226,15 @@ void PrimaryFlightDisplay::paintEvent(QPaintEvent *event)
doPaint(); doPaint();
} }
void PrimaryFlightDisplay::checkUpdate()
{
if (uas && (_valuesChanged || (QGC::groundTimeMilliseconds() - _valuesLastPainted) > 260)) {
update();
_valuesChanged = false;
_valuesLastPainted = QGC::groundTimeMilliseconds();
}
}
///* ///*
// * Interface towards qgroundcontrol // * Interface towards qgroundcontrol
// */ // */
...@@ -280,24 +291,45 @@ void PrimaryFlightDisplay::updateAttitude(UASInterface* uas, double roll, double ...@@ -280,24 +291,45 @@ void PrimaryFlightDisplay::updateAttitude(UASInterface* uas, double roll, double
{ {
Q_UNUSED(uas); Q_UNUSED(uas);
Q_UNUSED(timestamp); Q_UNUSED(timestamp);
// Called from UAS.cc l. 616 // Called from UAS.cc l. 616
if (isinf(roll)) { if (isinf(roll)) {
this->roll = std::numeric_limits<double>::quiet_NaN(); this->roll = std::numeric_limits<double>::quiet_NaN();
} else { } else {
this->roll = roll * (180.0 / M_PI);
float rolldeg = roll * (180.0 / M_PI);
if (fabsf(roll - rolldeg) > 2.5f) {
_valuesChanged = true;
}
this->roll = rolldeg;
} }
if (isinf(pitch)) { if (isinf(pitch)) {
this->pitch = std::numeric_limits<double>::quiet_NaN(); this->pitch = std::numeric_limits<double>::quiet_NaN();
} else { } else {
this->pitch = pitch * (180.0 / M_PI);
float pitchdeg = pitch * (180.0 / M_PI);
if (fabsf(pitch - pitchdeg) > 2.5f) {
_valuesChanged = true;
}
this->pitch = pitchdeg;
} }
if (isinf(yaw)) { if (isinf(yaw)) {
this->heading = std::numeric_limits<double>::quiet_NaN(); this->heading = std::numeric_limits<double>::quiet_NaN();
} else { } else {
yaw = yaw * (180.0 / M_PI); yaw = yaw * (180.0 / M_PI);
if (yaw<0) yaw+=360; if (yaw<0) yaw+=360;
if (fabsf(heading - yaw) > 10.0f) {
_valuesChanged = true;
}
this->heading = yaw; this->heading = yaw;
} }
...@@ -314,6 +346,14 @@ void PrimaryFlightDisplay::updateSpeed(UASInterface* uas, double _groundSpeed, d ...@@ -314,6 +346,14 @@ void PrimaryFlightDisplay::updateSpeed(UASInterface* uas, double _groundSpeed, d
Q_UNUSED(uas); Q_UNUSED(uas);
Q_UNUSED(timestamp); Q_UNUSED(timestamp);
if (fabsf(groundSpeed - _groundSpeed) > 0.5f) {
_valuesChanged = true;
}
if (fabsf(airSpeed - _airSpeed) > 1.0f) {
_valuesChanged = true;
}
groundSpeed = _groundSpeed; groundSpeed = _groundSpeed;
airSpeed = _airSpeed; airSpeed = _airSpeed;
} }
...@@ -321,6 +361,19 @@ void PrimaryFlightDisplay::updateSpeed(UASInterface* uas, double _groundSpeed, d ...@@ -321,6 +361,19 @@ void PrimaryFlightDisplay::updateSpeed(UASInterface* uas, double _groundSpeed, d
void PrimaryFlightDisplay::updateAltitude(UASInterface* uas, double _altitudeAMSL, double _altitudeRelative, double _climbRate, quint64 timestamp) { void PrimaryFlightDisplay::updateAltitude(UASInterface* uas, double _altitudeAMSL, double _altitudeRelative, double _climbRate, quint64 timestamp) {
Q_UNUSED(uas); Q_UNUSED(uas);
Q_UNUSED(timestamp); Q_UNUSED(timestamp);
if (fabsf(altitudeAMSL - _altitudeAMSL) > 0.5f) {
_valuesChanged = true;
}
if (fabsf(altitudeRelative - _altitudeRelative) > 0.5f) {
_valuesChanged = true;
}
if (fabsf(climbRate - _climbRate) > 0.5f) {
_valuesChanged = true;
}
altitudeAMSL = _altitudeAMSL; altitudeAMSL = _altitudeAMSL;
altitudeRelative = _altitudeRelative; altitudeRelative = _altitudeRelative;
climbRate = _climbRate; climbRate = _climbRate;
......
...@@ -27,7 +27,13 @@ public slots: ...@@ -27,7 +27,13 @@ public slots:
void forgetUAS(UASInterface* uas); void forgetUAS(UASInterface* uas);
void setActiveUAS(UASInterface* uas); void setActiveUAS(UASInterface* uas);
void checkUpdate();
protected: protected:
bool _valuesChanged;
quint64 _valuesLastPainted;
enum Layout { enum Layout {
COMPASS_INTEGRATED, COMPASS_INTEGRATED,
COMPASS_SEPARATED // For a very high container. Feature panels are at bottom. COMPASS_SEPARATED // For a very high container. Feature panels are at bottom.
......
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