Commit 6c714562 authored by Don Gagne's avatar Don Gagne

Merge pull request #2304 from DonLakeFlyer/VirtualThumbJoystick

Virtual thumb joystick
parents 7148d7b8 524b8548
...@@ -258,6 +258,7 @@ HEADERS += \ ...@@ -258,6 +258,7 @@ HEADERS += \
src/QGCFileDialog.h \ src/QGCFileDialog.h \
src/QGCGeo.h \ src/QGCGeo.h \
src/QGCLoggingCategory.h \ src/QGCLoggingCategory.h \
src/QGCMapPalette.h \
src/QGCMessageBox.h \ src/QGCMessageBox.h \
src/QGCPalette.h \ src/QGCPalette.h \
src/QGCQmlWidgetHolder.h \ src/QGCQmlWidgetHolder.h \
...@@ -371,6 +372,7 @@ SOURCES += \ ...@@ -371,6 +372,7 @@ SOURCES += \
src/QGCDockWidget.cc \ src/QGCDockWidget.cc \
src/QGCFileDialog.cc \ src/QGCFileDialog.cc \
src/QGCLoggingCategory.cc \ src/QGCLoggingCategory.cc \
src/QGCMapPalette.cc \
src/QGCPalette.cc \ src/QGCPalette.cc \
src/QGCQmlWidgetHolder.cpp \ src/QGCQmlWidgetHolder.cpp \
src/QGCQuickWidget.cc \ src/QGCQuickWidget.cc \
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
<file alias="QGroundControl/Controls/DropButton.qml">src/QmlControls/DropButton.qml</file> <file alias="QGroundControl/Controls/DropButton.qml">src/QmlControls/DropButton.qml</file>
<file alias="QGroundControl/Controls/ExclusiveGroupItem.qml">src/QmlControls/ExclusiveGroupItem.qml</file> <file alias="QGroundControl/Controls/ExclusiveGroupItem.qml">src/QmlControls/ExclusiveGroupItem.qml</file>
<file alias="QGroundControl/Controls/IndicatorButton.qml">src/QmlControls/IndicatorButton.qml</file> <file alias="QGroundControl/Controls/IndicatorButton.qml">src/QmlControls/IndicatorButton.qml</file>
<file alias="QGroundControl/Controls/JoystickThumbPad.qml">src/QmlControls/JoystickThumbPad.qml</file>
<file alias="QGroundControl/Controls/MainToolBar.qml">src/ui/toolbar/MainToolBar.qml</file> <file alias="QGroundControl/Controls/MainToolBar.qml">src/ui/toolbar/MainToolBar.qml</file>
<file alias="QGroundControl/Controls/MainToolBarIndicators.qml">src/ui/toolbar/MainToolBarIndicators.qml</file> <file alias="QGroundControl/Controls/MainToolBarIndicators.qml">src/ui/toolbar/MainToolBarIndicators.qml</file>
<file alias="QGroundControl/Controls/MissionItemEditor.qml">src/QmlControls/MissionItemEditor.qml</file> <file alias="QGroundControl/Controls/MissionItemEditor.qml">src/QmlControls/MissionItemEditor.qml</file>
......
...@@ -21,7 +21,7 @@ This file is part of the QGROUNDCONTROL project ...@@ -21,7 +21,7 @@ This file is part of the QGROUNDCONTROL project
======================================================================*/ ======================================================================*/
import QtQuick 2.4 import QtQuick 2.5
import QtQuick.Controls 1.3 import QtQuick.Controls 1.3
import QtQuick.Controls.Styles 1.2 import QtQuick.Controls.Styles 1.2
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
...@@ -216,4 +216,117 @@ Item { ...@@ -216,4 +216,117 @@ Item {
height: availableHeight height: availableHeight
} }
Item {
id: multiTouchItem
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
height: thumbAreaHeight
visible: QGroundControl.virtualTabletJoystick
readonly property real thumbAreaHeight: parent.height / 4
QGCMapPalette { id: mapPal; lightColors: !isBackgroundDark }
Component.onCompleted: console.log("test", mapPal)
MultiPointTouchArea {
anchors.fill: parent
maximumTouchPoints: 2
property var leftRect: Qt.rect(0, 0, parent.thumbAreaHeight, parent.thumbAreaHeight)
property var rightRect: Qt.rect(parent.width - parent.thumbAreaHeight, 0, parent.thumbAreaHeight, parent.thumbAreaHeight)
function pointInRect(rect, point) {
return point.x >= rect.x &&
point.y >= rect.y &&
point.x <= rect.x + rect.width &&
point.y <= rect.y + rect.height
}
function newTouchPoints(touchPoints)
{
var point1Location = 0
var point2Location = 0
var point1
if (touchPoints.length > 0) {
point1 = touchPoints[0]
if (pointInRect(leftRect, point1)) {
point1Location = -1
} else if (pointInRect(rightRect, point1)) {
point1Location = 1
}
}
var point2
if (touchPoints.length == 2) {
point2 = touchPoints[1]
if (pointInRect(leftRect, point2)) {
point2Location = -1
} else if (pointInRect(rightRect, point2)) {
point2Location = 1
}
}
// Make sure points are not both in the same rect
if (point1Location != point2Location) {
if (point1Location != 0) {
if (point1Location == -1) {
leftStick.stickPosition = point1
} else {
rightStick.stickPosition = Qt.point(point1.x - (multiTouchItem.width - multiTouchItem.thumbAreaHeight), point1.y)
}
}
if (point2Location != 0) {
if (point2Location == -1) {
rightStick.stickPosition = Qt.point(point2.x - (multiTouchItem.width - multiTouchItem.thumbAreaHeight), point2.y)
} else {
leftStick.stickPosition = point2
}
}
}
}
onPressed: newTouchPoints(touchPoints)
onTouchUpdated: newTouchPoints(touchPoints)
onReleased: {
leftStick.reCenter()
rightStick.reCenter()
}
}
Timer {
interval: 10
running: QGroundControl.virtualTabletJoystick
repeat: true
onTriggered: {
if (_activeVehicle) {
_activeVehicle.virtualTabletJoystickValue(rightStick.xAxis, rightStick.yAxis, leftStick.xAxis, leftStick.yAxis)
}
}
}
JoystickThumbPad {
id: leftStick
anchors.left: parent.left
anchors.bottom: parent.bottom
width: parent.thumbAreaHeight
height: parent.thumbAreaHeight
yAxisThrottle: true
lightColors: !isBackgroundDark
}
JoystickThumbPad {
id: rightStick
anchors.right: parent.right
anchors.bottom: parent.bottom
width: parent.thumbAreaHeight
height: parent.thumbAreaHeight
lightColors: !isBackgroundDark
}
}
} }
...@@ -56,6 +56,7 @@ ...@@ -56,6 +56,7 @@
#include "QGCTemporaryFile.h" #include "QGCTemporaryFile.h"
#include "QGCFileDialog.h" #include "QGCFileDialog.h"
#include "QGCPalette.h" #include "QGCPalette.h"
#include "QGCMapPalette.h"
#include "QGCLoggingCategory.h" #include "QGCLoggingCategory.h"
#include "ViewWidgetController.h" #include "ViewWidgetController.h"
#include "ParameterEditorController.h" #include "ParameterEditorController.h"
...@@ -334,7 +335,8 @@ void QGCApplication::_initCommon(void) ...@@ -334,7 +335,8 @@ void QGCApplication::_initCommon(void)
// Register our Qml objects // Register our Qml objects
qmlRegisterType<QGCPalette>("QGroundControl.Palette", 1, 0, "QGCPalette"); qmlRegisterType<QGCPalette> ("QGroundControl.Palette", 1, 0, "QGCPalette");
qmlRegisterType<QGCMapPalette> ("QGroundControl.Palette", 1, 0, "QGCMapPalette");
qmlRegisterUncreatableType<AutoPilotPlugin> ("QGroundControl.AutoPilotPlugin", 1, 0, "AutoPilotPlugin", "Reference only"); qmlRegisterUncreatableType<AutoPilotPlugin> ("QGroundControl.AutoPilotPlugin", 1, 0, "AutoPilotPlugin", "Reference only");
qmlRegisterUncreatableType<VehicleComponent> ("QGroundControl.AutoPilotPlugin", 1, 0, "VehicleComponent", "Reference only"); qmlRegisterUncreatableType<VehicleComponent> ("QGroundControl.AutoPilotPlugin", 1, 0, "VehicleComponent", "Reference only");
......
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009 - 2014 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 "QGCMapPalette.h"
#include <QApplication>
#include <QPalette>
QColor QGCMapPalette::_thumbJoystick[QGCMapPalette::_cColorGroups] = { QColor("#ffffff"), QColor("#f000000") };
QGCMapPalette::QGCMapPalette(QObject* parent) :
QObject(parent)
{
}
void QGCMapPalette::setLightColors(bool lightColors)
{
if ( _lightColors != lightColors) {
_lightColors = lightColors;
emit paletteChanged();
}
}
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009 - 2014 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/>.
======================================================================*/
/// QGCMapPalette is a variant of QGCPalette which is used to hold colors used for display over
/// the map control. Since the coloring of a satellite map differs greatly from the coloring of
/// a street map you need to be able to switch between sets of color based on map type.
#ifndef QGCMapPalette_h
#define QGCMapPalette_h
#include <QObject>
#include <QColor>
class QGCMapPalette : public QObject
{
Q_OBJECT
Q_PROPERTY(bool lightColors READ lightColors WRITE setLightColors NOTIFY paletteChanged)
// The colors are:
// thumbJoystick - Thumb joystick indicator
Q_PROPERTY(QColor thumbJoystick READ thumbJoystick NOTIFY paletteChanged)
public:
QGCMapPalette(QObject* parent = NULL);
bool lightColors(void) const { return _lightColors; }
void setLightColors(bool lightColors);
QColor thumbJoystick(void) const { return _thumbJoystick[_lightColors]; }
signals:
void paletteChanged(void);
private:
bool _lightColors;
static const int _cColorGroups = 2;
static QColor _thumbJoystick[_cColorGroups];
};
#endif
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
QGCQuickWidget::QGCQuickWidget(QWidget* parent) : QGCQuickWidget::QGCQuickWidget(QWidget* parent) :
QQuickWidget(parent) QQuickWidget(parent)
{ {
setAttribute(Qt::WA_AcceptTouchEvents);
rootContext()->engine()->addImportPath("qrc:/qml"); rootContext()->engine()->addImportPath("qrc:/qml");
rootContext()->setContextProperty("multiVehicleManager", qgcApp()->toolbox()->multiVehicleManager()); rootContext()->setContextProperty("multiVehicleManager", qgcApp()->toolbox()->multiVehicleManager());
rootContext()->setContextProperty("joystickManager", qgcApp()->toolbox()->joystickManager()); rootContext()->setContextProperty("joystickManager", qgcApp()->toolbox()->joystickManager());
......
import QtQuick 2.5
import QtQuick.Controls 1.2
import QGroundControl.Palette 1.0
import QGroundControl.ScreenTools 1.0
Rectangle {
radius: width / 2
border.color: mapPal.thumbJoystick
border.width: 2
color: "transparent"
property alias lightColors: mapPal.lightColors /// true: use light colors from QGCMapPalette for drawing
property var stickPosition: Qt.point(0, 0)
property real xAxis: 0 /// Value range [-1,1], negative values left stick, positive values right stick
property real yAxis: 0 /// Value range [-1,1], negative values up stick, positive values down stick
property bool yAxisThrottle: false /// true: yAxis used for throttle, range [1,0], positive value are stick up
property bool _stickCenteredOnce: false
QGCMapPalette { id: mapPal }
onWidthChanged: {
if (!_stickCenteredOnce && width != 0) {
reCenter()
}
}
onStickPositionChanged: {
var xAxisTemp = stickPosition.x / width
xAxisTemp *= 2.0
xAxisTemp -= 1.0
xAxis = xAxisTemp
var yAxisTemp = stickPosition.y / width
yAxisTemp *= 2.0
yAxisTemp -= 1.0
if (yAxisThrottle) {
yAxisTemp = ((yAxisTemp * -1.0) / 2.0) + 0.5
}
yAxis = yAxisTemp
}
function reCenter()
{
stickPosition = Qt.point(width / 2, width / 2)
}
Column {
QGCLabel { text: xAxis }
QGCLabel { text: yAxis }
}
Rectangle {
anchors.margins: parent.width / 4
anchors.fill: parent
radius: width / 2
border.color: mapPal.thumbJoystick
border.width: 2
color: "transparent"
}
Rectangle {
width: hatWidth
height: hatWidth
radius: hatWidthHalf
color: mapPal.thumbJoystick
x: stickPosition.x - hatWidthHalf
y: stickPosition.y - hatWidthHalf
readonly property real hatWidth: ScreenTools.defaultFontPixelHeight
readonly property real hatWidthHalf: ScreenTools.defaultFontPixelHeight / 2
}
}
Module QGroundControl.Controls Module QGroundControl.Controls
QGCLabel 1.0 QGCLabel.qml ClickableColor 1.0 ClickableColor.qml
QGCButton 1.0 QGCButton.qml DropButton 1.0 DropButton.qml
QGCRadioButton 1.0 QGCRadioButton.qml ExclusiveGroupItem 1.0 ExclusiveGroupItem.qml
QGCCheckBox 1.0 QGCCheckBox.qml IndicatorButton 1.0 IndicatorButton.qml
QGCTextField 1.0 QGCTextField.qml JoystickThumbPad 1.0 JoystickThumbPad.qml
QGCComboBox 1.0 QGCComboBox.qml MainToolBar 1.0 MainToolBar.qml
QGCColoredImage 1.0 QGCColoredImage.qml MissionItemEditor 1.0 MissionItemEditor.qml
QGCToolBarButton 1.0 QGCToolBarButton.qml MissionItemIndexLabel 1.0 MissionItemIndexLabel.qml
QGCMovableItem 1.0 QGCMovableItem.qml ModeSwitchDisplay 1.0 ModeSwitchDisplay.qml
SubMenuButton 1.0 SubMenuButton.qml
IndicatorButton 1.0 IndicatorButton.qml
DropButton 1.0 DropButton.qml
RoundButton 1.0 RoundButton.qml
VehicleRotationCal 1.0 VehicleRotationCal.qml
VehicleSummaryRow 1.0 VehicleSummaryRow.qml
ViewWidget 1.0 ViewWidget.qml
ExclusiveGroupItem 1.0 ExclusiveGroupItem.qml
ParameterEditor 1.0 ParameterEditor.qml ParameterEditor 1.0 ParameterEditor.qml
ParameterEditorDialog 1.0 ParameterEditorDialog.qml ParameterEditorDialog 1.0 ParameterEditorDialog.qml
QGCButton 1.0 QGCButton.qml
ModeSwitchDisplay 1.0 ModeSwitchDisplay.qml QGCCheckBox 1.0 QGCCheckBox.qml
QGCColoredImage 1.0 QGCColoredImage.qml
QGCView 1.0 QGCView.qml QGCComboBox 1.0 QGCComboBox.qml
QGCViewPanel 1.0 QGCViewPanel.qml QGCLabel 1.0 QGCLabel.qml
QGCViewDialog 1.0 QGCViewDialog.qml QGCMovableItem 1.0 QGCMovableItem.qml
QGCViewMessage 1.0 QGCViewMessage.qml QGCRadioButton 1.0 QGCRadioButton.qml
QGCTextField 1.0 QGCTextField.qml
MissionItemIndexLabel 1.0 MissionItemIndexLabel.qml QGCToolBarButton 1.0 QGCToolBarButton.qml
MissionItemEditor 1.0 MissionItemEditor.qml QGCView 1.0 QGCView.qml
QGCViewDialog 1.0 QGCViewDialog.qml
MainToolBar 1.0 MainToolBar.qml QGCViewMessage 1.0 QGCViewMessage.qml
SignalStrength 1.0 SignalStrength.qml QGCViewPanel 1.0 QGCViewPanel.qml
RoundButton 1.0 RoundButton.qml
ClickableColor 1.0 ClickableColor.qml SignalStrength 1.0 SignalStrength.qml
SubMenuButton 1.0 SubMenuButton.qml
VehicleRotationCal 1.0 VehicleRotationCal.qml
VehicleSummaryRow 1.0 VehicleSummaryRow.qml
ViewWidget 1.0 ViewWidget.qml
...@@ -1074,3 +1074,8 @@ void Vehicle::_remoteControlRSSIChanged(uint8_t rssi) ...@@ -1074,3 +1074,8 @@ void Vehicle::_remoteControlRSSIChanged(uint8_t rssi)
emit rcRSSIChanged(_rcRSSI); emit rcRSSIChanged(_rcRSSI);
} }
} }
void Vehicle::virtualTabletJoystickValue(double roll, double pitch, double yaw, double thrust)
{
_uas->setExternalControlSetpoint(roll, pitch, yaw, thrust, 0, JoystickModeRC);
}
...@@ -124,13 +124,14 @@ public: ...@@ -124,13 +124,14 @@ public:
// Called when the message drop-down is invoked to clear current count // Called when the message drop-down is invoked to clear current count
Q_INVOKABLE void resetMessages(); Q_INVOKABLE void resetMessages();
Q_INVOKABLE void virtualTabletJoystickValue(double roll, double pitch, double yaw, double thrust);
// Property accessors // Property accessors
QGeoCoordinate coordinate(void) { return _coordinate; } QGeoCoordinate coordinate(void) { return _coordinate; }
bool coordinateValid(void) { return _coordinateValid; } bool coordinateValid(void) { return _coordinateValid; }
QmlObjectListModel* missionItemsModel(void); QmlObjectListModel* missionItemsModel(void);
typedef enum { typedef enum {
JoystickModeRC, ///< Joystick emulates an RC Transmitter JoystickModeRC, ///< Joystick emulates an RC Transmitter
JoystickModeAttitude, JoystickModeAttitude,
......
...@@ -1508,7 +1508,6 @@ void UAS::executeCommand(MAV_CMD command, int confirmation, float param1, float ...@@ -1508,7 +1508,6 @@ void UAS::executeCommand(MAV_CMD command, int confirmation, float param1, float
* Set the manual control commands. * Set the manual control commands.
* This can only be done if the system has manual inputs enabled and is armed. * This can only be done if the system has manual inputs enabled and is armed.
*/ */
#ifndef __mobile__
void UAS::setExternalControlSetpoint(float roll, float pitch, float yaw, float thrust, quint16 buttons, int joystickMode) void UAS::setExternalControlSetpoint(float roll, float pitch, float yaw, float thrust, quint16 buttons, int joystickMode)
{ {
if (!_vehicle) { if (!_vehicle) {
...@@ -1690,7 +1689,6 @@ void UAS::setExternalControlSetpoint(float roll, float pitch, float yaw, float t ...@@ -1690,7 +1689,6 @@ void UAS::setExternalControlSetpoint(float roll, float pitch, float yaw, float t
emit attitudeThrustSetPointChanged(this, roll, pitch, yaw, thrust, QGC::groundTimeMilliseconds()); emit attitudeThrustSetPointChanged(this, roll, pitch, yaw, thrust, QGC::groundTimeMilliseconds());
} }
} }
#endif
#ifndef __mobile__ #ifndef __mobile__
void UAS::setManual6DOFControlCommands(double x, double y, double z, double roll, double pitch, double yaw) void UAS::setManual6DOFControlCommands(double x, double y, double z, double roll, double pitch, double yaw)
......
...@@ -555,9 +555,7 @@ public slots: ...@@ -555,9 +555,7 @@ public slots:
void stopLowBattAlarm(); void stopLowBattAlarm();
/** @brief Set the values for the manual control of the vehicle */ /** @brief Set the values for the manual control of the vehicle */
#ifndef __mobile__
void setExternalControlSetpoint(float roll, float pitch, float yaw, float thrust, quint16 buttons, int joystickMode); void setExternalControlSetpoint(float roll, float pitch, float yaw, float thrust, quint16 buttons, int joystickMode);
#endif
/** @brief Set the values for the 6dof manual control of the vehicle */ /** @brief Set the values for the 6dof manual control of the vehicle */
#ifndef __mobile__ #ifndef __mobile__
......
...@@ -234,10 +234,9 @@ Rectangle { ...@@ -234,10 +234,9 @@ Rectangle {
//----------------------------------------------------------------- //-----------------------------------------------------------------
//-- Virtual joystick settings //-- Virtual joystick settings
QGCCheckBox { QGCCheckBox {
text: "Thumb Joystick (WIP - be careful!)" text: "Virtual Joystick"
checked: QGroundControl.virtualTabletJoystick checked: QGroundControl.virtualTabletJoystick
onClicked: QGroundControl.virtualTabletJoystick = checked onClicked: QGroundControl.virtualTabletJoystick = checked
visible: ScreenTools.isMobile
} }
} }
} }
......
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