From 01ff99bff0b3066e4abfb13207afea792ae389b5 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sat, 19 Dec 2015 22:56:02 -0800 Subject: [PATCH] APM Power Config --- qgroundcontrol.pro | 6 +- qgroundcontrol.qrc | 2 + .../APM/APMAutoPilotPlugin.cc | 10 + src/AutoPilotPlugins/APM/APMAutoPilotPlugin.h | 3 + src/AutoPilotPlugins/APM/APMPowerComponent.cc | 86 ++++++ src/AutoPilotPlugins/APM/APMPowerComponent.h | 54 ++++ .../APM/APMPowerComponent.qml | 251 ++++++++++++++++++ .../APM/APMPowerComponentController.cc | 174 ++++++++++++ .../APM/APMPowerComponentController.h | 70 +++++ .../APM/APMPowerComponentSummary.qml | 57 ++++ src/AutoPilotPlugins/PX4/SafetyComponent.cc | 1 - src/FactSystem/FactControls/FactTextField.qml | 6 +- 12 files changed, 715 insertions(+), 5 deletions(-) create mode 100644 src/AutoPilotPlugins/APM/APMPowerComponent.cc create mode 100644 src/AutoPilotPlugins/APM/APMPowerComponent.h create mode 100644 src/AutoPilotPlugins/APM/APMPowerComponent.qml create mode 100644 src/AutoPilotPlugins/APM/APMPowerComponentController.cc create mode 100644 src/AutoPilotPlugins/APM/APMPowerComponentController.h create mode 100644 src/AutoPilotPlugins/APM/APMPowerComponentSummary.qml diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 589b3e343..e6f7fcde3 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 61848f026..ae36d2193 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 d8254a3f0..338ce0d7a 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 1102cf1e7..9eedfe948 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 000000000..8f5203b17 --- /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 000000000..6c77b281e --- /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 000000000..37f0aa664 --- /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 000000000..5e608c7ca --- /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 000000000..2575a6d7b --- /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 52330744d..26ab7c440 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 f4afbe8d3..aa7050a0e 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 -- 2.22.0