From ef29f8c16e3d3f8cd7350184918a5a0875f8e33a Mon Sep 17 00:00:00 2001 From: DoinLakeFlyer Date: Sat, 7 Mar 2020 12:03:30 -0800 Subject: [PATCH] Plan: Add support for takeoff item required --- ChangeLog.md | 6 ++++++ src/MissionManager/MissionController.cc | 16 ++++++++++++++++ src/MissionManager/MissionController.h | 10 ++++++++-- src/PlanView/PlanView.qml | 2 +- src/Settings/PlanView.SettingsGroup.json | 6 ++++++ src/Settings/PlanViewSettings.cc | 1 + src/Settings/PlanViewSettings.h | 1 + src/ui/preferences/GeneralSettings.qml | 9 ++++++++- 8 files changed, 47 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 79ab04bc9..e94575311 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,12 @@ Note: This file only contains high level features or important fixes. ### 4.0.3 - Not yet released + +### 4.0.3 - Not yet released + +* Plan: Add setting for takeoff item not required +* Plan: Takeoff item must be added prior to allowing other item types to enable + ### 4.0.2 - Stable * Fix Mavlink V2 protocol negotation based on capability bits diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 0feb86528..57e142f9b 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -31,6 +31,7 @@ #include "KML.h" #include "QGCCorePlugin.h" #include "TakeoffMissionItem.h" +#include "PlanViewSettings.h" #define UPDATE_TIMEOUT 5000 ///< How often we check for bounding box changes @@ -59,6 +60,7 @@ const QString MissionController::patternCorridorScanName (QT_TRANSLATE_NOOP(" MissionController::MissionController(PlanMasterController* masterController, QObject *parent) : PlanElementController (masterController, parent) + , _planViewSettings (qgcApp()->toolbox()->settingsManager()->planViewSettings()) , _missionManager (_managerVehicle->missionManager()) , _missionItemCount (0) , _visualItems (nullptr) @@ -77,6 +79,8 @@ MissionController::MissionController(PlanMasterController* masterController, QOb managerVehicleChanged(_managerVehicle); _updateTimer.setSingleShot(true); connect(&_updateTimer, &QTimer::timeout, this, &MissionController::_updateTimeout); + + connect(_planViewSettings->takeoffItemNotRequired(), &Fact::rawValueChanged, this, &MissionController::_takeoffItemNotRequiredChanged); } MissionController::~MissionController() @@ -2301,6 +2305,7 @@ void MissionController::setCurrentPlanViewSeqNum(int sequenceNumber, bool force) _currentPlanViewItem = nullptr; _currentPlanViewSeqNum = -1; _currentPlanViewVIIndex = -1; + _onlyInsertTakeoffValid = !_planViewSettings->takeoffItemNotRequired()->rawValue().toBool() && _visualItems->count() == 1; // First item must be takeoff _isInsertTakeoffValid = true; _isInsertLandValid = true; _isROIActive = false; @@ -2430,10 +2435,15 @@ void MissionController::setCurrentPlanViewSeqNum(int sequenceNumber, bool force) } } + // These are not valid when only takeoff is allowed + _isInsertLandValid = _isInsertLandValid && !_onlyInsertTakeoffValid; + _flyThroughCommandsAllowed = _flyThroughCommandsAllowed && !_onlyInsertTakeoffValid; + emit currentPlanViewSeqNumChanged(); emit currentPlanViewVIIndexChanged(); emit currentPlanViewItemChanged(); emit splitSegmentChanged(); + emit onlyInsertTakeoffValidChanged(); emit isInsertTakeoffValidChanged(); emit isInsertLandValidChanged(); emit isROIActiveChanged(); @@ -2531,3 +2541,9 @@ bool MissionController::isEmpty(void) const { return _visualItems->count() <= 1; } + +void MissionController::_takeoffItemNotRequiredChanged(void) +{ + // Force a recalc of allowed bits + setCurrentPlanViewSeqNum(_currentPlanViewSeqNum, true /* force */); +} diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h index d72f52895..5ab892656 100644 --- a/src/MissionManager/MissionController.h +++ b/src/MissionManager/MissionController.h @@ -28,6 +28,7 @@ class SimpleMissionItem; class ComplexMissionItem; class MissionSettingsItem; class QDomDocument; +class PlanViewSettings; Q_DECLARE_LOGGING_CATEGORY(MissionControllerLog) @@ -95,6 +96,7 @@ public: Q_PROPERTY(QString surveyComplexItemName READ surveyComplexItemName CONSTANT) Q_PROPERTY(QString corridorScanComplexItemName READ corridorScanComplexItemName CONSTANT) Q_PROPERTY(QString structureScanComplexItemName READ structureScanComplexItemName CONSTANT) + Q_PROPERTY(bool onlyInsertTakeoffValid MEMBER _onlyInsertTakeoffValid NOTIFY onlyInsertTakeoffValidChanged) Q_PROPERTY(bool isInsertTakeoffValid MEMBER _isInsertTakeoffValid NOTIFY isInsertTakeoffValidChanged) Q_PROPERTY(bool isInsertLandValid MEMBER _isInsertLandValid NOTIFY isInsertLandValidChanged) Q_PROPERTY(bool isROIActive MEMBER _isROIActive NOTIFY isROIActiveChanged) @@ -264,6 +266,7 @@ signals: void currentPlanViewItemChanged (void); void missionBoundingCubeChanged (void); void missionItemCountChanged (int missionItemCount); + void onlyInsertTakeoffValidChanged (void); void isInsertTakeoffValidChanged (void); void isInsertLandValidChanged (void); void isROIActiveChanged (void); @@ -286,6 +289,7 @@ private slots: void _updateTimeout (void); void _complexBoundingBoxChanged (void); void _recalcAll (void); + void _takeoffItemNotRequiredChanged (void); private: void _init(void); @@ -329,6 +333,7 @@ private: CoordinateVector* _createCoordinateVectorWorker(VisualItemPair& pair); private: + PlanViewSettings* _planViewSettings = nullptr; MissionManager* _missionManager; int _missionItemCount; QmlObjectListModel* _visualItems; @@ -352,10 +357,11 @@ private: QGeoCoordinate _takeoffCoordinate; QGeoCoordinate _previousCoordinate; CoordinateVector* _splitSegment; + bool _onlyInsertTakeoffValid = true; bool _isInsertTakeoffValid = true; - bool _isInsertLandValid = true; + bool _isInsertLandValid = false; bool _isROIActive = false; - bool _flyThroughCommandsAllowed = true; + bool _flyThroughCommandsAllowed = false; bool _isROIBeginCurrentItem = false; static const char* _settingsGroup; diff --git a/src/PlanView/PlanView.qml b/src/PlanView/PlanView.qml index 0d9e5eda5..399cea59e 100644 --- a/src/PlanView/PlanView.qml +++ b/src/PlanView/PlanView.qml @@ -617,7 +617,7 @@ Item { { name: _missionController.isROIActive ? qsTr("Cancel ROI") : qsTr("ROI"), iconSource: "/qmlimages/MapAddMission.svg", - buttonEnabled: true, + buttonEnabled: !_missionController.onlyInsertTakeoffValid, buttonVisible: _isMissionLayer && _planMasterController.controllerVehicle.roiModeSupported, toggle: !_missionController.isROIActive }, diff --git a/src/Settings/PlanView.SettingsGroup.json b/src/Settings/PlanView.SettingsGroup.json index eb1921d9d..53a1cf31f 100644 --- a/src/Settings/PlanView.SettingsGroup.json +++ b/src/Settings/PlanView.SettingsGroup.json @@ -16,5 +16,11 @@ "shortDescription": "Show/Hide the mission item status display", "type": "bool", "defaultValue": false +}, +{ + "name": "takeoffItemNotRequired", + "shortDescription": "Allow missions to not require a takeoff item", + "type": "bool", + "defaultValue": false } ] diff --git a/src/Settings/PlanViewSettings.cc b/src/Settings/PlanViewSettings.cc index 8f82dc044..794317828 100644 --- a/src/Settings/PlanViewSettings.cc +++ b/src/Settings/PlanViewSettings.cc @@ -20,3 +20,4 @@ DECLARE_SETTINGGROUP(PlanView, "PlanView") DECLARE_SETTINGSFACT(PlanViewSettings, displayPresetsTabFirst) DECLARE_SETTINGSFACT(PlanViewSettings, aboveTerrainWarning) DECLARE_SETTINGSFACT(PlanViewSettings, showMissionItemStatus) +DECLARE_SETTINGSFACT(PlanViewSettings, takeoffItemNotRequired) diff --git a/src/Settings/PlanViewSettings.h b/src/Settings/PlanViewSettings.h index 2fbc3bdc0..83d4c34c3 100644 --- a/src/Settings/PlanViewSettings.h +++ b/src/Settings/PlanViewSettings.h @@ -23,4 +23,5 @@ public: DEFINE_SETTINGFACT(displayPresetsTabFirst) DEFINE_SETTINGFACT(aboveTerrainWarning) DEFINE_SETTINGFACT(showMissionItemStatus) + DEFINE_SETTINGFACT(takeoffItemNotRequired) }; diff --git a/src/ui/preferences/GeneralSettings.qml b/src/ui/preferences/GeneralSettings.qml index 3897dc61a..c6e54ed92 100644 --- a/src/ui/preferences/GeneralSettings.qml +++ b/src/ui/preferences/GeneralSettings.qml @@ -43,6 +43,7 @@ Rectangle { property Fact _followTarget: QGroundControl.settingsManager.appSettings.followTarget property real _panelWidth: _root.width * _internalWidthRatio property real _margins: ScreenTools.defaultFontPixelWidth + property var _planViewSettings: QGroundControl.settingsManager.planViewSettings property string _videoSource: QGroundControl.settingsManager.videoSettings.videoSource.value property bool _isGst: QGroundControl.videoManager.isGStreamer @@ -595,7 +596,7 @@ Rectangle { QGCLabel { id: planViewSectionLabel text: qsTr("Plan View") - visible: QGroundControl.settingsManager.planViewSettings.visible + visible: _planViewSettings.visible } Rectangle { Layout.preferredHeight: planViewCol.height + (_margins * 2) @@ -621,6 +622,12 @@ Rectangle { fact: QGroundControl.settingsManager.appSettings.defaultMissionItemAltitude } } + + FactCheckBox { + text: qsTr("Missions Do Not Require Takeoff Item") + fact: _planViewSettings.takeoffItemNotRequired + visible: _planViewSettings.takeoffItemNotRequired.visible + } } } -- 2.22.0