From bffe803cc3bb84751ae6f511cd5f199fe440aaad Mon Sep 17 00:00:00 2001 From: Jacob Walser Date: Tue, 24 Jan 2017 20:50:55 -0500 Subject: [PATCH] Add firmware-specific joystick TX mode settings --- .../APM/ArduSubFirmwarePlugin.h | 2 + src/FirmwarePlugin/FirmwarePlugin.cc | 5 ++ src/FirmwarePlugin/FirmwarePlugin.h | 4 ++ src/Joystick/Joystick.cc | 64 +++++++++++++++---- src/Joystick/Joystick.h | 8 +++ 5 files changed, 70 insertions(+), 13 deletions(-) diff --git a/src/FirmwarePlugin/APM/ArduSubFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduSubFirmwarePlugin.h index c79c2f186..d9911f703 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 eb69d9a71..42aa28387 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 096ae7151..3e8ededb9 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 2b217ae48..2d08bf6c1 100644 --- a/src/Joystick/Joystick.cc +++ b/src/Joystick/Joystick.cc @@ -18,14 +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::_txModeSettingsKey = "TXMode"; +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::_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", @@ -70,6 +75,8 @@ Joystick::Joystick(const QString& name, int axisCount, int buttonCount, int hatC } _loadSettings(); + + connect(_multiVehicleManager, &MultiVehicleManager::activeVehicleChanged, this, &Joystick::_activeVehicleChanged); } Joystick::~Joystick() @@ -96,9 +103,11 @@ void Joystick::_setDefaultCalibration(void) { _rgCalibration[1].reversed = true; _rgCalibration[3].reversed = true; - for(int function = 0; function < maxFunction; function++) { - _rgFunctionAxis[function] = function; - } + // Default TX Mode 2 axis assignments for gamecontrollers + _rgFunctionAxis[rollFunction] = 2; + _rgFunctionAxis[pitchFunction] = 3; + _rgFunctionAxis[yawFunction] = 0; + _rgFunctionAxis[throttleFunction] = 1; _exponential = false; _accumulator = false; @@ -109,13 +118,41 @@ void Joystick::_setDefaultCalibration(void) { _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); - _transmitterMode = settings.value(_txModeSettingsKey, 2).toInt(); + if(_txModeSettingsKey) + _transmitterMode = settings.value(_txModeSettingsKey, 2).toInt(); settings.beginGroup(_name); @@ -195,7 +232,8 @@ void Joystick::_saveSettings(void) // Transmitter mode is static // Save the mode we are using - settings.setValue(_txModeSettingsKey, _transmitterMode); + if(_txModeSettingsKey) + settings.setValue(_txModeSettingsKey, _transmitterMode); settings.beginGroup(_name); diff --git a/src/Joystick/Joystick.h b/src/Joystick/Joystick.h index 521f8866a..0ec6d53ab 100644 --- a/src/Joystick/Joystick.h +++ b/src/Joystick/Joystick.h @@ -221,6 +221,14 @@ private: 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 -- 2.22.0