Commit 01ff99bf authored by Don Gagne's avatar Don Gagne

APM Power Config

parent 08223436
......@@ -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 \
......
......@@ -106,6 +106,8 @@
<file alias="RadioComponent.qml">src/AutoPilotPlugins/Common/RadioComponent.qml</file>
<file alias="PX4RadioComponentSummary.qml">src/AutoPilotPlugins/PX4/PX4RadioComponentSummary.qml</file>
<file alias="APMNotSupported.qml">src/AutoPilotPlugins/APM/APMNotSupported.qml</file>
<file alias="APMPowerComponent.qml">src/AutoPilotPlugins/APM/APMPowerComponent.qml</file>
<file alias="APMPowerComponentSummary.qml">src/AutoPilotPlugins/APM/APMPowerComponentSummary.qml</file>
<file alias="APMRadioComponentSummary.qml">src/AutoPilotPlugins/APM/APMRadioComponentSummary.qml</file>
<file alias="APMSafetyComponentCopter.qml">src/AutoPilotPlugins/APM/APMSafetyComponentCopter.qml</file>
<file alias="APMSafetyComponentPlane.qml">src/AutoPilotPlugins/APM/APMSafetyComponentPlane.qml</file>
......
......@@ -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();
......
......@@ -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;
......
/*=====================================================================
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/>.
======================================================================*/
#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<APMAutoPilotPlugin*>(_autopilot);
Q_ASSERT(plugin);
if (!plugin->airframeComponent()->setupComplete()) {
return plugin->airframeComponent()->name();
}
return QString();
}
/*=====================================================================
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/>.
======================================================================*/
#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
/*=====================================================================
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/>.
======================================================================*/
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<sensorModel.count - 1; i++) {
if (sensorModel.get(i).voltPin == battVoltPin.value &&
sensorModel.get(i).currPin == battCurrPin.value &&
Math.abs(sensorModel.get(i).voltMult - battVoltMult.value) < 0.001 &&
Math.abs(sensorModel.get(i).ampPerVolt - battAmpPerVolt.value) < 0.0001) {
sensorCombo.currentIndex = i
return
}
}
sensorCombo.currentIndex = sensorModel.count - 1
}
QGCPalette { id: palette; colorGroupEnabled: panel.enabled }
FactPanelController { id: controller; factPanel: panel }
ListModel {
id: sensorModel
ListElement {
text: "Power Module 90A"
voltPin: 2
currPin: 3
voltMult: 10.1
ampPerVolt: 17.0
}
ListElement {
text: "Power Module HV"
voltPin: 2
currPin: 3
voltMult: 12.02
ampPerVolt: 39.877
}
ListElement {
text: "3DR Iris"
voltPin: 2
currPin: 3
voltMult: 12.02
ampPerVolt: 17.0
}
ListElement {
text: "Other"
}
}
QGCViewPanel {
id: panel
anchors.fill: parent
Flickable {
anchors.fill: parent
clip: true
contentWidth: capacityField.x + capacityField.width + _margins
contentHeight: (_showAdvanced ? ampPerVoltField.y + ampPerVoltField.height : sensorCombo.y + sensorCombo.height) + _margins
QGCLabel {
id: monitorLabel
anchors.margins: _margins
anchors.left: parent.left
anchors.baseline: monitorCombo.baseline
text: "Battery monitor:"
}
FactComboBox {
id: monitorCombo
anchors.topMargin: _margins
anchors.top: parent.top
anchors.left: capacityField.left
width: capacityField.width
fact: battMonitor
indexModel: false
}
QGCLabel {
id: capacityLabel
anchors.margins: _margins
anchors.left: parent.left
anchors.baseline: capacityField.baseline
text: "Battery capacity:"
}
FactTextField {
id: capacityField
anchors.leftMargin: _margins
anchors.topMargin: _margins / 2
anchors.top: monitorCombo.bottom
anchors.left: capacityLabel.right
width: ScreenTools.defaultFontPixelWidth * 25
fact: battCapacity
}
QGCLabel {
id: sensorLabel
anchors.margins: _margins
anchors.left: parent.left
anchors.baseline: sensorCombo.baseline
text: "Power sensor:"
}
QGCComboBox {
id: sensorCombo
anchors.topMargin: _margins
anchors.top: capacityField.bottom
anchors.left: capacityField.left
width: capacityField.width
model: sensorModel
onActivated: {
if (index < sensorModel.count - 1) {
battVoltPin.value = sensorModel.get(index).voltPin
battCurrPin.value = sensorModel.get(index).currPin
battVoltMult.value = sensorModel.get(index).voltMult
battAmpPerVolt.value = sensorModel.get(index).ampPerVolt
} else {
}
}
}
QGCLabel {
id: currPinLabel
anchors.margins: _margins
anchors.left: parent.left
anchors.baseline: currPinCombo.baseline
text: "Current pin:"
visible: _showAdvanced
}
FactComboBox {
id: currPinCombo
anchors.topMargin: _margins
anchors.top: sensorCombo.bottom
anchors.left: capacityField.left
width: capacityField.width
fact: battCurrPin
indexModel: false
visible: _showAdvanced
}
QGCLabel {
id: voltPinLabel
anchors.margins: _margins
anchors.left: parent.left
anchors.baseline: voltPinCombo.baseline
text: "Voltage pin:"
visible: _showAdvanced
}
FactComboBox {
id: voltPinCombo
anchors.topMargin: _margins / 2
anchors.top: currPinCombo.bottom
anchors.left: capacityField.left
width: capacityField.width
fact: battVoltPin
indexModel: false
visible: _showAdvanced
}
QGCLabel {
id: voltMultLabel
anchors.margins: _margins
anchors.left: parent.left
anchors.baseline: voltMultField.baseline
text: "Voltage multiplier:"
visible: _showAdvanced
}
FactTextField {
id: voltMultField
anchors.topMargin: _margins / 2
anchors.top: voltPinCombo.bottom
anchors.left: capacityField.left
width: capacityField.width
fact: battVoltMult
visible: _showAdvanced
}
QGCLabel {
id: ampPerVoltLabel
anchors.margins: _margins
anchors.left: parent.left
anchors.baseline: ampPerVoltField.baseline
text: "Amps per volt:"
visible: _showAdvanced
}
FactTextField {
id: ampPerVoltField
anchors.topMargin: _margins / 2
anchors.top: voltMultField.bottom
anchors.left: capacityField.left
width: capacityField.width
fact: battAmpPerVolt
visible: _showAdvanced
}
} // Flickable
} // QGCViewPanel
} // QGCView
/*=====================================================================
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 "UAS.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::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());
}
}
/*=====================================================================
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);
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
/*=====================================================================
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/>.
======================================================================*/
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
}
}
}
......@@ -25,7 +25,6 @@
/// @author Don Gagne <don@thegagnes.com>
#include "SafetyComponent.h"
#include "QGCQmlWidgetHolder.h"
#include "PX4AutoPilotPlugin.h"
SafetyComponent::SafetyComponent(Vehicle* vehicle, AutoPilotPlugin* autopilot, QObject* parent) :
......
......@@ -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
......
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