Commit cb0e358a authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #4942 from DonLakeFlyer/ParamNaN

Add support for NaN in mission command params
parents 48a18758 f19ff053
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
{ {
"id": 16, "id": 16,
"comment": "MAV_CMD_NAV_WAYPOINT", "comment": "MAV_CMD_NAV_WAYPOINT",
"paramRemove": "2,3,4" "paramRemove": "2,3"
}, },
{ {
"id": 21, "id": 21,
......
...@@ -14,13 +14,13 @@ ...@@ -14,13 +14,13 @@
"id": 18, "id": 18,
"comment": "MAV_CMD_NAV_LOITER_TURNS", "comment": "MAV_CMD_NAV_LOITER_TURNS",
"description": "Travel to a position and Loiter for a number of turns.", "description": "Travel to a position and Loiter for a number of turns.",
"paramRemove": "3,4" "paramRemove": "3"
}, },
{ {
"id": 19, "id": 19,
"comment": "MAV_CMD_NAV_LOITER_TIME", "comment": "MAV_CMD_NAV_LOITER_TIME",
"description": "Travel to a position and Loiter for an amount of time.", "description": "Travel to a position and Loiter for an amount of time.",
"paramRemove": "3,4" "paramRemove": "3"
}, },
{ {
"id": 22, "id": 22,
......
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
"param4": { "param4": {
"label": "Heading", "label": "Heading",
"units": "radians", "units": "radians",
"default": 0.0, "nanUnchanged": true,
"decimalPlaces": 2 "decimalPlaces": 2
} }
}, },
...@@ -71,6 +71,12 @@ ...@@ -71,6 +71,12 @@
"units": "m", "units": "m",
"default": 50.0, "default": 50.0,
"decimalPlaces": 2 "decimalPlaces": 2
},
"param4": {
"label": "Heading",
"units": "radians",
"nanUnchanged": true,
"decimalPlaces": 2
} }
}, },
{ {
...@@ -93,11 +99,10 @@ ...@@ -93,11 +99,10 @@
"decimalPlaces": 2 "decimalPlaces": 2
}, },
"param4": { "param4": {
"label": "Exit loiter from", "label": "Heading",
"enumStrings": "Center,Tangent", "units": "radians",
"enumValues": "0,1", "nanUnchanged": true,
"default": 1, "decimalPlaces": 2
"decimalPlaces": 0
} }
}, },
{ {
...@@ -121,11 +126,10 @@ ...@@ -121,11 +126,10 @@
"decimalPlaces": 2 "decimalPlaces": 2
}, },
"param4": { "param4": {
"label": "Exit loiter from", "label": "Heading",
"enumStrings": "Center,Tangent", "units": "radians",
"enumValues": "0,1", "nanUnchanged": true,
"default": 1, "decimalPlaces": 2
"decimalPlaces": 0
} }
}, },
{ {
...@@ -153,7 +157,7 @@ ...@@ -153,7 +157,7 @@
"param4": { "param4": {
"label": "Heading", "label": "Heading",
"units": "radians", "units": "radians",
"default": 0.0, "nanUnchanged": true,
"decimalPlaces": 2 "decimalPlaces": 2
} }
}, },
...@@ -174,7 +178,7 @@ ...@@ -174,7 +178,7 @@
"param4": { "param4": {
"label": "Heading", "label": "Heading",
"units": "radians", "units": "radians",
"default": 0.0, "nanUnchanged": true,
"decimalPlaces": 2 "decimalPlaces": 2
} }
}, },
...@@ -312,7 +316,7 @@ ...@@ -312,7 +316,7 @@
"param4": { "param4": {
"label": "Heading", "label": "Heading",
"units": "deg", "units": "deg",
"default": 0.0, "nanUnchanged": true,
"decimalPlaces": 2 "decimalPlaces": 2
} }
}, },
...@@ -327,7 +331,7 @@ ...@@ -327,7 +331,7 @@
"param4": { "param4": {
"label": "Heading", "label": "Heading",
"units": "deg", "units": "deg",
"default": 0.0, "nanUnchanged": true,
"decimalPlaces": 2 "decimalPlaces": 2
} }
}, },
......
...@@ -8,6 +8,43 @@ ...@@ -8,6 +8,43 @@
"id": 16, "id": 16,
"comment": "MAV_CMD_NAV_WAYPOINT", "comment": "MAV_CMD_NAV_WAYPOINT",
"paramRemove": "4" "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"
} }
] ]
} }
...@@ -18,6 +18,7 @@ const char* MissionCommandUIInfo::_defaultJsonKey = "default"; ...@@ -18,6 +18,7 @@ const char* MissionCommandUIInfo::_defaultJsonKey = "default";
const char* MissionCommandUIInfo::_descriptionJsonKey = "description"; const char* MissionCommandUIInfo::_descriptionJsonKey = "description";
const char* MissionCommandUIInfo::_enumStringsJsonKey = "enumStrings"; const char* MissionCommandUIInfo::_enumStringsJsonKey = "enumStrings";
const char* MissionCommandUIInfo::_enumValuesJsonKey = "enumValues"; const char* MissionCommandUIInfo::_enumValuesJsonKey = "enumValues";
const char* MissionCommandUIInfo::_nanUnchangedJsonKey = "nanUnchanged";
const char* MissionCommandUIInfo::_friendlyEditJsonKey = "friendlyEdit"; const char* MissionCommandUIInfo::_friendlyEditJsonKey = "friendlyEdit";
const char* MissionCommandUIInfo::_friendlyNameJsonKey = "friendlyName"; const char* MissionCommandUIInfo::_friendlyNameJsonKey = "friendlyName";
const char* MissionCommandUIInfo::_idJsonKey = "id"; const char* MissionCommandUIInfo::_idJsonKey = "id";
...@@ -62,6 +63,7 @@ const MissionCmdParamInfo& MissionCmdParamInfo::operator=(const MissionCmdParamI ...@@ -62,6 +63,7 @@ const MissionCmdParamInfo& MissionCmdParamInfo::operator=(const MissionCmdParamI
_label = other._label; _label = other._label;
_param = other._param; _param = other._param;
_units = other._units; _units = other._units;
_nanUnchanged = other._nanUnchanged;
return *this; return *this;
} }
...@@ -333,7 +335,7 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ ...@@ -333,7 +335,7 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ
QJsonObject paramObject = jsonObject.value(paramKey).toObject(); QJsonObject paramObject = jsonObject.value(paramKey).toObject();
QStringList allParamKeys; QStringList allParamKeys;
allParamKeys << _defaultJsonKey << _decimalPlacesJsonKey << _enumStringsJsonKey << _enumValuesJsonKey << _labelJsonKey << _unitsJsonKey; allParamKeys << _defaultJsonKey << _decimalPlacesJsonKey << _enumStringsJsonKey << _enumValuesJsonKey << _labelJsonKey << _unitsJsonKey << _nanUnchangedJsonKey;
// Look for unknown keys in param object // Look for unknown keys in param object
foreach (const QString& key, paramObject.keys()) { foreach (const QString& key, paramObject.keys()) {
...@@ -345,7 +347,7 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ ...@@ -345,7 +347,7 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ
// Validate key types // Validate key types
QList<QJsonValue::Type> types; QList<QJsonValue::Type> 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)) { if (!JsonHelper::validateKeyTypes(jsonObject, allParamKeys, types, internalError)) {
errorString = _loadErrorString(internalError); errorString = _loadErrorString(internalError);
return false; return false;
...@@ -362,11 +364,17 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ ...@@ -362,11 +364,17 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ
MissionCmdParamInfo* paramInfo = new MissionCmdParamInfo(this); MissionCmdParamInfo* paramInfo = new MissionCmdParamInfo(this);
paramInfo->_label = paramObject.value(_labelJsonKey).toString(); paramInfo->_label = paramObject.value(_labelJsonKey).toString();
paramInfo->_defaultValue = paramObject.value(_defaultJsonKey).toDouble(0.0);
paramInfo->_decimalPlaces = paramObject.value(_decimalPlacesJsonKey).toInt(FactMetaData::unknownDecimalPlaces); paramInfo->_decimalPlaces = paramObject.value(_decimalPlacesJsonKey).toInt(FactMetaData::unknownDecimalPlaces);
paramInfo->_enumStrings = paramObject.value(_enumStringsJsonKey).toString().split(",", QString::SkipEmptyParts); paramInfo->_enumStrings = paramObject.value(_enumStringsJsonKey).toString().split(",", QString::SkipEmptyParts);
paramInfo->_param = i; paramInfo->_param = i;
paramInfo->_units = paramObject.value(_unitsJsonKey).toString(); 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<double>::quiet_NaN() : 0;
}
QStringList enumValues = paramObject.value(_enumValuesJsonKey).toString().split(",", QString::SkipEmptyParts); QStringList enumValues = paramObject.value(_enumValuesJsonKey).toString().split(",", QString::SkipEmptyParts);
foreach (const QString &enumValue, enumValues) { foreach (const QString &enumValue, enumValues) {
...@@ -394,7 +402,8 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ ...@@ -394,7 +402,8 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ
<< paramInfo->_param << paramInfo->_param
<< paramInfo->_units << paramInfo->_units
<< paramInfo->_enumStrings << paramInfo->_enumStrings
<< paramInfo->_enumValues; << paramInfo->_enumValues
<< paramInfo->_nanUnchanged;
_paramInfoMap[i] = paramInfo; _paramInfoMap[i] = paramInfo;
} }
......
...@@ -31,10 +31,11 @@ class MissionCommandTreeTest; ...@@ -31,10 +31,11 @@ class MissionCommandTreeTest;
/// Key Type Default Description /// Key Type Default Description
/// label string required Label for text field /// label string required Label for text field
/// units string Units for value, should use FactMetaData units strings in order to get automatic translation /// 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 /// decimalPlaces int 7 Number of decimal places to show for value
/// enumStrings string Strings to show in combo box for selection /// enumStrings string Strings to show in combo box for selection
/// enumValues string Values assocaited with each enum string /// 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 { class MissionCmdParamInfo : public QObject {
...@@ -53,6 +54,7 @@ public: ...@@ -53,6 +54,7 @@ public:
Q_PROPERTY(QString label READ label CONSTANT) Q_PROPERTY(QString label READ label CONSTANT)
Q_PROPERTY(int param READ param CONSTANT) Q_PROPERTY(int param READ param CONSTANT)
Q_PROPERTY(QString units READ units CONSTANT) Q_PROPERTY(QString units READ units CONSTANT)
Q_PROPERTY(bool nanUnchanged READ nanUnchanged CONSTANT)
int decimalPlaces (void) const { return _decimalPlaces; } int decimalPlaces (void) const { return _decimalPlaces; }
double defaultValue (void) const { return _defaultValue; } double defaultValue (void) const { return _defaultValue; }
...@@ -61,6 +63,7 @@ public: ...@@ -61,6 +63,7 @@ public:
QString label (void) const { return _label; } QString label (void) const { return _label; }
int param (void) const { return _param; } int param (void) const { return _param; }
QString units (void) const { return _units; } QString units (void) const { return _units; }
bool nanUnchanged (void) const { return _nanUnchanged; }
private: private:
int _decimalPlaces; int _decimalPlaces;
...@@ -70,6 +73,7 @@ private: ...@@ -70,6 +73,7 @@ private:
QString _label; QString _label;
int _param; int _param;
QString _units; QString _units;
bool _nanUnchanged;
friend class MissionCommandTree; friend class MissionCommandTree;
friend class MissionCommandUIInfo; friend class MissionCommandUIInfo;
...@@ -167,6 +171,7 @@ private: ...@@ -167,6 +171,7 @@ private:
static const char* _descriptionJsonKey; static const char* _descriptionJsonKey;
static const char* _enumStringsJsonKey; static const char* _enumStringsJsonKey;
static const char* _enumValuesJsonKey; static const char* _enumValuesJsonKey;
static const char* _nanUnchangedJsonKey;
static const char* _friendlyNameJsonKey; static const char* _friendlyNameJsonKey;
static const char* _friendlyEditJsonKey; static const char* _friendlyEditJsonKey;
static const char* _idJsonKey; static const char* _idJsonKey;
......
...@@ -75,6 +75,7 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, QObject* parent) ...@@ -75,6 +75,7 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, QObject* parent)
_updateCameraSection(); _updateCameraSection();
setDefaultsForCommand(); setDefaultsForCommand();
_rebuildFacts();
connect(&_missionItem, &MissionItem::specifiedFlightSpeedChanged, this, &SimpleMissionItem::specifiedFlightSpeedChanged); connect(&_missionItem, &MissionItem::specifiedFlightSpeedChanged, this, &SimpleMissionItem::specifiedFlightSpeedChanged);
...@@ -110,8 +111,8 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, const MissionItem& missio ...@@ -110,8 +111,8 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, const MissionItem& missio
_setupMetaData(); _setupMetaData();
_connectSignals(); _connectSignals();
_updateCameraSection(); _updateCameraSection();
_syncFrameToAltitudeRelativeToHome(); _syncFrameToAltitudeRelativeToHome();
_rebuildFacts();
} }
SimpleMissionItem::SimpleMissionItem(const SimpleMissionItem& other, QObject* parent) SimpleMissionItem::SimpleMissionItem(const SimpleMissionItem& other, QObject* parent)
...@@ -138,6 +139,8 @@ SimpleMissionItem::SimpleMissionItem(const SimpleMissionItem& other, QObject* pa ...@@ -138,6 +139,8 @@ SimpleMissionItem::SimpleMissionItem(const SimpleMissionItem& other, QObject* pa
_updateCameraSection(); _updateCameraSection();
*this = other; *this = other;
_rebuildFacts();
} }
const SimpleMissionItem& SimpleMissionItem::operator=(const SimpleMissionItem& other) const SimpleMissionItem& SimpleMissionItem::operator=(const SimpleMissionItem& other)
...@@ -147,8 +150,8 @@ const SimpleMissionItem& SimpleMissionItem::operator=(const SimpleMissionItem& o ...@@ -147,8 +150,8 @@ const SimpleMissionItem& SimpleMissionItem::operator=(const SimpleMissionItem& o
setRawEdit(other._rawEdit); setRawEdit(other._rawEdit);
setDirty(other._dirty); setDirty(other._dirty);
setHomePositionSpecialCase(other._homePositionSpecialCase); setHomePositionSpecialCase(other._homePositionSpecialCase);
_syncFrameToAltitudeRelativeToHome(); _syncFrameToAltitudeRelativeToHome();
_rebuildFacts();
return *this; return *this;
} }
...@@ -191,8 +194,8 @@ void SimpleMissionItem::_connectSignals(void) ...@@ -191,8 +194,8 @@ void SimpleMissionItem::_connectSignals(void)
connect(&_missionItem._commandFact, &Fact::valueChanged, this, &SimpleMissionItem::isStandaloneCoordinateChanged); connect(&_missionItem._commandFact, &Fact::valueChanged, this, &SimpleMissionItem::isStandaloneCoordinateChanged);
// Whenever these properties change the ui model changes as well // Whenever these properties change the ui model changes as well
connect(this, &SimpleMissionItem::commandChanged, this, &SimpleMissionItem::_sendUiModelChanged); connect(this, &SimpleMissionItem::commandChanged, this, &SimpleMissionItem::_rebuildFacts);
connect(this, &SimpleMissionItem::rawEditChanged, this, &SimpleMissionItem::_sendUiModelChanged); connect(this, &SimpleMissionItem::rawEditChanged, this, &SimpleMissionItem::_rebuildFacts);
// These fact signals must alway signal out through SimpleMissionItem signals // These fact signals must alway signal out through SimpleMissionItem signals
connect(&_missionItem._commandFact, &Fact::valueChanged, this, &SimpleMissionItem::_sendCommandChanged); connect(&_missionItem._commandFact, &Fact::valueChanged, this, &SimpleMissionItem::_sendCommandChanged);
...@@ -350,53 +353,35 @@ QString SimpleMissionItem::abbreviation() const ...@@ -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()) { if (rawEdit()) {
_missionItem._param1Fact._setName("Param1"); _missionItem._param1Fact._setName("Param1");
_missionItem._param1Fact.setMetaData(_defaultParamMetaData); _missionItem._param1Fact.setMetaData(_defaultParamMetaData);
model->append(&_missionItem._param1Fact); _textFieldFacts.append(&_missionItem._param1Fact);
_missionItem._param2Fact._setName("Param2"); _missionItem._param2Fact._setName("Param2");
_missionItem._param2Fact.setMetaData(_defaultParamMetaData); _missionItem._param2Fact.setMetaData(_defaultParamMetaData);
model->append(&_missionItem._param2Fact); _textFieldFacts.append(&_missionItem._param2Fact);
_missionItem._param3Fact._setName("Param3"); _missionItem._param3Fact._setName("Param3");
_missionItem._param3Fact.setMetaData(_defaultParamMetaData); _missionItem._param3Fact.setMetaData(_defaultParamMetaData);
model->append(&_missionItem._param3Fact); _textFieldFacts.append(&_missionItem._param3Fact);
_missionItem._param4Fact._setName("Param4"); _missionItem._param4Fact._setName("Param4");
_missionItem._param4Fact.setMetaData(_defaultParamMetaData); _missionItem._param4Fact.setMetaData(_defaultParamMetaData);
model->append(&_missionItem._param4Fact); _textFieldFacts.append(&_missionItem._param4Fact);
_missionItem._param5Fact._setName("Lat/X"); _missionItem._param5Fact._setName("Lat/X");
_missionItem._param5Fact.setMetaData(_defaultParamMetaData); _missionItem._param5Fact.setMetaData(_defaultParamMetaData);
model->append(&_missionItem._param5Fact); _textFieldFacts.append(&_missionItem._param5Fact);
_missionItem._param6Fact._setName("Lon/Y"); _missionItem._param6Fact._setName("Lon/Y");
_missionItem._param6Fact.setMetaData(_defaultParamMetaData); _missionItem._param6Fact.setMetaData(_defaultParamMetaData);
model->append(&_missionItem._param6Fact); _textFieldFacts.append(&_missionItem._param6Fact);
_missionItem._param7Fact._setName("Alt/Z"); _missionItem._param7Fact._setName("Alt/Z");
_missionItem._param7Fact.setMetaData(_defaultParamMetaData); _missionItem._param7Fact.setMetaData(_defaultParamMetaData);
model->append(&_missionItem._param7Fact); _textFieldFacts.append(&_missionItem._param7Fact);
} else { } else {
_ignoreDirtyChangeSignals = true; _ignoreDirtyChangeSignals = true;
_clearParamMetaData();
MAV_CMD command; MAV_CMD command;
if (_homePositionSpecialCase) { if (_homePositionSpecialCase) {
command = MAV_CMD_NAV_LAST; command = MAV_CMD_NAV_LAST;
...@@ -412,52 +397,84 @@ QmlObjectListModel* SimpleMissionItem::textFieldFacts(void) ...@@ -412,52 +397,84 @@ QmlObjectListModel* SimpleMissionItem::textFieldFacts(void)
for (int i=1; i<=7; i++) { for (int i=1; i<=7; i++) {
const MissionCmdParamInfo* paramInfo = uiInfo->getParamInfo(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]; Fact* paramFact = rgParamFacts[i-1];
FactMetaData* paramMetaData = rgParamMetaData[i-1]; FactMetaData* paramMetaData = rgParamMetaData[i-1];
paramFact->_setName(paramInfo->label()); paramFact->_setName(paramInfo->label());
paramMetaData->setDecimalPlaces(paramInfo->decimalPlaces()); paramMetaData->setDecimalPlaces(paramInfo->decimalPlaces());
paramMetaData->setEnumInfo(paramInfo->enumStrings(), paramInfo->enumValues());
paramMetaData->setRawUnits(paramInfo->units()); paramMetaData->setRawUnits(paramInfo->units());
paramFact->setMetaData(paramMetaData); paramFact->setMetaData(paramMetaData);
model->append(paramFact); _textFieldFacts.append(paramFact);
} }
} }
if (uiInfo->specifiesCoordinate() || uiInfo->specifiesAltitudeOnly()) { if (uiInfo->specifiesCoordinate() || uiInfo->specifiesAltitudeOnly()) {
_missionItem._param7Fact._setName("Altitude"); _missionItem._param7Fact._setName("Altitude");
_missionItem._param7Fact.setMetaData(_altitudeMetaData); _missionItem._param7Fact.setMetaData(_altitudeMetaData);
model->append(&_missionItem._param7Fact); _textFieldFacts.append(&_missionItem._param7Fact);
} }
_ignoreDirtyChangeSignals = false; _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()) { if (rawEdit()) {
model->append(&_missionItem._autoContinueFact); _checkboxFacts.append(&_missionItem._autoContinueFact);
} else if ((specifiesCoordinate() || specifiesAltitudeOnly()) && !_homePositionSpecialCase) { } 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()) { if (rawEdit()) {
model->append(&_missionItem._commandFact); _comboboxFacts.append(&_missionItem._commandFact);
model->append(&_missionItem._frameFact); _comboboxFacts.append(&_missionItem._frameFact);
} else { } else {
Fact* rgParamFacts[7] = { &_missionItem._param1Fact, &_missionItem._param2Fact, &_missionItem._param3Fact, &_missionItem._param4Fact, &_missionItem._param5Fact, &_missionItem._param6Fact, &_missionItem._param7Fact }; 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 }; FactMetaData* rgParamMetaData[7] = { &_param1MetaData, &_param2MetaData, &_param3MetaData, &_param4MetaData, &_param5MetaData, &_param6MetaData, &_param7MetaData };
...@@ -481,12 +498,18 @@ QmlObjectListModel* SimpleMissionItem::comboboxFacts(void) ...@@ -481,12 +498,18 @@ QmlObjectListModel* SimpleMissionItem::comboboxFacts(void)
paramMetaData->setEnumInfo(paramInfo->enumStrings(), paramInfo->enumValues()); paramMetaData->setEnumInfo(paramInfo->enumStrings(), paramInfo->enumValues());
paramMetaData->setRawUnits(paramInfo->units()); paramMetaData->setRawUnits(paramInfo->units());
paramFact->setMetaData(paramMetaData); paramFact->setMetaData(paramMetaData);
model->append(paramFact); _comboboxFacts.append(paramFact);
} }
} }
} }
}
return model; void SimpleMissionItem::_rebuildFacts(void)
{
_rebuildTextFieldFacts();
_rebuildNaNFacts();
_rebuildCheckboxFacts();
_rebuildComboBoxFacts();
} }
bool SimpleMissionItem::friendlyEditAllowed(void) const bool SimpleMissionItem::friendlyEditAllowed(void) const
...@@ -604,11 +627,6 @@ void SimpleMissionItem::setDefaultsForCommand(void) ...@@ -604,11 +627,6 @@ void SimpleMissionItem::setDefaultsForCommand(void)
setRawEdit(false); setRawEdit(false);
} }
void SimpleMissionItem::_sendUiModelChanged(void)
{
emit uiModelChanged();
}
void SimpleMissionItem::_sendFrameChanged(void) void SimpleMissionItem::_sendFrameChanged(void)
{ {
emit frameChanged(_missionItem.frame()); emit frameChanged(_missionItem.frame());
......
...@@ -40,9 +40,10 @@ public: ...@@ -40,9 +40,10 @@ public:
Q_PROPERTY(QObject* cameraSection READ cameraSection NOTIFY cameraSectionChanged) Q_PROPERTY(QObject* cameraSection READ cameraSection NOTIFY cameraSectionChanged)
// These properties are used to display the editing ui // These properties are used to display the editing ui
Q_PROPERTY(QmlObjectListModel* checkboxFacts READ checkboxFacts NOTIFY uiModelChanged) Q_PROPERTY(QmlObjectListModel* checkboxFacts READ checkboxFacts CONSTANT)
Q_PROPERTY(QmlObjectListModel* comboboxFacts READ comboboxFacts NOTIFY uiModelChanged) Q_PROPERTY(QmlObjectListModel* comboboxFacts READ comboboxFacts CONSTANT)
Q_PROPERTY(QmlObjectListModel* textFieldFacts READ textFieldFacts NOTIFY uiModelChanged) Q_PROPERTY(QmlObjectListModel* textFieldFacts READ textFieldFacts CONSTANT)
Q_PROPERTY(QmlObjectListModel* nanFacts READ nanFacts CONSTANT)
/// Scans the loaded items for additional section settings /// Scans the loaded items for additional section settings
/// @param visualItems List of all visual items /// @param visualItems List of all visual items
...@@ -59,9 +60,10 @@ public: ...@@ -59,9 +60,10 @@ public:
bool rawEdit (void) const; bool rawEdit (void) const;
CameraSection* cameraSection (void) { return _cameraSection; } CameraSection* cameraSection (void) { return _cameraSection; }
QmlObjectListModel* textFieldFacts (void); QmlObjectListModel* textFieldFacts (void) { return &_textFieldFacts; }
QmlObjectListModel* checkboxFacts (void); QmlObjectListModel* nanFacts (void) { return &_nanFacts; }
QmlObjectListModel* comboboxFacts (void); QmlObjectListModel* checkboxFacts (void) { return &_checkboxFacts; }
QmlObjectListModel* comboboxFacts (void) { return &_comboboxFacts; }
void setRawEdit(bool rawEdit); void setRawEdit(bool rawEdit);
...@@ -120,28 +122,29 @@ signals: ...@@ -120,28 +122,29 @@ signals:
void friendlyEditAllowedChanged (bool friendlyEditAllowed); void friendlyEditAllowedChanged (bool friendlyEditAllowed);
void headingDegreesChanged (double heading); void headingDegreesChanged (double heading);
void rawEditChanged (bool rawEdit); void rawEditChanged (bool rawEdit);
void uiModelChanged (void);
void cameraSectionChanged (QObject* cameraSection); void cameraSectionChanged (QObject* cameraSection);
private slots: private slots:
void _setDirtyFromSignal(void); void _setDirtyFromSignal (void);
void _cameraSectionDirtyChanged(bool dirty); void _cameraSectionDirtyChanged (bool dirty);
void _sendCommandChanged(void); void _sendCommandChanged (void);
void _sendCoordinateChanged(void); void _sendCoordinateChanged (void);
void _sendFrameChanged(void); void _sendFrameChanged (void);
void _sendFriendlyEditAllowedChanged(void); void _sendFriendlyEditAllowedChanged (void);
void _sendUiModelChanged(void); void _syncAltitudeRelativeToHomeToFrame (const QVariant& value);
void _syncAltitudeRelativeToHomeToFrame(const QVariant& value); void _syncFrameToAltitudeRelativeToHome (void);
void _syncFrameToAltitudeRelativeToHome(void); void _updateLastSequenceNumber (void);
void _updateLastSequenceNumber(void); void _rebuildFacts (void);
private: private:
void _clearParamMetaData(void); void _connectSignals (void);
void _connectSignals(void); void _setupMetaData (void);
void _setupMetaData(void); void _updateCameraSection (void);
void _updateCameraSection(void); void _rebuildTextFieldFacts (void);
void _rebuildNaNFacts (void);
void _rebuildCheckboxFacts (void);
void _rebuildComboBoxFacts (void);
private:
MissionItem _missionItem; MissionItem _missionItem;
bool _rawEdit; bool _rawEdit;
bool _dirty; bool _dirty;
...@@ -154,6 +157,11 @@ private: ...@@ -154,6 +157,11 @@ private:
Fact _altitudeRelativeToHomeFact; Fact _altitudeRelativeToHomeFact;
Fact _supportedCommandFact; Fact _supportedCommandFact;
QmlObjectListModel _textFieldFacts;
QmlObjectListModel _nanFacts;
QmlObjectListModel _checkboxFacts;
QmlObjectListModel _comboboxFacts;
static FactMetaData* _altitudeMetaData; static FactMetaData* _altitudeMetaData;
static FactMetaData* _commandMetaData; static FactMetaData* _commandMetaData;
static FactMetaData* _defaultParamMetaData; static FactMetaData* _defaultParamMetaData;
......
...@@ -926,7 +926,8 @@ int SurveyMissionItem::_appendWaypointToMission(QList<MissionItem*>& items, int ...@@ -926,7 +926,8 @@ int SurveyMissionItem::_appendWaypointToMission(QList<MissionItem*>& items, int
MAV_CMD_NAV_WAYPOINT, MAV_CMD_NAV_WAYPOINT,
altitudeRelative ? MAV_FRAME_GLOBAL_RELATIVE_ALT : MAV_FRAME_GLOBAL, 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) 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<double>::quiet_NaN(), // Yaw unchanged
coord.latitude(), coord.latitude(),
coord.longitude(), coord.longitude(),
altitude, altitude,
......
...@@ -107,6 +107,37 @@ Rectangle { ...@@ -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 { Repeater {
model: missionItem.checkboxFacts model: missionItem.checkboxFacts
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment