- ( *( fgJoystick[ ident ]->hidDev ) )->\r
- close( fgJoystick[ ident ]->hidDev );\r
-}\r
-#endif\r
-\r
-#if TARGET_HOST_POSIX_X11\r
-void fgPlatformJoystickOpen( SFG_Joystick* joy )\r
-{\r
-#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
- int i = 0;\r
- char *cp;\r
-#endif\r
-#ifdef JS_NEW\r
- unsigned char u;\r
-#else\r
-# if defined( __linux__ ) || TARGET_HOST_SOLARIS\r
- int i = 0;\r
- int counter = 0;\r
-# endif\r
-#endif\r
-\r
-#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
- for( i = 0; i < _JS_MAX_AXES; i++ )\r
- joy->os->cache_axes[ i ] = 0.0f;\r
-\r
- joy->os->cache_buttons = 0;\r
-\r
- joy->os->fd = open( joy->os->fname, O_RDONLY | O_NONBLOCK);\r
-\r
-#ifdef HAVE_ERRNO_H\r
- if( joy->os->fd < 0 && errno == EACCES )\r
- fgWarning ( "%s exists but is not readable by you", joy->os->fname );\r
-#endif\r
-\r
- joy->error =( joy->os->fd < 0 );\r
-\r
- if( joy->error )\r
- return;\r
-\r
- joy->num_axes = 0;\r
- joy->num_buttons = 0;\r
- if( joy->os->is_analog )\r
- {\r
- FILE *joyfile;\r
- char joyfname[ 1024 ];\r
- int noargs, in_no_axes;\r
-\r
- float axes [ _JS_MAX_AXES ];\r
- int buttons[ _JS_MAX_AXES ];\r
-\r
- joy->num_axes = 2;\r
- joy->num_buttons = 32;\r
-\r
- fghJoystickRawRead( joy, buttons, axes );\r
- joy->error = axes[ 0 ] < -1000000000.0f;\r
- if( joy->error )\r
- return;\r
-\r
- snprintf( joyfname, sizeof(joyfname), "%s/.joy%drc", getenv( "HOME" ), joy->id );\r
-\r
- joyfile = fopen( joyfname, "r" );\r
- joy->error =( joyfile == NULL );\r
- if( joy->error )\r
- return;\r
-\r
- noargs = fscanf( joyfile, "%d%f%f%f%f%f%f", &in_no_axes,\r
- &joy->min[ 0 ], &joy->center[ 0 ], &joy->max[ 0 ],\r
- &joy->min[ 1 ], &joy->center[ 1 ], &joy->max[ 1 ] );\r
- joy->error = noargs != 7 || in_no_axes != _JS_MAX_AXES;\r
- fclose( joyfile );\r
- if( joy->error )\r
- return;\r
-\r
- for( i = 0; i < _JS_MAX_AXES; i++ )\r
- {\r
- joy->dead_band[ i ] = 0.0f;\r
- joy->saturate [ i ] = 1.0f;\r
- }\r
-\r
- return; /* End of analog code */\r
- }\r
-\r
-# ifdef HAVE_USB_JS\r
- if( ! fghJoystickInitializeHID( joy->os, &joy->num_axes,\r
- &joy->num_buttons ) )\r
- {\r
- close( joy->os->fd );\r
- joy->error = GL_TRUE;\r
- return;\r
- }\r
-\r
- cp = strrchr( joy->os->fname, '/' );\r
- if( cp )\r
- {\r
- if( fghJoystickFindUSBdev( &cp[1], joy->name, sizeof( joy->name ) ) ==\r
- 0 )\r
- strcpy( joy->name, &cp[1] );\r
- }\r
-\r
- if( joy->num_axes > _JS_MAX_AXES )\r
- joy->num_axes = _JS_MAX_AXES;\r
-\r
- for( i = 0; i < _JS_MAX_AXES; i++ )\r
- {\r
- /* We really should get this from the HID, but that data seems\r
- * to be quite unreliable for analog-to-USB converters. Punt for\r
- * now.\r
- */\r
- if( joy->os->axes_usage[ i ] == HUG_HAT_SWITCH )\r
- {\r
- joy->max [ i ] = 1.0f;\r
- joy->center[ i ] = 0.0f;\r
- joy->min [ i ] = -1.0f;\r
- }\r
- else\r
- {\r
- joy->max [ i ] = 255.0f;\r
- joy->center[ i ] = 127.0f;\r
- joy->min [ i ] = 0.0f;\r
- }\r
-\r
- joy->dead_band[ i ] = 0.0f;\r
- joy->saturate[ i ] = 1.0f;\r
- }\r
-# endif\r
-#endif\r
-\r
-#if defined( __linux__ ) || TARGET_HOST_SOLARIS\r
- /* Default for older Linux systems. */\r
- joy->num_axes = 2;\r
- joy->num_buttons = 32;\r
-\r
-# ifdef JS_NEW\r
- for( i = 0; i < _JS_MAX_AXES; i++ )\r
- joy->tmp_axes[ i ] = 0.0f;\r
-\r
- joy->tmp_buttons = 0;\r
-# endif\r
-\r
- joy->fd = open( joy->fname, O_RDONLY );\r
-\r
- joy->error =( joy->fd < 0 );\r
-\r
- if( joy->error )\r
- return;\r
-\r
- /* Set the correct number of axes for the linux driver */\r
-# ifdef JS_NEW\r
- /* Melchior Franz's fixes for big-endian Linuxes since writing\r
- * to the upper byte of an uninitialized word doesn't work.\r
- * 9 April 2003\r
- */\r
- ioctl( joy->fd, JSIOCGAXES, &u );\r
- joy->num_axes = u;\r
- ioctl( joy->fd, JSIOCGBUTTONS, &u );\r
- joy->num_buttons = u;\r
- ioctl( joy->fd, JSIOCGNAME( sizeof( joy->name ) ), joy->name );\r
- fcntl( joy->fd, F_SETFL, O_NONBLOCK );\r
-# endif\r
-\r
- /*\r
- * The Linux driver seems to return 512 for all axes\r
- * when no stick is present - but there is a chance\r
- * that could happen by accident - so it's gotta happen\r
- * on both axes for at least 100 attempts.\r
- *\r
- * PWO: shouldn't be that done somehow wiser on the kernel level?\r
- */\r
-# ifndef JS_NEW\r
- counter = 0;\r
-\r
- do\r
- {\r
- fghJoystickRawRead( joy, NULL, joy->center );\r
- counter++;\r
- } while( !joy->error &&\r
- counter < 100 &&\r
- joy->center[ 0 ] == 512.0f &&\r
- joy->center[ 1 ] == 512.0f );\r
-\r
- if ( counter >= 100 )\r
- joy->error = GL_TRUE;\r
-# endif\r
-\r
- for( i = 0; i < _JS_MAX_AXES; i++ )\r
- {\r
-# ifdef JS_NEW\r
- joy->max [ i ] = 32767.0f;\r
- joy->center[ i ] = 0.0f;\r
- joy->min [ i ] = -32767.0f;\r
-# else\r
- joy->max[ i ] = joy->center[ i ] * 2.0f;\r
- joy->min[ i ] = 0.0f;\r
-# endif\r
- joy->dead_band[ i ] = 0.0f;\r
- joy->saturate [ i ] = 1.0f;\r
- }\r
-#endif\r
-}\r
-\r
-\r
-void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )\r
-{\r
-#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
- fgJoystick[ ident ]->id = ident;\r
- fgJoystick[ ident ]->error = GL_FALSE;\r
-\r
- fgJoystick[ ident ]->os = calloc( 1, sizeof( struct os_specific_s ) );\r
- memset( fgJoystick[ ident ]->os, 0, sizeof( struct os_specific_s ) );\r
- if( ident < USB_IDENT_OFFSET )\r
- fgJoystick[ ident ]->os->is_analog = 1;\r
- if( fgJoystick[ ident ]->os->is_analog )\r
- snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", AJSDEV, ident );\r
- else\r
- snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", UHIDDEV,\r
- ident - USB_IDENT_OFFSET );\r
-#elif defined( __linux__ )\r
- fgJoystick[ ident ]->id = ident;\r
- fgJoystick[ ident ]->error = GL_FALSE;\r
-\r
- snprintf( fgJoystick[ident]->fname, sizeof(fgJoystick[ident]->fname), "/dev/input/js%d", ident );\r
-\r
- if( access( fgJoystick[ ident ]->fname, F_OK ) != 0 )\r
- snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident );\r
-#endif\r
-}\r
-\r
-\r
-void fgPlatformJoystickClose ( int ident )\r
-{\r
-#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
- if( fgJoystick[ident]->os )\r
- {\r
- if( ! fgJoystick[ ident ]->error )\r
- close( fgJoystick[ ident ]->os->fd );\r
-#ifdef HAVE_USB_JS\r
- if( fgJoystick[ ident ]->os->hids )\r
- free (fgJoystick[ ident ]->os->hids);\r
- if( fgJoystick[ ident ]->os->hid_data_buf )\r
- free( fgJoystick[ ident ]->os->hid_data_buf );\r
-#endif\r
- free( fgJoystick[ident]->os );\r
- }\r
-#endif\r
-\r
- if( ! fgJoystick[ident]->error )\r
- close( fgJoystick[ ident ]->fd );\r