Commit fb473fe7 authored by Don Gagne's avatar Don Gagne

Add ESC Calibration support to Power Component

parent bdbb3c45
......@@ -565,6 +565,7 @@ HEADERS+= \
src/AutoPilotPlugins/PX4/FlightModesComponent.h \
src/AutoPilotPlugins/PX4/FlightModesComponentController.h \
src/AutoPilotPlugins/PX4/PowerComponent.h \
src/AutoPilotPlugins/PX4/PowerComponentController.h \
src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.h \
src/AutoPilotPlugins/PX4/PX4Component.h \
src/AutoPilotPlugins/PX4/PX4ParameterLoader.h \
......@@ -593,6 +594,7 @@ SOURCES += \
src/AutoPilotPlugins/PX4/FlightModesComponent.cc \
src/AutoPilotPlugins/PX4/FlightModesComponentController.cc \
src/AutoPilotPlugins/PX4/PowerComponent.cc \
src/AutoPilotPlugins/PX4/PowerComponentController.cc \
src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc \
src/AutoPilotPlugins/PX4/PX4Component.cc \
src/AutoPilotPlugins/PX4/PX4ParameterLoader.cc \
......
......@@ -27,18 +27,27 @@
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
import QtQuick.Dialogs 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
import QGroundControl.Controllers 1.0
Rectangle {
QGCPalette { id: palette; colorGroupEnabled: true }
QGCView {
id: rootQGCView
viewComponent: view
Component {
id: view
QGCViewPanel {
id: viewPanel
QGCPalette { id: palette; colorGroupEnabled: enabled }
id: powerSettings
width: 600
height: 600
color: palette.window
......@@ -46,9 +55,9 @@ Rectangle {
property int firstColumnWidth: 220
property int textEditWidth: 80
property Fact battNumCells: Fact { name: "BAT_N_CELLS" }
property Fact battHighVolt: Fact { name: "BAT_V_CHARGED" }
property Fact battLowVolt: Fact { name: "BAT_V_EMPTY" }
property Fact battNumCells: Fact { name: "BAT_N_CELLS"; onFactMissing: showMissingFactOverlay(name) }
property Fact battHighVolt: Fact { name: "BAT_V_CHARGED"; onFactMissing: showMissingFactOverlay(name) }
property Fact battLowVolt: Fact { name: "BAT_V_EMPTY"; onFactMissing: showMissingFactOverlay(name) }
property alias battHigh: battHighRow
property alias battLow: battLowRow
......@@ -91,19 +100,31 @@ Rectangle {
drawArrowhead(ctx, x2, y2, rd);
}
PowerComponentController {
id: controller
factPanel: viewPanel
onOldFirmware: showMessage("ESC Calibration", "QGroundControl cannot perform ESC Calibration with this version of firmware. You will need to upgrade to a newer firmware.", StandardButton.Ok)
onNewerFirmware: showMessage("ESC Calibration", "QGroundControl cannot perform ESC Calibration with this version of firmware. You will need to upgrade QGroundControl.", StandardButton.Ok)
onBatteryConnected: showMessage("ESC Calibration", "Performing calibration. This will take a few seconds..", 0)
onCalibrationFailed: showMessage("ESC Calibration failed", errorMessage, StandardButton.Ok)
onCalibrationSuccess: showMessage("ESC Calibration", "Calibration complete. You can disconnect your battery now if you like.", StandardButton.Ok)
onConnectBattery: showMessage("ESC Calibration", "WARNING: Props must be removed from vehicle prior to performing ESC calibration.\n\nConnect the battery now and calibration will begin.", 0)
}
Column {
anchors.fill: parent
spacing: 10
QGCLabel {
text: "POWER CONFIG"
font.pointSize: ScreenTools.fontPointFactor * (20);
font.pointSize: ScreenTools.largeFontPointSize
}
QGCLabel {
text: "Battery"
color: palette.text
font.pointSize: ScreenTools.fontPointFactor * (20);
font.pointSize: ScreenTools.mediumFontPointSize
}
Rectangle {
......@@ -128,7 +149,7 @@ Rectangle {
FactTextField {
id: cellsField
width: textEditWidth
fact: Fact { name: "BAT_N_CELLS" }
fact: Fact { name: "BAT_N_CELLS"; onFactMissing: showMissingFactOverlay(name) }
showUnits: true
}
}
......@@ -139,7 +160,7 @@ Rectangle {
FactTextField {
id: battHighField
width: textEditWidth
fact: Fact { name: "BAT_V_CHARGED" }
fact: Fact { name: "BAT_V_CHARGED"; onFactMissing: showMissingFactOverlay(name) }
showUnits: true
}
}
......@@ -150,7 +171,7 @@ Rectangle {
FactTextField {
id: battLowField
width: textEditWidth
fact: Fact { name: "BAT_V_EMPTY" }
fact: Fact { name: "BAT_V_EMPTY"; onFactMissing: showMissingFactOverlay(name) }
showUnits: true
}
}
......@@ -218,6 +239,37 @@ Rectangle {
}
}
}
QGCLabel {
text: "ESC Calibration"
font.pointSize: ScreenTools.mediumFontPointSize
}
Rectangle {
width: parent.width
height: 80
color: palette.windowShade
Column {
anchors.margins: 10
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.bottom: calibrateButton.bottom
spacing: 10
QGCLabel {
text: "WARNING: Props must be removed from vehicle prior to performing ESC calibration."
}
QGCButton {
id: calibrateButton
text: "Calibrate"
onClicked: controller.calibrateEsc()
}
}
}
/*
* This is disabled for now
Row {
......@@ -255,6 +307,7 @@ Rectangle {
}
}
*/
//-- Advanced Settings
QGCCheckBox {
id: showAdvanced
......@@ -282,11 +335,13 @@ Rectangle {
FactTextField {
id: battDropField
width: textEditWidth
fact: Fact { name: "BAT_V_LOAD_DROP" }
fact: Fact { name: "BAT_V_LOAD_DROP"; onFactMissing: showMissingFactOverlay(name) }
showUnits: true
}
}
}
}
}
} // Column
} // QGCViewPanel
} // Component - view
}
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
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 <http://www.gnu.org/licenses/>.
======================================================================*/
/// @file
/// @author Don Gagne <don@thegagnes.com>
#include "PowerComponentController.h"
#include "QGCMAVLink.h"
#include "UASManager.h"
#include "QGCMessageBox.h"
#include <QVariant>
#include <QQmlProperty>
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::_stopCalibration(void)
{
disconnect(_uas, &UASInterface::textMessageReceived, this, &PowerComponentController::_handleUASTextMessage);
}
void PowerComponentController::_handleUASTextMessage(int uasId, int compId, int severity, QString text)
{
Q_UNUSED(compId);
Q_UNUSED(severity);
UASInterface* uas = _autopilot->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;
}
int firmwareRev = parts[0].toInt();
if (firmwareRev < _neededFirmwareRev) {
emit oldFirmware();
return;
}
if (firmwareRev > _neededFirmwareRev) {
emit newerFirmware();
return;
}
}
if (text == "Connect battery now") {
emit connectBattery();
return;
}
if (text == "Battery connected") {
emit batteryConnected();
return;
}
QString failedPrefix("calibration failed: ");
if (text.startsWith(failedPrefix)) {
_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("calibration warning: ");
if (text.startsWith(warningPrefix)) {
_warningMessages << text.right(text.length() - warningPrefix.length());
}
}
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
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 <http://www.gnu.org/licenses/>.
======================================================================*/
/// @file
/// @author Don Gagne <don@thegagnes.com>
#ifndef PowerComponentController_H
#define PowerComponentController_H
#include <QObject>
#include <QQuickItem>
#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);
signals:
void oldFirmware(void);
void newerFirmware(void);
void incorrectFirmwareRevReporting(void);
void connectBattery(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);
QStringList _warningMessages;
static const int _neededFirmwareRev = 1;
};
#endif
......@@ -65,6 +65,7 @@
#include "FlightModesComponentController.h"
#include "AirframeComponentController.h"
#include "SensorsComponentController.h"
#include "PowerComponentController.h"
#include "ScreenTools.h"
#include "MavManager.h"
......@@ -322,6 +323,7 @@ void QGCApplication::_initCommon(void)
qmlRegisterType<FlightModesComponentController>("QGroundControl.Controllers", 1, 0, "FlightModesComponentController");
qmlRegisterType<AirframeComponentController>("QGroundControl.Controllers", 1, 0, "AirframeComponentController");
qmlRegisterType<SensorsComponentController>("QGroundControl.Controllers", 1, 0, "SensorsComponentController");
qmlRegisterType<PowerComponentController>("QGroundControl.Controllers", 1, 0, "PowerComponentController");
//-- Create QML Singleton Interfaces
qmlRegisterSingletonType<ScreenTools>("QGroundControl.ScreenTools", 1, 0, "ScreenTools", screenToolsSingletonFactory);
......
......@@ -1455,6 +1455,7 @@ void UAS::startCalibration(UASInterface::StartCalibrationType calType)
int airspeedCal = 0;
int radioCal = 0;
int accelCal = 0;
int escCal = 0;
switch (calType) {
case StartCalibrationGyro:
......@@ -1475,6 +1476,9 @@ void UAS::startCalibration(UASInterface::StartCalibrationType calType)
case StartCalibrationLevel:
accelCal = 2;
break;
case StartCalibrationEsc:
escCal = 1;
break;
}
mavlink_message_t msg;
......@@ -1491,7 +1495,7 @@ void UAS::startCalibration(UASInterface::StartCalibrationType calType)
radioCal, // radio cal
accelCal, // accel cal
airspeedCal, // airspeed cal
0); // unused
escCal); // esc cal
sendMessage(msg);
}
......
......@@ -244,7 +244,8 @@ public:
StartCalibrationMag,
StartCalibrationAirspeed,
StartCalibrationAccel,
StartCalibrationLevel
StartCalibrationLevel,
StartCalibrationEsc
};
/// Starts the specified calibration
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment