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:
parent
c03f197329
commit
a1547dde81
@ -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 ***/
|
||||||
|
Reference in New Issue
Block a user