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;