Commit 8587ff69 authored by Don Gagne's avatar Don Gagne

Make FirmwarePlugin::supportedCommands actually work

parent d07bd665
...@@ -662,19 +662,21 @@ INCLUDEPATH += \ ...@@ -662,19 +662,21 @@ INCLUDEPATH += \
HEADERS += \ HEADERS += \
src/FactSystem/Fact.h \ src/FactSystem/Fact.h \
src/FactSystem/FactControls/FactPanelController.h \
src/FactSystem/FactMetaData.h \ src/FactSystem/FactMetaData.h \
src/FactSystem/FactSystem.h \ src/FactSystem/FactSystem.h \
src/FactSystem/FactValidator.h \ src/FactSystem/FactValidator.h \
src/FactSystem/ParameterLoader.h \ src/FactSystem/ParameterLoader.h \
src/FactSystem/FactControls/FactPanelController.h \ src/FactSystem/SettingsFact.h \
SOURCES += \ SOURCES += \
src/FactSystem/Fact.cc \ src/FactSystem/Fact.cc \
src/FactSystem/FactControls/FactPanelController.cc \
src/FactSystem/FactMetaData.cc \ src/FactSystem/FactMetaData.cc \
src/FactSystem/FactSystem.cc \ src/FactSystem/FactSystem.cc \
src/FactSystem/FactValidator.cc \ src/FactSystem/FactValidator.cc \
src/FactSystem/ParameterLoader.cc \ src/FactSystem/ParameterLoader.cc \
src/FactSystem/FactControls/FactPanelController.cc \ src/FactSystem/SettingsFact.cc \
#------------------------------------------------------------------------------------- #-------------------------------------------------------------------------------------
# Video Streaming # Video Streaming
......
...@@ -216,12 +216,7 @@ QList<MAV_CMD> PX4FirmwarePlugin::supportedMissionCommands(void) ...@@ -216,12 +216,7 @@ QList<MAV_CMD> PX4FirmwarePlugin::supportedMissionCommands(void)
<< MAV_CMD_NAV_LOITER_UNLIM << MAV_CMD_NAV_LOITER_TURNS << MAV_CMD_NAV_LOITER_TIME << 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_RETURN_TO_LAUNCH << MAV_CMD_NAV_LAND << MAV_CMD_NAV_TAKEOFF
<< MAV_CMD_NAV_ROI << MAV_CMD_NAV_ROI
<< MAV_CMD_NAV_GUIDED_ENABLE << MAV_CMD_DO_JUMP
<< 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_CONDITION_DELAY;
<< 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;
return list; return list;
} }
...@@ -22,6 +22,10 @@ This file is part of the QGROUNDCONTROL project ...@@ -22,6 +22,10 @@ This file is part of the QGROUNDCONTROL project
#include "MissionCommands.h" #include "MissionCommands.h"
#include "FactMetaData.h" #include "FactMetaData.h"
#include "Vehicle.h"
#include "FirmwarePluginManager.h"
#include "QGCApplication.h"
#include "QGroundControlQmlGlobal.h"
#include <QStringList> #include <QStringList>
#include <QJsonDocument> #include <QJsonDocument>
...@@ -60,7 +64,14 @@ const QString MissionCommands::_degreesUnits (QStringLiteral("deg ...@@ -60,7 +64,14 @@ const QString MissionCommands::_degreesUnits (QStringLiteral("deg
MissionCommands::MissionCommands(QGCApplication* app) MissionCommands::MissionCommands(QGCApplication* app)
: QGCTool(app) : QGCTool(app)
{ {
}
void MissionCommands::setToolbox(QGCToolbox* toolbox)
{
QGCTool::setToolbox(toolbox);
_loadMavCmdInfoJson(); _loadMavCmdInfoJson();
_createFirmwareSpecificLists();
} }
bool MissionCommands::_validateKeyTypes(QJsonObject& jsonObject, const QStringList& keys, const QList<QJsonValue::Type>& types) bool MissionCommands::_validateKeyTypes(QJsonObject& jsonObject, const QStringList& keys, const QList<QJsonValue::Type>& types)
...@@ -165,7 +176,6 @@ void MissionCommands::_loadMavCmdInfoJson(void) ...@@ -165,7 +176,6 @@ void MissionCommands::_loadMavCmdInfoJson(void)
} }
_mavCmdInfoMap[mavCmdInfo->_command] = mavCmdInfo; _mavCmdInfoMap[mavCmdInfo->_command] = mavCmdInfo;
_commandList.append(mavCmdInfo);
// Read params // Read params
...@@ -234,16 +244,13 @@ void MissionCommands::_loadMavCmdInfoJson(void) ...@@ -234,16 +244,13 @@ void MissionCommands::_loadMavCmdInfoJson(void)
if (mavCmdInfo->_command != MAV_CMD_NAV_LAST) { if (mavCmdInfo->_command != MAV_CMD_NAV_LAST) {
// Don't add fake home postion command to categories // 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()) { if (mavCmdInfo->friendlyEdit()) {
// Only friendly edit commands go in category list // Only friendly edit commands go in category list. We use MAV_AUTOPILOT_GENERIC key to store full list.
_categoryToMavCmdInfoListMap[mavCmdInfo->category()]->append(mavCmdInfo); 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) ...@@ -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<MAV_AUTOPILOT> firmwareList;
firmwareList << MAV_AUTOPILOT_PX4 << MAV_AUTOPILOT_ARDUPILOTMEGA;
foreach (MAV_AUTOPILOT firmwareType, firmwareList) {
FirmwarePlugin* plugin = _toolbox->firmwarePluginManager()->firmwarePluginForAutopilot(firmwareType, MAV_TYPE_QUADROTOR);
QList<MAV_CMD> 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";
}
}
}
}
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
Q_DECLARE_LOGGING_CATEGORY(MissionCommandsLog) Q_DECLARE_LOGGING_CATEGORY(MissionCommandsLog)
class MissionCommands; class MissionCommands;
class Vehicle;
class MavCmdParamInfo : public QObject { class MavCmdParamInfo : public QObject {
...@@ -129,17 +130,15 @@ class MissionCommands : public QGCTool ...@@ -129,17 +130,15 @@ class MissionCommands : public QGCTool
public: public:
MissionCommands(QGCApplication* app); MissionCommands(QGCApplication* app);
Q_PROPERTY(QStringList categories READ categories CONSTANT) Q_INVOKABLE const QStringList categories (Vehicle* vehicle) const;
Q_PROPERTY(const QmlObjectListModel* commands READ commands CONSTANT) Q_INVOKABLE QString categoryFromCommand (MavlinkQmlSingleton::Qml_MAV_CMD command) const;
Q_INVOKABLE QVariant getCommandsForCategory (Vehicle* vehicle, const QString& category) const;
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; }
const QMap<MAV_CMD, MavCmdInfo*>& commandInfoMap(void) const { return _mavCmdInfoMap; }; const QMap<MAV_CMD, MavCmdInfo*>& commandInfoMap(void) const { return _mavCmdInfoMap; };
// Overrides from QGCTool
virtual void setToolbox(QGCToolbox* toolbox);
static const QString _degreesUnits; static const QString _degreesUnits;
static const QString _degreesConvertUnits; static const QString _degreesConvertUnits;
...@@ -147,14 +146,14 @@ signals: ...@@ -147,14 +146,14 @@ signals:
private: private:
void _loadMavCmdInfoJson(void); void _loadMavCmdInfoJson(void);
void _createFirmwareSpecificLists(void);
void _setupMetaData(void); void _setupMetaData(void);
bool _validateKeyTypes(QJsonObject& jsonObject, const QStringList& keys, const QList<QJsonValue::Type>& types); bool _validateKeyTypes(QJsonObject& jsonObject, const QStringList& keys, const QList<QJsonValue::Type>& types);
MAV_AUTOPILOT _firmwareTypeFromVehicle(Vehicle* vehicle) const;
private: private:
QStringList _categories; QMap<MAV_AUTOPILOT, QMap<QString, QmlObjectListModel*> > _categoryToMavCmdInfoListMap;
QMap<QString, QmlObjectListModel*> _categoryToMavCmdInfoListMap; QMap<MAV_CMD, MavCmdInfo*> _mavCmdInfoMap;
QmlObjectListModel _commandList;
QMap<MAV_CMD, MavCmdInfo*> _mavCmdInfoMap;
static const QString _categoryJsonKey; static const QString _categoryJsonKey;
static const QString _decimalPlacesJsonKey; static const QString _decimalPlacesJsonKey;
......
...@@ -37,7 +37,6 @@ FactMetaData* MissionItem::_defaultParamMetaData = NULL; ...@@ -37,7 +37,6 @@ FactMetaData* MissionItem::_defaultParamMetaData = NULL;
FactMetaData* MissionItem::_frameMetaData = NULL; FactMetaData* MissionItem::_frameMetaData = NULL;
FactMetaData* MissionItem::_latitudeMetaData = NULL; FactMetaData* MissionItem::_latitudeMetaData = NULL;
FactMetaData* MissionItem::_longitudeMetaData = NULL; FactMetaData* MissionItem::_longitudeMetaData = NULL;
FactMetaData* MissionItem::_supportedCommandMetaData = NULL;
struct EnumInfo_s { struct EnumInfo_s {
const char * label; const char * label;
...@@ -108,7 +107,6 @@ MissionItem::MissionItem(QObject* parent) ...@@ -108,7 +107,6 @@ MissionItem::MissionItem(QObject* parent)
, _param7MetaData(FactMetaData::valueTypeDouble) , _param7MetaData(FactMetaData::valueTypeDouble)
, _syncingAltitudeRelativeToHomeAndFrame (false) , _syncingAltitudeRelativeToHomeAndFrame (false)
, _syncingHeadingDegreesAndParam4 (false) , _syncingHeadingDegreesAndParam4 (false)
, _syncingSupportedCommandAndCommand (false)
, _mavCmdInfoMap(qgcApp()->toolbox()->missionCommands()->commandInfoMap()) , _mavCmdInfoMap(qgcApp()->toolbox()->missionCommands()->commandInfoMap())
{ {
// Need a good command and frame before we start passing signals around // Need a good command and frame before we start passing signals around
...@@ -167,7 +165,6 @@ MissionItem::MissionItem(int sequenceNumber, ...@@ -167,7 +165,6 @@ MissionItem::MissionItem(int sequenceNumber,
, _param7MetaData(FactMetaData::valueTypeDouble) , _param7MetaData(FactMetaData::valueTypeDouble)
, _syncingAltitudeRelativeToHomeAndFrame (false) , _syncingAltitudeRelativeToHomeAndFrame (false)
, _syncingHeadingDegreesAndParam4 (false) , _syncingHeadingDegreesAndParam4 (false)
, _syncingSupportedCommandAndCommand (false)
, _mavCmdInfoMap(qgcApp()->toolbox()->missionCommands()->commandInfoMap()) , _mavCmdInfoMap(qgcApp()->toolbox()->missionCommands()->commandInfoMap())
{ {
// Need a good command and frame before we start passing signals around // Need a good command and frame before we start passing signals around
...@@ -183,7 +180,6 @@ MissionItem::MissionItem(int sequenceNumber, ...@@ -183,7 +180,6 @@ MissionItem::MissionItem(int sequenceNumber,
setAutoContinue(autoContinue); setAutoContinue(autoContinue);
_syncFrameToAltitudeRelativeToHome(); _syncFrameToAltitudeRelativeToHome();
_syncCommandToSupportedCommand(QVariant(this->command()));
_param1Fact.setRawValue(param1); _param1Fact.setRawValue(param1);
_param2Fact.setRawValue(param2); _param2Fact.setRawValue(param2);
...@@ -223,7 +219,6 @@ MissionItem::MissionItem(const MissionItem& other, QObject* parent) ...@@ -223,7 +219,6 @@ MissionItem::MissionItem(const MissionItem& other, QObject* parent)
, _param4MetaData(FactMetaData::valueTypeDouble) , _param4MetaData(FactMetaData::valueTypeDouble)
, _syncingAltitudeRelativeToHomeAndFrame (false) , _syncingAltitudeRelativeToHomeAndFrame (false)
, _syncingHeadingDegreesAndParam4 (false) , _syncingHeadingDegreesAndParam4 (false)
, _syncingSupportedCommandAndCommand (false)
, _mavCmdInfoMap(qgcApp()->toolbox()->missionCommands()->commandInfoMap()) , _mavCmdInfoMap(qgcApp()->toolbox()->missionCommands()->commandInfoMap())
{ {
// Need a good command and frame before we start passing signals around // Need a good command and frame before we start passing signals around
...@@ -254,7 +249,6 @@ const MissionItem& MissionItem::operator=(const MissionItem& other) ...@@ -254,7 +249,6 @@ const MissionItem& MissionItem::operator=(const MissionItem& other)
setHomePositionValid(other._homePositionValid); setHomePositionValid(other._homePositionValid);
_syncFrameToAltitudeRelativeToHome(); _syncFrameToAltitudeRelativeToHome();
_syncCommandToSupportedCommand(QVariant(this->command()));
_param1Fact.setRawValue(other._param1Fact.rawValue()); _param1Fact.setRawValue(other._param1Fact.rawValue());
_param2Fact.setRawValue(other._param2Fact.rawValue()); _param2Fact.setRawValue(other._param2Fact.rawValue());
...@@ -282,8 +276,6 @@ void MissionItem::_connectSignals(void) ...@@ -282,8 +276,6 @@ void MissionItem::_connectSignals(void)
connect(this, &MissionItem::sequenceNumberChanged, this, &MissionItem::_setDirtyFromSignal); connect(this, &MissionItem::sequenceNumberChanged, this, &MissionItem::_setDirtyFromSignal);
// Values from these facts must propogate back and forth between the real object storage // 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(&_altitudeRelativeToHomeFact, &Fact::valueChanged, this, &MissionItem::_syncAltitudeRelativeToHomeToFrame);
connect(this, &MissionItem::frameChanged, this, &MissionItem::_syncFrameToAltitudeRelativeToHome); connect(this, &MissionItem::frameChanged, this, &MissionItem::_syncFrameToAltitudeRelativeToHome);
...@@ -351,28 +343,10 @@ void MissionItem::_setupMetaData(void) ...@@ -351,28 +343,10 @@ void MissionItem::_setupMetaData(void)
_longitudeMetaData->setUnits("deg"); _longitudeMetaData->setUnits("deg");
_longitudeMetaData->setDecimalPlaces(7); _longitudeMetaData->setDecimalPlaces(7);
enumStrings.clear();
enumValues.clear();
// FIXME: Hack hardcode to PX4
QList<MAV_CMD> 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); _commandFact.setMetaData(_commandMetaData);
_frameFact.setMetaData(_frameMetaData); _frameFact.setMetaData(_frameMetaData);
_supportedCommandFact.setMetaData(_supportedCommandMetaData);
} }
MissionItem::~MissionItem() MissionItem::~MissionItem()
...@@ -787,24 +761,6 @@ void MissionItem::_syncFrameToAltitudeRelativeToHome(void) ...@@ -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) void MissionItem::setDefaultsForCommand(void)
{ {
// We set these global defaults first, then if there are param defaults they will get reset // We set these global defaults first, then if there are param defaults they will get reset
......
...@@ -87,7 +87,6 @@ public: ...@@ -87,7 +87,6 @@ public:
Q_PROPERTY(int sequenceNumber READ sequenceNumber WRITE setSequenceNumber NOTIFY sequenceNumberChanged) Q_PROPERTY(int sequenceNumber READ sequenceNumber WRITE setSequenceNumber NOTIFY sequenceNumberChanged)
Q_PROPERTY(bool standaloneCoordinate READ standaloneCoordinate NOTIFY commandChanged) Q_PROPERTY(bool standaloneCoordinate READ standaloneCoordinate NOTIFY commandChanged)
Q_PROPERTY(bool specifiesCoordinate READ specifiesCoordinate 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 // These properties are used to display the editing ui
Q_PROPERTY(QmlObjectListModel* checkboxFacts READ checkboxFacts NOTIFY uiModelChanged) Q_PROPERTY(QmlObjectListModel* checkboxFacts READ checkboxFacts NOTIFY uiModelChanged)
...@@ -118,7 +117,6 @@ public: ...@@ -118,7 +117,6 @@ public:
int sequenceNumber (void) const { return _sequenceNumber; } int sequenceNumber (void) const { return _sequenceNumber; }
bool standaloneCoordinate(void) const; bool standaloneCoordinate(void) const;
bool specifiesCoordinate (void) const; bool specifiesCoordinate (void) const;
Fact* supportedCommand (void) { return &_supportedCommandFact; }
QmlObjectListModel* textFieldFacts (void); QmlObjectListModel* textFieldFacts (void);
...@@ -206,9 +204,7 @@ private slots: ...@@ -206,9 +204,7 @@ private slots:
void _sendFriendlyEditAllowedChanged(void); void _sendFriendlyEditAllowedChanged(void);
void _sendUiModelChanged(void); void _sendUiModelChanged(void);
void _syncAltitudeRelativeToHomeToFrame(const QVariant& value); void _syncAltitudeRelativeToHomeToFrame(const QVariant& value);
void _syncCommandToSupportedCommand(const QVariant& value);
void _syncFrameToAltitudeRelativeToHome(void); void _syncFrameToAltitudeRelativeToHome(void);
void _syncSupportedCommandToCommand(const QVariant& value);
private: private:
void _clearParamMetaData(void); void _clearParamMetaData(void);
...@@ -249,7 +245,6 @@ private: ...@@ -249,7 +245,6 @@ private:
static FactMetaData* _frameMetaData; static FactMetaData* _frameMetaData;
static FactMetaData* _latitudeMetaData; static FactMetaData* _latitudeMetaData;
static FactMetaData* _longitudeMetaData; static FactMetaData* _longitudeMetaData;
static FactMetaData* _supportedCommandMetaData;
FactMetaData _param1MetaData; FactMetaData _param1MetaData;
FactMetaData _param2MetaData; FactMetaData _param2MetaData;
...@@ -264,7 +259,6 @@ private: ...@@ -264,7 +259,6 @@ private:
bool _syncingAltitudeRelativeToHomeAndFrame; ///< true: already in a sync signal, prevents signal loop bool _syncingAltitudeRelativeToHomeAndFrame; ///< true: already in a sync signal, prevents signal loop
bool _syncingHeadingDegreesAndParam4; ///< 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<MAV_CMD, MavCmdInfo*>& _mavCmdInfoMap; const QMap<MAV_CMD, MavCmdInfo*>& _mavCmdInfoMap;
}; };
......
...@@ -145,7 +145,11 @@ static QObject* mavlinkQmlSingletonFactory(QQmlEngine*, QJSEngine*) ...@@ -145,7 +145,11 @@ static QObject* mavlinkQmlSingletonFactory(QQmlEngine*, QJSEngine*)
static QObject* qgroundcontrolQmlGlobalSingletonFactory(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;
} }
/** /**
......
...@@ -32,6 +32,8 @@ import QGroundControl.Palette 1.0 ...@@ -32,6 +32,8 @@ import QGroundControl.Palette 1.0
QGCViewDialog { QGCViewDialog {
property var missionItem property var missionItem
property var _vehicle: QGroundControl.multiVehicleManager.activeVehicle
QGCPalette { id: qgcPal } QGCPalette { id: qgcPal }
QGCLabel { QGCLabel {
...@@ -45,10 +47,10 @@ QGCViewDialog { ...@@ -45,10 +47,10 @@ QGCViewDialog {
anchors.margins: ScreenTools.defaultFontPixelWidth anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.left: categoryLabel.right anchors.left: categoryLabel.right
anchors.right: parent.right anchors.right: parent.right
model: QGroundControl.missionCommands.categories model: QGroundControl.missionCommands.categories(_vehicle)
function categorySelected(category) { function categorySelected(category) {
commandList.model = QGroundControl.missionCommands.getCommandsForCategory(category) commandList.model = QGroundControl.missionCommands.getCommandsForCategory(_vehicle, category)
} }
Component.onCompleted: { Component.onCompleted: {
...@@ -109,5 +111,4 @@ QGCViewDialog { ...@@ -109,5 +111,4 @@ QGCViewDialog {
} }
} }
} // ListView } // ListView
} // QGCViewDialog } // QGCViewDialog
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
/// @author Don Gagne <don@thegagnes.com> /// @author Don Gagne <don@thegagnes.com>
#include "QGroundControlQmlGlobal.h" #include "QGroundControlQmlGlobal.h"
#include "QGCApplication.h"
#include <QSettings> #include <QSettings>
...@@ -33,19 +32,49 @@ static const char* kQmlGlobalKeyName = "QGCQml"; ...@@ -33,19 +32,49 @@ static const char* kQmlGlobalKeyName = "QGCQml";
const char* QGroundControlQmlGlobal::_virtualTabletJoystickKey = "VirtualTabletJoystick"; const char* QGroundControlQmlGlobal::_virtualTabletJoystickKey = "VirtualTabletJoystick";
QGroundControlQmlGlobal::QGroundControlQmlGlobal(QGCToolbox* toolbox, QObject* parent) QGroundControlQmlGlobal::QGroundControlQmlGlobal(QGCApplication* app)
: QObject(parent) : QGCTool(app)
, _flightMapSettings(toolbox->flightMapSettings()) , _flightMapSettings(NULL)
, _homePositionManager(toolbox->homePositionManager()) , _homePositionManager(NULL)
, _linkManager(toolbox->linkManager()) , _linkManager(NULL)
, _missionCommands(toolbox->missionCommands()) , _missionCommands(NULL)
, _multiVehicleManager(toolbox->multiVehicleManager()) , _multiVehicleManager(NULL)
, _virtualTabletJoystick(false) , _virtualTabletJoystick(false)
, _offlineEditingFirmwareTypeFact(QString(), "OfflineEditingFirmwareType", FactMetaData::valueTypeUint32, (uint32_t)MAV_AUTOPILOT_ARDUPILOTMEGA)
, _offlineEditingFirmwareTypeMetaData(FactMetaData::valueTypeUint32)
{ {
QSettings settings; QSettings settings;
_virtualTabletJoystick = settings.value(_virtualTabletJoystickKey, false). toBool(); _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) void QGroundControlQmlGlobal::saveGlobalSetting (const QString& key, const QString& value)
{ {
QSettings settings; QSettings settings;
......
...@@ -27,13 +27,13 @@ ...@@ -27,13 +27,13 @@
#ifndef QGroundControlQmlGlobal_H #ifndef QGroundControlQmlGlobal_H
#define QGroundControlQmlGlobal_H #define QGroundControlQmlGlobal_H
#include <QObject> #include "QGCToolBox.h"
#include "QGCApplication.h" #include "QGCApplication.h"
#include "LinkManager.h" #include "LinkManager.h"
#include "HomePositionManager.h" #include "HomePositionManager.h"
#include "FlightMapSettings.h" #include "FlightMapSettings.h"
#include "MissionCommands.h" #include "MissionCommands.h"
#include "SettingsFact.h"
#ifdef QT_DEBUG #ifdef QT_DEBUG
#include "MockLink.h" #include "MockLink.h"
...@@ -41,12 +41,14 @@ ...@@ -41,12 +41,14 @@
class QGCToolbox; class QGCToolbox;
class QGroundControlQmlGlobal : public QObject class QGroundControlQmlGlobal : public QGCTool
{ {
Q_OBJECT Q_OBJECT
public: public:
QGroundControlQmlGlobal(QGCToolbox* toolbox, QObject* parent = NULL); QGroundControlQmlGlobal(QGCApplication* app);
~QGroundControlQmlGlobal();
Q_PROPERTY(FlightMapSettings* flightMapSettings READ flightMapSettings CONSTANT) Q_PROPERTY(FlightMapSettings* flightMapSettings READ flightMapSettings CONSTANT)
Q_PROPERTY(HomePositionManager* homePositionManager READ homePositionManager CONSTANT) Q_PROPERTY(HomePositionManager* homePositionManager READ homePositionManager CONSTANT)
...@@ -72,13 +74,15 @@ public: ...@@ -72,13 +74,15 @@ public:
Q_PROPERTY(bool isVersionCheckEnabled READ isVersionCheckEnabled WRITE setIsVersionCheckEnabled NOTIFY isVersionCheckEnabledChanged) Q_PROPERTY(bool isVersionCheckEnabled READ isVersionCheckEnabled WRITE setIsVersionCheckEnabled NOTIFY isVersionCheckEnabledChanged)
Q_PROPERTY(int mavlinkSystemID READ mavlinkSystemID WRITE setMavlinkSystemID NOTIFY mavlinkSystemIDChanged) 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 void saveGlobalSetting (const QString& key, const QString& value);
Q_INVOKABLE QString loadGlobalSetting (const QString& key, const QString& defaultValue); Q_INVOKABLE QString loadGlobalSetting (const QString& key, const QString& defaultValue);
Q_INVOKABLE void saveBoolGlobalSetting (const QString& key, bool value); Q_INVOKABLE void saveBoolGlobalSetting (const QString& key, bool value);
Q_INVOKABLE bool loadBoolGlobalSetting (const QString& key, bool defaultValue); Q_INVOKABLE bool loadBoolGlobalSetting (const QString& key, bool defaultValue);
Q_INVOKABLE void deleteAllSettingsNextBoot () { qgcApp()->deleteAllSettingsNextBoot(); } Q_INVOKABLE void deleteAllSettingsNextBoot () { _app->deleteAllSettingsNextBoot(); }
Q_INVOKABLE void clearDeleteAllSettingsNextBoot () { qgcApp()->clearDeleteAllSettingsNextBoot(); } Q_INVOKABLE void clearDeleteAllSettingsNextBoot () { _app->clearDeleteAllSettingsNextBoot(); }
Q_INVOKABLE void startPX4MockLink (bool sendStatusText); Q_INVOKABLE void startPX4MockLink (bool sendStatusText);
Q_INVOKABLE void startGenericMockLink (bool sendStatusText); Q_INVOKABLE void startGenericMockLink (bool sendStatusText);
...@@ -98,16 +102,18 @@ public: ...@@ -98,16 +102,18 @@ public:
qreal zOrderWidgets () { return 100; } qreal zOrderWidgets () { return 100; }
qreal zOrderMapItems () { return 50; } qreal zOrderMapItems () { return 50; }
bool isDarkStyle () { return qgcApp()->styleIsDark(); } bool isDarkStyle () { return _app->styleIsDark(); }
bool isAudioMuted () { return qgcApp()->toolbox()->audioOutput()->isMuted(); } bool isAudioMuted () { return _toolbox->audioOutput()->isMuted(); }
bool isSaveLogPrompt () { return qgcApp()->promptFlightDataSave(); } bool isSaveLogPrompt () { return _app->promptFlightDataSave(); }
bool isSaveLogPromptNotArmed () { return qgcApp()->promptFlightDataSaveNotArmed(); } bool isSaveLogPromptNotArmed () { return _app->promptFlightDataSaveNotArmed(); }
bool virtualTabletJoystick () { return _virtualTabletJoystick; } bool virtualTabletJoystick () { return _virtualTabletJoystick; }
bool isHeartBeatEnabled () { return qgcApp()->toolbox()->mavlinkProtocol()->heartbeatsEnabled(); } bool isHeartBeatEnabled () { return _toolbox->mavlinkProtocol()->heartbeatsEnabled(); }
bool isMultiplexingEnabled () { return qgcApp()->toolbox()->mavlinkProtocol()->multiplexingEnabled(); } bool isMultiplexingEnabled () { return _toolbox->mavlinkProtocol()->multiplexingEnabled(); }
bool isVersionCheckEnabled () { return qgcApp()->toolbox()->mavlinkProtocol()->versionCheckEnabled(); } bool isVersionCheckEnabled () { return _toolbox->mavlinkProtocol()->versionCheckEnabled(); }
int mavlinkSystemID () { return qgcApp()->toolbox()->mavlinkProtocol()->getSystemId(); } int mavlinkSystemID () { return _toolbox->mavlinkProtocol()->getSystemId(); }
Fact* offlineEditingFirmwareType () { return &_offlineEditingFirmwareTypeFact; }
//-- TODO: Make this into an actual preference. //-- TODO: Make this into an actual preference.
bool isAdvancedMode () { return false; } bool isAdvancedMode () { return false; }
...@@ -123,6 +129,9 @@ public: ...@@ -123,6 +129,9 @@ public:
void setIsVersionCheckEnabled (bool enable); void setIsVersionCheckEnabled (bool enable);
void setMavlinkSystemID (int id); void setMavlinkSystemID (int id);
// Overrides from QGCTool
virtual void setToolbox(QGCToolbox* toolbox);
signals: signals:
void isDarkStyleChanged (bool dark); void isDarkStyleChanged (bool dark);
void isAudioMutedChanged (bool muted); void isAudioMutedChanged (bool muted);
...@@ -144,6 +153,9 @@ private: ...@@ -144,6 +153,9 @@ private:
bool _virtualTabletJoystick; bool _virtualTabletJoystick;
SettingsFact _offlineEditingFirmwareTypeFact;
FactMetaData _offlineEditingFirmwareTypeMetaData;
static const char* _virtualTabletJoystickKey; static const char* _virtualTabletJoystickKey;
}; };
......
...@@ -28,6 +28,7 @@ import QtQuick.Dialogs 1.1 ...@@ -28,6 +28,7 @@ import QtQuick.Dialogs 1.1
import QGroundControl 1.0 import QGroundControl 1.0
import QGroundControl.FactSystem 1.0 import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.Controls 1.0 import QGroundControl.Controls 1.0
import QGroundControl.ScreenTools 1.0 import QGroundControl.ScreenTools 1.0
import QGroundControl.MultiVehicleManager 1.0 import QGroundControl.MultiVehicleManager 1.0
...@@ -194,31 +195,35 @@ Rectangle { ...@@ -194,31 +195,35 @@ Rectangle {
//-- Autoconnect settings //-- Autoconnect settings
QGCLabel { text: "Autoconnect to the following devices:" } QGCLabel { text: "Autoconnect to the following devices:" }
QGCCheckBox { Row {
text: "Pixhawk" spacing: ScreenTools.defaultFontPixelWidth * 2
visible: !ScreenTools.isiOS
checked: QGroundControl.linkManager.autoconnectPixhawk
onClicked: QGroundControl.linkManager.autoconnectPixhawk = checked
}
QGCCheckBox { QGCCheckBox {
text: "3DR Radio" text: "Pixhawk"
visible: !ScreenTools.isiOS visible: !ScreenTools.isiOS
checked: QGroundControl.linkManager.autoconnect3DRRadio checked: QGroundControl.linkManager.autoconnectPixhawk
onClicked: QGroundControl.linkManager.autoconnect3DRRadio = checked onClicked: QGroundControl.linkManager.autoconnectPixhawk = checked
} }
QGCCheckBox { QGCCheckBox {
text: "PX4 Flow" text: "3DR Radio"
visible: !ScreenTools.isiOS visible: !ScreenTools.isiOS
checked: QGroundControl.linkManager.autoconnectPX4Flow checked: QGroundControl.linkManager.autoconnect3DRRadio
onClicked: QGroundControl.linkManager.autoconnectPX4Flow = checked onClicked: QGroundControl.linkManager.autoconnect3DRRadio = checked
} }
QGCCheckBox { QGCCheckBox {
text: "UDP" text: "PX4 Flow"
checked: QGroundControl.linkManager.autoconnectUDP visible: !ScreenTools.isiOS
onClicked: QGroundControl.linkManager.autoconnectUDP = checked checked: QGroundControl.linkManager.autoconnectPX4Flow
onClicked: QGroundControl.linkManager.autoconnectPX4Flow = checked
}
QGCCheckBox {
text: "UDP"
checked: QGroundControl.linkManager.autoconnectUDP
onClicked: QGroundControl.linkManager.autoconnectUDP = checked
}
} }
Item { Item {
...@@ -233,6 +238,27 @@ Rectangle { ...@@ -233,6 +238,27 @@ Rectangle {
checked: QGroundControl.virtualTabletJoystick checked: QGroundControl.virtualTabletJoystick
onClicked: QGroundControl.virtualTabletJoystick = checked 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
}
}
} }
} }
} }
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