Commit e67514bc authored by Rustom Jehangir's avatar Rustom Jehangir

SDL2: Load game controller mappings and utilize game controller if available

parent 50a0e516
...@@ -247,6 +247,9 @@ ...@@ -247,6 +247,9 @@
<file alias="joystickThrottleUp.png">resources/calibration/joystick/joystickThrottleUp.png</file> <file alias="joystickThrottleUp.png">resources/calibration/joystick/joystickThrottleUp.png</file>
<file alias="joystickThrottleDown.png">resources/calibration/joystick/joystickThrottleDown.png</file> <file alias="joystickThrottleDown.png">resources/calibration/joystick/joystickThrottleDown.png</file>
</qresource> </qresource>
<qresource prefix="/db/mapping/joystick">
<file alias="gamecontrollerdb.txt">resources/SDL_GameControllerDB/gamecontrollerdb.txt</file>
</qresource>
<qresource prefix="/res/styles"> <qresource prefix="/res/styles">
<file alias="style-dark.css">resources/styles/style-dark.css</file> <file alias="style-dark.css">resources/styles/style-dark.css</file>
<file alias="style-light.css">resources/styles/style-light.css</file> <file alias="style-light.css">resources/styles/style-light.css</file>
......
...@@ -3,9 +3,11 @@ ...@@ -3,9 +3,11 @@
#include "QGCApplication.h" #include "QGCApplication.h"
#include <QQmlEngine> #include <QQmlEngine>
#include <QTextStream>
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) : Joystick(name,axisCount,buttonCount,hatCount,multiVehicleManager)
, _isGameController(isGameController)
, _index(index) , _index(index)
{ {
} }
...@@ -13,11 +15,13 @@ JoystickSDL::JoystickSDL(const QString& name, int axisCount, int buttonCount, in ...@@ -13,11 +15,13 @@ JoystickSDL::JoystickSDL(const QString& name, int axisCount, int buttonCount, in
QMap<QString, Joystick*> JoystickSDL::discover(MultiVehicleManager* _multiVehicleManager) { QMap<QString, Joystick*> JoystickSDL::discover(MultiVehicleManager* _multiVehicleManager) {
static QMap<QString, Joystick*> ret; static QMap<QString, Joystick*> 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(); qWarning() << "Couldn't initialize SimpleDirectMediaLayer:" << SDL_GetError();
return ret; return ret;
} }
_loadGameControllerMappings();
// Load available joysticks // Load available joysticks
qCDebug(JoystickLog) << "Available joysticks"; qCDebug(JoystickLog) << "Available joysticks";
...@@ -25,26 +29,27 @@ QMap<QString, Joystick*> JoystickSDL::discover(MultiVehicleManager* _multiVehicl ...@@ -25,26 +29,27 @@ QMap<QString, Joystick*> JoystickSDL::discover(MultiVehicleManager* _multiVehicl
for (int i=0; i<SDL_NumJoysticks(); i++) { for (int i=0; i<SDL_NumJoysticks(); i++) {
QString name = SDL_JoystickNameForIndex(i); QString name = SDL_JoystickNameForIndex(i);
if (SDL_IsGameController(i)) {
qDebug() << name << "supports SDL GameController!";
} else {
qDebug() << name << "DOES NOT support SDL GameController!";
}
SDL_GameController* sdlController = SDL_GameControllerOpen(i);
qDebug() << SDL_GetError();
if (!ret.contains(name)) { if (!ret.contains(name)) {
int axisCount, buttonCount, hatCount; int axisCount, buttonCount, hatCount;
bool isGameController;
SDL_Joystick* sdlJoystick = SDL_JoystickOpen(i); SDL_Joystick* sdlJoystick = SDL_JoystickOpen(i);
if (SDL_IsGameController(i)) {
isGameController = true;
axisCount = SDL_CONTROLLER_AXIS_MAX;
buttonCount = SDL_CONTROLLER_BUTTON_MAX;
hatCount = 0;
} else {
isGameController = false;
axisCount = SDL_JoystickNumAxes(sdlJoystick); axisCount = SDL_JoystickNumAxes(sdlJoystick);
buttonCount = SDL_JoystickNumButtons(sdlJoystick); buttonCount = SDL_JoystickNumButtons(sdlJoystick);
hatCount = SDL_JoystickNumHats(sdlJoystick); hatCount = SDL_JoystickNumHats(sdlJoystick);
}
SDL_JoystickClose(sdlJoystick); SDL_JoystickClose(sdlJoystick);
qCDebug(JoystickLog) << "\t" << name << "axes:" << axisCount << "buttons:" << buttonCount << "hats:" << hatCount; qCDebug(JoystickLog) << "\t" << name << "axes:" << axisCount << "buttons:" << buttonCount << "hats:" << hatCount;
ret[name] = new JoystickSDL(name, axisCount, buttonCount, hatCount, i, _multiVehicleManager); ret[name] = new JoystickSDL(name, axisCount, buttonCount, hatCount, i, isGameController, _multiVehicleManager);
} else { } else {
qCDebug(JoystickLog) << "\tSkipping duplicate" << name; qCDebug(JoystickLog) << "\tSkipping duplicate" << name;
} }
...@@ -52,8 +57,28 @@ QMap<QString, Joystick*> JoystickSDL::discover(MultiVehicleManager* _multiVehicl ...@@ -52,8 +57,28 @@ QMap<QString, Joystick*> JoystickSDL::discover(MultiVehicleManager* _multiVehicl
return ret; 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) { bool JoystickSDL::_open(void) {
if ( _isGameController ) {
sdlController = SDL_GameControllerOpen(_index);
sdlJoystick = SDL_GameControllerGetJoystick(sdlController);
} else {
sdlJoystick = SDL_JoystickOpen(_index); sdlJoystick = SDL_JoystickOpen(_index);
}
if (!sdlJoystick) { if (!sdlJoystick) {
qCWarning(JoystickLog) << "SDL_JoystickOpen failed:" << SDL_GetError(); qCWarning(JoystickLog) << "SDL_JoystickOpen failed:" << SDL_GetError();
...@@ -70,15 +95,24 @@ void JoystickSDL::_close(void) { ...@@ -70,15 +95,24 @@ void JoystickSDL::_close(void) {
bool JoystickSDL::_update(void) bool JoystickSDL::_update(void)
{ {
SDL_JoystickUpdate(); SDL_JoystickUpdate();
SDL_GameControllerUpdate();
return true; return true;
} }
bool JoystickSDL::_getButton(int i) { bool JoystickSDL::_getButton(int i) {
if ( _isGameController ) {
return !!SDL_GameControllerGetButton(sdlController, SDL_GameControllerButton(i));
} else {
return !!SDL_JoystickGetButton(sdlJoystick, i); return !!SDL_JoystickGetButton(sdlJoystick, i);
}
} }
int JoystickSDL::_getAxis(int i) { int JoystickSDL::_getAxis(int i) {
if ( _isGameController ) {
return SDL_GameControllerGetAxis(sdlController, SDL_GameControllerAxis(i));
} else {
return SDL_JoystickGetAxis(sdlJoystick, i); return SDL_JoystickGetAxis(sdlJoystick, i);
}
} }
uint8_t JoystickSDL::_getHat(int hat,int i) { uint8_t JoystickSDL::_getHat(int hat,int i) {
......
...@@ -15,11 +15,13 @@ ...@@ -15,11 +15,13 @@
class JoystickSDL : public Joystick class JoystickSDL : public Joystick
{ {
public: 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<QString, Joystick*> discover(MultiVehicleManager* _multiVehicleManager); static QMap<QString, Joystick*> discover(MultiVehicleManager* _multiVehicleManager);
private: private:
static void _loadGameControllerMappings();
bool _open() final; bool _open() final;
void _close() final; void _close() final;
bool _update() final; bool _update() final;
...@@ -29,6 +31,8 @@ private: ...@@ -29,6 +31,8 @@ private:
uint8_t _getHat(int hat,int i) final; uint8_t _getHat(int hat,int i) final;
SDL_Joystick *sdlJoystick; SDL_Joystick *sdlJoystick;
SDL_GameController *sdlController;
bool _isGameController;
int _index; ///< Index for SDL_JoystickOpen int _index; ///< Index for SDL_JoystickOpen
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment