diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro
index 589b3e3..e6f7fcd 100644
--- a/qgroundcontrol.pro
+++ b/qgroundcontrol.pro
@@ -559,9 +559,10 @@ HEADERS+= \
src/AutoPilotPlugins/APM/APMAirframeComponentController.h \
src/AutoPilotPlugins/APM/APMAirframeComponentAirframes.h \
src/AutoPilotPlugins/APM/APMComponent.h \
- src/AutoPilotPlugins/APM/APMRadioComponent.h \
src/AutoPilotPlugins/APM/APMFlightModesComponent.h \
src/AutoPilotPlugins/APM/APMFlightModesComponentController.h \
+ src/AutoPilotPlugins/APM/APMPowerComponent.h \
+ src/AutoPilotPlugins/APM/APMRadioComponent.h \
src/AutoPilotPlugins/APM/APMSafetyComponent.h \
src/AutoPilotPlugins/APM/APMSensorsComponent.h \
src/AutoPilotPlugins/APM/APMSensorsComponentController.h \
@@ -611,9 +612,10 @@ SOURCES += \
src/AutoPilotPlugins/APM/APMAirframeComponent.cc \
src/AutoPilotPlugins/APM/APMAirframeComponentController.cc \
src/AutoPilotPlugins/APM/APMComponent.cc \
- src/AutoPilotPlugins/APM/APMRadioComponent.cc \
src/AutoPilotPlugins/APM/APMFlightModesComponent.cc \
src/AutoPilotPlugins/APM/APMFlightModesComponentController.cc \
+ src/AutoPilotPlugins/APM/APMPowerComponent.cc \
+ src/AutoPilotPlugins/APM/APMRadioComponent.cc \
src/AutoPilotPlugins/APM/APMSafetyComponent.cc \
src/AutoPilotPlugins/APM/APMSensorsComponent.cc \
src/AutoPilotPlugins/APM/APMSensorsComponentController.cc \
diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc
index 61848f0..ae36d21 100644
--- a/qgroundcontrol.qrc
+++ b/qgroundcontrol.qrc
@@ -106,6 +106,8 @@
src/AutoPilotPlugins/Common/RadioComponent.qml
src/AutoPilotPlugins/PX4/PX4RadioComponentSummary.qml
src/AutoPilotPlugins/APM/APMNotSupported.qml
+ src/AutoPilotPlugins/APM/APMPowerComponent.qml
+ src/AutoPilotPlugins/APM/APMPowerComponentSummary.qml
src/AutoPilotPlugins/APM/APMRadioComponentSummary.qml
src/AutoPilotPlugins/APM/APMSafetyComponentCopter.qml
src/AutoPilotPlugins/APM/APMSafetyComponentPlane.qml
diff --git a/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.cc b/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.cc
index d8254a3..338ce0d 100644
--- a/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.cc
+++ b/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.cc
@@ -38,6 +38,7 @@
#include "APMSafetyComponent.h"
#include "APMTuningComponent.h"
#include "APMSensorsComponent.h"
+#include "APMPowerComponent.h"
/// This is the AutoPilotPlugin implementatin for the MAV_AUTOPILOT_ARDUPILOT type.
APMAutoPilotPlugin::APMAutoPilotPlugin(Vehicle* vehicle, QObject* parent)
@@ -45,6 +46,7 @@ APMAutoPilotPlugin::APMAutoPilotPlugin(Vehicle* vehicle, QObject* parent)
, _incorrectParameterVersion(false)
, _airframeComponent(NULL)
, _flightModesComponent(NULL)
+ , _powerComponent(NULL)
, _radioComponent(NULL)
, _safetyComponent(NULL)
, _sensorsComponent(NULL)
@@ -83,6 +85,14 @@ const QVariantList& APMAutoPilotPlugin::vehicleComponents(void)
qWarning() << "new APMFlightModesComponent failed";
}
+ _powerComponent = new APMPowerComponent(_vehicle, this);
+ if (_powerComponent) {
+ _powerComponent->setupTriggerSignals();
+ _components.append(QVariant::fromValue((VehicleComponent*)_powerComponent));
+ } else {
+ qWarning() << "new APMPowerComponent failed";
+ }
+
_radioComponent = new APMRadioComponent(_vehicle, this);
if (_radioComponent) {
_radioComponent->setupTriggerSignals();
diff --git a/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.h b/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.h
index 1102cf1..9eedfe9 100644
--- a/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.h
+++ b/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.h
@@ -34,6 +34,7 @@ class APMRadioComponent;
class APMTuningComponent;
class APMSafetyComponent;
class APMSensorsComponent;
+class APMPowerComponent;
/// This is the APM specific implementation of the AutoPilot class.
class APMAutoPilotPlugin : public AutoPilotPlugin
@@ -49,6 +50,7 @@ public:
APMAirframeComponent* airframeComponent (void) { return _airframeComponent; }
APMFlightModesComponent* flightModesComponent(void) { return _flightModesComponent; }
+ APMPowerComponent* powerComponent (void) { return _powerComponent; }
APMRadioComponent* radioComponent (void) { return _radioComponent; }
APMSafetyComponent* safetyComponent (void) { return _safetyComponent; }
APMSensorsComponent* sensorsComponent (void) { return _sensorsComponent; }
@@ -64,6 +66,7 @@ private:
APMAirframeComponent* _airframeComponent;
APMFlightModesComponent* _flightModesComponent;
+ APMPowerComponent* _powerComponent;
APMRadioComponent* _radioComponent;
APMSafetyComponent* _safetyComponent;
APMSensorsComponent* _sensorsComponent;
diff --git a/src/AutoPilotPlugins/APM/APMPowerComponent.cc b/src/AutoPilotPlugins/APM/APMPowerComponent.cc
new file mode 100644
index 0000000..8f5203b
--- /dev/null
+++ b/src/AutoPilotPlugins/APM/APMPowerComponent.cc
@@ -0,0 +1,86 @@
+/*=====================================================================
+
+ QGroundControl Open Source Ground Control Station
+
+ (c) 2009 - 2015 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 .
+
+ ======================================================================*/
+
+#include "APMPowerComponent.h"
+#include "APMAutoPilotPlugin.h"
+#include "APMAirframeComponent.h"
+
+APMPowerComponent::APMPowerComponent(Vehicle* vehicle, AutoPilotPlugin* autopilot, QObject* parent)
+ : APMComponent(vehicle, autopilot, parent),
+ _name("Power")
+{
+}
+
+QString APMPowerComponent::name(void) const
+{
+ return _name;
+}
+
+QString APMPowerComponent::description(void) const
+{
+ return tr("The Power Component is used to setup battery parameters.");
+}
+
+QString APMPowerComponent::iconResource(void) const
+{
+ return "/qmlimages/PowerComponentIcon.png";
+}
+
+bool APMPowerComponent::requiresSetup(void) const
+{
+ return true;
+}
+
+bool APMPowerComponent::setupComplete(void) const
+{
+ return _autopilot->getParameterFact(FactSystem::defaultComponentId, "BATT_CAPACITY")->rawValue().toInt() != 0;
+}
+
+QStringList APMPowerComponent::setupCompleteChangedTriggerList(void) const
+{
+ QStringList list;
+
+ list << "BATT_CAPACITY";
+
+ return list;
+}
+
+QUrl APMPowerComponent::setupSource(void) const
+{
+ return QUrl::fromUserInput("qrc:/qml/APMPowerComponent.qml");
+}
+
+QUrl APMPowerComponent::summaryQmlSource(void) const
+{
+ return QUrl::fromUserInput("qrc:/qml/APMPowerComponentSummary.qml");
+}
+
+QString APMPowerComponent::prerequisiteSetup(void) const
+{
+ APMAutoPilotPlugin* plugin = dynamic_cast(_autopilot);
+ Q_ASSERT(plugin);
+ if (!plugin->airframeComponent()->setupComplete()) {
+ return plugin->airframeComponent()->name();
+ }
+ return QString();
+}
diff --git a/src/AutoPilotPlugins/APM/APMPowerComponent.h b/src/AutoPilotPlugins/APM/APMPowerComponent.h
new file mode 100644
index 0000000..6c77b28
--- /dev/null
+++ b/src/AutoPilotPlugins/APM/APMPowerComponent.h
@@ -0,0 +1,54 @@
+/*=====================================================================
+
+ QGroundControl Open Source Ground Control Station
+
+ (c) 2009 - 2015 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 APMPowerComponent_H
+#define APMPowerComponent_H
+
+#include "APMComponent.h"
+
+class APMPowerComponent : public APMComponent
+{
+ Q_OBJECT
+
+public:
+ APMPowerComponent(Vehicle* vehicle, AutoPilotPlugin* autopilot, QObject* parent = NULL);
+
+ // Virtuals from PX4Component
+ virtual QStringList setupCompleteChangedTriggerList(void) const;
+
+ // Virtuals from VehicleComponent
+ virtual QString name (void) const;
+ virtual QString description (void) const;
+ virtual QString iconResource (void) const;
+ virtual bool requiresSetup (void) const;
+ virtual bool setupComplete (void) const;
+ virtual QUrl setupSource (void) const;
+ virtual QUrl summaryQmlSource (void) const;
+ virtual QString prerequisiteSetup (void) const;
+
+private:
+ const QString _name;
+ QVariantList _summaryItems;
+};
+
+#endif
diff --git a/src/AutoPilotPlugins/APM/APMPowerComponent.qml b/src/AutoPilotPlugins/APM/APMPowerComponent.qml
new file mode 100644
index 0000000..37f0aa6
--- /dev/null
+++ b/src/AutoPilotPlugins/APM/APMPowerComponent.qml
@@ -0,0 +1,251 @@
+/*=====================================================================
+
+ QGroundControl Open Source Ground Control Station
+
+ (c) 2009 - 2015 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 .
+
+ ======================================================================*/
+
+import QtQuick 2.5
+import QtQuick.Controls 1.2
+
+import QGroundControl.FactSystem 1.0
+import QGroundControl.FactControls 1.0
+import QGroundControl.Palette 1.0
+import QGroundControl.Controls 1.0
+import QGroundControl.ScreenTools 1.0
+
+QGCView {
+ id: rootQGCView
+ viewPanel: panel
+
+ property Fact battAmpPerVolt: controller.getParameterFact(-1, "BATT_AMP_PERVOLT")
+ property Fact battCapacity: controller.getParameterFact(-1, "BATT_CAPACITY")
+ property Fact battCurrPin: controller.getParameterFact(-1, "BATT_CURR_PIN")
+ property Fact battMonitor: controller.getParameterFact(-1, "BATT_MONITOR")
+ property Fact battVoltMult: controller.getParameterFact(-1, "BATT_VOLT_MULT")
+ property Fact battVoltPin: controller.getParameterFact(-1, "BATT_VOLT_PIN")
+
+ property real _margins: ScreenTools.defaultFontPixelHeight
+ property bool _showAdvanced: sensorCombo.currentIndex == sensorModel.count - 1
+
+ Component.onCompleted: calcSensor()
+
+ function calcSensor() {
+ for (var i=0; i
+
+ 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 "PowerComponentController.h"
+#include "QGCMAVLink.h"
+#include "UAS.h"
+
+#include
+#include
+
+PowerComponentController::PowerComponentController(void)
+{
+
+}
+
+PowerComponentController::~PowerComponentController()
+{
+ _stopCalibration();
+}
+
+void PowerComponentController::calibrateEsc(void)
+{
+ _warningMessages.clear();
+ connect(_uas, &UASInterface::textMessageReceived, this, &PowerComponentController::_handleUASTextMessage);
+ _uas->startCalibration(UASInterface::StartCalibrationEsc);
+}
+
+void PowerComponentController::busConfigureActuators(void)
+{
+ _warningMessages.clear();
+ connect(_uas, &UASInterface::textMessageReceived, this, &PowerComponentController::_handleUASTextMessage);
+ _uas->startBusConfig(UASInterface::StartBusConfigActuators);
+}
+
+void PowerComponentController::stopBusConfigureActuators(void)
+{
+ disconnect(_uas, &UASInterface::textMessageReceived, this, &PowerComponentController::_handleUASTextMessage);
+ _uas->startBusConfig(UASInterface::EndBusConfigActuators);
+}
+
+void PowerComponentController::_stopCalibration(void)
+{
+ disconnect(_uas, &UASInterface::textMessageReceived, this, &PowerComponentController::_handleUASTextMessage);
+}
+
+void PowerComponentController::_stopBusConfig(void)
+{
+ _stopCalibration();
+}
+
+void PowerComponentController::_handleUASTextMessage(int uasId, int compId, int severity, QString text)
+{
+ Q_UNUSED(compId);
+ Q_UNUSED(severity);
+
+ UASInterface* uas = _autopilot->vehicle()->uas();
+ Q_ASSERT(uas);
+ if (uasId != uas->getUASID()) {
+ return;
+ }
+
+ // All calibration messages start with [cal]
+ QString calPrefix("[cal] ");
+ if (!text.startsWith(calPrefix)) {
+ return;
+ }
+ text = text.right(text.length() - calPrefix.length());
+
+ // Make sure we can understand this firmware rev
+ QString calStartPrefix("calibration started: ");
+ if (text.startsWith(calStartPrefix)) {
+ text = text.right(text.length() - calStartPrefix.length());
+
+ // Split version number and cal type
+ QStringList parts = text.split(" ");
+ if (parts.count() != 2) {
+ emit incorrectFirmwareRevReporting();
+ return;
+ }
+
+#if 0
+ // FIXME: Cal version check is not working. Needs to be able to cancel, calibration
+
+ int firmwareRev = parts[0].toInt();
+ if (firmwareRev < _neededFirmwareRev) {
+ emit oldFirmware();
+ return;
+ }
+ if (firmwareRev > _neededFirmwareRev) {
+ emit newerFirmware();
+ return;
+ }
+#endif
+ }
+
+ if (text == "Connect battery now") {
+ emit connectBattery();
+ return;
+ }
+
+ if (text == "Battery connected") {
+ emit batteryConnected();
+ return;
+ }
+
+
+ QString failedPrefix("calibration failed: ");
+ if (text.startsWith(failedPrefix)) {
+ QString failureText = text.right(text.length() - failedPrefix.length());
+ if (failureText.startsWith("Disconnect battery")) {
+ emit disconnectBattery();
+ return;
+ }
+
+ _stopCalibration();
+ emit calibrationFailed(text.right(text.length() - failedPrefix.length()));
+ return;
+ }
+
+ QString calCompletePrefix("calibration done:");
+ if (text.startsWith(calCompletePrefix)) {
+ _stopCalibration();
+ emit calibrationSuccess(_warningMessages);
+ return;
+ }
+
+ QString warningPrefix("config warning: ");
+ if (text.startsWith(warningPrefix)) {
+ _warningMessages << text.right(text.length() - warningPrefix.length());
+ }
+
+ QString busFailedPrefix("bus conf fail:");
+ if (text.startsWith(busFailedPrefix)) {
+
+ _stopBusConfig();
+ emit calibrationFailed(text.right(text.length() - failedPrefix.length()));
+ return;
+ }
+
+ QString busCompletePrefix("bus conf done:");
+ if (text.startsWith(calCompletePrefix)) {
+ _stopBusConfig();
+ emit calibrationSuccess(_warningMessages);
+ return;
+ }
+
+ QString busWarningPrefix("bus conf warn: ");
+ if (text.startsWith(busWarningPrefix)) {
+ _warningMessages << text.right(text.length() - warningPrefix.length());
+ }
+}
diff --git a/src/AutoPilotPlugins/APM/APMPowerComponentController.h b/src/AutoPilotPlugins/APM/APMPowerComponentController.h
new file mode 100644
index 0000000..5e608c7
--- /dev/null
+++ b/src/AutoPilotPlugins/APM/APMPowerComponentController.h
@@ -0,0 +1,70 @@
+/*=====================================================================
+
+ QGroundControl Open Source Ground Control Station
+
+ (c) 2009, 2015 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
+
+#ifndef PowerComponentController_H
+#define PowerComponentController_H
+
+#include
+#include
+
+#include "UASInterface.h"
+#include "FactPanelController.h"
+
+/// Power Component MVC Controller for PowerComponent.qml.
+class PowerComponentController : public FactPanelController
+{
+ Q_OBJECT
+
+public:
+ PowerComponentController(void);
+ ~PowerComponentController();
+
+ Q_INVOKABLE void calibrateEsc(void);
+ Q_INVOKABLE void busConfigureActuators(void);
+ Q_INVOKABLE void stopBusConfigureActuators(void);
+
+signals:
+ void oldFirmware(void);
+ void newerFirmware(void);
+ void incorrectFirmwareRevReporting(void);
+ void connectBattery(void);
+ void disconnectBattery(void);
+ void batteryConnected(void);
+ void calibrationFailed(const QString& errorMessage);
+ void calibrationSuccess(const QStringList& warningMessages);
+
+private slots:
+ void _handleUASTextMessage(int uasId, int compId, int severity, QString text);
+
+private:
+ void _stopCalibration(void);
+ void _stopBusConfig(void);
+
+ QStringList _warningMessages;
+ static const int _neededFirmwareRev = 1;
+};
+
+#endif
diff --git a/src/AutoPilotPlugins/APM/APMPowerComponentSummary.qml b/src/AutoPilotPlugins/APM/APMPowerComponentSummary.qml
new file mode 100644
index 0000000..2575a6d
--- /dev/null
+++ b/src/AutoPilotPlugins/APM/APMPowerComponentSummary.qml
@@ -0,0 +1,57 @@
+/*=====================================================================
+
+ QGroundControl Open Source Ground Control Station
+
+ (c) 2009 - 2015 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 .
+
+ ======================================================================*/
+
+import QtQuick 2.5
+import QtQuick.Controls 1.2
+
+import QGroundControl.FactSystem 1.0
+import QGroundControl.FactControls 1.0
+import QGroundControl.Controls 1.0
+import QGroundControl.Palette 1.0
+
+FactPanel {
+ id: panel
+ anchors.fill: parent
+ color: qgcPal.windowShadeDark
+
+ QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
+ FactPanelController { id: controller; factPanel: panel }
+
+ property Fact battCapacity: controller.getParameterFact(-1, "BATT_CAPACITY")
+ property Fact battMonitor: controller.getParameterFact(-1, "BATT_MONITOR")
+
+ Column {
+ anchors.fill: parent
+ anchors.margins: 8
+
+ VehicleSummaryRow {
+ labelText: "Battery monitor:"
+ valueText: battMonitor.enumStringValue
+ }
+
+ VehicleSummaryRow {
+ labelText: "Battery capacity:"
+ valueText: battCapacity.valueString
+ }
+ }
+}
diff --git a/src/AutoPilotPlugins/PX4/SafetyComponent.cc b/src/AutoPilotPlugins/PX4/SafetyComponent.cc
index 5233074..26ab7c4 100644
--- a/src/AutoPilotPlugins/PX4/SafetyComponent.cc
+++ b/src/AutoPilotPlugins/PX4/SafetyComponent.cc
@@ -25,7 +25,6 @@
/// @author Don Gagne
#include "SafetyComponent.h"
-#include "QGCQmlWidgetHolder.h"
#include "PX4AutoPilotPlugin.h"
SafetyComponent::SafetyComponent(Vehicle* vehicle, AutoPilotPlugin* autopilot, QObject* parent) :
diff --git a/src/FactSystem/FactControls/FactTextField.qml b/src/FactSystem/FactControls/FactTextField.qml
index f4afbe8..aa7050a 100644
--- a/src/FactSystem/FactControls/FactTextField.qml
+++ b/src/FactSystem/FactControls/FactTextField.qml
@@ -11,11 +11,13 @@ import QGroundControl.Controls 1.0
QGCTextField {
id: _textField
+ text: fact.valueString
+ unitsLabel: fact.units
+ showUnits: true
+
property Fact fact: null
property string _validateString
- text: fact.valueString
- unitsLabel: fact.units
// At this point all Facts are numeric
inputMethodHints: Qt.ImhFormattedNumbersOnly