diff --git a/src/MissionManager/MissionCommandUIInfo.cc b/src/MissionManager/MissionCommandUIInfo.cc index 6f2838e5293054a7f7409247f3adbf8532bf197f..cc664d0f7a1ba24077c2badadea250531b98166f 100644 --- a/src/MissionManager/MissionCommandUIInfo.cc +++ b/src/MissionManager/MissionCommandUIInfo.cc @@ -37,6 +37,7 @@ const char* MissionCommandUIInfo::_rawNameJsonKey = "rawName"; const char* MissionCommandUIInfo::_standaloneCoordinateJsonKey = "standaloneCoordinate"; const char* MissionCommandUIInfo::_specifiesCoordinateJsonKey = "specifiesCoordinate"; const char* MissionCommandUIInfo::_specifiesAltitudeOnlyJsonKey = "specifiesAltitudeOnly"; +const char* MissionCommandUIInfo::_isLandCommandJsonKey = "isLandCommand"; const char* MissionCommandUIInfo::_unitsJsonKey = "units"; const char* MissionCommandUIInfo::_commentJsonKey = "comment"; const char* MissionCommandUIInfo::_advancedCategory = "Advanced"; @@ -164,6 +165,15 @@ bool MissionCommandUIInfo::specifiesAltitudeOnly(void) const } } +bool MissionCommandUIInfo::isLandCommand(void) const +{ + if (_infoMap.contains(_isLandCommandJsonKey)) { + return _infoMap[_isLandCommandJsonKey].toBool(); + } else { + return false; + } +} + void MissionCommandUIInfo::_overrideInfo(MissionCommandUIInfo* uiInfo) { // Override info values @@ -199,7 +209,7 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ QStringList allKeys; allKeys << _idJsonKey << _rawNameJsonKey << _friendlyNameJsonKey << _descriptionJsonKey << _standaloneCoordinateJsonKey << _specifiesCoordinateJsonKey <<_friendlyEditJsonKey << _param1JsonKey << _param2JsonKey << _param3JsonKey << _param4JsonKey << _param5JsonKey << _param6JsonKey << _param7JsonKey - << _paramRemoveJsonKey << _categoryJsonKey << _specifiesAltitudeOnlyJsonKey; + << _paramRemoveJsonKey << _categoryJsonKey << _specifiesAltitudeOnlyJsonKey << _isLandCommandJsonKey; // Look for unknown keys in top level object for (const QString& key: jsonObject.keys()) { @@ -231,7 +241,7 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ QList types; types << QJsonValue::Double << QJsonValue::String << QJsonValue::String<< QJsonValue::String << QJsonValue::Bool << QJsonValue::Bool << QJsonValue::Bool << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object - << QJsonValue::String << QJsonValue::String << QJsonValue::Bool; + << QJsonValue::String << QJsonValue::String << QJsonValue::Bool << QJsonValue::Bool; if (!JsonHelper::validateKeyTypes(jsonObject, allKeys, types, internalError)) { errorString = _loadErrorString(internalError); return false; @@ -262,6 +272,9 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ if (jsonObject.contains(_specifiesAltitudeOnlyJsonKey)) { _infoMap[_specifiesAltitudeOnlyJsonKey] = jsonObject.value(_specifiesAltitudeOnlyJsonKey).toBool(); } + if (jsonObject.contains(_isLandCommandJsonKey)) { + _infoMap[_isLandCommandJsonKey] = jsonObject.value(_isLandCommandJsonKey).toBool(); + } if (jsonObject.contains(_friendlyEditJsonKey)) { _infoMap[_friendlyEditJsonKey] = jsonObject.value(_friendlyEditJsonKey).toVariant(); } @@ -289,6 +302,9 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ if (!_infoAvailable(_specifiesCoordinateJsonKey)) { _setInfoValue(_specifiesCoordinateJsonKey, false); } + if (!_infoAvailable(_isLandCommandJsonKey)) { + _setInfoValue(_isLandCommandJsonKey, false); + } if (!_infoAvailable(_friendlyEditJsonKey)) { _setInfoValue(_friendlyEditJsonKey, false); } diff --git a/src/MissionManager/MissionCommandUIInfo.h b/src/MissionManager/MissionCommandUIInfo.h index 0aee38d802d7e7839fff6c7bf5e6db57682b5f58..92201ba16a7db2bb8f4ee80bc9037982337e2d16 100644 --- a/src/MissionManager/MissionCommandUIInfo.h +++ b/src/MissionManager/MissionCommandUIInfo.h @@ -96,6 +96,7 @@ private: /// specifiesCoordinate bool false true: Command specifies a lat/lon/alt coordinate /// specifiesAltitudeOnly bool false true: Command specifies an altitude only (no coordinate) /// standaloneCoordinate bool false true: Vehicle does not fly through coordinate associated with command (exampl: ROI) +/// isLandCommand bool false true: Command specifies a land command (LAND, VTOL_LAND, ...) /// friendlyEdit bool false true: Command supports friendly editing dialog, false: Command supports 'Show all values" style editing only /// category string Advanced Category which this command belongs to /// paramRemove string Used by an override to remove params, example: "1,3" will remove params 1 and 3 on the override @@ -118,6 +119,7 @@ public: Q_PROPERTY(bool isStandaloneCoordinate READ isStandaloneCoordinate CONSTANT) Q_PROPERTY(bool specifiesCoordinate READ specifiesCoordinate CONSTANT) Q_PROPERTY(bool specifiesAltitudeOnly READ specifiesAltitudeOnly CONSTANT) + Q_PROPERTY(bool isLandCommand READ isLandCommand CONSTANT) Q_PROPERTY(int command READ intCommand CONSTANT) MAV_CMD command(void) const { return _command; } @@ -131,6 +133,7 @@ public: bool isStandaloneCoordinate (void) const; bool specifiesCoordinate (void) const; bool specifiesAltitudeOnly (void) const; + bool isLandCommand (void) const; /// Load the data in the object from the specified json /// @param jsonObject Json object to load from @@ -190,6 +193,7 @@ private: static const char* _standaloneCoordinateJsonKey; static const char* _specifiesCoordinateJsonKey; static const char* _specifiesAltitudeOnlyJsonKey; + static const char* _isLandCommandJsonKey; static const char* _unitsJsonKey; static const char* _commentJsonKey; static const char* _advancedCategory; diff --git a/src/MissionManager/SimpleMissionItem.cc b/src/MissionManager/SimpleMissionItem.cc index b4308bdae2c143d8d1596a1ee905733220b0805b..e8191291fd2e9a9a31164fda2dfca49400ff6a2f 100644 --- a/src/MissionManager/SimpleMissionItem.cc +++ b/src/MissionManager/SimpleMissionItem.cc @@ -182,6 +182,7 @@ void SimpleMissionItem::_connectSignals(void) connect(&_missionItem._commandFact, &Fact::valueChanged, this, &SimpleMissionItem::specifiesCoordinateChanged); connect(&_missionItem._commandFact, &Fact::valueChanged, this, &SimpleMissionItem::specifiesAltitudeOnlyChanged); connect(&_missionItem._commandFact, &Fact::valueChanged, this, &SimpleMissionItem::isStandaloneCoordinateChanged); + connect(&_missionItem._commandFact, &Fact::valueChanged, this, &SimpleMissionItem::isLandCommandChanged); // Whenever these properties change the ui model changes as well connect(this, &SimpleMissionItem::commandChanged, this, &SimpleMissionItem::_rebuildFacts); @@ -743,21 +744,13 @@ void SimpleMissionItem::_setDefaultsForCommand(void) } } - switch (command) { - case MAV_CMD_NAV_WAYPOINT: + if (command == MAV_CMD_NAV_WAYPOINT) { // We default all acceptance radius to 0. This allows flight controller to be in control of // accept radius. _missionItem.setParam2(0); - break; - - case MAV_CMD_NAV_LAND: - case MAV_CMD_NAV_VTOL_LAND: - case MAV_CMD_DO_SET_ROI_LOCATION: + } else if (uiInfo->isLandCommand() || command == MAV_CMD_DO_SET_ROI_LOCATION) { _altitudeFact.setRawValue(0); _missionItem.setParam7(0); - break; - default: - break; } _missionItem.setAutoContinue(true); @@ -984,3 +977,10 @@ void SimpleMissionItem::_possibleAdditionalTimeDelayChanged(void) return; } + +bool SimpleMissionItem::isLandCommand(void) const +{ + MAV_CMD command = static_cast(this->command()); + const MissionCommandUIInfo* uiInfo = _commandTree->getUIInfo(_vehicle, command); + return uiInfo->isLandCommand(); +} diff --git a/src/MissionManager/SimpleMissionItem.h b/src/MissionManager/SimpleMissionItem.h index 491e0d35b832f904872d03a8bda4f2a2f61274be..5c7fc569556b4556ac670048c76b939f50ec4bd5 100644 --- a/src/MissionManager/SimpleMissionItem.h +++ b/src/MissionManager/SimpleMissionItem.h @@ -100,6 +100,7 @@ public: bool dirty (void) const override { return _dirty; } bool isSimpleItem (void) const final { return true; } bool isStandaloneCoordinate (void) const final; + bool isLandCommand (void) const final; bool specifiesCoordinate (void) const final; bool specifiesAltitudeOnly (void) const final; QString commandDescription (void) const final; diff --git a/src/MissionManager/VisualMissionItem.h b/src/MissionManager/VisualMissionItem.h index 847e0e808e5d5ac17e91c56dcd4248ca34c56894..616e7f58e3a3563e9083117454951d1c77ab9b30 100644 --- a/src/MissionManager/VisualMissionItem.h +++ b/src/MissionManager/VisualMissionItem.h @@ -68,6 +68,7 @@ public: Q_PROPERTY(bool specifiesAltitudeOnly READ specifiesAltitudeOnly NOTIFY specifiesAltitudeOnlyChanged) ///< true: Item has altitude only, no full coordinate Q_PROPERTY(bool isSimpleItem READ isSimpleItem NOTIFY isSimpleItemChanged) ///< Simple or Complex MissionItem Q_PROPERTY(bool isTakeoffItem READ isTakeoffItem NOTIFY isTakeoffItemChanged) ///< true: Takeoff item special case + Q_PROPERTY(bool isLandCommand READ isLandCommand NOTIFY isLandCommandChanged) ///< true: Takeoff item special case Q_PROPERTY(QString editorQml MEMBER _editorQml CONSTANT) ///< Qml code for editing this item Q_PROPERTY(QString mapVisualQML READ mapVisualQML CONSTANT) ///< QMl code for map visuals Q_PROPERTY(double specifiedFlightSpeed READ specifiedFlightSpeed NOTIFY specifiedFlightSpeedChanged) ///< NaN for not specified @@ -131,6 +132,7 @@ public: virtual bool dirty (void) const = 0; virtual bool isSimpleItem (void) const = 0; virtual bool isTakeoffItem (void) const { return false; } + virtual bool isLandCommand (void) const { return false; } virtual bool isStandaloneCoordinate (void) const = 0; virtual bool specifiesCoordinate (void) const = 0; virtual bool specifiesAltitudeOnly (void) const = 0; @@ -208,6 +210,7 @@ signals: void sequenceNumberChanged (int sequenceNumber); void isSimpleItemChanged (bool isSimpleItem); void isTakeoffItemChanged (bool isTakeoffItem); + void isLandCommandChanged (void); void specifiesCoordinateChanged (void); void isStandaloneCoordinateChanged (void); void specifiesAltitudeOnlyChanged (void);