Skip to content

Commit a9f83f1

Browse files
committed
Fix gamepad joystick calibration
Added setting on advanced page for allowing gimbal values in manual control
1 parent e154c8a commit a9f83f1

File tree

5 files changed

+33
-4
lines changed

5 files changed

+33
-4
lines changed

src/Joystick/Joystick.cc

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ void Joystick::_loadSettings()
212212
_circleCorrection = settings.value(_circleCorrectionSettingsKey, false).toBool();
213213
_negativeThrust = settings.value(_negativeThrustSettingsKey, false).toBool();
214214
_throttleMode = static_cast<ThrottleMode_t>(settings.value(_throttleModeSettingsKey, ThrottleModeDownZero).toInt(&convertOk));
215+
_enableManualControlExtensions = settings.value(_manualControlExtensionsEnabledKey, false).toBool();
215216

216217
badSettings |= !convertOk;
217218

@@ -329,6 +330,7 @@ void Joystick::_saveSettings()
329330
settings.setValue(_throttleModeSettingsKey, _throttleMode);
330331
settings.setValue(_negativeThrustSettingsKey, _negativeThrust);
331332
settings.setValue(_circleCorrectionSettingsKey, _circleCorrection);
333+
settings.setValue(_manualControlExtensionsEnabledKey, _enableManualControlExtensions);
332334

333335
qCDebug(JoystickLog) << _name;
334336
qCDebug(JoystickLog) << " calibrated:exponential:accumulator:circlecorrection:negativeThrust:throttlemode:deadband:axisfrequency:buttonfrequency:txmode";
@@ -618,13 +620,13 @@ void Joystick::_handleAxis()
618620
float throttle = _adjustRange(_rgAxisValues[axis], _rgCalibration[axis], (_throttleMode == ThrottleModeDownZero) ? false :_deadband);
619621

620622
float gimbalPitch = NAN;
621-
if (_axisCount > 4) {
623+
if (_enableManualControlExtensions && _axisCount > 4) {
622624
axis = _rgFunctionAxis[gimbalPitchFunction];
623625
gimbalPitch = _adjustRange(_rgAxisValues[axis], _rgCalibration[axis],_deadband);
624626
}
625627

626628
float gimbalYaw = NAN;
627-
if (_axisCount > 5) {
629+
if (_enableManualControlExtensions && _axisCount > 5) {
628630
axis = _rgFunctionAxis[gimbalYawFunction];
629631
gimbalYaw = _adjustRange(_rgAxisValues[axis], _rgCalibration[axis],_deadband);
630632
}
@@ -1263,4 +1265,13 @@ QString Joystick::axisFunctionToString(AxisFunction_t function)
12631265
default:
12641266
return QStringLiteral("Unknown");
12651267
}
1268+
}
1269+
1270+
void Joystick::setEnableManualControlExtensions(bool enable)
1271+
{
1272+
if (_enableManualControlExtensions != enable) {
1273+
_enableManualControlExtensions = enable;
1274+
_saveSettings();
1275+
emit enableManualControlExtensionsChanged();
1276+
}
12661277
}

src/Joystick/Joystick.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class Joystick : public QThread
8282
Q_PROPERTY(QString name READ name CONSTANT)
8383
Q_PROPERTY(QStringList assignableActionTitles READ assignableActionTitles NOTIFY assignableActionsChanged)
8484
Q_PROPERTY(QStringList buttonActions READ buttonActions NOTIFY buttonActionsChanged)
85+
Q_PROPERTY(bool enableManualControlExtensions READ enableManualControlExtensions WRITE setEnableManualControlExtensions NOTIFY enableManualControlExtensionsChanged)
8586

