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
};