\r
\r
/* External function declarations (mostly platform-specific) */\r
+extern void fgPlatformJoystickOpen( SFG_Joystick* joy );\r
extern void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident );\r
extern void fgPlatformJoystickClose ( int ident );\r
\r
static SFG_Joystick *fgJoystick [ MAX_NUM_JOYSTICKS ];\r
\r
/*\r
- * Platform-Specific Code\r
- */\r
-\r
-#if TARGET_HOST_MACINTOSH\r
-void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )\r
-{\r
- fgJoystick[ ident ]->id = ident;\r
- snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); /* FIXME */\r
- fgJoystick[ ident ]->error = GL_FALSE;\r
-}\r
-\r
-\r
-void fgPlatformJoystickClose ( int ident )\r
-{\r
- ISpSuspend( );\r
- ISpStop( );\r
- ISpShutdown( );\r
-}\r
-#endif\r
-\r
-#if TARGET_HOST_MAC_OSX\r
-void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )\r
-{\r
- fgJoystick[ ident ]->id = ident;\r
- fgJoystick[ ident ]->error = GL_FALSE;\r
- fgJoystick[ ident ]->num_axes = 0;\r
- fgJoystick[ ident ]->num_buttons = 0;\r
-\r
- if( numDevices < 0 )\r
- {\r
- /* do first-time init (since we can't over-ride jsInit, hmm */\r
- numDevices = 0;\r
-\r
- mach_port_t masterPort;\r
- IOReturn rv = IOMasterPort( bootstrap_port, &masterPort );\r
- if( rv != kIOReturnSuccess )\r
- {\r
- fgWarning( "error getting master Mach port" );\r
- return;\r
- }\r
- fghJoystickFindDevices( masterPort );\r
- }\r
-\r
- if ( ident >= numDevices )\r
- {\r
- fgJoystick[ ident ]->error = GL_TRUE;\r
- return;\r
- }\r
-\r
- /* get the name now too */\r
- CFDictionaryRef properties = getCFProperties( ioDevices[ ident ] );\r
- CFTypeRef ref = CFDictionaryGetValue( properties,\r
- CFSTR( kIOHIDProductKey ) );\r
- if (!ref)\r
- ref = CFDictionaryGetValue(properties, CFSTR( "USB Product Name" ) );\r
-\r
- if( !ref ||\r
- !CFStringGetCString( ( CFStringRef )ref, name, 128,\r
- CFStringGetSystemEncoding( ) ) )\r
- {\r
- fgWarning( "error getting device name" );\r
- name[ 0 ] = '\0';\r
- }\r
-}\r
-\r
-\r
-void fgPlatformJoystickClose ( int ident )\r
-{\r
- ( *( fgJoystick[ ident ]->hidDev ) )->\r
- close( fgJoystick[ ident ]->hidDev );\r
-}\r
-#endif\r
-\r
-#if TARGET_HOST_POSIX_X11\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
-}\r
-#endif\r
-\r
-\r
-\r
-/*\r
* Read the raw joystick data\r
*/\r
static void fghJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes )\r
}\r
#endif\r
\r
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
-/* Inspired by\r
- http://msdn.microsoft.com/archive/en-us/dnargame/html/msdn_sidewind3d.asp\r
+/*\r
+ * Platform-Specific Code\r
*/\r
-# if FREEGLUT_LIB_PRAGMAS\r
-# pragma comment (lib, "advapi32.lib")\r
-# endif\r
-\r
-static int fghJoystickGetOEMProductName ( SFG_Joystick* joy, char *buf, int buf_sz )\r
-{\r
- char buffer [ 256 ];\r
-\r
- char OEMKey [ 256 ];\r
-\r
- HKEY hKey;\r
- DWORD dwcb;\r
- LONG lr;\r
-\r
- if ( joy->error )\r
- return 0;\r
-\r
- /* Open .. MediaResources\CurrentJoystickSettings */\r
- _snprintf ( buffer, sizeof(buffer), "%s\\%s\\%s",\r
- REGSTR_PATH_JOYCONFIG, joy->jsCaps.szRegKey,\r
- REGSTR_KEY_JOYCURR );\r
-\r
- lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey);\r
-\r
- if ( lr != ERROR_SUCCESS ) return 0;\r
-\r
- /* Get OEM Key name */\r
- dwcb = sizeof(OEMKey);\r
-\r
- /* JOYSTICKID1-16 is zero-based; registry entries for VJOYD are 1-based. */\r
- _snprintf ( buffer, sizeof(buffer), "Joystick%d%s", joy->js_id + 1, REGSTR_VAL_JOYOEMNAME );\r
-\r
- lr = RegQueryValueEx ( hKey, buffer, 0, 0, (LPBYTE) OEMKey, &dwcb);\r
- RegCloseKey ( hKey );\r
-\r
- if ( lr != ERROR_SUCCESS ) return 0;\r
-\r
- /* Open OEM Key from ...MediaProperties */\r
- _snprintf ( buffer, sizeof(buffer), "%s\\%s", REGSTR_PATH_JOYOEM, OEMKey );\r
-\r
- lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey );\r
-\r
- if ( lr != ERROR_SUCCESS ) return 0;\r
-\r
- /* Get OEM Name */\r
- dwcb = buf_sz;\r
\r
- lr = RegQueryValueEx ( hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, (LPBYTE) buf,\r
- &dwcb );\r
- RegCloseKey ( hKey );\r
-\r
- if ( lr != ERROR_SUCCESS ) return 0;\r
-\r
- return 1;\r
-}\r
-#endif\r
-\r
-\r
-static void fghJoystickOpen( SFG_Joystick* joy )\r
-{\r
- int i = 0;\r
#if TARGET_HOST_MACINTOSH\r
+void fgPlatformJoystickOpen( SFG_Joystick* joy )\r
+{\r
+ int i = 0;\r
OSStatus err;\r
-#endif\r
-#if TARGET_HOST_MAC_OSX\r
- IOReturn rv;\r
- SInt32 score;\r
- IOCFPlugInInterface **plugin;\r
-\r
- HRESULT pluginResult;\r
-\r
- CFDictionaryRef props;\r
- CFTypeRef topLevelElement;\r
-#endif\r
-#if TARGET_HOST_POSIX_X11\r
-# if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
- char *cp;\r
-# endif\r
-# ifdef JS_NEW\r
- unsigned char u;\r
-# else\r
-# if defined( __linux__ ) || TARGET_HOST_SOLARIS\r
- int counter = 0;\r
-# endif\r
-# endif\r
-#endif\r
\r
- /* Silence gcc, the correct #ifdefs would be too fragile... */\r
- (void)i;\r
-\r
- /*\r
- * Default values (for no joystick -- each conditional will reset the\r
- * error flag)\r
- */\r
- joy->error = TRUE;\r
- joy->num_axes = joy->num_buttons = 0;\r
- joy->name[ 0 ] = '\0';\r
-\r
-#if TARGET_HOST_MACINTOSH\r
/* XXX FIXME: get joystick name in Mac */\r
\r
err = ISpStartup( );\r
}\r
else\r
joy->num_buttons = joy->num_axes = 0;\r
+}\r
+\r
+\r
+void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )\r
+{\r
+ fgJoystick[ ident ]->id = ident;\r
+ snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); /* FIXME */\r
+ fgJoystick[ ident ]->error = GL_FALSE;\r
+}\r
+\r
+\r
+void fgPlatformJoystickClose ( int ident )\r
+{\r
+ ISpSuspend( );\r
+ ISpStop( );\r
+ ISpShutdown( );\r
+}\r
#endif\r
\r
#if TARGET_HOST_MAC_OSX\r
+void fgPlatformJoystickOpen( SFG_Joystick* joy )\r
+{\r
+ IOReturn rv;\r
+ SInt32 score;\r
+ IOCFPlugInInterface **plugin;\r
+\r
+ HRESULT pluginResult;\r
+\r
+ CFDictionaryRef props;\r
+ CFTypeRef topLevelElement;\r
+\r
if( joy->id >= numDevices )\r
{\r
fgWarning( "device index out of range in fgJoystickOpen()" );\r
enumerateElements( topLevelElement );\r
\r
CFRelease( props );\r
-#endif\r
-\r
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
- joy->js.dwFlags = JOY_RETURNALL;\r
- joy->js.dwSize = sizeof( joy->js );\r
+}\r
\r
- memset( &joy->jsCaps, 0, sizeof( joy->jsCaps ) );\r
\r
- joy->error =\r
- ( joyGetDevCaps( joy->js_id, &joy->jsCaps, sizeof( joy->jsCaps ) ) !=\r
- JOYERR_NOERROR );\r
+void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )\r
+{\r
+ fgJoystick[ ident ]->id = ident;\r
+ fgJoystick[ ident ]->error = GL_FALSE;\r
+ fgJoystick[ ident ]->num_axes = 0;\r
+ fgJoystick[ ident ]->num_buttons = 0;\r
\r
- if( joy->jsCaps.wNumAxes == 0 )\r
- {\r
- joy->num_axes = 0;\r
- joy->error = GL_TRUE;\r
- }\r
- else\r
+ if( numDevices < 0 )\r
{\r
- /* Device name from jsCaps is often "Microsoft PC-joystick driver",\r
- * at least for USB. Try to get the real name from the registry.\r
- */\r
- if ( ! fghJoystickGetOEMProductName( joy, joy->name,\r
- sizeof( joy->name ) ) )\r
- {\r
- fgWarning( "JS: Failed to read joystick name from registry" );\r
- strncpy( joy->name, joy->jsCaps.szPname, sizeof( joy->name ) );\r
- }\r
+ /* do first-time init (since we can't over-ride jsInit, hmm */\r
+ numDevices = 0;\r
\r
- /* Windows joystick drivers may provide any combination of\r
- * X,Y,Z,R,U,V,POV - not necessarily the first n of these.\r
- */\r
- if( joy->jsCaps.wCaps & JOYCAPS_HASPOV )\r
+ mach_port_t masterPort;\r
+ IOReturn rv = IOMasterPort( bootstrap_port, &masterPort );\r
+ if( rv != kIOReturnSuccess )\r
{\r
- joy->num_axes = _JS_MAX_AXES;\r
- joy->min[ 7 ] = -1.0; joy->max[ 7 ] = 1.0; /* POV Y */\r
- joy->min[ 6 ] = -1.0; joy->max[ 6 ] = 1.0; /* POV X */\r
+ fgWarning( "error getting master Mach port" );\r
+ return;\r
}\r
- else\r
- joy->num_axes = 6;\r
-\r
- joy->min[ 5 ] = ( float )joy->jsCaps.wVmin;\r
- joy->max[ 5 ] = ( float )joy->jsCaps.wVmax;\r
- joy->min[ 4 ] = ( float )joy->jsCaps.wUmin;\r
- joy->max[ 4 ] = ( float )joy->jsCaps.wUmax;\r
- joy->min[ 3 ] = ( float )joy->jsCaps.wRmin;\r
- joy->max[ 3 ] = ( float )joy->jsCaps.wRmax;\r
- joy->min[ 2 ] = ( float )joy->jsCaps.wZmin;\r
- joy->max[ 2 ] = ( float )joy->jsCaps.wZmax;\r
- joy->min[ 1 ] = ( float )joy->jsCaps.wYmin;\r
- joy->max[ 1 ] = ( float )joy->jsCaps.wYmax;\r
- joy->min[ 0 ] = ( float )joy->jsCaps.wXmin;\r
- joy->max[ 0 ] = ( float )joy->jsCaps.wXmax;\r
+ fghJoystickFindDevices( masterPort );\r
}\r
\r
- /* Guess all the rest judging on the axes extremals */\r
- for( i = 0; i < joy->num_axes; i++ )\r
+ if ( ident >= numDevices )\r
{\r
- joy->center [ i ] = ( joy->max[ i ] + joy->min[ i ] ) * 0.5f;\r
- joy->dead_band[ i ] = 0.0f;\r
- joy->saturate [ i ] = 1.0f;\r
+ fgJoystick[ ident ]->error = GL_TRUE;\r
+ return;\r
+ }\r
+\r
+ /* get the name now too */\r
+ CFDictionaryRef properties = getCFProperties( ioDevices[ ident ] );\r
+ CFTypeRef ref = CFDictionaryGetValue( properties,\r
+ CFSTR( kIOHIDProductKey ) );\r
+ if (!ref)\r
+ ref = CFDictionaryGetValue(properties, CFSTR( "USB Product Name" ) );\r
+\r
+ if( !ref ||\r
+ !CFStringGetCString( ( CFStringRef )ref, name, 128,\r
+ CFStringGetSystemEncoding( ) ) )\r
+ {\r
+ fgWarning( "error getting device name" );\r
+ name[ 0 ] = '\0';\r
}\r
+}\r
+\r
+\r
+void fgPlatformJoystickClose ( int ident )\r
+{\r
+ ( *( 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
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
+}\r
+#endif\r
+\r
+\r
+\r
+\r
+\r
+\r
+static void fghJoystickOpen( SFG_Joystick* joy )\r
+{\r
+ /*\r
+ * Default values (for no joystick -- each conditional will reset the\r
+ * error flag)\r
+ */\r
+ joy->error = TRUE;\r
+ joy->num_axes = joy->num_buttons = 0;\r
+ joy->name[ 0 ] = '\0';\r
+\r
+ fgPlatformJoystickOpen ( joy );\r
+\r
+}\r
+\r
/*\r
* This function replaces the constructor method in the JS library.\r
*/\r
\r
\r
#if !defined(_WIN32_WCE)\r
+# include <windows.h>\r
+# include <mmsystem.h>\r
+# include <regstr.h>\r
+\r
+\r
+\r
+/* Inspired by\r
+ http://msdn.microsoft.com/archive/en-us/dnargame/html/msdn_sidewind3d.asp\r
+ */\r
+# if FREEGLUT_LIB_PRAGMAS\r
+# pragma comment (lib, "advapi32.lib")\r
+# endif\r
+\r
+static int fghJoystickGetOEMProductName ( SFG_Joystick* joy, char *buf, int buf_sz )\r
+{\r
+ char buffer [ 256 ];\r
+\r
+ char OEMKey [ 256 ];\r
+\r
+ HKEY hKey;\r
+ DWORD dwcb;\r
+ LONG lr;\r
+\r
+ if ( joy->error )\r
+ return 0;\r
+\r
+ /* Open .. MediaResources\CurrentJoystickSettings */\r
+ _snprintf ( buffer, sizeof(buffer), "%s\\%s\\%s",\r
+ REGSTR_PATH_JOYCONFIG, joy->jsCaps.szRegKey,\r
+ REGSTR_KEY_JOYCURR );\r
+\r
+ lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey);\r
+\r
+ if ( lr != ERROR_SUCCESS ) return 0;\r
+\r
+ /* Get OEM Key name */\r
+ dwcb = sizeof(OEMKey);\r
+\r
+ /* JOYSTICKID1-16 is zero-based; registry entries for VJOYD are 1-based. */\r
+ _snprintf ( buffer, sizeof(buffer), "Joystick%d%s", joy->js_id + 1, REGSTR_VAL_JOYOEMNAME );\r
+\r
+ lr = RegQueryValueEx ( hKey, buffer, 0, 0, (LPBYTE) OEMKey, &dwcb);\r
+ RegCloseKey ( hKey );\r
+\r
+ if ( lr != ERROR_SUCCESS ) return 0;\r
+\r
+ /* Open OEM Key from ...MediaProperties */\r
+ _snprintf ( buffer, sizeof(buffer), "%s\\%s", REGSTR_PATH_JOYOEM, OEMKey );\r
+\r
+ lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey );\r
+\r
+ if ( lr != ERROR_SUCCESS ) return 0;\r
+\r
+ /* Get OEM Name */\r
+ dwcb = buf_sz;\r
+\r
+ lr = RegQueryValueEx ( hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, (LPBYTE) buf,\r
+ &dwcb );\r
+ RegCloseKey ( hKey );\r
+\r
+ if ( lr != ERROR_SUCCESS ) return 0;\r
+\r
+ return 1;\r
+}\r
+\r
+\r
+void fgPlatformJoystickOpen( SFG_Joystick* joy )\r
+{\r
+ int i = 0;\r
+\r
+ joy->js.dwFlags = JOY_RETURNALL;\r
+ joy->js.dwSize = sizeof( joy->js );\r
+\r
+ memset( &joy->jsCaps, 0, sizeof( joy->jsCaps ) );\r
+\r
+ joy->error =\r
+ ( joyGetDevCaps( joy->js_id, &joy->jsCaps, sizeof( joy->jsCaps ) ) !=\r
+ JOYERR_NOERROR );\r
+\r
+ if( joy->jsCaps.wNumAxes == 0 )\r
+ {\r
+ joy->num_axes = 0;\r
+ joy->error = GL_TRUE;\r
+ }\r
+ else\r
+ {\r
+ /* Device name from jsCaps is often "Microsoft PC-joystick driver",\r
+ * at least for USB. Try to get the real name from the registry.\r
+ */\r
+ if ( ! fghJoystickGetOEMProductName( joy, joy->name,\r
+ sizeof( joy->name ) ) )\r
+ {\r
+ fgWarning( "JS: Failed to read joystick name from registry" );\r
+ strncpy( joy->name, joy->jsCaps.szPname, sizeof( joy->name ) );\r
+ }\r
+\r
+ /* Windows joystick drivers may provide any combination of\r
+ * X,Y,Z,R,U,V,POV - not necessarily the first n of these.\r
+ */\r
+ if( joy->jsCaps.wCaps & JOYCAPS_HASPOV )\r
+ {\r
+ joy->num_axes = _JS_MAX_AXES;\r
+ joy->min[ 7 ] = -1.0; joy->max[ 7 ] = 1.0; /* POV Y */\r
+ joy->min[ 6 ] = -1.0; joy->max[ 6 ] = 1.0; /* POV X */\r
+ }\r
+ else\r
+ joy->num_axes = 6;\r
+\r
+ joy->min[ 5 ] = ( float )joy->jsCaps.wVmin;\r
+ joy->max[ 5 ] = ( float )joy->jsCaps.wVmax;\r
+ joy->min[ 4 ] = ( float )joy->jsCaps.wUmin;\r
+ joy->max[ 4 ] = ( float )joy->jsCaps.wUmax;\r
+ joy->min[ 3 ] = ( float )joy->jsCaps.wRmin;\r
+ joy->max[ 3 ] = ( float )joy->jsCaps.wRmax;\r
+ joy->min[ 2 ] = ( float )joy->jsCaps.wZmin;\r
+ joy->max[ 2 ] = ( float )joy->jsCaps.wZmax;\r
+ joy->min[ 1 ] = ( float )joy->jsCaps.wYmin;\r
+ joy->max[ 1 ] = ( float )joy->jsCaps.wYmax;\r
+ joy->min[ 0 ] = ( float )joy->jsCaps.wXmin;\r
+ joy->max[ 0 ] = ( float )joy->jsCaps.wXmax;\r
+ }\r
+\r
+ /* Guess all the rest judging on the axes extremals */\r
+ for( i = 0; i < joy->num_axes; i++ )\r
+ {\r
+ joy->center [ i ] = ( joy->max[ i ] + joy->min[ i ] ) * 0.5f;\r
+ joy->dead_band[ i ] = 0.0f;\r
+ joy->saturate [ i ] = 1.0f;\r
+ }\r
+}\r
+\r
+\r
+\r
void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )\r
{\r
switch( ident )\r