Mercurial > sdl-ios-xcode
diff src/joystick/beos/SDL_bejoystick.cc @ 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/beos/SDL_bejoystick.cc Thu Apr 26 16:45:43 2001 +0000 @@ -0,0 +1,242 @@ +/* + 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 + +/* This is the system specific header for the SDL joystick API */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <be/support/String.h> +#include <be/device/Joystick.h> + +extern "C" { + +#include "SDL_error.h" +#include "SDL_joystick.h" +#include "SDL_sysjoystick.h" +#include "SDL_joystick_c.h" + + +/* The maximum number of joysticks we'll detect */ +#define MAX_JOYSTICKS 16 + +/* A list of available joysticks */ +static char *SDL_joyport[MAX_JOYSTICKS]; +static char *SDL_joyname[MAX_JOYSTICKS]; + +/* The private structure used to keep track of a joystick */ +struct joystick_hwdata { + BJoystick *stick; + uint8 *new_hats; + int16 *new_axes; +}; + +/* Function to scan the system for joysticks. + * This function should set SDL_numjoysticks to the number of available + * joysticks. Joystick 0 should be the system default joystick. + * It should return 0, or -1 on an unrecoverable fatal error. + */ +int SDL_SYS_JoystickInit(void) +{ + BJoystick joystick; + int numjoysticks; + int i; + int32 nports; + char name[B_OS_NAME_LENGTH]; + + /* Search for attached joysticks */ + nports = joystick.CountDevices(); + numjoysticks = 0; + memset(SDL_joyport, 0, (sizeof SDL_joyport)); + memset(SDL_joyname, 0, (sizeof SDL_joyname)); + for ( i=0; (SDL_numjoysticks < MAX_JOYSTICKS) && (i < nports); ++i ) { + if ( joystick.GetDeviceName(i, name) == B_OK ) { + if ( joystick.Open(name) != B_ERROR ) { + BString stick_name; + joystick.GetControllerName(&stick_name); + SDL_joyport[numjoysticks] = strdup(name); + SDL_joyname[numjoysticks] = + strdup(stick_name.String()); + numjoysticks++; + joystick.Close(); + } + } + } + return(numjoysticks); +} + +/* Function to get the device-dependent name of a joystick */ +const char *SDL_SYS_JoystickName(int index) +{ + return SDL_joyname[index]; +} + +/* 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) +{ + BJoystick *stick; + + /* Create the joystick data structure */ + joystick->hwdata = (struct joystick_hwdata *) + malloc(sizeof(*joystick->hwdata)); + if ( joystick->hwdata == NULL ) { + SDL_OutOfMemory(); + return(-1); + } + memset(joystick->hwdata, 0, sizeof(*joystick->hwdata)); + stick = new BJoystick; + joystick->hwdata->stick = stick; + + /* Open the requested joystick for use */ + if ( stick->Open(SDL_joyport[joystick->index]) == B_ERROR ) { + SDL_SetError("Unable to open joystick"); + SDL_SYS_JoystickClose(joystick); + return(-1); + } + + /* Set the joystick to calibrated mode */ + stick->EnableCalibration(); + + /* Get the number of buttons, hats, and axes on the joystick */ + joystick->nbuttons = stick->CountButtons(); + joystick->naxes = stick->CountAxes(); + joystick->nhats = stick->CountHats(); + + joystick->hwdata->new_axes = (int16 *) + malloc(joystick->naxes*sizeof(int16)); + joystick->hwdata->new_hats = (uint8 *) + malloc(joystick->nhats*sizeof(uint8)); + if ( ! joystick->hwdata->new_hats || ! joystick->hwdata->new_axes ) { + SDL_OutOfMemory(); + SDL_SYS_JoystickClose(joystick); + return(-1); + } + + /* We're done! */ + 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) +{ + static const Uint8 hat_map[9] = { + SDL_HAT_CENTERED, + SDL_HAT_UP, + SDL_HAT_RIGHTUP, + SDL_HAT_RIGHT, + SDL_HAT_RIGHTDOWN, + SDL_HAT_DOWN, + SDL_HAT_LEFTDOWN, + SDL_HAT_LEFT, + SDL_HAT_LEFTUP + }; + const int JITTER = (32768/10); /* 10% jitter threshold (ok?) */ + + BJoystick *stick; + int i, change; + int16 *axes; + uint8 *hats; + uint32 buttons; + + /* Set up data pointers */ + stick = joystick->hwdata->stick; + axes = joystick->hwdata->new_axes; + hats = joystick->hwdata->new_hats; + + /* Get the new joystick state */ + stick->Update(); + stick->GetAxisValues(axes); + stick->GetHatValues(hats); + buttons = stick->ButtonValues(); + + /* Generate axis motion events */ + for ( i=0; i<joystick->naxes; ++i ) { + change = ((int32)axes[i] - joystick->axes[i]); + if ( (change > JITTER) || (change < -JITTER) ) { + SDL_PrivateJoystickAxis(joystick, i, axes[i]); + } + } + + /* Generate hat change events */ + for ( i=0; i<joystick->nhats; ++i ) { + if ( hats[i] != joystick->hats[i] ) { + SDL_PrivateJoystickHat(joystick, i, hat_map[hats[i]]); + } + } + + /* Generate button events */ + for ( i=0; i<joystick->nbuttons; ++i ) { + if ( (buttons&0x01) != joystick->buttons[i] ) { + SDL_PrivateJoystickButton(joystick, i, (buttons&0x01)); + } + buttons >>= 1; + } +} + +/* Function to close a joystick after use */ +void SDL_SYS_JoystickClose(SDL_Joystick *joystick) +{ + if ( joystick->hwdata ) { + joystick->hwdata->stick->Close(); + delete joystick->hwdata->stick; + if ( joystick->hwdata->new_hats ) { + free(joystick->hwdata->new_hats); + } + if ( joystick->hwdata->new_axes ) { + free(joystick->hwdata->new_axes); + } + free(joystick->hwdata); + joystick->hwdata = NULL; + } +} + +/* Function to perform any system-specific joystick related cleanup */ +void SDL_SYS_JoystickQuit(void) +{ + int i; + + for ( i=0; SDL_joyport[i]; ++i ) { + free(SDL_joyport[i]); + } + SDL_joyport[0] = NULL; + + for ( i=0; SDL_joyname[i]; ++i ) { + free(SDL_joyname[i]); + } + SDL_joyname[0] = NULL; +} + +}; // extern "C"