Mercurial > sdl-ios-xcode
diff src/joystick/macos/SDL_sysjoystick.c @ 0:74212992fb08
Initial revision
author | Sam Lantinga <slouken@lokigames.com> |
---|---|
date | Thu, 26 Apr 2001 16:45:43 +0000 |
parents | |
children | e8157fcb3114 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/joystick/macos/SDL_sysjoystick.c Thu Apr 26 16:45:43 2001 +0000 @@ -0,0 +1,322 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@devolution.com +*/ + +#ifdef SAVE_RCSID +static char rcsid = + "@(#) $Id$"; +#endif + +/* SDL stuff -- "SDL_sysjoystick.c" + MacOS joystick functions by Frederick Reitberger + + The code that follows is meant for SDL. Use at your own risk. +*/ + +#include <string.h> + +#include <InputSprocket.h> + +#include "SDL_error.h" +#include "SDL_joystick.h" +#include "SDL_sysjoystick.h" +#include "SDL_joystick_c.h" + + +/* The max number of joysticks we will detect */ +#define MAX_JOYSTICKS 16 +/* Limit ourselves to 32 elements per device */ +#define kMaxReferences 32 + +#define ISpSymmetricAxisToFloat(axis) ((((float) axis) - kISpAxisMiddle) / (kISpAxisMaximum-kISpAxisMiddle)) +#define ISpAsymmetricAxisToFloat(axis) (((float) axis) / (kISpAxisMaximum)) + + +static ISpDeviceReference SYS_Joysticks[MAX_JOYSTICKS]; +static ISpElementListReference SYS_Elements[MAX_JOYSTICKS]; +static ISpDeviceDefinition SYS_DevDef[MAX_JOYSTICKS]; + +struct joystick_hwdata +{ + char name[64]; +/* Uint8 id;*/ + ISpElementReference refs[kMaxReferences]; + /* gonna need some sort of mapping info */ +}; + + +/* Function to scan the system for joysticks. + * Joystick 0 should be the system default joystick. + * This function should return the number of available joysticks, or -1 + * on an unrecoverable fatal error. + */ +int SDL_SYS_JoystickInit(void) +{ + static ISpDeviceClass classes[4] = { + kISpDeviceClass_Joystick, + kISpDeviceClass_Gamepad, + kISpDeviceClass_Wheel, + 0 + }; + OSErr err; + int i; + UInt32 count, numJoysticks; + + if ( (Ptr)0 == (Ptr)ISpStartup ) { + SDL_SetError("InputSprocket not installed"); + return -1; // InputSprocket not installed + } + + if( (Ptr)0 == (Ptr)ISpGetVersion ) { + SDL_SetError("InputSprocket not version 1.1 or newer"); + return -1; // old version of ISp (not at least 1.1) + } + + ISpStartup(); + + /* Get all the joysticks */ + numJoysticks = 0; + for ( i=0; classes[i]; ++i ) { + count = 0; + err = ISpDevices_ExtractByClass( + classes[i], + MAX_JOYSTICKS-numJoysticks, + &count, + &SYS_Joysticks[numJoysticks]); + numJoysticks += count; + } + + for(i = 0; i < numJoysticks; i++) + { + ISpDevice_GetDefinition( + SYS_Joysticks[i], sizeof(ISpDeviceDefinition), + &SYS_DevDef[i]); + + err = ISpElementList_New( + 0, NULL, + &SYS_Elements[i], 0); + + if (err) { + SDL_OutOfMemory(); + return -1; + } + + ISpDevice_GetElementList( + SYS_Joysticks[i], + &SYS_Elements[i]); + } + + ISpDevices_Deactivate(numJoysticks, SYS_Joysticks); + + return numJoysticks; +} + +/* Function to get the device-dependent name of a joystick */ +const char *SDL_SYS_JoystickName(int index) +{ + static char name[64]; + int len; + + /* convert pascal string to c-string */ + len = SYS_DevDef[index].deviceName[0]; + if ( len >= sizeof(name) ) { + len = (sizeof(name) - 1); + } + memcpy(name, &SYS_DevDef[index].deviceName[1], len); + name[len] = '\0'; + + return name; +} + +/* Function to open a joystick for use. + The joystick to open is specified by the index field of the joystick. + This should fill the nbuttons and naxes fields of the joystick structure. + It returns 0, or -1 if there is an error. + */ +int SDL_SYS_JoystickOpen(SDL_Joystick *joystick) +{ + int index; + UInt32 count, gotCount, count2; + long numAxis, numButtons, numHats, numBalls; + + count = kMaxReferences; + count2 = 0; + numAxis = numButtons = numHats = numBalls = 0; + + index = joystick->index; + + /* allocate memory for system specific hardware data */ + joystick->hwdata = (struct joystick_hwdata *) malloc(sizeof(*joystick->hwdata)); + if (joystick->hwdata == NULL) + { + SDL_OutOfMemory(); + return(-1); + } + memset(joystick->hwdata, 0, sizeof(*joystick->hwdata)); + strcpy(joystick->hwdata->name, SDL_SYS_JoystickName(index)); + joystick->name = joystick->hwdata->name; + + ISpElementList_ExtractByKind( + SYS_Elements[index], + kISpElementKind_Axis, + count, + &gotCount, + joystick->hwdata->refs); + + numAxis = gotCount; + count -= gotCount; + count2 += gotCount; + + ISpElementList_ExtractByKind( + SYS_Elements[index], + kISpElementKind_DPad, + count, + &gotCount, + &(joystick->hwdata->refs[count2])); + + numHats = gotCount; + count -= gotCount; + count2 += gotCount; + + ISpElementList_ExtractByKind( + SYS_Elements[index], + kISpElementKind_Button, + count, + &gotCount, + &(joystick->hwdata->refs[count2])); + + numButtons = gotCount; + count -= gotCount; + count2 += gotCount; + + joystick->naxes = numAxis; + joystick->nhats = numHats; + joystick->nballs = numBalls; + joystick->nbuttons = numButtons; + + ISpDevices_Activate( + 1, + &SYS_Joysticks[index]); + + return 0; +} + +/* Function to update the state of a joystick - called as a device poll. + * This function shouldn't update the joystick structure directly, + * but instead should call SDL_PrivateJoystick*() to deliver events + * and update joystick device state. + */ +void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick) +{ + int i, j; + ISpAxisData a; + ISpDPadData b; + //ISpDeltaData c; + ISpButtonData d; + + for(i = 0, j = 0; i < joystick->naxes; i++, j++) + { + Sint16 value; + + ISpElement_GetSimpleState( + joystick->hwdata->refs[j], + &a); + value = (ISpSymmetricAxisToFloat(a)* 32767.0); + if ( value != joystick->axes[i] ) { + SDL_PrivateJoystickAxis(joystick, i, value); + } + } + + for(i = 0; i < joystick->nhats; i++, j++) + { + Uint8 pos; + + ISpElement_GetSimpleState( + joystick->hwdata->refs[j], + &b); + switch(b) { + case kISpPadIdle: + pos = SDL_HAT_CENTERED; + break; + case kISpPadLeft: + pos = SDL_HAT_LEFT; + break; + case kISpPadUpLeft: + pos = SDL_HAT_LEFTUP; + break; + case kISpPadUp: + pos = SDL_HAT_UP; + break; + case kISpPadUpRight: + pos = SDL_HAT_RIGHTUP; + break; + case kISpPadRight: + pos = SDL_HAT_RIGHT; + break; + case kISpPadDownRight: + pos = SDL_HAT_RIGHTDOWN; + break; + case kISpPadDown: + pos = SDL_HAT_DOWN; + break; + case kISpPadDownLeft: + pos = SDL_HAT_LEFTDOWN; + break; + } + if ( pos != joystick->hats[i] ) { + SDL_PrivateJoystickHat(joystick, i, pos); + } + } + + for(i = 0; i < joystick->nballs; i++, j++) + { + /* ignore balls right now */ + } + + for(i = 0; i < joystick->nbuttons; i++, j++) + { + ISpElement_GetSimpleState( + joystick->hwdata->refs[j], + &d); + if ( d != joystick->buttons[i] ) { + SDL_PrivateJoystickButton(joystick, i, d); + } + } +} + +/* Function to close a joystick after use */ +void SDL_SYS_JoystickClose(SDL_Joystick *joystick) +{ + int index; + + index = joystick->index; + + ISpDevices_Deactivate( + 1, + &SYS_Joysticks[index]); +} + +/* Function to perform any system-specific joystick related cleanup */ +void SDL_SYS_JoystickQuit(void) +{ + ISpShutdown(); +} +