Commit b25ca6f1 authored by Don Gagne's avatar Don Gagne

Merge pull request #2261 from DonLakeFlyer/RawEdit

Mission Item raw/friendly edit support, plus more [merge after Stable 2.8]
parents 8e681c09 77c2342d
...@@ -95,6 +95,8 @@ ...@@ -95,6 +95,8 @@
<file alias="Signal100.svg">src/ui/toolbar/Images/Signal100.svg</file> <file alias="Signal100.svg">src/ui/toolbar/Images/Signal100.svg</file>
<file alias="Yield.svg">src/ui/toolbar/Images/Yield.svg</file> <file alias="Yield.svg">src/ui/toolbar/Images/Yield.svg</file>
<file alias="CogWheel.svg">src/MissionManager/CogWheel.svg</file>
</qresource> </qresource>
<qresource prefix="/res"> <qresource prefix="/res">
......
...@@ -247,8 +247,9 @@ HEADERS += \ ...@@ -247,8 +247,9 @@ HEADERS += \
src/Joystick/JoystickManager.h \ src/Joystick/JoystickManager.h \
src/LogCompressor.h \ src/LogCompressor.h \
src/MG.h \ src/MG.h \
src/MissionManager/MissionManager.h \
src/MissionManager/MissionController.h \ src/MissionManager/MissionController.h \
src/MissionManager/MissionItem.h \
src/MissionManager/MissionManager.h \
src/QGC.h \ src/QGC.h \
src/QGCApplication.h \ src/QGCApplication.h \
src/QGCComboBox.h \ src/QGCComboBox.h \
...@@ -290,7 +291,6 @@ HEADERS += \ ...@@ -290,7 +291,6 @@ HEADERS += \
src/ui/toolbar/MainToolBarController.h \ src/ui/toolbar/MainToolBarController.h \
src/ui/uas/QGCUnconnectedInfoWidget.h \ src/ui/uas/QGCUnconnectedInfoWidget.h \
src/ui/uas/UASMessageView.h \ src/ui/uas/UASMessageView.h \
src/MissionItem.h \
src/AutoPilotPlugins/PX4/PX4AirframeLoader.h \ src/AutoPilotPlugins/PX4/PX4AirframeLoader.h \
src/QmlControls/QGCImageProvider.h \ src/QmlControls/QGCImageProvider.h \
...@@ -362,8 +362,9 @@ SOURCES += \ ...@@ -362,8 +362,9 @@ SOURCES += \
src/Joystick/JoystickManager.cc \ src/Joystick/JoystickManager.cc \
src/LogCompressor.cc \ src/LogCompressor.cc \
src/main.cc \ src/main.cc \
src/MissionManager/MissionManager.cc \
src/MissionManager/MissionController.cc \ src/MissionManager/MissionController.cc \
src/MissionManager/MissionItem.cc \
src/MissionManager/MissionManager.cc \
src/QGC.cc \ src/QGC.cc \
src/QGCApplication.cc \ src/QGCApplication.cc \
src/QGCComboBox.cc \ src/QGCComboBox.cc \
...@@ -401,7 +402,6 @@ SOURCES += \ ...@@ -401,7 +402,6 @@ SOURCES += \
src/ui/toolbar/MainToolBarController.cc \ src/ui/toolbar/MainToolBarController.cc \
src/ui/uas/QGCUnconnectedInfoWidget.cc \ src/ui/uas/QGCUnconnectedInfoWidget.cc \
src/ui/uas/UASMessageView.cc \ src/ui/uas/UASMessageView.cc \
src/MissionItem.cc \
src/AutoPilotPlugins/PX4/PX4AirframeLoader.cc \ src/AutoPilotPlugins/PX4/PX4AirframeLoader.cc \
src/QmlControls/QGCImageProvider.cc \ src/QmlControls/QGCImageProvider.cc \
...@@ -470,9 +470,9 @@ HEADERS += \ ...@@ -470,9 +470,9 @@ HEADERS += \
src/FactSystem/FactSystemTestBase.h \ src/FactSystem/FactSystemTestBase.h \
src/FactSystem/FactSystemTestGeneric.h \ src/FactSystem/FactSystemTestGeneric.h \
src/FactSystem/FactSystemTestPX4.h \ src/FactSystem/FactSystemTestPX4.h \
src/MissionItemTest.h \
src/MissionManager/MissionControllerTest.h \ src/MissionManager/MissionControllerTest.h \
src/MissionManager/MissionControllerManagerTest.h \ src/MissionManager/MissionControllerManagerTest.h \
src/MissionManager/MissionItemTest.h \
src/MissionManager/MissionManagerTest.h \ src/MissionManager/MissionManagerTest.h \
src/qgcunittest/GeoTest.h \ src/qgcunittest/GeoTest.h \
src/qgcunittest/FileDialogTest.h \ src/qgcunittest/FileDialogTest.h \
...@@ -493,9 +493,9 @@ SOURCES += \ ...@@ -493,9 +493,9 @@ SOURCES += \
src/FactSystem/FactSystemTestBase.cc \ src/FactSystem/FactSystemTestBase.cc \
src/FactSystem/FactSystemTestGeneric.cc \ src/FactSystem/FactSystemTestGeneric.cc \
src/FactSystem/FactSystemTestPX4.cc \ src/FactSystem/FactSystemTestPX4.cc \
src/MissionItemTest.cc \
src/MissionManager/MissionControllerTest.cc \ src/MissionManager/MissionControllerTest.cc \
src/MissionManager/MissionControllerManagerTest.cc \ src/MissionManager/MissionControllerManagerTest.cc \
src/MissionManager/MissionItemTest.cc \
src/MissionManager/MissionManagerTest.cc \ src/MissionManager/MissionManagerTest.cc \
src/qgcunittest/GeoTest.cc \ src/qgcunittest/GeoTest.cc \
src/qgcunittest/FileDialogTest.cc \ src/qgcunittest/FileDialogTest.cc \
......
...@@ -36,7 +36,6 @@ ...@@ -36,7 +36,6 @@
<file alias="QGroundControl/Controls/MainToolBarIndicators.qml">src/ui/toolbar/MainToolBarIndicators.qml</file> <file alias="QGroundControl/Controls/MainToolBarIndicators.qml">src/ui/toolbar/MainToolBarIndicators.qml</file>
<file alias="QGroundControl/Controls/MissionItemEditor.qml">src/QmlControls/MissionItemEditor.qml</file> <file alias="QGroundControl/Controls/MissionItemEditor.qml">src/QmlControls/MissionItemEditor.qml</file>
<file alias="QGroundControl/Controls/MissionItemIndexLabel.qml">src/QmlControls/MissionItemIndexLabel.qml</file> <file alias="QGroundControl/Controls/MissionItemIndexLabel.qml">src/QmlControls/MissionItemIndexLabel.qml</file>
<file alias="QGroundControl/Controls/MissionItemSummary.qml">src/QmlControls/MissionItemSummary.qml</file>
<file alias="QGroundControl/Controls/ModeSwitchDisplay.qml">src/QmlControls/ModeSwitchDisplay.qml</file> <file alias="QGroundControl/Controls/ModeSwitchDisplay.qml">src/QmlControls/ModeSwitchDisplay.qml</file>
<file alias="QGroundControl/Controls/ParameterEditor.qml">src/QmlControls/ParameterEditor.qml</file> <file alias="QGroundControl/Controls/ParameterEditor.qml">src/QmlControls/ParameterEditor.qml</file>
<file alias="QGroundControl/Controls/ParameterEditorDialog.qml">src/QmlControls/ParameterEditorDialog.qml</file> <file alias="QGroundControl/Controls/ParameterEditorDialog.qml">src/QmlControls/ParameterEditorDialog.qml</file>
...@@ -100,4 +99,7 @@ ...@@ -100,4 +99,7 @@
<file alias="test.qml">src/test.qml</file> <file alias="test.qml">src/test.qml</file>
<file alias="VehicleSummary.qml">src/VehicleSetup/VehicleSummary.qml</file> <file alias="VehicleSummary.qml">src/VehicleSetup/VehicleSummary.qml</file>
</qresource> </qresource>
<qresource prefix="/json">
<file alias="MavCmdInfo.json">src/MissionManager/MavCmdInfo.json</file>
</qresource>
</RCC> </RCC>
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
Fact::Fact(QObject* parent) Fact::Fact(QObject* parent)
: QObject(parent) : QObject(parent)
, _componentId(-1) , _componentId(-1)
, _value(0) , _rawValue(0)
, _type(FactMetaData::valueTypeInt32) , _type(FactMetaData::valueTypeInt32)
, _metaData(NULL) , _metaData(NULL)
{ {
...@@ -43,7 +43,7 @@ Fact::Fact(int componentId, QString name, FactMetaData::ValueType_t type, QObjec ...@@ -43,7 +43,7 @@ Fact::Fact(int componentId, QString name, FactMetaData::ValueType_t type, QObjec
: QObject(parent) : QObject(parent)
, _name(name) , _name(name)
, _componentId(componentId) , _componentId(componentId)
, _value(0) , _rawValue(0)
, _type(type) , _type(type)
, _metaData(NULL) , _metaData(NULL)
{ {
...@@ -61,7 +61,7 @@ const Fact& Fact::operator=(const Fact& other) ...@@ -61,7 +61,7 @@ const Fact& Fact::operator=(const Fact& other)
{ {
_name = other._name; _name = other._name;
_componentId = other._componentId; _componentId = other._componentId;
_value = other._value; _rawValue = other._rawValue;
_type = other._type; _type = other._type;
if (_metaData && other._metaData) { if (_metaData && other._metaData) {
...@@ -80,26 +80,26 @@ void Fact::forceSetValue(const QVariant& value) ...@@ -80,26 +80,26 @@ void Fact::forceSetValue(const QVariant& value)
QString errorString; QString errorString;
if (_metaData->convertAndValidate(value, true /* convertOnly */, typedValue, errorString)) { if (_metaData->convertAndValidate(value, true /* convertOnly */, typedValue, errorString)) {
_value.setValue(typedValue); _rawValue.setValue(_metaData->cookedTranslator()(typedValue));
emit valueChanged(_value); emit valueChanged(typedValue);
emit _containerValueChanged(_value); emit _containerValueChanged(typedValue);
} }
} else { } else {
qWarning() << "Meta data pointer missing"; qWarning() << "Meta data pointer missing";
} }
} }
void Fact::setValue(const QVariant& value) void Fact::setRawValue(const QVariant& value)
{ {
if (_metaData) { if (_metaData) {
QVariant typedValue; QVariant typedValue;
QString errorString; QString errorString;
if (_metaData->convertAndValidate(value, true /* convertOnly */, typedValue, errorString)) { if (_metaData->convertAndValidate(value, true /* convertOnly */, typedValue, errorString)) {
if (typedValue != _value) { if (typedValue != _rawValue) {
_value.setValue(typedValue); _rawValue.setValue(typedValue);
emit valueChanged(_value); emit valueChanged(this->value());
emit _containerValueChanged(_value); emit _containerValueChanged(this->value());
} }
} }
} else { } else {
...@@ -107,11 +107,41 @@ void Fact::setValue(const QVariant& value) ...@@ -107,11 +107,41 @@ void Fact::setValue(const QVariant& value)
} }
} }
void Fact::setValue(const QVariant& value)
{
if (_metaData) {
setRawValue(_metaData->cookedTranslator()(value));
} else {
qWarning() << "Meta data pointer missing";
}
}
void Fact::setEnumStringValue(const QString& value)
{
if (_metaData) {
int index = _metaData->enumStrings().indexOf(value);
if (index != -1) {
setValue(_metaData->enumValues()[index]);
}
} else {
qWarning() << "Meta data pointer missing";
}
}
void Fact::setEnumIndex(int index)
{
if (_metaData) {
setValue(_metaData->enumValues()[index]);
} else {
qWarning() << "Meta data pointer missing";
}
}
void Fact::_containerSetValue(const QVariant& value) void Fact::_containerSetValue(const QVariant& value)
{ {
_value = value; _rawValue = value;
emit valueChanged(_value); emit valueChanged(_rawValue);
emit vehicleUpdated(_value); emit vehicleUpdated(_rawValue);
} }
QString Fact::name(void) const QString Fact::name(void) const
...@@ -126,7 +156,63 @@ int Fact::componentId(void) const ...@@ -126,7 +156,63 @@ int Fact::componentId(void) const
QVariant Fact::value(void) const QVariant Fact::value(void) const
{ {
return _value; if (_metaData) {
return _metaData->rawTranslator()(_rawValue);
} else {
qWarning() << "Meta data pointer missing";
return _rawValue;
}
}
QString Fact::enumStringValue(void) const
{
if (_metaData) {
int enumIndex = this->enumIndex();
if (enumIndex > 0 && enumIndex < _metaData->enumStrings().count()) {
return _metaData->enumStrings()[enumIndex];
}
} else {
qWarning() << "Meta data pointer missing";
}
return QString();
}
int Fact::enumIndex(void) const
{
if (_metaData) {
int index = 0;
foreach (QVariant enumValue, _metaData->enumValues()) {
if (enumValue == value()) {
return index;
}
index ++;
}
} else {
qWarning() << "Meta data pointer missing";
}
return -1;
}
QStringList Fact::enumStrings(void) const
{
if (_metaData) {
return _metaData->enumStrings();
} else {
qWarning() << "Meta data pointer missing";
return QStringList();
}
}
QVariantList Fact::enumValues(void) const
{
if (_metaData) {
return _metaData->enumValues();
} else {
qWarning() << "Meta data pointer missing";
return QVariantList();
}
} }
QString Fact::_variantToString(const QVariant& variant) const QString Fact::_variantToString(const QVariant& variant) const
...@@ -279,6 +365,7 @@ QString Fact::group(void) const ...@@ -279,6 +365,7 @@ QString Fact::group(void) const
void Fact::setMetaData(FactMetaData* metaData) void Fact::setMetaData(FactMetaData* metaData)
{ {
_metaData = metaData; _metaData = metaData;
emit valueChanged(value());
} }
bool Fact::valueEqualsDefault(void) const bool Fact::valueEqualsDefault(void) const
......
...@@ -46,56 +46,67 @@ public: ...@@ -46,56 +46,67 @@ public:
const Fact& operator=(const Fact& other); const Fact& operator=(const Fact& other);
Q_PROPERTY(int componentId READ componentId CONSTANT) Q_PROPERTY(int componentId READ componentId CONSTANT)
Q_PROPERTY(QString group READ group CONSTANT) Q_PROPERTY(int decimalPlaces READ decimalPlaces CONSTANT)
Q_PROPERTY(QString name READ name CONSTANT) Q_PROPERTY(QVariant defaultValue READ defaultValue CONSTANT)
Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged USER true) Q_PROPERTY(QString defaultValueString READ defaultValueString CONSTANT)
Q_PROPERTY(QVariant valueString READ valueString NOTIFY valueChanged) Q_PROPERTY(bool defaultValueAvailable READ defaultValueAvailable CONSTANT)
Q_PROPERTY(QString units READ units CONSTANT) Q_PROPERTY(int enumIndex READ enumIndex WRITE setEnumIndex NOTIFY valueChanged)
Q_PROPERTY(QVariant defaultValue READ defaultValue CONSTANT) Q_PROPERTY(QStringList enumStrings READ enumStrings CONSTANT)
Q_PROPERTY(QString defaultValueString READ defaultValueString CONSTANT) Q_PROPERTY(QString enumStringValue READ enumStringValue WRITE setEnumStringValue NOTIFY valueChanged)
Q_PROPERTY(bool defaultValueAvailable READ defaultValueAvailable CONSTANT) Q_PROPERTY(QVariantList enumValues READ enumValues CONSTANT)
Q_PROPERTY(bool valueEqualsDefault READ valueEqualsDefault NOTIFY valueChanged) Q_PROPERTY(QString group READ group CONSTANT)
Q_PROPERTY(FactMetaData::ValueType_t type READ type CONSTANT) Q_PROPERTY(QString longDescription READ longDescription CONSTANT)
Q_PROPERTY(QString shortDescription READ shortDescription CONSTANT) Q_PROPERTY(QVariant max READ max CONSTANT)
Q_PROPERTY(QString longDescription READ longDescription CONSTANT) Q_PROPERTY(QString maxString READ maxString CONSTANT)
Q_PROPERTY(QVariant min READ min CONSTANT) Q_PROPERTY(bool maxIsDefaultForType READ maxIsDefaultForType CONSTANT)
Q_PROPERTY(QString minString READ minString CONSTANT) Q_PROPERTY(QVariant min READ min CONSTANT)
Q_PROPERTY(bool minIsDefaultForType READ minIsDefaultForType CONSTANT) Q_PROPERTY(QString minString READ minString CONSTANT)
Q_PROPERTY(QVariant max READ max CONSTANT) Q_PROPERTY(bool minIsDefaultForType READ minIsDefaultForType CONSTANT)
Q_PROPERTY(QString maxString READ maxString CONSTANT) Q_PROPERTY(QString name READ name CONSTANT)
Q_PROPERTY(bool maxIsDefaultForType READ maxIsDefaultForType CONSTANT) Q_PROPERTY(QString shortDescription READ shortDescription CONSTANT)
Q_PROPERTY(int decimalPlaces READ decimalPlaces CONSTANT) Q_PROPERTY(FactMetaData::ValueType_t type READ type CONSTANT)
Q_PROPERTY(QString units READ units CONSTANT)
Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged)
Q_PROPERTY(bool valueEqualsDefault READ valueEqualsDefault NOTIFY valueChanged)
Q_PROPERTY(QVariant valueString READ valueString NOTIFY valueChanged)
/// Convert and validate value /// Convert and validate value
/// @param convertOnly true: validate type conversion only, false: validate against meta data as well /// @param convertOnly true: validate type conversion only, false: validate against meta data as well
Q_INVOKABLE QString validate(const QString& value, bool convertOnly); Q_INVOKABLE QString validate(const QString& value, bool convertOnly);
// Property system methods int componentId (void) const;
int decimalPlaces (void) const;
QString name(void) const; QVariant defaultValue (void) const;
int componentId(void) const; bool defaultValueAvailable (void) const;
QVariant value(void) const; QString defaultValueString (void) const;
QString valueString(void) const; int enumIndex (void) const;
QVariant defaultValue(void) const; QStringList enumStrings (void) const;
QString defaultValueString(void) const; QString enumStringValue (void) const;
bool defaultValueAvailable(void) const; QVariantList enumValues (void) const;
bool valueEqualsDefault(void) const; QString group (void) const;
QString shortDescription(void) const; QString longDescription (void) const;
QString longDescription(void) const; QVariant max (void) const;
QString units(void) const; QString maxString (void) const;
QVariant min(void) const; bool maxIsDefaultForType (void) const;
QString minString(void) const; QVariant min (void) const;
bool minIsDefaultForType(void) const; QString minString (void) const;
QVariant max(void) const; bool minIsDefaultForType (void) const;
QString maxString(void) const; QString name (void) const;
bool maxIsDefaultForType(void) const; QVariant rawValue (void) const { return _rawValue; } /// value prior to translation, careful
QString group(void) const; QString shortDescription (void) const;
int decimalPlaces(void) const; FactMetaData::ValueType_t type (void) const;
QString units (void) const;
QVariant value (void) const;
QString valueString (void) const;
bool valueEqualsDefault (void) const;
FactMetaData::ValueType_t type(void) const; void setRawValue (const QVariant& value);
void setValue (const QVariant& value);
void setEnumIndex (int index);
void setEnumStringValue (const QString& value);
void setValue(const QVariant& value); // C++ methods
/// Sets and sends new value to vehicle even if value is the same /// Sets and sends new value to vehicle even if value is the same
void forceSetValue(const QVariant& value); void forceSetValue(const QVariant& value);
...@@ -127,7 +138,7 @@ private: ...@@ -127,7 +138,7 @@ private:
QString _name; QString _name;
int _componentId; int _componentId;
QVariant _value; QVariant _rawValue;
FactMetaData::ValueType_t _type; FactMetaData::ValueType_t _type;
FactMetaData* _metaData; FactMetaData* _metaData;
}; };
......
...@@ -8,6 +8,17 @@ import QGroundControl.Controls 1.0 ...@@ -8,6 +8,17 @@ import QGroundControl.Controls 1.0
QGCComboBox { QGCComboBox {
property Fact fact: Fact { } property Fact fact: Fact { }
currentIndex: fact.value property bool indexModel: true ///< true: model must be specifed, selected index is fact value, false: use enum meta data
onActivated: fact.value = index
model: fact.enumStrings
currentIndex: indexModel ? fact.value : fact.enumIndex
onActivated: {
if (indexModel) {
fact.value = index
} else {
fact.enumIndex = index
}
}
} }
...@@ -33,19 +33,18 @@ ...@@ -33,19 +33,18 @@
QGC_LOGGING_CATEGORY(FactPanelControllerLog, "FactPanelControllerLog") QGC_LOGGING_CATEGORY(FactPanelControllerLog, "FactPanelControllerLog")
FactPanelController::FactPanelController(void) : FactPanelController::FactPanelController(void)
_factPanel(NULL) : _vehicle(NULL)
, _uas(NULL)
, _autopilot(NULL)
, _factPanel(NULL)
{ {
_vehicle = qgcApp()->toolbox()->multiVehicleManager()->activeVehicle(); _vehicle = qgcApp()->toolbox()->multiVehicleManager()->activeVehicle();
Q_ASSERT(_vehicle);
_uas = _vehicle->uas(); if (_vehicle) {
Q_ASSERT(_uas); _uas = _vehicle->uas();
_autopilot = _vehicle->autopilotPlugin();
_autopilot = _vehicle->autopilotPlugin(); }
Q_ASSERT(_autopilot);
Q_ASSERT(_autopilot->parametersReady());
Q_ASSERT(!_autopilot->missingParameters());
// Do a delayed check for the _factPanel finally being set correctly from Qml // Do a delayed check for the _factPanel finally being set correctly from Qml
QTimer::singleShot(1000, this, &FactPanelController::_checkForMissingFactPanel); QTimer::singleShot(1000, this, &FactPanelController::_checkForMissingFactPanel);
...@@ -114,7 +113,7 @@ bool FactPanelController::_allParametersExists(int componentId, QStringList name ...@@ -114,7 +113,7 @@ bool FactPanelController::_allParametersExists(int componentId, QStringList name
bool noMissingFacts = true; bool noMissingFacts = true;
foreach (QString name, names) { foreach (QString name, names) {
if (!_autopilot->parameterExists(componentId, name)) { if (_autopilot && !_autopilot->parameterExists(componentId, name)) {
_reportMissingParameter(componentId, name); _reportMissingParameter(componentId, name);
noMissingFacts = false; noMissingFacts = false;
} }
...@@ -132,7 +131,7 @@ void FactPanelController::_checkForMissingFactPanel(void) ...@@ -132,7 +131,7 @@ void FactPanelController::_checkForMissingFactPanel(void)
Fact* FactPanelController::getParameterFact(int componentId, const QString& name) Fact* FactPanelController::getParameterFact(int componentId, const QString& name)
{ {
if (_autopilot->parameterExists(componentId, name)) { if (_autopilot && _autopilot->parameterExists(componentId, name)) {
Fact* fact = _autopilot->getParameterFact(componentId, name); Fact* fact = _autopilot->getParameterFact(componentId, name);
QQmlEngine::setObjectOwnership(fact, QQmlEngine::CppOwnership); QQmlEngine::setObjectOwnership(fact, QQmlEngine::CppOwnership);
return fact; return fact;
...@@ -144,7 +143,7 @@ Fact* FactPanelController::getParameterFact(int componentId, const QString& name ...@@ -144,7 +143,7 @@ Fact* FactPanelController::getParameterFact(int componentId, const QString& name
bool FactPanelController::parameterExists(int componentId, const QString& name) bool FactPanelController::parameterExists(int componentId, const QString& name)
{ {
return _autopilot->parameterExists(componentId, name); return _autopilot ? _autopilot->parameterExists(componentId, name) : false;
} }
void FactPanelController::_showInternalError(const QString& errorMsg) void FactPanelController::_showInternalError(const QString& errorMsg)
......
...@@ -34,30 +34,34 @@ ...@@ -34,30 +34,34 @@
FactMetaData::FactMetaData(QObject* parent) FactMetaData::FactMetaData(QObject* parent)
: QObject(parent) : QObject(parent)
, _group("*Default Group")
, _type(valueTypeInt32) , _type(valueTypeInt32)
, _decimalPlaces(defaultDecimalPlaces)
, _defaultValue(0) , _defaultValue(0)
, _defaultValueAvailable(false) , _defaultValueAvailable(false)
, _min(_minForType()) , _group("*Default Group")
, _max(_maxForType()) , _max(_maxForType())
, _minIsDefaultForType(true)
, _maxIsDefaultForType(true) , _maxIsDefaultForType(true)
, _decimalPlaces(defaultDecimalPlaces) , _min(_minForType())
, _minIsDefaultForType(true)
, _rawTranslator(defaultTranslator)
, _cookedTranslator(defaultTranslator)
{ {
} }
FactMetaData::FactMetaData(ValueType_t type, QObject* parent) FactMetaData::FactMetaData(ValueType_t type, QObject* parent)
: QObject(parent) : QObject(parent)
, _group("*Default Group")
, _type(type) , _type(type)
, _decimalPlaces(defaultDecimalPlaces)
, _defaultValue(0) , _defaultValue(0)
, _defaultValueAvailable(false) , _defaultValueAvailable(false)
, _min(_minForType()) , _group("*Default Group")
, _max(_maxForType()) , _max(_maxForType())
, _minIsDefaultForType(true)
, _maxIsDefaultForType(true) , _maxIsDefaultForType(true)
, _decimalPlaces(defaultDecimalPlaces) , _min(_minForType())
, _minIsDefaultForType(true)
, _rawTranslator(defaultTranslator)
, _cookedTranslator(defaultTranslator)
{ {
} }
...@@ -70,16 +74,24 @@ FactMetaData::FactMetaData(const FactMetaData& other, QObject* parent) ...@@ -70,16 +74,24 @@ FactMetaData::FactMetaData(const FactMetaData& other, QObject* parent)
const FactMetaData& FactMetaData::operator=(const FactMetaData& other) const FactMetaData& FactMetaData::operator=(const FactMetaData& other)
{ {
_group = other._group; _decimalPlaces = other._decimalPlaces;
_type = other._type;
_defaultValue = other._defaultValue; _defaultValue = other._defaultValue;
_defaultValueAvailable = other._defaultValueAvailable; _defaultValueAvailable = other._defaultValueAvailable;
_min = other._min; _enumStrings = other._enumStrings;
_enumValues = other._enumValues;
_group = other._group;
_longDescription = other._longDescription;
_max = other._max; _max = other._max;
_minIsDefaultForType = other._minIsDefaultForType;
_maxIsDefaultForType = other._maxIsDefaultForType; _maxIsDefaultForType = other._maxIsDefaultForType;
_decimalPlaces = other._decimalPlaces; _min = other._min;
_minIsDefaultForType = other._minIsDefaultForType;
_name = other._name;
_shortDescription = other._shortDescription;
_type = other._type;
_units = other._units;
_rawTranslator = other._rawTranslator;
_cookedTranslator = other._cookedTranslator;
return *this; return *this;
} }
...@@ -229,3 +241,20 @@ bool FactMetaData::convertAndValidate(const QVariant& value, bool convertOnly, Q ...@@ -229,3 +241,20 @@ bool FactMetaData::convertAndValidate(const QVariant& value, bool convertOnly, Q
return convertOk && errorString.isEmpty(); return convertOk && errorString.isEmpty();
} }
void FactMetaData::setEnumInfo(const QStringList& strings, const QVariantList& values)
{
if (strings.count() != values.count()) {
qWarning() << "Count mismatch strings:values" << strings.count() << values.count();
return;
}
_enumStrings = strings;
_enumValues = values;
}
void FactMetaData::setTranslators(Translator rawTranslator, Translator cookedTranslator)
{
_rawTranslator = rawTranslator;
_cookedTranslator = cookedTranslator;
}
...@@ -51,6 +51,8 @@ public: ...@@ -51,6 +51,8 @@ public:
valueTypeFloat, valueTypeFloat,
valueTypeDouble valueTypeDouble
} ValueType_t; } ValueType_t;
typedef QVariant (*Translator)(const QVariant& from);
FactMetaData(QObject* parent = NULL); FactMetaData(QObject* parent = NULL);
FactMetaData(ValueType_t type, QObject* parent = NULL); FactMetaData(ValueType_t type, QObject* parent = NULL);
...@@ -58,32 +60,39 @@ public: ...@@ -58,32 +60,39 @@ public:
const FactMetaData& operator=(const FactMetaData& other); const FactMetaData& operator=(const FactMetaData& other);
// Property accessors int decimalPlaces (void) const { return _decimalPlaces; }
QString name(void) const { return _name; } QVariant defaultValue (void) const;
QString group(void) const { return _group; } bool defaultValueAvailable (void) const { return _defaultValueAvailable; }
ValueType_t type(void) const { return _type; } QStringList enumStrings (void) const { return _enumStrings; }
QVariant defaultValue(void) const; QVariantList enumValues (void) const { return _enumValues; }
bool defaultValueAvailable(void) const { return _defaultValueAvailable; } QString group (void) const { return _group; }
QString shortDescription(void) const { return _shortDescription; } QString longDescription (void) const { return _longDescription;}
QString longDescription(void) const { return _longDescription;} QVariant max (void) const { return _max; }
QString units(void) const { return _units; } bool maxIsDefaultForType (void) const { return _maxIsDefaultForType; }
QVariant min(void) const { return _min; } QVariant min (void) const { return _min; }
QVariant max(void) const { return _max; } bool minIsDefaultForType (void) const { return _minIsDefaultForType; }
bool minIsDefaultForType(void) const { return _minIsDefaultForType; } QString name (void) const { return _name; }
bool maxIsDefaultForType(void) const { return _maxIsDefaultForType; } QString shortDescription (void) const { return _shortDescription; }
int decimalPlaces(void) const { return _decimalPlaces; } ValueType_t type (void) const { return _type; }
QString units (void) const { return _units; }
Translator rawTranslator (void) const { return _rawTranslator; }
Translator cookedTranslator (void) const { return _cookedTranslator; }
// Property setters void setDecimalPlaces (int decimalPlaces) { _decimalPlaces = decimalPlaces; }
void setName(const QString& name) { _name = name; } void setDefaultValue (const QVariant& defaultValue);
void setGroup(const QString& group) { _group = group; } void setEnumInfo (const QStringList& strings, const QVariantList& values);
void setDefaultValue(const QVariant& defaultValue); void setGroup (const QString& group) { _group = group; }
void setLongDescription (const QString& longDescription) { _longDescription = longDescription;}
void setMax (const QVariant& max);
void setMin (const QVariant& max);
void setName (const QString& name) { _name = name; }
void setShortDescription(const QString& shortDescription) { _shortDescription = shortDescription; } void setShortDescription(const QString& shortDescription) { _shortDescription = shortDescription; }
void setLongDescription(const QString& longDescription) { _longDescription = longDescription;} void setUnits (const QString& units) { _units = units; }
void setUnits(const QString& units) { _units = units; }
void setMin(const QVariant& max); void setTranslators(Translator rawTranslator, Translator cookedTranslator);
void setMax(const QVariant& max); static QVariant defaultTranslator(const QVariant& from) { return from; }
void setDecimalPlaces(int decimalPlaces) { _decimalPlaces = decimalPlaces; }
/// Converts the specified value, validating against meta data /// Converts the specified value, validating against meta data
/// @param value Value to convert, can be string /// @param value Value to convert, can be string
/// @param convertOnly true: convert to correct type only, do not validate against meta data /// @param convertOnly true: convert to correct type only, do not validate against meta data
...@@ -98,19 +107,23 @@ private: ...@@ -98,19 +107,23 @@ private:
QVariant _minForType(void) const; QVariant _minForType(void) const;
QVariant _maxForType(void) const; QVariant _maxForType(void) const;
QString _name; ValueType_t _type; // must be first for correct constructor init
QString _group; int _decimalPlaces;
ValueType_t _type; QVariant _defaultValue;
QVariant _defaultValue; bool _defaultValueAvailable;
bool _defaultValueAvailable; QStringList _enumStrings;
QString _shortDescription; QVariantList _enumValues;
QString _longDescription; QString _group;
QString _units; QString _longDescription;
QVariant _min; QVariant _max;
QVariant _max; bool _maxIsDefaultForType;
bool _minIsDefaultForType; QVariant _min;
bool _maxIsDefaultForType; bool _minIsDefaultForType;
int _decimalPlaces; QString _name;
QString _shortDescription;
QString _units;
Translator _rawTranslator;
Translator _cookedTranslator;
}; };
#endif #endif
...@@ -389,3 +389,13 @@ void APMFirmwarePlugin::addMetaDataToFact(Fact* fact) ...@@ -389,3 +389,13 @@ void APMFirmwarePlugin::addMetaDataToFact(Fact* fact)
{ {
_parameterMetaData.addMetaDataToFact(fact); _parameterMetaData.addMetaDataToFact(fact);
} }
QList<MAV_CMD> APMFirmwarePlugin::supportedMissionCommands(void)
{
QList<MAV_CMD> list;
// FIXME: Temp list, just dup of PX4
list << MAV_CMD_NAV_WAYPOINT << MAV_CMD_NAV_LOITER_UNLIM << MAV_CMD_NAV_LOITER_TURNS << MAV_CMD_NAV_LOITER_TIME
<< MAV_CMD_NAV_RETURN_TO_LAUNCH << MAV_CMD_NAV_LAND << MAV_CMD_NAV_TAKEOFF << MAV_CMD_CONDITION_DELAY << MAV_CMD_DO_JUMP;
return list;
}
...@@ -91,6 +91,7 @@ public: ...@@ -91,6 +91,7 @@ public:
virtual bool sendHomePositionToVehicle(void); virtual bool sendHomePositionToVehicle(void);
virtual void addMetaDataToFact(Fact* fact); virtual void addMetaDataToFact(Fact* fact);
virtual QString getDefaultComponentIdParam(void) const { return QString("SYSID_SW_TYPE"); } virtual QString getDefaultComponentIdParam(void) const { return QString("SYSID_SW_TYPE"); }
virtual QList<MAV_CMD> supportedMissionCommands(void);
protected: protected:
/// All access to singleton is through stack specific implementation /// All access to singleton is through stack specific implementation
......
...@@ -109,6 +109,9 @@ public: ...@@ -109,6 +109,9 @@ public:
/// Adds the parameter meta data to the Fact /// Adds the parameter meta data to the Fact
virtual void addMetaDataToFact(Fact* fact) = 0; virtual void addMetaDataToFact(Fact* fact) = 0;
/// List of supported mission commands. Empty list for all commands supported.
virtual QList<MAV_CMD> supportedMissionCommands(void) = 0;
}; };
#endif #endif
...@@ -118,3 +118,9 @@ void GenericFirmwarePlugin::addMetaDataToFact(Fact* fact) ...@@ -118,3 +118,9 @@ void GenericFirmwarePlugin::addMetaDataToFact(Fact* fact)
FactMetaData* metaData = new FactMetaData(fact->type(), fact); FactMetaData* metaData = new FactMetaData(fact->type(), fact);
fact->setMetaData(metaData); fact->setMetaData(metaData);
} }
QList<MAV_CMD> GenericFirmwarePlugin::supportedMissionCommands(void)
{
// Generic supports all commands
return QList<MAV_CMD>();
}
...@@ -47,6 +47,7 @@ public: ...@@ -47,6 +47,7 @@ public:
virtual bool sendHomePositionToVehicle(void); virtual bool sendHomePositionToVehicle(void);
virtual void addMetaDataToFact(Fact* fact); virtual void addMetaDataToFact(Fact* fact);
virtual QString getDefaultComponentIdParam(void) const { return QString(); } virtual QString getDefaultComponentIdParam(void) const { return QString(); }
virtual QList<MAV_CMD> supportedMissionCommands(void);
}; };
#endif #endif
...@@ -207,3 +207,15 @@ void PX4FirmwarePlugin::addMetaDataToFact(Fact* fact) ...@@ -207,3 +207,15 @@ void PX4FirmwarePlugin::addMetaDataToFact(Fact* fact)
{ {
_parameterMetaData.addMetaDataToFact(fact); _parameterMetaData.addMetaDataToFact(fact);
} }
QList<MAV_CMD> PX4FirmwarePlugin::supportedMissionCommands(void)
{
QList<MAV_CMD> list;
list << MAV_CMD_NAV_WAYPOINT
<< MAV_CMD_NAV_LOITER_UNLIM << MAV_CMD_NAV_LOITER_TURNS << MAV_CMD_NAV_LOITER_TIME
<< MAV_CMD_NAV_ROI
<< MAV_CMD_NAV_LAND << MAV_CMD_NAV_TAKEOFF
<< MAV_CMD_DO_JUMP << MAV_CMD_DO_SET_SERVO;
return list;
}
...@@ -47,6 +47,7 @@ public: ...@@ -47,6 +47,7 @@ public:
virtual bool sendHomePositionToVehicle(void); virtual bool sendHomePositionToVehicle(void);
virtual void addMetaDataToFact(Fact* fact); virtual void addMetaDataToFact(Fact* fact);
virtual QString getDefaultComponentIdParam(void) const { return QString("SYS_AUTOSTART"); } virtual QString getDefaultComponentIdParam(void) const { return QString("SYS_AUTOSTART"); }
virtual QList<MAV_CMD> supportedMissionCommands(void);
private: private:
PX4ParameterMetaData _parameterMetaData; PX4ParameterMetaData _parameterMetaData;
......
...@@ -43,7 +43,7 @@ Item { ...@@ -43,7 +43,7 @@ Item {
QGCPalette { id: qgcPal; colorGroupEnabled: enabled } QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
property real avaiableHeight: parent.height property real availableHeight: parent.height
property bool interactive: true property bool interactive: true
readonly property bool isBackgroundDark: _mainIsMap ? (_flightMap ? _flightMap.isSatelliteMap : true) : true readonly property bool isBackgroundDark: _mainIsMap ? (_flightMap ? _flightMap.isSatelliteMap : true) : true
...@@ -213,7 +213,7 @@ Item { ...@@ -213,7 +213,7 @@ Item {
anchors.right: parent.right anchors.right: parent.right
anchors.left: parent.left anchors.left: parent.left
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
height: avaiableHeight height: availableHeight
} }
} }
...@@ -40,7 +40,8 @@ import QGroundControl.Controllers 1.0 ...@@ -40,7 +40,8 @@ import QGroundControl.Controllers 1.0
QGCView { QGCView {
id: _root id: _root
viewPanel: panel viewPanel: panel
topDialogMargin: height - mainWindow.availableHeight
// zOrder comes from the Loader in MainWindow.qml // zOrder comes from the Loader in MainWindow.qml
z: QGroundControl.zOrderTopMost z: QGroundControl.zOrderTopMost
...@@ -148,10 +149,6 @@ QGCView { ...@@ -148,10 +149,6 @@ QGCView {
latitude: mainWindow.tabletPosition.latitude latitude: mainWindow.tabletPosition.latitude
longitude: mainWindow.tabletPosition.longitude longitude: mainWindow.tabletPosition.longitude
Component.onCompleted: {
console.log("Init coordinate " + mainWindow.tabletPosition.latitude)
}
readonly property real animationDuration: 500 readonly property real animationDuration: 500
Behavior on zoomLevel { Behavior on zoomLevel {
...@@ -211,7 +208,6 @@ QGCView { ...@@ -211,7 +208,6 @@ QGCView {
property var missionItem property var missionItem
property var missionItemIndicator property var missionItemIndicator
property real heading: missionItem ? missionItem.heading : 0
readonly property real _radius: ScreenTools.defaultFontPixelHeight * 4 readonly property real _radius: ScreenTools.defaultFontPixelHeight * 4
readonly property real _arrowHeight: ScreenTools.defaultFontPixelHeight readonly property real _arrowHeight: ScreenTools.defaultFontPixelHeight
...@@ -328,30 +324,34 @@ QGCView { ...@@ -328,30 +324,34 @@ QGCView {
onClicked: setCurrentItem(object.sequenceNumber) onClicked: setCurrentItem(object.sequenceNumber)
Connections { function updateItemIndicator()
target: object {
if (object.isCurrentItem) {
onIsCurrentItemChanged: { _root.showDistance(object)
if (object.isCurrentItem) { if (object.specifiesCoordinate) {
_root.showDistance(object) // Setup our drag item
if (object.specifiesCoordinate) { if (object.sequenceNumber != 0) {
// Setup our drag item itemDragger.visible = true
if (object.sequenceNumber != 0) { itemDragger.missionItem = Qt.binding(function() { return object })
itemDragger.visible = true itemDragger.missionItemIndicator = Qt.binding(function() { return itemIndicator })
itemDragger.missionItem = Qt.binding(function() { return object }) } else {
itemDragger.missionItemIndicator = Qt.binding(function() { return itemIndicator }) itemDragger.clearItem()
} else {
itemDragger.clearItem()
}
// Move to the new position
editorMap.latitude = object.coordinate.latitude
editorMap.longitude = object.coordinate.longitude
} }
// Move to the new position
editorMap.latitude = object.coordinate.latitude
editorMap.longitude = object.coordinate.longitude
} }
} }
} }
Connections {
target: object
onIsCurrentItemChanged: updateItemIndicator()
onCommandChanged: updateItemIndicator()
}
// These are the non-coordinate child mission items attached to this item // These are the non-coordinate child mission items attached to this item
Row { Row {
anchors.top: parent.top anchors.top: parent.top
...@@ -380,7 +380,7 @@ QGCView { ...@@ -380,7 +380,7 @@ QGCView {
// Mission Item Editor // Mission Item Editor
Item { Item {
id: missionItemEditor id: missionItemEditor
height: mainWindow.avaiableHeight height: mainWindow.availableHeight
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.right: parent.right anchors.right: parent.right
width: _rightPanelWidth width: _rightPanelWidth
...@@ -389,11 +389,10 @@ QGCView { ...@@ -389,11 +389,10 @@ QGCView {
z: QGroundControl.zOrderTopMost z: QGroundControl.zOrderTopMost
ListView { ListView {
id: missionItemSummaryList
anchors.fill: parent anchors.fill: parent
spacing: _margin / 2 spacing: _margin / 2
orientation: ListView.Vertical orientation: ListView.Vertical
model: controller.canEdit ? controller.missionItems : 0 model: controller.missionItems
property real _maxItemHeight: 0 property real _maxItemHeight: 0
...@@ -416,14 +415,6 @@ QGCView { ...@@ -416,14 +415,6 @@ QGCView {
} }
} }
} // ListView } // ListView
QGCLabel {
anchors.fill: parent
visible: !controller.canEdit
wrapMode: Text.WordWrap
text: "The set of mission items you have loaded cannot be edited by QGroundControl. " +
"You will only be able to save these to a file, or send them to a vehicle."
}
} // Item - Mission Item editor } // Item - Mission Item editor
/* /*
......
This diff is collapsed.
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="114 186 72 72" style="enable-background:new 114 186 72 72;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;}
.st2{display:inline;stroke:#FFFFFF;stroke-width:1.1959;stroke-miterlimit:10;}
.st3{display:inline;fill:none;stroke:#FFFFFF;stroke-width:9.567;stroke-miterlimit:10;}
.st4{display:inline;stroke:#FFFFFF;stroke-width:0.9229;stroke-miterlimit:10;}
.st5{display:inline;fill:none;stroke:#FFFFFF;stroke-width:9.2289;stroke-miterlimit:10;}
.st6{display:inline;stroke:#FFFFFF;stroke-width:1.3383;stroke-miterlimit:10;}
.st7{display:inline;fill:#FFFFFF;}
.st8{display:inline;opacity:0.7;stroke:#FFFFFF;stroke-width:1.494;stroke-miterlimit:10;enable-background:new ;}
.st9{display:inline;opacity:0.7;stroke:#FFFFFF;stroke-width:0.9492;stroke-miterlimit:10;enable-background:new ;}
.st10{display:inline;fill:none;stroke:#000000;stroke-width:23.0795;stroke-miterlimit:10;}
.st11{enable-background:new ;}
.st12{fill:none;stroke:#000000;stroke-miterlimit:10;}
.st13{display:inline;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:10;}
.st14{display:inline;stroke:#000000;stroke-width:19.9759;stroke-miterlimit:10;}
.st15{display:inline;stroke:#000000;stroke-width:20.4762;stroke-miterlimit:10;}
.st16{display:inline;stroke:#000000;stroke-miterlimit:10;}
</style>
<g id="Media_play_icon" class="st0">
<polygon class="st1" points="389.5,36.1 138.1,181.2 138.1,-109 "/>
</g>
<g id="Document_icon" class="st0">
<rect x="153.8" y="-105.1" class="st2" width="219.9" height="282.3"/>
<line class="st3" x1="194.1" y1="-63.2" x2="334" y2="-63.2"/>
<line class="st3" x1="194.1" y1="-37.2" x2="297.3" y2="-37.2"/>
<line class="st3" x1="194.1" y1="-11.2" x2="310.8" y2="-11.2"/>
<line class="st3" x1="194.1" y1="14.9" x2="334" y2="14.9"/>
<line class="st3" x1="194.1" y1="40.9" x2="252.4" y2="40.9"/>
<line class="st3" x1="194.1" y1="67" x2="297.3" y2="67"/>
<line class="st3" x1="194.1" y1="93" x2="310.8" y2="93"/>
</g>
<g id="Contact_icon" class="st0">
<rect x="121.1" y="-72.8" class="st4" width="285.8" height="217.9"/>
<polyline class="st5" points="395.7,-62.9 264,39.8 133,-62.9 "/>
</g>
<g id="Image_icon" class="st0">
<rect x="126.4" y="-105.4" class="st6" width="274.7" height="283"/>
<rect x="153" y="-76.5" class="st7" width="220.5" height="220.5"/>
<polygon class="st8" points="299.9,130.5 162.5,130.3 231.4,11.4 "/>
<polygon class="st9" points="352.6,129.9 265.3,129.8 309,54.2 "/>
<circle class="st9" cx="296.9" cy="-12.5" r="23.9"/>
</g>
<g id="Map_icon" class="st0">
<circle class="st1" cx="263.8" cy="-10.1" r="99.2"/>
<polygon class="st1" points="263.8,182 191.3,56.4 336.3,56.4 "/>
<circle class="st7" cx="263.8" cy="-11" r="34.3"/>
</g>
<g id="Calendar_icon" class="st0">
<rect x="143.3" y="-82.8" class="st10" width="241.3" height="248.6"/>
<text transform="matrix(1 0 0 1 164.4731 113.2056)" class="st1" style="font-family:'Futura-Medium'; font-size:172.5264px;">31</text>
<text transform="matrix(1 0 0 1 164.4731 113.2056)" style="display:inline;fill:none;stroke:#000000;stroke-miterlimit:10; font-family:'Futura-Medium'; font-size:172.5264px;">31</text>
<polyline class="st1" points="306.1,147.8 364.8,147.8 364.8,89.1 "/>
<rect x="131.9" y="-105" class="st1" width="263.7" height="66.4"/>
<circle class="st13" cx="212.4" cy="-70" r="11.9"/>
<circle class="st13" cx="313.1" cy="-71.8" r="11.9"/>
</g>
<g id="Company_icon" class="st0">
<circle class="st14" cx="263.8" cy="-35.3" r="51.5"/>
<path class="st15" d="M173.4,172.9c0-81.1,40.5-146.9,90.4-146.9s90.4,65.8,90.4,146.9"/>
<polygon class="st16" points="202.7,173.1 216.3,173.2 209.9,116.5 "/>
<polygon class="st16" points="315.6,173.2 329.2,173.3 322.7,116.7 "/>
</g>
<g id="BOOUm1.tif">
<g>
<path d="M146.9,188c2,0,4.1,0,6.1,0c1.3,1.1,2,2.6,2.3,4.3c0.2,1.6,1.2,2.6,2.7,3.2c1.1,0.4,2.2,0.7,3.2,1.3
c2.5,1.5,4.8,0.9,7-0.5c2.3-1.4,2.9-1.3,4.8,0.5c0.5,0.5,1,1,1.5,1.5c2,2.1,2.2,3.4,0.5,5.9c-0.6,0.9-1.3,1.9-1.1,3
c0.6,2.6,1.5,5.2,3,7.4c1,1.5,3,1.8,4.8,2.2c1.9,0.4,2.4,1.9,2.3,3.5c-0.1,2.3,1,5.1-1.8,6.7c-0.4,0.2-1,0.2-1.5,0.4
c-1.3,0.4-2.7,0.8-3.7,1.8c-2.7,2.9-3.2,7.8-1.1,11.2c1,1.5,0.8,2.7-0.3,4c-0.5,0.6-1.1,1.2-1.7,1.8c-2.3,2.3-3.5,2.5-6.2,0.7
c-1.6-1.1-3.2-1.2-4.9-0.5c-0.8,0.3-1.6,0.8-2.5,1c-3.1,0.8-4.6,2.8-5,5.8c-0.3,1.8-1.4,2.6-3.1,2.7c-0.8,0-1.5,0-2.3,0
c-3.5,0-4.4-0.8-5-4.1c-0.2-0.9-0.4-1.8-1.2-2.3c-2.2-1.7-4.8-2.6-7.5-3.3c-1.7-0.4-3.3,0.8-4.7,1.7c-1.4,1-2.6,0.7-3.8-0.3
c-0.6-0.5-1.2-1.1-1.8-1.7c-2.4-2.4-2.6-3.5-0.7-6.3c1-1.5,1.1-2.9,0.5-4.5c-0.4-0.9-0.9-1.9-1.1-2.8c-0.8-3.1-3-4.5-5.9-5
c-0.9-0.1-1.6-0.4-2.1-1.2c-2.1-3.3-0.2-8.3,3.5-9.2c1.8-0.4,2.9-1.4,3.6-3.1c0.3-0.8,0.6-1.7,1-2.5c1.6-2.8,1.2-5.4-0.6-7.8
c-1.1-1.4-0.8-2.7,0.3-4c0.6-0.6,1.1-1.2,1.7-1.8c2.3-2.2,3.5-2.4,6.2-0.6c1.5,1,3,1.3,4.7,0.5c0.9-0.4,1.9-0.9,2.8-1.1
c3-0.7,4.4-2.9,4.8-5.7C145,189.4,145.7,188.6,146.9,188z M150,233.9c6.7,0,12.1-5.4,12.1-12c-0.1-6.5-5.5-11.9-12.1-11.9
c-6.6,0-11.9,5.4-11.9,12C138.2,228.7,143.4,233.9,150,233.9z"/>
</g>
</g>
</svg>
This diff is collapsed.
...@@ -37,7 +37,6 @@ MissionController::MissionController(QObject *parent) ...@@ -37,7 +37,6 @@ MissionController::MissionController(QObject *parent)
: QObject(parent) : QObject(parent)
, _editMode(false) , _editMode(false)
, _missionItems(NULL) , _missionItems(NULL)
, _canEdit(true)
, _activeVehicle(NULL) , _activeVehicle(NULL)
, _liveHomePositionAvailable(false) , _liveHomePositionAvailable(false)
, _autoSync(false) , _autoSync(false)
...@@ -51,7 +50,6 @@ MissionController::MissionController(QObject *parent) ...@@ -51,7 +50,6 @@ MissionController::MissionController(QObject *parent)
MissionController::~MissionController() MissionController::~MissionController()
{ {
// Start with empty list // Start with empty list
_canEdit = true;
_missionItems = new QmlObjectListModel(this); _missionItems = new QmlObjectListModel(this);
_initAllMissionItems(); _initAllMissionItems();
} }
...@@ -129,11 +127,9 @@ void MissionController::_setupMissionItems(bool loadFromVehicle, bool forceLoad) ...@@ -129,11 +127,9 @@ void MissionController::_setupMissionItems(bool loadFromVehicle, bool forceLoad)
} }
if (!missionManager || !loadFromVehicle || missionManager->inProgress()) { if (!missionManager || !loadFromVehicle || missionManager->inProgress()) {
_canEdit = true;
_missionItems = new QmlObjectListModel(this); _missionItems = new QmlObjectListModel(this);
qCDebug(MissionControllerLog) << "creating empty set"; qCDebug(MissionControllerLog) << "creating empty set";
} else { } else {
_canEdit = missionManager->canEdit();
_missionItems = missionManager->copyMissionItems(); _missionItems = missionManager->copyMissionItems();
qCDebug(MissionControllerLog) << "loading from vehicle count"<< _missionItems->count(); qCDebug(MissionControllerLog) << "loading from vehicle count"<< _missionItems->count();
} }
...@@ -163,18 +159,15 @@ void MissionController::sendMissionItems(void) ...@@ -163,18 +159,15 @@ void MissionController::sendMissionItems(void)
int MissionController::addMissionItem(QGeoCoordinate coordinate) int MissionController::addMissionItem(QGeoCoordinate coordinate)
{ {
if (!_canEdit) { MissionItem * newItem = new MissionItem(this);
qWarning() << "addMissionItem called with _canEdit == false"; newItem->setSequenceNumber(_missionItems->count());
} newItem->setCoordinate(coordinate);
newItem->setCommand(MAV_CMD_NAV_WAYPOINT);
// Coordinate will come through without altitude
coordinate.setAltitude(MissionItem::defaultAltitude);
MissionItem * newItem = new MissionItem(this, _missionItems->count(), coordinate, MAV_CMD_NAV_WAYPOINT);
_initMissionItem(newItem); _initMissionItem(newItem);
if (_missionItems->count() == 1) { if (_missionItems->count() == 1) {
newItem->setCommand(MavlinkQmlSingleton::MAV_CMD_NAV_TAKEOFF); newItem->setCommand(MavlinkQmlSingleton::MAV_CMD_NAV_TAKEOFF);
} }
newItem->setDefaultsForCommand();
_missionItems->append(newItem); _missionItems->append(newItem);
_recalcAll(); _recalcAll();
...@@ -184,11 +177,6 @@ int MissionController::addMissionItem(QGeoCoordinate coordinate) ...@@ -184,11 +177,6 @@ int MissionController::addMissionItem(QGeoCoordinate coordinate)
void MissionController::removeMissionItem(int index) void MissionController::removeMissionItem(int index)
{ {
if (!_canEdit) {
qWarning() << "addMissionItem called with _canEdit == false";
return;
}
MissionItem* item = qobject_cast<MissionItem*>(_missionItems->removeAt(index)); MissionItem* item = qobject_cast<MissionItem*>(_missionItems->removeAt(index));
_deinitMissionItem(item); _deinitMissionItem(item);
...@@ -221,8 +209,6 @@ void MissionController::loadMissionFromFile(void) ...@@ -221,8 +209,6 @@ void MissionController::loadMissionFromFile(void)
} }
_missionItems = new QmlObjectListModel(this); _missionItems = new QmlObjectListModel(this);
_canEdit = true;
// FIXME: This needs to handle APM files which have WP 0 in them // FIXME: This needs to handle APM files which have WP 0 in them
QFile file(filename); QFile file(filename);
...@@ -242,10 +228,6 @@ void MissionController::loadMissionFromFile(void) ...@@ -242,10 +228,6 @@ void MissionController::loadMissionFromFile(void)
if (item->load(in)) { if (item->load(in)) {
_missionItems->append(item); _missionItems->append(item);
if (!item->canEdit()) {
_canEdit = false;
}
} else { } else {
errorString = "The mission file is corrupted."; errorString = "The mission file is corrupted.";
break; break;
...@@ -422,7 +404,9 @@ void MissionController::_initAllMissionItems(void) ...@@ -422,7 +404,9 @@ void MissionController::_initAllMissionItems(void)
// Add the home position item to the front // Add the home position item to the front
homeItem = new MissionItem(this); homeItem = new MissionItem(this);
homeItem->setHomePositionSpecialCase(true); homeItem->setHomePositionSpecialCase(true);
homeItem->setCommand(MavlinkQmlSingleton::MAV_CMD_NAV_WAYPOINT); homeItem->setCommand(MavlinkQmlSingleton::MAV_CMD_NAV_LAST);
homeItem->setFrame(MAV_FRAME_GLOBAL_RELATIVE_ALT);
homeItem->setSequenceNumber(0);
_missionItems->insert(0, homeItem); _missionItems->insert(0, homeItem);
} }
homeItem->setHomePositionValid(false); homeItem->setHomePositionValid(false);
...@@ -434,7 +418,6 @@ void MissionController::_initAllMissionItems(void) ...@@ -434,7 +418,6 @@ void MissionController::_initAllMissionItems(void)
_recalcAll(); _recalcAll();
emit missionItemsChanged(); emit missionItemsChanged();
emit canEditChanged(_canEdit);
_missionItems->setDirty(false); _missionItems->setDirty(false);
......
...@@ -42,7 +42,6 @@ public: ...@@ -42,7 +42,6 @@ public:
Q_PROPERTY(QmlObjectListModel* missionItems READ missionItems NOTIFY missionItemsChanged) Q_PROPERTY(QmlObjectListModel* missionItems READ missionItems NOTIFY missionItemsChanged)
Q_PROPERTY(QmlObjectListModel* waypointLines READ waypointLines NOTIFY waypointLinesChanged) Q_PROPERTY(QmlObjectListModel* waypointLines READ waypointLines NOTIFY waypointLinesChanged)
Q_PROPERTY(bool canEdit READ canEdit NOTIFY canEditChanged)
Q_PROPERTY(bool liveHomePositionAvailable READ liveHomePositionAvailable NOTIFY liveHomePositionAvailableChanged) Q_PROPERTY(bool liveHomePositionAvailable READ liveHomePositionAvailable NOTIFY liveHomePositionAvailableChanged)
Q_PROPERTY(QGeoCoordinate liveHomePosition READ liveHomePosition NOTIFY liveHomePositionChanged) Q_PROPERTY(QGeoCoordinate liveHomePosition READ liveHomePosition NOTIFY liveHomePositionChanged)
Q_PROPERTY(bool autoSync READ autoSync WRITE setAutoSync NOTIFY autoSyncChanged) Q_PROPERTY(bool autoSync READ autoSync WRITE setAutoSync NOTIFY autoSyncChanged)
...@@ -60,7 +59,6 @@ public: ...@@ -60,7 +59,6 @@ public:
QmlObjectListModel* missionItems(void); QmlObjectListModel* missionItems(void);
QmlObjectListModel* waypointLines(void) { return &_waypointLines; } QmlObjectListModel* waypointLines(void) { return &_waypointLines; }
bool canEdit(void) { return _canEdit; }
bool liveHomePositionAvailable(void) { return _liveHomePositionAvailable; } bool liveHomePositionAvailable(void) { return _liveHomePositionAvailable; }
QGeoCoordinate liveHomePosition(void) { return _liveHomePosition; } QGeoCoordinate liveHomePosition(void) { return _liveHomePosition; }
bool autoSync(void) { return _autoSync; } bool autoSync(void) { return _autoSync; }
...@@ -68,7 +66,6 @@ public: ...@@ -68,7 +66,6 @@ public:
signals: signals:
void missionItemsChanged(void); void missionItemsChanged(void);
void canEditChanged(bool canEdit);
void waypointLinesChanged(void); void waypointLinesChanged(void);
void liveHomePositionAvailableChanged(bool homePositionAvailable); void liveHomePositionAvailableChanged(bool homePositionAvailable);
void liveHomePositionChanged(const QGeoCoordinate& homePosition); void liveHomePositionChanged(const QGeoCoordinate& homePosition);
...@@ -103,7 +100,6 @@ private: ...@@ -103,7 +100,6 @@ private:
bool _editMode; bool _editMode;
QmlObjectListModel* _missionItems; QmlObjectListModel* _missionItems;
QmlObjectListModel _waypointLines; QmlObjectListModel _waypointLines;
bool _canEdit; ///< true: UI can edit these items, false: can't edit, can only send to vehicle or save
Vehicle* _activeVehicle; Vehicle* _activeVehicle;
bool _liveHomePositionAvailable; bool _liveHomePositionAvailable;
QGeoCoordinate _liveHomePosition; QGeoCoordinate _liveHomePosition;
......
...@@ -48,7 +48,6 @@ void MissionControllerManagerTest::_initForFirmwareType(MAV_AUTOPILOT firmwareTy ...@@ -48,7 +48,6 @@ void MissionControllerManagerTest::_initForFirmwareType(MAV_AUTOPILOT firmwareTy
_missionManager = qgcApp()->toolbox()->multiVehicleManager()->activeVehicle()->missionManager(); _missionManager = qgcApp()->toolbox()->multiVehicleManager()->activeVehicle()->missionManager();
QVERIFY(_missionManager); QVERIFY(_missionManager);
_rgMissionManagerSignals[canEditChangedSignalIndex] = SIGNAL(canEditChanged(bool));
_rgMissionManagerSignals[newMissionItemsAvailableSignalIndex] = SIGNAL(newMissionItemsAvailable(void)); _rgMissionManagerSignals[newMissionItemsAvailableSignalIndex] = SIGNAL(newMissionItemsAvailable(void));
_rgMissionManagerSignals[inProgressChangedSignalIndex] = SIGNAL(inProgressChanged(bool)); _rgMissionManagerSignals[inProgressChangedSignalIndex] = SIGNAL(inProgressChanged(bool));
_rgMissionManagerSignals[errorSignalIndex] = SIGNAL(error(int, const QString&)); _rgMissionManagerSignals[errorSignalIndex] = SIGNAL(error(int, const QString&));
...@@ -61,7 +60,6 @@ void MissionControllerManagerTest::_initForFirmwareType(MAV_AUTOPILOT firmwareTy ...@@ -61,7 +60,6 @@ void MissionControllerManagerTest::_initForFirmwareType(MAV_AUTOPILOT firmwareTy
_multiSpyMissionManager->waitForSignalByIndex(newMissionItemsAvailableSignalIndex, _missionManagerSignalWaitTime); _multiSpyMissionManager->waitForSignalByIndex(newMissionItemsAvailableSignalIndex, _missionManagerSignalWaitTime);
_multiSpyMissionManager->waitForSignalByIndex(inProgressChangedSignalIndex, _missionManagerSignalWaitTime); _multiSpyMissionManager->waitForSignalByIndex(inProgressChangedSignalIndex, _missionManagerSignalWaitTime);
QCOMPARE(_multiSpyMissionManager->checkSignalByMask(newMissionItemsAvailableSignalMask | inProgressChangedSignalMask), true); QCOMPARE(_multiSpyMissionManager->checkSignalByMask(newMissionItemsAvailableSignalMask | inProgressChangedSignalMask), true);
QCOMPARE(_multiSpyMissionManager->checkNoSignalByMask(canEditChangedSignalIndex), true);
} }
QVERIFY(!_missionManager->inProgress()); QVERIFY(!_missionManager->inProgress());
......
...@@ -49,16 +49,16 @@ protected: ...@@ -49,16 +49,16 @@ protected:
MissionManager* _missionManager; MissionManager* _missionManager;
typedef struct { typedef struct {
int sequenceNumber; int sequenceNumber;
QGeoCoordinate coordinate; QGeoCoordinate coordinate;
int command; MAV_CMD command;
double param1; double param1;
double param2; double param2;
double param3; double param3;
double param4; double param4;
bool autocontinue; bool autocontinue;
bool isCurrentItem; bool isCurrentItem;
int frame; MAV_FRAME frame;
} ItemInfo_t; } ItemInfo_t;
typedef struct { typedef struct {
...@@ -67,15 +67,13 @@ protected: ...@@ -67,15 +67,13 @@ protected:
} TestCase_t; } TestCase_t;
typedef enum { typedef enum {
canEditChangedSignalIndex = 0, newMissionItemsAvailableSignalIndex = 0,
newMissionItemsAvailableSignalIndex,
inProgressChangedSignalIndex, inProgressChangedSignalIndex,
errorSignalIndex, errorSignalIndex,
maxSignalIndex maxSignalIndex
} MissionManagerSignalIndex_t; } MissionManagerSignalIndex_t;
typedef enum { typedef enum {
canEditChangedSignalMask = 1 << canEditChangedSignalIndex,
newMissionItemsAvailableSignalMask = 1 << newMissionItemsAvailableSignalIndex, newMissionItemsAvailableSignalMask = 1 << newMissionItemsAvailableSignalIndex,
inProgressChangedSignalMask = 1 << inProgressChangedSignalIndex, inProgressChangedSignalMask = 1 << inProgressChangedSignalIndex,
errorSignalMask = 1 << errorSignalIndex, errorSignalMask = 1 << errorSignalIndex,
......
This diff is collapsed.
This diff is collapsed.
...@@ -54,11 +54,12 @@ const MissionItemTest::FactValue_t MissionItemTest::_rgFactValuesLoiterTurns[] = ...@@ -54,11 +54,12 @@ const MissionItemTest::FactValue_t MissionItemTest::_rgFactValuesLoiterTurns[] =
const MissionItemTest::FactValue_t MissionItemTest::_rgFactValuesLoiterTime[] = { const MissionItemTest::FactValue_t MissionItemTest::_rgFactValuesLoiterTime[] = {
{ "Altitude:", -30.0 }, { "Altitude:", -30.0 },
{ "Radius:", 30.0 }, { "Radius:", 30.0 },
{ "Seconds:", 10.0 }, { "Hold:", 10.0 },
}; };
const MissionItemTest::FactValue_t MissionItemTest::_rgFactValuesLand[] = { const MissionItemTest::FactValue_t MissionItemTest::_rgFactValuesLand[] = {
{ "Altitude:", -30.0 }, { "Altitude:", -30.0 },
{ "Abort Alt:", 10.0 },
{ "Heading:", 1.0 }, { "Heading:", 1.0 },
}; };
...@@ -69,11 +70,11 @@ const MissionItemTest::FactValue_t MissionItemTest::_rgFactValuesTakeoff[] = { ...@@ -69,11 +70,11 @@ const MissionItemTest::FactValue_t MissionItemTest::_rgFactValuesTakeoff[] = {
}; };
const MissionItemTest::FactValue_t MissionItemTest::_rgFactValuesConditionDelay[] = { const MissionItemTest::FactValue_t MissionItemTest::_rgFactValuesConditionDelay[] = {
{ "Seconds:", 10.0 }, { "Hold:", 10.0 },
}; };
const MissionItemTest::FactValue_t MissionItemTest::_rgFactValuesDoJump[] = { const MissionItemTest::FactValue_t MissionItemTest::_rgFactValuesDoJump[] = {
{ "Seq #:", 10.0 }, { "Item #:", 10.0 },
{ "Repeat:", 20.0 }, { "Repeat:", 20.0 },
}; };
...@@ -101,18 +102,19 @@ void MissionItemTest::_test(void) ...@@ -101,18 +102,19 @@ void MissionItemTest::_test(void)
qDebug() << "Command:" << info->command; qDebug() << "Command:" << info->command;
MissionItem* item = new MissionItem(NULL, MissionItem* item = new MissionItem(info->sequenceNumber,
info->sequenceNumber,
info->coordinate,
info->command, info->command,
info->frame,
info->param1, info->param1,
info->param2, info->param2,
info->param3, info->param3,
info->param4, info->param4,
info->coordinate.latitude(),
info->coordinate.longitude(),
info->coordinate.altitude(),
info->autocontinue, info->autocontinue,
info->isCurrentItem, info->isCurrentItem);
info->frame);
// Validate the saving is working correctly // Validate the saving is working correctly
QString savedItemString; QString savedItemString;
QTextStream saveStream(&savedItemString, QIODevice::WriteOnly); QTextStream saveStream(&savedItemString, QIODevice::WriteOnly);
...@@ -129,28 +131,24 @@ void MissionItemTest::_test(void) ...@@ -129,28 +131,24 @@ void MissionItemTest::_test(void)
const FactValue_t* factValue = &expected->rgFactValues[j]; const FactValue_t* factValue = &expected->rgFactValues[j];
if (factValue->name == fact->name()) { if (factValue->name == fact->name()) {
qDebug() << factValue->name; QCOMPARE(fact->rawValue().toDouble(), factValue->value);
if (strcmp(factValue->name, "Heading:") == 0) {
QCOMPARE(fact->value().toDouble() * (M_PI / 180.0), item->_yawRadians());
} else {
QCOMPARE(fact->value().toDouble(), factValue->value);
}
factCount ++; factCount ++;
found = true; found = true;
break; break;
} }
} }
if (!found) {
qDebug() << fact->name();
}
QVERIFY(found); QVERIFY(found);
} }
qDebug() << info->command;
QCOMPARE(factCount, expected->cFactValues); QCOMPARE(factCount, expected->cFactValues);
// Validate that loading is working correctly // Validate that loading is working correctly
MissionItem* loadedItem = new MissionItem(); MissionItem* loadedItem = new MissionItem();
QTextStream loadStream(&savedItemString, QIODevice::ReadOnly); QTextStream loadStream(&savedItemString, QIODevice::ReadOnly);
QVERIFY(loadedItem->load(loadStream)); QVERIFY(loadedItem->load(loadStream));
//qDebug() << savedItemString;
QCOMPARE(loadedItem->coordinate().latitude(), item->coordinate().latitude()); QCOMPARE(loadedItem->coordinate().latitude(), item->coordinate().latitude());
QCOMPARE(loadedItem->coordinate().longitude(), item->coordinate().longitude()); QCOMPARE(loadedItem->coordinate().longitude(), item->coordinate().longitude());
QCOMPARE(loadedItem->coordinate().altitude(), item->coordinate().altitude()); QCOMPARE(loadedItem->coordinate().altitude(), item->coordinate().altitude());
......
...@@ -49,14 +49,14 @@ private: ...@@ -49,14 +49,14 @@ private:
typedef struct { typedef struct {
int sequenceNumber; int sequenceNumber;
QGeoCoordinate coordinate; QGeoCoordinate coordinate;
int command; MAV_CMD command;
double param1; double param1;
double param2; double param2;
double param3; double param3;
double param4; double param4;
bool autocontinue; bool autocontinue;
bool isCurrentItem; bool isCurrentItem;
int frame; MAV_FRAME frame;
} ItemInfo_t; } ItemInfo_t;
typedef struct { typedef struct {
......
...@@ -35,7 +35,6 @@ QGC_LOGGING_CATEGORY(MissionManagerLog, "MissionManagerLog") ...@@ -35,7 +35,6 @@ QGC_LOGGING_CATEGORY(MissionManagerLog, "MissionManagerLog")
MissionManager::MissionManager(Vehicle* vehicle) MissionManager::MissionManager(Vehicle* vehicle)
: _vehicle(vehicle) : _vehicle(vehicle)
, _cMissionItems(0) , _cMissionItems(0)
, _canEdit(true)
, _ackTimeoutTimer(NULL) , _ackTimeoutTimer(NULL)
, _retryAck(AckNone) , _retryAck(AckNone)
{ {
...@@ -287,24 +286,21 @@ void MissionManager::_handleMissionItem(const mavlink_message_t& message) ...@@ -287,24 +286,21 @@ void MissionManager::_handleMissionItem(const mavlink_message_t& message)
return; return;
} }
MissionItem* item = new MissionItem(this, MissionItem* item = new MissionItem(missionItem.seq,
missionItem.seq, (MAV_CMD)missionItem.command,
QGeoCoordinate(missionItem.x, missionItem.y, missionItem.z), (MAV_FRAME)missionItem.frame,
missionItem.command,
missionItem.param1, missionItem.param1,
missionItem.param2, missionItem.param2,
missionItem.param3, missionItem.param3,
missionItem.param4, missionItem.param4,
missionItem.x,
missionItem.y,
missionItem.z,
missionItem.autocontinue, missionItem.autocontinue,
missionItem.current, missionItem.current,
missionItem.frame); this);
_missionItems.append(item); _missionItems.append(item);
if (!item->canEdit()) {
_canEdit = false;
emit canEditChanged(false);
}
int nextSequenceNumber = missionItem.seq + 1; int nextSequenceNumber = missionItem.seq + 1;
if (nextSequenceNumber == _cMissionItems) { if (nextSequenceNumber == _cMissionItems) {
_readTransactionComplete(); _readTransactionComplete();
......
...@@ -49,13 +49,11 @@ public: ...@@ -49,13 +49,11 @@ public:
Q_PROPERTY(bool inProgress READ inProgress NOTIFY inProgressChanged) Q_PROPERTY(bool inProgress READ inProgress NOTIFY inProgressChanged)
Q_PROPERTY(QmlObjectListModel* missionItems READ missionItems CONSTANT) Q_PROPERTY(QmlObjectListModel* missionItems READ missionItems CONSTANT)
Q_PROPERTY(bool canEdit READ canEdit NOTIFY canEditChanged)
// Property accessors // Property accessors
bool inProgress(void) { return _retryAck != AckNone; } bool inProgress(void) { return _retryAck != AckNone; }
QmlObjectListModel* missionItems(void) { return &_missionItems; } QmlObjectListModel* missionItems(void) { return &_missionItems; }
bool canEdit(void) { return _canEdit; }
// C++ methods // C++ methods
...@@ -85,8 +83,6 @@ public: ...@@ -85,8 +83,6 @@ public:
static const int _maxRetryCount = 5; static const int _maxRetryCount = 5;
signals: signals:
// Public signals
void canEditChanged(bool canEdit);
void newMissionItemsAvailable(void); void newMissionItemsAvailable(void);
void inProgressChanged(bool inProgress); void inProgressChanged(bool inProgress);
void error(int errorCode, const QString& errorMsg); void error(int errorCode, const QString& errorMsg);
...@@ -123,7 +119,6 @@ private: ...@@ -123,7 +119,6 @@ private:
Vehicle* _vehicle; Vehicle* _vehicle;
int _cMissionItems; ///< Mission items on vehicle int _cMissionItems; ///< Mission items on vehicle
bool _canEdit; ///< true: Mission items are editable in the ui
QTimer* _ackTimeoutTimer; QTimer* _ackTimeoutTimer;
AckType_t _retryAck; AckType_t _retryAck;
......
...@@ -58,8 +58,7 @@ void MissionManagerTest::_writeItems(MockLinkMissionItemHandler::FailureMode_t f ...@@ -58,8 +58,7 @@ void MissionManagerTest::_writeItems(MockLinkMissionItemHandler::FailureMode_t f
homeItem->setHomePositionSpecialCase(true); homeItem->setHomePositionSpecialCase(true);
homeItem->setHomePositionValid(false); homeItem->setHomePositionValid(false);
homeItem->setCommand(MavlinkQmlSingleton::MAV_CMD_NAV_WAYPOINT); homeItem->setCommand(MavlinkQmlSingleton::MAV_CMD_NAV_WAYPOINT);
homeItem->setLatitude(47.3769); homeItem->setCoordinate(QGeoCoordinate(47.3769, 8.549444, 0));
homeItem->setLongitude(8.549444);
homeItem->setSequenceNumber(0); homeItem->setSequenceNumber(0);
list->insert(0, homeItem); list->insert(0, homeItem);
...@@ -137,8 +136,6 @@ void MissionManagerTest::_writeItems(MockLinkMissionItemHandler::FailureMode_t f ...@@ -137,8 +136,6 @@ void MissionManagerTest::_writeItems(MockLinkMissionItemHandler::FailureMode_t f
checkExpectedMessageBox(); checkExpectedMessageBox();
} }
QCOMPARE(_missionManager->canEdit(), true);
delete list; delete list;
list = NULL; list = NULL;
_multiSpyMissionManager->clearAllSignals(); _multiSpyMissionManager->clearAllSignals();
...@@ -172,7 +169,6 @@ void MissionManagerTest::_roundTripItems(MockLinkMissionItemHandler::FailureMode ...@@ -172,7 +169,6 @@ void MissionManagerTest::_roundTripItems(MockLinkMissionItemHandler::FailureMode
// newMissionItemsAvailable signal // newMissionItemsAvailable signal
_multiSpyMissionManager->waitForSignalByIndex(inProgressChangedSignalIndex, _missionManagerSignalWaitTime); _multiSpyMissionManager->waitForSignalByIndex(inProgressChangedSignalIndex, _missionManagerSignalWaitTime);
QCOMPARE(_multiSpyMissionManager->checkSignalByMask(newMissionItemsAvailableSignalMask | inProgressChangedSignalMask), true); QCOMPARE(_multiSpyMissionManager->checkSignalByMask(newMissionItemsAvailableSignalMask | inProgressChangedSignalMask), true);
QCOMPARE(_multiSpyMissionManager->checkNoSignalByMask(canEditChangedSignalMask), true);
_checkInProgressValues(false); _checkInProgressValues(false);
} else { } else {
...@@ -233,7 +229,6 @@ void MissionManagerTest::_roundTripItems(MockLinkMissionItemHandler::FailureMode ...@@ -233,7 +229,6 @@ void MissionManagerTest::_roundTripItems(MockLinkMissionItemHandler::FailureMode
} }
QCOMPARE(_missionManager->missionItems()->count(), (int)cMissionItemsExpected); QCOMPARE(_missionManager->missionItems()->count(), (int)cMissionItemsExpected);
QCOMPARE(_missionManager->canEdit(), true);
size_t firstActualItem = 0; size_t firstActualItem = 0;
if (_mockLink->getFirmwareType() == MAV_AUTOPILOT_ARDUPILOTMEGA) { if (_mockLink->getFirmwareType() == MAV_AUTOPILOT_ARDUPILOTMEGA) {
......
...@@ -40,6 +40,13 @@ Rectangle { ...@@ -40,6 +40,13 @@ Rectangle {
anchors.right: parent.right anchors.right: parent.right
height: valuesRect.visible ? valuesRect.y + valuesRect.height : valuesRect.y height: valuesRect.visible ? valuesRect.y + valuesRect.height : valuesRect.y
MouseArea {
anchors.fill: parent
visible: !missionItem.isCurrentItem
onClicked: _root.clicked()
}
MissionItemIndexLabel { MissionItemIndexLabel {
id: label id: label
anchors.verticalCenter: commandPicker.verticalCenter anchors.verticalCenter: commandPicker.verticalCenter
...@@ -47,21 +54,30 @@ Rectangle { ...@@ -47,21 +54,30 @@ Rectangle {
label: missionItem.sequenceNumber == 0 ? "H" : missionItem.sequenceNumber label: missionItem.sequenceNumber == 0 ? "H" : missionItem.sequenceNumber
} }
MouseArea { Image {
anchors.fill: parent id: rawEdit
visible: !missionItem.isCurrentItem anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 8
anchors.left: label.right
onClicked: _root.clicked() anchors.verticalCenter: commandPicker.verticalCenter
width: commandPicker.height
height: commandPicker.height
visible: missionItem.friendlyEditAllowed && missionItem.sequenceNumber != 0 && missionItem.isCurrentItem
source: "qrc:/qmlimages/CogWheel.svg"
MouseArea {
anchors.fill: parent
onClicked: missionItem.rawEdit = !missionItem.rawEdit
}
} }
QGCComboBox { FactComboBox {
id: commandPicker id: commandPicker
anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 10 anchors.leftMargin: ScreenTools.defaultFontPixelWidth
anchors.left: label.right anchors.left: rawEdit.right
anchors.right: parent.right anchors.right: parent.right
currentIndex: missionItem.commandByIndex indexModel: false
model: missionItem.commandNames fact: missionItem.supportedCommand
visible: missionItem.sequenceNumber != 0 && missionItem.isCurrentItem visible: missionItem.sequenceNumber != 0 && missionItem.isCurrentItem && !missionItem.rawEdit
onActivated: missionItem.commandByIndex = index onActivated: missionItem.commandByIndex = index
} }
...@@ -69,10 +85,9 @@ Rectangle { ...@@ -69,10 +85,9 @@ Rectangle {
Rectangle { Rectangle {
anchors.fill: commandPicker anchors.fill: commandPicker
color: qgcPal.button color: qgcPal.button
visible: !commandPicker.visible visible: missionItem.sequenceNumber == 0 || !missionItem.isCurrentItem
QGCLabel { QGCLabel {
id: homeLabel
anchors.leftMargin: ScreenTools.defaultFontPixelWidth anchors.leftMargin: ScreenTools.defaultFontPixelWidth
anchors.fill: parent anchors.fill: parent
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
...@@ -89,7 +104,7 @@ Rectangle { ...@@ -89,7 +104,7 @@ Rectangle {
anchors.right: parent.right anchors.right: parent.right
height: valuesItem.height height: valuesItem.height
color: qgcPal.windowShadeDark color: qgcPal.windowShadeDark
visible: missionItem.isCurrentItem visible: missionItem.sequenceNumber != 0 && missionItem.isCurrentItem
radius: _radius radius: _radius
Item { Item {
...@@ -110,7 +125,20 @@ Rectangle { ...@@ -110,7 +125,20 @@ Rectangle {
QGCLabel { QGCLabel {
width: parent.width width: parent.width
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
text: missionItem.commandDescription text: missionItem.rawEdit ?
"Provides advanced access to all commands/parameters. Be very careful!" :
missionItem.commandDescription
}
Repeater {
model: missionItem.comboboxFacts
FactComboBox {
width: valuesColumn.width
indexModel: false
model: object.enumStrings
fact: object
}
} }
Repeater { Repeater {
...@@ -148,7 +176,6 @@ Rectangle { ...@@ -148,7 +176,6 @@ Rectangle {
model: missionItem.checkboxFacts model: missionItem.checkboxFacts
FactCheckBox { FactCheckBox {
id: textField
text: object.name text: object.name
fact: object fact: object
} }
......
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
import QGroundControl.ScreenTools 1.0
import QGroundControl.Vehicle 1.0
/// Mission item summary display control
Rectangle {
property var missionItem ///< Mission Item object
width: ScreenTools.defaultFontPixelWidth * 15
height: valueColumn.height + radius
border.width: 2
border.color: "white"
color: "white"
radius: ScreenTools.defaultFontPixelWidth
MissionItemIndexLabel {
id: _indexLabel
anchors.top: parent.top
anchors.right: parent.right
isCurrentItem: missionItem.isCurrentItem
label: missionItem.sequenceNumber
}
Column {
anchors.margins: parent.radius / 2
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
QGCLabel {
color: "black"
horizontalAlignment: Text.AlignTop
font.weight: Font.Bold
text: missionItem.commandName
}
Repeater {
model: missionItem.valueLabels
QGCLabel {
color: "black"
text: modelData
}
}
}
Column {
id: valueColumn
anchors.margins: parent.radius / 2
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
QGCLabel {
font.weight: Font.Bold
text: " "
}
Repeater {
model: missionItem.valueStrings
QGCLabel {
width: valueColumn.width
color: "black"
text: modelData
horizontalAlignment: Text.AlignRight
}
}
}
}
...@@ -34,11 +34,13 @@ ...@@ -34,11 +34,13 @@
/// @Brief Constructs a new ParameterEditorController Widget. This widget is used within the PX4VehicleConfig set of screens. /// @Brief Constructs a new ParameterEditorController Widget. This widget is used within the PX4VehicleConfig set of screens.
ParameterEditorController::ParameterEditorController(void) ParameterEditorController::ParameterEditorController(void)
{ {
const QMap<int, QMap<QString, QStringList> >& groupMap = _autopilot->getGroupMap(); if (_autopilot) {
const QMap<int, QMap<QString, QStringList> >& groupMap = _autopilot->getGroupMap();
foreach (int componentId, groupMap.keys()) {
_componentIds += QString("%1").arg(componentId); foreach (int componentId, groupMap.keys()) {
} _componentIds += QString("%1").arg(componentId);
}
}
} }
ParameterEditorController::~ParameterEditorController() ParameterEditorController::~ParameterEditorController()
......
...@@ -59,7 +59,8 @@ QGCViewDialog { ...@@ -59,7 +59,8 @@ QGCViewDialog {
validationError.text = fact.validate(validateValue, false /* convertOnly */) validationError.text = fact.validate(validateValue, false /* convertOnly */)
forceSave.visible = true forceSave.visible = true
} }
valueField.forceActiveFocus(); // This was causing problems where it would never give up focus even when hidden!
//valueField.forceActiveFocus()
} }
Column { Column {
...@@ -83,6 +84,7 @@ QGCViewDialog { ...@@ -83,6 +84,7 @@ QGCViewDialog {
QGCTextField { QGCTextField {
id: valueField id: valueField
text: validate ? validateValue : fact.valueString text: validate ? validateValue : fact.valueString
focus: true
// At this point all Facts are numeric // At this point all Facts are numeric
inputMethodHints: Qt.ImhFormattedNumbersOnly inputMethodHints: Qt.ImhFormattedNumbersOnly
......
...@@ -37,8 +37,9 @@ import QGroundControl.FactControls 1.0 ...@@ -37,8 +37,9 @@ import QGroundControl.FactControls 1.0
FactPanel { FactPanel {
id: __rootItem id: __rootItem
property var qgcView: __rootItem /// Used by Fact controls for validation dialogs property var qgcView: __rootItem ///< Used by Fact controls for validation dialogs
property bool completedSignalled: false property bool completedSignalled: false
property real topDialogMargin: 0 ///< Set a top margin for dialog
property var viewPanel property var viewPanel
...@@ -278,11 +279,13 @@ FactPanel { ...@@ -278,11 +279,13 @@ FactPanel {
// This is the main dialog panel which is anchored to the right edge // This is the main dialog panel which is anchored to the right edge
Rectangle { Rectangle {
id: __dialogPanel id: __dialogPanel
width: __dialogCharWidth == -1 ? parent.width : defaultTextWidth * __dialogCharWidth width: __dialogCharWidth == -1 ? parent.width : defaultTextWidth * __dialogCharWidth
height: parent.height anchors.topMargin: topDialogMargin
anchors.left: __transparentSection.right anchors.top: parent.top
color: __qgcPal.windowShadeDark anchors.bottom: parent.bottom
anchors.left: __transparentSection.right
color: __qgcPal.windowShadeDark
Rectangle { Rectangle {
id: __header id: __header
...@@ -344,4 +347,4 @@ FactPanel { ...@@ -344,4 +347,4 @@ FactPanel {
message: __messageDialogText message: __messageDialogText
} }
} }
} }
\ No newline at end of file
...@@ -30,7 +30,6 @@ QGCViewDialog 1.0 QGCViewDialog.qml ...@@ -30,7 +30,6 @@ QGCViewDialog 1.0 QGCViewDialog.qml
QGCViewMessage 1.0 QGCViewMessage.qml QGCViewMessage 1.0 QGCViewMessage.qml
MissionItemIndexLabel 1.0 MissionItemIndexLabel.qml MissionItemIndexLabel 1.0 MissionItemIndexLabel.qml
MissionItemSummary 1.0 MissionItemSummary.qml
MissionItemEditor 1.0 MissionItemEditor.qml MissionItemEditor 1.0 MissionItemEditor.qml
MainToolBar 1.0 MainToolBar.qml MainToolBar 1.0 MainToolBar.qml
......
...@@ -205,7 +205,7 @@ Rectangle { ...@@ -205,7 +205,7 @@ Rectangle {
Rectangle { Rectangle {
//-- Limit height to available height (below tool bar) //-- Limit height to available height (below tool bar)
anchors.topMargin: _margin anchors.topMargin: _margin
height: mainWindow.avaiableHeight height: mainWindow.availableHeight
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
......
...@@ -44,7 +44,7 @@ Item { ...@@ -44,7 +44,7 @@ Item {
property int tbCellHeight: tbHeight * 0.75 property int tbCellHeight: tbHeight * 0.75
property real tbSpacing: ScreenTools.isMobile ? width * 0.00824 : 9.54 property real tbSpacing: ScreenTools.isMobile ? width * 0.00824 : 9.54
property real tbButtonWidth: tbCellHeight * 1.3 property real tbButtonWidth: tbCellHeight * 1.3
property real avaiableHeight: height - tbHeight property real availableHeight: height - tbHeight
property real menuButtonWidth: (tbButtonWidth * 2) + (tbSpacing * 4) + 1 property real menuButtonWidth: (tbButtonWidth * 2) + (tbSpacing * 4) + 1
property var defaultPosition: QtPositioning.coordinate(37.803784, -122.462276) property var defaultPosition: QtPositioning.coordinate(37.803784, -122.462276)
...@@ -157,7 +157,7 @@ Item { ...@@ -157,7 +157,7 @@ Item {
FlightDisplayView { FlightDisplayView {
id: flightView id: flightView
anchors.fill: parent anchors.fill: parent
avaiableHeight: mainWindow.avaiableHeight availableHeight: mainWindow.availableHeight
visible: true visible: true
Component.onCompleted: { Component.onCompleted: {
positionSource.start() positionSource.start()
......
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