Normalized the style of the new joystick a bit.

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@462 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
rkrolib 2004-02-14 08:51:54 +00:00
parent c03f197329
commit a1547dde81

View File

@ -1126,7 +1126,7 @@ static void fghJoystickOpen( SFG_Joystick* joy )
CFTypeRef topLevelElement; CFTypeRef topLevelElement;
#endif #endif
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
# if defined(__FreeBSD__) || defined(__NetBSD__) # if defined( __FreeBSD__ ) || defined( __NetBSD__ )
char *cp; char *cp;
# endif # endif
# ifdef JS_NEW # ifdef JS_NEW
@ -1136,26 +1136,29 @@ static void fghJoystickOpen( SFG_Joystick* joy )
# endif # endif
#endif #endif
/* Default values (for no joystick -- each conditional will reset the error flag) */ /*
* Default values (for no joystick -- each conditional will reset the
* error flag)
*/
joy->error = TRUE; joy->error = TRUE;
joy->num_axes = joy->num_buttons = 0; joy->num_axes = joy->num_buttons = 0;
joy->name [0] = '\0'; joy->name[ 0 ] = '\0';
#if TARGET_HOST_MACINTOSH #if TARGET_HOST_MACINTOSH
/* /*
* XXX FIXME: get joystick name in Mac * XXX FIXME: get joystick name in Mac
*/ */
err = ISpStartup (); err = ISpStartup( );
if ( err == noErr ) if( err == noErr )
{ {
#define ISP_CHECK_ERR(x) if ( x != noErr ) { joy->error = GL_TRUE; return; } #define ISP_CHECK_ERR(x) if( x != noErr ) { joy->error = GL_TRUE; return; }
joy->error = GL_TRUE; joy->error = GL_TRUE;
/* initialize the needs structure */ /* initialize the needs structure */
ISpNeed temp_isp_needs[isp_num_needs] = ISpNeed temp_isp_needs[ isp_num_needs ] =
{ {
{ "\pX-Axis", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 }, { "\pX-Axis", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 },
{ "\pY-Axis", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 }, { "\pY-Axis", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 },
@ -1201,7 +1204,7 @@ static void fghJoystickOpen( SFG_Joystick* joy )
{ "\pButton 31", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, { "\pButton 31", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
}; };
memcpy ( joy->isp_needs, temp_isp_needs, sizeof(temp_isp_needs) ); memcpy( joy->isp_needs, temp_isp_needs, sizeof (temp_isp_needs ) );
/* next two calls allow keyboard and mouse to emulate other input /* next two calls allow keyboard and mouse to emulate other input
@ -1216,18 +1219,21 @@ static void fghJoystickOpen( SFG_Joystick* joy )
ISP_CHECK_ERR(err) ISP_CHECK_ERR(err)
*/ */
err = ISpElement_NewVirtualFromNeeds ( joy->isp_num_needs, joy->isp_needs, joy->isp_elem, 0 ); err = ISpElement_NewVirtualFromNeeds( joy->isp_num_needs,
ISP_CHECK_ERR(err) joy->isp_needs, joy->isp_elem,
0 );
ISP_CHECK_ERR( err )
err = ISpInit ( joy->isp_num_needs, joy->isp_needs, joy->isp_elem, 'freeglut', nil, 0, 128, 0 ); err = ISpInit( joy->isp_num_needs, joy->isp_needs, joy->isp_elem,
ISP_CHECK_ERR(err) 'freeglut', nil, 0, 128, 0 );
ISP_CHECK_ERR( err )
joy->num_buttons = joy->isp_num_needs - joy->isp_num_axis; joy->num_buttons = joy->isp_num_needs - joy->isp_num_axis;
joy->num_axes = joy->isp_num_axis; joy->num_axes = joy->isp_num_axis;
for ( i = 0; i < joy->num_axes; i++ ) for( i = 0; i < joy->num_axes; i++ )
{ {
joy->dead_band [ i ] = 0; joy->dead_band[ i ] = 0;
joy->saturate [ i ] = 1; joy->saturate [ i ] = 1;
joy->center [ i ] = kISpAxisMiddle; joy->center [ i ] = kISpAxisMiddle;
joy->max [ i ] = kISpAxisMaximum; joy->max [ i ] = kISpAxisMaximum;
@ -1241,46 +1247,53 @@ static void fghJoystickOpen( SFG_Joystick* joy )
#endif #endif
#if TARGET_HOST_MAC_OSX #if TARGET_HOST_MAC_OSX
if (joy->id >= numDevices) { if( joy->id >= numDevices )
fgWarning ( "%s", "device index out of range in fgJoystickOpen()"); {
fgWarning( "%s", "device index out of range in fgJoystickOpen()" );
return; return;
} }
/* create device interface */ /* create device interface */
rv = IOCreatePlugInInterfaceForService ( ioDevices[joy->id], rv = IOCreatePlugInInterfaceForService( ioDevices[ joy->id ],
kIOHIDDeviceUserClientTypeID, kIOHIDDeviceUserClientTypeID,
kIOCFPlugInInterfaceID, kIOCFPlugInInterfaceID,
&plugin, &score); &plugin, &score );
if (rv != kIOReturnSuccess) { if( rv != kIOReturnSuccess )
fgWarning ( "%s", "error creating plugin for io device"); {
fgWarning( "%s", "error creating plugin for io device" );
return; return;
} }
pluginResult = (*plugin)->QueryInterface ( plugin, pluginResult = ( *plugin )->QueryInterface(
CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID), &(LPVOID) joy->hidDev ); plugin,
CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID),
&( LPVOID )joy->hidDev
);
if ( pluginResult != S_OK ) if( pluginResult != S_OK )
fgWarning ( "%s", "QI-ing IO plugin to HID Device interface failed"); fgWarning ( "%s", "QI-ing IO plugin to HID Device interface failed" );
(*plugin)->Release(plugin); /* don't leak a ref */ ( *plugin )->Release( plugin ); /* don't leak a ref */
if (joy->hidDev == NULL) return; if( joy->hidDev == NULL )
return;
/* store the interface in this instance */ /* store the interface in this instance */
rv = (*(joy->hidDev))->open(joy->hidDev, 0); rv = ( *( joy->hidDev ) )->open( joy->hidDev, 0 );
if (rv != kIOReturnSuccess) { if( rv != kIOReturnSuccess )
fgWarning ( "%s", "error opening device interface"); {
fgWarning( "error opening device interface");
return; return;
} }
props = getCFProperties(ioDevices[joy->id]); props = getCFProperties( ioDevices[ joy->id ] );
/* recursively enumerate all the bits */ /* recursively enumerate all the bits */
CFTypeRef topLevelElement = CFTypeRef topLevelElement =
CFDictionaryGetValue ( props, CFSTR ( kIOHIDElementKey ) ); CFDictionaryGetValue( props, CFSTR( kIOHIDElementKey ) );
enumerateElements ( topLevelElement ); enumerateElements( topLevelElement );
CFRelease ( props ); CFRelease( props );
#endif #endif
#if TARGET_HOST_WIN32 #if TARGET_HOST_WIN32
@ -1293,7 +1306,7 @@ static void fghJoystickOpen( SFG_Joystick* joy )
( joyGetDevCaps( joy->js_id, &joy->jsCaps, sizeof( joy->jsCaps ) ) != ( joyGetDevCaps( joy->js_id, &joy->jsCaps, sizeof( joy->jsCaps ) ) !=
JOYERR_NOERROR ); JOYERR_NOERROR );
if ( joy->jsCaps.wNumAxes == 0 ) if( joy->jsCaps.wNumAxes == 0 )
{ {
joy->num_axes = 0; joy->num_axes = 0;
joy->error = GL_TRUE; joy->error = GL_TRUE;
@ -1303,36 +1316,37 @@ static void fghJoystickOpen( SFG_Joystick* joy )
/* Device name from jsCaps is often "Microsoft PC-joystick driver", /* Device name from jsCaps is often "Microsoft PC-joystick driver",
* at least for USB. Try to get the real name from the registry. * at least for USB. Try to get the real name from the registry.
*/ */
if ( ! fghJoystickGetOEMProductName ( joy, joy->name, sizeof(joy->name) ) ) if ( ! fghJoystickGetOEMProductName( joy, joy->name,
sizeof( joy->name ) ) )
{ {
fgWarning ( "%s", "JS: Failed to read joystick name from registry" ); fgWarning( "JS: Failed to read joystick name from registry" );
strncpy ( joy->name, joy->jsCaps.szPname, sizeof(joy->name) ); strncpy( joy->name, joy->jsCaps.szPname, sizeof( joy->name ) );
} }
/* Windows joystick drivers may provide any combination of /* Windows joystick drivers may provide any combination of
* X,Y,Z,R,U,V,POV - not necessarily the first n of these. * X,Y,Z,R,U,V,POV - not necessarily the first n of these.
*/ */
if ( joy->jsCaps.wCaps & JOYCAPS_HASPOV ) if( joy->jsCaps.wCaps & JOYCAPS_HASPOV )
{ {
joy->num_axes = _JS_MAX_AXES; joy->num_axes = _JS_MAX_AXES;
joy->min [ 7 ] = -1.0; joy->max [ 7 ] = 1.0; /* POV Y */ joy->min[ 7 ] = -1.0; joy->max[ 7 ] = 1.0; /* POV Y */
joy->min [ 6 ] = -1.0; joy->max [ 6 ] = 1.0; /* POV X */ joy->min[ 6 ] = -1.0; joy->max[ 6 ] = 1.0; /* POV X */
} }
else else
joy->num_axes = 6; joy->num_axes = 6;
joy->min[ 5 ] = (float) joy->jsCaps.wVmin; joy->min[ 5 ] = ( float )joy->jsCaps.wVmin;
joy->max[ 5 ] = (float) joy->jsCaps.wVmax; joy->max[ 5 ] = ( float )joy->jsCaps.wVmax;
joy->min[ 4 ] = (float) joy->jsCaps.wUmin; joy->min[ 4 ] = ( float )joy->jsCaps.wUmin;
joy->max[ 4 ] = (float) joy->jsCaps.wUmax; joy->max[ 4 ] = ( float )joy->jsCaps.wUmax;
joy->min[ 3 ] = (float) joy->jsCaps.wRmin; joy->min[ 3 ] = ( float )joy->jsCaps.wRmin;
joy->max[ 3 ] = (float) joy->jsCaps.wRmax; joy->max[ 3 ] = ( float )joy->jsCaps.wRmax;
joy->min[ 2 ] = (float) joy->jsCaps.wZmin; joy->min[ 2 ] = ( float )joy->jsCaps.wZmin;
joy->max[ 2 ] = (float) joy->jsCaps.wZmax; joy->max[ 2 ] = ( float )joy->jsCaps.wZmax;
joy->min[ 1 ] = (float) joy->jsCaps.wYmin; joy->min[ 1 ] = ( float )joy->jsCaps.wYmin;
joy->max[ 1 ] = (float) joy->jsCaps.wYmax; joy->max[ 1 ] = ( float )joy->jsCaps.wYmax;
joy->min[ 0 ] = (float) joy->jsCaps.wXmin; joy->min[ 0 ] = ( float )joy->jsCaps.wXmin;
joy->max[ 0 ] = (float) joy->jsCaps.wXmax; joy->max[ 0 ] = ( float )joy->jsCaps.wXmax;
} }
/* /*
@ -1340,66 +1354,66 @@ static void fghJoystickOpen( SFG_Joystick* joy )
*/ */
for( i = 0; i < joy->num_axes; i++ ) for( i = 0; i < joy->num_axes; i++ )
{ {
joy->center [ i ] = (joy->max[i] + joy->min[i]) * 0.5f; joy->center [ i ] = ( joy->max[ i ] + joy->min[ i ] ) * 0.5f;
joy->dead_band[ i ] = 0.0f; joy->dead_band[ i ] = 0.0f;
joy->saturate [ i ] = 1.0f; joy->saturate [ i ] = 1.0f;
} }
#endif #endif
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
#if defined(__FreeBSD__) || defined(__NetBSD__) #if defined( __FreeBSD__ ) || defined( __NetBSD__ )
for ( i = 0; i < _JS_MAX_AXES; i++ ) for( i = 0; i < _JS_MAX_AXES; i++ )
joy->os->cache_axes [ i ] = 0.0f; joy->os->cache_axes[ i ] = 0.0f;
joy->os->cache_buttons = 0; joy->os->cache_buttons = 0;
joy->os->fd = open ( joy->os->fname, O_RDONLY | O_NONBLOCK); joy->os->fd = open( joy->os->fname, O_RDONLY | O_NONBLOCK);
if ( joy->os->fd < 0 && errno == EACCES) 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\n", joy->os->fname );
joy->error = ( joy->os->fd < 0 ); joy->error =( joy->os->fd < 0 );
if ( joy->error ) if( joy->error )
return; return;
joy->num_axes = 0; joy->num_axes = 0;
joy->num_buttons = 0; joy->num_buttons = 0;
if ( joy->os->is_analog ) if( joy->os->is_analog )
{ {
FILE *joyfile; FILE *joyfile;
char joyfname [ 1024 ]; char joyfname[ 1024 ];
int noargs, in_no_axes; int noargs, in_no_axes;
float axes [ _JS_MAX_AXES ]; float axes [ _JS_MAX_AXES ];
int buttons [ _JS_MAX_AXES ]; int buttons[ _JS_MAX_AXES ];
joy->num_axes = 2; joy->num_axes = 2;
joy->num_buttons = 32; joy->num_buttons = 32;
fghJoystickRawRead ( joy, buttons, axes ); fghJoystickRawRead( joy, buttons, axes );
joy->error = axes[0] < -1000000000.0f; joy->error = axes[ 0 ] < -1000000000.0f;
if ( joy->error ) if( joy->error )
return; return;
sprintf( joyfname, "%s/.joy%drc", getenv ( "HOME" ), joy->id ); sprintf( joyfname, "%s/.joy%drc", getenv( "HOME" ), joy->id );
joyfile = fopen ( joyfname, "r" ); joyfile = fopen( joyfname, "r" );
joy->error = ( joyfile == NULL ); joy->error =( joyfile == NULL );
if ( joy->error ) if( joy->error )
return; return;
noargs = fscanf ( joyfile, "%d%f%f%f%f%f%f", &in_no_axes, noargs = fscanf( joyfile, "%d%f%f%f%f%f%f", &in_no_axes,
&joy->min [ 0 ], &joy->center [ 0 ], &joy->max [ 0 ], &joy->min[ 0 ], &joy->center[ 0 ], &joy->max[ 0 ],
&joy->min [ 1 ], &joy->center [ 1 ], &joy->max [ 1 ] ); &joy->min[ 1 ], &joy->center[ 1 ], &joy->max[ 1 ] );
joy->error = noargs != 7 || in_no_axes != _JS_MAX_AXES; joy->error = noargs != 7 || in_no_axes != _JS_MAX_AXES;
fclose ( joyfile ); fclose( joyfile );
if ( joy->error ) if( joy->error )
return; return;
for ( i = 0; i < _JS_MAX_AXES; i++ ) for( i = 0; i < _JS_MAX_AXES; i++ )
{ {
joy->dead_band [ i ] = 0.0f; joy->dead_band[ i ] = 0.0f;
joy->saturate [ i ] = 1.0f; joy->saturate [ i ] = 1.0f;
} }
@ -1410,46 +1424,48 @@ static void fghJoystickOpen( SFG_Joystick* joy )
if( ! fghJoystickInitializeHID( joy->os, &joy->num_axes, if( ! fghJoystickInitializeHID( joy->os, &joy->num_axes,
&joy->num_buttons ) ) &joy->num_buttons ) )
{ {
close ( joy->os->fd ); close( joy->os->fd );
joy->error = GL_TRUE; joy->error = GL_TRUE;
return; return;
} }
cp = strrchr(joy->os->fname, '/'); cp = strrchr( joy->os->fname, '/' );
if ( cp ) { if( cp )
if ( fghJoystickFindUSBdev ( &cp[1], joy->name, sizeof(joy->name) ) == 0 ) {
strcpy ( joy->name, &cp[1] ); if( fghJoystickFindUSBdev( &cp[1], joy->name, sizeof( joy->name ) ) ==
0 )
strcpy( joy->name, &cp[1] );
} }
if ( joy->num_axes > _JS_MAX_AXES ) if( joy->num_axes > _JS_MAX_AXES )
joy->num_axes = _JS_MAX_AXES; joy->num_axes = _JS_MAX_AXES;
for ( i = 0; i < _JS_MAX_AXES; i++ ) for( i = 0; i < _JS_MAX_AXES; i++ )
{ {
/* We really should get this from the HID, but that data seems /* We really should get this from the HID, but that data seems
* to be quite unreliable for analog-to-USB converters. Punt for * to be quite unreliable for analog-to-USB converters. Punt for
* now. * now.
*/ */
if ( joy->os->axes_usage [ i ] == HUG_HAT_SWITCH ) if( joy->os->axes_usage[ i ] == HUG_HAT_SWITCH )
{ {
joy->max [ i ] = 1.0f; joy->max [ i ] = 1.0f;
joy->center [ i ] = 0.0f; joy->center[ i ] = 0.0f;
joy->min [ i ] = -1.0f; joy->min [ i ] = -1.0f;
} }
else else
{ {
joy->max [ i ] = 255.0f; joy->max [ i ] = 255.0f;
joy->center [ i ] = 127.0f; joy->center[ i ] = 127.0f;
joy->min [ i ] = 0.0f; joy->min [ i ] = 0.0f;
} }
joy->dead_band [ i ] = 0.0f; joy->dead_band[ i ] = 0.0f;
joy->saturate [ i ] = 1.0f; joy->saturate[ i ] = 1.0f;
} }
# endif # endif
#endif #endif
#if defined(__linux__) #if defined( __linux__ )
/* /*
* Default for older Linux systems. * Default for older Linux systems.
*/ */
@ -1465,9 +1481,9 @@ static void fghJoystickOpen( SFG_Joystick* joy )
joy->fd = open( joy->fname, O_RDONLY ); joy->fd = open( joy->fname, O_RDONLY );
joy->error = (joy->fd < 0); joy->error =( joy->fd < 0 );
if ( joy->error ) if( joy->error )
return; return;
/* /*
@ -1478,12 +1494,12 @@ static void fghJoystickOpen( SFG_Joystick* joy )
* to the upper byte of an uninitialized word doesn't work. * to the upper byte of an uninitialized word doesn't work.
* 9 April 2003 * 9 April 2003
*/ */
ioctl ( joy->fd, JSIOCGAXES , &u ); ioctl( joy->fd, JSIOCGAXES, &u );
joy->num_axes = u; joy->num_axes = u;
ioctl ( joy->fd, JSIOCGBUTTONS, &u ); ioctl( joy->fd, JSIOCGBUTTONS, &u );
joy->num_buttons = u; joy->num_buttons = u;
ioctl ( joy->fd, JSIOCGNAME ( sizeof(joy->name) ), joy->name ); ioctl( joy->fd, JSIOCGNAME( sizeof( joy->name ) ), joy->name );
fcntl ( joy->fd, F_SETFL , O_NONBLOCK ); fcntl( joy->fd, F_SETFL, O_NONBLOCK );
# endif # endif
/* /*
@ -1510,7 +1526,7 @@ static void fghJoystickOpen( SFG_Joystick* joy )
joy->error = GL_TRUE; joy->error = GL_TRUE;
# endif # endif
for ( i = 0; i < _JS_MAX_AXES; i++ ) for( i = 0; i < _JS_MAX_AXES; i++ )
{ {
# ifdef JS_NEW # ifdef JS_NEW
joy->max [ i ] = 32767.0f; joy->max [ i ] = 32767.0f;
@ -1532,57 +1548,65 @@ static void fghJoystickOpen( SFG_Joystick* joy )
*/ */
void fgJoystickInit( int ident ) void fgJoystickInit( int ident )
{ {
if ( ident >= MAX_NUM_JOYSTICKS ) if( ident >= MAX_NUM_JOYSTICKS )
fgError( "Too large a joystick number" ); fgError( "Too large a joystick number" );
if( fgJoystick[ident] ) if( fgJoystick[ ident ] )
fgError( "illegal attempt to initialize joystick device" ); fgError( "illegal attempt to initialize joystick device" );
fgJoystick[ident] = ( SFG_Joystick * )calloc( sizeof( SFG_Joystick ), 1 ); fgJoystick[ ident ] =
( SFG_Joystick * )calloc( sizeof( SFG_Joystick ), 1 );
/* Set defaults */ /* Set defaults */
fgJoystick[ident]->num_axes = fgJoystick[ident]->num_buttons = 0; fgJoystick[ ident ]->num_axes = fgJoystick[ ident ]->num_buttons = 0;
fgJoystick[ident]->error = GL_TRUE; fgJoystick[ ident ]->error = GL_TRUE;
#if TARGET_HOST_MACINTOSH #if TARGET_HOST_MACINTOSH
fgJoystick[ident]->id = ident; fgJoystick[ ident ]->id = ident;
sprintf ( fgJoystick[ident]->fname, "/dev/js%d", ident ); /* FIXME */ sprintf( fgJoystick[ ident ]->fname, "/dev/js%d", ident ); /* FIXME */
fgJoystick[ident]->error = GL_FALSE; fgJoystick[ ident ]->error = GL_FALSE;
#endif #endif
#if TARGET_HOST_MAC_OSX #if TARGET_HOST_MAC_OSX
fgJoystick[ident]->id = ident; fgJoystick[ ident ]->id = ident;
fgJoystick[ident]->error = GL_FALSE; fgJoystick[ ident ]->error = GL_FALSE;
fgJoystick[ident]->num_axes = 0; fgJoystick[ ident ]->num_axes = 0;
fgJoystick[ident]->num_buttons = 0; fgJoystick[ ident ]->num_buttons = 0;
if (numDevices < 0) { if( numDevices < 0 )
{
/* do first-time init (since we can't over-ride jsInit, hmm */ /* do first-time init (since we can't over-ride jsInit, hmm */
numDevices = 0; numDevices = 0;
mach_port_t masterPort; mach_port_t masterPort;
IOReturn rv = IOMasterPort ( bootstrap_port, &masterPort ); IOReturn rv = IOMasterPort( bootstrap_port, &masterPort );
if ( rv != kIOReturnSuccess ) { if( rv != kIOReturnSuccess )
fgWarning ( "%s", "error getting master Mach port"); {
fgWarning( "%s", "error getting master Mach port" );
return; return;
} }
fghJoystickFindDevices ( masterPort ); fghJoystickFindDevices( masterPort );
} }
if ( ident >= numDevices ) { if ( ident >= numDevices )
fgJoystick[ident]->error = GL_TRUE; {
fgJoystick[ ident ]->error = GL_TRUE;
return; return;
} }
/* get the name now too */ /* get the name now too */
CFDictionaryRef properties = getCFProperties(ioDevices[ident]); CFDictionaryRef properties = getCFProperties( ioDevices[ ident ] );
CFTypeRef ref = CFDictionaryGetValue (properties, CFSTR(kIOHIDProductKey)); CFTypeRef ref = CFDictionaryGetValue( properties,
CFSTR( kIOHIDProductKey ) );
if (!ref) if (!ref)
ref = CFDictionaryGetValue (properties, CFSTR("USB Product Name")); ref = CFDictionaryGetValue(properties, CFSTR( "USB Product Name" ) );
if (!ref || !CFStringGetCString ((CFStringRef) ref, name, 128, CFStringGetSystemEncoding ())) { if( !ref ||
!CFStringGetCString( ( CFStringRef )ref, name, 128,
CFStringGetSystemEncoding( ) ) )
{
fgWarning( "%s", "error getting device name" ); fgWarning( "%s", "error getting device name" );
name[0] = '\0'; name[ 0 ] = '\0';
} }
#endif #endif
@ -1590,45 +1614,46 @@ void fgJoystickInit( int ident )
switch( ident ) switch( ident )
{ {
case 0: case 0:
fgJoystick[ident]->js_id = JOYSTICKID1; fgJoystick[ ident ]->js_id = JOYSTICKID1;
fgJoystick[ident]->error = GL_FALSE; fgJoystick[ ident ]->error = GL_FALSE;
break; break;
case 1: case 1:
fgJoystick[ident]->js_id = JOYSTICKID2; fgJoystick[ ident ]->js_id = JOYSTICKID2;
fgJoystick[ident]->error = GL_FALSE; fgJoystick[ ident ]->error = GL_FALSE;
break; break;
default: default:
fgJoystick[ident]->num_axes = 0; fgJoystick[ ident ]->num_axes = 0;
fgJoystick[ident]->error = GL_TRUE; fgJoystick[ ident ]->error = GL_TRUE;
return; return;
} }
#endif #endif
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
# if defined(__FreeBSD__) || defined(__NetBSD__) # if defined( __FreeBSD__ ) || defined( __NetBSD__ )
fgJoystick[ident]->id = ident; fgJoystick[ ident ]->id = ident;
fgJoystick[ident]->error = GL_FALSE; fgJoystick[ ident ]->error = GL_FALSE;
fgJoystick[ident]->os = calloc (1, sizeof (struct os_specific_s)); fgJoystick[ ident ]->os = calloc( 1, sizeof( struct os_specific_s ) );
memset ( fgJoystick[ident]->os, 0, sizeof(struct os_specific_s) ); memset( fgJoystick[ ident ]->os, 0, sizeof( struct os_specific_s ) );
if (ident < USB_IDENT_OFFSET) if( ident < USB_IDENT_OFFSET )
fgJoystick[ident]->os->is_analog = 1; fgJoystick[ ident ]->os->is_analog = 1;
if (fgJoystick[ident]->os->is_analog) if( fgJoystick[ ident ]->os->is_analog )
sprintf ( fgJoystick[ident]->os->fname, "%s%d", AJSDEV, ident ); sprintf( fgJoystick[ ident ]->os->fname, "%s%d", AJSDEV, ident );
else else
sprintf ( fgJoystick[ident]->os->fname, "%s%d", UHIDDEV, ident - USB_IDENT_OFFSET ); sprintf( fgJoystick[ ident ]->os->fname, "%s%d", UHIDDEV,
# elif defined(__linux__) ident - USB_IDENT_OFFSET );
fgJoystick[ident]->id = ident; # elif defined( __linux__ )
fgJoystick[ident]->error = GL_FALSE; fgJoystick[ ident ]->id = ident;
fgJoystick[ ident ]->error = GL_FALSE;
sprintf ( fgJoystick[ident]->fname, "/dev/input/js%d", ident ); sprintf( fgJoystick[ident]->fname, "/dev/input/js%d", ident );
if ( access ( fgJoystick[ident]->fname, F_OK ) != 0 ) if( access( fgJoystick[ ident ]->fname, F_OK ) != 0 )
sprintf ( fgJoystick[ident]->fname, "/dev/js%d", ident ); sprintf( fgJoystick[ ident ]->fname, "/dev/js%d", ident );
# endif # endif
#endif #endif
fghJoystickOpen ( fgJoystick[ident] ); fghJoystickOpen( fgJoystick[ ident ] );
} }
/* /*
@ -1637,19 +1662,20 @@ void fgJoystickInit( int ident )
void fgJoystickClose( void ) void fgJoystickClose( void )
{ {
int ident ; int ident ;
for ( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ ) for( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ )
{ {
if ( fgJoystick[ident] ) if( fgJoystick[ ident ] )
{ {
#if TARGET_HOST_MACINTOSH #if TARGET_HOST_MACINTOSH
ISpSuspend (); ISpSuspend( );
ISpStop (); ISpStop( );
ISpShutdown (); ISpShutdown( );
#endif #endif
#if TARGET_HOST_MAC_OSX #if TARGET_HOST_MAC_OSX
(*(fgJoystick[ident]->hidDev))->close(fgJoystick[ident]->hidDev); ( *( fgJoystick[ ident ]->hidDev ) )->
close( fgJoystick[ ident ]->hidDev );
#endif #endif
#if TARGET_HOST_WIN32 #if TARGET_HOST_WIN32
@ -1657,27 +1683,28 @@ void fgJoystickClose( void )
#endif #endif
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
#if defined(__FreeBSD__) || defined(__NetBSD__) #if defined( __FreeBSD__ ) || defined( __NetBSD__ )
if ( fgJoystick[ident]->os ) if( fgJoystick[ident]->os )
{ {
if ( ! fgJoystick[ident]->error ) if( ! fgJoystick[ ident ]->error )
close ( fgJoystick[ident]->os->fd ); close( fgJoystick[ ident ]->os->fd );
#ifdef HAVE_USB_JS #ifdef HAVE_USB_JS
if ( fgJoystick[ident]->os->hids ) if( fgJoystick[ ident ]->os->hids )
free (fgJoystick[ident]->os->hids); free (fgJoystick[ ident ]->os->hids);
if ( fgJoystick[ident]->os->hid_data_buf ) if( fgJoystick[ ident ]->os->hid_data_buf )
free (fgJoystick[ident]->os->hid_data_buf); free( fgJoystick[ ident ]->os->hid_data_buf );
#endif #endif
free (fgJoystick[ident]->os); free( fgJoystick[ident]->os );
} }
#endif #endif
if( ! fgJoystick[ident]->error ) if( ! fgJoystick[ident]->error )
close( fgJoystick[ident]->fd ); close( fgJoystick[ ident ]->fd );
#endif #endif
free( fgJoystick[ident] ); free( fgJoystick[ ident ] );
fgJoystick[ident] = NULL; /* show joystick has been deinitialized */ fgJoystick[ ident ] = NULL;
/* show joystick has been deinitialized */
} }
} }
} }
@ -1695,18 +1722,18 @@ void fgJoystickPollWindow( SFG_Window* window )
freeglut_return_if_fail( window ); freeglut_return_if_fail( window );
freeglut_return_if_fail( FETCH_WCB( *window, Joystick ) ); freeglut_return_if_fail( FETCH_WCB( *window, Joystick ) );
for ( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ ) for( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ )
{ {
if ( fgJoystick[ident] ) if( fgJoystick[ident] )
{ {
fghJoystickRead( fgJoystick[ident], &buttons, axes ); fghJoystickRead( fgJoystick[ident], &buttons, axes );
if ( !fgJoystick[ident]->error ) if( !fgJoystick[ident]->error )
INVOKE_WCB( *window, Joystick, INVOKE_WCB( *window, Joystick,
( buttons, ( buttons,
(int) (axes[ 0 ] * 1000.0f ), (int) ( axes[ 0 ] * 1000.0f ),
(int) (axes[ 1 ] * 1000.0f ), (int) ( axes[ 1 ] * 1000.0f ),
(int) (axes[ 2 ] * 1000.0f ) ) (int) ( axes[ 2 ] * 1000.0f ) )
); );
} }
} }
@ -1716,33 +1743,63 @@ void fgJoystickPollWindow( SFG_Window* window )
* PWO: These jsJoystick class methods have not been implemented. * PWO: These jsJoystick class methods have not been implemented.
* We might consider adding such functions to freeglut-2.0. * We might consider adding such functions to freeglut-2.0.
*/ */
int glutJoystickGetNumAxes ( int ident ) int glutJoystickGetNumAxes( int ident )
{ return fgJoystick[ident]->num_axes; } {
int glutJoystickNotWorking ( int ident ) return fgJoystick[ ident ]->num_axes;
{ return fgJoystick[ident]->error; } }
int glutJoystickNotWorking( int ident )
{
return fgJoystick[ ident ]->error;
}
float glutJoystickGetDeadBand ( int ident, int axis ) float glutJoystickGetDeadBand( int ident, int axis )
{ return fgJoystick[ident]->dead_band [ axis ]; } {
void glutJoystickSetDeadBand ( int ident, int axis, float db ) return fgJoystick[ ident ]->dead_band [ axis ];
{ fgJoystick[ident]->dead_band [ axis ] = db; } }
void glutJoystickSetDeadBand( int ident, int axis, float db )
{
fgJoystick[ ident ]->dead_band[ axis ] = db;
}
float glutJoystickGetSaturation ( int ident, int axis ) float glutJoystickGetSaturation( int ident, int axis )
{ return fgJoystick[ident]->saturate [ axis ]; } {
void glutJoystickSetSaturation ( int ident, int axis, float st ) return fgJoystick[ ident ]->saturate[ axis ];
{ fgJoystick[ident]->saturate [ axis ] = st; } }
void glutJoystickSetSaturation( int ident, int axis, float st )
{
fgJoystick[ ident ]->saturate [ axis ] = st;
}
void glutJoystickSetMinRange ( int ident, float *axes ) void glutJoystickSetMinRange( int ident, float *axes )
{ memcpy ( fgJoystick[ident]->min , axes, fgJoystick[ident]->num_axes * sizeof(float) ); } {
void glutJoystickSetMaxRange ( int ident, float *axes ) memcpy( fgJoystick[ ident ]->min, axes,
{ memcpy ( fgJoystick[ident]->max , axes, fgJoystick[ident]->num_axes * sizeof(float) ); } fgJoystick[ ident ]->num_axes * sizeof( float ) );
void glutJoystickSetCenter ( int ident, float *axes ) }
{ memcpy ( fgJoystick[ident]->center, axes, fgJoystick[ident]->num_axes * sizeof(float) ); } void glutJoystickSetMaxRange( int ident, float *axes )
{
memcpy( fgJoystick[ ident ]->max, axes,
fgJoystick[ ident ]->num_axes * sizeof( float ) );
}
void glutJoystickSetCenter( int ident, float *axes )
{
memcpy( fgJoystick[ ident ]->center, axes,
fgJoystick[ ident ]->num_axes * sizeof( float ) );
}
void glutJoystickGetMinRange ( int ident, float *axes ) void glutJoystickGetMinRange( int ident, float *axes )
{ memcpy ( axes, fgJoystick[ident]->min , fgJoystick[ident]->num_axes * sizeof(float) ); } {
void glutJoystickGetMaxRange ( int ident, float *axes ) memcpy( axes, fgJoystick[ ident ]->min,
{ memcpy ( axes, fgJoystick[ident]->max , fgJoystick[ident]->num_axes * sizeof(float) ); } fgJoystick[ ident ]->num_axes * sizeof( float ) );
void glutJoystickGetCenter ( int ident, float *axes ) }
{ memcpy ( axes, fgJoystick[ident]->center, fgJoystick[ident]->num_axes * sizeof(float) ); } void glutJoystickGetMaxRange( int ident, float *axes )
{
memcpy( axes, fgJoystick[ ident ]->max,
fgJoystick[ ident ]->num_axes * sizeof( float ) );
}
void glutJoystickGetCenter( int ident, float *axes )
{
memcpy( axes, fgJoystick[ ident ]->center,
fgJoystick[ ident ]->num_axes * sizeof( float ) );
}
/*** END OF FILE ***/ /*** END OF FILE ***/