- Added preliminary support for Stelladaptors. The first detected

Stelladaptor will act as the left joystick/paddles 0 and 1/left driving
controller.  The second detected Stelladaptor will act as the right
joystick/paddles 2 and 3/right driving controller.  Any other Stelladaptor
will be ignored.

 - Of course, since I don't actually have my Stelladaptor yet, only the
detection of Stelladaptors is present; the actual functioning is not done
yet (but I expect it will be quite easy to add it).


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@242 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2004-05-06 00:06:20 +00:00
parent ada3f7cf24
commit 861bf5a21a
2 changed files with 132 additions and 44 deletions

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: StellaEvent.hxx,v 1.8 2004-04-27 00:50:51 stephena Exp $ // $Id: StellaEvent.hxx,v 1.9 2004-05-06 00:06:19 stephena Exp $
//============================================================================ //============================================================================
#ifndef STELLAEVENT_HXX #ifndef STELLAEVENT_HXX
@ -28,7 +28,7 @@
by the frontends directly. by the frontends directly.
@author Stephen Anthony @author Stephen Anthony
@version $Id: StellaEvent.hxx,v 1.8 2004-04-27 00:50:51 stephena Exp $ @version $Id: StellaEvent.hxx,v 1.9 2004-05-06 00:06:19 stephena Exp $
*/ */
class StellaEvent class StellaEvent
{ {
@ -79,7 +79,7 @@ class StellaEvent
*/ */
enum JoyStick enum JoyStick
{ {
JSTICK_0, JSTICK_1, JSTICK_2, JSTICK_3, JSTICK_0, JSTICK_1, JSTICK_2, JSTICK_3, JSTICK_4, JSTICK_5,
LastJSTICK LastJSTICK
}; };

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: mainSDL.cxx,v 1.73 2004-04-27 00:50:52 stephena Exp $ // $Id: mainSDL.cxx,v 1.74 2004-05-06 00:06:20 stephena Exp $
//============================================================================ //============================================================================
#include <fstream> #include <fstream>
@ -64,20 +64,32 @@ static uInt32 getTicks();
static bool setupProperties(PropertiesSet& set); static bool setupProperties(PropertiesSet& set);
#ifdef JOYSTICK_SUPPORT #ifdef JOYSTICK_SUPPORT
static SDL_Joystick* theJoysticks[StellaEvent::LastJSTICK];
// static uInt32 thePaddleNumber; // static uInt32 thePaddleNumber;
// Lookup table for joystick numbers and events // Lookup table for joystick numbers and events
StellaEvent::JoyStick joyList[StellaEvent::LastJSTICK] = { StellaEvent::JoyStick joyList[StellaEvent::LastJSTICK] = {
StellaEvent::JSTICK_0, StellaEvent::JSTICK_1, StellaEvent::JSTICK_0, StellaEvent::JSTICK_1, StellaEvent::JSTICK_2,
StellaEvent::JSTICK_2, StellaEvent::JSTICK_3 StellaEvent::JSTICK_3, StellaEvent::JSTICK_5, StellaEvent::JSTICK_5
}; };
StellaEvent::JoyCode joyButtonList[StellaEvent::LastJCODE] = { StellaEvent::JoyCode joyButtonList[StellaEvent::LastJCODE] = {
StellaEvent::JBUTTON_0, StellaEvent::JBUTTON_1, StellaEvent::JBUTTON_2, StellaEvent::JBUTTON_0, StellaEvent::JBUTTON_1, StellaEvent::JBUTTON_2,
StellaEvent::JBUTTON_3, StellaEvent::JBUTTON_4, StellaEvent::JBUTTON_5, StellaEvent::JBUTTON_3, StellaEvent::JBUTTON_4, StellaEvent::JBUTTON_5,
StellaEvent::JBUTTON_6, StellaEvent::JBUTTON_7, StellaEvent::JBUTTON_8, StellaEvent::JBUTTON_6, StellaEvent::JBUTTON_7, StellaEvent::JBUTTON_8,
StellaEvent::JBUTTON_9 StellaEvent::JBUTTON_9, StellaEvent::JBUTTON_10, StellaEvent::JBUTTON_11,
StellaEvent::JBUTTON_12, StellaEvent::JBUTTON_13, StellaEvent::JBUTTON_14,
StellaEvent::JBUTTON_15, StellaEvent::JBUTTON_16, StellaEvent::JBUTTON_17,
StellaEvent::JBUTTON_18, StellaEvent::JBUTTON_19
}; };
enum JoyType { JT_NONE, JT_REGULAR, JT_STELLADAPTOR_1, JT_STELLADAPTOR_2 };
struct Stella_Joystick
{
SDL_Joystick* stick;
JoyType type;
};
static Stella_Joystick theJoysticks[StellaEvent::LastJSTICK];
#endif #endif
// Pointer to the console object or the null pointer // Pointer to the console object or the null pointer
@ -256,9 +268,15 @@ inline uInt32 getTicks()
bool setupJoystick() bool setupJoystick()
{ {
#ifdef JOYSTICK_SUPPORT #ifdef JOYSTICK_SUPPORT
// Keep track of how many Stelladaptors we've found
uInt8 saCount = 0;
// First clear the joystick array // First clear the joystick array
for(uInt32 i = 0; i < StellaEvent::LastJSTICK; i++) for(uInt32 i = 0; i < StellaEvent::LastJSTICK; i++)
theJoysticks[i] = (SDL_Joystick*) NULL; {
theJoysticks[i].stick = (SDL_Joystick*) NULL;
theJoysticks[i].type = JT_NONE;
}
// Initialize the joystick subsystem // Initialize the joystick subsystem
if((SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1) || (SDL_NumJoysticks() <= 0)) if((SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1) || (SDL_NumJoysticks() <= 0))
@ -269,17 +287,50 @@ bool setupJoystick()
return true; return true;
} }
// Try to open as many joysticks as possible (up to 4) // Try to open 4 regular joysticks and 2 Stelladaptor devices
// Let the user decide how to map them
uInt32 limit = SDL_NumJoysticks() <= StellaEvent::LastJSTICK ? uInt32 limit = SDL_NumJoysticks() <= StellaEvent::LastJSTICK ?
SDL_NumJoysticks() : StellaEvent::LastJSTICK; SDL_NumJoysticks() : StellaEvent::LastJSTICK;
for(uInt32 i = 0; i < limit; i++) for(uInt32 i = 0; i < limit; i++)
{ {
theJoysticks[i] = SDL_JoystickOpen(i); string name = SDL_JoystickName(i);
if(theJoysticks[i] != NULL && theShowInfoFlag) theJoysticks[i].stick = SDL_JoystickOpen(i);
// Skip if we couldn't open it for any reason
if(theJoysticks[i].stick == NULL)
continue;
// Figure out what type of joystick this is
if(name.substr(0,12) == "Stelladaptor")
{ {
cout << "Joystick " << i << ": " << SDL_JoystickName(i) saCount++;
<< " with " << SDL_JoystickNumButtons(theJoysticks[i]) << " buttons.\n"; if(saCount > 2) // Ignore more than 2 Stelladaptors
{
theJoysticks[i].type = JT_NONE;
continue;
}
else if(saCount == 1)
{
name = "Left Stelladaptor (Left joystick, Paddles 0 and 1, Left driving controller)";
theJoysticks[i].type = JT_STELLADAPTOR_1;
}
else if(saCount == 2)
{
name = "Right Stelladaptor (Right joystick, Paddles 2 and 3, Right driving controller)";
theJoysticks[i].type = JT_STELLADAPTOR_2;
}
if(theShowInfoFlag)
cout << "Joystick " << i << ": " << name << endl;
}
else
{
theJoysticks[i].type = JT_REGULAR;
if(theShowInfoFlag)
{
cout << "Joystick " << i << ": " << SDL_JoystickName(i)
<< " with " << SDL_JoystickNumButtons(theJoysticks[i].stick)
<< " buttons.\n";
}
} }
} }
#endif #endif
@ -523,41 +574,78 @@ void handleEvents()
Int32 state; Int32 state;
Uint8 axis; Uint8 axis;
Sint16 value; Sint16 value;
JoyType type;
if(event.jbutton.which >= StellaEvent::LastJSTICK) if(event.jbutton.which >= StellaEvent::LastJSTICK)
return; return;
stick = joyList[event.jbutton.which]; stick = joyList[event.jbutton.which];
type = theJoysticks[event.jbutton.which].type;
if((event.type == SDL_JOYBUTTONDOWN) || (event.type == SDL_JOYBUTTONUP)) // Figure put what type of joystick we're dealing with
// Stelladaptors behave differently, and can't be remapped
switch(type)
{ {
if(event.jbutton.button >= StellaEvent::LastJCODE) case JT_REGULAR:
return;
code = joyButtonList[event.jbutton.button]; if((event.type == SDL_JOYBUTTONDOWN) || (event.type == SDL_JOYBUTTONUP))
state = event.jbutton.state == SDL_PRESSED ? 1 : 0; {
if(event.jbutton.button >= StellaEvent::LastJCODE)
return;
theConsole->eventHandler().sendJoyEvent(stick, code, state); code = joyButtonList[event.jbutton.button];
} state = event.jbutton.state == SDL_PRESSED ? 1 : 0;
else if(event.type == SDL_JOYAXISMOTION)
{
axis = event.jaxis.axis;
value = event.jaxis.value;
if(axis == 0) // x-axis theConsole->eventHandler().sendJoyEvent(stick, code, state);
{ }
theConsole->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_LEFT, else if(event.type == SDL_JOYAXISMOTION)
(value < -16384) ? 1 : 0); {
theConsole->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_RIGHT, axis = event.jaxis.axis;
(value > 16384) ? 1 : 0); value = event.jaxis.value;
}
else if(axis == 1) // y-axis if(axis == 0) // x-axis
{ {
theConsole->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_UP, theConsole->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_LEFT,
(value < -16384) ? 1 : 0); (value < -16384) ? 1 : 0);
theConsole->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_DOWN, theConsole->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_RIGHT,
(value > 16384) ? 1 : 0); (value > 16384) ? 1 : 0);
} }
else if(axis == 1) // y-axis
{
theConsole->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_UP,
(value < -16384) ? 1 : 0);
theConsole->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_DOWN,
(value > 16384) ? 1 : 0);
}
}
break; // Regular joystick
case JT_STELLADAPTOR_1:
if((event.type == SDL_JOYBUTTONDOWN) || (event.type == SDL_JOYBUTTONUP))
{
cerr << "Stelladaptor 1 button activated\n";
}
else if(event.type == SDL_JOYAXISMOTION)
{
cerr << "Stelladaptor 1 axis activated\n";
}
break;
case JT_STELLADAPTOR_2:
if((event.type == SDL_JOYBUTTONDOWN) || (event.type == SDL_JOYBUTTONUP))
{
cerr << "Stelladaptor 2 button activated\n";
}
else if(event.type == SDL_JOYAXISMOTION)
{
cerr << "Stelladaptor 2 axis activated\n";
}
break;
default:
break;
} }
#endif #endif
} }
@ -634,7 +722,7 @@ void cleanup()
for(uInt32 i = 0; i < StellaEvent::LastJSTICK; i++) for(uInt32 i = 0; i < StellaEvent::LastJSTICK; i++)
{ {
if(SDL_JoystickOpened(i)) if(SDL_JoystickOpened(i))
SDL_JoystickClose(theJoysticks[i]); SDL_JoystickClose(theJoysticks[i].stick);
} }
#endif #endif