From c8d3af3afe481ff74d4f75b4cf23b1c091c4f506 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Fri, 27 Feb 2015 18:45:59 -0800 Subject: [PATCH] New Qml based sensor config --- src/AutoPilotPlugins/PX4/SensorsComponent.qml | 203 ++++++++++++++++++ .../PX4/SensorsComponentController.cc | 141 ++++++++++++ .../PX4/SensorsComponentController.h | 71 ++++++ 3 files changed, 415 insertions(+) create mode 100644 src/AutoPilotPlugins/PX4/SensorsComponent.qml create mode 100644 src/AutoPilotPlugins/PX4/SensorsComponentController.cc create mode 100644 src/AutoPilotPlugins/PX4/SensorsComponentController.h diff --git a/src/AutoPilotPlugins/PX4/SensorsComponent.qml b/src/AutoPilotPlugins/PX4/SensorsComponent.qml new file mode 100644 index 000000000..088927f4b --- /dev/null +++ b/src/AutoPilotPlugins/PX4/SensorsComponent.qml @@ -0,0 +1,203 @@ +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() + } + } + } +} + diff --git a/src/AutoPilotPlugins/PX4/SensorsComponentController.cc b/src/AutoPilotPlugins/PX4/SensorsComponentController.cc new file mode 100644 index 000000000..c887bbd51 --- /dev/null +++ b/src/AutoPilotPlugins/PX4/SensorsComponentController.cc @@ -0,0 +1,141 @@ +/*===================================================================== + + 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 + +#include "SensorsComponentController.h" +#include "QGCMAVLink.h" +#include "UASManager.h" + +#include +#include + +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; +} diff --git a/src/AutoPilotPlugins/PX4/SensorsComponentController.h b/src/AutoPilotPlugins/PX4/SensorsComponentController.h new file mode 100644 index 000000000..962735bef --- /dev/null +++ b/src/AutoPilotPlugins/PX4/SensorsComponentController.h @@ -0,0 +1,71 @@ +/*===================================================================== + + 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 SENSORSCOMPONENTCONTROLLER_H +#define SENSORSCOMPONENTCONTROLLER_H + +#include +#include + +#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 -- 2.22.0