diff --git a/src/FlightDisplay/GuidedActionsController.qml b/src/FlightDisplay/GuidedActionsController.qml index 2f1e560c97e2c597d944fd4e1e0593a80390515d..c7ece2b7e39129be49a2e609fc06b0d07679d787 100644 --- a/src/FlightDisplay/GuidedActionsController.qml +++ b/src/FlightDisplay/GuidedActionsController.qml @@ -36,7 +36,7 @@ Item { readonly property string emergencyStopTitle: qsTr("EMERGENCY STOP") readonly property string armTitle: qsTr("Arm") readonly property string disarmTitle: qsTr("Disarm") - readonly property string rtlTitle: qsTr("RTL") + readonly property string rtlTitle: qsTr("Return") readonly property string takeoffTitle: qsTr("Takeoff") readonly property string landTitle: qsTr("Land") readonly property string startMissionTitle: qsTr("Start Mission") diff --git a/src/MissionManager/CorridorScanPlanCreator.cc b/src/MissionManager/CorridorScanPlanCreator.cc index 4ca876a93b56160287e358a409e24e7392bab01c..d08d642b76fa720a42667b5ad4e39889c6296119 100644 --- a/src/MissionManager/CorridorScanPlanCreator.cc +++ b/src/MissionManager/CorridorScanPlanCreator.cc @@ -22,15 +22,7 @@ void CorridorScanPlanCreator::createPlan(const QGeoCoordinate& mapCenterCoord) { _planMasterController->removeAll(); VisualMissionItem* takeoffItem = _missionController->insertTakeoffItem(mapCenterCoord, -1); - takeoffItem->setWizardMode(true); - _missionController->insertComplexMissionItem(MissionController::patternCorridorScanName, mapCenterCoord, -1)->setWizardMode(true); - if (_planMasterController->managerVehicle()->fixedWing()) { - FixedWingLandingComplexItem* landingItem = qobject_cast(_missionController->insertComplexMissionItem(MissionController::patternFWLandingName, mapCenterCoord, -1)); - landingItem->setWizardMode(true); - landingItem->setLoiterDragAngleOnly(true); - } else { - MissionSettingsItem* settingsItem = _missionController->visualItems()->value(0); - settingsItem->setMissionEndRTL(true); - } + _missionController->insertComplexMissionItem(MissionController::patternCorridorScanName, mapCenterCoord, -1); + _missionController->insertLandItem(mapCenterCoord, -1); _missionController->setCurrentPlanViewIndex(takeoffItem->sequenceNumber(), true); } diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index c33d018cc1b03901fed2856d465e181029a01cf1..74c6a109dcac8fcc02faac12608e13ab928f0117 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -351,13 +351,13 @@ int MissionController::_nextSequenceNumber(void) } } -VisualMissionItem* MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem) +VisualMissionItem* MissionController::_insertSimpleMissionItemWorker(QGeoCoordinate coordinate, MAV_CMD command, int visualItemIndex, bool makeCurrentItem) { int sequenceNumber = _nextSequenceNumber(); SimpleMissionItem * newItem = new SimpleMissionItem(_controllerVehicle, _flyView, this); newItem->setSequenceNumber(sequenceNumber); newItem->setCoordinate(coordinate); - newItem->setCommand(MAV_CMD_NAV_WAYPOINT); + newItem->setCommand(command); _initVisualItem(newItem); if (newItem->specifiesAltitude()) { @@ -386,6 +386,12 @@ VisualMissionItem* MissionController::insertSimpleMissionItem(QGeoCoordinate coo return newItem; } + +VisualMissionItem* MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem) +{ + return _insertSimpleMissionItemWorker(coordinate, MAV_CMD_NAV_WAYPOINT, visualItemIndex, makeCurrentItem); +} + VisualMissionItem* MissionController::insertTakeoffItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem) { int sequenceNumber = _nextSequenceNumber(); @@ -423,49 +429,29 @@ VisualMissionItem* MissionController::insertTakeoffItem(QGeoCoordinate coordinat return newItem; } -VisualMissionItem* MissionController::insertROIMissionItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem) +VisualMissionItem* MissionController::insertLandItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem) { - int sequenceNumber = _nextSequenceNumber(); - SimpleMissionItem * newItem = new SimpleMissionItem(_controllerVehicle, _flyView, this); - newItem->setSequenceNumber(sequenceNumber); - newItem->setCommand((_controllerVehicle->firmwarePlugin()->supportedMissionCommands().contains(MAV_CMD_DO_SET_ROI_LOCATION) ? - MAV_CMD_DO_SET_ROI_LOCATION : - MAV_CMD_DO_SET_ROI)); - _initVisualItem(newItem); - newItem->setCoordinate(coordinate); - - double prevAltitude; - int prevAltitudeMode; - - if (_findPreviousAltitude(visualItemIndex, &prevAltitude, &prevAltitudeMode)) { - newItem->altitude()->setRawValue(prevAltitude); - newItem->setAltitudeMode(static_cast(prevAltitudeMode)); - } - if (visualItemIndex == -1) { - _visualItems->append(newItem); + if (_managerVehicle->fixedWing()) { + FixedWingLandingComplexItem* fwLanding = qobject_cast(insertComplexMissionItem(MissionController::patternFWLandingName, coordinate, visualItemIndex, makeCurrentItem)); + fwLanding->setLoiterDragAngleOnly(true); + return fwLanding; } else { - _visualItems->insert(visualItemIndex, newItem); - } - - _recalcAll(); - - if (makeCurrentItem) { - setCurrentPlanViewIndex(newItem->sequenceNumber(), true); + return _insertSimpleMissionItemWorker(coordinate, MAV_CMD_NAV_RETURN_TO_LAUNCH, visualItemIndex, makeCurrentItem); } +} - return newItem; +VisualMissionItem* MissionController::insertROIMissionItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem) +{ + MAV_CMD command = _controllerVehicle->firmwarePlugin()->supportedMissionCommands().contains(MAV_CMD_DO_SET_ROI_LOCATION) ? + MAV_CMD_DO_SET_ROI_LOCATION : + MAV_CMD_DO_SET_ROI; + return _insertSimpleMissionItemWorker(coordinate, command, visualItemIndex, makeCurrentItem); } VisualMissionItem* MissionController::insertComplexMissionItem(QString itemName, QGeoCoordinate mapCenterCoordinate, int visualItemIndex, bool makeCurrentItem) { ComplexMissionItem* newItem = nullptr; - // If the ComplexMissionItem is inserted first, add a TakeOff SimpleMissionItem - if (_visualItems->count() == 1 && (_controllerVehicle->fixedWing() || _controllerVehicle->vtol() || _controllerVehicle->multiRotor())) { - insertSimpleMissionItem(mapCenterCoordinate, visualItemIndex); - visualItemIndex++; - } - if (itemName == patternSurveyName) { newItem = new SurveyComplexItem(_controllerVehicle, _flyView, QString() /* kmlFile */, _visualItems /* parent */); newItem->setCoordinate(mapCenterCoordinate); @@ -509,8 +495,8 @@ void MissionController::_insertComplexMissionItemWorker(ComplexMissionItem* comp { int sequenceNumber = _nextSequenceNumber(); bool surveyStyleItem = qobject_cast(complexItem) || - qobject_cast(complexItem) || - qobject_cast(complexItem); + qobject_cast(complexItem) || + qobject_cast(complexItem); if (surveyStyleItem) { bool rollSupported = false; @@ -539,6 +525,7 @@ void MissionController::_insertComplexMissionItemWorker(ComplexMissionItem* comp } complexItem->setSequenceNumber(sequenceNumber); + complexItem->setWizardMode(true); _initVisualItem(complexItem); if (visualItemIndex == -1) { @@ -1168,12 +1155,14 @@ CoordinateVector* MissionController::_addWaypointLineSegment(CoordVectHashTable& void MissionController::_recalcWaypointLines(void) { - int segmentCount = 0; VisualItemPair lastSegmentVisualItemPair; - bool firstCoordinateItem = true; - VisualMissionItem* lastCoordinateItem = qobject_cast(_visualItems->get(0)); - - bool homePositionValid = _settingsItem->coordinate().isValid(); + int segmentCount = 0; + bool firstCoordinateNotFound = true; + VisualMissionItem* lastCoordinateItemBeforeRTL = qobject_cast(_visualItems->get(0)); + bool linkEndToHome = false; + bool linkStartToHome = _managerVehicle->rover() ? true : false; + bool foundRTL = false; + bool homePositionValid = _settingsItem->coordinate().isValid(); qCDebug(MissionControllerLog) << "_recalcWaypointLines homePositionValid" << homePositionValid; @@ -1188,32 +1177,44 @@ void MissionController::_recalcWaypointLines(void) _waypointLines.clear(); _directionArrows.clear(); - bool linkEndToHome; - SimpleMissionItem* lastItem = _visualItems->value(_visualItems->count() - 1); - if (lastItem && (int)lastItem->command() == MAV_CMD_NAV_RETURN_TO_LAUNCH) { - linkEndToHome = true; - } else { - linkEndToHome = _settingsItem->missionEndRTL(); - } + // Grovel through the list of items keeping track of things needed to correctly draw waypoints lines - bool linkStartToHome = false; for (int i=1; i<_visualItems->count(); i++) { - VisualMissionItem* item = qobject_cast(_visualItems->get(i)); + VisualMissionItem* visualItem = qobject_cast(_visualItems->get(i)); + SimpleMissionItem* simpleItem = qobject_cast(visualItem); - // If we still haven't found the first coordinate item and we hit a takeoff command this means the mission starts from the ground. - // Link the first item back to home to show that. - if (firstCoordinateItem && item->isSimpleItem()) { - MAV_CMD command = (MAV_CMD)qobject_cast(item)->command(); - if (command == MAV_CMD_NAV_TAKEOFF || command == MAV_CMD_NAV_VTOL_TAKEOFF) { - linkStartToHome = true; + if (simpleItem) { + MAV_CMD command = simpleItem->mavCommand(); + switch (command) { + case MAV_CMD_NAV_TAKEOFF: + case MAV_CMD_NAV_VTOL_TAKEOFF: + if (!linkEndToHome) { + // If we still haven't found the first coordinate item and we hit a takeoff command this means the mission starts from the ground. + // Link the first item back to home to show that. + if (firstCoordinateNotFound) { + linkStartToHome = true; + } + } + break; + case MAV_CMD_NAV_RETURN_TO_LAUNCH: + linkEndToHome = true; + foundRTL = true; + break; + default: + break; } } - if (item->specifiesCoordinate() && !item->isStandaloneCoordinate()) { - if (lastCoordinateItem != _settingsItem || (homePositionValid && linkStartToHome)) { + // No need to add waypoint segments after an RTL. + if (foundRTL) { + break; + } + + if (visualItem->specifiesCoordinate() && !visualItem->isStandaloneCoordinate()) { + if (lastCoordinateItemBeforeRTL != _settingsItem || (homePositionValid && linkStartToHome)) { // Direction arrows are added to the first segment and every 5 segments in the middle. bool addDirectionArrow = false; - if (firstCoordinateItem || !lastCoordinateItem->isSimpleItem() || !item->isSimpleItem()) { + if (firstCoordinateNotFound || !lastCoordinateItemBeforeRTL->isSimpleItem() || !visualItem->isSimpleItem()) { addDirectionArrow = true; } else if (segmentCount > 5) { segmentCount = 0; @@ -1221,7 +1222,7 @@ void MissionController::_recalcWaypointLines(void) } segmentCount++; - lastSegmentVisualItemPair = VisualItemPair(lastCoordinateItem, item); + lastSegmentVisualItemPair = VisualItemPair(lastCoordinateItemBeforeRTL, visualItem); if (!_flyView || addDirectionArrow) { CoordinateVector* coordVector = _addWaypointLineSegment(old_table, lastSegmentVisualItemPair); if (addDirectionArrow) { @@ -1229,9 +1230,9 @@ void MissionController::_recalcWaypointLines(void) } } } - firstCoordinateItem = false; - _waypointPath.append(QVariant::fromValue(item->coordinate())); - lastCoordinateItem = item; + firstCoordinateNotFound = false; + _waypointPath.append(QVariant::fromValue(visualItem->coordinate())); + lastCoordinateItemBeforeRTL = visualItem; } } @@ -1239,8 +1240,8 @@ void MissionController::_recalcWaypointLines(void) _waypointPath.prepend(QVariant::fromValue(_settingsItem->coordinate())); } - if (linkEndToHome && lastCoordinateItem != _settingsItem && homePositionValid) { - lastSegmentVisualItemPair = VisualItemPair(lastCoordinateItem, _settingsItem); + if (linkEndToHome && lastCoordinateItemBeforeRTL != _settingsItem && homePositionValid) { + lastSegmentVisualItemPair = VisualItemPair(lastCoordinateItemBeforeRTL, _settingsItem); if (_flyView) { _waypointPath.append(QVariant::fromValue(_settingsItem->coordinate())); } @@ -1256,7 +1257,7 @@ void MissionController::_recalcWaypointLines(void) if (_linesTable.contains(lastSegmentVisualItemPair)) { // Pair exists in the new table already just reuse it - coordVector = _linesTable[lastSegmentVisualItemPair]; + coordVector = _linesTable[lastSegmentVisualItemPair]; } else if (old_table.contains(lastSegmentVisualItemPair)) { // Pair already exists in old table, pull from old to new and reuse _linesTable[lastSegmentVisualItemPair] = coordVector = old_table.take(lastSegmentVisualItemPair); @@ -1366,10 +1367,10 @@ void MissionController::_recalcMissionFlightStatus() return; } - bool firstCoordinateItem = true; - VisualMissionItem* lastCoordinateItem = qobject_cast(_visualItems->get(0)); + bool firstCoordinateItem = true; + VisualMissionItem* lastCoordinateItemBeforeRTL = qobject_cast(_visualItems->get(0)); - bool showHomePosition = _settingsItem->coordinate().isValid(); + bool homePositionValid = _settingsItem->coordinate().isValid(); qCDebug(MissionControllerLog) << "_recalcMissionFlightStatus"; @@ -1378,9 +1379,9 @@ void MissionController::_recalcMissionFlightStatus() // both relative altitude. // No values for first item - lastCoordinateItem->setAltDifference(0.0); - lastCoordinateItem->setAzimuth(0.0); - lastCoordinateItem->setDistance(0.0); + lastCoordinateItemBeforeRTL->setAltDifference(0.0); + lastCoordinateItemBeforeRTL->setAzimuth(0.0); + lastCoordinateItemBeforeRTL->setDistance(0.0); double minAltSeen = 0.0; double maxAltSeen = 0.0; @@ -1391,21 +1392,16 @@ void MissionController::_recalcMissionFlightStatus() bool vtolInHover = true; bool linkStartToHome = false; - bool linkEndToHome = false; - - if (showHomePosition) { - SimpleMissionItem* lastItem = _visualItems->value(_visualItems->count() - 1); - if (lastItem && (int)lastItem->command() == MAV_CMD_NAV_RETURN_TO_LAUNCH) { - linkEndToHome = true; - } else { - linkEndToHome = _settingsItem->missionEndRTL(); - } - } + bool foundRTL = false; for (int i=0; i<_visualItems->count(); i++) { - VisualMissionItem* item = qobject_cast(_visualItems->get(i)); - SimpleMissionItem* simpleItem = qobject_cast(item); - ComplexMissionItem* complexItem = qobject_cast(item); + VisualMissionItem* item = qobject_cast(_visualItems->get(i)); + SimpleMissionItem* simpleItem = qobject_cast(item); + ComplexMissionItem* complexItem = qobject_cast(item); + + if (simpleItem && simpleItem->mavCommand() == MAV_CMD_NAV_RETURN_TO_LAUNCH) { + foundRTL = true; + } // Assume the worst item->setAzimuth(0.0); @@ -1443,9 +1439,14 @@ void MissionController::_recalcMissionFlightStatus() continue; } + if (foundRTL) { + // No more vehicle distances after RTL + continue; + } + // Link back to home if first item is takeoff and we have home position - if (firstCoordinateItem && simpleItem && (simpleItem->command() == MAV_CMD_NAV_TAKEOFF || simpleItem->command() == MAV_CMD_NAV_VTOL_TAKEOFF)) { - if (showHomePosition) { + if (firstCoordinateItem && simpleItem && (simpleItem->mavCommand() == MAV_CMD_NAV_TAKEOFF || simpleItem->mavCommand() == MAV_CMD_NAV_VTOL_TAKEOFF)) { + if (homePositionValid) { linkStartToHome = true; if (_controllerVehicle->multiRotor() || _controllerVehicle->vtol()) { // We have to special case takeoff, assuming vehicle takes off straight up to specified altitude @@ -1509,16 +1510,16 @@ void MissionController::_recalcMissionFlightStatus() firstCoordinateItem = false; // Update vehicle yaw assuming direction to next waypoint - if (item != lastCoordinateItem) { - _missionFlightStatus.vehicleYaw = lastCoordinateItem->exitCoordinate().azimuthTo(item->coordinate()); - lastCoordinateItem->setMissionVehicleYaw(_missionFlightStatus.vehicleYaw); + if (item != lastCoordinateItemBeforeRTL) { + _missionFlightStatus.vehicleYaw = lastCoordinateItemBeforeRTL->exitCoordinate().azimuthTo(item->coordinate()); + lastCoordinateItemBeforeRTL->setMissionVehicleYaw(_missionFlightStatus.vehicleYaw); } - if (lastCoordinateItem != _settingsItem || linkStartToHome) { + if (lastCoordinateItemBeforeRTL != _settingsItem || linkStartToHome) { // This is a subsequent waypoint or we are forcing the first waypoint back to home double azimuth, distance, altDifference; - _calcPrevWaypointValues(homePositionAltitude, item, lastCoordinateItem, &azimuth, &distance, &altDifference); + _calcPrevWaypointValues(homePositionAltitude, item, lastCoordinateItemBeforeRTL, &azimuth, &distance, &altDifference); item->setAltDifference(altDifference); item->setAzimuth(azimuth); item->setDistance(distance); @@ -1543,15 +1544,16 @@ void MissionController::_recalcMissionFlightStatus() item->setMissionFlightStatus(_missionFlightStatus); - lastCoordinateItem = item; + lastCoordinateItemBeforeRTL = item; } } } - lastCoordinateItem->setMissionVehicleYaw(_missionFlightStatus.vehicleYaw); + lastCoordinateItemBeforeRTL->setMissionVehicleYaw(_missionFlightStatus.vehicleYaw); - if (linkEndToHome && lastCoordinateItem != _settingsItem) { + // Add the information for the final segment back to home + if (foundRTL && lastCoordinateItemBeforeRTL != _settingsItem && homePositionValid) { double azimuth, distance, altDifference; - _calcPrevWaypointValues(homePositionAltitude, lastCoordinateItem, _settingsItem, &azimuth, &distance, &altDifference); + _calcPrevWaypointValues(homePositionAltitude, lastCoordinateItemBeforeRTL, _settingsItem, &azimuth, &distance, &altDifference); // Calculate time/distance double hoverTime = distance / _missionFlightStatus.hoverSpeed; @@ -1621,7 +1623,7 @@ void MissionController::_recalcSequence(void) VisualMissionItem* item = qobject_cast(_visualItems->get(i)); item->setSequenceNumber(sequenceNumber); sequenceNumber = item->lastSequenceNumber() + 1; - } + } _inRecalcSequence = false; } @@ -1710,7 +1712,6 @@ void MissionController::_initAllVisualItems(void) _settingsItem->setHomePositionFromVehicle(_managerVehicle); connect(_settingsItem, &MissionSettingsItem::coordinateChanged, this, &MissionController::_recalcAll); - connect(_settingsItem, &MissionSettingsItem::missionEndRTLChanged, this, &MissionController::_recalcAll); connect(_settingsItem, &MissionSettingsItem::coordinateChanged, this, &MissionController::plannedHomePositionChanged); for (int i=0; i<_visualItems->count(); i++) { @@ -2078,9 +2079,6 @@ QStringList MissionController::complexMissionItemNames(void) const complexItems.append(patternSurveyName); complexItems.append(patternCorridorScanName); - if (_controllerVehicle->fixedWing()) { - complexItems.append(patternFWLandingName); - } if (_controllerVehicle->multiRotor() || _controllerVehicle->vtol()) { complexItems.append(patternStructureScanName); } @@ -2183,10 +2181,14 @@ VisualMissionItem* MissionController::currentPlanViewItem(void) const void MissionController::setCurrentPlanViewIndex(int sequenceNumber, bool force) { if (_visualItems && (force || sequenceNumber != _currentPlanViewIndex)) { + bool foundLand = false; + int takeoffIndex = -1; + _splitSegment = nullptr; _currentPlanViewItem = nullptr; _currentPlanViewIndex = -1; _isInsertTakeoffValid = true; + _isInsertLandValid = true; for (int i = 0; i < _visualItems->count(); i++) { VisualMissionItem* pVI = qobject_cast(_visualItems->get(i)); @@ -2199,10 +2201,31 @@ void MissionController::setCurrentPlanViewIndex(int sequenceNumber, bool force) } if (qobject_cast(pVI)) { - // Already contains a takeoff command + takeoffIndex = i; _isInsertTakeoffValid = false; } + if (!foundLand) { + SimpleMissionItem* simpleItem = qobject_cast(pVI); + if (simpleItem) { + switch (simpleItem->mavCommand()) { + case MAV_CMD_NAV_LAND: + case MAV_CMD_NAV_VTOL_LAND: + case MAV_CMD_DO_LAND_START: + case MAV_CMD_NAV_RETURN_TO_LAUNCH: + foundLand = true; + break; + default: + break; + } + } else { + FixedWingLandingComplexItem* fwLanding = qobject_cast(pVI); + if (fwLanding) { + foundLand = true; + } + } + } + if (pVI->sequenceNumber() == sequenceNumber) { pVI->setIsCurrentItem(true); _currentPlanViewItem = pVI; @@ -2225,10 +2248,20 @@ void MissionController::setCurrentPlanViewIndex(int sequenceNumber, bool force) } } + if (takeoffIndex != -1 && sequenceNumber <= takeoffIndex) { + // Takeoff item was found which means mission starts from ground. + // Land is only valid after the takeoff item. + _isInsertLandValid = false; + } else if (foundLand) { + // Can't have to land sequences + _isInsertLandValid = false; + } + emit currentPlanViewIndexChanged(); emit currentPlanViewItemChanged(); emit splitSegmentChanged(); emit isInsertTakeoffValidChanged(); + emit isInsertLandValidChanged(); } } @@ -2252,23 +2285,23 @@ void MissionController::_updateTimeout() case MAV_CMD_NAV_TAKEOFF: case MAV_CMD_NAV_WAYPOINT: case MAV_CMD_NAV_LAND: - if(pSimpleItem->coordinate().isValid()) { - if((MAV_CMD)pSimpleItem->command() == MAV_CMD_NAV_TAKEOFF) { - takeoffCoordinate = pSimpleItem->coordinate(); - } else if(!firstCoordinate.isValid()) { - firstCoordinate = pSimpleItem->coordinate(); + if(pSimpleItem->coordinate().isValid()) { + if((MAV_CMD)pSimpleItem->command() == MAV_CMD_NAV_TAKEOFF) { + takeoffCoordinate = pSimpleItem->coordinate(); + } else if(!firstCoordinate.isValid()) { + firstCoordinate = pSimpleItem->coordinate(); + } + double lat = pSimpleItem->coordinate().latitude() + 90.0; + double lon = pSimpleItem->coordinate().longitude() + 180.0; + double alt = pSimpleItem->coordinate().altitude(); + north = fmax(north, lat); + south = fmin(south, lat); + east = fmax(east, lon); + west = fmin(west, lon); + minAlt = fmin(minAlt, alt); + maxAlt = fmax(maxAlt, alt); } - double lat = pSimpleItem->coordinate().latitude() + 90.0; - double lon = pSimpleItem->coordinate().longitude() + 180.0; - double alt = pSimpleItem->coordinate().altitude(); - north = fmax(north, lat); - south = fmin(south, lat); - east = fmax(east, lon); - west = fmin(west, lon); - minAlt = fmin(minAlt, alt); - maxAlt = fmax(maxAlt, alt); - } - break; + break; default: break; } @@ -2301,8 +2334,8 @@ void MissionController::_updateTimeout() } //-- Build bounding "cube" boundingCube = QGCGeoBoundingCube( - QGeoCoordinate(north - 90.0, west - 180.0, minAlt), - QGeoCoordinate(south - 90.0, east - 180.0, maxAlt)); + QGeoCoordinate(north - 90.0, west - 180.0, minAlt), + QGeoCoordinate(south - 90.0, east - 180.0, maxAlt)); if(_travelBoundingCube != boundingCube || _takeoffCoordinate != takeoffCoordinate) { _takeoffCoordinate = takeoffCoordinate; _travelBoundingCube = boundingCube; diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h index 0c9f073352bb9ba8e205fc4913b62cc29931bacd..1c5e226447071b77df7cdd9db62164448349fae6 100644 --- a/src/MissionManager/MissionController.h +++ b/src/MissionManager/MissionController.h @@ -93,6 +93,7 @@ public: Q_PROPERTY(QString corridorScanComplexItemName READ corridorScanComplexItemName CONSTANT) Q_PROPERTY(QString structureScanComplexItemName READ structureScanComplexItemName CONSTANT) Q_PROPERTY(bool isInsertTakeoffValid MEMBER _isInsertTakeoffValid NOTIFY isInsertTakeoffValidChanged) ///< true: Takeoff tool should be enabled + Q_PROPERTY(bool isInsertLandValid MEMBER _isInsertLandValid NOTIFY isInsertLandValidChanged) ///< true: Land tool should be enabled Q_INVOKABLE void removeMissionItem(int index); @@ -110,6 +111,13 @@ public: /// @return Newly created item Q_INVOKABLE VisualMissionItem* insertTakeoffItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem = false); + /// Add a new land item to the list + /// @param coordinate: Coordinate for item + /// @param visualItemIndex: index to insert at, -1 for end of list + /// @param makeCurrentItem: true: Make this item the current item + /// @return Newly created item + Q_INVOKABLE VisualMissionItem* insertLandItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem = false); + /// Add a new ROI mission item to the list /// @param coordinate: Coordinate for item /// @param visualItemIndex: index to insert at, -1 for end of list @@ -245,6 +253,7 @@ signals: void missionBoundingCubeChanged (void); void missionItemCountChanged (int missionItemCount); void isInsertTakeoffValidChanged (void); + void isInsertLandValidChanged (void); private slots: void _newMissionItemsAvailableFromVehicle(bool removeAllRequested); @@ -296,6 +305,7 @@ private: void _initLoadedVisualItems(QmlObjectListModel* loadedVisualItems); CoordinateVector* _addWaypointLineSegment(CoordVectHashTable& prevItemPairHashTable, VisualItemPair& pair); void _addTimeDistance(bool vtolInHover, double hoverTime, double cruiseTime, double extraTime, double distance, int seqNum); + VisualMissionItem* _insertSimpleMissionItemWorker(QGeoCoordinate coordinate, MAV_CMD command, int visualItemIndex, bool makeCurrentItem); void _insertComplexMissionItemWorker(ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem); void _warnIfTerrainFrameUsed(void); @@ -321,6 +331,7 @@ private: QGeoCoordinate _takeoffCoordinate; CoordinateVector* _splitSegment; bool _isInsertTakeoffValid = true; + bool _isInsertLandValid = true; static const char* _settingsGroup; diff --git a/src/MissionManager/StructureScanPlanCreator.cc b/src/MissionManager/StructureScanPlanCreator.cc index 566de61955576c5f74facb16eddbbfecbae6e9bb..25c02615dd613b7a14ed1f6b034542a56f8fc906 100644 --- a/src/MissionManager/StructureScanPlanCreator.cc +++ b/src/MissionManager/StructureScanPlanCreator.cc @@ -22,15 +22,7 @@ void StructureScanPlanCreator::createPlan(const QGeoCoordinate& mapCenterCoord) { _planMasterController->removeAll(); VisualMissionItem* takeoffItem = _missionController->insertTakeoffItem(mapCenterCoord, -1); - takeoffItem->setWizardMode(true); _missionController->insertComplexMissionItem(MissionController::patternStructureScanName, mapCenterCoord, -1)->setWizardMode(true); - if (_planMasterController->managerVehicle()->fixedWing()) { - FixedWingLandingComplexItem* landingItem = qobject_cast(_missionController->insertComplexMissionItem(MissionController::patternFWLandingName, mapCenterCoord, -1)); - landingItem->setWizardMode(true); - landingItem->setLoiterDragAngleOnly(true); - } else { - MissionSettingsItem* settingsItem = _missionController->visualItems()->value(0); - settingsItem->setMissionEndRTL(true); - } + _missionController->insertLandItem(mapCenterCoord, -1); _missionController->setCurrentPlanViewIndex(takeoffItem->sequenceNumber(), true); } diff --git a/src/MissionManager/SurveyPlanCreator.cc b/src/MissionManager/SurveyPlanCreator.cc index 872fc75ec6d2d9b68fe49e8f193ad48e294e8721..b4cc2cbfa6a7a6ce951e1dc05047cdad9c79dbfd 100644 --- a/src/MissionManager/SurveyPlanCreator.cc +++ b/src/MissionManager/SurveyPlanCreator.cc @@ -23,15 +23,7 @@ void SurveyPlanCreator::createPlan(const QGeoCoordinate& mapCenterCoord) { _planMasterController->removeAll(); VisualMissionItem* takeoffItem = _missionController->insertTakeoffItem(mapCenterCoord, -1); - takeoffItem->setWizardMode(true); - _missionController->insertComplexMissionItem(MissionController::patternSurveyName, mapCenterCoord, -1)->setWizardMode(true); - if (_planMasterController->managerVehicle()->fixedWing()) { - FixedWingLandingComplexItem* landingItem = qobject_cast(_missionController->insertComplexMissionItem(MissionController::patternFWLandingName, mapCenterCoord, -1)); - landingItem->setWizardMode(true); - landingItem->setLoiterDragAngleOnly(true); - } else { - MissionSettingsItem* settingsItem = _missionController->visualItems()->value(0); - settingsItem->setMissionEndRTL(true); - } + _missionController->insertComplexMissionItem(MissionController::patternSurveyName, mapCenterCoord, -1); + _missionController->insertLandItem(mapCenterCoord, -1); _missionController->setCurrentPlanViewIndex(takeoffItem->sequenceNumber(), true); } diff --git a/src/PlanView/PlanView.qml b/src/PlanView/PlanView.qml index 5d9e5912d5afc06819cc432ef8486a9eb8514c08..9c1a71e7cda114b97edb6a31875897a543e10dd1 100644 --- a/src/PlanView/PlanView.qml +++ b/src/PlanView/PlanView.qml @@ -629,7 +629,8 @@ Item { readonly property int waypointButtonIndex: 3 readonly property int roiButtonIndex: 4 readonly property int patternButtonIndex: 5 - readonly property int centerButtonIndex: 6 + readonly property int landButtonIndex: 6 + readonly property int centerButtonIndex: 7 property bool _isRally: _editingLayer == _layerRallyPoints @@ -677,6 +678,12 @@ Item { buttonVisible: !_isRally, dropPanelComponent: _singleComplexItem ? undefined : patternDropPanel }, + { + name: _planMasterController.controllerVehicle.fixedWing ? qsTr("Land") : qsTr("Return"), + iconSource: "/res/rtl.svg", + buttonEnabled: _missionController.isInsertLandValid, + buttonVisible: _editingLayer == _layerMission + }, { name: qsTr("Center"), iconSource: "/qmlimages/MapCenter.svg", @@ -714,6 +721,9 @@ Item { addComplexItem(_missionController.complexMissionItemNames[0]) } break + case landButtonIndex: + _missionController.insertLandItem(mapCenter(), _missionController.currentMissionIndex, true /* makeCurrentItem */) + break } } } @@ -1027,25 +1037,6 @@ Item { } } } - - Rectangle { - width: parent.width * 0.8 - height: 1 - color: qgcPal.text - opacity: 0.5 - Layout.fillWidth: true - Layout.columnSpan: 2 - } - - QGCButton { - text: qsTr("Load KML/SHP...") - Layout.fillWidth: true - enabled: !_planMasterController.syncInProgress - onClicked: { - _planMasterController.loadShapeFromSelectedFile() - dropPanel.hide() - } - } } // Column }