|
|
@ -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 |
|
|
|
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 |
|
|
|
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); |
|
|
|
axisCount = SDL_JoystickNumAxes(sdlJoystick); |
|
|
|
if (SDL_IsGameController(i)) { |
|
|
|
buttonCount = SDL_JoystickNumButtons(sdlJoystick); |
|
|
|
isGameController = true; |
|
|
|
hatCount = SDL_JoystickNumHats(sdlJoystick); |
|
|
|
axisCount = SDL_CONTROLLER_AXIS_MAX; |
|
|
|
|
|
|
|
buttonCount = SDL_CONTROLLER_BUTTON_MAX; |
|
|
|
|
|
|
|
hatCount = 0; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
isGameController = false; |
|
|
|
|
|
|
|
axisCount = SDL_JoystickNumAxes(sdlJoystick); |
|
|
|
|
|
|
|
buttonCount = SDL_JoystickNumButtons(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 |
|
|
|
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) { |
|
|
|
sdlJoystick = SDL_JoystickOpen(_index); |
|
|
|
if ( _isGameController ) { |
|
|
|
|
|
|
|
sdlController = SDL_GameControllerOpen(_index); |
|
|
|
|
|
|
|
sdlJoystick = SDL_GameControllerGetJoystick(sdlController); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
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) { |
|
|
|
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) { |
|
|
|
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) { |
|
|
|
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) { |
|
|
|
uint8_t JoystickSDL::_getHat(int hat,int i) { |
|
|
|