Unverified Commit 3a406dea authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #8793 from DonLakeFlyer/CherryPickStableVirtualJoystick

Cherry pick virtual joystick fix from Stable
parents ef9abaa0 7c2028ae
......@@ -16,6 +16,8 @@ Note: This file only contains high level features or important fixes.
## 4.0.7 - Not yet released
* Fix video page sizing
* Virtual Joystick: Fix right stick centering. Fix/add support for rover/sub reverse throttle support.
* Fix display of multiple ADSB vehicles
### 4.0.6 - Stable
......
......@@ -91,18 +91,16 @@ Item {
z: QGroundControl.zOrderTopMost + 1
width: parent.width - (_pipOverlay.width / 2)
height: Math.min(parent.height * 0.25, ScreenTools.defaultFontPixelWidth * 16)
visible: (_virtualJoystick ? _virtualJoystick.value : false) && !(_activeVehicle ? _activeVehicle.highLatencyLink : false)
visible: _virtualJoystickEnabled && !QGroundControl.videoManager.fullScreen && !(activeVehicle ? activeVehicle.highLatencyLink : false)
anchors.bottom: parent.bottom
anchors.bottomMargin: parentToolInsets.leftEdgeBottomInset + ScreenTools.defaultFontPixelHeight * 2
anchors.horizontalCenter: parent.horizontalCenter
source: "qrc:/qml/VirtualJoystick.qml"
active: (_virtualJoystick ? _virtualJoystick.value : false) && !(_activeVehicle ? _activeVehicle.highLatencyLink : false)
active: _virtualJoystickEnabled && !(activeVehicle ? activeVehicle.highLatencyLink : false)
property bool centralizeThrottle: _virtualJoystickCentralized ? _virtualJoystickCentralized.value : false
property var parentToolInsets: _totalToolInsets
property bool autoCenterThrottle: QGroundControl.settingsManager.appSettings.virtualJoystickAutoCenterThrottle.rawValue
property Fact _virtualJoystick: QGroundControl.settingsManager.appSettings.virtualJoystick
property Fact _virtualJoystickCentralized: QGroundControl.settingsManager.appSettings.virtualJoystickCentralized
property bool _virtualJoystickEnabled: QGroundControl.settingsManager.appSettings.virtualJoystick.rawValue
}
FlyViewToolStrip {
......
......@@ -17,7 +17,10 @@ import QGroundControl.Palette 1.0
import QGroundControl.Vehicle 1.0
Item {
//property bool centralizeThrottle - Must be passed in from loader
// The following properties must be passed in from the Loader
// property bool autoCenterThrottle - true: throttle will snap back to center when released
property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle
Timer {
interval: 40 // 25Hz, same as real joystick rate
......@@ -25,7 +28,7 @@ Item {
repeat: true
onTriggered: {
if (activeVehicle) {
activeVehicle.virtualTabletJoystickValue(rightStick.xAxis, rightStick.yAxis, leftStick.xAxis, leftStick.yAxis)
activeVehicle.virtualTabletJoystickValue(rightStick.xAxis, -rightStick.yAxis, leftStick.xAxis, leftStick.yAxis)
}
}
}
......@@ -38,8 +41,8 @@ Item {
anchors.bottom: parent.bottom
width: parent.height
height: parent.height
yAxisThrottle: true
yAxisThrottleCentered: centralizeThrottle
yAxisPositiveRangeOnly: _activeVehicle && !_activeVehicle.rover && !_activeVehicle.sub
yAxisReCenter: autoCenterThrottle
}
JoystickThumbPad {
......
......@@ -8,25 +8,28 @@ import QGroundControl.ScreenTools 1.0
Item {
id: _joyRoot
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 yAxisThrottleCentered: false ///< false: center yAxis in throttle for reverser and forward
property real xPositionDelta: 0 ///< Amount to move the control on x axis
property real yPositionDelta: 0 ///< Amount to move the control on y axis
property bool springYToCenter:true ///< true: Spring Y to center on release
property alias lightColors: mapPal.lightColors ///< true: use light colors from QGCMapPalette for drawing
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 down stick, positive values up stick
property bool yAxisPositiveRangeOnly: false ///< true: value range [0,1], false: value range [-1,1]
property bool yAxisReCenter: true ///< true: snaps back to center on release, false: stays at current position on release
property real xPositionDelta: 0 ///< Amount to move the control on x axis
property real yPositionDelta: 0 ///< Amount to move the control on y axis
property real _centerXY: width / 2
property bool _processTouchPoints: false
property real stickPositionX: _centerXY
property real stickPositionY: yAxisThrottleCentered ? _centerXY : height
property color _fgColor: QGroundControl.globalPalette.text
property color _bgColor: QGroundControl.globalPalette.window
property real stickPositionX: _centerXY
property real stickPositionY: yAxisReCenter ? _centerXY : height
onWidthChanged: calculateXAxis()
onStickPositionXChanged: calculateXAxis()
onHeightChanged: calculateYAxis()
onStickPositionYChanged: calculateYAxis()
QGCMapPalette { id: mapPal }
onWidthChanged: calculateXAxis()
onStickPositionXChanged: calculateXAxis()
onHeightChanged: calculateYAxis()
onStickPositionYChanged: calculateYAxis()
onYAxisPositiveRangeOnlyChanged: calculateYAxis()
function calculateXAxis() {
if(!_joyRoot.visible) {
......@@ -42,13 +45,13 @@ Item {
if(!_joyRoot.visible) {
return;
}
var yAxisTemp = stickPositionY / height
yAxisTemp *= 2.0
yAxisTemp -= 1.0
if (yAxisThrottle) {
yAxisTemp = ((yAxisTemp * -1.0) / 2.0) + 0.5
var fullRange = yAxisPositiveRangeOnly ? 1 : 2
var pctUp = 1.0 - (stickPositionY / height)
var rangeUp = pctUp * fullRange
if (!yAxisPositiveRangeOnly) {
rangeUp -= 1
}
yAxis = yAxisTemp
yAxis = rangeUp
}
function reCenter() {
......@@ -58,9 +61,9 @@ Item {
xPositionDelta = 0
yPositionDelta = 0
// Center sticks
// Re-Center sticks as needed
stickPositionX = _centerXY
if (yAxisThrottleCentered) {
if (yAxisReCenter) {
stickPositionY = _centerXY
}
}
......@@ -68,7 +71,7 @@ Item {
function thumbDown(touchPoints) {
// Position the control around the initial thumb position
xPositionDelta = touchPoints[0].x - _centerXY
if (yAxisThrottle) {
if (yAxisPositiveRangeOnly) {
yPositionDelta = touchPoints[0].y - stickPositionY
} else {
yPositionDelta = touchPoints[0].y - _centerXY
......@@ -118,7 +121,7 @@ Item {
QGCColoredImage {
color: _fgColor
visible: yAxisThrottle
visible: yAxisPositiveRangeOnly
height: ScreenTools.defaultFontPixelHeight
width: height
sourceSize.height: height
......@@ -132,7 +135,7 @@ Item {
QGCColoredImage {
color: _fgColor
visible: yAxisThrottle
visible: yAxisPositiveRangeOnly
height: ScreenTools.defaultFontPixelHeight
width: height
sourceSize.height: height
......@@ -146,7 +149,7 @@ Item {
QGCColoredImage {
color: _fgColor
visible: yAxisThrottle
visible: yAxisPositiveRangeOnly
height: ScreenTools.defaultFontPixelHeight
width: height
sourceSize.height: height
......@@ -160,7 +163,7 @@ Item {
QGCColoredImage {
color: _fgColor
visible: yAxisThrottle
visible: yAxisPositiveRangeOnly
height: ScreenTools.defaultFontPixelHeight
width: height
sourceSize.height: height
......@@ -207,9 +210,6 @@ Item {
maximumTouchPoints: 1
touchPoints: [ TouchPoint { id: touchPoint } ]
onPressed: _joyRoot.thumbDown(touchPoints)
onReleased: {
if(springYToCenter)
_joyRoot.reCenter()
}
onReleased: _joyRoot.reCenter()
}
}
......@@ -115,9 +115,9 @@
"defaultValue": false
},
{
"name": "virtualJoystickCentralized",
"shortDescription": "Set virtual joystick to be centralize throttle (spring-loaded).",
"longDescription": "If this option is enabled the virtual joystick throttle stick will be centralized.",
"name": "virtualJoystickAutoCenterThrottle",
"shortDescription": "Auto-Center Throttle",
"longDescription": "If enabled the throttle stick will snap back to center when released.",
"type": "bool",
"defaultValue": false
},
......
......@@ -39,6 +39,15 @@ DECLARE_SETTINGGROUP(App, "")
qmlRegisterUncreatableType<AppSettings>("QGroundControl.SettingsManager", 1, 0, "AppSettings", "Reference only");
QGCPalette::setGlobalTheme(indoorPalette()->rawValue().toBool() ? QGCPalette::Dark : QGCPalette::Light);
// virtualJoystickCentralized -> virtualJoystickAutoCenterThrottle
QSettings settings;
settings.beginGroup(_settingsGroup);
QString deprecatedVirtualJoystickCentralizedKey("virtualJoystickCentralized");
if (settings.contains(deprecatedVirtualJoystickCentralizedKey)) {
settings.setValue(virtualJoystickAutoCenterThrottleName, settings.value(deprecatedVirtualJoystickCentralizedKey));
settings.remove(deprecatedVirtualJoystickCentralizedKey);
}
// Instantiate savePath so we can check for override and setup default path if needed
SettingsFact* savePathFact = qobject_cast<SettingsFact*>(savePath());
......@@ -85,7 +94,7 @@ DECLARE_SETTINGSFACT(AppSettings, telemetrySaveNotArmed)
DECLARE_SETTINGSFACT(AppSettings, audioMuted)
DECLARE_SETTINGSFACT(AppSettings, checkInternet)
DECLARE_SETTINGSFACT(AppSettings, virtualJoystick)
DECLARE_SETTINGSFACT(AppSettings, virtualJoystickCentralized)
DECLARE_SETTINGSFACT(AppSettings, virtualJoystickAutoCenterThrottle)
DECLARE_SETTINGSFACT(AppSettings, appFontPointSize)
DECLARE_SETTINGSFACT(AppSettings, showLargeCompass)
DECLARE_SETTINGSFACT(AppSettings, savePath)
......
......@@ -39,7 +39,7 @@ public:
DEFINE_SETTINGFACT(audioMuted)
DEFINE_SETTINGFACT(checkInternet)
DEFINE_SETTINGFACT(virtualJoystick)
DEFINE_SETTINGFACT(virtualJoystickCentralized)
DEFINE_SETTINGFACT(virtualJoystickAutoCenterThrottle)
DEFINE_SETTINGFACT(appFontPointSize)
DEFINE_SETTINGFACT(indoorPalette)
DEFINE_SETTINGFACT(showLargeCompass)
......
......@@ -30,11 +30,14 @@ Rectangle {
anchors.fill: parent
anchors.margins: ScreenTools.defaultFontPixelWidth
property Fact _percentRemainingAnnounce: QGroundControl.settingsManager.appSettings.batteryPercentRemainingAnnounce
property Fact _savePath: QGroundControl.settingsManager.appSettings.savePath
property Fact _appFontPointSize: QGroundControl.settingsManager.appSettings.appFontPointSize
property Fact _userBrandImageIndoor: QGroundControl.settingsManager.brandImageSettings.userBrandImageIndoor
property Fact _userBrandImageOutdoor: QGroundControl.settingsManager.brandImageSettings.userBrandImageOutdoor
property Fact _percentRemainingAnnounce: QGroundControl.settingsManager.appSettings.batteryPercentRemainingAnnounce
property Fact _savePath: QGroundControl.settingsManager.appSettings.savePath
property Fact _appFontPointSize: QGroundControl.settingsManager.appSettings.appFontPointSize
property Fact _userBrandImageIndoor: QGroundControl.settingsManager.brandImageSettings.userBrandImageIndoor
property Fact _userBrandImageOutdoor: QGroundControl.settingsManager.brandImageSettings.userBrandImageOutdoor
property Fact _virtualJoystick: QGroundControl.settingsManager.appSettings.virtualJoystick
property Fact _virtualJoystickAutoCenterThrottle: QGroundControl.settingsManager.appSettings.virtualJoystickAutoCenterThrottle
property real _labelWidth: ScreenTools.defaultFontPixelWidth * 20
property real _comboFieldWidth: ScreenTools.defaultFontPixelWidth * 30
property real _valueFieldWidth: ScreenTools.defaultFontPixelWidth * 10
......@@ -512,22 +515,23 @@ Rectangle {
property Fact _showLogReplayStatusBar: QGroundControl.settingsManager.flyViewSettings.showLogReplayStatusBar
}
FactCheckBox {
text: qsTr("Virtual Joystick")
visible: _virtualJoystick.visible
fact: _virtualJoystick
property Fact _virtualJoystick: QGroundControl.settingsManager.appSettings.virtualJoystick
}
RowLayout {
spacing: ScreenTools.defaultFontPixelWidth
FactCheckBox {
text: qsTr("Auto-Center throttle")
visible: _virtualJoystickCentralized.visible && activeVehicle && (activeVehicle.sub || activeVehicle.rover)
fact: _virtualJoystickCentralized
Layout.leftMargin: _margins
FactCheckBox {
text: qsTr("Virtual Joystick")
visible: _virtualJoystick.visible
fact: _virtualJoystick
}
property Fact _virtualJoystickCentralized: QGroundControl.settingsManager.appSettings.virtualJoystickCentralized
FactCheckBox {
text: qsTr("Auto-Center Throttle")
visible: _virtualJoystickAutoCenterThrottle.visible
enabled: _virtualJoystick.rawValue
fact: _virtualJoystickAutoCenterThrottle
}
}
FactCheckBox {
text: qsTr("Use Vertical Instrument Panel")
visible: _alternateInstrumentPanel.visible
......
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