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
76716145
Commit
76716145
authored
May 24, 2013
by
dongfang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
more PFD integration
parent
7cedf391
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
219 additions
and
235 deletions
+219
-235
PrimaryFlightDisplay.cpp
src/ui/PrimaryFlightDisplay.cpp
+175
-199
PrimaryFlightDisplay.h
src/ui/PrimaryFlightDisplay.h
+44
-36
No files found.
src/ui/PrimaryFlightDisplay.cpp
View file @
76716145
...
...
@@ -9,8 +9,8 @@
#include <QPainter>
#include <QPainterPath>
#include <QResizeEvent>
//#include <
math.h>
#include <cmath>
#include <QtCore/q
math.h>
//
#include <cmath>
/*
*@TODO:
...
...
@@ -56,20 +56,23 @@ PrimaryFlightDisplay::PrimaryFlightDisplay(int width, int height, QWidget *paren
font
(
"Bitstream Vera Sans"
),
refreshTimer
(
new
QTimer
(
this
)),
uas
(
NULL
),
// energyStatus(tr("??.?V (??m:??s)"))
batteryVoltage
(
UNKNOWN_BATTERY
),
batteryCharge
(
UNKNOWN_BATTERY
),
layout
(
FEATUREPANELS_IN_CORNERS
),
style
(
OPAGUE_TAPES
),
whitePen
(
Qt
::
white
),
redPen
(
QColor
::
fromHsvF
(
0
,
0.6
,
0.8
)),
amberPen
(
QColor
::
fromHsvF
(
0.12
,
0.6
,
1.0
)),
greenPen
(
QColor
::
fromHsvF
(
0.25
,
0.8
,
0.8
)),
blackPen
(
QColor
::
fromHsvF
(
0
,
0
,
0.2
)),
redColor
(
QColor
::
fromHsvF
(
0
,
0.6
,
0.8
)),
amberColor
(
QColor
::
fromHsvF
(
0.12
,
0.6
,
1.0
)),
greenColor
(
QColor
::
fromHsvF
(
0.25
,
0.8
,
0.8
)),
lineWidth
(
2
),
fineLineWidth
(
1
),
instrumentEdgePen
(
QColor
::
fromHsvF
(
0
,
0
,
0.65
,
0.5
)),
// AIEdgePen(QColor::fromHsvF(0, 0, 0.65, 0.5)),
instrumentEdgePen
(
QColor
::
fromHsvF
(
0
,
0
,
0.65
,
1.0
)),
instrumentBackground
(
QColor
::
fromHsvF
(
0
,
0
,
0.3
,
0.3
)),
instrumentOpagueBackground
(
QColor
::
fromHsvF
(
0
,
0
,
0.3
,
1.0
))
{
...
...
@@ -115,11 +118,50 @@ void PrimaryFlightDisplay::hideEvent(QHideEvent* event)
emit
visibilityChanged
(
false
);
}
/*
* Interface against qgroundcontrol
*/
qreal
constrain
(
qreal
value
,
qreal
min
,
qreal
max
)
{
if
(
value
<
min
)
value
=
min
;
else
if
(
value
>
max
)
value
=
max
;
return
value
;
}
void
PrimaryFlightDisplay
::
resizeEvent
(
QResizeEvent
*
e
)
{
QWidget
::
resizeEvent
(
e
);
qreal
size
=
e
->
size
().
width
();
if
(
e
->
size
().
height
()
<
size
)
size
=
e
->
size
().
height
();
lineWidth
=
constrain
(
size
*
LINEWIDTH
,
2
,
4
);
fineLineWidth
=
constrain
(
size
*
LINEWIDTH
*
2
/
3
,
1
,
2
);
instrumentEdgePen
.
setWidthF
(
fineLineWidth
);
//AIEdgePen.setWidthF(fineLineWidth);
smallTestSize
=
size
*
SMALL_TEXT_SIZE
;
mediumTextSize
=
size
*
MEDIUM_TEXT_SIZE
;
largeTextSize
=
size
*
LARGE_TEXT_SIZE
;
if
(
e
->
size
().
height
()
>
e
->
size
().
width
())
layout
=
COMPASS_SEPARATED
;
else
if
(
e
->
size
().
height
()
*
4
>
e
->
size
().
width
()
*
3
)
layout
=
FEATUREPANELS_AT_BOTTOM
;
else
layout
=
FEATUREPANELS_IN_CORNERS
;
qDebug
(
"Width %d height %d decision %d"
,
e
->
size
().
width
(),
e
->
size
().
height
(),
layout
);
}
void
PrimaryFlightDisplay
::
paintEvent
(
QPaintEvent
*
event
)
{
// Event is not needed
// the event is ignored as this widget
// is refreshed automatically
Q_UNUSED
(
event
);
//makeDummyData();
doPaint
();
}
/*
* Interface towards qgroundcontrol
*/
/**
*
* @param uas the UAS/MAV to monitor/display with the HUD
...
...
@@ -267,7 +309,7 @@ void PrimaryFlightDisplay::updateSpeed(UASInterface* uas,double x,double y,doubl
this->zSpeed = z;
*/
double
newTotalSpeed
=
s
qrt
(
x
*
x
+
y
*
y
/*+ zSpeed*zSpeed */
);
double
newTotalSpeed
=
qS
qrt
(
x
*
x
+
y
*
y
/*+ zSpeed*zSpeed */
);
// totalAcc = (newTotalSpeed - totalSpeed) / ((double)(lastSpeedUpdate - timestamp)/1000.0);
// TODO: Change to real data.
...
...
@@ -304,32 +346,6 @@ void PrimaryFlightDisplay::selectWaypoint(int uasId, int id) {
/*
* Private and such
*/
void
PrimaryFlightDisplay
::
resizeEvent
(
QResizeEvent
*
e
)
{
QWidget
::
resizeEvent
(
e
);
whitePen
.
setWidthF
(
LINEWIDTH
*
e
->
size
().
height
());
redPen
.
setWidthF
(
LINEWIDTH
*
e
->
size
().
height
());
greenPen
.
setWidthF
(
LINEWIDTH
*
e
->
size
().
height
());
instrumentEdgePen
.
setWidthF
(
LINEWIDTH
*
e
->
size
().
height
());
if
(
e
->
size
().
height
()
>
e
->
size
().
width
())
layout
=
COMPASS_SEPARATED
;
else
if
(
e
->
size
().
height
()
*
4
>
e
->
size
().
width
()
*
3
)
layout
=
FEATUREPANELS_AT_BOTTOM
;
else
layout
=
FEATUREPANELS_IN_CORNERS
;
qDebug
(
"Width %d height %d decision %d"
,
e
->
size
().
width
(),
e
->
size
().
height
(),
layout
);
}
void
PrimaryFlightDisplay
::
paintEvent
(
QPaintEvent
*
event
)
{
// Event is not needed
// the event is ignored as this widget
// is refreshed automatically
Q_UNUSED
(
event
);
//makeDummyData();
doPaint
();
}
void
PrimaryFlightDisplay
::
drawTextCenter
(
QPainter
&
painter
,
QString
text
,
...
...
@@ -429,19 +445,6 @@ void PrimaryFlightDisplay::fillInstrumentOpagueBackground(QPainter& painter, QRe
painter
.
setBrush
(
Qt
::
NoBrush
);
}
/*
void PrimaryFlightDisplay::prepareTransform(QPainter& painter, qreal width, qreal height) {
painter.resetTransform();
painter.translate(width/2, height/2);
}
void PrimaryFlightDisplay::transformToGlobalSystem(QPainter& painter, qreal width, qreal height, float roll, float pitch) {
prepareTransform(painter, width, height);
painter.rotate(roll);
painter.translate(0, pitch*height/PITCHTRANSLATION);
}
*/
qreal
pitchAngleToTranslation
(
qreal
viewHeight
,
float
pitch
)
{
return
pitch
*
viewHeight
/
PITCHTRANSLATION
;
}
...
...
@@ -459,27 +462,15 @@ void PrimaryFlightDisplay::drawAIAirframeFixedFeatures(QPainter& painter, QRectF
qreal
w
=
area
.
width
();
qreal
h
=
area
.
height
();
painter
.
setPen
(
redPen
);
QPointF
start
(
-
0.35
*
w
,
0
);
QPointF
end
(
-
0.25
*
w
,
0
);
painter
.
drawLine
(
start
,
end
);
start
=
QPointF
(
0.35
*
w
,
0
);
end
=
QPointF
(
0.25
*
w
,
0
);
painter
.
drawLine
(
start
,
end
);
QPen
pen
;
pen
.
setWidthF
(
lineWidth
);
pen
.
setColor
(
redColor
);
painter
.
setPen
(
pen
);
start
=
QPointF
(
0.0894
*
w
,
0.894
*
0.05
*
w
);
end
=
QPoint
(
0
,
0
);
// end = QPointF(-0.0894*width, -0.894*0.05*width);
painter
.
drawLine
(
start
,
end
);
start
=
QPointF
(
-
0.0894
*
w
,
0.894
*
0.05
*
w
);
end
=
QPoint
(
0
,
0
);
// end = QPointF(0.0894*width, -0.894*0.05*width);
painter
.
drawLine
(
start
,
end
);
painter
.
setPen
(
redPen
);
// painter.setBrush(Qt::SolidPattern);
painter
.
drawLine
(
QPointF
(
-
0.35
*
w
,
0
),
QPointF
(
-
0.25
*
w
,
0
));
painter
.
drawLine
(
QPointF
(
0.35
*
w
,
0
),
QPointF
(
0.25
*
w
,
0
));
painter
.
drawLine
(
QPointF
(
0.0894
*
w
,
0.894
*
0.05
*
w
),
QPoint
(
0
,
0
));
painter
.
drawLine
(
QPointF
(
-
0.0894
*
w
,
0.894
*
0.05
*
w
),
QPoint
(
0
,
0
));
QPainterPath
markerPath
(
QPointF
(
0
,
-
h
*
ROLL_SCALE_RADIUS
+
1
));
markerPath
.
lineTo
(
-
h
*
ROLL_SCALE_MARKERWIDTH
/
2
,
-
h
*
(
ROLL_SCALE_RADIUS
-
ROLL_SCALE_MARKERHEIGHT
)
+
1
);
...
...
@@ -501,7 +492,7 @@ void PrimaryFlightDisplay::drawAIGlobalFeatures(
qreal
w
=
area
.
width
();
qreal
h
=
area
.
height
();
qreal
halfsize
=
90
/
PITCHTRANSLATION
*
h
+
w
*
s
qrt
(
2
)
/
2
;
qreal
halfsize
=
90
/
PITCHTRANSLATION
*
h
+
w
*
qS
qrt
(
2
)
/
2
;
QPainterPath
skyPath
(
QPointF
(
-
w
,
0
));
skyPath
.
lineTo
(
-
halfsize
,
-
halfsize
);
...
...
@@ -527,16 +518,14 @@ void PrimaryFlightDisplay::drawAIGlobalFeatures(
QBrush
groundBrush
(
groundGradient
);
painter
.
fillPath
(
groundPath
,
groundBrush
);
painter
.
setPen
(
greenPen
);
QPen
pen
;
pen
.
setWidthF
(
lineWidth
);
pen
.
setColor
(
greenColor
);
painter
.
setPen
(
pen
);
QPointF
start
(
-
w
,
0
);
QPoint
end
(
w
,
0
);
painter
.
drawLine
(
start
,
end
);
if
(
style
==
OPAGUE_TAPES
)
{
painter
.
resetTransform
();
drawInstrumentBackground
(
painter
,
area
);
}
}
void
PrimaryFlightDisplay
::
drawPitchScale
(
...
...
@@ -546,17 +535,17 @@ void PrimaryFlightDisplay::drawPitchScale(
bool
drawNumbersRight
)
{
// We should really do these transforms but they are assumed done by caller.
// painter.resetTransform();
// painter.translate(area.center());
// painter.rotate(roll);
// The area should be quadratic but if not height is the major size.
qreal
h
=
area
.
height
();
//qreal textPixelSize = constrain(MEDUIM_TEXT_SIZE, AI_TEXT_MIN_PIXELS, AI_TEXT_MAX_PIXELS);
painter
.
setPen
(
whitePen
);
QPen
pen
;
pen
.
setWidthF
(
lineWidth
);
pen
.
setColor
(
Qt
::
white
);
painter
.
setPen
(
pen
);
QTransform
savedTransform
=
painter
.
transform
();
qreal
h
=
area
.
height
();
// find the mark nearest center
int
snap
=
round
(
pitch
/
PITCH_SCALE_RESOLUTION
)
*
PITCH_SCALE_RESOLUTION
;
int
_min
=
snap
-
PITCH_SCALE_HALFRANGE
;
...
...
@@ -577,8 +566,8 @@ void PrimaryFlightDisplay::drawPitchScale(
if
(
SHOW_ZERO_ON_SCALES
||
degrees
)
{
QString
s_number
;
//= QString("%d").arg(degrees);
s_number
.
sprintf
(
"%d"
,
displayDegrees
);
if
(
drawNumbersLeft
)
drawTextRightCenter
(
painter
,
s_number
,
SCALE_TEXT_SIZE
*
h
,
-
PITCH_SCALE_MAJORLENGTH
*
h
-
10
,
0
);
if
(
drawNumbersRight
)
drawTextLeftCenter
(
painter
,
s_number
,
SCALE_TEXT_SIZE
*
h
,
PITCH_SCALE_MAJORLENGTH
*
h
+
10
,
0
);
if
(
drawNumbersLeft
)
drawTextRightCenter
(
painter
,
s_number
,
mediumTextSize
,
-
PITCH_SCALE_MAJORLENGTH
*
h
-
10
,
0
);
if
(
drawNumbersRight
)
drawTextLeftCenter
(
painter
,
s_number
,
mediumTextSize
,
PITCH_SCALE_MAJORLENGTH
*
h
+
10
,
0
);
}
}
...
...
@@ -592,9 +581,14 @@ void PrimaryFlightDisplay::drawRollScale(
bool
drawTicks
,
bool
drawNumbers
)
{
// The area should be quadratic but if not height is the major size.
qreal
h
=
area
.
height
();
// qreal textPixelSize = constrain(h*AI_TEXT_SIZE, AI_TEXT_MIN_PIXELS, AI_TEXT_MAX_PIXELS);
painter
.
setPen
(
whitePen
);
QPen
pen
;
pen
.
setWidthF
(
lineWidth
);
pen
.
setColor
(
Qt
::
white
);
painter
.
setPen
(
pen
);
// We should really do these transforms but they are assumed done by caller.
// painter.resetTransform();
...
...
@@ -624,7 +618,7 @@ void PrimaryFlightDisplay::drawRollScale(
s_number
.
sprintf
(
"%d"
,
abs
(
degrees
));
if
(
drawNumbers
)
{
drawTextCenterBottom
(
painter
,
s_number
,
SCALE_TEXT_SIZE
*
h
,
0
,
-
(
ROLL_SCALE_RADIUS
+
ROLL_SCALE_TICKMARKLENGTH
*
1.7
)
*
h
);
drawTextCenterBottom
(
painter
,
s_number
,
mediumTextSize
,
0
,
-
(
ROLL_SCALE_RADIUS
+
ROLL_SCALE_TICKMARKLENGTH
*
1.7
)
*
h
);
}
}
}
...
...
@@ -646,31 +640,32 @@ void PrimaryFlightDisplay::drawAIAttitudeScales(
drawPitchScale
(
painter
,
area
,
true
,
true
);
}
void
PrimaryFlightDisplay
::
drawCompassDisk
(
QPainter
&
painter
,
QRectF
area
)
{
float
start
=
heading
-
COMPASS_DISK
2
_SPAN
/
2
;
float
end
=
heading
+
COMPASS_DISK
2
_SPAN
/
2
;
void
PrimaryFlightDisplay
::
draw
AI
CompassDisk
(
QPainter
&
painter
,
QRectF
area
)
{
float
start
=
heading
-
COMPASS_DISK_SPAN
/
2
;
float
end
=
heading
+
COMPASS_DISK_SPAN
/
2
;
int
firstTick
=
ceil
(
start
/
COMPASS_DISK
2_RESOLUTION
)
*
COMPASS_DISK2
_RESOLUTION
;
int
lastTick
=
floor
(
end
/
COMPASS_DISK
2_RESOLUTION
)
*
COMPASS_DISK2
_RESOLUTION
;
int
firstTick
=
ceil
(
start
/
COMPASS_DISK
_RESOLUTION
)
*
COMPASS_DISK
_RESOLUTION
;
int
lastTick
=
floor
(
end
/
COMPASS_DISK
_RESOLUTION
)
*
COMPASS_DISK
_RESOLUTION
;
float
radius
=
area
.
width
()
/
2
;
float
innerRadius
=
radius
*
0.96
;
painter
.
resetTransform
();
float
save
=
instrumentEdgePen
.
widthF
();
instrumentEdgePen
.
setWidthF
(
save
/
2
);
painter
.
setPen
(
instrumentEdgePen
);
if
(
layout
==
COMPASS_SEPARATED
)
if
(
layout
==
COMPASS_SEPARATED
)
{
painter
.
setBrush
(
instrumentOpagueBackground
);
else
painter
.
setPen
(
instrumentEdgePen
);
}
else
{
painter
.
setBrush
(
instrumentBackground
);
painter
.
setPen
(
instrumentEdgePen
);
}
painter
.
drawEllipse
(
area
);
instrumentEdgePen
.
setWidthF
(
save
);
painter
.
setBrush
(
Qt
::
NoBrush
);
blackPen
.
setWidthF
(
2
);
QPen
scalePen
(
Qt
::
black
);
scalePen
.
setWidthF
(
fineLineWidth
);
for
(
int
tickYaw
=
firstTick
;
tickYaw
<=
lastTick
;
tickYaw
+=
COMPASS_DISK
2
_RESOLUTION
)
{
for
(
int
tickYaw
=
firstTick
;
tickYaw
<=
lastTick
;
tickYaw
+=
COMPASS_DISK_RESOLUTION
)
{
int
displayTick
=
tickYaw
;
if
(
displayTick
<
0
)
displayTick
+=
360
;
else
if
(
displayTick
>=
360
)
displayTick
-=
360
;
...
...
@@ -678,12 +673,12 @@ void PrimaryFlightDisplay::drawCompassDisk(QPainter& painter, QRectF area) {
// yaw is in center.
float
off
=
tickYaw
-
heading
;
// wrap that to ]-180..180]
if
(
off
<=-
180
)
off
+=
360
;
else
if
(
off
>
180
)
off
+
=
360
;
if
(
off
<=-
180
)
off
+=
360
;
else
if
(
off
>
180
)
off
-
=
360
;
painter
.
translate
(
area
.
center
());
painter
.
rotate
(
off
);
bool
drewArrow
=
false
;
bool
isMajor
=
displayTick
%
COMPASS_DISK
2
_MAJORTICK
==
0
;
bool
isMajor
=
displayTick
%
COMPASS_DISK_MAJORTICK
==
0
;
if
(
displayTick
==
30
||
displayTick
==
60
||
displayTick
==
120
||
displayTick
==
150
||
...
...
@@ -692,16 +687,16 @@ void PrimaryFlightDisplay::drawCompassDisk(QPainter& painter, QRectF area) {
// draw a number
QString
s_number
;
s_number
.
sprintf
(
"%d"
,
displayTick
/
10
);
painter
.
setPen
(
black
Pen
);
drawTextCenter
(
painter
,
s_number
,
COMPASS_SCALE_TEXT_SIZE
*
radius
,
0
,
-
innerRadius
*
0.75
);
painter
.
setPen
(
scale
Pen
);
drawTextCenter
(
painter
,
s_number
,
/*COMPASS_SCALE_TEXT_SIZE*radius*/
smallTestSize
,
0
,
-
innerRadius
*
0.75
);
}
else
{
if
(
displayTick
%
COMPASS_DISK
2
_ARROWTICK
==
0
)
{
if
(
displayTick
%
COMPASS_DISK_ARROWTICK
==
0
)
{
if
(
displayTick
!=
0
)
{
QPainterPath
markerPath
(
QPointF
(
0
,
-
innerRadius
*
(
1
-
COMPASS_DISK_MARKERHEIGHT
/
2
)));
markerPath
.
lineTo
(
innerRadius
*
COMPASS_DISK_MARKERWIDTH
/
4
,
-
innerRadius
);
markerPath
.
lineTo
(
-
innerRadius
*
COMPASS_DISK_MARKERWIDTH
/
4
,
-
innerRadius
);
markerPath
.
closeSubpath
();
painter
.
setPen
(
black
Pen
);
painter
.
setPen
(
scale
Pen
);
painter
.
setBrush
(
Qt
::
SolidPattern
);
painter
.
drawPath
(
markerPath
);
painter
.
setBrush
(
Qt
::
NoBrush
);
...
...
@@ -710,8 +705,8 @@ void PrimaryFlightDisplay::drawCompassDisk(QPainter& painter, QRectF area) {
if
(
displayTick
%
90
==
0
)
{
// Also draw a label
QString
name
=
compassWindNames
[
displayTick
/
45
];
painter
.
setPen
(
black
Pen
);
drawTextCenter
(
painter
,
name
,
COMPASS_SCALE_TEXT_SIZE
*
radius
*
1.2
,
0
,
-
innerRadius
*
0.75
);
painter
.
setPen
(
scale
Pen
);
drawTextCenter
(
painter
,
name
,
mediumTextSize
,
0
,
-
innerRadius
*
0.75
);
}
}
}
...
...
@@ -720,12 +715,12 @@ void PrimaryFlightDisplay::drawCompassDisk(QPainter& painter, QRectF area) {
QPointF
p_start
=
drewArrow
?
QPoint
(
0
,
-
innerRadius
*
0.94
)
:
QPoint
(
0
,
-
innerRadius
);
QPoint
p_end
=
isMajor
?
QPoint
(
0
,
-
innerRadius
*
0.86
)
:
QPoint
(
0
,
-
innerRadius
*
0.90
);
painter
.
setPen
(
black
Pen
);
painter
.
setPen
(
scale
Pen
);
painter
.
drawLine
(
p_start
,
p_end
);
painter
.
resetTransform
();
}
painter
.
setPen
(
black
Pen
);
painter
.
setPen
(
scale
Pen
);
//painter.setBrush(Qt::SolidPattern);
painter
.
translate
(
area
.
center
());
QPainterPath
markerPath
(
QPointF
(
0
,
-
radius
-
2
));
...
...
@@ -746,64 +741,17 @@ void PrimaryFlightDisplay::drawCompassDisk(QPainter& painter, QRectF area) {
QString
yawAngle
;
yawAngle
.
sprintf
(
"%03d"
,
yawCompass
);
painter
.
setPen
(
whitePen
);
drawTextCenter
(
painter
,
yawAngle
,
COMPASS_SCALE_TEXT_SIZE
*
radius
*
1.2
,
0
,
-
radius
*
0.38
);
}
#ifdef USE_TAPE_COMPASS
void
PrimaryFlightDisplay
::
drawCompassTape
(
QPainter
&
painter
,
float
heading
,
qreal
width
,
qreal
y
,
qreal
height
)
{
float
start
=
heading
-
COMPASS_TAPE_SPAN
/
2
;
float
end
=
heading
+
COMPASS_TAPE_SPAN
/
2
;
int
firstTick
=
ceil
(
start
/
COMPASS_TAPE_RESOLUTION
)
*
COMPASS_TAPE_RESOLUTION
;
int
lastTick
=
floor
(
end
/
COMPASS_TAPE_RESOLUTION
)
*
COMPASS_TAPE_RESOLUTION
;
painter
.
setPen
(
whitePen
);
for
(
int
tickYaw
=
firstTick
;
tickYaw
<=
lastTick
;
tickYaw
+=
COMPASS_TAPE_RESOLUTION
)
{
int
displayTick
=
tickYaw
;
if
(
displayTick
<
0
)
displayTick
+=
360
;
else
if
(
displayTick
>=
360
)
displayTick
-=
360
;
// yaw is in center.
float
off
=
tickYaw
-
heading
;
// wrap that to ]-180..180]
if
(
off
<=-
180
)
off
+=
360
;
else
if
(
off
>
180
)
off
+=
360
;
float
x
=
width
/
2
+
off
*
width
/
COMPASS_TAPE_SPAN
;
QPointF
p_start
=
QPointF
(
x
,
y
-
height
/
2
);
QPointF
p_end
=
QPointF
(
x
,
y
+
height
/
2
);
if
(
displayTick
%
45
==
0
)
{
// draw a wind label
QString
name
=
compassWindNames
[
displayTick
/
45
];
drawText
(
painter
,
name
,
Qt
::
AlignLeft
|
Qt
::
TextWordWrap
,
SCALE_TEXT_SIZE
,
x
,
y
);
painter
.
drawPoint
(
p_start
);
painter
.
drawPoint
(
p_end
);
}
else
{
QPointF
p_start
(
x
,
y
-
height
/
2
);
QPointF
p_endQPointF
(
x
,
y
+
height
/
2
);
painter
.
drawLine
(
p_start
,
p_end
);
}
}
QPen
pen
;
pen
.
setWidthF
(
lineWidth
);
pen
.
setColor
(
Qt
::
white
);
painter
.
setPen
(
pen
);
painter
.
setPen
(
redPen
);
QPointF
p_start
(
width
/
2
,
y
-
height
/
2
);
QPointF
p_end
(
width
/
2
,
y
+
height
/
2
);
painter
.
drawLine
(
p_start
,
p_end
);
drawTextCenter
(
painter
,
yawAngle
,
largeTextSize
,
0
,
-
radius
*
0.38
);
}
#endif
void
PrimaryFlightDisplay
::
drawAltimeter
(
QPainter
&
painter
,
QRectF
area
,
// the area where to draw the tape.
// float width,
// float height,
float
altitude
,
float
maxAltitude
,
float
vv
...
...
@@ -813,9 +761,12 @@ void PrimaryFlightDisplay::drawAltimeter(
Q_UNUSED
(
maxAltitude
)
painter
.
resetTransform
();
fillInstrumentBackground
(
painter
,
area
);
//
fillInstrumentBackground(painter, area);
painter
.
setPen
(
whitePen
);
QPen
pen
;
pen
.
setWidthF
(
lineWidth
);
pen
.
setColor
(
Qt
::
white
);
painter
.
setPen
(
pen
);
float
h
=
area
.
height
();
float
w
=
area
.
width
();
...
...
@@ -856,7 +807,7 @@ void PrimaryFlightDisplay::drawAltimeter(
if
(
hasText
)
{
QString
s_alt
;
s_alt
.
sprintf
(
"%d"
,
tickAlt
);
drawTextLeftCenter
(
painter
,
s_alt
,
TAPES_TEXT_SIZE
*
width
()
,
numbersLeft
,
0
);
drawTextLeftCenter
(
painter
,
s_alt
,
mediumTextSize
,
numbersLeft
,
0
);
}
}
...
...
@@ -869,16 +820,21 @@ void PrimaryFlightDisplay::drawAltimeter(
painter
.
resetTransform
();
painter
.
translate
(
area
.
left
(),
area
.
center
().
y
());
painter
.
setPen
(
blackPen
);
pen
.
setWidthF
(
fineLineWidth
);
pen
.
setColor
(
Qt
::
white
);
painter
.
setPen
(
pen
);
painter
.
setBrush
(
Qt
::
SolidPattern
);
painter
.
drawPath
(
markerPath
);
painter
.
setBrush
(
Qt
::
NoBrush
);
painter
.
setPen
(
whitePen
);
pen
.
setColor
(
Qt
::
white
);
painter
.
setPen
(
pen
);
QString
s_alt
;
s_alt
.
sprintf
(
"%3.0f"
,
altitude
);
float
xCenter
=
(
markerTip
+
rightEdge
)
/
2
;
drawTextCenter
(
painter
,
s_alt
,
TAPES_TEXT_SIZE
*
width
()
,
xCenter
,
0
);
drawTextCenter
(
painter
,
s_alt
,
/* TAPES_TEXT_SIZE*width()*/
mediumTextSize
,
xCenter
,
0
);
}
void
PrimaryFlightDisplay
::
drawSysStatsPanel
(
...
...
@@ -897,10 +853,14 @@ void PrimaryFlightDisplay::drawSysStatsPanel (
painter
.
translate
(
area
.
center
());
painter
.
setPen
(
amberPen
);
drawTextCenter
(
painter
,
s_volts
,
PANELS_TEXT_SIZE
*
width
(),
0
,
-
area
.
height
()
/
6
);
painter
.
setPen
(
redPen
);
drawTextCenter
(
painter
,
s_arm
,
PANELS_TEXT_SIZE
*
width
(),
0
,
area
.
height
()
/
6
);
QPen
pen
;
pen
.
setWidthF
(
lineWidth
);
pen
.
setColor
(
amberColor
);
painter
.
setPen
(
pen
);
drawTextCenter
(
painter
,
s_volts
,
mediumTextSize
,
0
,
-
area
.
height
()
/
6
);
pen
.
setColor
(
redColor
);
drawTextCenter
(
painter
,
s_arm
,
mediumTextSize
,
0
,
area
.
height
()
/
6
);
}
void
PrimaryFlightDisplay
::
drawLinkStatsPanel
(
...
...
@@ -918,9 +878,13 @@ void PrimaryFlightDisplay::drawLinkStatsPanel (
painter
.
translate
(
area
.
center
());
painter
.
setPen
(
amberPen
);
drawTextCenter
(
painter
,
s_linkStat
,
PANELS_TEXT_SIZE
*
width
(),
0
,
-
area
.
height
()
/
6
);
drawTextCenter
(
painter
,
s_upTime
,
PANELS_TEXT_SIZE
*
width
(),
0
,
area
.
height
()
/
6
);
QPen
pen
;
pen
.
setWidthF
(
lineWidth
);
pen
.
setColor
(
amberColor
);
painter
.
setPen
(
pen
);
drawTextCenter
(
painter
,
s_linkStat
,
mediumTextSize
,
0
,
-
area
.
height
()
/
6
);
drawTextCenter
(
painter
,
s_upTime
,
mediumTextSize
,
0
,
area
.
height
()
/
6
);
}
void
PrimaryFlightDisplay
::
drawMissionStatsPanel
(
...
...
@@ -939,9 +903,12 @@ void PrimaryFlightDisplay::drawMissionStatsPanel (
painter
.
translate
(
area
.
center
());
painter
.
setPen
(
amberPen
);
drawTextCenter
(
painter
,
s_flightMode
,
PANELS_TEXT_SIZE
*
width
(),
0
,
-
area
.
height
()
/
6
);
drawTextCenter
(
painter
,
s_nextWP
,
PANELS_TEXT_SIZE
*
width
(),
0
,
area
.
height
()
/
6
);
QPen
pen
;
pen
.
setWidthF
(
lineWidth
);
pen
.
setColor
(
amberColor
);
painter
.
setPen
(
pen
);
drawTextCenter
(
painter
,
s_flightMode
,
mediumTextSize
,
0
,
-
area
.
height
()
/
6
);
drawTextCenter
(
painter
,
s_nextWP
,
mediumTextSize
,
0
,
area
.
height
()
/
6
);
}
void
PrimaryFlightDisplay
::
drawSensorsStatsPanel
(
...
...
@@ -960,9 +927,13 @@ void PrimaryFlightDisplay::drawSensorsStatsPanel (
painter
.
translate
(
area
.
center
());
painter
.
setPen
(
amberPen
);
drawTextCenter
(
painter
,
s_GPS
,
PANELS_TEXT_SIZE
*
width
(),
0
,
-
area
.
height
()
/
6
);
drawTextCenter
(
painter
,
s_homealt
,
PANELS_TEXT_SIZE
*
width
(),
0
,
area
.
height
()
/
6
);
QPen
pen
;
pen
.
setWidthF
(
lineWidth
);
pen
.
setColor
(
amberColor
);
painter
.
setPen
(
pen
);
drawTextCenter
(
painter
,
s_GPS
,
mediumTextSize
,
0
,
-
area
.
height
()
/
6
);
drawTextCenter
(
painter
,
s_homealt
,
mediumTextSize
,
0
,
area
.
height
()
/
6
);
}
#define TOP (1<<0)
...
...
@@ -1089,7 +1060,7 @@ void PrimaryFlightDisplay::doPaint() {
// Compass is inside the AI ans within its margins also.
compassArea
=
QRectF
(
AIArea
.
x
()
+
AIArea
.
width
()
*
0.60
,
AIArea
.
y
()
+
AIArea
.
height
()
*
0.80
,
AIArea
.
width
()
/
2
,
AIArea
.
height
()
/
2
);
AIArea
.
width
()
/
2
,
AIArea
.
width
()
/
2
);
break
;
}
...
...
@@ -1129,7 +1100,7 @@ void PrimaryFlightDisplay::doPaint() {
// Compass is inside the AI ans within its margins also.
compassArea
=
QRectF
(
AIArea
.
x
()
+
AIArea
.
width
()
*
0.60
,
AIArea
.
y
()
+
AIArea
.
height
()
*
0.80
,
AIArea
.
width
()
/
2
,
AIArea
.
height
()
/
2
);
AIArea
.
width
()
/
2
,
AIArea
.
width
()
/
2
);
break
;
}
...
...
@@ -1153,7 +1124,7 @@ void PrimaryFlightDisplay::doPaint() {
qreal
remainingHeight
=
height
()
-
aiheight
;
qreal
panelsHeight
=
remainingHeight
/
5.0
f
;
QPoint
compassCenter
;
qreal
maxCompass
Radius
;
qreal
maxCompass
Diam
;
if
(
remainingHeight
>
width
())
{
// very tall layout, place panels below compass.
sensorsStatsArea
=
QRectF
(
0
,
height
()
-
panelsHeight
,
panelsWidth
,
panelsHeight
);
...
...
@@ -1164,7 +1135,7 @@ void PrimaryFlightDisplay::doPaint() {
setMarginsForInlineLayout
(
margin
,
sensorsStatsArea
,
linkStatsArea
,
sysStatsArea
,
missionStatsArea
);
}
compassCenter
=
QPoint
(
width
()
/
2
,
(
AIArea
.
bottom
()
+
height
()
-
panelsHeight
)
/
2
);
maxCompass
Radius
=
fmin
(
width
()
/
2
,
(
height
()
-
AIArea
.
height
()
-
panelsHeight
)
/
2
);
maxCompass
Diam
=
fmin
(
width
(),
height
()
-
AIArea
.
height
()
-
panelsHeight
);
}
else
{
// Remaining part is wider than high; place panels in corners around compass
sensorsStatsArea
=
QRectF
(
0
,
AIArea
.
bottom
(),
panelsWidth
,
panelsHeight
);
...
...
@@ -1178,29 +1149,30 @@ void PrimaryFlightDisplay::doPaint() {
// diagonal between 2 panel corners
qreal
xd
=
width
()
-
panelsWidth
*
2
;
qreal
yd
=
height
()
-
panelsHeight
-
AIArea
.
bottom
();
maxCompass
Radius
=
sqrt
(
xd
*
xd
+
yd
*
yd
)
/
2
;
maxCompass
Diam
=
sqrt
(
xd
*
xd
+
yd
*
yd
)
;
}
qreal
compass
Radius
=
maxCompassRadius
*
0.9
;
compassArea
=
QRectF
(
compassCenter
.
x
()
-
compass
Radius
,
compassCenter
.
y
()
-
compassRadius
,
2
*
compassRadius
,
2
*
compassRadius
);
qreal
compass
Diam
=
maxCompassDiam
*
0.8
;
compassArea
=
QRectF
(
compassCenter
.
x
()
-
compass
Diam
/
2
,
compassCenter
.
y
()
-
compassDiam
/
2
,
compassDiam
,
compassDiam
);
break
;
}
}
bool
hadClip
=
painter
.
hasClipping
();
painter
.
setClipping
(
true
);
if
(
layout
==
COMPASS_SEPARATED
)
painter
.
setClipRect
(
rect
());
else
painter
.
setClipRect
(
AIArea
);
painter
.
setClipRect
(
AIArea
);
drawAIGlobalFeatures
(
painter
,
AIArea
);
drawAIAttitudeScales
(
painter
,
AIArea
);
drawAIAirframeFixedFeatures
(
painter
,
AIArea
);
drawCompassDisk
(
painter
,
compassArea
);
if
(
layout
==
COMPASS_SEPARATED
)
{
painter
.
setClipping
(
false
);
drawAICompassDisk
(
painter
,
compassArea
);
}
else
{
drawAICompassDisk
(
painter
,
compassArea
);
}
painter
.
setClipping
(
hadClip
);
...
...
@@ -1215,6 +1187,10 @@ void PrimaryFlightDisplay::doPaint() {
drawSysStatsPanel
(
painter
,
sysStatsArea
);
drawMissionStatsPanel
(
painter
,
missionStatsArea
);
if
(
style
==
OPAGUE_TAPES
)
{
drawInstrumentBackground
(
painter
,
AIArea
);
}
painter
.
end
();
}
...
...
src/ui/PrimaryFlightDisplay.h
View file @
76716145
...
...
@@ -5,13 +5,26 @@
#include <QPen>
#include "UASInterface.h"
#define LINEWIDTH 0.007
#define LINEWIDTH 0.0032f
//#define TAPES_TEXT_SIZE 0.028
//#define AI_TEXT_SIZE 0.040
//#define AI_TEXT_MIN_PIXELS 12
//#define AI_TEXT_MAX_PIXELS 36
//#define PANELS_TEXT_SIZE 0.030
//#define COMPASS_SCALE_TEXT_SIZE 0.16
#define SMALL_TEXT_SIZE 0.028f
#define MEDIUM_TEXT_SIZE (SMALL_TEXT_SIZE*1.2f)
#define LARGE_TEXT_SIZE (MEDIUM_TEXT_SIZE*1.2f)
#define SHOW_ZERO_ON_SCALES true
// all in units of display height
#define ROLL_SCALE_RADIUS 0.42
#define ROLL_SCALE_TICKMARKLENGTH 0.04
#define ROLL_SCALE_MARKERWIDTH 0.06
#define ROLL_SCALE_MARKERHEIGHT 0.04
#define ROLL_SCALE_RADIUS 0.42
f
#define ROLL_SCALE_TICKMARKLENGTH 0.04
f
#define ROLL_SCALE_MARKERWIDTH 0.06
f
#define ROLL_SCALE_MARKERHEIGHT 0.04
f
// scale max. degrees
#define ROLL_SCALE_RANGE 60
...
...
@@ -23,31 +36,22 @@
#define PITCH_SCALE_MINORLENGTH 0.04
#define PITCH_SCALE_HALFRANGE 20
//#define USE_TAPE_COMPASS
//#define USE_DISK_COMPASS
//#define USE_DISK2_COMPASS
// We want no numbers on the scale, just principal winds or half-winds and ticks.
// With whole winds there are 45 deg per wind, with half-winds 22.5
#define COMPASS_TAPE_RESOLUTION 15
// number of degrees side to side
#define COMPASS_TAPE_SPAN 120
// The number of degrees to either side of the heading to draw the compass disk.
// 180 is valid, this will draw a complete disk. If the disk is partly clipped
// away, less will do.
#define COMPASS_DISK_MAJORTICK 10
#define COMPASS_DISK_ARROWTICK 45
#define COMPASS_DISK_MAJORLINEWIDTH 0.006
#define COMPASS_DISK_MINORLINEWIDTH 0.004
#define COMPASS_DISK_SPAN 180
#define COMPASS_DISK_RESOLUTION 15
#define COMPASS_DISK_MARKERWIDTH 0.2
#define COMPASS_DISK_MARKERHEIGHT 0.133
#define COMPASS_DISK2_SPAN 180
#define COMPASS_DISK2_RESOLUTION 5
#define COMPASS_DISK2_MAJORTICK 10
#define COMPASS_DISK2_ARROWTICK 45
#define COMPASS_DISK2_MAJORLINEWIDTH 0.006
#define COMPASS_DISK2_MINORLINEWIDTH 0.004
#define COMPASS_SCALE_TEXT_SIZE 0.16
#define ALTIMETER_VVI_SPAN 10
#define ALTIMETER_VVI_LOGARITHMIC true
// The altitude difference between top and bottom of scale
#define ALTIMETER_LINEAR_SPAN 35
...
...
@@ -66,15 +70,6 @@
// min. and max. vertical velocity
//#define ALTIMETER_PROJECTED
#define TAPES_TEXT_SIZE 0.028
#define ALTIMETER_VVI_SPAN 10
#define ALTIMETER_VVI_LOGARITHMIC true
#define SHOW_ZERO_ON_SCALES true
#define SCALE_TEXT_SIZE 0.040
#define PANELS_TEXT_SIZE 0.030
#define UNKNOWN_BATTERY -1
class
PrimaryFlightDisplay
:
public
QWidget
...
...
@@ -156,7 +151,7 @@ private:
void
drawPitchScale
(
QPainter
&
painter
,
QRectF
area
,
bool
drawNumbersLeft
,
bool
drawNumbersRight
);
void
drawRollScale
(
QPainter
&
painter
,
QRectF
area
,
bool
drawTicks
,
bool
drawNumbers
);
void
drawAIAttitudeScales
(
QPainter
&
painter
,
QRectF
area
);
void
drawCompassDisk
(
QPainter
&
painter
,
QRectF
area
);
void
draw
AI
CompassDisk
(
QPainter
&
painter
,
QRectF
area
);
void
drawAltimeter
(
QPainter
&
painter
,
QRectF
area
,
float
altitude
,
float
maxAltitude
,
float
vv
);
void
fillInstrumentBackground
(
QPainter
&
painter
,
QRectF
edge
);
...
...
@@ -189,21 +184,34 @@ private:
QString
mode
;
QString
state
;
float
load
;
float
load
;
//
Layout
layout
;
Style
style
;
Layout
layout
;
// The display layout.
Style
style
;
// The AI style (tapes translusent or opague)
/* This idea did not work
QPen whitePen;
QPen redPen;
QPen amberPen;
QPen greenPen;
QPen blackPen;
*/
QColor
redColor
;
QColor
amberColor
;
QColor
greenColor
;
qreal
lineWidth
;
qreal
fineLineWidth
;
qreal
smallTestSize
;
qreal
mediumTextSize
;
qreal
largeTextSize
;
// Globally used stuff only.
QPen
instrumentEdgePen
;
QBrush
instrumentBackground
;
QBrush
instrumentOpagueBackground
;
//QBrush HUDInstrumentBackground;
QFont
font
;
...
...
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