Added SDL game controller logic to sdl-joystick. Preparing to re-vamp the input module.

This commit is contained in:
Matthew Budd 2020-07-22 22:17:53 -04:00
parent 3d72eed4fa
commit 10b84fa47c
4 changed files with 217 additions and 39 deletions

View File

@ -2,6 +2,7 @@
// //
#include "Qt/GamePadConf.h" #include "Qt/GamePadConf.h"
#include "Qt/main.h" #include "Qt/main.h"
#include "Qt/dface.h"
#include "Qt/input.h" #include "Qt/input.h"
#include "Qt/config.h" #include "Qt/config.h"
#include "Qt/keyscan.h" #include "Qt/keyscan.h"
@ -20,6 +21,8 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
QPushButton *closebutton; QPushButton *closebutton;
QPushButton *clearButton[GAMEPAD_NUM_BUTTONS]; QPushButton *clearButton[GAMEPAD_NUM_BUTTONS];
InitJoysticks();
portNum = 0; portNum = 0;
configNo = 0; configNo = 0;
buttonConfigStatus = 1; buttonConfigStatus = 1;

View File

@ -18,6 +18,8 @@ void SilenceSound(int s); /* DOS and SDL */
int InitJoysticks(void); int InitJoysticks(void);
int KillJoysticks(void); int KillJoysticks(void);
int AddJoystick( int which );
int RemoveJoystick( int which );
uint32 *GetJSOr(void); uint32 *GetJSOr(void);
int InitVideo(FCEUGI *gi); int InitVideo(FCEUGI *gi);

View File

