diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 589b3e343c1a5c1e9700f4e35c25f7c756c108c6..e6f7fcde31effefdb635195de556f2ca1b733f6a 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 61848f0266ecdce2688093705d75c8cfddf62578..ae36d2193730ff885d6af0c966beb5f666f8f122 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 d8254a3f0790f724518cfc8ae1b392e3e3882a04..338ce0d7ab7668d0e4e2b292c46a0e0b137d4d09 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 1102cf1e77fb9f2e7b9f60c9eae75e61d668b17b..9eedfe9486c949e8dd3e78d6a62dc56b9f44c3a7 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 0000000000000000000000000000000000000000..8f5203b1771b8b79bff77798807450dd0e78422a --- /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 0000000000000000000000000000000000000000..6c77b281e18ba1f7f4431760d81299b20d1611b8 --- /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 0000000000000000000000000000000000000000..37f0aa6644b030e6f6adf03b4048091f97b91d81 --- /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 0000000000000000000000000000000000000000..5e608c7ca141af3012196b9d01921674a771c441 --- /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 0000000000000000000000000000000000000000..2575a6d7ba6e7842401da6bffe3123c56addc1f4 --- /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 52330744d11bf5aadc19ed23d7eb28e4104de720..26ab7c440323bf722a8cf6cf25278073ab4d64c5 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 f4afbe8d357f289df5292867de85f50869eef9a4..aa7050a0e2dda8868b29ee78a09e0d31b72150ba 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