X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_joystick.c;h=080b71fb079da301e258f73097c3dd53aa9cb8c7;hb=f075b2126dff4d88bc2811281f0d27e7c0581ab4;hp=1115076b675a429b9baa20790883de6701c46d49;hpb=006650e1dd72e73249d41e2bcea8b1668262a999;p=freeglut diff --git a/src/freeglut_joystick.c b/src/freeglut_joystick.c index 1115076..080b71f 100644 --- a/src/freeglut_joystick.c +++ b/src/freeglut_joystick.c @@ -31,16 +31,11 @@ * 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" @@ -65,18 +60,25 @@ # 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 +# if HAVE_ERRNO_H +# include +# endif # 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 +95,7 @@ # define JS_RETURN (sizeof(struct JS_DATA_TYPE)) # endif -# include -# include -# include - # if defined(__linux__) -# include # include /* check the joystick driver version */ @@ -241,8 +238,7 @@ static int fghJoystickFindUSBdev(char *name, char *out, int outlen) return 1; } else if (errno == EACCES) { if (!protection_warned) { - fprintf(stderr, "Can't open %s for read!\n", - buf); + fgWarning ( "Can't open %s for read!", buf ); protection_warned = 1; } } @@ -263,7 +259,7 @@ static int fghJoystickInitializeHID(struct os_specific_s *os, if ( ( rd = hid_get_report_desc( os->fd ) ) == 0 ) { - fprintf( stderr, "error: %s: %s", os->fname, strerror( errno ) ); + fgWarning ( "error: %s: %s", os->fname, strerror( errno ) ); return FALSE; } @@ -273,8 +269,7 @@ static int fghJoystickInitializeHID(struct os_specific_s *os, if( ioctl( os->fd, USB_GET_REPORT_ID, &report_id ) < 0) { /*** XXX {report_id} may not be the right variable? ***/ - fprintf( stderr, "error: %s%d: %s", - UHIDDEV, report_id, strerror( errno ) ); + fgWarning ( "error: %s%d: %s", UHIDDEV, report_id, strerror( errno ) ); return FALSE; } @@ -452,7 +447,6 @@ static void fghJoystickAddHatElement ( SFG_Joystick* joy, CFDictionaryRef hat ); * The static joystick structure pointer */ #define MAX_NUM_JOYSTICKS 2 -static int fgNumberOfJoysticks = 0; static SFG_Joystick *fgJoystick [ MAX_NUM_JOYSTICKS ]; @@ -724,7 +718,7 @@ static void fghJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes ) break; default: - fgWarning ( "%s", "PLIB_JS: Unrecognised /dev/js return!?!" ); + fgWarning ( "PLIB_JS: Unrecognised /dev/js return!?!" ); /* use the old values */ @@ -851,7 +845,7 @@ static int fghJoystickFindDevices ( SFG_Joystick *joy, mach_port_t masterPort ) rv = IOServiceGetMatchingServices(masterPort, hidMatch, &hidIterator); if (rv != kIOReturnSuccess || !hidIterator) { - fgWarning( "%s", "no joystick (HID) devices found" ); + fgWarning( "no joystick (HID) devices found" ); return; } @@ -894,13 +888,13 @@ static CFDictionaryRef fghJoystickGetCFProperties ( SFG_Joystick *joy, io_object rv = IORegistryEntryGetParentEntry (ioDev, kIOServicePlane, &parent1); if (rv != kIOReturnSuccess) { - fgWarning ( "%s", "error getting device entry parent"); + fgWarning ( "error getting device entry parent"); return NULL; } rv = IORegistryEntryGetParentEntry (parent1, kIOServicePlane, &parent2); if (rv != kIOReturnSuccess) { - fgWarning ( "%s", "error getting device entry parent 2"); + fgWarning ( "error getting device entry parent 2"); return NULL; } #endif @@ -908,7 +902,7 @@ static CFDictionaryRef fghJoystickGetCFProperties ( SFG_Joystick *joy, io_object rv = IORegistryEntryCreateCFProperties( ioDev /*parent2*/, &cfProperties, kCFAllocatorDefault, kNilOptions); if (rv != kIOReturnSuccess || !cfProperties) { - fgWarning ( "%s", "error getting device properties"); + fgWarning ( "error getting device properties"); return NULL; } @@ -928,7 +922,9 @@ 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, @@ -946,7 +942,7 @@ static void fghJoystickParseElement ( SFG_Joystick *joy, CFDictionaryRef element CFDictionaryGetValue ((CFDictionaryRef) element, CFSTR(kIOHIDElementTypeKey)), kCFNumberLongType, &type); - switch ( typ e) { + switch ( type ) { case kIOHIDElementTypeInput_Misc: case kIOHIDElementTypeInput_Axis: case kIOHIDElementTypeInput_Button: @@ -974,14 +970,14 @@ static void fghJoystickParseElement ( SFG_Joystick *joy, CFDictionaryRef element break; default: - printf("input type element has weird usage (%x)\n", usage); + fgWarning ( "input type element has weird usage (%x)", usage); break; } } else if (page == kHIDPage_Button) { printf(" button\n"); fghJoystickAddButtonElement((CFDictionaryRef) element); } else - printf("input type element has weird page (%x)\n", page); + fgWarning ( "input type element has weird page (%x)", page); break; case kIOHIDElementTypeCollection: @@ -1239,7 +1235,7 @@ static void fghJoystickOpen( SFG_Joystick* joy ) #if TARGET_HOST_MAC_OSX if( joy->id >= numDevices ) { - fgWarning( "%s", "device index out of range in fgJoystickOpen()" ); + fgWarning( "device index out of range in fgJoystickOpen()" ); return; } @@ -1251,7 +1247,7 @@ static void fghJoystickOpen( SFG_Joystick* joy ) if( rv != kIOReturnSuccess ) { - fgWarning( "%s", "error creating plugin for io device" ); + fgWarning( "error creating plugin for io device" ); return; } @@ -1262,7 +1258,7 @@ static void fghJoystickOpen( SFG_Joystick* joy ) ); if( pluginResult != S_OK ) - fgWarning ( "%s", "QI-ing IO plugin to HID Device interface failed" ); + fgWarning ( "QI-ing IO plugin to HID Device interface failed" ); ( *plugin )->Release( plugin ); /* don't leak a ref */ if( joy->hidDev == NULL ) @@ -1358,7 +1354,7 @@ static void fghJoystickOpen( SFG_Joystick* joy ) joy->os->fd = open( joy->os->fname, O_RDONLY | O_NONBLOCK); if( joy->os->fd < 0 && errno == EACCES ) - fgWarning ( "%s exists but is not readable by you\n", joy->os->fname ); + fgWarning ( "%s exists but is not readable by you", joy->os->fname ); joy->error =( joy->os->fd < 0 ); @@ -1530,13 +1526,13 @@ static void fghJoystickOpen( SFG_Joystick* joy ) /* * This function replaces the constructor method in the JS library. */ -void fgJoystickInit( int ident ) +static void fghJoystickInit( int ident ) { if( ident >= MAX_NUM_JOYSTICKS ) - fgError( "Too large a joystick number" ); + fgError( "Too large a joystick number: %d", ident ); if( fgJoystick[ ident ] ) - fgError( "illegal attempt to initialize joystick device" ); + fgError( "illegal attempt to initialize joystick device again" ); fgJoystick[ ident ] = ( SFG_Joystick * )calloc( sizeof( SFG_Joystick ), 1 ); @@ -1566,7 +1562,7 @@ void fgJoystickInit( int ident ) IOReturn rv = IOMasterPort( bootstrap_port, &masterPort ); if( rv != kIOReturnSuccess ) { - fgWarning( "%s", "error getting master Mach port" ); + fgWarning( "error getting master Mach port" ); return; } fghJoystickFindDevices( masterPort ); @@ -1589,7 +1585,7 @@ void fgJoystickInit( int ident ) !CFStringGetCString( ( CFStringRef )ref, name, 128, CFStringGetSystemEncoding( ) ) ) { - fgWarning( "%s", "error getting device name" ); + fgWarning( "error getting device name" ); name[ 0 ] = '\0'; } #endif @@ -1641,6 +1637,22 @@ void fgJoystickInit( int ident ) } /* + * Try initializing all the joysticks (well, both of them) + */ +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 ); + + fgState.JoysticksInitialised = GL_TRUE; + } +} + +/* * */ void fgJoystickClose( void ) @@ -1724,63 +1736,102 @@ void fgJoystickPollWindow( SFG_Window* window ) } /* - * PWO: These jsJoystick class methods have not been implemented. + * Implementation for glutDeviceGet(GLUT_HAS_JOYSTICK) + */ +int fgJoystickDetect( void ) +{ + int ident; + + fgInitialiseJoysticks (); + + if ( !fgJoystick ) + return 0; + + if ( !fgState.JoysticksInitialised ) + return 0; + + for( ident=0; identerror ) + return 1; + + return 0; +} + +/* + * Joystick information functions */ 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 ) ); }