@ -956,6 +956,12 @@ UpdatePhysicalInput ()
g_keyState[ event.key.keysym.scancode ] = (event.type == SDL_KEYDOWN) ? 1 : 0; g_keyState[ event.key.keysym.scancode ] = (event.type == SDL_KEYDOWN) ? 1 : 0;
//checkKeyBoardState( event.key.keysym.scancode ); //checkKeyBoardState( event.key.keysym.scancode );
break; break;
case SDL_JOYDEVICEADDED:
AddJoystick( event.jdevice.which );
break;
case SDL_JOYDEVICEREMOVED:
RemoveJoystick( event.jdevice.which );
break;
default: default:
break; break;
} }
@ -964,8 +970,6 @@ UpdatePhysicalInput ()
} }
static int bcpv=0, bcpj=0;
/** /**
* Begin configuring the buttons by placing the video and joystick * Begin configuring the buttons by placing the video and joystick
* subsystems into a well-known state. Button configuration really * subsystems into a well-known state. Button configuration really
@ -973,13 +977,7 @@ static int bcpv=0, bcpj=0;
*/ */
int ButtonConfigBegin () int ButtonConfigBegin ()
{ {
// shut down the joystick subsystems // initialize the joystick subsystem (if not already inited)
//SDL_Surface *screen;
bcpj = KillJoysticks ();
// XXX soules - why did we shut this down?
// initialize the joystick subsystem
InitJoysticks (); InitJoysticks ();
buttonConfigInProgress = 1; buttonConfigInProgress = 1;
@ -995,18 +993,6 @@ int ButtonConfigBegin ()
void void
ButtonConfigEnd () ButtonConfigEnd ()
{ {
// shutdown the joystick and video subsystems
KillJoysticks ();
//SDL_QuitSubSystem(SDL_INIT_VIDEO);
// re-initialize joystick and video subsystems if they were active before
/*if(!bcpv) {
InitVideo(GameInfo);
} */
if (!bcpj)
{
InitJoysticks ();
}
buttonConfigInProgress = 0; buttonConfigInProgress = 0;
} }

View File

@ -30,7 +30,86 @@
#include <cerrno> #include <cerrno>
#define MAX_JOYSTICKS 32 #define MAX_JOYSTICKS 32
static SDL_Joystick *s_Joysticks[MAX_JOYSTICKS] = {NULL}; struct jsDev_t
{
SDL_Joystick *js;
SDL_GameController *gc;
jsDev_t(void)
{
js = NULL;
gc = NULL;
};
//~jsDev_t(void)
//{
// if ( js )
// {
// SDL_JoystickClose( js ); js = NULL;
// }
// if ( gc )
// {
// SDL_GameControllerClose( gc ); gc = NULL;
// }
//}
int close(void)
{
if ( js )
{
SDL_JoystickClose( js ); js = NULL;
}
if ( gc )
{
SDL_GameControllerClose( gc ); gc = NULL;
}
return 0;
}
SDL_Joystick *getJS(void)
{
if ( gc != NULL )
{
return SDL_GameControllerGetJoystick( gc );
}
return js;
}
bool isGameController(void)
{
return ( gc != NULL );
}
bool inUse(void)
{
return ( (js != NULL) || (gc != NULL) );
}
void print(void)
{
char guidStr[64];
SDL_JoystickGUID guid = SDL_JoystickGetGUID( getJS() );
SDL_JoystickGetGUIDString( guid, guidStr, sizeof(guidStr) );
printf("JoyStickID: %i: '%s' \n",
SDL_JoystickInstanceID( getJS() ), SDL_JoystickName( getJS() ) );
printf("GUID: %s \n", guidStr );
printf("NumAxes: %i \n", SDL_JoystickNumAxes(getJS()) );
printf("NumButtons: %i \n", SDL_JoystickNumButtons(getJS()) );
printf("NumHats: %i \n", SDL_JoystickNumHats(getJS()) );
if ( gc )
{
printf("GameController Name: '%s'\n", SDL_GameControllerName(gc) );
printf("GameController Mapping: %s\n", SDL_GameControllerMapping(gc) );
}
}
};
static jsDev_t jsDev[ MAX_JOYSTICKS ];
//static SDL_Joystick *s_Joysticks[MAX_JOYSTICKS] = {NULL};
static int s_jinited = 0; static int s_jinited = 0;
@ -42,6 +121,7 @@ int
DTestButtonJoy(ButtConfig *bc) DTestButtonJoy(ButtConfig *bc)
{ {
int x; int x;
SDL_Joystick *js;
for(x = 0; x < bc->NumC; x++) for(x = 0; x < bc->NumC; x++)
{ {
@ -49,10 +129,12 @@ DTestButtonJoy(ButtConfig *bc)
{ {
continue; continue;
} }
js = jsDev[bc->DeviceNum[x]].getJS();
if (bc->ButtonNum[x] & 0x2000) if (bc->ButtonNum[x] & 0x2000)
{ {
/* Hat "button" */ /* Hat "button" */
if(SDL_JoystickGetHat(s_Joysticks[bc->DeviceNum[x]], if(SDL_JoystickGetHat( js,
((bc->ButtonNum[x] >> 8) & 0x1F)) & ((bc->ButtonNum[x] >> 8) & 0x1F)) &
(bc->ButtonNum[x]&0xFF)) (bc->ButtonNum[x]&0xFF))
return 1; return 1;
@ -61,7 +143,7 @@ DTestButtonJoy(ButtConfig *bc)
{ {
/* Axis "button" */ /* Axis "button" */
int pos; int pos;
pos = SDL_JoystickGetAxis(s_Joysticks[bc->DeviceNum[x]], pos = SDL_JoystickGetAxis( js,
bc->ButtonNum[x] & 16383); bc->ButtonNum[x] & 16383);
if ((bc->ButtonNum[x] & 0x4000) && pos <= -16383) { if ((bc->ButtonNum[x] & 0x4000) && pos <= -16383) {
return 1; return 1;
@ -69,18 +151,39 @@ DTestButtonJoy(ButtConfig *bc)
return 1; return 1;
} }
} }
else if(SDL_JoystickGetButton(s_Joysticks[bc->DeviceNum[x]], else if(SDL_JoystickGetButton( js,
bc->ButtonNum[x])) bc->ButtonNum[x]))
return 1; return 1;
} }
return 0; return 0;
} }
//static void printJoystick( SDL_Joystick *js )
//{
// char guidStr[64];
// SDL_Joystick *js;
//
// js = jsDev[i].getJS();
//
// SDL_JoystickGUID guid = SDL_JoystickGetGUID( js );
//
// SDL_JoystickGetGUIDString( guid, guidStr, sizeof(guidStr) );
//
// printf("JoyStickID: %i: %s \n",
// SDL_JoystickInstanceID( js ), SDL_JoystickName( js ) );
// printf("GUID: %s \n", guidStr );
// printf("NumAxes: %i \n", SDL_JoystickNumAxes(js) );
// printf("NumButtons: %i \n", SDL_JoystickNumButtons(js) );
// printf("NumHats: %i \n", SDL_JoystickNumHats(js) );
//
//}
/** /**
* Shutdown the SDL joystick subsystem. * Shutdown the SDL joystick subsystem.
*/ */
int int
KillJoysticks() KillJoysticks(void)
{ {
int n; /* joystick index */ int n; /* joystick index */
@ -88,38 +191,122 @@ KillJoysticks()
return -1; return -1;
} }
for(n = 0; n < MAX_JOYSTICKS; n++) { for (n = 0; n < MAX_JOYSTICKS; n++)
if (s_Joysticks[n] != 0) { {
SDL_JoystickClose(s_Joysticks[n]); jsDev[n].close();
}
s_Joysticks[n]=0;
} }
SDL_QuitSubSystem(SDL_INIT_JOYSTICK); SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
return 0; return 0;
} }
int AddJoystick( int which )
{
if ( jsDev[ which ].inUse() )
{
//printf("Error: Joystick already exists at device index %i \n", which );
return -1;
}
else
{
if ( SDL_IsGameController(which) )
{
jsDev[which].gc = SDL_GameControllerOpen(which);
if ( jsDev[which].gc == NULL )
{
printf("Could not open game controller %d: %s.\n",
which, SDL_GetError());
}
else
{
printf("Added Joystick: %i \n", which );
jsDev[which].print();
//printJoystick( s_Joysticks[which] );
}
}
else
{
jsDev[which].js = SDL_JoystickOpen(which);
if ( jsDev[which].js == NULL )
{
printf("Could not open joystick %d: %s.\n",
which, SDL_GetError());
}
else
{
printf("Added Joystick: %i \n", which );
jsDev[which].print();
//printJoystick( s_Joysticks[which] );
}
}
}
return 0;
}
int RemoveJoystick( int which )
{
//printf("Remove Joystick: %i \n", which );
for (int i=0; i<MAX_JOYSTICKS; i++)
{
if ( jsDev[i].inUse() )
{
if ( SDL_JoystickInstanceID( jsDev[i].getJS() ) == which )
{
printf("Remove Joystick: %i \n", which );
jsDev[i].close();
return 0;
}
}
}
return -1;
}
/** /**
* Initialize the SDL joystick subsystem. * Initialize the SDL joystick subsystem.
*/ */
int int
InitJoysticks() InitJoysticks(void)
{ {
int n; /* joystick index */ int n; /* joystick index */
int total; int total;
if (s_jinited) {
return 1;
}
SDL_InitSubSystem(SDL_INIT_JOYSTICK); SDL_InitSubSystem(SDL_INIT_JOYSTICK);
total = SDL_NumJoysticks(); total = SDL_NumJoysticks();
if(total>MAX_JOYSTICKS) { if (total > MAX_JOYSTICKS)
{
total = MAX_JOYSTICKS; total = MAX_JOYSTICKS;
} }
for(n = 0; n < total; n++) { for (n = 0; n < total; n++)
{
/* Open the joystick under SDL. */ /* Open the joystick under SDL. */
s_Joysticks[n] = SDL_JoystickOpen(n); AddJoystick(n);
//if ( SDL_IsGameController(n) )
//{
// SDL_GameController *gc = SDL_GameControllerOpen(n);
// printf("Is Game Controller: %i \n", n);
// printf("Mapping: %s \n", SDL_GameControllerMapping(gc) );
//}
// s_Joysticks[n] = SDL_JoystickOpen(n);
//if ( s_Joysticks[n] == NULL )
//{
// printf("Could not open joystick %d: %s.\n", // printf("Could not open joystick %d: %s.\n",
//joy[n] - 1, SDL_GetError()); // n, SDL_GetError());
continue; //}
//else
//{
// printf("Opened JS %i: \n", SDL_JoystickInstanceID( s_Joysticks[n] ) );
// jsDev[which].print();
// //printJoystick( s_Joysticks[n] );
//}
} }
s_jinited = 1; s_jinited = 1;