QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
MissionStats.qml
Go to the documentation of this file.
1import QtQuick
2import QtQuick.Controls
3import QtQuick.Layouts
4import QtQuick.Dialogs
5
6import QGroundControl
7import QGroundControl.Controls
8import QGroundControl.FactControls
9
10Rectangle {
11 required property var planMasterController
12
13 id: missionStats
14 implicitWidth: mainLayout.implicitWidth + (_margins * 2)
15 implicitHeight: mainLayout.implicitHeight + (_margins * 2)
16 color: Qt.rgba(_windowColor.r, _windowColor.g, _windowColor.b, 0.8)
17
18 property var _planMasterController: planMasterController
19 property color _windowColor: QGroundControl.globalPalette.window
20 property var _currentMissionItem: _planMasterController.missionController.currentPlanViewItem ///< Mission item to display status for
21
22 property var missionItems: _controllerValid ? _planMasterController.missionController.visualItems : undefined
23 property real missionPlannedDistance: _controllerValid ? _planMasterController.missionController.missionPlannedDistance : NaN
24 property real missionTime: _controllerValid ? _planMasterController.missionController.missionTime : 0
25 property real missionMaxTelemetry: _controllerValid ? _planMasterController.missionController.missionMaxTelemetry : NaN
26 property bool _controllerValid: _planMasterController !== undefined && _planMasterController !== null
27
28 property bool _currentMissionItemValid: _currentMissionItem && _currentMissionItem !== undefined && _currentMissionItem !== null
29 property bool _currentItemIsVTOLTakeoff: _currentMissionItemValid && _currentMissionItem.command == 84
30 property bool _missionValid: missionItems !== undefined
31
32 property real _dataFontSize: ScreenTools.defaultFontPointSize
33 property real _largeValueWidth: ScreenTools.defaultFontPixelWidth * 8
34 property real _mediumValueWidth: ScreenTools.defaultFontPixelWidth * 4
35 property real _smallValueWidth: ScreenTools.defaultFontPixelWidth * 3
36 property real _labelToValueSpacing: ScreenTools.defaultFontPixelWidth
37 property real _rowSpacing: ScreenTools.isMobile ? 1 : 0
38 property real _distance: _currentMissionItemValid ? _currentMissionItem.distance : NaN
39 property real _altDifference: _currentMissionItemValid ? _currentMissionItem.altDifference : NaN
40 property real _azimuth: _currentMissionItemValid ? _currentMissionItem.azimuth : NaN
41 property real _heading: _currentMissionItemValid ? _currentMissionItem.missionVehicleYaw : NaN
42 property real _missionPlannedDistance: _missionValid ? missionPlannedDistance : NaN
43 property real _missionMaxTelemetry: _missionValid ? missionMaxTelemetry : NaN
44 property real _missionTime: _missionValid ? missionTime : 0
45 property int _batteryChangePoint: _controllerValid ? _planMasterController.missionController.batteryChangePoint : -1
46 property int _batteriesRequired: _controllerValid ? _planMasterController.missionController.batteriesRequired : -1
47 property bool _batteryInfoAvailable: _batteryChangePoint >= 0 || _batteriesRequired >= 0
48 property real _gradient: _currentMissionItemValid && _currentMissionItem.distance > 0 ?
49 (_currentItemIsVTOLTakeoff ?
50 0 : (Math.atan(_currentMissionItem.altDifference / _currentMissionItem.distance) * (180.0/Math.PI)))
51 : NaN
52
53 property string _distanceText: _distanceString()
54 property string _altDifferenceText: _altDifferenceString()
55 property string _gradientText: isNaN(_gradient) ? "-.-" : _gradient.toFixed(0) + qsTr(" deg")
56 property string _azimuthText: isNaN(_azimuth) ? "-.-" : Math.round(_azimuth) % 360
57 property string _headingText: isNaN(_azimuth) ? "-.-" : Math.round(_heading) % 360
58 property string _missionPlannedDistanceText: isNaN(_missionPlannedDistance) ? "-.-" : QGroundControl.unitsConversion.metersToAppSettingsHorizontalDistanceUnits(_missionPlannedDistance).toFixed(0) + " " + QGroundControl.unitsConversion.appSettingsHorizontalDistanceUnitsString
59 property string _missionMaxTelemetryText: isNaN(_missionMaxTelemetry) ? "-.-" : QGroundControl.unitsConversion.metersToAppSettingsHorizontalDistanceUnits(_missionMaxTelemetry).toFixed(0) + " " + QGroundControl.unitsConversion.appSettingsHorizontalDistanceUnitsString
60 property string _batteryChangePointText: _batteryChangePoint < 0 ? qsTr("N/A") : _batteryChangePoint
61 property string _batteriesRequiredText: _batteriesRequired < 0 ? qsTr("N/A") : _batteriesRequired
62
63 readonly property real _margins: ScreenTools.defaultFontPixelWidth
64
65 function _distanceString() {
66 return isNaN(_distance) ? "-.-" : QGroundControl.unitsConversion.metersToAppSettingsHorizontalDistanceUnitsString(_distance)
67 }
68
69 function _altDifferenceString() {
70 return isNaN(_altDifference) ? "-.-" : QGroundControl.unitsConversion.metersToAppSettingsVerticalDistanceUnitsString(_altDifference)
71 }
72
73 function getMissionTime() {
74 var totalSeconds = Number(_missionTime)
75 if (!totalSeconds) {
76 return "00:00:00"
77 }
78
79 var hours = Math.floor(totalSeconds / 3600)
80 var minutes = Math.floor((totalSeconds % 3600) / 60)
81 var seconds = Math.floor(totalSeconds % 60)
82
83 var hoursText = hours < 10 ? "0" + hours : String(hours)
84 var minutesText = minutes < 10 ? "0" + minutes : String(minutes)
85 var secondsText = seconds < 10 ? "0" + seconds : String(seconds)
86
87 return hoursText + ":" + minutesText + ":" + secondsText
88 }
89
90 QGCFlickable {
91 anchors.margins: _margins
92 anchors.fill: parent
93 flickableDirection: Flickable.HorizontalFlick
94 contentWidth: mainLayout.implicitWidth
95
96 RowLayout {
97 id: mainLayout
98 spacing: ScreenTools.defaultFontPixelWidth * 2
99
100 GridLayout {
101 columns: 8
102 rowSpacing: _rowSpacing
103 columnSpacing: _labelToValueSpacing
104
105 QGCLabel {
106 text: qsTr("Selected Waypoint")
107 Layout.columnSpan: 8
108 font.pointSize: ScreenTools.smallFontPointSize
109 }
110
111 QGCLabel { text: qsTr("Alt diff:"); font.pointSize: _dataFontSize; }
112 QGCLabel {
113 text: _altDifferenceText
114 font.pointSize: _dataFontSize
115 Layout.minimumWidth: _mediumValueWidth
116 }
117
118 Item { width: 1; height: 1 }
119
120 QGCLabel { text: qsTr("Azimuth:"); font.pointSize: _dataFontSize; }
121 QGCLabel {
122 text: _azimuthText
123 font.pointSize: _dataFontSize
124 Layout.minimumWidth: _smallValueWidth
125 }
126
127 Item { width: 1; height: 1 }
128
129 QGCLabel { text: qsTr("Dist prev WP:"); font.pointSize: _dataFontSize; }
130 QGCLabel {
131 text: _distanceText
132 font.pointSize: _dataFontSize
133 Layout.minimumWidth: _largeValueWidth
134 }
135
136 QGCLabel { text: qsTr("Gradient:"); font.pointSize: _dataFontSize; }
137 QGCLabel {
138 text: _gradientText
139 font.pointSize: _dataFontSize
140 Layout.minimumWidth: _mediumValueWidth
141 }
142
143 Item { width: 1; height: 1 }
144
145 QGCLabel { text: qsTr("Heading:"); font.pointSize: _dataFontSize; }
146 QGCLabel {
147 text: _headingText
148 font.pointSize: _dataFontSize
149 Layout.minimumWidth: _smallValueWidth
150 }
151 }
152
153 GridLayout {
154 columns: 5
155 rowSpacing: _rowSpacing
156 columnSpacing: _labelToValueSpacing
157
158 QGCLabel {
159 text: qsTr("Total Mission")
160 Layout.columnSpan: 5
161 font.pointSize: ScreenTools.smallFontPointSize
162 }
163
164 QGCLabel { text: qsTr("Distance:"); font.pointSize: _dataFontSize; }
165 QGCLabel {
166 text: _missionPlannedDistanceText
167 font.pointSize: _dataFontSize
168 Layout.minimumWidth: _largeValueWidth
169 }
170
171 Item { width: 1; height: 1 }
172
173 QGCLabel { text: qsTr("Max telem dist:"); font.pointSize: _dataFontSize; }
174 QGCLabel {
175 text: _missionMaxTelemetryText
176 font.pointSize: _dataFontSize
177 Layout.minimumWidth: _largeValueWidth
178 }
179
180 QGCLabel { text: qsTr("Time:"); font.pointSize: _dataFontSize; }
181 QGCLabel {
182 text: getMissionTime()
183 font.pointSize: _dataFontSize
184 Layout.minimumWidth: _largeValueWidth
185 }
186 }
187
188 GridLayout {
189 columns: 3
190 rowSpacing: _rowSpacing
191 columnSpacing: _labelToValueSpacing
192 visible: _batteryInfoAvailable
193
194 QGCLabel {
195 text: qsTr("Battery")
196 Layout.columnSpan: 3
197 font.pointSize: ScreenTools.smallFontPointSize
198 }
199
200 QGCLabel { text: qsTr("Batteries required:"); font.pointSize: _dataFontSize; }
201 QGCLabel {
202 text: _batteriesRequiredText
203 font.pointSize: _dataFontSize
204 Layout.minimumWidth: _mediumValueWidth
205 }
206 }
207 }
208 }
209
210 Connections {
211 target: QGroundControl.unitsConversion
212
213 function onUnitsChanged() {
214 _distanceText = Qt.binding(_distanceString)
215 _altDifferenceText = Qt.binding(_altDifferenceString)
216 }
217 }
218}