From 76ef35a4cfeedd13c6effd275871b1bca766e6cc Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Tue, 23 Dec 2014 12:51:11 -0800 Subject: [PATCH] Empty SafetyConfig compoment Starting point for real implementation --- qgroundcontrol.pro | 7 +- qgroundcontrol.qrc | 5 +- src/AutoPilotPlugins/PX4/SafetyComponent.cc | 156 +++++++++++++++++++ src/AutoPilotPlugins/PX4/SafetyComponent.h | 60 +++++++ src/AutoPilotPlugins/PX4/SafetyComponent.qml | 17 ++ src/VehicleSetup/SetupView.cc | 16 +- 6 files changed, 251 insertions(+), 10 deletions(-) create mode 100644 src/AutoPilotPlugins/PX4/SafetyComponent.cc create mode 100644 src/AutoPilotPlugins/PX4/SafetyComponent.h create mode 100644 src/AutoPilotPlugins/PX4/SafetyComponent.qml diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index e6e0236bb..3b9b47fcf 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 bca9f09bf..407433977 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 000000000..78588646d --- /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 000000000..3d137790c --- /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 000000000..3ef047174 --- /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 caebee6e0..3718e290e 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; } -- 2.22.0