diff --git a/src/MissionEditor/FWLandingPatternEditor.qml b/src/MissionEditor/FWLandingPatternEditor.qml index af6a9d5a2761523c314fdc1822088578561879ad..8d26b50b1ea97f492dc74e58402eced177f465ab 100644 --- a/src/MissionEditor/FWLandingPatternEditor.qml +++ b/src/MissionEditor/FWLandingPatternEditor.qml @@ -46,7 +46,7 @@ Rectangle { anchors.right: parent.right wrapMode: Text.WordWrap font.pointSize: ScreenTools.smallFontPointSize - text: "WIP (NOT FOR REAL FLIGHT!)" + text: qsTr("WIP (NOT FOR REAL FLIGHT!)") } Item { width: 1; height: _margin } @@ -122,9 +122,21 @@ Rectangle { anchors.left: parent.left anchors.right: parent.right visible: !missionItem.landingCoordSet + spacing: ScreenTools.defaultFontPixelHeight - QGCLabel { text: "WIP (NOT FOR REAL FLIGHT!)" } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + font.pointSize: ScreenTools.smallFontPointSize + text: qsTr("WIP (NOT FOR REAL FLIGHT!)") + } - QGCLabel { text: qsTr("Click in map to set landing point.") } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("Click in map to set landing point.") + } } } diff --git a/src/MissionEditor/FWLandingPatternMapVisual.qml b/src/MissionEditor/FWLandingPatternMapVisual.qml index d2c01674b7e2b0a2e88aa83fd0b3af0ee99f0c41..b393d755f4175ff71f586f824fe4e01c16925685 100644 --- a/src/MissionEditor/FWLandingPatternMapVisual.qml +++ b/src/MissionEditor/FWLandingPatternMapVisual.qml @@ -22,40 +22,36 @@ Item { property var map ///< Map control to place item in property var _missionItem: object + property var _itemVisuals: [ ] property var _mouseArea - property var _dragLoiter - property var _dragLand - property var _loiterPoint - property var _landPoint - property var _flightPath + property var _dragAreas: [ ] + + readonly property int _flightPathIndex: 0 + readonly property int _loiterPointIndex: 1 + readonly property int _loiterRadiusIndex: 2 + readonly property int _landPointIndex: 3 function hideItemVisuals() { - if (_flightPath) { - _flightPath.destroy() - _flightPath = undefined - } - if (_loiterPoint) { - _loiterPoint.destroy() - _loiterPoint = undefined - } - if (_landPoint) { - _landPoint.destroy() - _landPoint = undefined + for (var i=0; i<_itemVisuals.length; i++) { + _itemVisuals[i].destroy() } + _itemVisuals = [ ] } function showItemVisuals() { - if (!_flightPath) { - _flightPath = flightPathComponent.createObject(map) - map.addMapItem(_flightPath) - } - if (!_loiterPoint) { - _loiterPoint = loiterPointComponent.createObject(map) - map.addMapItem(_loiterPoint) - } - if (!_landPoint) { - _landPoint = landPointComponent.createObject(map) - map.addMapItem(_landPoint) + if (_itemVisuals.length === 0) { + var itemVisual = flightPathComponent.createObject(map) + map.addMapItem(itemVisual) + _itemVisuals[_flightPathIndex] =itemVisual + itemVisual = loiterPointComponent.createObject(map) + map.addMapItem(itemVisual) + _itemVisuals[_loiterPointIndex] = itemVisual + itemVisual = loiterRadiusComponent.createObject(map) + map.addMapItem(itemVisual) + _itemVisuals[_loiterRadiusIndex] = itemVisual + itemVisual = landPointComponent.createObject(map) + map.addMapItem(itemVisual) + _itemVisuals[_landPointIndex] = itemVisual } } @@ -74,24 +70,16 @@ Item { } function hideDragAreas() { - console.log("hideDragAreas") - if (_dragLoiter) { - _dragLoiter.destroy() - _dragLoiter = undefined - } - if (_dragLand) { - _dragLand.destroy() - _dragLand = undefined + for (var i=0; i<_dragAreas.length; i++) { + _dragAreas[i].destroy() } + _dragAreas = [ ] } function showDragAreas() { - console.log("showDragAreas") - if (!_dragLoiter) { - _dragLoiter = dragAreaComponent.createObject(map, { "dragLoiter": true }) - } - if (!_dragLand) { - _dragLand = dragAreaComponent.createObject(map, { "dragLoiter": false }) + if (_dragAreas.length === 0) { + _dragAreas.push(dragAreaComponent.createObject(map, { "dragLoiter": true })) + _dragAreas.push(dragAreaComponent.createObject(map, { "dragLoiter": false })) } } @@ -116,7 +104,6 @@ Item { target: _missionItem onIsCurrentItemChanged: { - console.log("onIsCurrentItemChanged", _missionItem.isCurrentItem) if (_missionItem.isCurrentItem) { if (_missionItem.landingCoordSet) { showDragAreas() @@ -172,7 +159,7 @@ Item { z: QGroundControl.zOrderMapItems + 1 // Above item icons property bool dragLoiter - property var mapQuickItem: dragLoiter ? _loiterPoint : _landPoint + property var mapQuickItem: dragLoiter ? _itemVisuals[_loiterPointIndex] : _itemVisuals[_landPointIndex] property bool _preventCoordinateBindingLoop: false onXChanged: liveDrag() @@ -216,7 +203,7 @@ Item { MapPolyline { z: QGroundControl.zOrderMapItems - 1 // Under item indicators - line.color: "white" + line.color: "#be781c" line.width: 2 path: _missionItem.landingCoordSet ? [ _missionItem.loiterCoordinate, _missionItem.landingCoordinate ] : undefined } @@ -234,11 +221,25 @@ Item { sourceItem: MissionItemIndexLabel { - label: "P" + label: "L" } } } + // Loiter radius visual + Component { + id: loiterRadiusComponent + + MapCircle { + z: QGroundControl.zOrderMapItems + center: _missionItem.loiterCoordinate + radius: _missionItem.loiterRadius.value + border.width: 2 + border.color: "green" + color: "transparent" + } + } + // Land point Component { id: landPointComponent @@ -252,6 +253,7 @@ Item { sourceItem: MissionItemIndexLabel { label: "L" + checked: _missionItem.isCurrentItem } } } diff --git a/src/MissionManager/FWLandingPattern.FactMetaData.json b/src/MissionManager/FWLandingPattern.FactMetaData.json index 96e5657ed9b1c45b99f936eff62373c0ba458ecf..0efffaee46689d4dc33fa590b4e1ba17026f9df0 100644 --- a/src/MissionManager/FWLandingPattern.FactMetaData.json +++ b/src/MissionManager/FWLandingPattern.FactMetaData.json @@ -12,8 +12,10 @@ "shortDescription": "Heading from land point to loiter point.", "type": "double", "units": "deg", + "min": 0.0, + "max": 360.0, "decimalPlaces": 0, - "defaultValue": 0.0 + "defaultValue": 270.0 }, { "name": "Loiter altitude", diff --git a/src/MissionManager/FixedWingLandingComplexItem.cc b/src/MissionManager/FixedWingLandingComplexItem.cc index 3603eba380d7c4c52f971ff867561aa5811abcd0..dd1dc98fc45fc6a017e667f98d8333b1acf9d4a2 100644 --- a/src/MissionManager/FixedWingLandingComplexItem.cc +++ b/src/MissionManager/FixedWingLandingComplexItem.cc @@ -230,7 +230,7 @@ void FixedWingLandingComplexItem::_recalcLoiterCoordFromFacts(void) QPointF originPoint(east, north); north += _loiterToLandDistanceFact.rawValue().toDouble(); QPointF loiterPoint(east, north); - QPointF rotatedLoiterPoint = _rotatePoint(loiterPoint, originPoint, _landingHeadingFact.rawValue().toDouble()); + QPointF rotatedLoiterPoint = _rotatePoint(loiterPoint, originPoint, -_landingHeadingFact.rawValue().toDouble()); convertNedToGeo(rotatedLoiterPoint.y(), rotatedLoiterPoint.x(), down, tangentOrigin, &_loiterCoordinate); @@ -276,7 +276,11 @@ void FixedWingLandingComplexItem::_recalcFactsFromCoords(void) QPointF vector(eastLoiter - eastLand, northLoiter - northLand); double radians = atan2(vector.y(), vector.x()); double degrees = qRadiansToDegrees(radians); - degrees -= 90; // north up + // Change angle to north up = 0 degrees + degrees -= 90; + // Reverse the angle direction to go from mathematic angle (counter-clockwise) to compass heading (clockwise) + degrees *= -1.0; + // Bring with 0-360 range if (degrees < 0.0) { degrees += 360.0; } else if (degrees > 360.0) {