diff --git a/ChangeLog.md b/ChangeLog.md index 293fe0e55a2d8e90d39ac63600289058663998e3..004837b7952f16cd2fc8d42aa8cc08dbd6766429 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -16,6 +16,7 @@ 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 diff --git a/src/FlightDisplay/FlyViewWidgetLayer.qml b/src/FlightDisplay/FlyViewWidgetLayer.qml index b5ef792773aed09be4166d2424aa7996eb3d8d08..f022560a4ec78cd0c0796541d33a9013c6b4202c 100644 --- a/src/FlightDisplay/FlyViewWidgetLayer.qml +++ b/src/FlightDisplay/FlyViewWidgetLayer.qml @@ -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 { diff --git a/src/FlightDisplay/VirtualJoystick.qml b/src/FlightDisplay/VirtualJoystick.qml index 3defd165fdd26054d2b6532c60ff4cbde037cb33..5be34717a35b92bdef19f68c4302c321ad0fcdd8 100644 --- a/src/FlightDisplay/VirtualJoystick.qml +++ b/src/FlightDisplay/VirtualJoystick.qml @@ -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 { diff --git a/src/QmlControls/JoystickThumbPad.qml b/src/QmlControls/JoystickThumbPad.qml index 18842d38b01f8d13578941561aa00b210f8c55ed..cbf8d01a31f85c0ee81d5c1082efe9667b75f594 100644 --- a/src/QmlControls/JoystickThumbPad.qml +++ b/src/QmlControls/JoystickThumbPad.qml @@ -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() } } diff --git a/src/Settings/App.SettingsGroup.json b/src/Settings/App.SettingsGroup.json index 3fc6fc5789a45c826d1ea7d4befc731c223579c4..bf33c02d76b0f14174e80a6f3936845a75fb24ad 100644 --- a/src/Settings/App.SettingsGroup.json +++ b/src/Settings/App.SettingsGroup.json @@ -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 }, diff --git a/src/Settings/AppSettings.cc b/src/Settings/AppSettings.cc index 5d898229af5afada7feeff1ed51218de979b01de..5d090049c48f1ed4a0568f3ece4628ae7d16ed59 100644 --- a/src/Settings/AppSettings.cc +++ b/src/Settings/AppSettings.cc @@ -39,6 +39,15 @@ DECLARE_SETTINGGROUP(App, "") qmlRegisterUncreatableType("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(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) diff --git a/src/Settings/AppSettings.h b/src/Settings/AppSettings.h index db5f0f9fc80324296e5156eba9f1820aa1c19607..d1b3b68f669f7faf711face1d81ba5c0c4f07030 100644 --- a/src/Settings/AppSettings.h +++ b/src/Settings/AppSettings.h @@ -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) diff --git a/src/ui/preferences/GeneralSettings.qml b/src/ui/preferences/GeneralSettings.qml index 0ace1bfbd01e2b4e32d46efd31ddf5ee9fcba9af..dd9bbac4a30b6328e8466ba520a7179b0547c01b 100644 --- a/src/ui/preferences/GeneralSettings.qml +++ b/src/ui/preferences/GeneralSettings.qml @@ -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