QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
GuidedActionsController.qml
Go to the documentation of this file.
1import QtQuick
2import QtQuick.Controls
3import QtQuick.Dialogs
4import QtLocation
5import QtPositioning
6import QtQuick.Layouts
7
8import QGroundControl
9import QGroundControl.Controls
10import QGroundControl.FlightMap
11import QGroundControl.Logging
12
13/// This provides the smarts behind the guided mode commands, minus the user interface. This way you can change UI
14/// without affecting the underlying functionality.
15Item {
16 id: _root
17
18 property var missionController
19 property var confirmDialog
20 property var guidedValueSlider
21 property var fwdFlightGotoMapCircle
22 property var orbitMapCircle
23
24 readonly property string emergencyStopTitle: qsTr("EMERGENCY STOP")
25 readonly property string armTitle: qsTr("Arm")
26 readonly property string mvArmTitle: qsTr("Arm (MV)")
27 readonly property string forceArmTitle: qsTr("Force Arm")
28 readonly property string disarmTitle: qsTr("Disarm")
29 readonly property string mvDisarmTitle: qsTr("Disarm (MV)")
30 readonly property string rtlTitle: qsTr("Return")
31 readonly property string takeoffTitle: qsTr("Takeoff")
32 readonly property string landTitle: qsTr("Land")
33 readonly property string startMissionTitle: qsTr("Start Mission")
34 readonly property string mvStartMissionTitle: qsTr("Start Mission (MV)")
35 readonly property string continueMissionTitle: qsTr("Continue Mission")
36 readonly property string resumeMissionUploadFailTitle: qsTr("Resume FAILED")
37 readonly property string pauseTitle: qsTr("Pause")
38 readonly property string mvPauseTitle: qsTr("Pause (MV)")
39 readonly property string changeAltTitle: qsTr("Change Altitude")
40 readonly property string changeLoiterRadiusTitle: qsTr("Change Loiter Radius")
41 readonly property string changeCruiseSpeedTitle: qsTr("Change Max Ground Speed")
42 readonly property string changeAirspeedTitle: qsTr("Change Airspeed")
43 readonly property string orbitTitle: qsTr("Orbit")
44 readonly property string landAbortTitle: qsTr("Land Abort")
45 readonly property string setWaypointTitle: qsTr("Set Waypoint")
46 readonly property string gotoTitle: qsTr("Go To Location")
47 readonly property string roiTitle: qsTr("ROI")
48 readonly property string setHomeTitle: qsTr("Set Home")
49 readonly property string setEstimatorOriginTitle: qsTr("Set Estimator Origin")
50 readonly property string setFlightMode: qsTr("Set Flight Mode")
51 readonly property string changeHeadingTitle: qsTr("Change Heading")
52
53 readonly property string armMessage: qsTr("Arm the vehicle.")
54 readonly property string mvArmMessage: qsTr("Arm selected vehicles.")
55 readonly property string forceArmMessage: qsTr("WARNING: This will force arming of the vehicle bypassing any safety checks.")
56 readonly property string disarmMessage: qsTr("Disarm the vehicle")
57 readonly property string mvDisarmMessage: qsTr("Disarm selected vehicles.")
58 readonly property string emergencyStopMessage: qsTr("WARNING: THIS WILL STOP ALL MOTORS. IF VEHICLE IS CURRENTLY IN THE AIR IT WILL CRASH.")
59 readonly property string takeoffMessage: qsTr("Takeoff and hold position")
60 readonly property string startMissionMessage: qsTr("Takeoff and start the current mission")
61 readonly property string mvStartMissionMessage: qsTr("Takeoff and start the current mission for selected vehicles")
62 readonly property string continueMissionMessage: qsTr("Continue the mission from the current waypoint")
63 readonly property string resumeMissionUploadFailMessage: qsTr("Upload of resume mission failed. Confirm to retry upload")
64 readonly property string landMessage: qsTr("Land the vehicle at the current position")
65 readonly property string rtlMessage: qsTr("Return to the launch position of the vehicle")
66 readonly property string changeAltMessage: qsTr("Change the altitude of the vehicle up or down")
67 readonly property string changeLoiterRadiusMessage: qsTr("Change the forward flight loiter radius")
68 readonly property string changeCruiseSpeedMessage: qsTr("Change the maximum horizontal cruise speed")
69 readonly property string changeAirspeedMessage: qsTr("Change the equivalent airspeed setpoint")
70 readonly property string gotoMessage: qsTr("Move the vehicle to the specified location")
71 property string setWaypointMessage: qsTr("Adjust current waypoint to %1").arg(_actionData)
72 readonly property string orbitMessage: qsTr("Orbit the vehicle around the specified location")
73 readonly property string landAbortMessage: qsTr("Abort the landing sequence")
74 readonly property string pauseMessage: qsTr("Pause at current position")
75 readonly property string mvPauseMessage: qsTr("Pause selected vehicles at their current position")
76 readonly property string roiMessage: qsTr("Make the specified location a Region Of Interest")
77 readonly property string setHomeMessage: qsTr("Set vehicle home as the specified location. This will affect Return to Home position")
78 readonly property string setEstimatorOriginMessage: qsTr("Make the specified location the estimator origin")
79 readonly property string setFlightModeMessage: qsTr("Set the vehicle flight mode to %1").arg(_actionData)
80 readonly property string changeHeadingMessage: qsTr("Set the vehicle heading towards the specified location")
81
82 readonly property int actionRTL: 1
83 readonly property int actionLand: 2
84 readonly property int actionTakeoff: 3
85 readonly property int actionArm: 4
86 readonly property int actionDisarm: 5
87 readonly property int actionEmergencyStop: 6
88 readonly property int actionChangeAlt: 7
89 readonly property int actionGoto: 8
90 readonly property int actionSetWaypoint: 9
91 readonly property int actionOrbit: 10
92 readonly property int actionLandAbort: 11
93 readonly property int actionStartMission: 12
94 readonly property int actionContinueMission: 13
95 readonly property int actionResumeMission: 14
96 readonly property int _actionUnused: 15
97 readonly property int actionResumeMissionUploadFail: 16
98 readonly property int actionPause: 17
99 readonly property int actionMVPause: 18
100 readonly property int actionMVStartMission: 19
101 readonly property int actionROI: 20
102 readonly property int actionForceArm: 21
103 readonly property int actionChangeSpeed: 22
104 readonly property int actionSetHome: 24
105 readonly property int actionSetEstimatorOrigin: 25
106 readonly property int actionSetFlightMode: 26
107 readonly property int actionChangeHeading: 27
108 readonly property int actionMVArm: 28
109 readonly property int actionMVDisarm: 29
110 readonly property int actionChangeLoiterRadius: 30
111
112 readonly property int customActionStart: 10000 // Custom actions ids should start here so that they don't collide with the built in actions
113
114 property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle
115 property var _flyViewSettings: QGroundControl.settingsManager.flyViewSettings
116 property var _unitsConversion: QGroundControl.unitsConversion
117 property bool _useChecklist: QGroundControl.settingsManager.appSettings.useChecklist.rawValue && QGroundControl.corePlugin.options.preFlightChecklistUrl.toString().length
118 property bool _enforceChecklist: _useChecklist && QGroundControl.settingsManager.appSettings.enforceChecklist.rawValue
119 property bool _checklistPassed: _activeVehicle ? (_useChecklist ? (_enforceChecklist ? _activeVehicle.checkListState === Vehicle.CheckListPassed : true) : true) : true
120 property bool _canArm: _activeVehicle ? (_checklistPassed && (!_activeVehicle.healthAndArmingCheckReport.supported || _activeVehicle.healthAndArmingCheckReport.canArm)) : false
121 property bool _canTakeoff: _activeVehicle ? (_checklistPassed && (!_activeVehicle.healthAndArmingCheckReport.supported || _activeVehicle.healthAndArmingCheckReport.canTakeoff)) : false
122 property bool _canStartMission: _activeVehicle ? (_checklistPassed && (!_activeVehicle.healthAndArmingCheckReport.supported || _activeVehicle.healthAndArmingCheckReport.canStartMission)) : false
123 property bool _initialConnectComplete: _activeVehicle ? _activeVehicle.initialConnectComplete : false
124
125 property bool showEmergenyStop: _guidedActionsEnabled && !_hideEmergenyStop && _vehicleArmed && _vehicleFlying
126 property bool showArm: _guidedActionsEnabled && !_vehicleArmed && _canArm
127 property bool showForceArm: _guidedActionsEnabled && !_vehicleArmed
128 property bool showDisarm: _guidedActionsEnabled && _vehicleArmed && !_vehicleFlying
129 property bool showRTL: _guidedActionsEnabled && _activeVehicle && _vehicleArmed && _activeVehicle.supports.guidedMode && _vehicleFlying && !_vehicleInRTLMode
130 property bool showTakeoff: _guidedActionsEnabled && _activeVehicle && (_activeVehicle.supports.guidedTakeoffWithAltitude || _activeVehicle.supports.guidedTakeoffWithoutAltitude) && !_vehicleFlying && _canTakeoff
131 property bool showLand: _guidedActionsEnabled && _activeVehicle && _activeVehicle.supports.guidedMode && _vehicleArmed && !_activeVehicle.fixedWing && !_vehicleInLandMode
132 property bool showStartMission: _guidedActionsEnabled && _missionAvailable && !_missionActive && !_vehicleFlying && _canStartMission
133 property bool showContinueMission: _guidedActionsEnabled && _missionAvailable && !_missionActive && _vehicleArmed && _vehicleFlying && (_currentMissionIndex < _visualItemsCount - 1)
134 property bool showPause: _guidedActionsEnabled && _activeVehicle && _vehicleArmed && _activeVehicle.supports.pauseVehicle && _vehicleFlying && !_vehiclePaused && !_fixedWingOnApproach
135 property bool showChangeAlt: _guidedActionsEnabled && _activeVehicle && _vehicleFlying && _activeVehicle.supports.guidedMode && _vehicleArmed && !_missionActive
136 property bool showChangeLoiterRadius: _guidedActionsEnabled && _activeVehicle && _vehicleFlying && _activeVehicle.supports.guidedMode && _vehicleArmed && !_missionActive && _vehicleInFwdFlight && fwdFlightGotoMapCircle.visible
137 property bool showChangeSpeed: _guidedActionsEnabled && _activeVehicle && _vehicleFlying && _activeVehicle.supports.guidedMode && _vehicleArmed && !_missionActive && _speedLimitsAvailable
138 property bool showOrbit: _guidedActionsEnabled && _activeVehicle && _vehicleFlying && __orbitSupported && !_missionActive && _activeVehicle.homePosition.isValid && !isNaN(_activeVehicle.homePosition.altitude)
139 property bool showROI: _guidedActionsEnabled && _vehicleFlying && __roiSupported
140 property bool showLandAbort: _guidedActionsEnabled && _vehicleFlying && _fixedWingOnApproach
141 property bool showGotoLocation: _guidedActionsEnabled && _vehicleFlying
142 property bool showSetHome: _guidedActionsEnabled
143 property bool showSetEstimatorOrigin: _activeVehicle && !(_activeVehicle.sensorsPresentBits & MAVLinkEnums.MAV_SYS_STATUS_SENSOR_GPS)
144 property bool showChangeHeading: _guidedActionsEnabled && _vehicleFlying
145
146 property string changeSpeedTitle: _vehicleInFwdFlight ? changeAirspeedTitle : changeCruiseSpeedTitle
147 property string changeSpeedMessage: _vehicleInFwdFlight ? changeAirspeedMessage : changeCruiseSpeedMessage
148
149 // Note: The '_visualItemsCount - 2' is a hack to not trigger resume mission when a mission ends with an RTL item
150 property bool showResumeMission: _activeVehicle && !_vehicleArmed && _vehicleWasFlying && _missionAvailable && _resumeMissionIndex > 0 && (_resumeMissionIndex < _visualItemsCount - 2)
151
152 property bool guidedUIVisible: confirmDialog.visible
153
154 property var _corePlugin: QGroundControl.corePlugin
155 property var _corePluginOptions: QGroundControl.corePlugin.options
156 property bool _guidedActionsEnabled: (!ScreenTools.isDebug && _corePluginOptions.guidedActionsRequireRCRSSI && _activeVehicle) ? _rcRSSIAvailable : _activeVehicle
157 property string _flightMode: _activeVehicle ? _activeVehicle.flightMode : ""
158 property bool _missionAvailable: missionController.containsItems
159 property bool _missionActive: _activeVehicle ? _vehicleArmed && (_vehicleInLandMode || _vehicleInRTLMode || _vehicleInMissionMode) : false
160 property bool _vehicleArmed: _activeVehicle ? _activeVehicle.armed : false
161 property bool _vehicleFlying: _activeVehicle ? _activeVehicle.flying : false
162 property bool _vehicleLanding: _activeVehicle ? _activeVehicle.landing : false
163 property bool _vehiclePaused: false
164 property bool _vehicleInMissionMode: false
165 property bool _vehicleInRTLMode: false
166 property bool _vehicleInLandMode: false
167 property int _visualItemsCount: missionController.visualItems ? missionController.visualItems.count : 0
168 property int _currentMissionIndex: missionController.currentMissionIndex
169 property int _resumeMissionIndex: missionController.resumeMissionIndex
170 property bool _hideEmergenyStop: !_corePluginOptions.flyView.guidedBarShowEmergencyStop
171 property bool _hideOrbit: !_corePluginOptions.flyView.guidedBarShowOrbit
172 property bool _hideROI: !_corePluginOptions.flyView.guidedBarShowROI
173 property bool _vehicleWasFlying: false
174 property bool _rcRSSIAvailable: _activeVehicle ? _activeVehicle.rcRSSI.rawValue > 0 && _activeVehicle.rcRSSI.rawValue <= 100 : false
175 property bool _fixedWingOnApproach: _activeVehicle ? _activeVehicle.fixedWing && _vehicleLanding : false
176 property bool _vehicleInFwdFlight: _activeVehicle ? _activeVehicle.inFwdFlight : false
177 property bool _speedLimitsAvailable: _activeVehicle && ((_vehicleInFwdFlight && _activeVehicle.haveFWSpeedLimits) || (!_vehicleInFwdFlight && _activeVehicle.haveMRSpeedLimits))
178
179 // You can turn on log output for GuidedActionsController by turning on GuidedActionsControllerLog category
180 property bool __guidedModeSupported: _activeVehicle ? _activeVehicle.supports.guidedMode : false
181 property bool __pauseVehicleSupported: _activeVehicle ? _activeVehicle.supports.pauseVehicle : false
182 property bool __roiSupported: _activeVehicle ? !_hideROI && _activeVehicle.supports.roiMode : false
183 property bool __orbitSupported: _activeVehicle ? !_hideOrbit && _activeVehicle.supports.orbitMode : false
184 property bool __flightMode: _flightMode
185
186 // Allow custom builds to add custom actions by overriding CustomGuidedActionsController.qml
187 CustomGuidedActionsController {
188 id: customController
189 }
190 property var _customController: customController
191
192 function _isGuidedActionsControllerLogEnabled() {
193 return QGCLoggingCategoryManager.isCategoryEnabled("GuidedActionsControllerLog")
194 }
195
196 function _outputState() {
197 if (_isGuidedActionsControllerLogEnabled()) {
198 console.log(qsTr("_activeVehicle(%1) _vehicleArmed(%2) guidedModeSupported(%3) _vehicleFlying(%4) _vehicleWasFlying(%5) _vehicleInRTLMode(%6) pauseVehicleSupported(%7) _vehiclePaused(%8) _flightMode(%9) _visualItemsCount(%10) roiSupported(%11) orbitSupported(%12) _missionActive(%13) _hideROI(%14) _hideOrbit(%15)").arg(_activeVehicle ? 1 : 0).arg(_vehicleArmed ? 1 : 0).arg(__guidedModeSupported ? 1 : 0).arg(_vehicleFlying ? 1 : 0).arg(_vehicleWasFlying ? 1 : 0).arg(_vehicleInRTLMode ? 1 : 0).arg(__pauseVehicleSupported ? 1 : 0).arg(_vehiclePaused ? 1 : 0).arg(_flightMode).arg(_visualItemsCount).arg(__roiSupported).arg(__orbitSupported).arg(_missionActive).arg(_hideROI).arg(_hideOrbit))
199 }
200 }
201
202 function setupSlider(actionCode) {
203 if (actionCode === actionTakeoff) {
204 guidedValueSlider.setupSlider(
205 GuidedValueSlider.SliderType.Takeoff,
206 _unitsConversion.metersToAppSettingsVerticalDistanceUnits(_activeVehicle.minimumTakeoffAltitudeMeters()),
207 _flyViewSettings.guidedMaximumAltitude.value,
208 _unitsConversion.metersToAppSettingsVerticalDistanceUnits(_activeVehicle.minimumTakeoffAltitudeMeters()),
209 qsTr("Height (rel)"))
210 } else if (actionCode === actionChangeSpeed) {
211 if (_vehicleInFwdFlight) {
212 guidedValueSlider.setupSlider(
213 GuidedValueSlider.SliderType.Speed,
214 _unitsConversion.metersSecondToAppSettingsSpeedUnits(_activeVehicle.minimumEquivalentAirspeed()).toFixed(1),
215 _unitsConversion.metersSecondToAppSettingsSpeedUnits(_activeVehicle.maximumEquivalentAirspeed()).toFixed(1),
216 _unitsConversion.metersSecondToAppSettingsSpeedUnits(_activeVehicle.airSpeed.rawValue),
217 qsTr("Airspeed"))
218 } else if (!_vehicleInFwdFlight && _activeVehicle.haveMRSpeedLimits) {
219 guidedValueSlider.setupSlider(
220 GuidedValueSlider.SliderType.Speed,
221 _unitsConversion.metersSecondToAppSettingsSpeedUnits(0.1).toFixed(1),
222 _unitsConversion.metersSecondToAppSettingsSpeedUnits(_activeVehicle.maximumHorizontalSpeedMultirotorMetersSecond()).toFixed(1),
223 _unitsConversion.metersSecondToAppSettingsSpeedUnits(_activeVehicle.maximumHorizontalSpeedMultirotorMetersSecond()/2).toFixed(1),
224 qsTr("Speed"))
225 } else {
226 console.error("setupSlider called for inapproproate change speed action", _vehicleInFwdFlight, _activeVehicle.haveMRSpeedLimits)
227 }
228 } else if (actionCode === actionChangeAlt || actionCode === actionOrbit || actionCode === actionGoto || actionCode === actionPause) {
229 guidedValueSlider.setupSlider(
230 GuidedValueSlider.SliderType.Altitude,
231 _flyViewSettings.guidedMinimumAltitude.value,
232 _flyViewSettings.guidedMaximumAltitude.value,
233 _activeVehicle.altitudeRelative.value,
234 qsTr("Alt (rel)"))
235 }
236 }
237
238 on_ActiveVehicleChanged: _outputState()
239
240 Component.onCompleted: _outputState()
241 on_VehicleArmedChanged: _outputState()
242 on_VehicleInRTLModeChanged: _outputState()
243 on_VehiclePausedChanged: _outputState()
244 on__FlightModeChanged: _outputState()
245 on__GuidedModeSupportedChanged: _outputState()
246 on__PauseVehicleSupportedChanged: _outputState()
247 on__RoiSupportedChanged: _outputState()
248 on__OrbitSupportedChanged: _outputState()
249 on_VisualItemsCountChanged: _outputState()
250 on_MissionActiveChanged: _outputState()
251
252 on_CurrentMissionIndexChanged: {
253 if (_isGuidedActionsControllerLogEnabled()) {
254 console.log("_currentMissionIndex", _currentMissionIndex)
255 }
256 }
257 on_ResumeMissionIndexChanged: {
258 if (_isGuidedActionsControllerLogEnabled()) {
259 console.log("_resumeMissionIndex", _resumeMissionIndex)
260 }
261 }
262 onShowResumeMissionChanged: {
263 if (_isGuidedActionsControllerLogEnabled()) {
264 console.log("showResumeMission", showResumeMission)
265 }
266 _outputState()
267 }
268 onShowStartMissionChanged: {
269 if (_isGuidedActionsControllerLogEnabled()) {
270 console.log("showStartMission", showStartMission)
271 }
272 _outputState()
273 if (showStartMission &&
274 _flyViewSettings.enableAutomaticMissionPopups.rawValue) {
275 confirmAction(actionStartMission)
276 }
277 }
278 onShowContinueMissionChanged: {
279 if (_isGuidedActionsControllerLogEnabled()) {
280 console.log("showContinueMission", showContinueMission)
281 }
282 _outputState()
283 if (showContinueMission &&
284 _flyViewSettings.enableAutomaticMissionPopups.rawValue) {
285 confirmAction(actionContinueMission)
286 }
287 }
288 onShowRTLChanged: {
289 if (_isGuidedActionsControllerLogEnabled()) {
290 console.log("showRTL", showRTL)
291 }
292 _outputState()
293 }
294 onShowChangeAltChanged: {
295 if (_isGuidedActionsControllerLogEnabled()) {
296 console.log("showChangeAlt", showChangeAlt)
297 }
298 _outputState()
299 }
300 onShowROIChanged: {
301 if (_isGuidedActionsControllerLogEnabled()) {
302 console.log("showROI", showROI)
303 }
304 _outputState()
305 }
306 onShowOrbitChanged: {
307 if (_isGuidedActionsControllerLogEnabled()) {
308 console.log("showOrbit", showOrbit)
309 }
310 _outputState()
311 }
312 onShowGotoLocationChanged: {
313 if (_isGuidedActionsControllerLogEnabled()) {
314 console.log("showGotoLocation", showGotoLocation)
315 }
316 _outputState()
317 }
318 onShowLandAbortChanged: {
319 if (showLandAbort) {
320 confirmAction(actionLandAbort)
321 }
322 }
323
324 on_VehicleFlyingChanged: {
325 _outputState()
326 if (!_vehicleFlying) {
327 // We use _vehicleWasFLying to help trigger Resume Mission only if the vehicle actually flew and came back down.
328 // Otherwise it may trigger during the Start Mission sequence due to signal ordering or armed and resume mission index.
329 _vehicleWasFlying = true
330 }
331 }
332
333 property var _actionData
334
335 on_FlightModeChanged: {
336 _vehiclePaused = _activeVehicle ? _flightMode === _activeVehicle.pauseFlightMode : false
337 _vehicleInRTLMode = _activeVehicle ? _flightMode === _activeVehicle.rtlFlightMode || _flightMode === _activeVehicle.smartRTLFlightMode : false
338 _vehicleInLandMode = _activeVehicle ? _flightMode === _activeVehicle.landFlightMode : false
339 _vehicleInMissionMode = _activeVehicle ? _flightMode === _activeVehicle.missionFlightMode : false // Must be last to get correct signalling for showStartMission popups
340 }
341
342 Connections {
343 target: missionController
344 function onResumeMissionUploadFail() { confirmAction(actionResumeMissionUploadFail) }
345 }
346
347 Connections {
348 target: mainWindow
349 function onArmVehicleRequest() { armVehicleRequest() }
350 function onForceArmVehicleRequest() { forceArmVehicleRequest() }
351 function onDisarmVehicleRequest() { disarmVehicleRequest() }
352 }
353
354 function armVehicleRequest() {
355 confirmAction(actionArm)
356 }
357
358 function forceArmVehicleRequest() {
359 confirmAction(actionForceArm)
360 }
361
362 function disarmVehicleRequest() {
363 if (showEmergenyStop) {
364 confirmAction(actionEmergencyStop)
365 } else {
366 confirmAction(actionDisarm)
367 }
368
369 }
370
371 function closeAll() {
372 confirmDialog.visible = false
373 guidedValueSlider.visible = false
374 }
375
376 // Called when an action is about to be executed in order to confirm
377 function confirmAction(actionCode, actionData, mapIndicator) {
378 var showImmediate = true
379
380 // Cancel any previously pending action, notifying its map indicator if it differs from the incoming one
381 confirmDialog.confirmCancelled(mapIndicator)
382
383 confirmDialog.action = actionCode
384 confirmDialog.actionData = actionData
385 confirmDialog.mapIndicator = mapIndicator
386 confirmDialog.optionText = ""
387 _actionData = actionData
388
389 setupSlider(actionCode)
390
391 switch (actionCode) {
392 case actionArm:
393 if (_vehicleFlying || !_guidedActionsEnabled) {
394 return
395 }
396 confirmDialog.title = armTitle
397 confirmDialog.message = armMessage
398 confirmDialog.hideTrigger = Qt.binding(function() { return !showArm })
399 break;
400 case actionMVArm:
401 confirmDialog.title = mvArmTitle
402 confirmDialog.message = mvArmMessage
403 break;
404 case actionForceArm:
405 confirmDialog.title = forceArmTitle
406 confirmDialog.message = forceArmMessage
407 confirmDialog.hideTrigger = Qt.binding(function() { return !showForceArm })
408 break;
409 case actionDisarm:
410 if (_vehicleFlying) {
411 return
412 }
413 confirmDialog.title = disarmTitle
414 confirmDialog.message = disarmMessage
415 confirmDialog.hideTrigger = Qt.binding(function() { return !showDisarm })
416 break;
417 case actionMVDisarm:
418 confirmDialog.title = mvDisarmTitle
419 confirmDialog.message = mvDisarmMessage
420 break;
421 case actionEmergencyStop:
422 confirmDialog.title = emergencyStopTitle
423 confirmDialog.message = emergencyStopMessage
424 confirmDialog.hideTrigger = Qt.binding(function() { return !showEmergenyStop })
425 break;
426 case actionTakeoff:
427 confirmDialog.title = takeoffTitle
428 confirmDialog.message = takeoffMessage
429 confirmDialog.hideTrigger = Qt.binding(function() { return !showTakeoff })
430 guidedValueSlider.visible = _activeVehicle.supports.guidedTakeoffWithAltitude
431 break;
432 case actionStartMission:
433 showImmediate = false
434 confirmDialog.title = startMissionTitle
435 confirmDialog.message = startMissionMessage
436 confirmDialog.hideTrigger = Qt.binding(function() { return !showStartMission })
437 break;
438 case actionMVStartMission:
439 confirmDialog.title = mvStartMissionTitle
440 confirmDialog.message = mvStartMissionMessage
441 break;
442 case actionContinueMission:
443 showImmediate = false
444 confirmDialog.title = continueMissionTitle
445 confirmDialog.message = continueMissionMessage
446 confirmDialog.hideTrigger = Qt.binding(function() { return !showContinueMission })
447 break;
448 case actionResumeMission:
449 // Resume Mission is handled in mission end dialog
450 return
451 case actionResumeMissionUploadFail:
452 confirmDialog.title = resumeMissionUploadFailTitle
453 confirmDialog.message = resumeMissionUploadFailMessage
454 confirmDialog.hideTrigger = Qt.binding(function() { return !showResumeMission })
455 break;
456 case actionLand:
457 confirmDialog.title = landTitle
458 confirmDialog.message = landMessage
459 confirmDialog.hideTrigger = Qt.binding(function() { return !showLand })
460 break;
461 case actionRTL:
462 confirmDialog.title = rtlTitle
463 confirmDialog.message = rtlMessage
464 if (_activeVehicle.supports.smartRTL) {
465 confirmDialog.optionText = qsTr("Smart RTL")
466 confirmDialog.optionChecked = false
467 }
468 confirmDialog.hideTrigger = Qt.binding(function() { return !showRTL })
469 break;
470 case actionChangeAlt:
471 confirmDialog.title = changeAltTitle
472 confirmDialog.message = changeAltMessage
473 confirmDialog.hideTrigger = Qt.binding(function() { return !showChangeAlt })
474 guidedValueSlider.visible = true
475 break;
476 case actionChangeLoiterRadius:
477 confirmDialog.title = changeLoiterRadiusTitle
478 confirmDialog.message = changeLoiterRadiusMessage
479 confirmDialog.hideTrigger = Qt.binding(function() { return !showChangeLoiterRadius })
480 confirmDialog.mapIndicator = fwdFlightGotoMapCircle
481 fwdFlightGotoMapCircle.startLoiterRadiusEdit()
482 break
483 case actionGoto:
484 confirmDialog.title = gotoTitle
485 confirmDialog.message = gotoMessage
486 confirmDialog.hideTrigger = Qt.binding(function() { return !showGotoLocation })
487 break;
488 case actionSetWaypoint:
489 confirmDialog.title = setWaypointTitle
490 confirmDialog.message = setWaypointMessage
491 break;
492 case actionOrbit:
493 confirmDialog.title = orbitTitle
494 confirmDialog.message = orbitMessage
495 confirmDialog.hideTrigger = Qt.binding(function() { return !showOrbit })
496 guidedValueSlider.visible = true
497 break;
498 case actionLandAbort:
499 confirmDialog.title = landAbortTitle
500 confirmDialog.message = landAbortMessage
501 confirmDialog.hideTrigger = Qt.binding(function() { return !showLandAbort })
502 break;
503 case actionPause:
504 confirmDialog.title = pauseTitle
505 confirmDialog.message = pauseMessage
506 confirmDialog.hideTrigger = Qt.binding(function() { return !showPause })
507 guidedValueSlider.visible = true
508 break;
509 case actionMVPause:
510 confirmDialog.title = mvPauseTitle
511 confirmDialog.message = mvPauseMessage
512 break;
513 case actionROI:
514 confirmDialog.title = roiTitle
515 confirmDialog.message = roiMessage
516 confirmDialog.hideTrigger = Qt.binding(function() { return !showROI })
517 break;
518 case actionChangeSpeed:
519 confirmDialog.title = changeSpeedTitle
520 confirmDialog.message = changeSpeedMessage
521 guidedValueSlider.visible = true
522 break
523 case actionSetHome:
524 confirmDialog.title = setHomeTitle
525 confirmDialog.message = setHomeMessage
526 confirmDialog.hideTrigger = Qt.binding(function() { return !showSetHome })
527 break
528 case actionSetEstimatorOrigin:
529 confirmDialog.title = setEstimatorOriginTitle
530 confirmDialog.message = setEstimatorOriginMessage
531 break
532 case actionSetFlightMode:
533 confirmDialog.title = setFlightMode
534 confirmDialog.message = setFlightModeMessage
535 break
536 case actionChangeHeading:
537 confirmDialog.title = changeHeadingTitle
538 confirmDialog.message = changeHeadingMessage
539 break
540 default:
541 if (!customController.customConfirmAction(actionCode, actionData, mapIndicator, confirmDialog)) {
542 console.warn("Unknown actionCode", actionCode)
543 return
544 }
545 }
546 confirmDialog.show(showImmediate)
547 }
548
549 // Executes the specified action
550 // Returns false if the action failed and any associated map indicator should be restored
551 function executeAction(actionCode, actionData, sliderOutputValue, optionChecked) {
552 var i;
553 var selectedVehicles;
554 switch (actionCode) {
555 case actionRTL:
556 _activeVehicle.guidedModeRTL(optionChecked)
557 break
558 case actionLand:
559 _activeVehicle.guidedModeLand()
560 break
561 case actionTakeoff:
562 if (_activeVehicle.supports.guidedTakeoffWithAltitude) {
563 var valueInMeters = _unitsConversion.appSettingsVerticalDistanceUnitsToMeters(sliderOutputValue)
564 _activeVehicle.guidedModeTakeoff(valueInMeters)
565 } else {
566 _activeVehicle.startTakeoff()
567 }
568 break
569 case actionResumeMission:
570 case actionResumeMissionUploadFail:
571 missionController.resumeMission(missionController.resumeMissionIndex)
572 break
573 case actionStartMission:
574 case actionContinueMission:
575 _activeVehicle.startMission()
576 break
577 case actionMVStartMission:
578 selectedVehicles = QGroundControl.multiVehicleManager.selectedVehicles
579 for (i = 0; i < selectedVehicles.count; i++) {
580 var vehicle = selectedVehicles.get(i)
581 if (vehicle.armed === true){
582 vehicle.startMission()
583 }
584 }
585 break
586 case actionArm:
587 _activeVehicle.armed = true
588 break
589 case actionMVArm:
590 selectedVehicles = QGroundControl.multiVehicleManager.selectedVehicles
591 for (i = 0; i < selectedVehicles.count; i++) {
592 selectedVehicles.get(i).armed = true
593 }
594 break
595 case actionForceArm:
596 _activeVehicle.forceArm()
597 break
598 case actionDisarm:
599 _activeVehicle.armed = false
600 break
601 case actionMVDisarm:
602 selectedVehicles = QGroundControl.multiVehicleManager.selectedVehicles
603 for (i = 0; i < selectedVehicles.count; i++) {
604 selectedVehicles.get(i).armed = false
605 }
606 break
607 case actionEmergencyStop:
608 _activeVehicle.emergencyStop()
609 break
610 case actionChangeAlt:
611 var valueInMeters = _unitsConversion.appSettingsVerticalDistanceUnitsToMeters(sliderOutputValue)
612 var altitudeChangeInMeters = valueInMeters - _activeVehicle.altitudeRelative.rawValue
613 _activeVehicle.guidedModeChangeAltitude(altitudeChangeInMeters, false /* pauseVehicle */)
614 break
615 case actionChangeLoiterRadius:
616 if (!_activeVehicle.guidedModeGotoLocation(
617 fwdFlightGotoMapCircle.coordinate,
618 (fwdFlightGotoMapCircle.clockwiseRotation ? 1 : -1) *
619 Math.abs(fwdFlightGotoMapCircle.radius.rawValue)
620 )) {
621 return false
622 }
623 break
624 case actionGoto:
625 if (!_activeVehicle.guidedModeGotoLocation(
626 actionData,
627 _vehicleInFwdFlight /* forwardFlightLoiterRadius */
628 ? _flyViewSettings.forwardFlightGoToLocationLoiterRad.value
629 : 0
630 )) {
631 return false
632 }
633 break
634 case actionSetWaypoint:
635 _activeVehicle.setCurrentMissionSequence(actionData)
636 break
637 case actionOrbit:
638 var valueInMeters = _unitsConversion.appSettingsVerticalDistanceUnitsToMeters(sliderOutputValue)
639 _activeVehicle.guidedModeOrbit(orbitMapCircle.center, orbitMapCircle.radius() * (orbitMapCircle.clockwiseRotation ? 1 : -1), _activeVehicle.homePosition.altitude + valueInMeters)
640 break
641 case actionLandAbort:
642 _activeVehicle.abortLanding(50) // hardcoded value for climbOutAltitude that is currently ignored
643 break
644 case actionPause:
645 var valueInMeters = _unitsConversion.appSettingsVerticalDistanceUnitsToMeters(sliderOutputValue)
646 var altitudeChangeInMeters = valueInMeters - _activeVehicle.altitudeRelative.rawValue
647 _activeVehicle.guidedModeChangeAltitude(altitudeChangeInMeters, true /* pauseVehicle */)
648 break
649 case actionMVPause:
650 selectedVehicles = QGroundControl.multiVehicleManager.selectedVehicles
651 for (i = 0; i < selectedVehicles.count; i++) {
652 selectedVehicles.get(i).pauseVehicle()
653 }
654 break
655 case actionROI:
656 _activeVehicle.guidedModeROI(actionData)
657 break
658 case actionChangeSpeed:
659 if (_activeVehicle) {
660 // We need to convert back to m/s as that is what mavlink standard uses for MAV_CMD_DO_CHANGE_SPEED
661 var metersSecondSpeed = _unitsConversion.appSettingsSpeedUnitsToMetersSecond(sliderOutputValue)
662 if (_vehicleInFwdFlight) {
663 _activeVehicle.guidedModeChangeEquivalentAirspeedMetersSecond(metersSecondSpeed)
664 } else {
665 _activeVehicle.guidedModeChangeGroundSpeedMetersSecond(metersSecondSpeed)
666 }
667 }
668 break
669 case actionSetHome:
670 _activeVehicle.doSetHome(actionData)
671 break
672 case actionSetEstimatorOrigin:
673 _activeVehicle.setEstimatorOrigin(actionData)
674 break
675 case actionSetFlightMode:
676 _activeVehicle.flightMode = actionData
677 break
678 case actionChangeHeading:
679 _activeVehicle.guidedModeChangeHeading(actionData)
680 break
681 default:
682 if (!customController.customExecuteAction(actionCode, actionData, sliderOutputValue, optionChecked)) {
683 console.warn(qsTr("Internal error: unknown actionCode"), actionCode)
684 return false
685 }
686 break
687 }
688 return true
689 }
690}