Browse Source

Support custom builds with joysticks which are buttons only

For example a Herelink controller custom build will use this.
QGC4.4
Don Gagne 2 years ago committed by Don Gagne
parent
commit
48d1441493
  1. 14
      src/Joystick/Joystick.cc
  2. 5
      src/Joystick/Joystick.h
  3. 12
      src/VehicleSetup/JoystickConfig.qml
  4. 2
      src/VehicleSetup/SetupView.qml
  5. 4
      src/api/QGCOptions.h

14
src/Joystick/Joystick.cc

@ -16,6 +16,8 @@ @@ -16,6 +16,8 @@
#include "VideoManager.h"
#include "QGCCameraManager.h"
#include "QGCCameraControl.h"
#include "QGCCorePlugin.h"
#include "QGCOptions.h"
#include <QSettings>
@ -108,6 +110,8 @@ Joystick::Joystick(const QString& name, int axisCount, int buttonCount, int hatC @@ -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<GRIPPER_ACTIONS>();
_rgAxisValues = new int[static_cast<size_t>(_axisCount)];
@ -713,10 +717,9 @@ void Joystick::startPolling(Vehicle* vehicle) @@ -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) @@ -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) @@ -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) {

5
src/Joystick/Joystick.h

@ -94,6 +94,10 @@ public: @@ -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: @@ -275,6 +279,7 @@ protected:
std::atomic<bool> _exitThread{false}; ///< true: signal thread to exit
bool _calibrationMode = false;
bool _useButtonsOnly = false;
int* _rgAxisValues = nullptr;
Calibration_t* _rgCalibration = nullptr;
ThrottleMode_t _throttleMode = ThrottleModeDownZero;

12
src/VehicleSetup/JoystickConfig.qml

@ -62,20 +62,30 @@ SetupPage { @@ -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
}
}

2
src/VehicleSetup/SetupView.qml

@ -260,7 +260,7 @@ Rectangle { @@ -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")

4
src/api/QGCOptions.h

@ -146,6 +146,10 @@ public: @@ -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);

Loading…
Cancel
Save