diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro
index e6e0236bb5b885da8cdae988cea62d2d3efac088..3b9b47fcf223c3571cb20efed400e779bbf39948 100644
--- a/qgroundcontrol.pro
+++ b/qgroundcontrol.pro
@@ -341,7 +341,8 @@ FORMS += \
src/ui/px4_configuration/QGCPX4SensorCalibration.ui \
src/ui/px4_configuration/PX4RCCalibration.ui \
src/ui/px4_configuration/PX4FirmwareUpgrade.ui \
- src/ui/QGCUASFileView.ui
+ src/ui/QGCUASFileView.ui \
+ src/QGCQmlWidgetHolder.ui \
HEADERS += \
src/MG.h \
@@ -493,6 +494,7 @@ HEADERS += \
src/audio/QGCAudioWorker.h \
src/QGCQuickWidget.h \
src/QGCPalette.h \
+ src/QGCQmlWidgetHolder.h \
SOURCES += \
src/main.cc \
@@ -633,6 +635,7 @@ SOURCES += \
src/audio/QGCAudioWorker.cpp \
src/QGCQuickWidget.cc \
src/QGCPalette.cc \
+ src/QGCQmlWidgetHolder.cpp \
#
# Unit Test specific configuration goes here
@@ -727,6 +730,7 @@ HEADERS+= \
src/AutoPilotPlugins/PX4/FlightModeConfig.h \
src/AutoPilotPlugins/PX4/AirframeComponent.h \
src/AutoPilotPlugins/PX4/SensorsComponent.h \
+ src/AutoPilotPlugins/PX4/SafetyComponent.h \
src/AutoPilotPlugins/PX4/PX4ParameterFacts.h \
src/VehicleSetup/SetupWidgetHolder.h \
@@ -745,6 +749,7 @@ SOURCES += \
src/AutoPilotPlugins/PX4/FlightModeConfig.cc \
src/AutoPilotPlugins/PX4/AirframeComponent.cc \
src/AutoPilotPlugins/PX4/SensorsComponent.cc \
+ src/AutoPilotPlugins/PX4/SafetyComponent.cc \
src/AutoPilotPlugins/PX4/PX4ParameterFacts.cc \
src/VehicleSetup/SetupWidgetHolder.cc \
diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc
index bca9f09bf198e450c7daafca37f2e7a62ea587ce..407433977b57a564f217e163546cd5ebf71dc53a 100644
--- a/qgroundcontrol.qrc
+++ b/qgroundcontrol.qrc
@@ -239,10 +239,11 @@
src/test.qml
qml/QGroundControl/FactControls/qmldir
qml/QGroundControl/FactControls/SetupButton.qml
- src/VehicleSetup/SetupViewConnected.qml
- src/VehicleSetup/SetupViewDisconnected.qml
files/images/px4/airframes/octo_x.png
files/images/px4/boards/px4fmu_2.x.png
+ src/VehicleSetup/SetupViewConnected.qml
+ src/VehicleSetup/SetupViewDisconnected.qml
+ src/AutoPilotPlugins/PX4/SafetyComponent.qml
src/AutoPilotPlugins/PX4/ParameterFactMetaData.xml
diff --git a/src/AutoPilotPlugins/PX4/SafetyComponent.cc b/src/AutoPilotPlugins/PX4/SafetyComponent.cc
new file mode 100644
index 0000000000000000000000000000000000000000..78588646d49e46367071514d4206883d04af2707
--- /dev/null
+++ b/src/AutoPilotPlugins/PX4/SafetyComponent.cc
@@ -0,0 +1,156 @@
+/*=====================================================================
+
+ QGroundControl Open Source Ground Control Station
+
+ (c) 2009 - 2014 QGROUNDCONTROL PROJECT
+
+ This file is part of the QGROUNDCONTROL project
+
+ QGROUNDCONTROL is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ QGROUNDCONTROL is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with QGROUNDCONTROL. If not, see .
+
+ ======================================================================*/
+
+/// @file
+/// @author Don Gagne
+
+#include "SafetyComponent.h"
+#include "PX4RCCalibration.h"
+#include "VehicleComponentSummaryItem.h"
+#include "QGCQmlWidgetHolder.h"
+
+/// @brief Parameters which signal a change in setupComplete state
+static const char* triggerParams[] = { NULL };
+
+SafetyComponent::SafetyComponent(UASInterface* uas, AutoPilotPlugin* autopilot, QObject* parent) :
+ PX4Component(uas, autopilot, parent),
+ _name(tr("Safety"))
+{
+}
+
+QString SafetyComponent::name(void) const
+{
+ return _name;
+}
+
+QString SafetyComponent::description(void) const
+{
+ return tr("The Safety Component is used to setup triggers for Return to Land as well as the settings for Return to Land itself.");
+}
+
+QString SafetyComponent::icon(void) const
+{
+ return ":/files/images/px4/menu/remote.png";
+}
+
+bool SafetyComponent::requiresSetup(void) const
+{
+ return false;
+}
+
+bool SafetyComponent::setupComplete(void) const
+{
+ // FIXME: What aboout invalid settings?
+ return true;
+}
+
+QString SafetyComponent::setupStateDescription(void) const
+{
+ const char* stateDescription;
+
+ if (requiresSetup()) {
+ stateDescription = "Requires setup";
+ } else {
+ stateDescription = "Setup complete";
+ }
+ return QString(stateDescription);
+}
+
+const char** SafetyComponent::setupCompleteChangedTriggerList(void) const
+{
+ return triggerParams;
+}
+
+QStringList SafetyComponent::paramFilterList(void) const
+{
+ QStringList list;
+
+ return list;
+}
+
+QWidget* SafetyComponent::setupWidget(void) const
+{
+ QGCQmlWidgetHolder* holder = new QGCQmlWidgetHolder();
+ Q_CHECK_PTR(holder);
+
+ holder->setAutoPilot(_autopilot);
+
+ holder->setSource(QUrl::fromUserInput("qrc:/qml/SafetyComponent.qml"));
+
+ return holder;
+}
+
+const QVariantList& SafetyComponent::summaryItems(void)
+{
+ // FIXME: No summary items yet
+#if 0
+ if (!_summaryItems.count()) {
+ QString name;
+ QString state;
+
+ // FIXME: Need to pull receiver type from RSSI value
+ name = "Receiver type:";
+ state = "n/a";
+
+ VehicleComponentSummaryItem* item = new VehicleComponentSummaryItem(name, state, this);
+ _summaryItems.append(QVariant::fromValue(item));
+
+ static const char* stickParams[] = { "RC_MAP_ROLL", "RC_MAP_PITCH", "RC_MAP_YAW", "RC_MAP_THROTTLE" };
+
+ QString summary("Chan ");
+
+ bool allSticksMapped = true;
+ for (size_t i=0; igetParameterValue(_paramMgr->getDefaultComponentId(), stickParams[i], value)) {
+ if (value.toInt() == 0) {
+ allSticksMapped = false;
+ break;
+ } else {
+ if (i != 0) {
+ summary += ",";
+ }
+ summary += value.toString();
+ }
+ } else {
+ // Why is the parameter missing?
+ Q_ASSERT(false);
+ summary += "?";
+ }
+ }
+
+ if (!allSticksMapped) {
+ summary = "Not mapped";
+ }
+
+ name = "Ail, Ele, Rud, Throt:";
+ state = summary;
+
+ item = new VehicleComponentSummaryItem(name, state, this);
+ _summaryItems.append(QVariant::fromValue(item));
+ }
+#endif
+
+ return _summaryItems;
+}
diff --git a/src/AutoPilotPlugins/PX4/SafetyComponent.h b/src/AutoPilotPlugins/PX4/SafetyComponent.h
new file mode 100644
index 0000000000000000000000000000000000000000..3d137790c23568c2189cd37cd1a7d79dd4c0be98
--- /dev/null
+++ b/src/AutoPilotPlugins/PX4/SafetyComponent.h
@@ -0,0 +1,60 @@
+/*=====================================================================
+
+ QGroundControl Open Source Ground Control Station
+
+ (c) 2009 - 2014 QGROUNDCONTROL PROJECT
+
+ This file is part of the QGROUNDCONTROL project
+
+ QGROUNDCONTROL is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ QGROUNDCONTROL is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with QGROUNDCONTROL. If not, see .
+
+ ======================================================================*/
+
+#ifndef SafetyComponent_H
+#define SafetyComponent_H
+
+#include "PX4Component.h"
+
+/// @file
+/// @brief The Radio VehicleComponent is used to calibrate the trasmitter and assign function mapping
+/// to channels.
+/// @author Don Gagne
+
+class SafetyComponent : public PX4Component
+{
+ Q_OBJECT
+
+public:
+ SafetyComponent(UASInterface* uas, AutoPilotPlugin* autopilot, QObject* parent = NULL);
+
+ // Virtuals from PX4Component
+ virtual const char** setupCompleteChangedTriggerList(void) const;
+
+ // Virtuals from VehicleComponent
+ virtual QString name(void) const;
+ virtual QString description(void) const;
+ virtual QString icon(void) const;
+ virtual bool requiresSetup(void) const;
+ virtual bool setupComplete(void) const;
+ virtual QString setupStateDescription(void) const;
+ virtual QWidget* setupWidget(void) const;
+ virtual QStringList paramFilterList(void) const;
+ virtual const QVariantList& summaryItems(void);
+
+private:
+ const QString _name;
+ QVariantList _summaryItems;
+};
+
+#endif
diff --git a/src/AutoPilotPlugins/PX4/SafetyComponent.qml b/src/AutoPilotPlugins/PX4/SafetyComponent.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3ef0471745e8e844d74bc77e082bd45315da7a28
--- /dev/null
+++ b/src/AutoPilotPlugins/PX4/SafetyComponent.qml
@@ -0,0 +1,17 @@
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Styles 1.2
+import QGroundControl.FactSystem 1.0
+
+Rectangle {
+ QGCPalette { id: palette; colorGroup: QGCPalette.Active }
+
+ width: 400
+ height: 400
+ color: palette.window
+
+ Column {
+ Label { text: "Work in Progress"; color: palette.windowText }
+ Label { text: autopilot.parameters["RTL_RETURN_ALT"].value; color: palette.windowText }
+ }
+}
diff --git a/src/VehicleSetup/SetupView.cc b/src/VehicleSetup/SetupView.cc
index caebee6e0ec7617ec9b9d3b8be745eddd1f15ac8..3718e290e192f437525051be3562164f0568a1a8 100644
--- a/src/VehicleSetup/SetupView.cc
+++ b/src/VehicleSetup/SetupView.cc
@@ -142,13 +142,15 @@ void SetupView::_setupButtonClicked(const QVariant& component)
VehicleComponent* vehicle = qobject_cast(component.value());
Q_ASSERT(vehicle);
- SetupWidgetHolder* dialog = new SetupWidgetHolder(MainWindow::instance());
- dialog->setModal(true);
- dialog->setWindowTitle(vehicle->name());
+ SetupWidgetHolder dialog(MainWindow::instance());
+ dialog.setModal(true);
+ dialog.setWindowTitle(vehicle->name());
QWidget* setupWidget = vehicle->setupWidget();
- qDebug() << setupWidget->minimumSize();
- dialog->resize(setupWidget->minimumSize());
- dialog->setInnerWidget(setupWidget);
- dialog->exec();
+
+ dialog.resize(setupWidget->minimumSize());
+ dialog.setInnerWidget(setupWidget);
+ dialog.exec();
+
+ delete setupWidget;
}