diff --git a/src/Joystick/Joystick.cc b/src/Joystick/Joystick.cc index ceb016638143a0566fe7e9088ef47aa9a36260a7..4f70fd37051ab4c5dfc66fde3d96c31bf9711b6b 100644 --- a/src/Joystick/Joystick.cc +++ b/src/Joystick/Joystick.cc @@ -77,6 +77,13 @@ const char* Joystick::_rgFunctionSettingsKey[Joystick::maxFunction] = { int Joystick::_transmitterMode = 2; +const float Joystick::_defaultAxisFrequencyHz = 25.0f; +const float Joystick::_defaultButtonFrequencyHz = 5.0f; +const float Joystick::_minAxisFrequencyHz = 0.25f; +const float Joystick::_maxAxisFrequencyHz = 200.0f; +const float Joystick::_minButtonFrequencyHz = 0.25f; +const float Joystick::_maxButtonFrequencyHz = 50.0f; + AssignedButtonAction::AssignedButtonAction(QObject* parent, const QString name) : QObject(parent) , action(name) @@ -156,14 +163,14 @@ void Joystick::_setDefaultCalibration(void) { _rgFunctionAxis[gimbalPitchFunction]= 4; _rgFunctionAxis[gimbalYawFunction] = 5; - _exponential = 0; - _accumulator = false; - _deadband = false; - _axisFrequency = 25.0f; - _buttonFrequency= 5.0f; - _throttleMode = ThrottleModeDownZero; - _calibrated = true; - _circleCorrection = false; + _exponential = 0; + _accumulator = false; + _deadband = false; + _axisFrequencyHz = _defaultAxisFrequencyHz; + _buttonFrequencyHz = _defaultButtonFrequencyHz; + _throttleMode = ThrottleModeDownZero; + _calibrated = true; + _circleCorrection = false; _saveSettings(); } @@ -218,14 +225,14 @@ void Joystick::_loadSettings() qCDebug(JoystickLog) << "_loadSettings " << _name; - _calibrated = settings.value(_calibratedSettingsKey, false).toBool(); - _exponential = settings.value(_exponentialSettingsKey, 0).toFloat(); - _accumulator = settings.value(_accumulatorSettingsKey, false).toBool(); - _deadband = settings.value(_deadbandSettingsKey, false).toBool(); - _axisFrequency = settings.value(_axisFrequencySettingsKey, 25.0f).toFloat(); - _buttonFrequency= settings.value(_buttonFrequencySettingsKey, 5.0f).toFloat(); - _circleCorrection = settings.value(_circleCorrectionSettingsKey, false).toBool(); - _gimbalEnabled = settings.value(_gimbalSettingsKey, false).toBool(); + _calibrated = settings.value(_calibratedSettingsKey, false).toBool(); + _exponential = settings.value(_exponentialSettingsKey, 0).toFloat(); + _accumulator = settings.value(_accumulatorSettingsKey, false).toBool(); + _deadband = settings.value(_deadbandSettingsKey, false).toBool(); + _axisFrequencyHz = settings.value(_axisFrequencySettingsKey, _defaultAxisFrequencyHz).toFloat(); + _buttonFrequencyHz = settings.value(_buttonFrequencySettingsKey, _defaultButtonFrequencyHz).toFloat(); + _circleCorrection = settings.value(_circleCorrectionSettingsKey, false).toBool(); + _gimbalEnabled = settings.value(_gimbalSettingsKey, false).toBool(); _throttleMode = static_cast(settings.value(_throttleModeSettingsKey, ThrottleModeDownZero).toInt(&convertOk)); badSettings |= !convertOk; @@ -326,8 +333,8 @@ void Joystick::_saveSettings() settings.setValue(_exponentialSettingsKey, _exponential); settings.setValue(_accumulatorSettingsKey, _accumulator); settings.setValue(_deadbandSettingsKey, _deadband); - settings.setValue(_axisFrequencySettingsKey, _axisFrequency); - settings.setValue(_buttonFrequencySettingsKey, _buttonFrequency); + settings.setValue(_axisFrequencySettingsKey, _axisFrequencyHz); + settings.setValue(_buttonFrequencySettingsKey, _buttonFrequencyHz); settings.setValue(_throttleModeSettingsKey, _throttleMode); settings.setValue(_gimbalSettingsKey, _gimbalEnabled); settings.setValue(_circleCorrectionSettingsKey, _circleCorrection); @@ -470,7 +477,7 @@ void Joystick::run() _update(); _handleButtons(); _handleAxis(); - QGC::SLEEP::msleep(20); + QGC::SLEEP::msleep(qMin(static_cast(1000.0f / _maxAxisFrequencyHz), static_cast(1000.0f / _maxButtonFrequencyHz)) / 2); } _close(); } @@ -544,7 +551,7 @@ void Joystick::_handleButtons() } } else { //-- Process repeat buttons - int buttonDelay = static_cast(1000.0f / _buttonFrequency); + int buttonDelay = static_cast(1000.0f / _buttonFrequencyHz); if(_buttonActionArray[buttonIndex]->buttonTime.elapsed() > buttonDelay) { _buttonActionArray[buttonIndex]->buttonTime.start(); qCDebug(JoystickLog) << "Repeat button triggered" << buttonIndex << buttonAction; @@ -574,7 +581,7 @@ void Joystick::_handleButtons() void Joystick::_handleAxis() { //-- Get frequency - int axisDelay = static_cast(1000.0f / _axisFrequency); + int axisDelay = static_cast(1000.0f / _axisFrequencyHz); //-- Check elapsed time since last run if(_axisTime.elapsed() > axisDelay) { _axisTime.start(); @@ -938,21 +945,21 @@ void Joystick::setGimbalEnabled(bool set) void Joystick::setAxisFrequency(float val) { //-- Arbitrary limits - if(val < 0.25f) val = 0.25f; - if(val > 50.0f) val = 50.0f; - _axisFrequency = val; + val = qMin(_minAxisFrequencyHz, val); + val = qMax(_maxAxisFrequencyHz, val); + _axisFrequencyHz = val; _saveSettings(); - emit axisFrequencyChanged(); + emit axisFrequencyHzChanged(); } void Joystick::setButtonFrequency(float val) { //-- Arbitrary limits - if(val < 0.25f) val = 0.25f; - if(val > 50.0f) val = 50.0f; - _buttonFrequency = val; + val = qMin(_minButtonFrequencyHz, val); + val = qMax(_maxButtonFrequencyHz, val); + _buttonFrequencyHz = val; _saveSettings(); - emit buttonFrequencyChanged(); + emit buttonFrequencyHzChanged(); } void Joystick::setCalibrationMode(bool calibrating) diff --git a/src/Joystick/Joystick.h b/src/Joystick/Joystick.h index c02f475915b46dfef74027073834a9e8de0c1bb5..fa18cf5e585e5ec4d649a5ed00e37aaa4c037990 100644 --- a/src/Joystick/Joystick.h +++ b/src/Joystick/Joystick.h @@ -101,8 +101,12 @@ public: Q_PROPERTY(bool gimbalEnabled READ gimbalEnabled WRITE setGimbalEnabled NOTIFY gimbalEnabledChanged) Q_PROPERTY(int throttleMode READ throttleMode WRITE setThrottleMode NOTIFY throttleModeChanged) - Q_PROPERTY(float axisFrequency READ axisFrequency WRITE setAxisFrequency NOTIFY axisFrequencyChanged) - Q_PROPERTY(float buttonFrequency READ buttonFrequency WRITE setButtonFrequency NOTIFY buttonFrequencyChanged) + Q_PROPERTY(float axisFrequencyHz READ axisFrequencyHz WRITE setAxisFrequency NOTIFY axisFrequencyHzChanged) + Q_PROPERTY(float minAxisFrequencyHz MEMBER _minAxisFrequencyHz CONSTANT) + Q_PROPERTY(float maxAxisFrequencyHz MEMBER _minAxisFrequencyHz CONSTANT) + Q_PROPERTY(float buttonFrequencyHz READ buttonFrequencyHz WRITE setButtonFrequency NOTIFY buttonFrequencyHzChanged) + Q_PROPERTY(float minButtonFrequencyHz MEMBER _minButtonFrequencyHz CONSTANT) + Q_PROPERTY(float maxButtonFrequencyHz MEMBER _maxButtonFrequencyHz CONSTANT) Q_PROPERTY(bool negativeThrust READ negativeThrust WRITE setNegativeThrust NOTIFY negativeThrustChanged) Q_PROPERTY(float exponential READ exponential WRITE setExponential NOTIFY exponentialChanged) Q_PROPERTY(bool accumulator READ accumulator WRITE setAccumulator NOTIFY accumulatorChanged) @@ -171,12 +175,12 @@ public: void setCalibrationMode (bool calibrating); /// Get joystick message rate (in Hz) - float axisFrequency () { return _axisFrequency; } + float axisFrequencyHz () { return _axisFrequencyHz; } /// Set joystick message rate (in Hz) void setAxisFrequency (float val); /// Get joystick button repeat rate (in Hz) - float buttonFrequency () { return _buttonFrequency; } + float buttonFrequencyHz () { return _buttonFrequencyHz; } /// Set joystick button repeat rate (in Hz) void setButtonFrequency(float val); @@ -197,8 +201,8 @@ signals: void manualControlGimbal (float gimbalPitch, float gimbalYaw); void gimbalEnabledChanged (); - void axisFrequencyChanged (); - void buttonFrequencyChanged (); + void axisFrequencyHzChanged (); + void buttonFrequencyHzChanged (); void startContinuousZoom (int direction); void stopContinuousZoom (); void stepZoom (int direction); @@ -260,6 +264,9 @@ protected: BUTTON_REPEAT }; + static const float _defaultAxisFrequencyHz; + static const float _defaultButtonFrequencyHz; + uint8_t*_rgButtonValues = nullptr; bool _exitThread = false; ///< true: signal thread to exit @@ -272,8 +279,8 @@ protected: bool _accumulator = false; bool _deadband = false; bool _circleCorrection = true; - float _axisFrequency = 25.0f; - float _buttonFrequency = 5.0f; + float _axisFrequencyHz = _defaultAxisFrequencyHz; + float _buttonFrequencyHz = _defaultButtonFrequencyHz; Vehicle* _activeVehicle = nullptr; bool _gimbalEnabled = false; @@ -296,6 +303,10 @@ protected: QStringList _availableActionTitles; MultiVehicleManager* _multiVehicleManager = nullptr; + static const float _minAxisFrequencyHz; + static const float _maxAxisFrequencyHz; + static const float _minButtonFrequencyHz; + static const float _maxButtonFrequencyHz; private: static const char* _rgFunctionSettingsKey[maxFunction]; diff --git a/src/VehicleSetup/JoystickConfigAdvanced.qml b/src/VehicleSetup/JoystickConfigAdvanced.qml index 68930b07f8aa5d24d365a75536343ed3c53206fb..a0e86d97802e5bf3ad82be7221e1a86b7969e318 100644 --- a/src/VehicleSetup/JoystickConfigAdvanced.qml +++ b/src/VehicleSetup/JoystickConfigAdvanced.qml @@ -135,13 +135,13 @@ Item { visible: advancedSettings.checked } QGCTextField { - text: _activeJoystick.axisFrequency + text: _activeJoystick.axisFrequencyHz enabled: advancedSettings.checked - validator: DoubleValidator { bottom: 0.25; top: 50.0; } + validator: DoubleValidator { bottom: _activeJoystick.minAxisFrequencyHz; top: _activeJoystick.maxAxisFrequencyHz; } inputMethodHints: Qt.ImhFormattedNumbersOnly Layout.alignment: Qt.AlignVCenter onEditingFinished: { - _activeJoystick.axisFrequency = parseFloat(text) + _activeJoystick.axisFrequencyHz = parseFloat(text) } visible: advancedSettings.checked } @@ -153,13 +153,13 @@ Item { visible: advancedSettings.checked } QGCTextField { - text: _activeJoystick.buttonFrequency + text: _activeJoystick.buttonFrequencyHz enabled: advancedSettings.checked - validator: DoubleValidator { bottom: 0.25; top: 50.0; } + validator: DoubleValidator { bottom: _activeJoystick.minButtonFrequencyHz; top: _activeJoystick.maxButtonFrequencyHz; } inputMethodHints: Qt.ImhFormattedNumbersOnly Layout.alignment: Qt.AlignVCenter onEditingFinished: { - _activeJoystick.buttonFrequency = parseFloat(text) + _activeJoystick.buttonFrequencyHz = parseFloat(text) } visible: advancedSettings.checked }