diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index a9593fff355e7af0e38764629c792f9ce9e49551..dceb50182986c737bdcf887d3737d72757f4cb56 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -66,7 +66,6 @@ src/QmlControls/MissionItemIndexLabel.qml src/PlanView/MissionItemMapVisual.qml src/PlanView/MissionItemStatus.qml - src/PlanView/MissionSettingsMapVisual.qml src/QmlControls/ModeSwitchDisplay.qml src/QmlControls/MultiRotorMotorDisplay.qml src/QmlControls/OfflineMapButton.qml diff --git a/src/FirmwarePlugin/APM/MavCmdInfoCommon.json b/src/FirmwarePlugin/APM/MavCmdInfoCommon.json index e1fad86cac41327da0272204f35707f7d4153cea..a022d3de848c535fd280e4874a78ef8eb176f7bd 100644 --- a/src/FirmwarePlugin/APM/MavCmdInfoCommon.json +++ b/src/FirmwarePlugin/APM/MavCmdInfoCommon.json @@ -9,6 +9,12 @@ "comment": "MAV_CMD_NAV_WAYPOINT", "paramRemove": "2" }, + { + "id": 22, + "comment": "MAV_CMD_NAV_TAKEOFF", + "specifiesCoordinate": false, + "specifiesAltitudeOnly": true + }, { "id": 84, "comment": "MAV_CMD_NAV_VTOL_TAKEOFF", diff --git a/src/FirmwarePlugin/APM/MavCmdInfoFixedWing.json b/src/FirmwarePlugin/APM/MavCmdInfoFixedWing.json index 4cfe9f9b6b10815417f55546b3ae9f7e4c038e42..6fa8db824139abf600a73f4e648afb5db7d37621 100644 --- a/src/FirmwarePlugin/APM/MavCmdInfoFixedWing.json +++ b/src/FirmwarePlugin/APM/MavCmdInfoFixedWing.json @@ -14,12 +14,6 @@ "comment": "MAV_CMD_NAV_LAND", "paramRemove": "4" }, - { - "id": 22, - "comment": "MAV_CMD_NAV_TAKEOFF", - "specifiesCoordinate": false, - "specifiesAltitudeOnly": true - }, { "id": 82, "comment": "MAV_CMD_NAV_SPLINE_WAYPOINT", diff --git a/src/FirmwarePlugin/APM/MavCmdInfoMultiRotor.json b/src/FirmwarePlugin/APM/MavCmdInfoMultiRotor.json index 294ffa7ef73acba949ae9b5193407701affba995..4d47dac8da010320abc4834b38ddd16a6a59fb11 100644 --- a/src/FirmwarePlugin/APM/MavCmdInfoMultiRotor.json +++ b/src/FirmwarePlugin/APM/MavCmdInfoMultiRotor.json @@ -30,11 +30,9 @@ "paramRemove": "1,4" }, { - "id": 22, - "comment": "MAV_CMD_NAV_TAKEOFF", - "specifiesCoordinate": false, - "specifiesAltitudeOnly": true, - "paramRemove": "1,2,3,4" + "id": 22, + "comment": "MAV_CMD_NAV_TAKEOFF", + "paramRemove": "1,2,3,4" }, { "id": 31, diff --git a/src/FirmwarePlugin/PX4/MavCmdInfoCommon.json b/src/FirmwarePlugin/PX4/MavCmdInfoCommon.json index 258b5ff3b278c0bfada860b63c0f355cb037fabd..68131978a5d8caafeed6994aad0cf8fbf8033963 100644 --- a/src/FirmwarePlugin/PX4/MavCmdInfoCommon.json +++ b/src/FirmwarePlugin/PX4/MavCmdInfoCommon.json @@ -10,9 +10,9 @@ "paramRemove": "2,3,4" }, { - "id": 21, - "comment": "MAV_CMD_NAV_LAND", - "paramRemove": "1" + "id": 21, + "comment": "MAV_CMD_NAV_LAND", + "paramRemove": "1" } ] } diff --git a/src/FirmwarePlugin/PX4/MavCmdInfoMultiRotor.json b/src/FirmwarePlugin/PX4/MavCmdInfoMultiRotor.json index 32a3994459574cf585f1e387bc7fdf60c36d1f74..a4dc8d0b68df15371e716a78b2cf8b5a07fac18b 100644 --- a/src/FirmwarePlugin/PX4/MavCmdInfoMultiRotor.json +++ b/src/FirmwarePlugin/PX4/MavCmdInfoMultiRotor.json @@ -21,6 +21,11 @@ "comment": "MAV_CMD_NAV_LOITER_TIME", "description": "Travel to a position and Loiter for an amount of time.", "paramRemove": "3,4" + }, + { + "id": 22, + "comment": "MAV_CMD_NAV_TAKEOFF", + "paramRemove": "1" } ] } diff --git a/src/MissionManager/FixedWingLandingComplexItem.cc b/src/MissionManager/FixedWingLandingComplexItem.cc index 99d7aac477d168c0646f84dcbe5807fd14cfc345..b5dcf4a84dcb445ddbfb279aaa7ec7aca62e3fad 100644 --- a/src/MissionManager/FixedWingLandingComplexItem.cc +++ b/src/MissionManager/FixedWingLandingComplexItem.cc @@ -521,3 +521,7 @@ void FixedWingLandingComplexItem::_setDirty(void) setDirty(true); } +void FixedWingLandingComplexItem::applyNewAltitude(double newAltitude) +{ + _loiterAltitudeFact.setRawValue(newAltitude); +} diff --git a/src/MissionManager/FixedWingLandingComplexItem.h b/src/MissionManager/FixedWingLandingComplexItem.h index ac20e2c42cb3103ebc13a5f98442a35e7e1192f2..4fabf994b7483b36e422490ac04cf8d5d7cfb361 100644 --- a/src/MissionManager/FixedWingLandingComplexItem.h +++ b/src/MissionManager/FixedWingLandingComplexItem.h @@ -76,6 +76,7 @@ public: double specifiedFlightSpeed (void) final { return std::numeric_limits::quiet_NaN(); } double specifiedGimbalYaw (void) final { return std::numeric_limits::quiet_NaN(); } void appendMissionItems (QList& items, QObject* missionItemParent) final; + void applyNewAltitude (double newAltitude) final; bool coordinateHasRelativeAltitude (void) const final { return true; } bool exitCoordinateHasRelativeAltitude (void) const final { return true; } diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index f8645323f138422b3e5448041a4ee127fcdc2ab3..afa7e9a3b79628e0e865abcc8c1df1de4b38090e 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -1597,3 +1597,13 @@ QGeoCoordinate MissionController::plannedHomePosition(void) const return QGeoCoordinate(); } } + +void MissionController::applyDefaultMissionAltitude(void) +{ + double defaultAltitude = _appSettings->defaultMissionItemAltitude()->rawValue().toDouble(); + + for (int i=1; i<_visualItems->count(); i++) { + VisualMissionItem* item = _visualItems->value(i); + item->applyNewAltitude(defaultAltitude); + } +} diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h index 62c24cca6f6886102e5b98874c07456d0daa7412..f170b7a173412ae8ae2874e3f94741edbfe8bb6c 100644 --- a/src/MissionManager/MissionController.h +++ b/src/MissionManager/MissionController.h @@ -93,6 +93,9 @@ public: Q_INVOKABLE void resumeMission(int resumeIndex); + /// Updates the altitudes of the items in the current mission to the new default altitude + Q_INVOKABLE void applyDefaultMissionAltitude(void); + /// Loads the mission items from the specified file /// @param[in] vehicle Vehicle we are loading items for /// @param[in] filename File to load from diff --git a/src/MissionManager/MissionSettingsItem.cc b/src/MissionManager/MissionSettingsItem.cc index 4fcc9d8513efe25184e4be72db6fc36faae5e2fe..d28adc121c2e8f4f0900ab64a20309e1960cf212 100644 --- a/src/MissionManager/MissionSettingsItem.cc +++ b/src/MissionManager/MissionSettingsItem.cc @@ -146,7 +146,7 @@ double MissionSettingsItem::greatestDistanceTo(const QGeoCoordinate &other) cons bool MissionSettingsItem::specifiesCoordinate(void) const { - return false; + return true; } void MissionSettingsItem::appendMissionItems(QList& items, QObject* missionItemParent) diff --git a/src/MissionManager/MissionSettingsItem.h b/src/MissionManager/MissionSettingsItem.h index d6d200b1b3e789fcbc7ef719f6decf9fba35fceb..b8f99189ce974ff34d01317e2ae6d22ce627df74 100644 --- a/src/MissionManager/MissionSettingsItem.h +++ b/src/MissionManager/MissionSettingsItem.h @@ -62,7 +62,7 @@ public: int lastSequenceNumber (void) const final; bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final; double greatestDistanceTo (const QGeoCoordinate &other) const final; - QString mapVisualQML (void) const final { return QStringLiteral("MissionSettingsMapVisual.qml"); } + QString mapVisualQML (void) const final { return QStringLiteral("SimpleItemMapVisual.qml"); } // Overrides from VisualMissionItem @@ -80,6 +80,7 @@ public: double specifiedFlightSpeed (void) final; double specifiedGimbalYaw (void) final; void appendMissionItems (QList& items, QObject* missionItemParent) final; + void applyNewAltitude (double newAltitude) final { Q_UNUSED(newAltitude); /* no action */ } bool coordinateHasRelativeAltitude (void) const final { return true; } bool exitCoordinateHasRelativeAltitude (void) const final { return true; } diff --git a/src/MissionManager/SimpleMissionItem.cc b/src/MissionManager/SimpleMissionItem.cc index 39e40a3b5bd7c82e4199c5026851b7b4a956cddb..ed63b604677f18231c207ad6aeea72b9601cf210 100644 --- a/src/MissionManager/SimpleMissionItem.cc +++ b/src/MissionManager/SimpleMissionItem.cc @@ -728,3 +728,21 @@ void SimpleMissionItem::appendMissionItems(QList& items, QObject* _cameraSection->appendMissionItems(items, missionItemParent, seqNum); } + +void SimpleMissionItem::applyNewAltitude(double newAltitude) +{ + MAV_CMD command = (MAV_CMD)this->command(); + const MissionCommandUIInfo* uiInfo = _commandTree->getUIInfo(_vehicle, command); + + if (uiInfo->specifiesCoordinate() || uiInfo->specifiesAltitudeOnly()) { + switch ((MAV_CMD)this->command()) { + case MAV_CMD_NAV_LAND: + case MAV_CMD_NAV_VTOL_LAND: + // Leave alone + break; + default: + _missionItem.setParam7(newAltitude); + break; + } + } +} diff --git a/src/MissionManager/SimpleMissionItem.h b/src/MissionManager/SimpleMissionItem.h index 528d78530bda97c903305641eb094716368864d7..e97476acfc0865ee0d944d87a42281849349c0d8 100644 --- a/src/MissionManager/SimpleMissionItem.h +++ b/src/MissionManager/SimpleMissionItem.h @@ -99,6 +99,7 @@ public: double specifiedGimbalYaw (void) final; QString mapVisualQML (void) const final { return QStringLiteral("SimpleItemMapVisual.qml"); } void appendMissionItems (QList& items, QObject* missionItemParent) final; + void applyNewAltitude (double newAltitude) final; bool coordinateHasRelativeAltitude (void) const final { return _missionItem.relativeAltitude(); } bool exitCoordinateHasRelativeAltitude (void) const final { return coordinateHasRelativeAltitude(); } diff --git a/src/MissionManager/SurveyMissionItem.cc b/src/MissionManager/SurveyMissionItem.cc index 88337092d12e9a2ec1f6881271a810b49e9fdf9b..268232c7c4dcd9f405f47abb15fb009351be7792 100644 --- a/src/MissionManager/SurveyMissionItem.cc +++ b/src/MissionManager/SurveyMissionItem.cc @@ -1108,3 +1108,8 @@ double SurveyMissionItem::_turnaroundDistance(void) const { return _turnaroundDistFact.rawValue().toDouble(); } + +void SurveyMissionItem::applyNewAltitude(double newAltitude) +{ + _gridAltitudeFact.setRawValue(newAltitude); +} diff --git a/src/MissionManager/SurveyMissionItem.h b/src/MissionManager/SurveyMissionItem.h index 19e02346e5a516aa60d2b30ea93102fd7e9d8a94..98aeddb4549be439350915cfdf6b81911db1e5a7 100644 --- a/src/MissionManager/SurveyMissionItem.h +++ b/src/MissionManager/SurveyMissionItem.h @@ -126,6 +126,7 @@ public: double specifiedGimbalYaw (void) final { return std::numeric_limits::quiet_NaN(); } void appendMissionItems (QList& items, QObject* missionItemParent) final; void setMissionFlightStatus (MissionController::MissionFlightStatus_t& missionFlightStatus) final; + void applyNewAltitude (double newAltitude) final; bool coordinateHasRelativeAltitude (void) const final { return _gridAltitudeRelativeFact.rawValue().toBool(); } bool exitCoordinateHasRelativeAltitude (void) const final { return _gridAltitudeRelativeFact.rawValue().toBool(); } diff --git a/src/MissionManager/VisualMissionItem.h b/src/MissionManager/VisualMissionItem.h index eac6ecc9a76c63b0b236c22a887acee1cf9fba94..76805227ae98bac1ac078c91a6a8c907f3d04d55 100644 --- a/src/MissionManager/VisualMissionItem.h +++ b/src/MissionManager/VisualMissionItem.h @@ -138,6 +138,9 @@ public: /// @param missionItemParent Parent object for newly created MissionItems virtual void appendMissionItems(QList& items, QObject* missionItemParent) = 0; + /// Adjust the altitude of the item if appropriate to the new altitude. + virtual void applyNewAltitude(double newAltitude) = 0; + double missionGimbalYaw (void) const { return _missionGimbalYaw; } double missionVehicleYaw (void) const { return _missionVehicleYaw; } bool showMissionGimbalYaw(void) const { return !qIsNaN(_missionGimbalYaw); } diff --git a/src/PlanView/MissionSettingsMapVisual.qml b/src/PlanView/MissionSettingsMapVisual.qml deleted file mode 100644 index d3a150bd87536d04c26e8bcb5f4fda71b70eb14f..0000000000000000000000000000000000000000 --- a/src/PlanView/MissionSettingsMapVisual.qml +++ /dev/null @@ -1,132 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2016 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -import QtQuick 2.3 -import QtQuick.Controls 1.2 -import QtLocation 5.3 -import QtPositioning 5.3 - -import QGroundControl 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Palette 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.FlightMap 1.0 - -/// Mission Settings map visuals -Item { - id: _root - - property var map ///< Map control to place item in - - signal clicked(int sequenceNumber) - - property var _missionItem: object - property var _itemVisual - property var _dragArea - property bool _itemVisualShowing: false - property bool _dragAreaShowing: false - - function hideItemVisuals() { - if (_itemVisualShowing) { - _itemVisual.destroy() - _itemVisualShowing = false - } - } - - function showItemVisuals() { - if (!_itemVisualShowing) { - _itemVisual = indicatorComponent.createObject(map) - map.addMapItem(_itemVisual) - _itemVisualShowing = true - } - } - - function hideDragArea() { - if (_dragAreaShowing) { - _dragArea.destroy() - _dragAreaShowing = false - } - } - - function showDragArea() { - if (!_dragAreaShowing && _missionItem.specifiesCoordinate) { - _dragArea = dragAreaComponent.createObject(map) - _dragAreaShowing = true - } - } - - Component.onCompleted: { - showItemVisuals() - if (_missionItem.isCurrentItem) { - showDragArea() - } - } - - Component.onDestruction: { - hideDragArea() - hideItemVisuals() - } - - - Connections { - target: _missionItem - - onIsCurrentItemChanged: { - if (_missionItem.isCurrentItem) { - showDragArea() - } else { - hideDragArea() - } - } - } - - // Control which is used to drag items - Component { - id: dragAreaComponent - - MissionItemIndicatorDrag { - itemIndicator: _itemVisual - itemCoordinate: _missionItem.coordinate - - onItemCoordinateChanged: _missionItem.coordinate = itemCoordinate - } - } - - Component { - id: indicatorComponent - - MissionItemIndicator { - coordinate: _missionItem.coordinate - visible: coordinate.isValid - z: QGroundControl.zOrderMapItems - missionItem: _missionItem - - onClicked: _root.clicked(_missionItem.sequenceNumber) - - // These are the non-coordinate child mission items attached to this item - Row { - anchors.top: parent.top - anchors.left: parent.right - - Repeater { - model: _missionItem.childItems - - delegate: MissionItemIndexLabel { - label: object.abbreviation.length === 0 ? object.sequenceNumber : object.abbreviation.charAt(0) - checked: object.isCurrentItem - z: 2 - specifiesCoordinate: false - - onClicked: _root.Clicked(object.sequenceNumber) - } - } - } - } - } -} diff --git a/src/PlanView/PlanView.qml b/src/PlanView/PlanView.qml index 1f01d417ccf8b3c444298e90c85db181b30f958a..1acc349158c30cb090c788260341fb327b21bea8 100644 --- a/src/PlanView/PlanView.qml +++ b/src/PlanView/PlanView.qml @@ -95,6 +95,29 @@ QGCView { mapRallyPointController: rallyPointController } + Connections { + target: QGroundControl.settingsManager.appSettings.defaultMissionItemAltitude + + onRawValueChanged: { + if (_visualItems.count > 1) { + _qgcView.showDialog(applyNewAltitude, qsTr("Apply new alititude"), showDialogDefaultWidth, StandardButton.Yes | StandardButton.No) + } + } + } + + Component { + id: applyNewAltitude + + QGCViewMessage { + message: qsTr("You have changed the default altitude for mission items. Would you like to apply that altitude to all the items in the current mission?") + + function accept() { + hideDialog() + missionController.applyDefaultMissionAltitude() + } + } + } + MissionController { id: missionController diff --git a/src/QmlControls/QGCMouseArea.qml b/src/QmlControls/QGCMouseArea.qml index 4c601f196cc039dbc26e30a5b36ae341284abdaf..b58eb3498b2b518bf336cd559ebfb3e21017f383 100644 --- a/src/QmlControls/QGCMouseArea.qml +++ b/src/QmlControls/QGCMouseArea.qml @@ -13,14 +13,15 @@ MouseArea { anchors.bottomMargin: fillItem ? -_touchMarginVertical : 0 anchors.fill: fillItem ? fillItem : undefined - property var fillItem + property var fillItem + property bool debugMobile: false ///< Allows you to debug mobile sizing on desktop builds property real _itemWidth: fillItem ? fillItem.width : width property real _itemHeight: fillItem ? fillItem.height : height property real _touchWidth: Math.max(_itemWidth, ScreenTools.minTouchPixels) property real _touchHeight: Math.max(_itemHeight, ScreenTools.minTouchPixels) - property real _touchMarginHorizontal: ScreenTools.isMobile ? (_touchWidth - _itemWidth) / 2 : 0 - property real _touchMarginVertical: ScreenTools.isMobile ? (_touchHeight - _itemHeight) / 2 : 0 + property real _touchMarginHorizontal: debugMobile || ScreenTools.isMobile ? (_touchWidth - _itemWidth) / 2 : 0 + property real _touchMarginVertical: debugMobile || ScreenTools.isMobile ? (_touchHeight - _itemHeight) / 2 : 0 Rectangle { anchors.fill: parent diff --git a/src/QmlControls/SliderSwitch.qml b/src/QmlControls/SliderSwitch.qml index 101f6dd1dd6b44a77ea030b2ad7cbb02249a26b3..2b5dd585bafd4b1309376d00d1740bd7c285d84d 100644 --- a/src/QmlControls/SliderSwitch.qml +++ b/src/QmlControls/SliderSwitch.qml @@ -9,7 +9,7 @@ import QGroundControl.Palette 1.0 Rectangle { id: _root implicitWidth: label.contentWidth + (_diameter * 2.5) + (_border * 4) - implicitHeight: Math.max(ScreenTools.isMobile ? ScreenTools.minTouchPixels : 0, label.height * 2.5) + implicitHeight: label.height * 2.5 radius: height /2 color: qgcPal.text @@ -57,10 +57,10 @@ Rectangle { } - MouseArea { + QGCMouseArea { id: sliderDragArea anchors.leftMargin: -ScreenTools.defaultFontPixelWidth * 15 - anchors.fill: slider + fillItem: slider drag.target: slider drag.axis: Drag.XAxis drag.minimumX: _border @@ -71,6 +71,8 @@ Rectangle { property bool dragActive: drag.active property real _dragOffset: 1 + Component.onCompleted: console.log(height, ScreenTools.minTouchPixels) + onPressed: { mouse.x } diff --git a/src/QmlControls/ToolStrip.qml b/src/QmlControls/ToolStrip.qml index 5dc99c94656183cf6d55f990e7cbe5ba6b09a7a4..3e912e4d05652b7b9e1a3e9c707718dbd9def4a7 100644 --- a/src/QmlControls/ToolStrip.qml +++ b/src/QmlControls/ToolStrip.qml @@ -43,7 +43,9 @@ Rectangle { Component.onCompleted: recalcShowOptionalElements() - onMaxHeightChanged: recalcShowOptionalElements() + onMaxHeightChanged: recalcShowOptionalElements() + onModelChanged: recalcShowOptionalElements() + onButtonVisibleChanged: recalcShowOptionalElements() Connections { target: ScreenTools