diff --git a/src/MissionManager/ComplexMissionItem.h b/src/MissionManager/ComplexMissionItem.h index dc1b0d661e3780f049f9c7381f816f0d16ab6f9b..41472110e79b98ca501339265c796e21d9a98455 100644 --- a/src/MissionManager/ComplexMissionItem.h +++ b/src/MissionManager/ComplexMissionItem.h @@ -27,9 +27,6 @@ public: /// Signals complexDistanceChanged virtual double complexDistance(void) const = 0; - /// @return Amount of additional time delay in seconds needed to fly the complex item - virtual double additionalTimeDelay(void) const { return 0; } - /// Load the complex mission item from Json /// @param complexObject Complex mission item json object /// @param sequenceNumber Sequence number for first MISSION_ITEM in survey @@ -46,10 +43,13 @@ public: /// This mission item attribute specifies the type of the complex item. static const char* jsonComplexItemTypeKey; + // Overrides from VisualMissionItem + double additionalTimeDelay(void) const final { return 0; } + + signals: void complexDistanceChanged (void); void greatestDistanceToChanged (void); - void additionalTimeDelayChanged (void); }; #endif diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 1f87f6f1e2d66536b2574fc1ec4f6c2223519117..6682ec14dca43a6d237ccd02e44f507b8e3b52d9 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -1193,26 +1193,6 @@ void MissionController::_addCruiseTime(double cruiseTime, double cruiseDistance, _updateBatteryInfo(waypointIndex); } -/// Adds additional time to a mission as specified by the command -void MissionController::_addCommandTimeDelay(SimpleMissionItem* simpleItem, bool vtolInHover) -{ - double seconds = 0; - - if (!simpleItem) { - return; - } - - // This routine is currently quite minimal and only handles the simple cases. - switch ((int)simpleItem->command()) { - case MAV_CMD_NAV_WAYPOINT: - case MAV_CMD_CONDITION_DELAY: - seconds = simpleItem->missionItem().param1(); - break; - } - - _addTimeDistance(vtolInHover, 0, 0, seconds, 0, -1); -} - /// Adds the specified time to the appropriate hover or cruise time values. /// @param vtolInHover true: vtol is currrent in hover mode /// @param hoverTime Amount of time tp add to hover @@ -1367,8 +1347,7 @@ void MissionController::_recalcMissionFlightStatus() } } - // Check for command specific time delays - _addCommandTimeDelay(simpleItem, vtolInHover); + _addTimeDistance(vtolInHover, 0, 0, item->additionalTimeDelay(), 0, -1); if (item->specifiesCoordinate()) { // Keep track of the min/max altitude for all waypoints so we can show altitudes as a percentage @@ -1419,8 +1398,7 @@ void MissionController::_recalcMissionFlightStatus() double hoverTime = distance / _missionFlightStatus.hoverSpeed; double cruiseTime = distance / _missionFlightStatus.cruiseSpeed; - double extraTime = complexItem->additionalTimeDelay(); - _addTimeDistance(vtolInHover, hoverTime, cruiseTime, extraTime, distance, item->sequenceNumber()); + _addTimeDistance(vtolInHover, hoverTime, cruiseTime, 0, distance, item->sequenceNumber()); } item->setMissionFlightStatus(_missionFlightStatus); @@ -1609,6 +1587,7 @@ void MissionController::_initVisualItem(VisualMissionItem* visualItem) connect(visualItem, &VisualMissionItem::specifiedGimbalYawChanged, this, &MissionController::_recalcMissionFlightStatus); connect(visualItem, &VisualMissionItem::specifiedGimbalPitchChanged, this, &MissionController::_recalcMissionFlightStatus); connect(visualItem, &VisualMissionItem::terrainAltitudeChanged, this, &MissionController::_recalcMissionFlightStatus); + connect(visualItem, &VisualMissionItem::additionalTimeDelayChanged, this, &MissionController::_recalcMissionFlightStatus); connect(visualItem, &VisualMissionItem::lastSequenceNumberChanged, this, &MissionController::_recalcSequence); if (visualItem->isSimpleItem()) { @@ -1624,7 +1603,6 @@ void MissionController::_initVisualItem(VisualMissionItem* visualItem) if (complexItem) { connect(complexItem, &ComplexMissionItem::complexDistanceChanged, this, &MissionController::_recalcMissionFlightStatus); connect(complexItem, &ComplexMissionItem::greatestDistanceToChanged, this, &MissionController::_recalcMissionFlightStatus); - connect(complexItem, &ComplexMissionItem::additionalTimeDelayChanged, this, &MissionController::_recalcMissionFlightStatus); } else { qWarning() << "ComplexMissionItem not found"; } diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h index 4a2fda27cd6dd49895776a1192a7f4059be9c608..b70f82e6aa3bf692d5ea71d47c56f2fc125f72e9 100644 --- a/src/MissionManager/MissionController.h +++ b/src/MissionManager/MissionController.h @@ -254,7 +254,6 @@ private: bool _loadItemsFromJson(const QJsonObject& json, QmlObjectListModel* visualItems, QString& errorString); void _initLoadedVisualItems(QmlObjectListModel* loadedVisualItems); void _addWaypointLineSegment(CoordVectHashTable& prevItemPairHashTable, VisualItemPair& pair); - void _addCommandTimeDelay(SimpleMissionItem* simpleItem, bool vtolInHover); void _addTimeDistance(bool vtolInHover, double hoverTime, double cruiseTime, double extraTime, double distance, int seqNum); int _insertComplexMissionItemWorker(ComplexMissionItem* complexItem, int i); diff --git a/src/MissionManager/SimpleMissionItem.cc b/src/MissionManager/SimpleMissionItem.cc index e24f2a0957757b62ea119b663a8afb01cb42efd9..36a0dcbd2a91fc04d79049e3898197fb6b35dd5f 100644 --- a/src/MissionManager/SimpleMissionItem.cc +++ b/src/MissionManager/SimpleMissionItem.cc @@ -205,6 +205,8 @@ void SimpleMissionItem::_connectSignals(void) connect(&_missionItem._param6Fact, &Fact::valueChanged, this, &SimpleMissionItem::_sendCoordinateChanged); connect(&_missionItem._param7Fact, &Fact::valueChanged, this, &SimpleMissionItem::_sendCoordinateChanged); + connect(&_missionItem._param1Fact, &Fact::valueChanged, this, &SimpleMissionItem::_possibleAdditionalTimeDelayChanged); + // The following changes may also change friendlyEditAllowed connect(&_missionItem._autoContinueFact, &Fact::valueChanged, this, &SimpleMissionItem::_sendFriendlyEditAllowedChanged); connect(&_missionItem._commandFact, &Fact::valueChanged, this, &SimpleMissionItem::_sendFriendlyEditAllowedChanged); @@ -951,3 +953,28 @@ void SimpleMissionItem::setAltitudeMode(AltitudeMode altitudeMode) emit altitudeModeChanged(); } } + +double SimpleMissionItem::additionalTimeDelay(void) const +{ + switch (command()) { + case MAV_CMD_NAV_WAYPOINT: + case MAV_CMD_CONDITION_DELAY: + case MAV_CMD_NAV_DELAY: + return missionItem().param1(); + default: + return 0; + } +} + +void SimpleMissionItem::_possibleAdditionalTimeDelayChanged(void) +{ + switch (command()) { + case MAV_CMD_NAV_WAYPOINT: + case MAV_CMD_CONDITION_DELAY: + case MAV_CMD_NAV_DELAY: + emit additionalTimeDelayChanged(); + break; + } + + return; +} diff --git a/src/MissionManager/SimpleMissionItem.h b/src/MissionManager/SimpleMissionItem.h index b172b14e5c0e2e8a8cd736b0f596238e2d9e2e22..886d6f4cdc812ca9e67eed78d375be5216d7bd32 100644 --- a/src/MissionManager/SimpleMissionItem.h +++ b/src/MissionManager/SimpleMissionItem.h @@ -122,6 +122,7 @@ public: void applyNewAltitude (double newAltitude) final; void setMissionFlightStatus (MissionController::MissionFlightStatus_t& missionFlightStatus) final; bool readyForSave (void) const final; + double additionalTimeDelay (void) const final; bool coordinateHasRelativeAltitude (void) const final { return _missionItem.relativeAltitude(); } bool exitCoordinateHasRelativeAltitude (void) const final { return coordinateHasRelativeAltitude(); } @@ -147,17 +148,18 @@ signals: void supportsTerrainFrameChanged(void); private slots: - void _setDirty (void); - void _sectionDirtyChanged (bool dirty); - void _sendCommandChanged (void); - void _sendCoordinateChanged (void); - void _sendFriendlyEditAllowedChanged(void); - void _altitudeChanged (void); - void _altitudeModeChanged (void); - void _terrainAltChanged (void); - void _updateLastSequenceNumber (void); - void _rebuildFacts (void); - void _rebuildTextFieldFacts (void); + void _setDirty (void); + void _sectionDirtyChanged (bool dirty); + void _sendCommandChanged (void); + void _sendCoordinateChanged (void); + void _sendFriendlyEditAllowedChanged (void); + void _altitudeChanged (void); + void _altitudeModeChanged (void); + void _terrainAltChanged (void); + void _updateLastSequenceNumber (void); + void _rebuildFacts (void); + void _rebuildTextFieldFacts (void); + void _possibleAdditionalTimeDelayChanged(void); private: void _connectSignals (void); diff --git a/src/MissionManager/SurveyComplexItem.cc b/src/MissionManager/SurveyComplexItem.cc index ad96827c787b1b211739870ffe6d3585937c3d43..ca4c790b4c918c0e1430d878b74eed7d99a6b677 100644 --- a/src/MissionManager/SurveyComplexItem.cc +++ b/src/MissionManager/SurveyComplexItem.cc @@ -442,108 +442,6 @@ void SurveyComplexItem::_adjustTransectsToEntryPointLocation(QList polygonPoints; - QList> transectSegments; - - // Convert polygon to NED - QGeoCoordinate tangentOrigin = _mapPolygon.pathModel().value(0)->coordinate(); - qCDebug(SurveyComplexItemLog) << "Convert polygon to NED - tangentOrigin" << tangentOrigin; - for (int i=0; i<_mapPolygon.count(); i++) { - double y, x, down; - QGeoCoordinate vertex = _mapPolygon.pathModel().value(i)->coordinate(); - if (i == 0) { - // This avoids a nan calculation that comes out of convertGeoToNed - x = y = 0; - } else { - convertGeoToNed(vertex, tangentOrigin, &y, &x, &down); - } - polygonPoints += QPointF(x, y); - qCDebug(SurveyComplexItemLog) << "vertex:x:y" << vertex << polygonPoints.last().x() << polygonPoints.last().y(); - } - - double coveredArea = 0.0; - for (int i=0; i(); - QGeoCoordinate coord2 = _simpleGridPoints[i].value(); - surveyDistance += coord1.distanceTo(coord2); - } - _setSurveyDistance(surveyDistance); - - if (cameraShots == 0 && _triggerCamera()) { - cameraShots = (int)floor(surveyDistance / _triggerDistance()); - // Take into account immediate camera trigger at waypoint entry - cameraShots++; - } - _setCameraShots(cameraShots); - - if (_hoverAndCaptureEnabled()) { - _additionalFlightDelaySeconds = cameraShots * _hoverAndCaptureDelaySeconds; - } - emit additionalTimeDelayChanged(); - - emit gridPointsChanged(); - - // Determine command count for lastSequenceNumber - _missionCommandCount = _calcMissionCommandCount(_transectSegments); - _missionCommandCount += _calcMissionCommandCount(_reflyTransectSegments); - emit lastSequenceNumberChanged(lastSequenceNumber()); - - // Set exit coordinate - if (_simpleGridPoints.count()) { - QGeoCoordinate coordinate = _simpleGridPoints.first().value(); - coordinate.setAltitude(_gridAltitudeFact.rawValue().toDouble()); - setCoordinate(coordinate); - QGeoCoordinate exitCoordinate = _simpleGridPoints.last().value(); - exitCoordinate.setAltitude(_gridAltitudeFact.rawValue().toDouble()); - _setExitCoordinate(exitCoordinate); - } - - setDirty(true); -} -#endif - QPointF SurveyComplexItem::_rotatePoint(const QPointF& point, const QPointF& origin, double angle) { QPointF rotated; diff --git a/src/MissionManager/VisualMissionItem.h b/src/MissionManager/VisualMissionItem.h index 7050c6886aa4ba2026427cf9e314ac78f9c7ae66..5f3b620387ea208085f9179c6793cd500dc18b95 100644 --- a/src/MissionManager/VisualMissionItem.h +++ b/src/MissionManager/VisualMissionItem.h @@ -151,6 +151,9 @@ public: /// Adjust the altitude of the item if appropriate to the new altitude. virtual void applyNewAltitude(double newAltitude) = 0; + /// @return Amount of additional time delay in seconds needed to fly this item + virtual double additionalTimeDelay(void) const = 0; + double missionGimbalYaw (void) const { return _missionGimbalYaw; } double missionVehicleYaw (void) const { return _missionVehicleYaw; } void setMissionVehicleYaw(double vehicleYaw); @@ -184,6 +187,7 @@ signals: void missionGimbalYawChanged (double missionGimbalYaw); void missionVehicleYawChanged (double missionVehicleYaw); void terrainAltitudeChanged (double terrainAltitude); + void additionalTimeDelayChanged (void); void coordinateHasRelativeAltitudeChanged (bool coordinateHasRelativeAltitude); void exitCoordinateHasRelativeAltitudeChanged (bool exitCoordinateHasRelativeAltitude);