Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
06485564
Commit
06485564
authored
Apr 27, 2015
by
dogmaphobic
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Eliminating unnecessary value updates in main flight display.
parent
7411b3c3
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
157 additions
and
82 deletions
+157
-82
QGCFlightDisplay.cc
src/ui/flightdisplay/QGCFlightDisplay.cc
+139
-78
QGCFlightDisplay.h
src/ui/flightdisplay/QGCFlightDisplay.h
+15
-2
QGCAttitudeInstrument.qml
src/ui/qmlcommon/QGCAttitudeInstrument.qml
+3
-2
No files found.
src/ui/flightdisplay/QGCFlightDisplay.cc
View file @
06485564
...
...
@@ -35,7 +35,7 @@ This file is part of the QGROUNDCONTROL project
#include "QGCFlightDisplay.h"
#include "UASManager.h"
#define UPDATE_TIMER
5
0
#define UPDATE_TIMER
10
0
const
char
*
kMainFlightDisplayGroup
=
"MainFlightDisplay"
;
...
...
@@ -58,8 +58,6 @@ QGCFlightDisplay::QGCFlightDisplay(QWidget *parent)
,
_latitude
(
37.803784
f
)
,
_longitude
(
-
122.462276
f
)
,
_refreshTimer
(
new
QTimer
(
this
))
,
_valuesChanged
(
false
)
,
_valuesLastPainted
(
0
)
{
setSizePolicy
(
QSizePolicy
::
MinimumExpanding
,
QSizePolicy
::
MinimumExpanding
);
setObjectName
(
"MainFlightDisplay"
);
...
...
@@ -148,47 +146,47 @@ void QGCFlightDisplay::_updateAttitude(UASInterface*, double roll, double pitch,
if
(
isinf
(
roll
))
{
_roll
=
std
::
numeric_limits
<
double
>::
quiet_NaN
();
}
else
{
bool
update
=
false
;
float
rolldeg
=
roll
*
(
180.0
/
M_PI
);
float
rolldeg
=
_oneDecimal
(
roll
*
(
180.0
/
M_PI
));
if
(
fabs
(
roll
-
rolldeg
)
>
1.0
)
{
update
=
true
;
_roll
=
rolldeg
;
if
(
_refreshTimer
->
isActive
())
{
emit
rollChanged
();
}
}
_roll
=
rolldeg
;
if
(
update
)
{
if
(
_refreshTimer
->
isActive
())
emit
rollChanged
();
_valuesChanged
=
true
;
if
(
_roll
!=
rolldeg
)
{
_roll
=
rolldeg
;
_addChange
(
ROLL_CHANGED
);
}
}
if
(
isinf
(
pitch
))
{
_pitch
=
std
::
numeric_limits
<
double
>::
quiet_NaN
();
}
else
{
bool
update
=
false
;
float
pitchdeg
=
pitch
*
(
180.0
/
M_PI
);
float
pitchdeg
=
_oneDecimal
(
pitch
*
(
180.0
/
M_PI
));
if
(
fabs
(
pitch
-
pitchdeg
)
>
1.0
)
{
update
=
true
;
_pitch
=
pitchdeg
;
if
(
_refreshTimer
->
isActive
())
{
emit
pitchChanged
();
}
}
_pitch
=
pitchdeg
;
if
(
update
)
{
if
(
_refreshTimer
->
isActive
())
emit
pitchChanged
();
_valuesChanged
=
true
;
if
(
_pitch
!=
pitchdeg
)
{
_pitch
=
pitchdeg
;
_addChange
(
PITCH_CHANGED
);
}
}
if
(
isinf
(
yaw
))
{
_heading
=
std
::
numeric_limits
<
double
>::
quiet_NaN
();
}
else
{
bool
update
=
false
;
yaw
=
yaw
*
(
180.0
/
M_PI
);
yaw
=
_oneDecimal
(
yaw
*
(
180.0
/
M_PI
));
if
(
yaw
<
0
)
yaw
+=
360
;
if
(
fabs
(
_heading
-
yaw
)
>
10.0
)
{
update
=
true
;
if
(
fabs
(
_heading
-
yaw
)
>
1.0
)
{
_heading
=
yaw
;
if
(
_refreshTimer
->
isActive
())
{
emit
headingChanged
();
}
}
_heading
=
yaw
;
if
(
update
)
{
if
(
_refreshTimer
->
isActive
())
emit
headingChanged
();
_valuesChanged
=
true
;
if
(
_heading
!=
yaw
)
{
_heading
=
yaw
;
_addChange
(
HEADING_CHANGED
);
}
}
}
...
...
@@ -200,47 +198,74 @@ void QGCFlightDisplay::_updateAttitude(UASInterface* uas, int, double roll, doub
void
QGCFlightDisplay
::
_updateSpeed
(
UASInterface
*
,
double
groundSpeed
,
double
airSpeed
,
quint64
)
{
double
oldgroundSpeed
=
_groundSpeed
;
double
oldairSpeed
=
_airSpeed
;
_groundSpeed
=
groundSpeed
;
_airSpeed
=
airSpeed
;
if
(
fabs
(
oldgroundSpeed
-
groundSpeed
)
>
0.5
)
{
if
(
_refreshTimer
->
isActive
())
emit
groundSpeedChanged
();
_valuesChanged
=
true
;
groundSpeed
=
_oneDecimal
(
groundSpeed
);
if
(
fabs
(
_groundSpeed
-
groundSpeed
)
>
0.5
)
{
_groundSpeed
=
groundSpeed
;
if
(
_refreshTimer
->
isActive
())
{
emit
groundSpeedChanged
();
}
}
airSpeed
=
_oneDecimal
(
airSpeed
);
if
(
fabs
(
_airSpeed
-
airSpeed
)
>
1.0
)
{
_airSpeed
=
airSpeed
;
if
(
_refreshTimer
->
isActive
())
{
emit
airSpeedChanged
();
}
}
if
(
fabs
(
oldairSpeed
-
airSpeed
)
>
1.0
)
{
if
(
_refreshTimer
->
isActive
())
emit
airSpeedChanged
();
_valuesChanged
=
true
;
if
(
_groundSpeed
!=
groundSpeed
)
{
_groundSpeed
=
groundSpeed
;
_addChange
(
GROUNDSPEED_CHANGED
);
}
if
(
_airSpeed
!=
airSpeed
)
{
_airSpeed
=
airSpeed
;
_addChange
(
AIRSPEED_CHANGED
);
}
}
void
QGCFlightDisplay
::
_updateAltitude
(
UASInterface
*
,
double
altitudeAMSL
,
double
altitudeWGS84
,
double
altitudeRelative
,
double
climbRate
,
quint64
)
{
double
oldclimbRate
=
_climbRate
;
double
oldaltitudeRelative
=
_altitudeRelative
;
double
oldaltitudeWGS84
=
_altitudeWGS84
;
double
oldaltitudeAMSL
=
_altitudeAMSL
;
_climbRate
=
climbRate
;
_altitudeRelative
=
altitudeRelative
;
_altitudeWGS84
=
altitudeWGS84
;
_altitudeAMSL
=
altitudeAMSL
;
if
(
_climbRate
>
-
0.01
&&
_climbRate
<
0.01
)
{
_climbRate
=
0.0
;
altitudeAMSL
=
_oneDecimal
(
altitudeAMSL
);
if
(
fabs
(
_altitudeAMSL
-
altitudeAMSL
)
>
0.5
)
{
_altitudeAMSL
=
altitudeAMSL
;
if
(
_refreshTimer
->
isActive
())
{
emit
altitudeAMSLChanged
();
}
}
altitudeWGS84
=
_oneDecimal
(
altitudeWGS84
);
if
(
fabs
(
_altitudeWGS84
-
altitudeWGS84
)
>
0.5
)
{
_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
(
_refreshTimer
->
isActive
())
emit
altitudeAMSLChanged
()
;
_
valuesChanged
=
true
;
if
(
_altitudeAMSL
!=
altitudeAMSL
)
{
_altitudeAMSL
=
altitudeAMSL
;
_
addChange
(
ALTITUDEAMSL_CHANGED
)
;
}
if
(
fabs
(
oldaltitudeWGS84
-
altitudeWGS84
)
>
0.5
)
{
if
(
_refreshTimer
->
isActive
())
emit
altitudeWGS84Changed
()
;
_
valuesChanged
=
true
;
if
(
_altitudeWGS84
!=
altitudeWGS84
)
{
_altitudeWGS84
=
altitudeWGS84
;
_
addChange
(
ALTITUDEWGS84_CHANGED
)
;
}
if
(
fabs
(
oldaltitudeRelative
-
altitudeRelative
)
>
0.5
)
{
if
(
_refreshTimer
->
isActive
())
emit
altitudeRelativeChanged
()
;
_
valuesChanged
=
true
;
if
(
_altitudeRelative
!=
altitudeRelative
)
{
_altitudeRelative
=
altitudeRelative
;
_
addChange
(
ALTITUDERELATIVE_CHANGED
)
;
}
if
(
fabs
(
oldclimbRate
-
climbRate
)
>
0.5
)
{
if
(
_refreshTimer
->
isActive
())
emit
climbRateChanged
()
;
_
valuesChanged
=
true
;
if
(
_climbRate
!=
climbRate
)
{
_climbRate
=
climbRate
;
_
addChange
(
CLIMBRATE_CHANGED
)
;
}
}
...
...
@@ -275,36 +300,34 @@ bool QGCFlightDisplay::_shouldDisplayNavigationData() {
void
QGCFlightDisplay
::
showEvent
(
QShowEvent
*
event
)
{
//
React only to internal (pre-display) event
s
//
Enable update
s
QWidget
::
showEvent
(
event
);
_refreshTimer
->
start
(
UPDATE_TIMER
);
}
void
QGCFlightDisplay
::
hideEvent
(
QHideEvent
*
event
)
{
//
React only to internal (pre-display) event
s
//
Disable update
s
_refreshTimer
->
stop
();
QWidget
::
hideEvent
(
event
);
}
void
QGCFlightDisplay
::
_
checkUpdate
(
)
void
QGCFlightDisplay
::
_
addChange
(
int
id
)
{
if
(
_mav
&&
(
_valuesChanged
||
(
QGC
::
groundTimeMilliseconds
()
-
_valuesLastPainted
)
>
260
))
{
_valuesChanged
=
false
;
_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
();
if
(
!
_changes
.
contains
(
id
))
{
_changes
.
append
(
id
);
}
}
float
QGCFlightDisplay
::
_oneDecimal
(
float
value
)
{
int
i
=
(
value
*
10
);
return
(
float
)
i
/
10.0
;
}
void
QGCFlightDisplay
::
_checkUpdate
()
{
// Update current location
if
(
_mav
)
{
if
(
_latitude
!=
_mav
->
getLatitude
())
{
_latitude
=
_mav
->
getLatitude
();
...
...
@@ -315,5 +338,43 @@ void QGCFlightDisplay::_checkUpdate()
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
();
}
src/ui/flightdisplay/QGCFlightDisplay.h
View file @
06485564
...
...
@@ -41,6 +41,18 @@ public:
QGCFlightDisplay
(
QWidget
*
parent
=
NULL
);
~
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
pitch
READ
pitch
NOTIFY
pitchChanged
)
Q_PROPERTY
(
float
heading
READ
heading
NOTIFY
headingChanged
)
...
...
@@ -110,6 +122,8 @@ private slots:
private:
bool
_isAirplane
();
bool
_shouldDisplayNavigationData
();
void
_addChange
(
int
id
);
float
_oneDecimal
(
float
value
);
private:
UASInterface
*
_mav
;
...
...
@@ -135,8 +149,7 @@ private:
float
_longitude
;
QTimer
*
_refreshTimer
;
bool
_valuesChanged
;
quint64
_valuesLastPainted
;
QList
<
int
>
_changes
;
};
...
...
src/ui/qmlcommon/QGCAttitudeInstrument.qml
View file @
06485564
...
...
@@ -43,8 +43,9 @@ QGCMovableItem {
//----------------------------------------------------
//-- Artificial Horizon
QGCArtificialHorizon
{
rollAngle
:
root
.
rollAngle
pitchAngle
:
root
.
pitchAngle
rollAngle
:
root
.
rollAngle
pitchAngle
:
root
.
pitchAngle
anchors.fill
:
parent
}
//----------------------------------------------------
//-- Pointer
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment