From 48d1441493b3c193bbd2c5fc63c650bf2ae51e48 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Mon, 7 Aug 2023 12:30:43 -0700 Subject: [PATCH] Support custom builds with joysticks which are buttons only For example a Herelink controller custom build will use this. --- src/Joystick/Joystick.cc | 14 +++++++++----- src/Joystick/Joystick.h | 5 +++++ src/VehicleSetup/JoystickConfig.qml | 12 +++++++++++- src/VehicleSetup/SetupView.qml | 2 +- src/api/QGCOptions.h | 4 ++++ 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/Joystick/Joystick.cc b/src/Joystick/Joystick.cc index 767d208..670cc77 100644 --- a/src/Joystick/Joystick.cc +++ b/src/Joystick/Joystick.cc @@ -16,6 +16,8 @@ #include "VideoManager.h" #include "QGCCameraManager.h" #include "QGCCameraControl.h" +#include "QGCCorePlugin.h" +#include "QGCOptions.h" #include @@ -108,6 +110,8 @@ Joystick::Joystick(const QString& name, int axisCount, int buttonCount, int hatC , _totalButtonCount(_buttonCount+_hatButtonCount) , _multiVehicleManager(multiVehicleManager) { + _useButtonsOnly = qgcApp()->toolbox()->corePlugin()->options()->joystickUseButtonsOnly(); + qRegisterMetaType(); _rgAxisValues = new int[static_cast(_axisCount)]; @@ -713,10 +717,9 @@ void Joystick::startPolling(Vehicle* vehicle) } // Update qml in case of joystick transition emit calibratedChanged(_calibrated); - // Build action list _buildActionList(vehicle); - // Only connect the new vehicle if it wants joystick data - if (vehicle->joystickEnabled()) { + + if (vehicle->joystickEnabled() || _useButtonsOnly) { _pollingStartedForCalibration = false; connect(this, &Joystick::setArmed, _activeVehicle, &Vehicle::setArmedShowError); connect(this, &Joystick::setVtolInFwdFlight, _activeVehicle, &Vehicle::setVtolInFwdFlight); @@ -738,7 +741,7 @@ void Joystick::startPolling(Vehicle* vehicle) void Joystick::stopPolling(void) { if (isRunning()) { - if (_activeVehicle && _activeVehicle->joystickEnabled()) { + if (_activeVehicle && (_activeVehicle->joystickEnabled() || _useButtonsOnly)) { disconnect(this, &Joystick::setArmed, _activeVehicle, &Vehicle::setArmedShowError); disconnect(this, &Joystick::setVtolInFwdFlight, _activeVehicle, &Vehicle::setVtolInFwdFlight); disconnect(this, &Joystick::setFlightMode, _activeVehicle, &Vehicle::setFlightMode); @@ -985,9 +988,10 @@ void Joystick::setCalibrationMode(bool calibrating) void Joystick::_executeButtonAction(const QString& action, bool buttonDown) { - if (!_activeVehicle || !_activeVehicle->joystickEnabled() || action == _buttonActionNone) { + if (!_activeVehicle || (!_activeVehicle->joystickEnabled() && !_useButtonsOnly) || action == _buttonActionNone) { return; } + if (action == _buttonActionArm) { if (buttonDown) emit setArmed(true); } else if (action == _buttonActionDisarm) { diff --git a/src/Joystick/Joystick.h b/src/Joystick/Joystick.h index fcdc5bf..7da3511 100644 --- a/src/Joystick/Joystick.h +++ b/src/Joystick/Joystick.h @@ -94,6 +94,10 @@ public: Q_PROPERTY(int axisCount READ axisCount CONSTANT) Q_PROPERTY(bool requiresCalibration READ requiresCalibration CONSTANT) + // This property is used to indicate a joystick setup where the stick axes are ignored and only the + // buttons are supported. This type of setup is used by a Herelink controller for example. + Q_PROPERTY(bool useButtonsOnly MEMBER _useButtonsOnly CONSTANT) + //-- Actions assigned to buttons Q_PROPERTY(QStringList buttonActions READ buttonActions NOTIFY buttonActionsChanged) @@ -275,6 +279,7 @@ protected: std::atomic _exitThread{false}; ///< true: signal thread to exit bool _calibrationMode = false; + bool _useButtonsOnly = false; int* _rgAxisValues = nullptr; Calibration_t* _rgCalibration = nullptr; ThrottleMode_t _throttleMode = ThrottleModeDownZero; diff --git a/src/VehicleSetup/JoystickConfig.qml b/src/VehicleSetup/JoystickConfig.qml index 3ba6e90..2c744ab 100644 --- a/src/VehicleSetup/JoystickConfig.qml +++ b/src/VehicleSetup/JoystickConfig.qml @@ -62,20 +62,30 @@ SetupPage { id: bar width: parent.width Component.onCompleted: { - currentIndex = _activeJoystick && _activeJoystick.calibrated ? 0 : 2 + currentIndex = 0 + if (_activeJoystick) { + if (_activeJoystick.useButtonsOnly) { + currentIndex = 1 + } else if (_activeJoystick.calibrated) { + currentIndex = 2 + } + } } anchors.top: parent.top QGCTabButton { text: qsTr("General") + visible: !_activeJoystick.useButtonsOnly } QGCTabButton { text: qsTr("Button Assigment") } QGCTabButton { text: qsTr("Calibration") + visible: !_activeJoystick.useButtonsOnly } QGCTabButton { text: qsTr("Advanced") + visible: !_activeJoystick.useButtonsOnly } } diff --git a/src/VehicleSetup/SetupView.qml b/src/VehicleSetup/SetupView.qml index 70946d1..012aebd 100644 --- a/src/VehicleSetup/SetupView.qml +++ b/src/VehicleSetup/SetupView.qml @@ -260,7 +260,7 @@ Rectangle { id: joystickButton imageResource: "/qmlimages/Joystick.png" setupIndicator: true - setupComplete: joystickManager.activeJoystick ? joystickManager.activeJoystick.calibrated : false + setupComplete: joystickManager.activeJoystick ? (joystickManager.activeJoystick.calibrated || joystickManager.activeJoystick.useButtonsOnly) : false exclusiveGroup: setupButtonGroup visible: _fullParameterVehicleAvailable && joystickManager.joysticks.length !== 0 text: qsTr("Joystick") diff --git a/src/api/QGCOptions.h b/src/api/QGCOptions.h index 43f0116..e796dbf 100644 --- a/src/api/QGCOptions.h +++ b/src/api/QGCOptions.h @@ -146,6 +146,10 @@ public: virtual QGCFlyViewOptions* flyViewOptions (); + // This is used to indicate a joystick setup where the stick axes are ignored and only the + // buttons are supported. This type of setup is used by a Herelink controller for example. + virtual bool joystickUseButtonsOnly() const { return false; } + signals: void showSensorCalibrationCompassChanged (bool show); void showSensorCalibrationGyroChanged (bool show);