Commit c8d3af3a authored by Don Gagne's avatar Don Gagne

New Qml based sensor config

parent b6376530
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.Controls 1.0
Rectangle {
property QGCPalette qgcPal: QGCPalette { colorGroupEnabled: true }
readonly property int rotationColumnWidth: 200
readonly property var rotations: [
"ROTATION_NONE",
"ROTATION_YAW_45",
"ROTATION_YAW_90",
"ROTATION_YAW_135",
"ROTATION_YAW_180",
"ROTATION_YAW_225",
"ROTATION_YAW_270",
"ROTATION_YAW_315",
"ROTATION_ROLL_180",
"ROTATION_ROLL_180_YAW_45",
"ROTATION_ROLL_180_YAW_90",
"ROTATION_ROLL_180_YAW_135",
"ROTATION_PITCH_180",
"ROTATION_ROLL_180_YAW_225",
"ROTATION_ROLL_180_YAW_270",
"ROTATION_ROLL_180_YAW_315",
"ROTATION_ROLL_90",
"ROTATION_ROLL_90_YAW_45",
"ROTATION_ROLL_90_YAW_90",
"ROTATION_ROLL_90_YAW_135",
"ROTATION_ROLL_270",
"ROTATION_ROLL_270_YAW_45",
"ROTATION_ROLL_270_YAW_90",
"ROTATION_ROLL_270_YAW_135",
"ROTATION_PITCH_90",
"ROTATION_PITCH_270",
"ROTATION_ROLL_270_YAW_270"
]
width: 600
height: 600
color: qgcPal.window
// We use this bogus loader just so we can get an onLoaded signal to hook to in order to
// finish controller initialization.
Component {
id: loadSignal;
Item { }
}
Loader {
sourceComponent: loadSignal
onLoaded: controller.statusLog = statusTextArea
}
Column {
anchors.fill: parent
QGCLabel {
text: "SENSORS CONFIG"
font.pointSize: 20
}
Item { height: 20; width: 10 } // spacer
Item {
readonly property int calibrationAreaHeight: 300
width: parent.width
height: calibrationAreaHeight
TextArea {
id: statusTextArea
width: parent.width - rotationColumnWidth
height: parent.height
readOnly: true
frameVisible: false
text: qsTr("Sensor config is a work in progress which currently supports textual instructions only. Updated visuals coming soon.")
style: TextAreaStyle {
textColor: qgcPal.text
backgroundColor: qgcPal.windowShade
}
}
Column {
// Compass rotation parameter < 0 indicates either internal compass, or no compass. So in
// both those cases we do not show a rotation combo.
property bool showCompass0: autopilot.parameters["CAL_MAG0_ROT"].value >= 0
property bool showCompass1: autopilot.parameters["CAL_MAG1_ROT"].value >= 0
property bool showCompass2: autopilot.parameters["CAL_MAG2_ROT"].value >= 0
x: parent.width - rotationColumnWidth
QGCLabel { text: "Autpilot Orientation" }
FactComboBox {
width: rotationColumnWidth;
model: rotations
fact: autopilot.parameters["SENS_BOARD_ROT"]
}
// Compass 0 rotation
Component {
id: compass0ComponentLabel
QGCLabel { text: "Compass Orientation" }
}
Component {
id: compass0ComponentCombo
FactComboBox {
width: rotationColumnWidth
model: rotations
fact: autopilot.parameters["CAL_MAG0_ROT"]
}
}
Loader { sourceComponent: parent.showCompass0 ? compass0ComponentLabel : null }
Loader { sourceComponent: parent.showCompass0 ? compass0ComponentCombo : null }
// Compass 1 rotation
Component {
id: compass1ComponentLabel
QGCLabel { text: "Compass 1 Orientation" }
}
Component {
id: compass1ComponentCombo
FactComboBox {
width: rotationColumnWidth
model: rotations
fact: autopilot.parameters["CAL_MAG1_ROT"]
}
}
Loader { sourceComponent: parent.showCompass1 ? compass1ComponentLabel : null }
Loader { sourceComponent: parent.showCompass1 ? compass1ComponentCombo : null }
// Compass 2 rotation
Component {
id: compass2ComponentLabel
QGCLabel { text: "Compass 2 Orientation" }
}
Component {
id: compass2ComponentCombo
FactComboBox {
width: rotationColumnWidth
model: rotations
fact: autopilot.parameters["CAL_MAG2_ROT"]
}
}
Loader { sourceComponent: parent.showCompass2 ? compass2ComponentLabel : null }
Loader { sourceComponent: parent.showCompass2 ? compass2ComponentCombo : null }
}
}
Item { height: 20; width: 10 } // spacer
Row {
readonly property int buttonWidth: 120
spacing: 20
QGCLabel { text: "Calibrate:"; anchors.baseline: firstButton.baseline }
IndicatorButton {
id: firstButton
width: parent.buttonWidth
text: "Compass"
indicatorGreen: autopilot.parameters["CAL_MAG0_ID"].value != 0
onClicked: controller.calibrateCompass()
}
IndicatorButton {
width: parent.buttonWidth
text: "Gyroscope"
indicatorGreen: autopilot.parameters["CAL_GYRO0_ID"].value != 0
onClicked: controller.calibrateGyro()
}
IndicatorButton {
width: parent.buttonWidth
text: "Acceleromter"
indicatorGreen: autopilot.parameters["CAL_ACC0_ID"].value != 0
onClicked: controller.calibrateAccel()
}
IndicatorButton {
width: parent.buttonWidth
text: "Airspeed"
visible: controller.fixedWing
indicatorGreen: autopilot.parameters["SENS_DPRES_OFF"].value != 0
onClicked: controller.calibrateAirspeed()
}
}
}
}
/*=====================================================================
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 "SensorsComponentController.h"
#include "QGCMAVLink.h"
#include "UASManager.h"
#include <QVariant>
#include <QQmlProperty>
SensorsComponentController::SensorsComponentController(AutoPilotPlugin* autopilot, QObject* parent) :
QObject(parent),
_autopilot(autopilot)
{
Q_ASSERT(autopilot);
}
/// Appends the specified text to the status log area in the ui
void SensorsComponentController::_appendStatusLog(const QString& text)
{
Q_ASSERT(_statusLog);
QVariant returnedValue;
QVariant varText = text;
QMetaObject::invokeMethod(_statusLog,
"append",
Q_RETURN_ARG(QVariant, returnedValue),
Q_ARG(QVariant, varText));
}
void SensorsComponentController::calibrateGyro(void)
{
_beginTextLogging();
UASInterface* uas = _autopilot->uas();
Q_ASSERT(uas);
uas->executeCommand(MAV_CMD_PREFLIGHT_CALIBRATION, 1, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0);
}
void SensorsComponentController::calibrateCompass(void)
{
_beginTextLogging();
UASInterface* uas = _autopilot->uas();
Q_ASSERT(uas);
uas->executeCommand(MAV_CMD_PREFLIGHT_CALIBRATION, 1, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0);
}
void SensorsComponentController::calibrateAccel(void)
{
_beginTextLogging();
UASInterface* uas = _autopilot->uas();
Q_ASSERT(uas);
uas->executeCommand(MAV_CMD_PREFLIGHT_CALIBRATION, 1, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0);
}
void SensorsComponentController::calibrateAirspeed(void)
{
_beginTextLogging();
UASInterface* uas = _autopilot->uas();
Q_ASSERT(uas);
uas->executeCommand(MAV_CMD_PREFLIGHT_CALIBRATION, 1, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0);
}
void SensorsComponentController::_beginTextLogging(void)
{
UASInterface* uas = _autopilot->uas();
Q_ASSERT(uas);
connect(uas, &UASInterface::textMessageReceived, this, &SensorsComponentController::_handleUASTextMessage);
}
void SensorsComponentController::_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;
}
QStringList ignorePrefixList;
ignorePrefixList << "[cmd]" << "[mavlink pm]" << "[ekf check]";
foreach (QString ignorePrefix, ignorePrefixList) {
if (text.startsWith(ignorePrefix)) {
return;
}
}
_appendStatusLog(text);
if (text.endsWith(" calibration: done") || text.endsWith(" calibration: failed")) {
_refreshParams();
}
}
void SensorsComponentController::_refreshParams(void)
{
#if 0
// FIXME: Not sure if firmware issue yet
_autopilot->refreshParametersPrefix("CAL_");
_autopilot->refreshParametersPrefix("SENS_");
#else
// Sending too many parameter requests like above doesn't seem to work. So for now,
// ask for everything back
_autopilot->refreshAllParameters();
#endif
}
bool SensorsComponentController::fixedWing(void)
{
UASInterface* uas = _autopilot->uas();
Q_ASSERT(uas);
return uas->getSystemType() == MAV_TYPE_FIXED_WING;
}
/*=====================================================================
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 SENSORSCOMPONENTCONTROLLER_H
#define SENSORSCOMPONENTCONTROLLER_H
#include <QObject>
#include <QQuickItem>
#include "UASInterface.h"
#include "AutoPilotPlugin.h"
/// Sensors Component MVC Controller for SensorsComponent.qml.
class SensorsComponentController : public QObject
{
Q_OBJECT
public:
SensorsComponentController(AutoPilotPlugin* autopilot, QObject* parent = NULL);
Q_PROPERTY(bool fixedWing READ fixedWing CONSTANT)
/// TextArea for log output
Q_PROPERTY(QQuickItem* statusLog MEMBER _statusLog)
Q_INVOKABLE void calibrateCompass(void);
Q_INVOKABLE void calibrateGyro(void);
Q_INVOKABLE void calibrateAccel(void);
Q_INVOKABLE void calibrateAirspeed(void);
bool fixedWing(void);
signals:
void bogusNotify(void);
private slots:
void _handleUASTextMessage(int uasId, int compId, int severity, QString text);
private:
void _beginTextLogging(void);
void _appendStatusLog(const QString& text);
void _refreshParams(void);
QQuickItem* _statusLog; ///< Status log TextArea Qml control
AutoPilotPlugin* _autopilot;
};
#endif
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