diff --git a/src/MissionManager/LandingComplexItem.cc b/src/MissionManager/LandingComplexItem.cc index be4c0404983e4d84e4c27758d924d05d4d2ab35a..36a085f7b26aed0795df2bb340cc7017dc0f6738 100644 --- a/src/MissionManager/LandingComplexItem.cc +++ b/src/MissionManager/LandingComplexItem.cc @@ -14,6 +14,7 @@ #include "SimpleMissionItem.h" #include "PlanMasterController.h" #include "FlightPathSegment.h" +#include "TakeoffMissionItem.h" #include @@ -29,6 +30,15 @@ LandingComplexItem::LandingComplexItem(PlanMasterController* masterController, b qgcApp()->addCompressedSignal(QMetaMethod::fromSignal(&LandingComplexItem::_updateFlightPathSegmentsSignal)); } +void LandingComplexItem::setLandingHeadingToTakeoffHeading() +{ + TakeoffMissionItem* takeoffMissionItem = _missionController->takeoffMissionItem(); + if (takeoffMissionItem && takeoffMissionItem->specifiesCoordinate()) { + qreal heading = takeoffMissionItem->launchCoordinate().azimuthTo(takeoffMissionItem->coordinate()); + landingHeading()->setRawValue(heading); + } +} + double LandingComplexItem::complexDistance(void) const { return loiterCoordinate().distanceTo(loiterTangentCoordinate()) + loiterTangentCoordinate().distanceTo(landingCoordinate()); diff --git a/src/MissionManager/LandingComplexItem.h b/src/MissionManager/LandingComplexItem.h index 996eb9c5ec23dfe724d207d76dca200b058a18a1..61ef23b920b6ab9553f3b3dc40abaefb09f7d680 100644 --- a/src/MissionManager/LandingComplexItem.h +++ b/src/MissionManager/LandingComplexItem.h @@ -40,6 +40,8 @@ public: Q_PROPERTY(QGeoCoordinate landingCoordinate READ landingCoordinate WRITE setLandingCoordinate NOTIFY landingCoordinateChanged) Q_PROPERTY(bool landingCoordSet MEMBER _landingCoordSet NOTIFY landingCoordSetChanged) + Q_INVOKABLE void setLandingHeadingToTakeoffHeading(); + virtual Fact* loiterAltitude (void) = 0; virtual Fact* loiterRadius (void) = 0; virtual Fact* landingAltitude (void) = 0; diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index c2627676966f9ed275d90ed2f2505d9f7f78b928..dfb80e224528c3662154ec883f37ce3241019e4f 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -166,6 +166,7 @@ void MissionController::_newMissionItemsAvailableFromVehicle(bool removeAllReque _visualItems->deleteLater(); _visualItems = nullptr; _settingsItem = nullptr; + _takeoffMissionItem = nullptr; _updateContainsItems(); // This will clear containsItems which will be set again below. This will re-pop Start Mission confirmation. QmlObjectListModel* newControllerMissionItems = new QmlObjectListModel(this); @@ -192,9 +193,9 @@ void MissionController::_newMissionItemsAvailableFromVehicle(bool removeAllReque SimpleMissionItem* simpleItem = new SimpleMissionItem(_masterController, _flyView, *missionItem, this); if (TakeoffMissionItem::isTakeoffCommand(static_cast(simpleItem->command()))) { // This needs to be a TakeoffMissionItem - TakeoffMissionItem* takeoffItem = new TakeoffMissionItem(*missionItem, _masterController, _flyView, settingsItem, this); + _takeoffMissionItem = new TakeoffMissionItem(*missionItem, _masterController, _flyView, settingsItem, this); simpleItem->deleteLater(); - simpleItem = takeoffItem; + simpleItem = _takeoffMissionItem; } newControllerMissionItems->append(simpleItem); } @@ -359,34 +360,34 @@ VisualMissionItem* MissionController::insertSimpleMissionItem(QGeoCoordinate coo VisualMissionItem* MissionController::insertTakeoffItem(QGeoCoordinate /*coordinate*/, int visualItemIndex, bool makeCurrentItem) { int sequenceNumber = _nextSequenceNumber(); - TakeoffMissionItem * newItem = new TakeoffMissionItem(_controllerVehicle->vtol() ? MAV_CMD_NAV_VTOL_TAKEOFF : MAV_CMD_NAV_TAKEOFF, _masterController, _flyView, _settingsItem, this); - newItem->setSequenceNumber(sequenceNumber); - _initVisualItem(newItem); + _takeoffMissionItem = new TakeoffMissionItem(_controllerVehicle->vtol() ? MAV_CMD_NAV_VTOL_TAKEOFF : MAV_CMD_NAV_TAKEOFF, _masterController, _flyView, _settingsItem, this); + _takeoffMissionItem->setSequenceNumber(sequenceNumber); + _initVisualItem(_takeoffMissionItem); - if (newItem->specifiesAltitude()) { + if (_takeoffMissionItem->specifiesAltitude()) { double prevAltitude; int prevAltitudeMode; if (_findPreviousAltitude(visualItemIndex, &prevAltitude, &prevAltitudeMode)) { - newItem->altitude()->setRawValue(prevAltitude); - newItem->setAltitudeMode(static_cast(prevAltitudeMode)); + _takeoffMissionItem->altitude()->setRawValue(prevAltitude); + _takeoffMissionItem->setAltitudeMode(static_cast(prevAltitudeMode)); } } if (visualItemIndex == -1) { - _visualItems->append(newItem); + _visualItems->append(_takeoffMissionItem); } else { - _visualItems->insert(visualItemIndex, newItem); + _visualItems->insert(visualItemIndex, _takeoffMissionItem); } _recalcAll(); if (makeCurrentItem) { - setCurrentPlanViewSeqNum(newItem->sequenceNumber(), true); + setCurrentPlanViewSeqNum(_takeoffMissionItem->sequenceNumber(), true); } _firstItemAdded(); - return newItem; + return _takeoffMissionItem; } VisualMissionItem* MissionController::insertLandItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem) @@ -536,6 +537,10 @@ void MissionController::removeVisualItem(int viIndex) bool removeSurveyStyle = _visualItems->value(viIndex) || _visualItems->value(viIndex); VisualMissionItem* item = qobject_cast(_visualItems->removeAt(viIndex)); + if (item == _takeoffMissionItem) { + _takeoffMissionItem = nullptr; + } + _deinitVisualItem(item); item->deleteLater(); @@ -591,6 +596,7 @@ void MissionController::removeAll(void) _visualItems->clearAndDeleteContents(); _visualItems->deleteLater(); _settingsItem = nullptr; + _takeoffMissionItem = nullptr; _visualItems = new QmlObjectListModel(this); _addMissionSettings(_visualItems); _initAllVisualItems(); @@ -983,8 +989,9 @@ void MissionController::_initLoadedVisualItems(QmlObjectListModel* loadedVisualI if (_visualItems) { _deinitAllVisualItems(); _visualItems->deleteLater(); - _settingsItem = nullptr; } + _settingsItem = nullptr; + _takeoffMissionItem = nullptr; _visualItems = loadedVisualItems; @@ -1859,6 +1866,11 @@ void MissionController::_initAllVisualItems(void) for (int i=0; i<_visualItems->count(); i++) { VisualMissionItem* item = qobject_cast(_visualItems->get(i)); _initVisualItem(item); + + TakeoffMissionItem* takeoffItem = qobject_cast(item); + if (takeoffItem) { + _takeoffMissionItem = takeoffItem; + } } _recalcAll(); diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h index 9f6c936b7c4704c23e7d546ab7c2d784a3fef494..9f858be783136676854ee045d9c7ffa39d3a9749 100644 --- a/src/MissionManager/MissionController.h +++ b/src/MissionManager/MissionController.h @@ -22,12 +22,12 @@ class FlightPathSegment; class VisualMissionItem; class MissionItem; -class MissionSettingsItem; class AppSettings; class MissionManager; class SimpleMissionItem; class ComplexMissionItem; class MissionSettingsItem; +class TakeoffMissionItem; class QDomDocument; class PlanViewSettings; @@ -86,6 +86,7 @@ public: Q_PROPERTY(int currentPlanViewSeqNum READ currentPlanViewSeqNum NOTIFY currentPlanViewSeqNumChanged) Q_PROPERTY(int currentPlanViewVIIndex READ currentPlanViewVIIndex NOTIFY currentPlanViewVIIndexChanged) Q_PROPERTY(VisualMissionItem* currentPlanViewItem READ currentPlanViewItem NOTIFY currentPlanViewItemChanged) + Q_PROPERTY(TakeoffMissionItem* takeoffMissionItem READ takeoffMissionItem NOTIFY takeoffMissionItemChanged) Q_PROPERTY(double missionDistance READ missionDistance NOTIFY missionDistanceChanged) Q_PROPERTY(double missionTime READ missionTime NOTIFY missionTimeChanged) Q_PROPERTY(double missionHoverDistance READ missionHoverDistance NOTIFY missionHoverDistanceChanged) @@ -225,6 +226,7 @@ public: QStringList complexMissionItemNames (void) const; QGeoCoordinate plannedHomePosition (void) const; VisualMissionItem* currentPlanViewItem (void) const { return _currentPlanViewItem; } + TakeoffMissionItem* takeoffMissionItem (void) const { return _takeoffMissionItem; } double progressPct (void) const { return _progressPct; } QString surveyComplexItemName (void) const; QString corridorScanComplexItemName (void) const; @@ -280,6 +282,7 @@ signals: void currentPlanViewSeqNumChanged (void); void currentPlanViewVIIndexChanged (void); void currentPlanViewItemChanged (void); + void takeoffMissionItemChanged (void); void missionBoundingCubeChanged (void); void missionItemCountChanged (int missionItemCount); void onlyInsertTakeoffValidChanged (void); @@ -379,6 +382,7 @@ private: int _currentPlanViewSeqNum = -1; int _currentPlanViewVIIndex = -1; VisualMissionItem* _currentPlanViewItem = nullptr; + TakeoffMissionItem* _takeoffMissionItem = nullptr; QTimer _updateTimer; QGCGeoBoundingCube _travelBoundingCube; QGeoCoordinate _takeoffCoordinate; diff --git a/src/PlanView/FWLandingPatternEditor.qml b/src/PlanView/FWLandingPatternEditor.qml index 62695cbd517c1ef55d9ff195aff3c60dcbbec4ba..b5b1bb5f6600cc504984b9811e5c8e4305c985d9 100644 --- a/src/PlanView/FWLandingPatternEditor.qml +++ b/src/PlanView/FWLandingPatternEditor.qml @@ -289,6 +289,7 @@ Rectangle { onClicked: { missionItem.landingCoordinate = activeVehicle.coordinate missionItem.landingHeading.rawValue = activeVehicle.heading.rawValue + missionItem.setLandingHeadingToTakeoffHeading() } } } diff --git a/src/PlanView/FWLandingPatternMapVisual.qml b/src/PlanView/FWLandingPatternMapVisual.qml index e54c243d27f6d08b26f7cb8094dc5dce00eced3e..7e89f04ddad44e70abcd15296734d6be4158f543 100644 --- a/src/PlanView/FWLandingPatternMapVisual.qml +++ b/src/PlanView/FWLandingPatternMapVisual.qml @@ -189,6 +189,7 @@ Item { coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces) coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces) _missionItem.landingCoordinate = coordinate + _missionItem.setLandingHeadingToTakeoffHeading() } } } diff --git a/src/PlanView/VTOLLandingPatternEditor.qml b/src/PlanView/VTOLLandingPatternEditor.qml index 81eef00b42b3e124196a0f7c159a28a22c4eed5f..196fc2705f3b0962ff0aa347291ea46d3b4667fe 100644 --- a/src/PlanView/VTOLLandingPatternEditor.qml +++ b/src/PlanView/VTOLLandingPatternEditor.qml @@ -276,6 +276,7 @@ Rectangle { onClicked: { missionItem.landingCoordinate = activeVehicle.coordinate missionItem.landingHeading.rawValue = activeVehicle.heading.rawValue + missionItem.setLandingHeadingToTakeoffHeading() } } } diff --git a/src/PlanView/VTOLLandingPatternMapVisual.qml b/src/PlanView/VTOLLandingPatternMapVisual.qml index 2c89df92316e182a09a7ab2c91a5e3d952c3d70d..424511efeb42fb5655405bdaf6202a61eb9d6f3d 100644 --- a/src/PlanView/VTOLLandingPatternMapVisual.qml +++ b/src/PlanView/VTOLLandingPatternMapVisual.qml @@ -159,6 +159,7 @@ Item { coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces) coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces) _missionItem.landingCoordinate = coordinate + _missionItem.setLandingHeadingToTakeoffHeading() } } }