X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_joystick.c;h=b6fcdbce42dd303805768cd8889990cd09a346e5;hb=09070646b28804f0a700bd10b6caf8d606712d2c;hp=185ef1bf35f21e4fc5b8c7444c50116d89715223;hpb=f5bee040bbdedfec9c90fd211d302962bfd3aab9;p=freeglut diff --git a/src/freeglut_joystick.c b/src/freeglut_joystick.c index 185ef1b..b6fcdbc 100644 --- a/src/freeglut_joystick.c +++ b/src/freeglut_joystick.c @@ -31,23 +31,21 @@ * Many thanks for Steve Baker for permission to pull from that library. */ -#if defined( __FreeBSD__ ) || defined( __NetBSD__ ) -# include -#endif - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - #include #include "freeglut_internal.h" +#if HAVE_SYS_PARAM_H +# include +#endif /* * Initial defines from "js.h" starting around line 33 with the existing "freeglut_joystick.c" * interspersed */ -#define _JS_MAX_BUTTONS 32 +/* XXX It might be better to poll the operating system for the numbers of buttons and + * XXX axes and then dynamically allocate the arrays. + */ +#define _JS_MAX_BUTTONS 32 #if TARGET_HOST_MACINTOSH # define _JS_MAX_AXES 9 @@ -65,18 +63,23 @@ # define _JS_MAX_AXES 8 # include # include -# include # include #endif #if TARGET_HOST_UNIX_X11 # define _JS_MAX_AXES 16 +# if HAVE_SYS_IOCTL_H +# include +# endif +# if HAVE_FCNTL_H +# include +# endif +# include # if defined(__FreeBSD__) || defined(__NetBSD__) /* XXX The below hack is done until freeglut's autoconf is updated. */ # define HAVE_USB_JS 1 -# include # if defined(__FreeBSD__) && __FreeBSD_version >= 500000 # include # else @@ -93,12 +96,7 @@ # define JS_RETURN (sizeof(struct JS_DATA_TYPE)) # endif -# include -# include -# include - # if defined(__linux__) -# include # include /* check the joystick driver version */ @@ -438,7 +436,6 @@ static CFDictionaryRef fghJoystickGetCFProperties ( SFG_Joystick* joy, io_object static void fghJoystickEnumerateElements ( SFG_Joystick* joy, CFTypeRef element ); /* callback for CFArrayApply */ static void fghJoystickElementEnumerator ( SFG_Joystick* joy, void *element, void* vjs ); -static void fghJoystickParseElement ( SFG_Joystick* joy, CFDictionaryRef element ); static void fghJoystickAddAxisElement ( SFG_Joystick* joy, CFDictionaryRef axis ); static void fghJoystickAddButtonElement ( SFG_Joystick* joy, CFDictionaryRef button ); @@ -925,73 +922,15 @@ static void fghJoystickElementEnumerator ( SFG_Joystick *joy, void *element, voi /** element enumerator function : pass NULL for top-level*/ static void fghJoystickEnumerateElements ( SFG_Joystick *joy, CFTypeRef element ) { - assert(CFGetTypeID(element) == CFArrayGetTypeID()); + FREEGLUT_INTERNAL_ERROR_EXIT( (CFGetTypeID(element) == CFArrayGetTypeID(), + "Joystick element type mismatch", + "fghJoystickEnumerateElements" ); CFRange range = {0, CFArrayGetCount ((CFArrayRef)element)}; CFArrayApplyFunction((CFArrayRef) element, range, &fghJoystickElementEnumerator, joy ); } -static void fghJoystickParseElement ( SFG_Joystick *joy, CFDictionaryRef element ) -{ - CFTypeRef refPage = CFDictionaryGetValue ((CFDictionaryRef) element, CFSTR(kIOHIDElementUsagePageKey)); - CFTypeRef refUsage = CFDictionaryGetValue ((CFDictionaryRef) element, CFSTR(kIOHIDElementUsageKey)); - - long type, page, usage; - - CFNumberGetValue((CFNumberRef) - CFDictionaryGetValue ((CFDictionaryRef) element, CFSTR(kIOHIDElementTypeKey)), - kCFNumberLongType, &type); - - switch ( typ e) { - case kIOHIDElementTypeInput_Misc: - case kIOHIDElementTypeInput_Axis: - case kIOHIDElementTypeInput_Button: - printf("got input element..."); - CFNumberGetValue( (CFNumberRef) refUsage, kCFNumberLongType, &usage ); - CFNumberGetValue( (CFNumberRef) refPage, kCFNumberLongType, &page ); - - if (page == kHIDPage_GenericDesktop) { - switch ( usage ) /* look at usage to determine function */ - { - case kHIDUsage_GD_X: - case kHIDUsage_GD_Y: - case kHIDUsage_GD_Z: - case kHIDUsage_GD_Rx: - case kHIDUsage_GD_Ry: - case kHIDUsage_GD_Rz: - case kHIDUsage_GD_Slider: /* for throttle / trim controls */ - printf(" axis\n"); - fghJoystickAddAxisElement((CFDictionaryRef) element); - break; - - case kHIDUsage_GD_Hatswitch: - printf(" hat\n"); - fghJoystickAddHatElement((CFDictionaryRef) element); - break; - - default: - fgWarning ( "input type element has weird usage (%x)", usage); - break; - } - } else if (page == kHIDPage_Button) { - printf(" button\n"); - fghJoystickAddButtonElement((CFDictionaryRef) element); - } else - fgWarning ( "input type element has weird page (%x)", page); - break; - - case kIOHIDElementTypeCollection: - fghJoystickEnumerateElements ( - CFDictionaryGetValue ( element, CFSTR(kIOHIDElementKey) ) - ); - break; - - default: - break; - } -} - static void fghJoystickAddAxisElement ( SFG_Joystick *joy, CFDictionaryRef axis ) { long cookie, lmin, lmax; @@ -1642,15 +1581,14 @@ static void fghJoystickInit( int ident ) */ void fgInitialiseJoysticks ( void ) { - /* Initialization courtesy of OpenGLUT -- do we want it? */ - if( !fgState.JoysticksInitialised ) - { - int ident ; - for ( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ ) - fghJoystickInit( ident ); + if( !fgState.JoysticksInitialised ) + { + int ident ; + for ( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ ) + fghJoystickInit( ident ); - fgState.JoysticksInitialised = GL_TRUE; - } + fgState.JoysticksInitialised = GL_TRUE; + } } /* @@ -1741,21 +1679,21 @@ void fgJoystickPollWindow( SFG_Window* window ) */ int fgJoystickDetect( void ) { - int ident; + int ident; - fgInitialiseJoysticks (); + fgInitialiseJoysticks (); - if ( !fgJoystick ) - return 0; + if ( !fgJoystick ) + return 0; - if ( !fgState.JoysticksInitialised ) - return 0; + if ( !fgState.JoysticksInitialised ) + return 0; - for( ident=0; identerror ) - return 1; + for( ident=0; identerror ) + return 1; - return 0; + return 0; } /* @@ -1763,63 +1701,76 @@ int fgJoystickDetect( void ) */ int glutJoystickGetNumAxes( int ident ) { + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetNumAxes" ); return fgJoystick[ ident ]->num_axes; } int glutJoystickGetNumButtons( int ident ) { + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetNumButtons" ); return fgJoystick[ ident ]->num_buttons; } int glutJoystickNotWorking( int ident ) { + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickNotWorking" ); return fgJoystick[ ident ]->error; } float glutJoystickGetDeadBand( int ident, int axis ) { + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetDeadBand" ); return fgJoystick[ ident ]->dead_band [ axis ]; } void glutJoystickSetDeadBand( int ident, int axis, float db ) { + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetDeadBand" ); fgJoystick[ ident ]->dead_band[ axis ] = db; } float glutJoystickGetSaturation( int ident, int axis ) { + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetSaturation" ); return fgJoystick[ ident ]->saturate[ axis ]; } void glutJoystickSetSaturation( int ident, int axis, float st ) { + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetSaturation" ); fgJoystick[ ident ]->saturate [ axis ] = st; } void glutJoystickSetMinRange( int ident, float *axes ) { + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetMinRange" ); memcpy( fgJoystick[ ident ]->min, axes, fgJoystick[ ident ]->num_axes * sizeof( float ) ); } void glutJoystickSetMaxRange( int ident, float *axes ) { + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetMaxRange" ); memcpy( fgJoystick[ ident ]->max, axes, fgJoystick[ ident ]->num_axes * sizeof( float ) ); } void glutJoystickSetCenter( int ident, float *axes ) { + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetCenter" ); memcpy( fgJoystick[ ident ]->center, axes, fgJoystick[ ident ]->num_axes * sizeof( float ) ); } void glutJoystickGetMinRange( int ident, float *axes ) { + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetMinRange" ); memcpy( axes, fgJoystick[ ident ]->min, fgJoystick[ ident ]->num_axes * sizeof( float ) ); } void glutJoystickGetMaxRange( int ident, float *axes ) { + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetMaxRange" ); memcpy( axes, fgJoystick[ ident ]->max, fgJoystick[ ident ]->num_axes * sizeof( float ) ); } void glutJoystickGetCenter( int ident, float *axes ) { + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetCenter" ); memcpy( axes, fgJoystick[ ident ]->center, fgJoystick[ ident ]->num_axes * sizeof( float ) ); }