From 8587ff69a60ea2e88983af938d9fd65c23b4bede Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Thu, 17 Dec 2015 15:45:41 -0800 Subject: [PATCH] Make FirmwarePlugin::supportedCommands actually work --- qgroundcontrol.pro | 6 +- src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc | 9 +-- src/MissionManager/MissionCommands.cc | 88 ++++++++++++++++++--- src/MissionManager/MissionCommands.h | 23 +++--- src/MissionManager/MissionItem.cc | 44 ----------- src/MissionManager/MissionItem.h | 6 -- src/QGCApplication.cc | 6 +- src/QmlControls/MissionCommandDialog.qml | 7 +- src/QmlControls/QGroundControlQmlGlobal.cc | 45 +++++++++-- src/QmlControls/QGroundControlQmlGlobal.h | 40 ++++++---- src/ui/preferences/GeneralSettings.qml | 70 ++++++++++------ 11 files changed, 215 insertions(+), 129 deletions(-) diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index fed4ba243..1b7934639 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -662,19 +662,21 @@ INCLUDEPATH += \ HEADERS += \ src/FactSystem/Fact.h \ + src/FactSystem/FactControls/FactPanelController.h \ src/FactSystem/FactMetaData.h \ src/FactSystem/FactSystem.h \ src/FactSystem/FactValidator.h \ src/FactSystem/ParameterLoader.h \ - src/FactSystem/FactControls/FactPanelController.h \ + src/FactSystem/SettingsFact.h \ SOURCES += \ src/FactSystem/Fact.cc \ + src/FactSystem/FactControls/FactPanelController.cc \ src/FactSystem/FactMetaData.cc \ src/FactSystem/FactSystem.cc \ src/FactSystem/FactValidator.cc \ src/FactSystem/ParameterLoader.cc \ - src/FactSystem/FactControls/FactPanelController.cc \ + src/FactSystem/SettingsFact.cc \ #------------------------------------------------------------------------------------- # Video Streaming diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc index 946f7cda7..7808b3c04 100644 --- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc +++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc @@ -216,12 +216,7 @@ QList PX4FirmwarePlugin::supportedMissionCommands(void) << 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_NAV_ROI - << MAV_CMD_NAV_GUIDED_ENABLE - << MAV_CMD_DO_SET_ROI << MAV_CMD_DO_GUIDED_LIMITS << MAV_CMD_DO_JUMP << MAV_CMD_DO_CHANGE_SPEED << MAV_CMD_DO_SET_CAM_TRIGG_DIST - << MAV_CMD_DO_SET_RELAY << MAV_CMD_DO_REPEAT_RELAY - << MAV_CMD_DO_SET_SERVO << MAV_CMD_DO_REPEAT_SERVO - << MAV_CMD_DO_DIGICAM_CONFIGURE << MAV_CMD_DO_DIGICAM_CONTROL - << MAV_CMD_DO_MOUNT_CONTROL - << MAV_CMD_CONDITION_DELAY << MAV_CMD_CONDITION_CHANGE_ALT << MAV_CMD_CONDITION_DISTANCE << MAV_CMD_CONDITION_YAW; + << MAV_CMD_DO_JUMP + << MAV_CMD_CONDITION_DELAY; return list; } diff --git a/src/MissionManager/MissionCommands.cc b/src/MissionManager/MissionCommands.cc index 0f6a1e14f..dbbc0c05b 100644 --- a/src/MissionManager/MissionCommands.cc +++ b/src/MissionManager/MissionCommands.cc @@ -22,6 +22,10 @@ This file is part of the QGROUNDCONTROL project #include "MissionCommands.h" #include "FactMetaData.h" +#include "Vehicle.h" +#include "FirmwarePluginManager.h" +#include "QGCApplication.h" +#include "QGroundControlQmlGlobal.h" #include #include @@ -60,7 +64,14 @@ const QString MissionCommands::_degreesUnits (QStringLiteral("deg MissionCommands::MissionCommands(QGCApplication* app) : QGCTool(app) { + +} + +void MissionCommands::setToolbox(QGCToolbox* toolbox) +{ + QGCTool::setToolbox(toolbox); _loadMavCmdInfoJson(); + _createFirmwareSpecificLists(); } bool MissionCommands::_validateKeyTypes(QJsonObject& jsonObject, const QStringList& keys, const QList& types) @@ -165,7 +176,6 @@ void MissionCommands::_loadMavCmdInfoJson(void) } _mavCmdInfoMap[mavCmdInfo->_command] = mavCmdInfo; - _commandList.append(mavCmdInfo); // Read params @@ -234,16 +244,13 @@ void MissionCommands::_loadMavCmdInfoJson(void) if (mavCmdInfo->_command != MAV_CMD_NAV_LAST) { // Don't add fake home postion command to categories - if (!_categories.contains(mavCmdInfo->category()) && mavCmdInfo->friendlyEdit()) { - // Only friendly edit commands go in category list - qCDebug(MissionCommandsLog) << "Adding new category"; - _categories.append(mavCmdInfo->category()); - _categoryToMavCmdInfoListMap[mavCmdInfo->category()] = new QmlObjectListModel(this); - } - if (mavCmdInfo->friendlyEdit()) { - // Only friendly edit commands go in category list - _categoryToMavCmdInfoListMap[mavCmdInfo->category()]->append(mavCmdInfo); + // Only friendly edit commands go in category list. We use MAV_AUTOPILOT_GENERIC key to store full list. + if (!_categoryToMavCmdInfoListMap.contains(MAV_AUTOPILOT_GENERIC) || !_categoryToMavCmdInfoListMap[MAV_AUTOPILOT_GENERIC].contains(mavCmdInfo->category())) { + qCDebug(MissionCommandsLog) << "Adding new category"; + _categoryToMavCmdInfoListMap[MAV_AUTOPILOT_GENERIC][mavCmdInfo->category()] = new QmlObjectListModel(this); + } + _categoryToMavCmdInfoListMap[MAV_AUTOPILOT_GENERIC][mavCmdInfo->category()]->append(mavCmdInfo); } } @@ -259,3 +266,64 @@ void MissionCommands::_loadMavCmdInfoJson(void) } } } + +MAV_AUTOPILOT MissionCommands::_firmwareTypeFromVehicle(Vehicle* vehicle) const +{ + if (vehicle) { + return vehicle->firmwareType(); + } else { + QSettings settings; + + // FIXME: Hack duplicated code from QGroundControlQmlGlobal. Had to do this for now since + // QGroundControlQmlGlobal is not available from C++ side. + + return (MAV_AUTOPILOT)settings.value("OfflineEditingFirmwareType", MAV_AUTOPILOT_ARDUPILOTMEGA).toInt(); + } +} + +QString MissionCommands::categoryFromCommand(MavlinkQmlSingleton::Qml_MAV_CMD command) const +{ + return _mavCmdInfoMap[(MAV_CMD)command]->category(); +} + +QVariant MissionCommands::getCommandsForCategory(Vehicle* vehicle, const QString& category) const +{ + return QVariant::fromValue(_categoryToMavCmdInfoListMap[_firmwareTypeFromVehicle(vehicle)][category]); +} + +const QStringList MissionCommands::categories(Vehicle* vehicle) const +{ + QStringList list; + + foreach (QString category, _categoryToMavCmdInfoListMap[_firmwareTypeFromVehicle(vehicle)].keys()) { + list << category; + } + + return list; +} + +void MissionCommands::_createFirmwareSpecificLists(void) +{ + QList firmwareList; + + firmwareList << MAV_AUTOPILOT_PX4 << MAV_AUTOPILOT_ARDUPILOTMEGA; + + foreach (MAV_AUTOPILOT firmwareType, firmwareList) { + FirmwarePlugin* plugin = _toolbox->firmwarePluginManager()->firmwarePluginForAutopilot(firmwareType, MAV_TYPE_QUADROTOR); + + QList cmdList = plugin->supportedMissionCommands(); + foreach (MAV_CMD command, cmdList) { + MavCmdInfo* mavCmdInfo = _mavCmdInfoMap[command]; + + if (mavCmdInfo->friendlyEdit()) { + if (!_categoryToMavCmdInfoListMap.contains(firmwareType) || !_categoryToMavCmdInfoListMap[firmwareType].contains(mavCmdInfo->category())) { + qCDebug(MissionCommandsLog) << "Adding new category" << firmwareType; + _categoryToMavCmdInfoListMap[firmwareType][mavCmdInfo->category()] = new QmlObjectListModel(this); + } + _categoryToMavCmdInfoListMap[firmwareType][mavCmdInfo->category()]->append(mavCmdInfo); + } else { + qWarning() << "Attempt to add non friendly edit supported command"; + } + } + } +} diff --git a/src/MissionManager/MissionCommands.h b/src/MissionManager/MissionCommands.h index ce2f214f1..200b3e584 100644 --- a/src/MissionManager/MissionCommands.h +++ b/src/MissionManager/MissionCommands.h @@ -38,6 +38,7 @@ Q_DECLARE_LOGGING_CATEGORY(MissionCommandsLog) class MissionCommands; +class Vehicle; class MavCmdParamInfo : public QObject { @@ -129,17 +130,15 @@ class MissionCommands : public QGCTool public: MissionCommands(QGCApplication* app); - Q_PROPERTY(QStringList categories READ categories CONSTANT) - Q_PROPERTY(const QmlObjectListModel* commands READ commands CONSTANT) - - Q_INVOKABLE QString categoryFromCommand(MavlinkQmlSingleton::Qml_MAV_CMD command) { return _mavCmdInfoMap[(MAV_CMD)command]->category(); } - Q_INVOKABLE const QVariant getCommandsForCategory(const QString& category) const { return QVariant::fromValue(_categoryToMavCmdInfoListMap[category]); } - - const QStringList categories (void) const { return _categories; } - const QmlObjectListModel* commands (void) const { return &_commandList; } + Q_INVOKABLE const QStringList categories (Vehicle* vehicle) const; + Q_INVOKABLE QString categoryFromCommand (MavlinkQmlSingleton::Qml_MAV_CMD command) const; + Q_INVOKABLE QVariant getCommandsForCategory (Vehicle* vehicle, const QString& category) const; const QMap& commandInfoMap(void) const { return _mavCmdInfoMap; }; + // Overrides from QGCTool + virtual void setToolbox(QGCToolbox* toolbox); + static const QString _degreesUnits; static const QString _degreesConvertUnits; @@ -147,14 +146,14 @@ signals: private: void _loadMavCmdInfoJson(void); + void _createFirmwareSpecificLists(void); void _setupMetaData(void); bool _validateKeyTypes(QJsonObject& jsonObject, const QStringList& keys, const QList& types); + MAV_AUTOPILOT _firmwareTypeFromVehicle(Vehicle* vehicle) const; private: - QStringList _categories; - QMap _categoryToMavCmdInfoListMap; - QmlObjectListModel _commandList; - QMap _mavCmdInfoMap; + QMap > _categoryToMavCmdInfoListMap; + QMap _mavCmdInfoMap; static const QString _categoryJsonKey; static const QString _decimalPlacesJsonKey; diff --git a/src/MissionManager/MissionItem.cc b/src/MissionManager/MissionItem.cc index 8f477f21c..2cd3c699e 100644 --- a/src/MissionManager/MissionItem.cc +++ b/src/MissionManager/MissionItem.cc @@ -37,7 +37,6 @@ FactMetaData* MissionItem::_defaultParamMetaData = NULL; FactMetaData* MissionItem::_frameMetaData = NULL; FactMetaData* MissionItem::_latitudeMetaData = NULL; FactMetaData* MissionItem::_longitudeMetaData = NULL; -FactMetaData* MissionItem::_supportedCommandMetaData = NULL; struct EnumInfo_s { const char * label; @@ -108,7 +107,6 @@ MissionItem::MissionItem(QObject* parent) , _param7MetaData(FactMetaData::valueTypeDouble) , _syncingAltitudeRelativeToHomeAndFrame (false) , _syncingHeadingDegreesAndParam4 (false) - , _syncingSupportedCommandAndCommand (false) , _mavCmdInfoMap(qgcApp()->toolbox()->missionCommands()->commandInfoMap()) { // Need a good command and frame before we start passing signals around @@ -167,7 +165,6 @@ MissionItem::MissionItem(int sequenceNumber, , _param7MetaData(FactMetaData::valueTypeDouble) , _syncingAltitudeRelativeToHomeAndFrame (false) , _syncingHeadingDegreesAndParam4 (false) - , _syncingSupportedCommandAndCommand (false) , _mavCmdInfoMap(qgcApp()->toolbox()->missionCommands()->commandInfoMap()) { // Need a good command and frame before we start passing signals around @@ -183,7 +180,6 @@ MissionItem::MissionItem(int sequenceNumber, setAutoContinue(autoContinue); _syncFrameToAltitudeRelativeToHome(); - _syncCommandToSupportedCommand(QVariant(this->command())); _param1Fact.setRawValue(param1); _param2Fact.setRawValue(param2); @@ -223,7 +219,6 @@ MissionItem::MissionItem(const MissionItem& other, QObject* parent) , _param4MetaData(FactMetaData::valueTypeDouble) , _syncingAltitudeRelativeToHomeAndFrame (false) , _syncingHeadingDegreesAndParam4 (false) - , _syncingSupportedCommandAndCommand (false) , _mavCmdInfoMap(qgcApp()->toolbox()->missionCommands()->commandInfoMap()) { // Need a good command and frame before we start passing signals around @@ -254,7 +249,6 @@ const MissionItem& MissionItem::operator=(const MissionItem& other) setHomePositionValid(other._homePositionValid); _syncFrameToAltitudeRelativeToHome(); - _syncCommandToSupportedCommand(QVariant(this->command())); _param1Fact.setRawValue(other._param1Fact.rawValue()); _param2Fact.setRawValue(other._param2Fact.rawValue()); @@ -282,8 +276,6 @@ void MissionItem::_connectSignals(void) connect(this, &MissionItem::sequenceNumberChanged, this, &MissionItem::_setDirtyFromSignal); // Values from these facts must propogate back and forth between the real object storage - connect(&_supportedCommandFact, &Fact::valueChanged, this, &MissionItem::_syncSupportedCommandToCommand); - connect(&_commandFact, &Fact::valueChanged, this, &MissionItem::_syncCommandToSupportedCommand); connect(&_altitudeRelativeToHomeFact, &Fact::valueChanged, this, &MissionItem::_syncAltitudeRelativeToHomeToFrame); connect(this, &MissionItem::frameChanged, this, &MissionItem::_syncFrameToAltitudeRelativeToHome); @@ -351,28 +343,10 @@ void MissionItem::_setupMetaData(void) _longitudeMetaData->setUnits("deg"); _longitudeMetaData->setDecimalPlaces(7); - enumStrings.clear(); - enumValues.clear(); - // FIXME: Hack hardcode to PX4 - QList supportedCommands = qgcApp()->toolbox()->firmwarePluginManager()->firmwarePluginForAutopilot(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR)->supportedMissionCommands(); - if (supportedCommands.count()) { - foreach (MAV_CMD command, supportedCommands) { - enumStrings.append(_mavCmdInfoMap[command]->friendlyName()); - enumValues.append(QVariant(command)); - } - } else { - foreach (const MavCmdInfo* mavCmdInfo, _mavCmdInfoMap) { - enumStrings.append(mavCmdInfo->friendlyName()); - enumValues.append(QVariant(mavCmdInfo->command())); - } - } - _supportedCommandMetaData = new FactMetaData(FactMetaData::valueTypeUint32); - _supportedCommandMetaData->setEnumInfo(enumStrings, enumValues); } _commandFact.setMetaData(_commandMetaData); _frameFact.setMetaData(_frameMetaData); - _supportedCommandFact.setMetaData(_supportedCommandMetaData); } MissionItem::~MissionItem() @@ -787,24 +761,6 @@ void MissionItem::_syncFrameToAltitudeRelativeToHome(void) } } -void MissionItem::_syncSupportedCommandToCommand(const QVariant& value) -{ - if (!_syncingSupportedCommandAndCommand) { - _syncingSupportedCommandAndCommand = true; - _commandFact.setRawValue(value.toInt()); - _syncingSupportedCommandAndCommand = false; - } -} - -void MissionItem::_syncCommandToSupportedCommand(const QVariant& value) -{ - if (!_syncingSupportedCommandAndCommand) { - _syncingSupportedCommandAndCommand = true; - _supportedCommandFact.setRawValue(value.toInt()); - _syncingSupportedCommandAndCommand = false; - } -} - void MissionItem::setDefaultsForCommand(void) { // We set these global defaults first, then if there are param defaults they will get reset diff --git a/src/MissionManager/MissionItem.h b/src/MissionManager/MissionItem.h index a0e7c8326..31446d8cd 100644 --- a/src/MissionManager/MissionItem.h +++ b/src/MissionManager/MissionItem.h @@ -87,7 +87,6 @@ public: Q_PROPERTY(int sequenceNumber READ sequenceNumber WRITE setSequenceNumber NOTIFY sequenceNumberChanged) Q_PROPERTY(bool standaloneCoordinate READ standaloneCoordinate NOTIFY commandChanged) Q_PROPERTY(bool specifiesCoordinate READ specifiesCoordinate NOTIFY commandChanged) - Q_PROPERTY(Fact* supportedCommand READ supportedCommand NOTIFY commandChanged) // These properties are used to display the editing ui Q_PROPERTY(QmlObjectListModel* checkboxFacts READ checkboxFacts NOTIFY uiModelChanged) @@ -118,7 +117,6 @@ public: int sequenceNumber (void) const { return _sequenceNumber; } bool standaloneCoordinate(void) const; bool specifiesCoordinate (void) const; - Fact* supportedCommand (void) { return &_supportedCommandFact; } QmlObjectListModel* textFieldFacts (void); @@ -206,9 +204,7 @@ private slots: void _sendFriendlyEditAllowedChanged(void); void _sendUiModelChanged(void); void _syncAltitudeRelativeToHomeToFrame(const QVariant& value); - void _syncCommandToSupportedCommand(const QVariant& value); void _syncFrameToAltitudeRelativeToHome(void); - void _syncSupportedCommandToCommand(const QVariant& value); private: void _clearParamMetaData(void); @@ -249,7 +245,6 @@ private: static FactMetaData* _frameMetaData; static FactMetaData* _latitudeMetaData; static FactMetaData* _longitudeMetaData; - static FactMetaData* _supportedCommandMetaData; FactMetaData _param1MetaData; FactMetaData _param2MetaData; @@ -264,7 +259,6 @@ private: bool _syncingAltitudeRelativeToHomeAndFrame; ///< true: already in a sync signal, prevents signal loop bool _syncingHeadingDegreesAndParam4; ///< true: already in a sync signal, prevents signal loop - bool _syncingSupportedCommandAndCommand; ///< true: already in a sync signal, prevents signal loop const QMap& _mavCmdInfoMap; }; diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index 2ce5823e0..d5215220b 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -145,7 +145,11 @@ static QObject* mavlinkQmlSingletonFactory(QQmlEngine*, QJSEngine*) static QObject* qgroundcontrolQmlGlobalSingletonFactory(QQmlEngine*, QJSEngine*) { - return new QGroundControlQmlGlobal(qgcApp()->toolbox()); + // We create this object as a QGCTool even though it isn't int he toolbox + QGroundControlQmlGlobal* qmlGlobal = new QGroundControlQmlGlobal(qgcApp()); + qmlGlobal->setToolbox(qgcApp()->toolbox()); + + return qmlGlobal; } /** diff --git a/src/QmlControls/MissionCommandDialog.qml b/src/QmlControls/MissionCommandDialog.qml index d41004f7e..fc7f4f394 100644 --- a/src/QmlControls/MissionCommandDialog.qml +++ b/src/QmlControls/MissionCommandDialog.qml @@ -32,6 +32,8 @@ import QGroundControl.Palette 1.0 QGCViewDialog { property var missionItem + property var _vehicle: QGroundControl.multiVehicleManager.activeVehicle + QGCPalette { id: qgcPal } QGCLabel { @@ -45,10 +47,10 @@ QGCViewDialog { anchors.margins: ScreenTools.defaultFontPixelWidth anchors.left: categoryLabel.right anchors.right: parent.right - model: QGroundControl.missionCommands.categories + model: QGroundControl.missionCommands.categories(_vehicle) function categorySelected(category) { - commandList.model = QGroundControl.missionCommands.getCommandsForCategory(category) + commandList.model = QGroundControl.missionCommands.getCommandsForCategory(_vehicle, category) } Component.onCompleted: { @@ -109,5 +111,4 @@ QGCViewDialog { } } } // ListView - } // QGCViewDialog diff --git a/src/QmlControls/QGroundControlQmlGlobal.cc b/src/QmlControls/QGroundControlQmlGlobal.cc index e5270782d..ca0348a9d 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.cc +++ b/src/QmlControls/QGroundControlQmlGlobal.cc @@ -25,7 +25,6 @@ /// @author Don Gagne #include "QGroundControlQmlGlobal.h" -#include "QGCApplication.h" #include @@ -33,19 +32,49 @@ static const char* kQmlGlobalKeyName = "QGCQml"; const char* QGroundControlQmlGlobal::_virtualTabletJoystickKey = "VirtualTabletJoystick"; -QGroundControlQmlGlobal::QGroundControlQmlGlobal(QGCToolbox* toolbox, QObject* parent) - : QObject(parent) - , _flightMapSettings(toolbox->flightMapSettings()) - , _homePositionManager(toolbox->homePositionManager()) - , _linkManager(toolbox->linkManager()) - , _missionCommands(toolbox->missionCommands()) - , _multiVehicleManager(toolbox->multiVehicleManager()) +QGroundControlQmlGlobal::QGroundControlQmlGlobal(QGCApplication* app) + : QGCTool(app) + , _flightMapSettings(NULL) + , _homePositionManager(NULL) + , _linkManager(NULL) + , _missionCommands(NULL) + , _multiVehicleManager(NULL) , _virtualTabletJoystick(false) + , _offlineEditingFirmwareTypeFact(QString(), "OfflineEditingFirmwareType", FactMetaData::valueTypeUint32, (uint32_t)MAV_AUTOPILOT_ARDUPILOTMEGA) + , _offlineEditingFirmwareTypeMetaData(FactMetaData::valueTypeUint32) + { QSettings settings; _virtualTabletJoystick = settings.value(_virtualTabletJoystickKey, false). toBool(); + + QStringList firmwareEnumStrings; + QVariantList firmwareEnumValues; + + firmwareEnumStrings << "APM Flight Stack" << "PX4 Flight Stack" << "Mavlink Generic Flight Stack"; + firmwareEnumValues << QVariant::fromValue((uint32_t)MAV_AUTOPILOT_ARDUPILOTMEGA) << QVariant::fromValue((uint32_t)MAV_AUTOPILOT_PX4) << QVariant::fromValue((uint32_t)MAV_AUTOPILOT_GENERIC); + + _offlineEditingFirmwareTypeMetaData.setEnumInfo(firmwareEnumStrings, firmwareEnumValues); + _offlineEditingFirmwareTypeFact.setMetaData(&_offlineEditingFirmwareTypeMetaData); +} + +QGroundControlQmlGlobal::~QGroundControlQmlGlobal() +{ + } + +void QGroundControlQmlGlobal::setToolbox(QGCToolbox* toolbox) +{ + QGCTool::setToolbox(toolbox); + + _flightMapSettings = toolbox->flightMapSettings(); + _homePositionManager = toolbox->homePositionManager(); + _linkManager = toolbox->linkManager(); + _missionCommands = toolbox->missionCommands(); + _multiVehicleManager = toolbox->multiVehicleManager(); +} + + void QGroundControlQmlGlobal::saveGlobalSetting (const QString& key, const QString& value) { QSettings settings; diff --git a/src/QmlControls/QGroundControlQmlGlobal.h b/src/QmlControls/QGroundControlQmlGlobal.h index 599474cae..a3c90d9fb 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.h +++ b/src/QmlControls/QGroundControlQmlGlobal.h @@ -27,13 +27,13 @@ #ifndef QGroundControlQmlGlobal_H #define QGroundControlQmlGlobal_H -#include - +#include "QGCToolBox.h" #include "QGCApplication.h" #include "LinkManager.h" #include "HomePositionManager.h" #include "FlightMapSettings.h" #include "MissionCommands.h" +#include "SettingsFact.h" #ifdef QT_DEBUG #include "MockLink.h" @@ -41,12 +41,14 @@ class QGCToolbox; -class QGroundControlQmlGlobal : public QObject +class QGroundControlQmlGlobal : public QGCTool { Q_OBJECT public: - QGroundControlQmlGlobal(QGCToolbox* toolbox, QObject* parent = NULL); + QGroundControlQmlGlobal(QGCApplication* app); + ~QGroundControlQmlGlobal(); + Q_PROPERTY(FlightMapSettings* flightMapSettings READ flightMapSettings CONSTANT) Q_PROPERTY(HomePositionManager* homePositionManager READ homePositionManager CONSTANT) @@ -72,13 +74,15 @@ public: Q_PROPERTY(bool isVersionCheckEnabled READ isVersionCheckEnabled WRITE setIsVersionCheckEnabled NOTIFY isVersionCheckEnabledChanged) Q_PROPERTY(int mavlinkSystemID READ mavlinkSystemID WRITE setMavlinkSystemID NOTIFY mavlinkSystemIDChanged) + Q_PROPERTY(Fact* offlineEditingFirmwareType READ offlineEditingFirmwareType CONSTANT) + Q_INVOKABLE void saveGlobalSetting (const QString& key, const QString& value); Q_INVOKABLE QString loadGlobalSetting (const QString& key, const QString& defaultValue); Q_INVOKABLE void saveBoolGlobalSetting (const QString& key, bool value); Q_INVOKABLE bool loadBoolGlobalSetting (const QString& key, bool defaultValue); - Q_INVOKABLE void deleteAllSettingsNextBoot () { qgcApp()->deleteAllSettingsNextBoot(); } - Q_INVOKABLE void clearDeleteAllSettingsNextBoot () { qgcApp()->clearDeleteAllSettingsNextBoot(); } + Q_INVOKABLE void deleteAllSettingsNextBoot () { _app->deleteAllSettingsNextBoot(); } + Q_INVOKABLE void clearDeleteAllSettingsNextBoot () { _app->clearDeleteAllSettingsNextBoot(); } Q_INVOKABLE void startPX4MockLink (bool sendStatusText); Q_INVOKABLE void startGenericMockLink (bool sendStatusText); @@ -98,16 +102,18 @@ public: qreal zOrderWidgets () { return 100; } qreal zOrderMapItems () { return 50; } - bool isDarkStyle () { return qgcApp()->styleIsDark(); } - bool isAudioMuted () { return qgcApp()->toolbox()->audioOutput()->isMuted(); } - bool isSaveLogPrompt () { return qgcApp()->promptFlightDataSave(); } - bool isSaveLogPromptNotArmed () { return qgcApp()->promptFlightDataSaveNotArmed(); } + bool isDarkStyle () { return _app->styleIsDark(); } + bool isAudioMuted () { return _toolbox->audioOutput()->isMuted(); } + bool isSaveLogPrompt () { return _app->promptFlightDataSave(); } + bool isSaveLogPromptNotArmed () { return _app->promptFlightDataSaveNotArmed(); } bool virtualTabletJoystick () { return _virtualTabletJoystick; } - bool isHeartBeatEnabled () { return qgcApp()->toolbox()->mavlinkProtocol()->heartbeatsEnabled(); } - bool isMultiplexingEnabled () { return qgcApp()->toolbox()->mavlinkProtocol()->multiplexingEnabled(); } - bool isVersionCheckEnabled () { return qgcApp()->toolbox()->mavlinkProtocol()->versionCheckEnabled(); } - int mavlinkSystemID () { return qgcApp()->toolbox()->mavlinkProtocol()->getSystemId(); } + bool isHeartBeatEnabled () { return _toolbox->mavlinkProtocol()->heartbeatsEnabled(); } + bool isMultiplexingEnabled () { return _toolbox->mavlinkProtocol()->multiplexingEnabled(); } + bool isVersionCheckEnabled () { return _toolbox->mavlinkProtocol()->versionCheckEnabled(); } + int mavlinkSystemID () { return _toolbox->mavlinkProtocol()->getSystemId(); } + + Fact* offlineEditingFirmwareType () { return &_offlineEditingFirmwareTypeFact; } //-- TODO: Make this into an actual preference. bool isAdvancedMode () { return false; } @@ -123,6 +129,9 @@ public: void setIsVersionCheckEnabled (bool enable); void setMavlinkSystemID (int id); + // Overrides from QGCTool + virtual void setToolbox(QGCToolbox* toolbox); + signals: void isDarkStyleChanged (bool dark); void isAudioMutedChanged (bool muted); @@ -144,6 +153,9 @@ private: bool _virtualTabletJoystick; + SettingsFact _offlineEditingFirmwareTypeFact; + FactMetaData _offlineEditingFirmwareTypeMetaData; + static const char* _virtualTabletJoystickKey; }; diff --git a/src/ui/preferences/GeneralSettings.qml b/src/ui/preferences/GeneralSettings.qml index d4a92183c..4b76e1dad 100644 --- a/src/ui/preferences/GeneralSettings.qml +++ b/src/ui/preferences/GeneralSettings.qml @@ -28,6 +28,7 @@ import QtQuick.Dialogs 1.1 import QGroundControl 1.0 import QGroundControl.FactSystem 1.0 +import QGroundControl.FactControls 1.0 import QGroundControl.Controls 1.0 import QGroundControl.ScreenTools 1.0 import QGroundControl.MultiVehicleManager 1.0 @@ -194,31 +195,35 @@ Rectangle { //-- Autoconnect settings QGCLabel { text: "Autoconnect to the following devices:" } - QGCCheckBox { - text: "Pixhawk" - visible: !ScreenTools.isiOS - checked: QGroundControl.linkManager.autoconnectPixhawk - onClicked: QGroundControl.linkManager.autoconnectPixhawk = checked - } + Row { + spacing: ScreenTools.defaultFontPixelWidth * 2 - QGCCheckBox { - text: "3DR Radio" - visible: !ScreenTools.isiOS - checked: QGroundControl.linkManager.autoconnect3DRRadio - onClicked: QGroundControl.linkManager.autoconnect3DRRadio = checked - } + QGCCheckBox { + text: "Pixhawk" + visible: !ScreenTools.isiOS + checked: QGroundControl.linkManager.autoconnectPixhawk + onClicked: QGroundControl.linkManager.autoconnectPixhawk = checked + } - QGCCheckBox { - text: "PX4 Flow" - visible: !ScreenTools.isiOS - checked: QGroundControl.linkManager.autoconnectPX4Flow - onClicked: QGroundControl.linkManager.autoconnectPX4Flow = checked - } + QGCCheckBox { + text: "3DR Radio" + visible: !ScreenTools.isiOS + checked: QGroundControl.linkManager.autoconnect3DRRadio + onClicked: QGroundControl.linkManager.autoconnect3DRRadio = checked + } - QGCCheckBox { - text: "UDP" - checked: QGroundControl.linkManager.autoconnectUDP - onClicked: QGroundControl.linkManager.autoconnectUDP = checked + QGCCheckBox { + text: "PX4 Flow" + visible: !ScreenTools.isiOS + checked: QGroundControl.linkManager.autoconnectPX4Flow + onClicked: QGroundControl.linkManager.autoconnectPX4Flow = checked + } + + QGCCheckBox { + text: "UDP" + checked: QGroundControl.linkManager.autoconnectUDP + onClicked: QGroundControl.linkManager.autoconnectUDP = checked + } } Item { @@ -233,6 +238,27 @@ Rectangle { checked: QGroundControl.virtualTabletJoystick onClicked: QGroundControl.virtualTabletJoystick = checked } + + Item { + height: ScreenTools.defaultFontPixelHeight / 2 + width: parent.width + } + + Row { + spacing: ScreenTools.defaultFontPixelWidth + + QGCLabel { + text: "Offline mission editing vehicle type:" + anchors.baseline: offlineTypeCombo.baseline + } + + FactComboBox { + id: offlineTypeCombo + width: ScreenTools.defaultFontPixelWidth * 25 + fact: QGroundControl.offlineEditingFirmwareType + indexModel: false + } + } } } } -- 2.22.0