diff --git a/src/FirmwarePlugin/PX4/MavCmdInfoCommon.json b/src/FirmwarePlugin/PX4/MavCmdInfoCommon.json index 68131978a5d8caafeed6994aad0cf8fbf8033963..90d622990a0f17008ebd07d3ef7c3bebe3680ef3 100644 --- a/src/FirmwarePlugin/PX4/MavCmdInfoCommon.json +++ b/src/FirmwarePlugin/PX4/MavCmdInfoCommon.json @@ -7,7 +7,7 @@ { "id": 16, "comment": "MAV_CMD_NAV_WAYPOINT", - "paramRemove": "2,3,4" + "paramRemove": "2,3" }, { "id": 21, diff --git a/src/FirmwarePlugin/PX4/MavCmdInfoMultiRotor.json b/src/FirmwarePlugin/PX4/MavCmdInfoMultiRotor.json index a4dc8d0b68df15371e716a78b2cf8b5a07fac18b..95da511f1e8c1cbbbf0feaeea72a597309e09321 100644 --- a/src/FirmwarePlugin/PX4/MavCmdInfoMultiRotor.json +++ b/src/FirmwarePlugin/PX4/MavCmdInfoMultiRotor.json @@ -14,13 +14,13 @@ "id": 18, "comment": "MAV_CMD_NAV_LOITER_TURNS", "description": "Travel to a position and Loiter for a number of turns.", - "paramRemove": "3,4" + "paramRemove": "3" }, { "id": 19, "comment": "MAV_CMD_NAV_LOITER_TIME", "description": "Travel to a position and Loiter for an amount of time.", - "paramRemove": "3,4" + "paramRemove": "3" }, { "id": 22, diff --git a/src/MissionManager/MavCmdInfoCommon.json b/src/MissionManager/MavCmdInfoCommon.json index c76fae56790f0cf7709f794a90b4d841bf682c91..b9c36568edae956ee41bacc9f31fcd00ee83d549 100644 --- a/src/MissionManager/MavCmdInfoCommon.json +++ b/src/MissionManager/MavCmdInfoCommon.json @@ -54,7 +54,7 @@ "param4": { "label": "Heading", "units": "radians", - "default": 0.0, + "nanUnchanged": true, "decimalPlaces": 2 } }, @@ -71,6 +71,12 @@ "units": "m", "default": 50.0, "decimalPlaces": 2 + }, + "param4": { + "label": "Heading", + "units": "radians", + "nanUnchanged": true, + "decimalPlaces": 2 } }, { @@ -93,11 +99,10 @@ "decimalPlaces": 2 }, "param4": { - "label": "Exit loiter from", - "enumStrings": "Center,Tangent", - "enumValues": "0,1", - "default": 1, - "decimalPlaces": 0 + "label": "Heading", + "units": "radians", + "nanUnchanged": true, + "decimalPlaces": 2 } }, { @@ -121,11 +126,10 @@ "decimalPlaces": 2 }, "param4": { - "label": "Exit loiter from", - "enumStrings": "Center,Tangent", - "enumValues": "0,1", - "default": 1, - "decimalPlaces": 0 + "label": "Heading", + "units": "radians", + "nanUnchanged": true, + "decimalPlaces": 2 } }, { @@ -153,7 +157,7 @@ "param4": { "label": "Heading", "units": "radians", - "default": 0.0, + "nanUnchanged": true, "decimalPlaces": 2 } }, @@ -174,7 +178,7 @@ "param4": { "label": "Heading", "units": "radians", - "default": 0.0, + "nanUnchanged": true, "decimalPlaces": 2 } }, @@ -312,7 +316,7 @@ "param4": { "label": "Heading", "units": "deg", - "default": 0.0, + "nanUnchanged": true, "decimalPlaces": 2 } }, @@ -327,7 +331,7 @@ "param4": { "label": "Heading", "units": "deg", - "default": 0.0, + "nanUnchanged": true, "decimalPlaces": 2 } }, diff --git a/src/MissionManager/MavCmdInfoFixedWing.json b/src/MissionManager/MavCmdInfoFixedWing.json index ef2b54a57333a260afae992a5273a0ab1ceb6712..cb37109cf7416665e9ac1c9266e0aad90f15b19b 100644 --- a/src/MissionManager/MavCmdInfoFixedWing.json +++ b/src/MissionManager/MavCmdInfoFixedWing.json @@ -8,6 +8,43 @@ "id": 16, "comment": "MAV_CMD_NAV_WAYPOINT", "paramRemove": "4" + }, + { + "id": 17, + "comment": "MAV_CMD_NAV_LOITER_UNLIM", + "paramRemove": "4" + }, + { + "id": 18, + "comment": "MAV_CMD_NAV_LOITER_TURNS", + "param4": { + "label": "Exit loiter from", + "enumStrings": "Center,Tangent", + "enumValues": "0,1", + "default": 1, + "decimalPlaces": 0 + } + }, + { + "id": 19, + "comment": "MAV_CMD_NAV_LOITER_TIME", + "param4": { + "label": "Exit loiter from", + "enumStrings": "Center,Tangent", + "enumValues": "0,1", + "default": 1, + "decimalPlaces": 0 + } + }, + { + "id": 21, + "comment": "MAV_CMD_NAV_LAND", + "paramRemove": "4" + }, + { + "id": 22, + "comment": "MAV_CMD_NAV_TAKEOFF", + "paramRemove": "4" } ] } diff --git a/src/MissionManager/MissionCommandUIInfo.cc b/src/MissionManager/MissionCommandUIInfo.cc index af747eade9fa6034e1b6d1bdf4163f96d1a10404..c29dbd000699ca507f82dc10b5b04f655aed3fc3 100644 --- a/src/MissionManager/MissionCommandUIInfo.cc +++ b/src/MissionManager/MissionCommandUIInfo.cc @@ -18,6 +18,7 @@ const char* MissionCommandUIInfo::_defaultJsonKey = "default"; const char* MissionCommandUIInfo::_descriptionJsonKey = "description"; const char* MissionCommandUIInfo::_enumStringsJsonKey = "enumStrings"; const char* MissionCommandUIInfo::_enumValuesJsonKey = "enumValues"; +const char* MissionCommandUIInfo::_nanUnchangedJsonKey = "nanUnchanged"; const char* MissionCommandUIInfo::_friendlyEditJsonKey = "friendlyEdit"; const char* MissionCommandUIInfo::_friendlyNameJsonKey = "friendlyName"; const char* MissionCommandUIInfo::_idJsonKey = "id"; @@ -62,6 +63,7 @@ const MissionCmdParamInfo& MissionCmdParamInfo::operator=(const MissionCmdParamI _label = other._label; _param = other._param; _units = other._units; + _nanUnchanged = other._nanUnchanged; return *this; } @@ -333,7 +335,7 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ QJsonObject paramObject = jsonObject.value(paramKey).toObject(); QStringList allParamKeys; - allParamKeys << _defaultJsonKey << _decimalPlacesJsonKey << _enumStringsJsonKey << _enumValuesJsonKey << _labelJsonKey << _unitsJsonKey; + allParamKeys << _defaultJsonKey << _decimalPlacesJsonKey << _enumStringsJsonKey << _enumValuesJsonKey << _labelJsonKey << _unitsJsonKey << _nanUnchangedJsonKey; // Look for unknown keys in param object foreach (const QString& key, paramObject.keys()) { @@ -345,7 +347,7 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ // Validate key types QList types; - types << QJsonValue::Double << QJsonValue::Double << QJsonValue::String << QJsonValue::String << QJsonValue::String << QJsonValue::String; + types << QJsonValue::Double << QJsonValue::Double << QJsonValue::String << QJsonValue::String << QJsonValue::String << QJsonValue::String << QJsonValue::Bool; if (!JsonHelper::validateKeyTypes(jsonObject, allParamKeys, types, internalError)) { errorString = _loadErrorString(internalError); return false; @@ -362,11 +364,17 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ MissionCmdParamInfo* paramInfo = new MissionCmdParamInfo(this); paramInfo->_label = paramObject.value(_labelJsonKey).toString(); - paramInfo->_defaultValue = paramObject.value(_defaultJsonKey).toDouble(0.0); paramInfo->_decimalPlaces = paramObject.value(_decimalPlacesJsonKey).toInt(FactMetaData::unknownDecimalPlaces); paramInfo->_enumStrings = paramObject.value(_enumStringsJsonKey).toString().split(",", QString::SkipEmptyParts); paramInfo->_param = i; paramInfo->_units = paramObject.value(_unitsJsonKey).toString(); + paramInfo->_nanUnchanged = paramObject.value(_nanUnchangedJsonKey).toBool(false); + + if (paramObject.contains(_defaultJsonKey)) { + paramInfo->_defaultValue = paramObject.value(_defaultJsonKey).toDouble(0.0); + } else { + paramInfo->_defaultValue = _nanUnchangedJsonKey ? std::numeric_limits::quiet_NaN() : 0; + } QStringList enumValues = paramObject.value(_enumValuesJsonKey).toString().split(",", QString::SkipEmptyParts); foreach (const QString &enumValue, enumValues) { @@ -394,7 +402,8 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ << paramInfo->_param << paramInfo->_units << paramInfo->_enumStrings - << paramInfo->_enumValues; + << paramInfo->_enumValues + << paramInfo->_nanUnchanged; _paramInfoMap[i] = paramInfo; } diff --git a/src/MissionManager/MissionCommandUIInfo.h b/src/MissionManager/MissionCommandUIInfo.h index e543531d95ba28c77a8f104fc21b00646e4d6c2c..17170c6c9f1375e310cb800f56e8febb23f8a8dc 100644 --- a/src/MissionManager/MissionCommandUIInfo.h +++ b/src/MissionManager/MissionCommandUIInfo.h @@ -31,10 +31,11 @@ class MissionCommandTreeTest; /// Key Type Default Description /// label string required Label for text field /// units string Units for value, should use FactMetaData units strings in order to get automatic translation -/// default double 0.0 Default value for param +/// default double 0.0/NaN Default value for param. If no default value specified and nanUnchanged == true, then defaultVlue is NaN. /// decimalPlaces int 7 Number of decimal places to show for value /// enumStrings string Strings to show in combo box for selection /// enumValues string Values assocaited with each enum string +/// nanUnchanged bool false True: value can be set to NaN to signal unchanged /// class MissionCmdParamInfo : public QObject { @@ -53,6 +54,7 @@ public: Q_PROPERTY(QString label READ label CONSTANT) Q_PROPERTY(int param READ param CONSTANT) Q_PROPERTY(QString units READ units CONSTANT) + Q_PROPERTY(bool nanUnchanged READ nanUnchanged CONSTANT) int decimalPlaces (void) const { return _decimalPlaces; } double defaultValue (void) const { return _defaultValue; } @@ -61,6 +63,7 @@ public: QString label (void) const { return _label; } int param (void) const { return _param; } QString units (void) const { return _units; } + bool nanUnchanged (void) const { return _nanUnchanged; } private: int _decimalPlaces; @@ -70,6 +73,7 @@ private: QString _label; int _param; QString _units; + bool _nanUnchanged; friend class MissionCommandTree; friend class MissionCommandUIInfo; @@ -167,6 +171,7 @@ private: static const char* _descriptionJsonKey; static const char* _enumStringsJsonKey; static const char* _enumValuesJsonKey; + static const char* _nanUnchangedJsonKey; static const char* _friendlyNameJsonKey; static const char* _friendlyEditJsonKey; static const char* _idJsonKey; diff --git a/src/MissionManager/SimpleMissionItem.cc b/src/MissionManager/SimpleMissionItem.cc index ed63b604677f18231c207ad6aeea72b9601cf210..8d5258bd5540eefb85bd2ef8ee9f6d3cbb62e08e 100644 --- a/src/MissionManager/SimpleMissionItem.cc +++ b/src/MissionManager/SimpleMissionItem.cc @@ -75,6 +75,7 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, QObject* parent) _updateCameraSection(); setDefaultsForCommand(); + _rebuildFacts(); connect(&_missionItem, &MissionItem::specifiedFlightSpeedChanged, this, &SimpleMissionItem::specifiedFlightSpeedChanged); @@ -110,8 +111,8 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, const MissionItem& missio _setupMetaData(); _connectSignals(); _updateCameraSection(); - _syncFrameToAltitudeRelativeToHome(); + _rebuildFacts(); } SimpleMissionItem::SimpleMissionItem(const SimpleMissionItem& other, QObject* parent) @@ -138,6 +139,8 @@ SimpleMissionItem::SimpleMissionItem(const SimpleMissionItem& other, QObject* pa _updateCameraSection(); *this = other; + + _rebuildFacts(); } const SimpleMissionItem& SimpleMissionItem::operator=(const SimpleMissionItem& other) @@ -147,8 +150,8 @@ const SimpleMissionItem& SimpleMissionItem::operator=(const SimpleMissionItem& o setRawEdit(other._rawEdit); setDirty(other._dirty); setHomePositionSpecialCase(other._homePositionSpecialCase); - _syncFrameToAltitudeRelativeToHome(); + _rebuildFacts(); return *this; } @@ -191,8 +194,8 @@ void SimpleMissionItem::_connectSignals(void) connect(&_missionItem._commandFact, &Fact::valueChanged, this, &SimpleMissionItem::isStandaloneCoordinateChanged); // Whenever these properties change the ui model changes as well - connect(this, &SimpleMissionItem::commandChanged, this, &SimpleMissionItem::_sendUiModelChanged); - connect(this, &SimpleMissionItem::rawEditChanged, this, &SimpleMissionItem::_sendUiModelChanged); + connect(this, &SimpleMissionItem::commandChanged, this, &SimpleMissionItem::_rebuildFacts); + connect(this, &SimpleMissionItem::rawEditChanged, this, &SimpleMissionItem::_rebuildFacts); // These fact signals must alway signal out through SimpleMissionItem signals connect(&_missionItem._commandFact, &Fact::valueChanged, this, &SimpleMissionItem::_sendCommandChanged); @@ -350,53 +353,35 @@ QString SimpleMissionItem::abbreviation() const } } -void SimpleMissionItem::_clearParamMetaData(void) +void SimpleMissionItem::_rebuildTextFieldFacts(void) { - _param1MetaData.setRawUnits(""); - _param1MetaData.setDecimalPlaces(FactMetaData::unknownDecimalPlaces); - _param1MetaData.setBuiltInTranslator(); - _param2MetaData.setRawUnits(""); - _param2MetaData.setDecimalPlaces(FactMetaData::unknownDecimalPlaces); - _param2MetaData.setBuiltInTranslator(); - _param3MetaData.setRawUnits(""); - _param3MetaData.setDecimalPlaces(FactMetaData::unknownDecimalPlaces); - _param3MetaData.setBuiltInTranslator(); - _param4MetaData.setRawUnits(""); - _param4MetaData.setDecimalPlaces(FactMetaData::unknownDecimalPlaces); - _param4MetaData.setBuiltInTranslator(); -} - -QmlObjectListModel* SimpleMissionItem::textFieldFacts(void) -{ - QmlObjectListModel* model = new QmlObjectListModel(this); + _textFieldFacts.clear(); if (rawEdit()) { _missionItem._param1Fact._setName("Param1"); _missionItem._param1Fact.setMetaData(_defaultParamMetaData); - model->append(&_missionItem._param1Fact); + _textFieldFacts.append(&_missionItem._param1Fact); _missionItem._param2Fact._setName("Param2"); _missionItem._param2Fact.setMetaData(_defaultParamMetaData); - model->append(&_missionItem._param2Fact); + _textFieldFacts.append(&_missionItem._param2Fact); _missionItem._param3Fact._setName("Param3"); _missionItem._param3Fact.setMetaData(_defaultParamMetaData); - model->append(&_missionItem._param3Fact); + _textFieldFacts.append(&_missionItem._param3Fact); _missionItem._param4Fact._setName("Param4"); _missionItem._param4Fact.setMetaData(_defaultParamMetaData); - model->append(&_missionItem._param4Fact); + _textFieldFacts.append(&_missionItem._param4Fact); _missionItem._param5Fact._setName("Lat/X"); _missionItem._param5Fact.setMetaData(_defaultParamMetaData); - model->append(&_missionItem._param5Fact); + _textFieldFacts.append(&_missionItem._param5Fact); _missionItem._param6Fact._setName("Lon/Y"); _missionItem._param6Fact.setMetaData(_defaultParamMetaData); - model->append(&_missionItem._param6Fact); + _textFieldFacts.append(&_missionItem._param6Fact); _missionItem._param7Fact._setName("Alt/Z"); _missionItem._param7Fact.setMetaData(_defaultParamMetaData); - model->append(&_missionItem._param7Fact); + _textFieldFacts.append(&_missionItem._param7Fact); } else { _ignoreDirtyChangeSignals = true; - _clearParamMetaData(); - MAV_CMD command; if (_homePositionSpecialCase) { command = MAV_CMD_NAV_LAST; @@ -412,52 +397,84 @@ QmlObjectListModel* SimpleMissionItem::textFieldFacts(void) for (int i=1; i<=7; i++) { const MissionCmdParamInfo* paramInfo = uiInfo->getParamInfo(i); - if (paramInfo && paramInfo->enumStrings().count() == 0) { + if (paramInfo && paramInfo->enumStrings().count() == 0 && !paramInfo->nanUnchanged()) { Fact* paramFact = rgParamFacts[i-1]; FactMetaData* paramMetaData = rgParamMetaData[i-1]; paramFact->_setName(paramInfo->label()); paramMetaData->setDecimalPlaces(paramInfo->decimalPlaces()); - paramMetaData->setEnumInfo(paramInfo->enumStrings(), paramInfo->enumValues()); paramMetaData->setRawUnits(paramInfo->units()); paramFact->setMetaData(paramMetaData); - model->append(paramFact); + _textFieldFacts.append(paramFact); } } if (uiInfo->specifiesCoordinate() || uiInfo->specifiesAltitudeOnly()) { _missionItem._param7Fact._setName("Altitude"); _missionItem._param7Fact.setMetaData(_altitudeMetaData); - model->append(&_missionItem._param7Fact); + _textFieldFacts.append(&_missionItem._param7Fact); } _ignoreDirtyChangeSignals = false; } - - return model; } -QmlObjectListModel* SimpleMissionItem::checkboxFacts(void) +void SimpleMissionItem::_rebuildNaNFacts(void) { - QmlObjectListModel* model = new QmlObjectListModel(this); - + _nanFacts.clear(); + + if (!rawEdit()) { + _ignoreDirtyChangeSignals = true; + + MAV_CMD command; + if (_homePositionSpecialCase) { + command = MAV_CMD_NAV_LAST; + } else { + command = _missionItem.command(); + } + + Fact* rgParamFacts[7] = { &_missionItem._param1Fact, &_missionItem._param2Fact, &_missionItem._param3Fact, &_missionItem._param4Fact, &_missionItem._param5Fact, &_missionItem._param6Fact, &_missionItem._param7Fact }; + FactMetaData* rgParamMetaData[7] = { &_param1MetaData, &_param2MetaData, &_param3MetaData, &_param4MetaData, &_param5MetaData, &_param6MetaData, &_param7MetaData }; + + const MissionCommandUIInfo* uiInfo = _commandTree->getUIInfo(_vehicle, command); + + for (int i=1; i<=7; i++) { + const MissionCmdParamInfo* paramInfo = uiInfo->getParamInfo(i); + + if (paramInfo && paramInfo->nanUnchanged()) { + Fact* paramFact = rgParamFacts[i-1]; + FactMetaData* paramMetaData = rgParamMetaData[i-1]; + + paramFact->_setName(paramInfo->label()); + paramMetaData->setDecimalPlaces(paramInfo->decimalPlaces()); + paramMetaData->setRawUnits(paramInfo->units()); + paramFact->setMetaData(paramMetaData); + _nanFacts.append(paramFact); + } + } + + _ignoreDirtyChangeSignals = false; + } +} + +void SimpleMissionItem::_rebuildCheckboxFacts(void) +{ + _checkboxFacts.clear(); if (rawEdit()) { - model->append(&_missionItem._autoContinueFact); + _checkboxFacts.append(&_missionItem._autoContinueFact); } else if ((specifiesCoordinate() || specifiesAltitudeOnly()) && !_homePositionSpecialCase) { - model->append(&_altitudeRelativeToHomeFact); + _checkboxFacts.append(&_altitudeRelativeToHomeFact); } - - return model; } -QmlObjectListModel* SimpleMissionItem::comboboxFacts(void) +void SimpleMissionItem::_rebuildComboBoxFacts(void) { - QmlObjectListModel* model = new QmlObjectListModel(this); + _comboboxFacts.clear(); if (rawEdit()) { - model->append(&_missionItem._commandFact); - model->append(&_missionItem._frameFact); + _comboboxFacts.append(&_missionItem._commandFact); + _comboboxFacts.append(&_missionItem._frameFact); } else { Fact* rgParamFacts[7] = { &_missionItem._param1Fact, &_missionItem._param2Fact, &_missionItem._param3Fact, &_missionItem._param4Fact, &_missionItem._param5Fact, &_missionItem._param6Fact, &_missionItem._param7Fact }; FactMetaData* rgParamMetaData[7] = { &_param1MetaData, &_param2MetaData, &_param3MetaData, &_param4MetaData, &_param5MetaData, &_param6MetaData, &_param7MetaData }; @@ -481,12 +498,18 @@ QmlObjectListModel* SimpleMissionItem::comboboxFacts(void) paramMetaData->setEnumInfo(paramInfo->enumStrings(), paramInfo->enumValues()); paramMetaData->setRawUnits(paramInfo->units()); paramFact->setMetaData(paramMetaData); - model->append(paramFact); + _comboboxFacts.append(paramFact); } } } +} - return model; +void SimpleMissionItem::_rebuildFacts(void) +{ + _rebuildTextFieldFacts(); + _rebuildNaNFacts(); + _rebuildCheckboxFacts(); + _rebuildComboBoxFacts(); } bool SimpleMissionItem::friendlyEditAllowed(void) const @@ -604,11 +627,6 @@ void SimpleMissionItem::setDefaultsForCommand(void) setRawEdit(false); } -void SimpleMissionItem::_sendUiModelChanged(void) -{ - emit uiModelChanged(); -} - void SimpleMissionItem::_sendFrameChanged(void) { emit frameChanged(_missionItem.frame()); diff --git a/src/MissionManager/SimpleMissionItem.h b/src/MissionManager/SimpleMissionItem.h index e97476acfc0865ee0d944d87a42281849349c0d8..c1ee065fbbfaa1193998c18e44d1fa4096b59c30 100644 --- a/src/MissionManager/SimpleMissionItem.h +++ b/src/MissionManager/SimpleMissionItem.h @@ -40,9 +40,10 @@ public: Q_PROPERTY(QObject* cameraSection READ cameraSection NOTIFY cameraSectionChanged) // These properties are used to display the editing ui - Q_PROPERTY(QmlObjectListModel* checkboxFacts READ checkboxFacts NOTIFY uiModelChanged) - Q_PROPERTY(QmlObjectListModel* comboboxFacts READ comboboxFacts NOTIFY uiModelChanged) - Q_PROPERTY(QmlObjectListModel* textFieldFacts READ textFieldFacts NOTIFY uiModelChanged) + Q_PROPERTY(QmlObjectListModel* checkboxFacts READ checkboxFacts CONSTANT) + Q_PROPERTY(QmlObjectListModel* comboboxFacts READ comboboxFacts CONSTANT) + Q_PROPERTY(QmlObjectListModel* textFieldFacts READ textFieldFacts CONSTANT) + Q_PROPERTY(QmlObjectListModel* nanFacts READ nanFacts CONSTANT) /// Scans the loaded items for additional section settings /// @param visualItems List of all visual items @@ -59,9 +60,10 @@ public: bool rawEdit (void) const; CameraSection* cameraSection (void) { return _cameraSection; } - QmlObjectListModel* textFieldFacts (void); - QmlObjectListModel* checkboxFacts (void); - QmlObjectListModel* comboboxFacts (void); + QmlObjectListModel* textFieldFacts (void) { return &_textFieldFacts; } + QmlObjectListModel* nanFacts (void) { return &_nanFacts; } + QmlObjectListModel* checkboxFacts (void) { return &_checkboxFacts; } + QmlObjectListModel* comboboxFacts (void) { return &_comboboxFacts; } void setRawEdit(bool rawEdit); @@ -120,28 +122,29 @@ signals: void friendlyEditAllowedChanged (bool friendlyEditAllowed); void headingDegreesChanged (double heading); void rawEditChanged (bool rawEdit); - void uiModelChanged (void); void cameraSectionChanged (QObject* cameraSection); private slots: - void _setDirtyFromSignal(void); - void _cameraSectionDirtyChanged(bool dirty); - void _sendCommandChanged(void); - void _sendCoordinateChanged(void); - void _sendFrameChanged(void); - void _sendFriendlyEditAllowedChanged(void); - void _sendUiModelChanged(void); - void _syncAltitudeRelativeToHomeToFrame(const QVariant& value); - void _syncFrameToAltitudeRelativeToHome(void); - void _updateLastSequenceNumber(void); + void _setDirtyFromSignal (void); + void _cameraSectionDirtyChanged (bool dirty); + void _sendCommandChanged (void); + void _sendCoordinateChanged (void); + void _sendFrameChanged (void); + void _sendFriendlyEditAllowedChanged (void); + void _syncAltitudeRelativeToHomeToFrame (const QVariant& value); + void _syncFrameToAltitudeRelativeToHome (void); + void _updateLastSequenceNumber (void); + void _rebuildFacts (void); private: - void _clearParamMetaData(void); - void _connectSignals(void); - void _setupMetaData(void); - void _updateCameraSection(void); + void _connectSignals (void); + void _setupMetaData (void); + void _updateCameraSection (void); + void _rebuildTextFieldFacts (void); + void _rebuildNaNFacts (void); + void _rebuildCheckboxFacts (void); + void _rebuildComboBoxFacts (void); -private: MissionItem _missionItem; bool _rawEdit; bool _dirty; @@ -153,6 +156,11 @@ private: Fact _altitudeRelativeToHomeFact; Fact _supportedCommandFact; + + QmlObjectListModel _textFieldFacts; + QmlObjectListModel _nanFacts; + QmlObjectListModel _checkboxFacts; + QmlObjectListModel _comboboxFacts; static FactMetaData* _altitudeMetaData; static FactMetaData* _commandMetaData; diff --git a/src/MissionManager/SurveyMissionItem.cc b/src/MissionManager/SurveyMissionItem.cc index 1478a297563e06de3839a2c512f1aea815088480..33df72286ebd01f5d70090b8c9703d683a9411e0 100644 --- a/src/MissionManager/SurveyMissionItem.cc +++ b/src/MissionManager/SurveyMissionItem.cc @@ -926,12 +926,13 @@ int SurveyMissionItem::_appendWaypointToMission(QList& items, int MAV_CMD_NAV_WAYPOINT, altitudeRelative ? MAV_FRAME_GLOBAL_RELATIVE_ALT : MAV_FRAME_GLOBAL, cameraTrigger == CameraTriggerHoverAndCapture ? 1 : 0, // Hold time (1 second for hover and capture to settle vehicle before image is taken) - 0.0, 0.0, 0.0, // param 2-4 unused + 0.0, 0.0, + std::numeric_limits::quiet_NaN(), // Yaw unchanged coord.latitude(), coord.longitude(), altitude, - true, // autoContinue - false, // isCurrentItem + true, // autoContinue + false, // isCurrentItem missionItemParent); items.append(item); diff --git a/src/PlanView/SimpleItemEditor.qml b/src/PlanView/SimpleItemEditor.qml index 6f33ee3f2b18a39f6528d68b88f9a9bae5d355d8..aafad8bd324adbe2cf6c3aad0caad27d279e1a0b 100644 --- a/src/PlanView/SimpleItemEditor.qml +++ b/src/PlanView/SimpleItemEditor.qml @@ -107,6 +107,37 @@ Rectangle { } } + GridLayout { + anchors.left: parent.left + anchors.right: parent.right + columns: 2 + + Repeater { + model: missionItem.nanFacts + + QGCCheckBox { + text: object.name + Layout.column: 0 + Layout.row: index + checked: !isNaN(object.rawValue) + onClicked: object.rawValue = checked ? 0 : NaN + } + } + + Repeater { + model: missionItem.nanFacts + + FactTextField { + showUnits: true + fact: object + Layout.column: 1 + Layout.row: index + Layout.fillWidth: true + enabled: !isNaN(object.rawValue) + } + } + } + Repeater { model: missionItem.checkboxFacts