diff --git a/src/MissionManager/MavCmdInfoCommon.json b/src/MissionManager/MavCmdInfoCommon.json index c831f7e1b1eb47a456fe35d57b3d8ec08e2229d6..622e1cff1fddd14f1e4d9d7431d93c8580170b68 100644 --- a/src/MissionManager/MavCmdInfoCommon.json +++ b/src/MissionManager/MavCmdInfoCommon.json @@ -503,23 +503,23 @@ "label": "Type:", "enumStrings": "Airspeed,Ground Speed", "enumValues": "0,1", - "default": 1 + "default": 0 }, "param2": { "label": "Speed:", "units": "m/s", - "default": -1 + "default": 0 }, "param3": { "label": "Throttle:", "units": "%", - "default": -1 + "default": 0 }, "param4": { "label": "Offset:", "enumStrings": "Relative,Absolute", "enumValues": "1,0", - "default": 1 + "default": 0 } }, { diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 791e365b2e8a94278a441128d0ab641b3fb1aef3..38355adc398694347cfbd7f337c34a1049014e00 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -1155,6 +1155,7 @@ void MissionController::_initVisualItem(VisualMissionItem* visualItem) connect(visualItem, &VisualMissionItem::specifiesCoordinateChanged, this, &MissionController::_recalcWaypointLines); connect(visualItem, &VisualMissionItem::coordinateHasRelativeAltitudeChanged, this, &MissionController::_recalcWaypointLines); connect(visualItem, &VisualMissionItem::exitCoordinateHasRelativeAltitudeChanged, this, &MissionController::_recalcWaypointLines); + connect(visualItem, &VisualMissionItem::flightSpeedChanged, this, &MissionController::_recalcAltitudeRangeBearing); if (visualItem->isSimpleItem()) { // We need to track commandChanged on simple item since recalc has special handling for takeoff command diff --git a/src/MissionManager/MissionItem.cc b/src/MissionManager/MissionItem.cc index 0a50253a94f8088f0fcd27ef290fb48350cbea1c..bf8de33f96ea13ee3b176799373cadcbe08fd4fa 100644 --- a/src/MissionManager/MissionItem.cc +++ b/src/MissionManager/MissionItem.cc @@ -51,6 +51,8 @@ MissionItem::MissionItem(QObject* parent) _frameFact.setRawValue(MAV_FRAME_GLOBAL_RELATIVE_ALT); setAutoContinue(true); + + connect(&_param2Fact, &Fact::rawValueChanged, this, &MissionItem::_param2Changed); } MissionItem::MissionItem(int sequenceNumber, @@ -95,6 +97,8 @@ MissionItem::MissionItem(int sequenceNumber, _param5Fact.setRawValue(param5); _param6Fact.setRawValue(param6); _param7Fact.setRawValue(param7); + + connect(&_param2Fact, &Fact::rawValueChanged, this, &MissionItem::_param2Changed); } MissionItem::MissionItem(const MissionItem& other, QObject* parent) @@ -117,6 +121,8 @@ MissionItem::MissionItem(const MissionItem& other, QObject* parent) _frameFact.setRawValue(MAV_FRAME_GLOBAL_RELATIVE_ALT); *this = other; + + connect(&_param2Fact, &Fact::rawValueChanged, this, &MissionItem::_param2Changed); } const MissionItem& MissionItem::operator=(const MissionItem& other) @@ -139,8 +145,10 @@ const MissionItem& MissionItem::operator=(const MissionItem& other) return *this; } + MissionItem::~MissionItem() { + } void MissionItem::save(QJsonObject& json) const @@ -375,3 +383,21 @@ QGeoCoordinate MissionItem::coordinate(void) const { return QGeoCoordinate(param5(), param6(), param7()); } + +double MissionItem::flightSpeed(void) const +{ + double flightSpeed = std::numeric_limits::quiet_NaN(); + + if (_commandFact.rawValue().toInt() == MAV_CMD_DO_CHANGE_SPEED && _param2Fact.rawValue().toDouble() > 0) { + flightSpeed = _param2Fact.rawValue().toDouble(); + } + + return flightSpeed; +} + +void MissionItem::_param2Changed(QVariant value) +{ + if (_commandFact.rawValue().toInt() == MAV_CMD_DO_CHANGE_SPEED && _param2Fact.rawValue().toDouble() > 0) { + emit flightSpeedChanged(value.toDouble()); + } +} diff --git a/src/MissionManager/MissionItem.h b/src/MissionManager/MissionItem.h index 5d4b0f2dc5f7a7716b7629dec20a02ec70b594a5..5ed2b4ef0051a6e3101ea7ae31e12da134467342 100644 --- a/src/MissionManager/MissionItem.h +++ b/src/MissionManager/MissionItem.h @@ -76,6 +76,9 @@ public: QGeoCoordinate coordinate (void) const; int doJumpId (void) const { return _doJumpId; } + /// @return Flight speed change value if this item supports it. If not it returns NaN. + double flightSpeed (void) const; + void setCommand (MAV_CMD command); void setSequenceNumber (int sequenceNumber); void setIsCurrentItem (bool isCurrentItem); @@ -97,8 +100,12 @@ public: bool relativeAltitude(void) const { return frame() == MAV_FRAME_GLOBAL_RELATIVE_ALT; } signals: - void isCurrentItemChanged (bool isCurrentItem); - void sequenceNumberChanged (int sequenceNumber); + void isCurrentItemChanged (bool isCurrentItem); + void sequenceNumberChanged (int sequenceNumber); + void flightSpeedChanged (double flightSpeed); + +private slots: + void _param2Changed (QVariant value); private: bool _convertJsonV1ToV2(const QJsonObject& json, QJsonObject& v2Json, QString& errorString); diff --git a/src/MissionManager/SimpleMissionItem.cc b/src/MissionManager/SimpleMissionItem.cc index 22ecd6252989f486f32ed3fff773f6aaf44449c5..ccfdde11d12c4e08a1136bfa4d1a6c8b0ab554c2 100644 --- a/src/MissionManager/SimpleMissionItem.cc +++ b/src/MissionManager/SimpleMissionItem.cc @@ -71,6 +71,8 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, QObject* parent) _connectSignals(); setDefaultsForCommand(); + + connect(&_missionItem, &MissionItem::flightSpeedChanged, this, &SimpleMissionItem::flightSpeedChanged); } SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, const MissionItem& missionItem, QObject* parent) @@ -607,3 +609,8 @@ void SimpleMissionItem::setSequenceNumber(int sequenceNumber) emit abbreviationChanged(); } } + +double SimpleMissionItem::flightSpeed(void) +{ + return missionItem().flightSpeed(); +} diff --git a/src/MissionManager/SimpleMissionItem.h b/src/MissionManager/SimpleMissionItem.h index 9d3650c0ce17cd066cfed3473fd5fa9c7839c792..7efca0a6423d1b200a79eb9892b03254f239e7ae 100644 --- a/src/MissionManager/SimpleMissionItem.h +++ b/src/MissionManager/SimpleMissionItem.h @@ -91,6 +91,7 @@ public: QGeoCoordinate coordinate (void) const final { return _missionItem.coordinate(); } QGeoCoordinate exitCoordinate (void) const final { return coordinate(); } int sequenceNumber (void) const final { return _missionItem.sequenceNumber(); } + double flightSpeed (void) final; bool coordinateHasRelativeAltitude (void) const final { return _missionItem.relativeAltitude(); } bool exitCoordinateHasRelativeAltitude (void) const final { return coordinateHasRelativeAltitude(); } diff --git a/src/MissionManager/SurveyMissionItem.h b/src/MissionManager/SurveyMissionItem.h index d00974e77f2786fd428caf8f74fb42cae3620c9f..7f46a28ca01deee7b533164c5651615379a65800 100644 --- a/src/MissionManager/SurveyMissionItem.h +++ b/src/MissionManager/SurveyMissionItem.h @@ -97,6 +97,7 @@ public: QGeoCoordinate coordinate (void) const final { return _coordinate; } QGeoCoordinate exitCoordinate (void) const final { return _exitCoordinate; } int sequenceNumber (void) const final { return _sequenceNumber; } + double flightSpeed (void) final { return std::numeric_limits::quiet_NaN(); } bool coordinateHasRelativeAltitude (void) const final { return _gridAltitudeRelative; } bool exitCoordinateHasRelativeAltitude (void) const final { return _gridAltitudeRelative; } diff --git a/src/MissionManager/VisualMissionItem.h b/src/MissionManager/VisualMissionItem.h index 32bc65aad05108fea0e750bedffff56fcfb12225..ab2612b7879d97ad3673677f91a63c5032d48a13 100644 --- a/src/MissionManager/VisualMissionItem.h +++ b/src/MissionManager/VisualMissionItem.h @@ -40,13 +40,16 @@ public: const VisualMissionItem& operator=(const VisualMissionItem& other); - // The following properties are calculated/set by the MissionControll recalc methods + // The following properties are calculated/set by the MissionController recalc methods Q_PROPERTY(double altDifference READ altDifference WRITE setAltDifference NOTIFY altDifferenceChanged) ///< Change in altitude from previous waypoint Q_PROPERTY(double altPercent READ altPercent WRITE setAltPercent NOTIFY altPercentChanged) ///< Percent of total altitude change in mission altitude Q_PROPERTY(double azimuth READ azimuth WRITE setAzimuth NOTIFY azimuthChanged) ///< Azimuth to previous waypoint Q_PROPERTY(double distance READ distance WRITE setDistance NOTIFY distanceChanged) ///< Distance to previous waypoint + /// This property returns whether the item supports changing flight speed. If it does not it will return NaN. + Q_PROPERTY(double flightSpeed READ flightSpeed NOTIFY flightSpeedChanged) + // Visual mission items have two coordinates associated with them: /// This is the entry point for a waypoint line into the item. For a simple item it is also the location of the item @@ -110,6 +113,7 @@ public: virtual QGeoCoordinate coordinate (void) const = 0; virtual QGeoCoordinate exitCoordinate (void) const = 0; virtual int sequenceNumber (void) const = 0; + virtual double flightSpeed (void) = 0; virtual bool coordinateHasRelativeAltitude (void) const = 0; virtual bool exitCoordinateHasRelativeAltitude (void) const = 0; @@ -143,6 +147,7 @@ signals: void isSimpleItemChanged (bool isSimpleItem); void specifiesCoordinateChanged (void); void isStandaloneCoordinateChanged (void); + void flightSpeedChanged (double flightSpeed); void coordinateHasRelativeAltitudeChanged (bool coordinateHasRelativeAltitude); void exitCoordinateHasRelativeAltitudeChanged (bool exitCoordinateHasRelativeAltitude);