diff --git a/qgcresources.qrc b/qgcresources.qrc index bb2e8de56e9bb68f58dff8210b118d7c18d0a608..1c4005bf185cac761272406d8b323f9f53ce4f22 100644 --- a/qgcresources.qrc +++ b/qgcresources.qrc @@ -254,17 +254,6 @@ resources/calibration/mode2/radioThrottleDown.png resources/calibration/mode2/radioSwitchMinMax.png - - resources/calibration/joystick/joystickCenter.png - resources/calibration/joystick/joystickRollLeft.png - resources/calibration/joystick/joystickRollRight.png - resources/calibration/joystick/joystickPitchUp.png - resources/calibration/joystick/joystickPitchDown.png - resources/calibration/joystick/joystickYawLeft.png - resources/calibration/joystick/joystickYawRight.png - resources/calibration/joystick/joystickThrottleUp.png - resources/calibration/joystick/joystickThrottleDown.png - resources/SDL_GameControllerDB/gamecontrollerdb.txt @@ -278,4 +267,48 @@ resources/opengl/buglist.json + + resources/calibration/joystick/mode1/joystickCenter.png + resources/calibration/joystick/mode1/joystickPitchDown.png + resources/calibration/joystick/mode1/joystickPitchUp.png + resources/calibration/joystick/mode1/joystickRollLeft.png + resources/calibration/joystick/mode1/joystickRollRight.png + resources/calibration/joystick/mode1/joystickThrottleDown.png + resources/calibration/joystick/mode1/joystickThrottleUp.png + resources/calibration/joystick/mode1/joystickYawLeft.png + resources/calibration/joystick/mode1/joystickYawRight.png + + + resources/calibration/joystick/mode2/joystickCenter.png + resources/calibration/joystick/mode2/joystickPitchDown.png + resources/calibration/joystick/mode2/joystickPitchUp.png + resources/calibration/joystick/mode2/joystickRollLeft.png + resources/calibration/joystick/mode2/joystickRollRight.png + resources/calibration/joystick/mode2/joystickThrottleDown.png + resources/calibration/joystick/mode2/joystickThrottleUp.png + resources/calibration/joystick/mode2/joystickYawLeft.png + resources/calibration/joystick/mode2/joystickYawRight.png + + + resources/calibration/joystick/mode3/joystickCenter.png + resources/calibration/joystick/mode3/joystickPitchDown.png + resources/calibration/joystick/mode3/joystickPitchUp.png + resources/calibration/joystick/mode3/joystickRollLeft.png + resources/calibration/joystick/mode3/joystickRollRight.png + resources/calibration/joystick/mode3/joystickThrottleDown.png + resources/calibration/joystick/mode3/joystickThrottleUp.png + resources/calibration/joystick/mode3/joystickYawLeft.png + resources/calibration/joystick/mode3/joystickYawRight.png + + + resources/calibration/joystick/mode4/joystickCenter.png + resources/calibration/joystick/mode4/joystickPitchDown.png + resources/calibration/joystick/mode4/joystickPitchUp.png + resources/calibration/joystick/mode4/joystickRollLeft.png + resources/calibration/joystick/mode4/joystickRollRight.png + resources/calibration/joystick/mode4/joystickThrottleDown.png + resources/calibration/joystick/mode4/joystickThrottleUp.png + resources/calibration/joystick/mode4/joystickYawLeft.png + resources/calibration/joystick/mode4/joystickYawRight.png + diff --git a/resources/calibration/joystick/joystickCenter.png b/resources/calibration/joystick/mode1/joystickCenter.png similarity index 100% rename from resources/calibration/joystick/joystickCenter.png rename to resources/calibration/joystick/mode1/joystickCenter.png diff --git a/resources/calibration/joystick/joystickThrottleDown.png b/resources/calibration/joystick/mode1/joystickPitchDown.png similarity index 100% rename from resources/calibration/joystick/joystickThrottleDown.png rename to resources/calibration/joystick/mode1/joystickPitchDown.png diff --git a/resources/calibration/joystick/joystickThrottleUp.png b/resources/calibration/joystick/mode1/joystickPitchUp.png similarity index 100% rename from resources/calibration/joystick/joystickThrottleUp.png rename to resources/calibration/joystick/mode1/joystickPitchUp.png diff --git a/resources/calibration/joystick/joystickRollLeft.png b/resources/calibration/joystick/mode1/joystickRollLeft.png similarity index 100% rename from resources/calibration/joystick/joystickRollLeft.png rename to resources/calibration/joystick/mode1/joystickRollLeft.png diff --git a/resources/calibration/joystick/joystickRollRight.png b/resources/calibration/joystick/mode1/joystickRollRight.png similarity index 100% rename from resources/calibration/joystick/joystickRollRight.png rename to resources/calibration/joystick/mode1/joystickRollRight.png diff --git a/resources/calibration/joystick/joystickPitchDown.png b/resources/calibration/joystick/mode1/joystickThrottleDown.png similarity index 100% rename from resources/calibration/joystick/joystickPitchDown.png rename to resources/calibration/joystick/mode1/joystickThrottleDown.png diff --git a/resources/calibration/joystick/joystickPitchUp.png b/resources/calibration/joystick/mode1/joystickThrottleUp.png similarity index 100% rename from resources/calibration/joystick/joystickPitchUp.png rename to resources/calibration/joystick/mode1/joystickThrottleUp.png diff --git a/resources/calibration/joystick/joystickYawLeft.png b/resources/calibration/joystick/mode1/joystickYawLeft.png similarity index 100% rename from resources/calibration/joystick/joystickYawLeft.png rename to resources/calibration/joystick/mode1/joystickYawLeft.png diff --git a/resources/calibration/joystick/joystickYawRight.png b/resources/calibration/joystick/mode1/joystickYawRight.png similarity index 100% rename from resources/calibration/joystick/joystickYawRight.png rename to resources/calibration/joystick/mode1/joystickYawRight.png diff --git a/resources/calibration/joystick/mode2/joystickCenter.png b/resources/calibration/joystick/mode2/joystickCenter.png new file mode 100644 index 0000000000000000000000000000000000000000..556321ec4b1c3142dc40acaf8068b4fb57e923a5 Binary files /dev/null and b/resources/calibration/joystick/mode2/joystickCenter.png differ diff --git a/resources/calibration/joystick/mode2/joystickPitchDown.png b/resources/calibration/joystick/mode2/joystickPitchDown.png new file mode 100644 index 0000000000000000000000000000000000000000..6e895b1a5a50dac35d977dd496a830cd26b1a5d8 Binary files /dev/null and b/resources/calibration/joystick/mode2/joystickPitchDown.png differ diff --git a/resources/calibration/joystick/mode2/joystickPitchUp.png b/resources/calibration/joystick/mode2/joystickPitchUp.png new file mode 100644 index 0000000000000000000000000000000000000000..ad9d7c03fa5dc49d5889eedf2551f900381c11fc Binary files /dev/null and b/resources/calibration/joystick/mode2/joystickPitchUp.png differ diff --git a/resources/calibration/joystick/mode2/joystickRollLeft.png b/resources/calibration/joystick/mode2/joystickRollLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..fddc7dfb4217051af0ca1b51897f82ef7cd2c810 Binary files /dev/null and b/resources/calibration/joystick/mode2/joystickRollLeft.png differ diff --git a/resources/calibration/joystick/mode2/joystickRollRight.png b/resources/calibration/joystick/mode2/joystickRollRight.png new file mode 100644 index 0000000000000000000000000000000000000000..9556eed1e7e62df8c0ffe5e0206ad03db6c6f943 Binary files /dev/null and b/resources/calibration/joystick/mode2/joystickRollRight.png differ diff --git a/resources/calibration/joystick/mode2/joystickThrottleDown.png b/resources/calibration/joystick/mode2/joystickThrottleDown.png new file mode 100644 index 0000000000000000000000000000000000000000..7436477b0acd29f42758d77df5978cb955785d6a Binary files /dev/null and b/resources/calibration/joystick/mode2/joystickThrottleDown.png differ diff --git a/resources/calibration/joystick/mode2/joystickThrottleUp.png b/resources/calibration/joystick/mode2/joystickThrottleUp.png new file mode 100644 index 0000000000000000000000000000000000000000..223199991fc90272b1fae1ba6f28799b31681ca2 Binary files /dev/null and b/resources/calibration/joystick/mode2/joystickThrottleUp.png differ diff --git a/resources/calibration/joystick/mode2/joystickYawLeft.png b/resources/calibration/joystick/mode2/joystickYawLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..788a09c0b8c504db6f6c1068dd408cf8f39d7554 Binary files /dev/null and b/resources/calibration/joystick/mode2/joystickYawLeft.png differ diff --git a/resources/calibration/joystick/mode2/joystickYawRight.png b/resources/calibration/joystick/mode2/joystickYawRight.png new file mode 100644 index 0000000000000000000000000000000000000000..381108825e10adacbbc729dd9ea1ea22b8665f87 Binary files /dev/null and b/resources/calibration/joystick/mode2/joystickYawRight.png differ diff --git a/resources/calibration/joystick/mode3/joystickCenter.png b/resources/calibration/joystick/mode3/joystickCenter.png new file mode 100644 index 0000000000000000000000000000000000000000..556321ec4b1c3142dc40acaf8068b4fb57e923a5 Binary files /dev/null and b/resources/calibration/joystick/mode3/joystickCenter.png differ diff --git a/resources/calibration/joystick/mode3/joystickPitchDown.png b/resources/calibration/joystick/mode3/joystickPitchDown.png new file mode 100644 index 0000000000000000000000000000000000000000..7436477b0acd29f42758d77df5978cb955785d6a Binary files /dev/null and b/resources/calibration/joystick/mode3/joystickPitchDown.png differ diff --git a/resources/calibration/joystick/mode3/joystickPitchUp.png b/resources/calibration/joystick/mode3/joystickPitchUp.png new file mode 100644 index 0000000000000000000000000000000000000000..223199991fc90272b1fae1ba6f28799b31681ca2 Binary files /dev/null and b/resources/calibration/joystick/mode3/joystickPitchUp.png differ diff --git a/resources/calibration/joystick/mode3/joystickRollLeft.png b/resources/calibration/joystick/mode3/joystickRollLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..788a09c0b8c504db6f6c1068dd408cf8f39d7554 Binary files /dev/null and b/resources/calibration/joystick/mode3/joystickRollLeft.png differ diff --git a/resources/calibration/joystick/mode3/joystickRollRight.png b/resources/calibration/joystick/mode3/joystickRollRight.png new file mode 100644 index 0000000000000000000000000000000000000000..381108825e10adacbbc729dd9ea1ea22b8665f87 Binary files /dev/null and b/resources/calibration/joystick/mode3/joystickRollRight.png differ diff --git a/resources/calibration/joystick/mode3/joystickThrottleDown.png b/resources/calibration/joystick/mode3/joystickThrottleDown.png new file mode 100644 index 0000000000000000000000000000000000000000..6e895b1a5a50dac35d977dd496a830cd26b1a5d8 Binary files /dev/null and b/resources/calibration/joystick/mode3/joystickThrottleDown.png differ diff --git a/resources/calibration/joystick/mode3/joystickThrottleUp.png b/resources/calibration/joystick/mode3/joystickThrottleUp.png new file mode 100644 index 0000000000000000000000000000000000000000..ad9d7c03fa5dc49d5889eedf2551f900381c11fc Binary files /dev/null and b/resources/calibration/joystick/mode3/joystickThrottleUp.png differ diff --git a/resources/calibration/joystick/mode3/joystickYawLeft.png b/resources/calibration/joystick/mode3/joystickYawLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..fddc7dfb4217051af0ca1b51897f82ef7cd2c810 Binary files /dev/null and b/resources/calibration/joystick/mode3/joystickYawLeft.png differ diff --git a/resources/calibration/joystick/mode3/joystickYawRight.png b/resources/calibration/joystick/mode3/joystickYawRight.png new file mode 100644 index 0000000000000000000000000000000000000000..9556eed1e7e62df8c0ffe5e0206ad03db6c6f943 Binary files /dev/null and b/resources/calibration/joystick/mode3/joystickYawRight.png differ diff --git a/resources/calibration/joystick/mode4/joystickCenter.png b/resources/calibration/joystick/mode4/joystickCenter.png new file mode 100644 index 0000000000000000000000000000000000000000..556321ec4b1c3142dc40acaf8068b4fb57e923a5 Binary files /dev/null and b/resources/calibration/joystick/mode4/joystickCenter.png differ diff --git a/resources/calibration/joystick/mode4/joystickPitchDown.png b/resources/calibration/joystick/mode4/joystickPitchDown.png new file mode 100644 index 0000000000000000000000000000000000000000..6e895b1a5a50dac35d977dd496a830cd26b1a5d8 Binary files /dev/null and b/resources/calibration/joystick/mode4/joystickPitchDown.png differ diff --git a/resources/calibration/joystick/mode4/joystickPitchUp.png b/resources/calibration/joystick/mode4/joystickPitchUp.png new file mode 100644 index 0000000000000000000000000000000000000000..ad9d7c03fa5dc49d5889eedf2551f900381c11fc Binary files /dev/null and b/resources/calibration/joystick/mode4/joystickPitchUp.png differ diff --git a/resources/calibration/joystick/mode4/joystickRollLeft.png b/resources/calibration/joystick/mode4/joystickRollLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..788a09c0b8c504db6f6c1068dd408cf8f39d7554 Binary files /dev/null and b/resources/calibration/joystick/mode4/joystickRollLeft.png differ diff --git a/resources/calibration/joystick/mode4/joystickRollRight.png b/resources/calibration/joystick/mode4/joystickRollRight.png new file mode 100644 index 0000000000000000000000000000000000000000..381108825e10adacbbc729dd9ea1ea22b8665f87 Binary files /dev/null and b/resources/calibration/joystick/mode4/joystickRollRight.png differ diff --git a/resources/calibration/joystick/mode4/joystickThrottleDown.png b/resources/calibration/joystick/mode4/joystickThrottleDown.png new file mode 100644 index 0000000000000000000000000000000000000000..7436477b0acd29f42758d77df5978cb955785d6a Binary files /dev/null and b/resources/calibration/joystick/mode4/joystickThrottleDown.png differ diff --git a/resources/calibration/joystick/mode4/joystickThrottleUp.png b/resources/calibration/joystick/mode4/joystickThrottleUp.png new file mode 100644 index 0000000000000000000000000000000000000000..223199991fc90272b1fae1ba6f28799b31681ca2 Binary files /dev/null and b/resources/calibration/joystick/mode4/joystickThrottleUp.png differ diff --git a/resources/calibration/joystick/mode4/joystickYawLeft.png b/resources/calibration/joystick/mode4/joystickYawLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..fddc7dfb4217051af0ca1b51897f82ef7cd2c810 Binary files /dev/null and b/resources/calibration/joystick/mode4/joystickYawLeft.png differ diff --git a/resources/calibration/joystick/mode4/joystickYawRight.png b/resources/calibration/joystick/mode4/joystickYawRight.png new file mode 100644 index 0000000000000000000000000000000000000000..9556eed1e7e62df8c0ffe5e0206ad03db6c6f943 Binary files /dev/null and b/resources/calibration/joystick/mode4/joystickYawRight.png differ diff --git a/src/FirmwarePlugin/APM/ArduSubFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduSubFirmwarePlugin.h index c79c2f186c11b93c4d1359c0889b2bf9822d5781..d9911f703f4b4dd2223064a3a1107dc98f7003fa 100644 --- a/src/FirmwarePlugin/APM/ArduSubFirmwarePlugin.h +++ b/src/FirmwarePlugin/APM/ArduSubFirmwarePlugin.h @@ -69,6 +69,8 @@ public: // Overrides from FirmwarePlugin int manualControlReservedButtonCount(void); + int defaultJoystickTXMode(void) final { return 3; } + bool supportsThrottleModeCenterZero(void); bool supportsManualControl(void); diff --git a/src/FirmwarePlugin/FirmwarePlugin.cc b/src/FirmwarePlugin/FirmwarePlugin.cc index eb69d9a718b799cff3717bb867ebdabb7a6ae485..42aa28387fd0dc93619c2e13036311b5bb4a5bc7 100644 --- a/src/FirmwarePlugin/FirmwarePlugin.cc +++ b/src/FirmwarePlugin/FirmwarePlugin.cc @@ -106,6 +106,11 @@ int FirmwarePlugin::manualControlReservedButtonCount(void) return -1; } +int FirmwarePlugin::defaultJoystickTXMode(void) +{ + return 2; +} + bool FirmwarePlugin::supportsThrottleModeCenterZero(void) { // By default, this is supported diff --git a/src/FirmwarePlugin/FirmwarePlugin.h b/src/FirmwarePlugin/FirmwarePlugin.h index 096ae715132481afa7d1a54bf587633fc631d853..3e8ededb995f5093a04a7c9be725c56cdfa3fa43 100644 --- a/src/FirmwarePlugin/FirmwarePlugin.h +++ b/src/FirmwarePlugin/FirmwarePlugin.h @@ -142,6 +142,10 @@ public: /// @return -1: reserver all buttons, >0 number of buttons to reserve virtual int manualControlReservedButtonCount(void); + /// Default tx mode to apply to joystick axes + /// TX modes are as outlined here: http://www.rc-airplane-world.com/rc-transmitter-modes.html + virtual int defaultJoystickTXMode(void); + /// Returns true if the vehicle and firmware supports the use of a throttle joystick that /// is zero when centered. Typically not supported on vehicles that have bidirectional /// throttle. diff --git a/src/Joystick/Joystick.cc b/src/Joystick/Joystick.cc index 17ce67b478e49a66e087359aeef9597b0df59c3f..20093ab2c395dc4c7df4eea1030b55a36d87fb45 100644 --- a/src/Joystick/Joystick.cc +++ b/src/Joystick/Joystick.cc @@ -18,13 +18,19 @@ QGC_LOGGING_CATEGORY(JoystickLog, "JoystickLog") QGC_LOGGING_CATEGORY(JoystickValuesLog, "JoystickValuesLog") -const char* Joystick::_settingsGroup = "Joysticks"; -const char* Joystick::_calibratedSettingsKey = "Calibrated1"; // Increment number to force recalibration -const char* Joystick::_buttonActionSettingsKey = "ButtonActionName%1"; -const char* Joystick::_throttleModeSettingsKey = "ThrottleMode"; -const char* Joystick::_exponentialSettingsKey = "Exponential"; -const char* Joystick::_accumulatorSettingsKey = "Accumulator"; -const char* Joystick::_deadbandSettingsKey = "Deadband"; +const char* Joystick::_settingsGroup = "Joysticks"; +const char* Joystick::_calibratedSettingsKey = "Calibrated2"; // Increment number to force recalibration +const char* Joystick::_buttonActionSettingsKey = "ButtonActionName%1"; +const char* Joystick::_throttleModeSettingsKey = "ThrottleMode"; +const char* Joystick::_exponentialSettingsKey = "Exponential"; +const char* Joystick::_accumulatorSettingsKey = "Accumulator"; +const char* Joystick::_deadbandSettingsKey = "Deadband"; +const char* Joystick::_txModeSettingsKey = NULL; +const char* Joystick::_fixedWingTXModeSettingsKey = "TXMode_FixedWing"; +const char* Joystick::_multiRotorTXModeSettingsKey = "TXMode_MultiRotor"; +const char* Joystick::_roverTXModeSettingsKey = "TXMode_Rover"; +const char* Joystick::_vtolTXModeSettingsKey = "TXMode_VTOL"; +const char* Joystick::_submarineTXModeSettingsKey = "TXMode_Submarine"; const char* Joystick::_rgFunctionSettingsKey[Joystick::maxFunction] = { "RollAxis", @@ -33,6 +39,8 @@ const char* Joystick::_rgFunctionSettingsKey[Joystick::maxFunction] = { "ThrottleAxis" }; +int Joystick::_transmitterMode = 2; + Joystick::Joystick(const QString& name, int axisCount, int buttonCount, int hatCount, MultiVehicleManager* multiVehicleManager) : _exitThread(false) , _name(name) @@ -67,6 +75,8 @@ Joystick::Joystick(const QString& name, int axisCount, int buttonCount, int hatC } _loadSettings(); + + connect(_multiVehicleManager, &MultiVehicleManager::activeVehicleChanged, this, &Joystick::_activeVehicleChanged); } Joystick::~Joystick() @@ -76,11 +86,74 @@ Joystick::~Joystick() delete _rgButtonValues; } +void Joystick::_setDefaultCalibration(void) { + QSettings settings; + settings.beginGroup(_settingsGroup); + settings.beginGroup(_name); + _calibrated = settings.value(_calibratedSettingsKey, false).toBool(); + + // Only set default calibrations if we do not have a calibration for this gamecontroller + if(_calibrated) return; + + for(int axis = 0; axis < _axisCount; axis++) { + Joystick::Calibration_t calibration; + _rgCalibration[axis] = calibration; + } + + _rgCalibration[1].reversed = true; + _rgCalibration[3].reversed = true; + + // Default TX Mode 2 axis assignments for gamecontrollers + _rgFunctionAxis[rollFunction] = 2; + _rgFunctionAxis[pitchFunction] = 3; + _rgFunctionAxis[yawFunction] = 0; + _rgFunctionAxis[throttleFunction] = 1; + + _exponential = false; + _accumulator = false; + _deadband = false; + _throttleMode = ThrottleModeCenterZero; + _calibrated = true; + + _saveSettings(); +} + +void Joystick::_activeVehicleChanged(Vehicle *activeVehicle) +{ + if(activeVehicle) { + if(activeVehicle->fixedWing()) { + _txModeSettingsKey = _fixedWingTXModeSettingsKey; + } else if(activeVehicle->multiRotor()) { + _txModeSettingsKey = _multiRotorTXModeSettingsKey; + } else if(activeVehicle->rover()) { + _txModeSettingsKey = _roverTXModeSettingsKey; + } else if(activeVehicle->vtol()) { + _txModeSettingsKey = _vtolTXModeSettingsKey; + } else if(activeVehicle->sub()) { + _txModeSettingsKey = _submarineTXModeSettingsKey; + } else { + _txModeSettingsKey = NULL; + qWarning() << "No valid joystick TXmode settings key for selected vehicle"; + return; + } + + QSettings settings; + settings.beginGroup(_settingsGroup); + int mode = settings.value(_txModeSettingsKey, activeVehicle->firmwarePlugin()->defaultJoystickTXMode()).toInt(); + + setTXMode(mode); + } +} + void Joystick::_loadSettings(void) { QSettings settings; settings.beginGroup(_settingsGroup); + + if(_txModeSettingsKey) + _transmitterMode = settings.value(_txModeSettingsKey, 2).toInt(); + settings.beginGroup(_name); bool badSettings = false; @@ -96,7 +169,7 @@ void Joystick::_loadSettings(void) _throttleMode = (ThrottleMode_t)settings.value(_throttleModeSettingsKey, ThrottleModeCenterZero).toInt(&convertOk); badSettings |= !convertOk; - qCDebug(JoystickLog) << "_loadSettings calibrated:throttlemode:exponential:deadband:badsettings" << _calibrated << _throttleMode << _exponential << _deadband << badSettings; + qCDebug(JoystickLog) << "_loadSettings calibrated:txmode:throttlemode:exponential:deadband:badsettings" << _calibrated << _transmitterMode << _throttleMode << _exponential << _deadband << badSettings; QString minTpl ("Axis%1Min"); QString maxTpl ("Axis%1Max"); @@ -136,6 +209,10 @@ void Joystick::_loadSettings(void) qCDebug(JoystickLog) << "_loadSettings function:axis:badsettings" << function << functionAxis << badSettings; } + // FunctionAxis mappings are always stored in TX mode 2 + // Remap to stored TX mode in settings + _remapAxes(2, _transmitterMode, _rgFunctionAxis); + for (int button=0; button<_totalButtonCount; button++) { _rgButtonActions << settings.value(QString(_buttonActionSettingsKey).arg(button), QString()).toString(); qCDebug(JoystickLog) << "_loadSettings button:action" << button << _rgButtonActions[button]; @@ -152,6 +229,12 @@ void Joystick::_saveSettings(void) QSettings settings; settings.beginGroup(_settingsGroup); + + // Transmitter mode is static + // Save the mode we are using + if(_txModeSettingsKey) + settings.setValue(_txModeSettingsKey, _transmitterMode); + settings.beginGroup(_name); settings.setValue(_calibratedSettingsKey, _calibrated); @@ -160,7 +243,7 @@ void Joystick::_saveSettings(void) settings.setValue(_deadbandSettingsKey, _deadband); settings.setValue(_throttleModeSettingsKey, _throttleMode); - qCDebug(JoystickLog) << "_saveSettings calibrated:throttlemode:deadband" << _calibrated << _throttleMode << _deadband; + qCDebug(JoystickLog) << "_saveSettings calibrated:throttlemode:deadband:txmode" << _calibrated << _throttleMode << _deadband << _transmitterMode; QString minTpl ("Axis%1Min"); QString maxTpl ("Axis%1Max"); @@ -187,8 +270,13 @@ void Joystick::_saveSettings(void) << calibration->deadband; } + // Always save function Axis mappings in TX Mode 2 + // Write mode 2 mappings without changing mapping currently in use + int temp[maxFunction]; + _remapAxes(_transmitterMode, 2, temp); + for (int function=0; function 0 && mode <= 4) { + _remapAxes(_transmitterMode, mode, _rgFunctionAxis); + _transmitterMode = mode; + _saveSettings(); + } else { + qCWarning(JoystickLog) << "Invalid mode:" << mode; + } +} + /// Adjust the raw axis value to the -1:1 range given calibration information float Joystick::_adjustRange(int value, Calibration_t calibration, bool withDeadbands) { @@ -471,6 +595,7 @@ void Joystick::setFunctionAxis(AxisFunction_t function, int axis) _calibrated = true; _rgFunctionAxis[function] = axis; + _saveSettings(); emit calibratedChanged(_calibrated); } diff --git a/src/Joystick/Joystick.h b/src/Joystick/Joystick.h index c9915eae20d1c7d6d29600948e7e4493cbc7bbc7..0ec6d53abfa6e8c0d68e489df081d7c719d2bca4 100644 --- a/src/Joystick/Joystick.h +++ b/src/Joystick/Joystick.h @@ -30,12 +30,18 @@ public: ~Joystick(); - typedef struct { + typedef struct Calibration_t { int min; int max; int center; int deadband; bool reversed; + Calibration_t() + : min(-32767) + , max(32767) + , center(0) + , deadband(0) + , reversed(false) {} } Calibration_t; typedef enum { @@ -68,7 +74,8 @@ public: Q_PROPERTY(int throttleMode READ throttleMode WRITE setThrottleMode NOTIFY throttleModeChanged) Q_PROPERTY(bool exponential READ exponential WRITE setExponential NOTIFY exponentialChanged) Q_PROPERTY(bool accumulator READ accumulator WRITE setAccumulator NOTIFY accumulatorChanged) - + Q_PROPERTY(bool requiresCalibration READ requiresCalibration CONSTANT) + // Property accessors int axisCount(void) { return _axisCount; } @@ -89,6 +96,8 @@ public: QString name(void) { return _name; } + virtual bool requiresCalibration(void) { return true; } + int throttleMode(void); void setThrottleMode(int mode); @@ -101,6 +110,9 @@ public: bool deadband(void); void setDeadband(bool accu); + void setTXMode(int mode); + int getTXMode(void) { return _transmitterMode; } + typedef enum { CalibrationModeOff, // Not calibrating CalibrationModeMonitor, // Monitors are active, continue to send to vehicle if already polling @@ -141,12 +153,13 @@ signals: void buttonActionTriggered(int action); protected: - void _saveSettings(void); - void _loadSettings(void); - float _adjustRange(int value, Calibration_t calibration, bool withDeadbands); - void _buttonAction(const QString& action); - bool _validAxis(int axis); - bool _validButton(int button); + void _setDefaultCalibration(void); + void _saveSettings(void); + void _loadSettings(void); + float _adjustRange(int value, Calibration_t calibration, bool withDeadbands); + void _buttonAction(const QString& action); + bool _validAxis(int axis); + bool _validButton(int button); private: virtual bool _open() = 0; @@ -157,6 +170,9 @@ private: virtual int _getAxis(int i) = 0; virtual uint8_t _getHat(int hat,int i) = 0; + int _mapFunctionMode(int mode, int function); + void _remapAxes(int currentMode, int newMode, int (&newMapping)[maxFunction]); + // Override from QThread virtual void run(void); @@ -172,6 +188,7 @@ protected: int _hatButtonCount; int _totalButtonCount; + static int _transmitterMode; CalibrationMode_t _calibrationMode; int* _rgAxisValues; @@ -203,6 +220,15 @@ private: static const char* _exponentialSettingsKey; static const char* _accumulatorSettingsKey; static const char* _deadbandSettingsKey; + static const char* _txModeSettingsKey; + static const char* _fixedWingTXModeSettingsKey; + static const char* _multiRotorTXModeSettingsKey; + static const char* _roverTXModeSettingsKey; + static const char* _vtolTXModeSettingsKey; + static const char* _submarineTXModeSettingsKey; + +private slots: + void _activeVehicleChanged(Vehicle* activeVehicle); }; #endif diff --git a/src/Joystick/JoystickSDL.cc b/src/Joystick/JoystickSDL.cc index 303c3005c00c6ff659cecff0852e897b72141e4b..59798e2681573bf049d0c8dd5f1dedc3fb76d6a8 100644 --- a/src/Joystick/JoystickSDL.cc +++ b/src/Joystick/JoystickSDL.cc @@ -10,6 +10,7 @@ JoystickSDL::JoystickSDL(const QString& name, int axisCount, int buttonCount, in , _isGameController(isGameController) , _index(index) { + if(_isGameController) _setDefaultCalibration(); } QMap JoystickSDL::discover(MultiVehicleManager* _multiVehicleManager) { diff --git a/src/Joystick/JoystickSDL.h b/src/Joystick/JoystickSDL.h index 2c4a9ca6aeb93fae1880f4f8b3e266604c181eb3..36d966e2842eec1c2fb2205f69109e93a42f71e1 100644 --- a/src/Joystick/JoystickSDL.h +++ b/src/Joystick/JoystickSDL.h @@ -12,7 +12,10 @@ class JoystickSDL : public Joystick public: JoystickSDL(const QString& name, int axisCount, int buttonCount, int hatCount, int index, bool isGameController, MultiVehicleManager* multiVehicleManager); - static QMap discover(MultiVehicleManager* _multiVehicleManager); + static QMap discover(MultiVehicleManager* _multiVehicleManager); + + // This can be uncommented to hide the calibration buttons for gamecontrollers in the future + // bool requiresCalibration(void) final { return !_isGameController; } private: static void _loadGameControllerMappings(); diff --git a/src/VehicleSetup/JoystickConfig.qml b/src/VehicleSetup/JoystickConfig.qml index 503c6be53598527acd296f3b319db50ffa7afe3c..69c36928aa00d086ffa98a8fa1f83811453317a2 100644 --- a/src/VehicleSetup/JoystickConfig.qml +++ b/src/VehicleSetup/JoystickConfig.qml @@ -176,7 +176,7 @@ SetupPage { QGCLabel { id: rollLabel width: defaultTextWidth * 10 - text: qsTr("Roll") + text: _activeVehicle.sub ? qsTr("Lateral") : qsTr("Roll") } Loader { @@ -208,7 +208,7 @@ SetupPage { QGCLabel { id: pitchLabel width: defaultTextWidth * 10 - text: qsTr("Pitch") + text: _activeVehicle.sub ? qsTr("Forward") : qsTr("Pitch") } Loader { @@ -302,6 +302,7 @@ SetupPage { // Command Buttons Row { spacing: 10 + visible: _activeJoystick.requiresCalibration QGCButton { id: skipButton @@ -643,12 +644,57 @@ SetupPage { id: rightColumn anchors.top: parent.top anchors.right: parent.right - width: defaultTextWidth * 35 - spacing: 10 + width: Math.min(joystickPage.defaultTextWidth * 35, availableWidth * 0.4) + spacing: ScreenTools.defaultFontPixelHeight / 2 + + Row { + spacing: ScreenTools.defaultFontPixelWidth + + ExclusiveGroup { id: modeGroup } + + QGCLabel { + text: "TX Mode:" + } + + QGCRadioButton { + exclusiveGroup: modeGroup + text: "1" + checked: controller.transmitterMode == 1 + enabled: !controller.calibrating + + onClicked: controller.transmitterMode = 1 + } + + QGCRadioButton { + exclusiveGroup: modeGroup + text: "2" + checked: controller.transmitterMode == 2 + enabled: !controller.calibrating + + onClicked: controller.transmitterMode = 2 + } + + QGCRadioButton { + exclusiveGroup: modeGroup + text: "3" + checked: controller.transmitterMode == 3 + enabled: !controller.calibrating + + onClicked: controller.transmitterMode = 3 + } + + QGCRadioButton { + exclusiveGroup: modeGroup + text: "4" + checked: controller.transmitterMode == 4 + enabled: !controller.calibrating + + onClicked: controller.transmitterMode = 4 + } + } Image { - //width: parent.width - height: defaultTextHeight * 15 + width: parent.width fillMode: Image.PreserveAspectFit smooth: true source: controller.imageHelp diff --git a/src/VehicleSetup/JoystickConfigController.cc b/src/VehicleSetup/JoystickConfigController.cc index 505478bd73107da3be0fe2dba60b4ea689a059d8..4af0546ddf64d64e64673925e1d886b4b4c22f28 100644 --- a/src/VehicleSetup/JoystickConfigController.cc +++ b/src/VehicleSetup/JoystickConfigController.cc @@ -29,8 +29,11 @@ const int JoystickConfigController::_calMinDelta = 1000; ///< Amo const int JoystickConfigController::_stickDetectSettleMSecs = 500; -const char* JoystickConfigController::_imageFilePrefix = "calibration/"; -const char* JoystickConfigController::_imageFileMode2Dir = "joystick/"; +const char* JoystickConfigController::_imageFilePrefix = "calibration/joystick/"; +const char* JoystickConfigController::_imageFileMode1Dir = "mode1/"; +const char* JoystickConfigController::_imageFileMode2Dir = "mode2/"; +const char* JoystickConfigController::_imageFileMode3Dir = "mode3/"; +const char* JoystickConfigController::_imageFileMode4Dir = "mode4/"; const char* JoystickConfigController::_imageCenter = "joystickCenter.png"; const char* JoystickConfigController::_imageThrottleUp = "joystickThrottleUp.png"; const char* JoystickConfigController::_imageThrottleDown = "joystickThrottleDown.png"; @@ -43,6 +46,7 @@ const char* JoystickConfigController::_imagePitchDown = "joystickPitchDown.p JoystickConfigController::JoystickConfigController(void) : _activeJoystick(NULL) + , _transmitterMode(2) , _currentStep(-1) , _axisCount(0) , _rgAxisInfo(NULL) @@ -495,6 +499,8 @@ void JoystickConfigController::_setInternalCalibrationValuesFromSettings(void) _rgFunctionAxisMapping[function] = paramAxis; _rgAxisInfo[paramAxis].function = (Joystick::AxisFunction_t)function; } + + _transmitterMode = joystick->getTXMode(); _signalAllAttiudeValueChanges(); } @@ -591,6 +597,7 @@ void JoystickConfigController::_startCalibration(void) _currentStep = 0; _setupCurrentState(); + emit calibratingChanged(); } /// @brief Cancels the calibration process, setting things back to initial state. @@ -609,6 +616,7 @@ void JoystickConfigController::_stopCalibration(void) _skipButton->setEnabled(false); _setHelpImage(_imageCenter); + emit calibratingChanged(); } /// @brief Saves the current axis values, so that we can detect when the use moves an input. @@ -642,7 +650,23 @@ void JoystickConfigController::_setHelpImage(const char* imageFile) { QString file = _imageFilePrefix; - file += _imageFileMode2Dir; + switch(_transmitterMode) { + case 1: + file += _imageFileMode1Dir; + break; + case 2: + file += _imageFileMode2Dir; + break; + case 3: + file += _imageFileMode3Dir; + break; + case 4: + file += _imageFileMode4Dir; + break; + default: + Q_ASSERT(false); + } + file += imageFile; qCDebug(JoystickConfigControllerLog) << "_setHelpImage" << file; @@ -784,6 +808,20 @@ bool JoystickConfigController::throttleAxisReversed(void) } } +void JoystickConfigController::setTransmitterMode(int mode) +{ + if (mode > 0 && mode <= 4) { + _transmitterMode = mode; + if (_currentStep != -1) { // This should never be true, mode selection is disabled during calibration + const stateMachineEntry* state = _getStateMachineEntry(_currentStep); + _setHelpImage(state->image); + } else { + _activeJoystick->setTXMode(mode); + _setInternalCalibrationValuesFromSettings(); + } + } +} + void JoystickConfigController::_signalAllAttiudeValueChanges(void) { emit rollAxisMappedChanged(rollAxisMapped()); @@ -800,6 +838,8 @@ void JoystickConfigController::_signalAllAttiudeValueChanges(void) emit pitchAxisDeadbandChanged(pitchAxisDeadband()); emit yawAxisDeadbandChanged(yawAxisDeadband()); emit throttleAxisDeadbandChanged(throttleAxisDeadband()); + + emit transmitterModeChanged(_transmitterMode); } void JoystickConfigController::_activeJoystickChanged(Joystick* joystick) diff --git a/src/VehicleSetup/JoystickConfigController.h b/src/VehicleSetup/JoystickConfigController.h index 9b0a8c8795a502a0021138d8eb97724eee298939..c0c709c724a3ef53e30cb50962780c7b240a7e5f 100644 --- a/src/VehicleSetup/JoystickConfigController.h +++ b/src/VehicleSetup/JoystickConfigController.h @@ -69,7 +69,9 @@ public: Q_PROPERTY(bool deadbandToggle READ getDeadbandToggle WRITE setDeadbandToggle NOTIFY deadbandToggled) + Q_PROPERTY(int transmitterMode READ transmitterMode WRITE setTransmitterMode NOTIFY transmitterModeChanged) Q_PROPERTY(QString imageHelp MEMBER _imageHelp NOTIFY imageHelpChanged) + Q_PROPERTY(bool calibrating READ calibrating NOTIFY calibratingChanged) Q_INVOKABLE void cancelButtonClicked(void); Q_INVOKABLE void skipButtonClicked(void); @@ -100,6 +102,11 @@ public: void setDeadbandToggle(bool); int axisCount(void); + + int transmitterMode(void) { return _transmitterMode; } + void setTransmitterMode(int mode); + + bool calibrating(void) { return _currentStep != -1; } signals: void axisValueChanged(int axis, int value); @@ -127,6 +134,8 @@ signals: void deadbandToggled(bool value); void imageHelpChanged(QString source); + void transmitterModeChanged(int mode); + void calibratingChanged(void); // @brief Signalled when in unit test mode and a message box should be displayed by the next button void nextButtonMessageBoxDisplayed(void); @@ -172,6 +181,7 @@ private: Joystick* _activeJoystick; + int _transmitterMode; int _currentStep; ///< Current step of state machine const struct stateMachineEntry* _getStateMachineEntry(int step); @@ -211,7 +221,10 @@ private: // Member variables + static const char* _imageFileMode1Dir; static const char* _imageFileMode2Dir; + static const char* _imageFileMode3Dir; + static const char* _imageFileMode4Dir; static const char* _imageFilePrefix; static const char* _imageCenter; static const char* _imageThrottleUp;