Commit 1d444d01 authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #4748 from DonLakeFlyer/ComponentPrereq

Move VehicleComponent::prerequisiteSetup method to AutopilotPlugin
parents 287b2be5 b2ced878
......@@ -98,8 +98,3 @@ QUrl APMAirframeComponent::summaryQmlSource(void) const
return QUrl();
}
}
QString APMAirframeComponent::prerequisiteSetup(void) const
{
return QString();
}
......@@ -31,7 +31,6 @@ public:
bool setupComplete(void) const final;
QUrl setupSource(void) const final;
QUrl summaryQmlSource(void) const final;
QString prerequisiteSetup(void) const final;
private:
bool _requiresFrameSetup; ///< true: FRAME parameter must be set
......
......@@ -137,3 +137,38 @@ const QVariantList& APMAutoPilotPlugin::vehicleComponents(void)
return _components;
}
QString APMAutoPilotPlugin::prerequisiteSetup(VehicleComponent* component) const
{
bool requiresAirframeCheck = false;
if (qobject_cast<const APMFlightModesComponent*>(component)) {
if (_airframeComponent && !_airframeComponent->setupComplete()) {
return _airframeComponent->name();
}
if (_radioComponent && !_radioComponent->setupComplete()) {
return _radioComponent->name();
}
requiresAirframeCheck = true;
} else if (qobject_cast<const APMRadioComponent*>(component)) {
requiresAirframeCheck = true;
} else if (qobject_cast<const APMCameraComponent*>(component)) {
requiresAirframeCheck = true;
} else if (qobject_cast<const APMPowerComponent*>(component)) {
requiresAirframeCheck = true;
} else if (qobject_cast<const APMSafetyComponent*>(component)) {
requiresAirframeCheck = true;
} else if (qobject_cast<const APMTuningComponent*>(component)) {
requiresAirframeCheck = true;
} else if (qobject_cast<const APMSensorsComponent*>(component)) {
requiresAirframeCheck = true;
}
if (requiresAirframeCheck) {
if (_airframeComponent && !_airframeComponent->setupComplete()) {
return _airframeComponent->name();
}
}
return QString();
}
......@@ -40,28 +40,10 @@ public:
// Overrides from AutoPilotPlugin
const QVariantList& vehicleComponents(void) final;
QString prerequisiteSetup(VehicleComponent* component) const override;
APMAirframeComponent* airframeComponent (void) const { return _airframeComponent; }
APMCameraComponent* cameraComponent (void) const { return _cameraComponent; }
APMLightsComponent* lightsComponent (void) const { return _lightsComponent; }
APMSubFrameComponent* subFrameComponent (void) const { return _subFrameComponent; }
APMFlightModesComponent* flightModesComponent(void) const { return _flightModesComponent; }
APMPowerComponent* powerComponent (void) const { return _powerComponent; }
#if 0
// Temporarily removed, waiting for new command implementation
MotorComponent* motorComponent (void) const { return _motorComponent; }
#endif
APMRadioComponent* radioComponent (void) const { return _radioComponent; }
APMSafetyComponent* safetyComponent (void) const { return _safetyComponent; }
APMSensorsComponent* sensorsComponent (void) const { return _sensorsComponent; }
APMTuningComponent* tuningComponent (void) const { return _tuningComponent; }
ESP8266Component* esp8266Component (void) const { return _esp8266Component; }
MixersComponent* mixersComponent (void) { return _mixersComponent; }
private:
bool _incorrectParameterVersion; ///< true: parameter version incorrect, setup not allowed
QVariantList _components;
protected:
bool _incorrectParameterVersion; ///< true: parameter version incorrect, setup not allowed
APMAirframeComponent* _airframeComponent;
APMCameraComponent* _cameraComponent;
APMLightsComponent* _lightsComponent;
......@@ -79,6 +61,9 @@ private:
APMAirframeLoader* _airframeFacts;
ESP8266Component* _esp8266Component;
MixersComponent* _mixersComponent;
private:
QVariantList _components;
};
#endif
......@@ -61,15 +61,3 @@ QUrl APMCameraComponent::summaryQmlSource(void) const
{
return QUrl::fromUserInput(QStringLiteral("qrc:/qml/APMCameraComponentSummary.qml"));
}
QString APMCameraComponent::prerequisiteSetup(void) const
{
APMAutoPilotPlugin* plugin = dynamic_cast<APMAutoPilotPlugin*>(_autopilot);
Q_ASSERT(plugin);
if (!plugin->airframeComponent()->setupComplete()) {
return plugin->airframeComponent()->name();
}
return QString();
}
......@@ -31,7 +31,6 @@ public:
bool setupComplete(void) const final;
QUrl setupSource(void) const final;
QUrl summaryQmlSource(void) const final;
QString prerequisiteSetup(void) const final;
private:
const QString _name;
......
......@@ -58,19 +58,3 @@ QUrl APMFlightModesComponent::summaryQmlSource(void) const
{
return QUrl::fromUserInput(QStringLiteral("qrc:/qml/APMFlightModesComponentSummary.qml"));
}
QString APMFlightModesComponent::prerequisiteSetup(void) const
{
APMAutoPilotPlugin* plugin = dynamic_cast<APMAutoPilotPlugin*>(_autopilot);
Q_ASSERT(plugin);
if (!plugin->airframeComponent()->setupComplete()) {
return plugin->airframeComponent()->name();
} else if (plugin->radioComponent() != NULL) {
if (!plugin->radioComponent()->setupComplete()) {
return plugin->radioComponent()->name();
}
}
return QString();
}
......@@ -31,7 +31,6 @@ public:
bool setupComplete(void) const final;
QUrl setupSource(void) const final;
QUrl summaryQmlSource(void) const final;
QString prerequisiteSetup(void) const final;
private:
const QString _name;
......
......@@ -62,8 +62,3 @@ QUrl APMLightsComponent::summaryQmlSource(void) const
{
return QUrl::fromUserInput(QStringLiteral("qrc:/qml/APMLightsComponentSummary.qml"));
}
QString APMLightsComponent::prerequisiteSetup(void) const
{
return QString();
}
......@@ -31,7 +31,6 @@ public:
bool setupComplete(void) const final;
QUrl setupSource(void) const final;
QUrl summaryQmlSource(void) const final;
QString prerequisiteSetup(void) const final;
private:
const QString _name;
......
......@@ -62,13 +62,3 @@ QUrl APMPowerComponent::summaryQmlSource(void) const
{
return QUrl::fromUserInput(QStringLiteral("qrc:/qml/APMPowerComponentSummary.qml"));
}
QString APMPowerComponent::prerequisiteSetup(void) const
{
APMAutoPilotPlugin* plugin = dynamic_cast<APMAutoPilotPlugin*>(_autopilot);
Q_ASSERT(plugin);
if (!plugin->airframeComponent()->setupComplete()) {
return plugin->airframeComponent()->name();
}
return QString();
}
......@@ -31,7 +31,6 @@ public:
bool setupComplete (void) const final;
QUrl setupSource (void) const final;
QUrl summaryQmlSource (void) const final;
QString prerequisiteSetup (void) const final;
private:
const QString _name;
......
......@@ -96,17 +96,6 @@ QUrl APMRadioComponent::summaryQmlSource(void) const
return QUrl::fromUserInput(QStringLiteral("qrc:/qml/APMRadioComponentSummary.qml"));
}
QString APMRadioComponent::prerequisiteSetup(void) const
{
APMAutoPilotPlugin* plugin = dynamic_cast<APMAutoPilotPlugin*>(_autopilot);
if (!plugin->airframeComponent()->setupComplete()) {
return plugin->airframeComponent()->name();
}
return QString();
}
void APMRadioComponent::_connectSetupTriggers(void)
{
// Disconnect previous triggers
......
......@@ -32,7 +32,6 @@ public:
bool setupComplete(void) const final;
QUrl setupSource(void) const final;
QUrl summaryQmlSource(void) const final;
QString prerequisiteSetup(void) const final;
private slots:
void _triggerChanged(void);
......
......@@ -127,15 +127,3 @@ QUrl APMSafetyComponent::summaryQmlSource(void) const
return QUrl::fromUserInput(qmlFile);
}
QString APMSafetyComponent::prerequisiteSetup(void) const
{
APMAutoPilotPlugin* plugin = dynamic_cast<APMAutoPilotPlugin*>(_autopilot);
Q_ASSERT(plugin);
if (!plugin->airframeComponent()->setupComplete()) {
return plugin->airframeComponent()->name();
}
return QString();
}
......@@ -31,7 +31,6 @@ public:
bool setupComplete(void) const final;
QUrl setupSource(void) const final;
QUrl summaryQmlSource(void) const final;
QString prerequisiteSetup(void) const final;
bool allowSetupWhileArmed(void) const final { return true; }
private:
......
......@@ -75,18 +75,6 @@ QUrl APMSensorsComponent::summaryQmlSource(void) const
return QUrl::fromUserInput("qrc:/qml/APMSensorsComponentSummary.qml");
}
QString APMSensorsComponent::prerequisiteSetup(void) const
{
APMAutoPilotPlugin* plugin = dynamic_cast<APMAutoPilotPlugin*>(_autopilot);
Q_ASSERT(plugin);
if (!plugin->airframeComponent()->setupComplete()) {
return plugin->airframeComponent()->name();
}
return QString();
}
bool APMSensorsComponent::compassSetupNeeded(void) const
{
const size_t cCompass = 3;
......
......@@ -34,7 +34,6 @@ public:
bool setupComplete(void) const final;
QUrl setupSource(void) const final;
QUrl summaryQmlSource(void) const final;
QString prerequisiteSetup(void) const final;
private:
const QString _name;
......
......@@ -24,7 +24,8 @@ QGC_LOGGING_CATEGORY(APMSensorsComponentControllerVerboseLog, "APMSensorsCompone
const char* APMSensorsComponentController::_compassCalFitnessParam = "COMPASS_CAL_FIT";
APMSensorsComponentController::APMSensorsComponentController(void)
: _statusLog(NULL)
: _sensorsComponent(NULL)
, _statusLog(NULL)
, _progressBar(NULL)
, _compassButton(NULL)
, _accelButton(NULL)
......@@ -68,8 +69,19 @@ APMSensorsComponentController::APMSensorsComponentController(void)
APMAutoPilotPlugin * apmPlugin = qobject_cast<APMAutoPilotPlugin*>(_vehicle->autopilotPlugin());
_sensorsComponent = apmPlugin->sensorsComponent();
connect(_sensorsComponent, &VehicleComponent::setupCompleteChanged, this, &APMSensorsComponentController::setupNeededChanged);
// Find the sensors component
foreach (const QVariant& varVehicleComponent, apmPlugin->vehicleComponents()) {
_sensorsComponent = qobject_cast<APMSensorsComponent*>(varVehicleComponent.value<VehicleComponent*>());
if (_sensorsComponent) {
break;
}
}
if (_sensorsComponent) {
connect(_sensorsComponent, &VehicleComponent::setupCompleteChanged, this, &APMSensorsComponentController::setupNeededChanged);
} else {
qWarning() << "Sensors component is missing";
}
connect(qgcApp()->toolbox()->mavlinkProtocol(), &MAVLinkProtocol::messageReceived, this, &APMSensorsComponentController::_mavlinkMessageReceived);
}
......
......@@ -64,8 +64,3 @@ QUrl APMSubFrameComponent::summaryQmlSource(void) const
{
return QUrl::fromUserInput(QStringLiteral("qrc:/qml/APMSubFrameComponentSummary.qml"));
}
QString APMSubFrameComponent::prerequisiteSetup(void) const
{
return QString();
}
......@@ -31,7 +31,6 @@ public:
bool setupComplete(void) const final;
QUrl setupSource(void) const final;
QUrl summaryQmlSource(void) const final;
QString prerequisiteSetup(void) const final;
private:
const QString _name;
......
......@@ -77,15 +77,3 @@ QUrl APMTuningComponent::summaryQmlSource(void) const
{
return QUrl();
}
QString APMTuningComponent::prerequisiteSetup(void) const
{
APMAutoPilotPlugin* plugin = dynamic_cast<APMAutoPilotPlugin*>(_autopilot);
Q_ASSERT(plugin);
if (!plugin->airframeComponent()->setupComplete()) {
return plugin->airframeComponent()->name();
}
return QString();
}
......@@ -31,7 +31,6 @@ public:
bool setupComplete(void) const final;
QUrl setupSource(void) const final;
QUrl summaryQmlSource(void) const final;
QString prerequisiteSetup(void) const final;
bool allowSetupWhileArmed(void) const final { return true; }
private:
......
......@@ -38,11 +38,8 @@ public:
AutoPilotPlugin(Vehicle* vehicle, QObject* parent);
~AutoPilotPlugin();
/// List of VehicleComponent objects
Q_PROPERTY(QVariantList vehicleComponents READ vehicleComponents CONSTANT)
/// false: One or more vehicle components require setup
Q_PROPERTY(bool setupComplete READ setupComplete NOTIFY setupCompleteChanged)
Q_PROPERTY(QVariantList vehicleComponents READ vehicleComponents CONSTANT) ///< List of VehicleComponent objects
Q_PROPERTY(bool setupComplete READ setupComplete NOTIFY setupCompleteChanged) ///< false: One or more vehicle components require setup
/// Called when parameters are ready for the first time. Note that parameters may still be missing.
/// Overrides must call base class.
......@@ -51,6 +48,9 @@ public:
// Must be implemented by derived class
virtual const QVariantList& vehicleComponents(void) = 0;
/// Returns the name of the vehicle component which must complete setup prior to this one. Empty string for none.
Q_INVOKABLE virtual QString prerequisiteSetup(VehicleComponent* component) const = 0;
// Property accessors
bool setupComplete(void);
......
......@@ -57,8 +57,3 @@ QUrl ESP8266Component::summaryQmlSource(void) const
{
return QUrl::fromUserInput("qrc:/qml/ESP8266ComponentSummary.qml");
}
QString ESP8266Component::prerequisiteSetup(void) const
{
return QString();
}
......@@ -30,7 +30,6 @@ public:
bool setupComplete () const;
QUrl setupSource () const;
QUrl summaryQmlSource () const;
QString prerequisiteSetup () const;
private:
const QString _name;
......
......@@ -55,8 +55,3 @@ QUrl MixersComponent::summaryQmlSource(void) const
{
return QUrl();
}
QString MixersComponent::prerequisiteSetup(void) const
{
return QString();
}
......@@ -31,7 +31,6 @@ public:
bool setupComplete(void) const final;
QUrl setupSource(void) const final;
QUrl summaryQmlSource(void) const final;
QString prerequisiteSetup(void) const final;
bool allowSetupWhileArmed(void) const final { return true; }
private:
......
......@@ -55,8 +55,3 @@ QUrl MotorComponent::summaryQmlSource(void) const
{
return QUrl();
}
QString MotorComponent::prerequisiteSetup(void) const
{
return QString();
}
......@@ -32,7 +32,6 @@ public:
bool setupComplete(void) const final;
QUrl setupSource(void) const final;
QUrl summaryQmlSource(void) const final;
QString prerequisiteSetup(void) const final;
private:
const QString _name;
......
......@@ -25,3 +25,9 @@ const QVariantList& GenericAutoPilotPlugin::vehicleComponents(void)
return emptyList;
}
QString GenericAutoPilotPlugin:: prerequisiteSetup(VehicleComponent* component) const
{
Q_UNUSED(component);
return QString();
}
......@@ -26,7 +26,8 @@ public:
GenericAutoPilotPlugin(Vehicle* vehicle, QObject* parent = NULL);
// Overrides from AutoPilotPlugin
virtual const QVariantList& vehicleComponents(void);
const QVariantList& vehicleComponents(void) final;
QString prerequisiteSetup(VehicleComponent* component) const final;
};
#endif
......@@ -147,8 +147,3 @@ QUrl AirframeComponent::summaryQmlSource(void) const
{
return QUrl::fromUserInput("qrc:/qml/AirframeComponentSummary.qml");
}
QString AirframeComponent::prerequisiteSetup(void) const
{
return QString();
}
......@@ -35,7 +35,6 @@ public:
virtual bool setupComplete(void) const;
virtual QUrl setupSource(void) const;
virtual QUrl summaryQmlSource(void) const;
virtual QString prerequisiteSetup(void) const;
private:
const QString _name;
......
......@@ -61,8 +61,3 @@ QUrl CameraComponent::summaryQmlSource(void) const
{
return QUrl::fromUserInput("qrc:/qml/CameraComponentSummary.qml");
}
QString CameraComponent::prerequisiteSetup(void) const
{
return QString();
}
......@@ -36,7 +36,6 @@ public:
bool setupComplete (void) const final;
QUrl setupSource (void) const final;
QUrl summaryQmlSource (void) const final;
QString prerequisiteSetup (void) const final;
bool allowSetupWhileArmed (void) const final { return false; }
private:
......
......@@ -78,24 +78,3 @@ QUrl FlightModesComponent::summaryQmlSource(void) const
{
return QUrl::fromUserInput("qrc:/qml/FlightModesComponentSummary.qml");
}
QString FlightModesComponent::prerequisiteSetup(void) const
{
if (_vehicle->parameterManager()->getParameter(-1, "COM_RC_IN_MODE")->rawValue().toInt() == 1) {
// No RC input
return QString();
} else {
PX4AutoPilotPlugin* plugin = dynamic_cast<PX4AutoPilotPlugin*>(_autopilot);
Q_ASSERT(plugin);
if (!plugin->airframeComponent()->setupComplete()) {
return plugin->airframeComponent()->name();
} else if (!plugin->radioComponent()->setupComplete()) {
return plugin->radioComponent()->name();
} else if (!_vehicle->hilMode() && !plugin->sensorsComponent()->setupComplete()) {
return plugin->sensorsComponent()->name();
}
}
return QString();
}
......@@ -35,7 +35,6 @@ public:
virtual bool setupComplete(void) const;
virtual QUrl setupSource(void) const;
virtual QUrl summaryQmlSource(void) const;
virtual QString prerequisiteSetup(void) const;
private:
const QString _name;
......
......@@ -16,6 +16,12 @@
#include "FirmwarePlugin/PX4/PX4ParameterMetaData.h" // FIXME: Hack
#include "FirmwarePlugin/PX4/PX4FirmwarePlugin.h" // FIXME: Hack
#include "QGCApplication.h"
#include "FlightModesComponent.h"
#include "PX4RadioComponent.h"
#include "PX4TuningComponent.h"
#include "PowerComponent.h"
#include "SafetyComponent.h"
#include "SensorsComponent.h"
/// @file
/// @brief This is the AutoPilotPlugin implementatin for the MAV_AUTOPILOT_PX4 type.
......@@ -131,3 +137,43 @@ void PX4AutoPilotPlugin::parametersReadyPreChecks(void)
"Please perform a Firmware Upgrade if you wish to use Vehicle Setup.");
}
}
QString PX4AutoPilotPlugin::prerequisiteSetup(VehicleComponent* component) const
{
bool requiresAirframeCheck = false;
if (qobject_cast<const FlightModesComponent*>(component)) {
if (_vehicle->parameterManager()->getParameter(-1, "COM_RC_IN_MODE")->rawValue().toInt() == 1) {
// No RC input
return QString();
} else {
if (_airframeComponent && !_airframeComponent->setupComplete()) {
return _airframeComponent->name();
} else if (_radioComponent && !_radioComponent->setupComplete()) {
return _radioComponent->name();
} else if (_sensorsComponent && !_vehicle->hilMode() && !_sensorsComponent->setupComplete()) {
return _sensorsComponent->name();
}
}
} else if (qobject_cast<const PX4RadioComponent*>(component)) {
if (_vehicle->parameterManager()->getParameter(-1, "COM_RC_IN_MODE")->rawValue().toInt() != 1) {
requiresAirframeCheck = true;
}
} else if (qobject_cast<const PX4TuningComponent*>(component)) {
requiresAirframeCheck = true;
} else if (qobject_cast<const PowerComponent*>(component)) {
requiresAirframeCheck = true;
} else if (qobject_cast<const SafetyComponent*>(component)) {
requiresAirframeCheck = true;
} else if (qobject_cast<const SensorsComponent*>(component)) {
requiresAirframeCheck = true;
}
if (requiresAirframeCheck) {
if (_airframeComponent && !_airframeComponent->setupComplete()) {
return _airframeComponent->name();
}
}
return QString();
}
......@@ -43,26 +43,11 @@ public:
// Overrides from AutoPilotPlugin
const QVariantList& vehicleComponents(void) override;
void parametersReadyPreChecks(void) override;
// These methods should only be used by objects within the plugin
AirframeComponent* airframeComponent(void) { return _airframeComponent; }
PX4RadioComponent* radioComponent(void) { return _radioComponent; }
ESP8266Component* esp8266Component(void) { return _esp8266Component; }
FlightModesComponent* flightModesComponent(void) { return _flightModesComponent; }
SensorsComponent* sensorsComponent(void) { return _sensorsComponent; }
SafetyComponent* safetyComponent(void) { return _safetyComponent; }
CameraComponent* cameraComponent(void) { return _cameraComponent; }
PowerComponent* powerComponent(void) { return _powerComponent; }
MotorComponent* motorComponent(void) { return _motorComponent; }
PX4TuningComponent* tuningComponent(void) { return _tuningComponent; }
MixersComponent* mixersComponent(void) { return _mixersComponent; }
QString prerequisiteSetup(VehicleComponent* component) const override;
protected:
bool _incorrectParameterVersion; ///< true: parameter version incorrect, setup not allowed
private:
PX4AirframeLoader* _airframeFacts;
QVariantList _components;
AirframeComponent* _airframeComponent;
PX4RadioComponent* _radioComponent;
ESP8266Component* _esp8266Component;
......@@ -74,6 +59,9 @@ private:
MotorComponent* _motorComponent;
PX4TuningComponent* _tuningComponent;
MixersComponent* _mixersComponent;
private:
QVariantList _components;
};
#endif
......@@ -73,17 +73,3 @@ QUrl PX4RadioComponent::summaryQmlSource(void) const
{
return QUrl::fromUserInput("qrc:/qml/PX4RadioComponentSummary.qml");
}
QString PX4RadioComponent::prerequisiteSetup(void) const
{
if (_vehicle->parameterManager()->getParameter(-1, "COM_RC_IN_MODE")->rawValue().toInt() != 1) {
PX4AutoPilotPlugin* plugin = dynamic_cast<PX4AutoPilotPlugin*>(_autopilot);
if (!plugin->airframeComponent()->setupComplete()) {
return plugin->airframeComponent()->name();
}
}
return QString();
}
......@@ -31,7 +31,6 @@ public:
virtual bool setupComplete(void) const;
virtual QUrl setupSource(void) const;
virtual QUrl summaryQmlSource(void) const;
virtual QString prerequisiteSetup(void) const;
private:
const QString _name;
......
......@@ -84,17 +84,3 @@ QUrl PX4TuningComponent::summaryQmlSource(void) const
{
return QUrl();
}
QString PX4TuningComponent::prerequisiteSetup(void) const
{
PX4AutoPilotPlugin* plugin = dynamic_cast<PX4AutoPilotPlugin*>(_autopilot);
if (plugin) {
if (!plugin->airframeComponent()->setupComplete()) {
return plugin->airframeComponent()->name();
}
} else {
qWarning() << "Internal error: plugin cast failed";
}
return QString();
}
......@@ -31,7 +31,6 @@ public:
bool setupComplete(void) const final;
QUrl setupSource(void) const final;
QUrl summaryQmlSource(void) const final;
QString prerequisiteSetup(void) const final;
bool allowSetupWhileArmed(void) const final { return true; }
private:
......
......@@ -66,13 +66,3 @@ QUrl PowerComponent::summaryQmlSource(void) const
{
return QUrl::fromUserInput("qrc:/qml/PowerComponentSummary.qml");
}
QString PowerComponent::prerequisiteSetup(void) const
{
PX4AutoPilotPlugin* plugin = dynamic_cast<PX4AutoPilotPlugin*>(_autopilot);
Q_ASSERT(plugin);