From 9c8042e681a24899c57935a28c8e31729c7829ac Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Fri, 28 Sep 2018 07:40:34 -0700 Subject: [PATCH] Fix planned home position set when takeoff has no coordinate in it --- src/MissionManager/MissionController.cc | 35 +++++++++++++++++++------ src/MissionManager/MissionController.h | 5 ++-- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 233f10af6..2a1ee4664 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -371,7 +371,8 @@ int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int i) newItem->setMissionFlightStatus(_missionFlightStatus); _visualItems->insert(i, newItem); - _recalcAll(); + // We send the click coordinate through here to be able to set the planned home position from the user click location if needed + _recalcAllWithClickCoordinate(coordinate); return newItem->sequenceNumber(); } @@ -1517,8 +1518,10 @@ void MissionController::_recalcChildItems(void) } } -void MissionController::_setPlannedHomePositionFromFirstCoordinate(void) +void MissionController::_setPlannedHomePositionFromFirstCoordinate(const QGeoCoordinate& clickCoordinate) { + QGeoCoordinate firstCoordinate; + if (_settingsItem->coordinate().isValid()) { return; } @@ -1528,24 +1531,40 @@ void MissionController::_setPlannedHomePositionFromFirstCoordinate(void) VisualMissionItem* item = _visualItems->value(i); if (item->specifiesCoordinate()) { - QGeoCoordinate plannedHomeCoord = item->coordinate().atDistanceAndAzimuth(30, 0); - plannedHomeCoord.setAltitude(0); - _settingsItem->setCoordinate(plannedHomeCoord); + firstCoordinate = item->coordinate(); + break; } } -} + // No item specifying a coordinate was found, in this case it we have a clickCoordinate use that + if (!firstCoordinate.isValid()) { + firstCoordinate = clickCoordinate; + } -void MissionController::_recalcAll(void) + if (firstCoordinate.isValid()) { + QGeoCoordinate plannedHomeCoord = firstCoordinate.atDistanceAndAzimuth(30, 0); + plannedHomeCoord.setAltitude(0); + _settingsItem->setCoordinate(plannedHomeCoord); + } +} + +/// @param clickCoordinate The location of the user click when inserting a new item +void MissionController::_recalcAllWithClickCoordinate(QGeoCoordinate& clickCoordinate) { if (!_flyView) { - _setPlannedHomePositionFromFirstCoordinate(); + _setPlannedHomePositionFromFirstCoordinate(clickCoordinate); } _recalcSequence(); _recalcChildItems(); _recalcWaypointLines(); } +void MissionController::_recalcAll(void) +{ + QGeoCoordinate emptyCoord; + _recalcAllWithClickCoordinate(emptyCoord); +} + /// Initializes a new set of mission items void MissionController::_initAllVisualItems(void) { diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h index 02f9b308e..fbb53e846 100644 --- a/src/MissionManager/MissionController.h +++ b/src/MissionManager/MissionController.h @@ -225,12 +225,13 @@ private slots: void _visualItemsDirtyChanged(bool dirty); void _managerSendComplete(bool error); void _managerRemoveAllComplete(bool error); + void _recalcAll(void); private: void _init(void); void _recalcSequence(void); void _recalcChildItems(void); - void _recalcAll(void); + void _recalcAllWithClickCoordinate(QGeoCoordinate& clickCoordinate); void _initAllVisualItems(void); void _deinitAllVisualItems(void); void _initVisualItem(VisualMissionItem* item); @@ -249,7 +250,7 @@ private: int _nextSequenceNumber(void); void _scanForAdditionalSettings(QmlObjectListModel* visualItems, Vehicle* vehicle); static bool _convertToMissionItems(QmlObjectListModel* visualMissionItems, QList& rgMissionItems, QObject* missionItemParent); - void _setPlannedHomePositionFromFirstCoordinate(void); + void _setPlannedHomePositionFromFirstCoordinate(const QGeoCoordinate& clickCoordinate); void _resetMissionFlightStatus(void); void _addHoverTime(double hoverTime, double hoverDistance, int waypointIndex); void _addCruiseTime(double cruiseTime, double cruiseDistance, int wayPointIndex); -- 2.22.0