diff --git a/qgcresources.qrc b/qgcresources.qrc index 973da9ffa019e28c968a24b6a0b24c0adf64f222..4fe4831206ab8978492279cfcd0bdf25c190e87d 100644 --- a/qgcresources.qrc +++ b/qgcresources.qrc @@ -247,6 +247,9 @@ resources/calibration/joystick/joystickThrottleUp.png resources/calibration/joystick/joystickThrottleDown.png + + resources/SDL_GameControllerDB/gamecontrollerdb.txt + resources/styles/style-dark.css resources/styles/style-light.css diff --git a/src/Joystick/JoystickSDL.cc b/src/Joystick/JoystickSDL.cc index ea481d206191129bb93799ea83b4652c2e5026cb..25a2f5b2e7ac4e8bcc0dd9033257f65c634823b5 100644 --- a/src/Joystick/JoystickSDL.cc +++ b/src/Joystick/JoystickSDL.cc @@ -3,9 +3,11 @@ #include "QGCApplication.h" #include +#include -JoystickSDL::JoystickSDL(const QString& name, int axisCount, int buttonCount, int hatCount, int index, MultiVehicleManager* multiVehicleManager) +JoystickSDL::JoystickSDL(const QString& name, int axisCount, int buttonCount, int hatCount, int index, bool isGameController, MultiVehicleManager* multiVehicleManager) : Joystick(name,axisCount,buttonCount,hatCount,multiVehicleManager) + , _isGameController(isGameController) , _index(index) { } @@ -13,11 +15,13 @@ JoystickSDL::JoystickSDL(const QString& name, int axisCount, int buttonCount, in QMap JoystickSDL::discover(MultiVehicleManager* _multiVehicleManager) { static QMap ret; - if (SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_NOPARACHUTE) < 0) { + if (SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER | SDL_INIT_NOPARACHUTE) < 0) { qWarning() << "Couldn't initialize SimpleDirectMediaLayer:" << SDL_GetError(); return ret; } + _loadGameControllerMappings(); + // Load available joysticks qCDebug(JoystickLog) << "Available joysticks"; @@ -25,26 +29,27 @@ QMap JoystickSDL::discover(MultiVehicleManager* _multiVehicl for (int i=0; i JoystickSDL::discover(MultiVehicleManager* _multiVehicl return ret; } +void JoystickSDL::_loadGameControllerMappings(void) { + QFile file(":/db/mapping/joystick/gamecontrollerdb.txt"); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + qWarning() << "Couldn't load GameController mapping database."; + return; + } + + QTextStream s(&file); + + while (!s.atEnd()) { + SDL_GameControllerAddMapping(s.readLine().toStdString().c_str()); + } +} + bool JoystickSDL::_open(void) { - sdlJoystick = SDL_JoystickOpen(_index); + if ( _isGameController ) { + sdlController = SDL_GameControllerOpen(_index); + sdlJoystick = SDL_GameControllerGetJoystick(sdlController); + } else { + sdlJoystick = SDL_JoystickOpen(_index); + } if (!sdlJoystick) { qCWarning(JoystickLog) << "SDL_JoystickOpen failed:" << SDL_GetError(); @@ -70,15 +95,24 @@ void JoystickSDL::_close(void) { bool JoystickSDL::_update(void) { SDL_JoystickUpdate(); + SDL_GameControllerUpdate(); return true; } bool JoystickSDL::_getButton(int i) { - return !!SDL_JoystickGetButton(sdlJoystick, i); + if ( _isGameController ) { + return !!SDL_GameControllerGetButton(sdlController, SDL_GameControllerButton(i)); + } else { + return !!SDL_JoystickGetButton(sdlJoystick, i); + } } int JoystickSDL::_getAxis(int i) { - return SDL_JoystickGetAxis(sdlJoystick, i); + if ( _isGameController ) { + return SDL_GameControllerGetAxis(sdlController, SDL_GameControllerAxis(i)); + } else { + return SDL_JoystickGetAxis(sdlJoystick, i); + } } uint8_t JoystickSDL::_getHat(int hat,int i) { diff --git a/src/Joystick/JoystickSDL.h b/src/Joystick/JoystickSDL.h index 43f29ea54396665eb942850638eec2e174c3ca07..576cf70b23d45d142cb76005b2fb7c5e38cac1ae 100644 --- a/src/Joystick/JoystickSDL.h +++ b/src/Joystick/JoystickSDL.h @@ -15,11 +15,13 @@ class JoystickSDL : public Joystick { public: - JoystickSDL(const QString& name, int axisCount, int buttonCount, int hatCount, int index, MultiVehicleManager* multiVehicleManager); + JoystickSDL(const QString& name, int axisCount, int buttonCount, int hatCount, int index, bool isGameController, MultiVehicleManager* multiVehicleManager); static QMap discover(MultiVehicleManager* _multiVehicleManager); private: + static void _loadGameControllerMappings(); + bool _open() final; void _close() final; bool _update() final; @@ -29,6 +31,8 @@ private: uint8_t _getHat(int hat,int i) final; SDL_Joystick *sdlJoystick; + SDL_GameController *sdlController; + bool _isGameController; int _index; ///< Index for SDL_JoystickOpen };