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 @@
{
"id": 16,
"comment": "MAV_CMD_NAV_WAYPOINT",
"paramRemove": "2,3,4"
"paramRemove": "2,3"
},
{
"id": 21,
......
......@@ -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,
......
......@@ -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
}
},
......
......@@ -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"
}
]
}
......@@ -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<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)) {
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<double>::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;
}
......
......@@ -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;
......
......@@ -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());
......
......@@ -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;
......
......@@ -926,12 +926,13 @@ int SurveyMissionItem::_appendWaypointToMission(QList<MissionItem*>& 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<double>::quiet_NaN(), // Yaw unchanged
coord.latitude(),
coord.longitude(),
altitude,
true, // autoContinue
false, // isCurrentItem
true, // autoContinue
false, // isCurrentItem
missionItemParent);
items.append(item);
......
......@@ -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
......
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