8687
enum ButtonEvent_t {
8788
BUTTON_UP,
@@ -184,6 +185,9 @@ class Joystick : public QThread
184185
/// Set joystick button repeat rate (in Hz)
185186
void setButtonFrequency(float val);
186187

188+
bool enableManualControlExtensions() const { return _enableManualControlExtensions; }
189+
void setEnableManualControlExtensions(bool enable);
190+
187191
signals:
188192
// The raw signals are only meant for use by calibration
189193
void rawAxisValueChanged(int index, int value);
@@ -197,6 +201,7 @@ class Joystick : public QThread
197201
void accumulatorChanged(bool accumulator);
198202
void enabledChanged(bool enabled);
199203
void circleCorrectionChanged(bool circleCorrection);
204+
void enableManualControlExtensionsChanged();
200205
void axisValues(float roll, float pitch, float yaw, float throttle);
201206
void axisFrequencyHzChanged();
202207
void buttonFrequencyHzChanged();
@@ -287,6 +292,7 @@ private slots:
287292
bool _deadband = false;
288293
bool _negativeThrust = false;
289294
bool _pollingStartedForCalibration = false;
295+
bool _enableManualControlExtensions = false;
290296
float _axisFrequencyHz = _defaultAxisFrequencyHz;
291297
float _buttonFrequencyHz = _defaultButtonFrequencyHz;
292298
float _exponential = 0;
@@ -335,6 +341,7 @@ private slots:
335341
static constexpr const char *_roverTXModeSettingsKey = "TXMode_Rover";
336342
static constexpr const char *_vtolTXModeSettingsKey = "TXMode_VTOL";
337343
static constexpr const char *_submarineTXModeSettingsKey = "TXMode_Submarine";
344+
static constexpr const char *_manualControlExtensionsEnabledKey = "ManualControlExtensionsEnabled";
338345

339346
static constexpr const char *_buttonActionNone = QT_TR_NOOP("No Action");
340347
static constexpr const char *_buttonActionArm = QT_TR_NOOP("Arm");

src/Vehicle/VehicleSetup/JoystickConfigAdvanced.qml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@ Item {
8787
text: expoSlider.value.toFixed(2)
8888
}
8989
}
90+
91+
QGCCheckBox {
92+
Layout.columnSpan: 2
93+
text: qsTr("Allow additional axes to be used for manual control extensions")
94+
checked: _activeJoystick ? _activeJoystick.enableManualControlExtensions : false
95+
onClicked: _activeJoystick.enableManualControlExtensions = checked
96+
}
97+
9098
//-----------------------------------------------------------------
9199
//-- Enable Advanced Mode
92100
QGCLabel {

src/Vehicle/VehicleSetup/JoystickConfigController.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,12 @@ void JoystickConfigController::_advanceState()
9494
{
9595
const stateMachineEntry* state = _getStateMachineEntry(++_currentStep);
9696

97+
Joystick* joystick = JoystickManager::instance()->activeJoystick();
98+
int axisCount = joystick->enableManualControlExtensions() ? _axisCount : 4;
99+
97100
// The state machine includes additional states for optional axes. If those
98101
// axes aren't detected, those states should be skipped.
99-
while (state->function >= _axisCount && state->function < Joystick::maxAxisFunction) {
102+
while (state->function >= axisCount && state->function < Joystick::maxAxisFunction) {
100103
state = _getStateMachineEntry(++_currentStep);
101104
}
102105

src/Vehicle/VehicleSetup/JoystickConfigController.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ private slots:
241241
static constexpr int _calValidMaxValue = 32767; ///< Smallest valid maximum axis value
242242
static constexpr int _calDefaultMinValue = -32768; ///< Default value for Min if not set
243243
static constexpr int _calDefaultMaxValue = 32767; ///< Default value for Max if not set
244-
static constexpr int _calRoughCenterDelta = 500; ///< Delta around center point which is considered to be roughly centered
244+
static constexpr int _calRoughCenterDelta = 700; ///< Delta around center point which is considered to be roughly centered (Note: PS5 controller has very noisy center, hence 700)
245245
static constexpr int _calMoveDelta = 32768/2; ///< Amount of delta past center which is considered stick movement
246246
static constexpr int _calSettleDelta = 600; ///< Amount of delta which is considered no stick movement
247247
static constexpr int _calMinDelta = 1000; ///< Amount of delta allowed around min value to consider channel at min

0 commit comments

Comments
 (0)