@ -3,9 +3,11 @@
@@ -3,9 +3,11 @@
# include "QGCApplication.h"
# 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 )
, _isGameController ( isGameController )
, _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 ) {
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 ( ) ;
return ret ;
}
_loadGameControllerMappings ( ) ;
// Load 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 + + ) {
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 ) ) {
int axisCount , buttonCount , hatCount ;
bool isGameController ;
SDL_Joystick * sdlJoystick = SDL_JoystickOpen ( i ) ;
axisCount = SDL_JoystickNumAxes ( sdlJoystick ) ;
buttonCount = SDL_JoystickNumButtons ( sdlJoystick ) ;
hatCount = SDL_JoystickNumHats ( sdlJoystick ) ;
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 ) ;
buttonCount = SDL_JoystickNumButtons ( sdlJoystick ) ;
hatCount = SDL_JoystickNumHats ( sdlJoystick ) ;
}
SDL_JoystickClose ( sdlJoystick ) ;
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 {
qCDebug ( JoystickLog ) < < " \t Skipping 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 ;
}
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) {
@@ -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 ) {