diff --git a/CMakeLists.txt b/CMakeLists.txt index c01dce655..08b2cdd1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,25 +80,6 @@ if(EVENT_INPUT) endif() else(EVENT_INPUT) set(ENABLE_PLIB_JOYSTICK 1) - - message(STATUS "adding runtime JS dependencies") - if(APPLE) - # resolve frameworks to full paths - find_library(IOKIT_LIBRARY IOKit) - find_library(CF_LIBRARY CoreFoundation) - set(JS_LIBS ${IOKIT_LIBRARY} ${CF_LIBRARY}) - elseif(WIN32) - find_library(WINMM_LIBRARY winmm) - set(JS_LIBS ${WINMM_LIBRARY}) - elseif(CMAKE_SYSTEM_NAME MATCHES "Linux") - # anything needed here? - elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") - find_library(USBHID_LIBRARY usbhid) - # check_function_exists(hidinit) - set(JS_LIBS ${USBHID_LIBRARY}) - else() - message(WARNING "Unsupported platform for JS libs") - endif() endif(EVENT_INPUT) if (MSVC_3RDPARTY_DIR) @@ -135,7 +116,7 @@ if(ENABLE_LIBSVN) endif(LIBSVN_FOUND) endif(ENABLE_LIBSVN) -find_package(PLIB REQUIRED puaux pu fnt) +find_package(PLIB REQUIRED puaux pu js fnt) find_package(SimGear 2.2.0 REQUIRED) check_include_file(unistd.h HAVE_UNISTD_H) diff --git a/CMakeModules/FindPLIB.cmake b/CMakeModules/FindPLIB.cmake index c92f139b0..987943eb1 100644 --- a/CMakeModules/FindPLIB.cmake +++ b/CMakeModules/FindPLIB.cmake @@ -152,6 +152,30 @@ if(${PLIB_LIBRARIES} STREQUAL "PLIB_LIBRARIES-NOTFOUND") endforeach() endif() +list(FIND outDeps "js" haveJs) +if(${haveJs} GREATER -1) + message(STATUS "adding runtime JS dependencies") + if(APPLE) + # resolve frameworks to full paths + find_library(IOKIT_LIBRARY IOKit) + find_library(CF_LIBRARY CoreFoundation) + set(JS_LIBS ${IOKIT_LIBRARY} ${CF_LIBRARY}) + elseif(WIN32) + find_library(WINMM_LIBRARY winmm) + set(JS_LIBS ${WINMM_LIBRARY}) + elseif(CMAKE_SYSTEM_NAME MATCHES "Linux") + # anything needed here? + elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") + find_library(USBHID_LIBRARY usbhid) + # check_function_exists(hidinit) + set(JS_LIBS ${USBHID_LIBRARY}) + else() + message(WARNING "Unsupported platform for PLIB JS libs") + endif() + + list(APPEND PLIB_LIBRARIES ${JS_LIBS}) +endif() + include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(PLIB DEFAULT_MSG PLIB_LIBRARIES PLIB_INCLUDE_DIR) diff --git a/projects/VC90/FlightGear/FlightGear.vcproj b/projects/VC90/FlightGear/FlightGear.vcproj index 39b57a134..fc364e851 100644 --- a/projects/VC90/FlightGear/FlightGear.vcproj +++ b/projects/VC90/FlightGear/FlightGear.vcproj @@ -73,7 +73,7 @@ - - @@ -2641,14 +2637,6 @@ RelativePath="..\..\..\src\Input\input.hxx" > - - - - - - @@ -362,20 +358,12 @@ RelativePath="..\..\..\src\Input\jssuper.cxx" > - - - - diff --git a/src/Input/CMakeLists.txt b/src/Input/CMakeLists.txt index 1f8458fa2..e0d6abd30 100644 --- a/src/Input/CMakeLists.txt +++ b/src/Input/CMakeLists.txt @@ -5,15 +5,6 @@ set(EVENT_INPUT_SOURCES FGMacOSXEventInput.cxx ) -set (JS_INPUT_SOURCES - js.cxx - jsBSD.cxx - jsLinux.cxx - jsMacOSX.cxx - jsWindows.cxx - jsNone.cxx - ) - set(SOURCES FGButton.cxx FGCommonInput.cxx @@ -22,18 +13,13 @@ set(SOURCES FGJoystickInput.cxx FGKeyboardInput.cxx FGMouseInput.cxx - input.cxx + input.cxx ) - -# -# we still have a dependency on ul from plib! - + if(EVENT_INPUT) list(APPEND SOURCES ${EVENT_INPUT_SOURCES}) -else() - list(APPEND SOURCES ${JS_INPUT_SOURCES}) endif() - + set(FGJS_SOURCES fgjs.cxx jsinput.cxx @@ -47,20 +33,17 @@ if(WIN32) endif(WIN32) target_link_libraries(fgjs - fgInput ${SOCKETS_LIBRARY} ${SIMGEAR_LIBRARIES} ${PLIB_LIBRARIES} - ${JS_LIBS} ${ZLIB_LIBRARY}) -add_executable(js_demo js_demo.cxx ) +add_executable(js_demo js_demo.cxx) -target_link_libraries(js_demo - fgInput - ${JS_LIBS} +target_link_libraries(js_demo + ${SIMGEAR_LIBRARIES} ${PLIB_LIBRARIES} - ) + ${ZLIB_LIBRARY}) flightgear_component(Input "${SOURCES}") diff --git a/src/Input/FGJoystickInput.cxx b/src/Input/FGJoystickInput.cxx index df992cf30..349782d5b 100644 --- a/src/Input/FGJoystickInput.cxx +++ b/src/Input/FGJoystickInput.cxx @@ -89,7 +89,7 @@ void FGJoystickInput::init() continue; } - std::string name = js->getName(); + const char * name = js->getName(); SGPropertyNode_ptr js_node = js_nodes->getChild("js", i); if (js_node) { @@ -130,8 +130,14 @@ void FGJoystickInput::postinit() if (!js_node || js->notWorking()) continue; - int nbuttons = js->getNumButtons(); +#ifdef WIN32 + JOYCAPS jsCaps ; + joyGetDevCaps( i, &jsCaps, sizeof(jsCaps) ); + unsigned int nbuttons = jsCaps.wNumButtons; if (nbuttons > MAX_JOYSTICK_BUTTONS) nbuttons = MAX_JOYSTICK_BUTTONS; +#else + unsigned int nbuttons = MAX_JOYSTICK_BUTTONS; +#endif int naxes = js->getNumAxes(); if (naxes > MAX_JOYSTICK_AXES) naxes = MAX_JOYSTICK_AXES; diff --git a/src/Input/FGJoystickInput.hxx b/src/Input/FGJoystickInput.hxx index a59f9bbe2..ef1530ec0 100644 --- a/src/Input/FGJoystickInput.hxx +++ b/src/Input/FGJoystickInput.hxx @@ -31,9 +31,8 @@ #include "FGCommonInput.hxx" #include "FGButton.hxx" -#include "FGjs.hxx" #include - +#include //////////////////////////////////////////////////////////////////////// // The Joystick Input Class diff --git a/src/Input/FGjs.hxx b/src/Input/FGjs.hxx deleted file mode 100644 index 0dca92d6e..000000000 --- a/src/Input/FGjs.hxx +++ /dev/null @@ -1,92 +0,0 @@ -/* - PLIB - A Suite of Portable Game Libraries - Copyright (C) 1998,2002 Steve Baker - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - For further information visit http://plib.sourceforge.net - - $Id: js.h 2067 2006-01-30 07:36:01Z bram $ -*/ - -#ifndef __INCLUDED_JS_H__ -#define __INCLUDED_JS_H__ 1 - -#include -#include -#include // -dw- for memcpy -#include - -#define _JS_MAX_AXES 16 -#define _JS_MAX_BUTTONS 32 -#define _JS_MAX_HATS 4 - -class jsJoystick -{ - int id ; -protected: - struct os_specific_s *os ; - friend struct os_specific_s ; - bool error ; - std::string name; - int num_axes ; - int num_buttons ; - - float dead_band [ _JS_MAX_AXES ] ; - float saturate [ _JS_MAX_AXES ] ; - float center [ _JS_MAX_AXES ] ; - float max [ _JS_MAX_AXES ] ; - float min [ _JS_MAX_AXES ] ; - - void open () ; - void close () ; - - float fudge_axis ( float value, int axis ) const ; - void rawRead ( int *buttons, float *axes ) ; - -public: - - jsJoystick ( int ident = 0 ) ; - ~jsJoystick () { close () ; } - - std::string getName () const { return name ; } - int getNumAxes () const { return num_axes ; } - int getNumButtons () const { return num_buttons; } - bool notWorking () const { return error ; } - void setError () { error = true ; } - - float getDeadBand ( int axis ) const { return dead_band [ axis ] ; } - void setDeadBand ( int axis, float db ) { dead_band [ axis ] = db ; } - - float getSaturation ( int axis ) const { return saturate [ axis ] ; } - void setSaturation ( int axis, float st ) { saturate [ axis ] = st ; } - - void setMinRange ( float *axes ) { memcpy ( min , axes, num_axes * sizeof(float) ) ; } - void setMaxRange ( float *axes ) { memcpy ( max , axes, num_axes * sizeof(float) ) ; } - void setCenter ( float *axes ) { memcpy ( center, axes, num_axes * sizeof(float) ) ; } - - void getMinRange ( float *axes ) const { memcpy ( axes, min , num_axes * sizeof(float) ) ; } - void getMaxRange ( float *axes ) const { memcpy ( axes, max , num_axes * sizeof(float) ) ; } - void getCenter ( float *axes ) const { memcpy ( axes, center, num_axes * sizeof(float) ) ; } - - void read ( int *buttons, float *axes ) ; - // bool SetForceFeedBack ( int axe, float force ); -} ; - -extern void jsInit () ; - -#endif - - diff --git a/src/Input/Makefile.am b/src/Input/Makefile.am index 4cdb2fee1..4436e28b5 100644 --- a/src/Input/Makefile.am +++ b/src/Input/Makefile.am @@ -18,6 +18,8 @@ if HAVE_FRAMEWORK_PLIB js_demo_LDFLAGS = $(plib_FRAMEWORK) fgjs_LDFLAGS = $(plib_FRAMEWORK) else +js_demo_PLIB_LIBS = -lplibjs -lplibul +fgjs_PLIB_LIBS = -lplibjs -lplibul js_demo_LDFLAGS = fgjs_LDFLAGS= endif @@ -34,18 +36,17 @@ libInput_a_SOURCES = input.cxx input.hxx FGCommonInput.cxx FGCommonInput.hxx \ FGMouseInput.cxx FGMouseInput.hxx \ FGKeyboardInput.cxx FGKeyboardInput.hxx \ FGJoystickInput.cxx FGJoystickInput.hxx \ - js.cxx jsBSD.cxx jsLinux.cxx jsMacOSX.cxx jsNone.cxx FGjs.hxx \ $(libInput_Event_SOURCES) bin_PROGRAMS = js_demo fgjs -js_demo_SOURCES = js_demo.cxx +js_demo_SOURCES = js_demo.cxx -js_demo_LDADD = $(base_LIBS) -L. -lInput -lplibul +js_demo_LDADD = $(js_demo_PLIB_LIBS) $(base_LIBS) $(joystick_LIBS) fgjs_SOURCES = fgjs.cxx jsinput.cxx jsinput.h jssuper.cxx jssuper.h -fgjs_LDADD = $(base_LIBS) $(joystick_LIBS) -L. -lInput -lplibul \ +fgjs_LDADD = $(js_demo_PLIB_LIBS) $(base_LIBS) $(joystick_LIBS) \ -lsgprops -lsgmisc -lsgio -lsgdebug -lsgstructure -lsgxml -lz $(network_LIBS) INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src -I$(top_srcdir)/src/Main \ diff --git a/src/Input/js.cxx b/src/Input/js.cxx deleted file mode 100644 index 055e27f6a..000000000 --- a/src/Input/js.cxx +++ /dev/null @@ -1,87 +0,0 @@ -/* - PLIB - A Suite of Portable Game Libraries - Copyright (C) 1998,2002 Steve Baker - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - For further information visit http://plib.sourceforge.net - -*/ - -#include "FGjs.hxx" - - -float jsJoystick::fudge_axis ( float value, int axis ) const -{ - if ( value < center[axis] ) - { - float xx = ( value - center[ axis ] ) / - ( center [ axis ] - min [ axis ] ) ; - - if ( xx < -saturate [ axis ] ) - return -1.0f ; - - if ( xx > -dead_band [ axis ] ) - return 0.0f ; - - xx = ( xx + dead_band [ axis ] ) / - ( saturate [ axis ] - dead_band [ axis ] ) ; - - return ( xx < -1.0f ) ? -1.0f : xx ; - } - else - { - float xx = ( value - center [ axis ] ) / - ( max [ axis ] - center [ axis ] ) ; - - if ( xx > saturate [ axis ] ) - return 1.0f ; - - if ( xx < dead_band [ axis ] ) - return 0.0f ; - - xx = ( xx - dead_band [ axis ] ) / - ( saturate [ axis ] - dead_band [ axis ] ) ; - - return ( xx > 1.0f ) ? 1.0f : xx ; - } -} - - -void jsJoystick::read ( int *buttons, float *axes ) -{ - if ( error ) - { - if ( buttons ) - *buttons = 0 ; - - if ( axes ) - for ( int i = 0 ; i < num_axes ; i++ ) - axes[i] = 0.0f ; - - return ; - } - - float raw_axes [ _JS_MAX_AXES ] ; - - rawRead ( buttons, raw_axes ) ; - - if ( axes ) - for ( int i = 0 ; i < num_axes ; i++ ) - axes[i] = fudge_axis ( raw_axes[i], i ) ; -} - - - diff --git a/src/Input/jsBSD.cxx b/src/Input/jsBSD.cxx deleted file mode 100644 index 811106700..000000000 --- a/src/Input/jsBSD.cxx +++ /dev/null @@ -1,497 +0,0 @@ -/* - PLIB - A Suite of Portable Game Libraries - Copyright (C) 1998,2002 Steve Baker - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - For further information visit http://plib.sourceforge.net - - $Id: jsBSD.cxx 2063 2006-01-05 21:21:55Z fayjf $ -*/ - -/* - * Inspired by the X-Mame USB HID joystick driver for NetBSD and - * FreeBSD by Krister Walfridsson . - * Incorporates the original analog joystick driver for BSD by - * Stephen Montgomery-Smith , with - * NetBSD mods courtesy of Rene Hexel. - * - * Bert Driehuis - * - * Notes: - * Hats are mapped to two axes for now. A cleaner implementation requires - * an API extension, and to be useful for my devious purposes, FlightGear - * would need to understand that. - */ - - -#ifdef __FreeBSD__ - -#include "FGjs.h" - -#include -#include -#include -#include -#ifdef HAVE_USB_JS - -extern "C" { -# if __FreeBSD_version < 500000 -# include -# else -# define HAVE_USBHID_H 1 -# include -# endif -} - -#include -#include - -/* Compatibility with older usb.h revisions */ -#if !defined(USB_MAX_DEVNAMES) && defined(MAXDEVNAMES) -#define USB_MAX_DEVNAMES MAXDEVNAMES -#endif -#endif - -static int hatmap_x[9] = { 0, 0, 1, 1, 1, 0, -1, -1, -1 }; -static int hatmap_y[9] = { 0, 1, 1, 0, -1, -1, -1, 0, 1 }; -struct os_specific_s { - char fname [128 ]; - int fd; - int is_analog; - // The following structure members are specific to analog joysticks - struct joystick ajs; -#ifdef HAVE_USB_JS - // The following structure members are specific to USB joysticks - struct hid_item *hids; - int hid_dlen; - int hid_offset; - char *hid_data_buf; - int axes_usage [ _JS_MAX_AXES ] ; -#endif - // We keep button and axes state ourselves, as they might not be updated - // on every read of a USB device - int cache_buttons ; - float cache_axes [ _JS_MAX_AXES ] ; -}; - -// Idents lower than USB_IDENT_OFFSET are for analog joysticks. -#define USB_IDENT_OFFSET 2 - -#define USBDEV "/dev/usb" -#define UHIDDEV "/dev/uhid" -#define AJSDEV "/dev/joy" - -/* - * findusbdev (and its helper, walkusbdev) try to locate the full name - * of a USB device. If /dev/usbN isn't readable, we punt and return the - * uhidN device name. We warn the user of this situation once. - */ -static char * -walkusbdev(int f, char *dev, char *out, int outlen) -{ - struct usb_device_info di; - int i, a; - char *cp; - - for (a = 1; a < USB_MAX_DEVICES; a++) { - di.udi_addr = a; - if (ioctl(f, USB_DEVICEINFO, &di) != 0) - return NULL; - for (i = 0; i < USB_MAX_DEVNAMES; i++) - if (di.udi_devnames[i][0] && - strcmp(di.udi_devnames[i], dev) == 0) { - cp = new char[strlen(di.udi_vendor) + strlen(di.udi_product) + 2]; - strcpy(cp, di.udi_vendor); - strcat(cp, " "); - strcat(cp, di.udi_product); - strncpy(out, cp, outlen - 1); - out[outlen - 1] = 0; - delete cp; - return out; - } - } - return NULL; -} - -static int -findusbdev(char *name, char *out, int outlen) -{ - int i, f; - char buf[50]; - char *cp; - static int protection_warned = 0; - - for (i = 0; i < 16; i++) { - sprintf(buf, "%s%d", USBDEV, i); - f = open(buf, O_RDONLY); - if (f >= 0) { - cp = walkusbdev(f, name, out, outlen); - close(f); - if (cp) - return 1; - } else if (errno == EACCES) { - if (!protection_warned) { - fprintf(stderr, "Can't open %s for read!\n", - buf); - protection_warned = 1; - } - } - } - return 0; -} - -static int joy_initialize_hid(struct os_specific_s *os, - int *num_axes, int *num_buttons) -{ - int size, is_joystick; -#ifdef HAVE_USBHID_H - int report_id = 0; -#endif - struct hid_data *d; - struct hid_item h; - report_desc_t rd; - - if ((rd = hid_get_report_desc(os->fd)) == 0) - { - fprintf(stderr, "error: %s: %s", os->fname, strerror(errno)); - return FALSE; - } - - os->hids = NULL; - -#ifdef HAVE_USBHID_H - if (ioctl(os->fd, USB_GET_REPORT_ID, &report_id) < 0) - { - fprintf(stderr, "error: %s: %s", os->fname, strerror(errno)); - return FALSE; - } - - size = hid_report_size(rd, hid_input, report_id); -#else - size = hid_report_size(rd, 0, hid_input); -#endif - os->hid_data_buf = new char[size]; - os->hid_dlen = size; - - is_joystick = 0; -#ifdef HAVE_USBHID_H - d = hid_start_parse(rd, 1 << hid_input, report_id); -#else - d = hid_start_parse(rd, 1 << hid_input); -#endif - while (hid_get_item(d, &h)) - { - int usage, page, interesting_hid; - - page = HID_PAGE(h.usage); - usage = HID_USAGE(h.usage); - - /* This test is somewhat too simplistic, but this is how MicroSoft - * does, so I guess it works for all joysticks/game pads. */ - is_joystick = is_joystick || - (h.kind == hid_collection && - page == HUP_GENERIC_DESKTOP && - (usage == HUG_JOYSTICK || usage == HUG_GAME_PAD)); - - if (h.kind != hid_input) - continue; - - if (!is_joystick) - continue; - - interesting_hid = TRUE; - if (page == HUP_GENERIC_DESKTOP) - { - switch(usage) { - case HUG_X: - case HUG_RX: - case HUG_Y: - case HUG_RY: - case HUG_Z: - case HUG_RZ: - case HUG_SLIDER: - if (*num_axes < _JS_MAX_AXES) - { - os->axes_usage[*num_axes] = usage; - (*num_axes)++; - } - break; - case HUG_HAT_SWITCH: - if (*num_axes + 1 < _JS_MAX_AXES) // Allocate two axes for a hat - { - os->axes_usage[*num_axes] = usage; - (*num_axes)++; - os->axes_usage[*num_axes] = usage; - (*num_axes)++; - } - break; - default: - interesting_hid = FALSE; - } - } - else if (page == HUP_BUTTON) - { - interesting_hid = (usage > 0) && (usage <= _JS_MAX_BUTTONS); - - if (interesting_hid && usage - 1 > *num_buttons) - { - *num_buttons = usage - 1; - } - } - - if (interesting_hid) - { - h.next = os->hids; - os->hids = new struct hid_item; - *os->hids = h; - } - } - hid_end_parse(d); - - return (os->hids != NULL); -} - -void jsJoystick::open () -{ - char *cp; - - for ( int i = 0 ; i < _JS_MAX_AXES ; i++ ) - os->cache_axes [ i ] = 0.0f ; - - os->cache_buttons = 0 ; - - os->fd = ::open ( os->fname, O_RDONLY | O_NONBLOCK) ; - - if (os->fd < 0 && errno == EACCES) - fprintf(stderr, "%s exists but is not readable by you\n", os->fname); - - error = ( os->fd < 0 ) ; - - if ( error ) - return ; - - num_axes = 0; - num_buttons = 0; - if ( os->is_analog ) - { - num_axes = 2 ; - num_buttons = 32 ; - FILE *joyfile ; - char joyfname [ 1024 ] ; - int noargs, in_no_axes ; - - float axes [ _JS_MAX_AXES ] ; - int buttons [ _JS_MAX_AXES ] ; - - rawRead ( buttons, axes ) ; - error = axes[0] < -1000000000.0f && axes[1] < -1000000000.0f ; - if ( error ) - return ; - - sprintf( joyfname, "%s/.joy%drc", ::getenv ( "HOME" ), id ) ; - - joyfile = fopen ( joyfname, "r" ) ; - error = ( joyfile == NULL ) ; - if ( error ) - { - ulSetError ( UL_WARNING, "unable to open calibration file %s (%s), joystick %i disabled (you can generate the calibration file with the plib-jscal utility)", - joyfname, strerror ( errno ), id + 1 ); - return ; - } - - noargs = fscanf ( joyfile, "%d%f%f%f%f%f%f", &in_no_axes, - &min [ 0 ], ¢er [ 0 ], &max [ 0 ], - &min [ 1 ], ¢er [ 1 ], &max [ 1 ] ) ; - error = noargs != 7 || in_no_axes != _JS_MAX_AXES ; - fclose ( joyfile ) ; - if ( error ) - return ; - - for ( int i = 0 ; i < _JS_MAX_AXES ; i++ ) - { - dead_band [ i ] = 0.0f ; - saturate [ i ] = 1.0f ; - } - - return; // End of analog code - } - - if ( !joy_initialize_hid(os, &num_axes, &num_buttons ) ) - { - ::close(os->fd); - error = 1; - return; - } - - cp = strrchr(os->fname, '/'); - char tmpname[128]; - if (cp) { - if (findusbdev(&cp[1], tmpname, sizeof(tmpname)) == 0) - strcpy(name, &cp[1]); - } - name = tmpname; - - if ( num_axes > _JS_MAX_AXES ) - num_axes = _JS_MAX_AXES ; - - for ( int i = 0 ; i < _JS_MAX_AXES ; i++ ) - { - // We really should get this from the HID, but that data seems - // to be quite unreliable for analog-to-USB converters. Punt for - // now. - if ( os->axes_usage [ i ] == HUG_HAT_SWITCH ) - { - max [ i ] = 1.0f ; - center [ i ] = 0.0f ; - min [ i ] = -1.0f ; - } - else - { - max [ i ] = 255.0f ; - center [ i ] = 127.0f ; - min [ i ] = 0.0f ; - } - dead_band [ i ] = 0.0f ; - saturate [ i ] = 1.0f ; - } -} - -void jsJoystick::close () -{ - if (os) { - if ( ! error ) - ::close ( os->fd ) ; - if (os->hids) - delete os->hids; - if (os->hid_data_buf) - delete os->hid_data_buf; - delete os; - } -} - -jsJoystick::jsJoystick ( int ident ) -{ - id = ident ; - error = 0; - - os = new struct os_specific_s; - memset(os, 0, sizeof(struct os_specific_s)); - if (ident < USB_IDENT_OFFSET) - os->is_analog = 1; - if (os->is_analog) - sprintf(os->fname, "%s%d", AJSDEV, ident); - else - sprintf(os->fname, "%s%d", UHIDDEV, ident - USB_IDENT_OFFSET); - open () ; -} - - -void jsJoystick::rawRead ( int *buttons, float *axes ) -{ - int len, usage, page, d; - struct hid_item *h; - - if ( error ) - { - if ( buttons ) - *buttons = 0 ; - - if ( axes ) - for ( int i = 0 ; i < num_axes ; i++ ) - axes[i] = 1500.0f ; - - return ; - } - - if ( os->is_analog ) - { - int status = ::read ( os->fd, &os->ajs, sizeof(os->ajs) ); - if ( status != sizeof(os->ajs) ) { - perror ( os->fname ) ; - setError () ; - return ; - } - if ( buttons != NULL ) - *buttons = ( os->ajs.b1 ? 1 : 0 ) | ( os->ajs.b2 ? 2 : 0 ) ; - - if ( axes != NULL ) - { - if ( os->ajs.x >= -1000000000 ) - os->cache_axes[0] = os->ajs.x; - if ( os->ajs.y >= -1000000000 ) - os->cache_axes[1] = os->ajs.y; - - axes[0] = os->cache_axes[0]; - axes[1] = os->cache_axes[1]; - } - - return; - } - - while ((len = ::read(os->fd, os->hid_data_buf, os->hid_dlen)) == os->hid_dlen) - { - for (h = os->hids; h; h = h->next) - { - d = hid_get_data(os->hid_data_buf, h); - - page = HID_PAGE(h->usage); - usage = HID_USAGE(h->usage); - - if (page == HUP_GENERIC_DESKTOP) - { - for (int i = 0; i < num_axes; i++) - if (os->axes_usage[i] == usage) - { - if (usage == HUG_HAT_SWITCH) - { - if (d < 0 || d > 8) - d = 0; // safety - os->cache_axes[i] = (float)hatmap_x[d]; - os->cache_axes[i + 1] = (float)hatmap_y[d]; - } - else - { - os->cache_axes[i] = (float)d; - } - break; - } - } - else if (page == HUP_BUTTON) - { - if (usage > 0 && usage < _JS_MAX_BUTTONS + 1) - { - if (d) - os->cache_buttons |= (1 << usage - 1) ; - else - os->cache_buttons &= ~(1 << usage - 1) ; - } - } - } - } - if (len < 0 && errno != EAGAIN) - { - perror( os->fname ) ; - setError () ; - error = 1; - } - if ( buttons != NULL ) *buttons = os->cache_buttons ; - if ( axes != NULL ) - memcpy ( axes, os->cache_axes, sizeof(float) * num_axes ) ; -} - -void jsInit () {} - -#endif diff --git a/src/Input/jsLinux.cxx b/src/Input/jsLinux.cxx deleted file mode 100644 index 5c5636885..000000000 --- a/src/Input/jsLinux.cxx +++ /dev/null @@ -1,203 +0,0 @@ -/* - PLIB - A Suite of Portable Game Libraries - Copyright (C) 1998,2002 Steve Baker - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - For further information visit http://plib.sourceforge.net - - $Id: jsLinux.cxx 2017 2005-02-21 07:37:25Z bram $ -*/ - - -#ifdef linux - -#include "FGjs.hxx" - -#include - -#if defined(JS_VERSION) && JS_VERSION >= 0x010000 - -#include -#include -#include -#include -#include - -struct os_specific_s { - js_event js ; - int tmp_buttons ; - float tmp_axes [ _JS_MAX_AXES ] ; - char fname [ 128 ] ; - int fd ; -}; - -void jsInit () {} - -void jsJoystick::open () -{ - name [0] = '\0' ; - - for ( int i = 0 ; i < _JS_MAX_AXES ; i++ ) - os->tmp_axes [ i ] = 0.0f ; - - os->tmp_buttons = 0 ; - - os->fd = ::open ( os->fname, O_RDONLY ) ; - - error = ( os->fd < 0 ) ; - - if ( error ) - return ; - - /* - Set the correct number of axes for the linux driver - */ - - /* Melchior Franz's fixes for big-endian Linuxes since writing - * to the upper byte of an uninitialized word doesn't work. - * 9 April 2003 - */ - unsigned char u ; - ioctl ( os->fd, JSIOCGAXES , &u ) ; - num_axes = u ; - ioctl ( os->fd, JSIOCGBUTTONS, &u ) ; - num_buttons = u ; - char tmpname[256]; - ioctl ( os->fd, JSIOCGNAME ( sizeof(tmpname) ), tmpname ) ; - fcntl ( os->fd, F_SETFL , O_NONBLOCK ) ; - name = tmpname; - int all_axes = num_axes; - if ( num_axes > _JS_MAX_AXES ) - num_axes = _JS_MAX_AXES ; - - // Remove any deadband value already done in the kernel. - // Since we have our own deadband management this is save to do so. - struct js_corr* corr = new js_corr[ all_axes ] ; - ioctl ( os->fd, JSIOCGCORR, corr ); - for ( int i = 0; i < num_axes ; ++i ) { - if ( corr[ i ] . type == JS_CORR_BROKEN ) { - int nodeadband = ( corr[ i ] . coef[ 0 ] + corr[ i ] . coef[ 1 ] ) / 2 ; - corr[ i ] . coef[ 0 ] = nodeadband ; - corr[ i ] . coef[ 1 ] = nodeadband ; - } - } - ioctl ( os->fd, JSIOCSCORR, corr ); - delete [] corr; - - for ( int i = 0 ; i < _JS_MAX_AXES ; i++ ) - { - max [ i ] = 32767.0f ; - center [ i ] = 0.0f ; - min [ i ] = -32767.0f ; - dead_band [ i ] = 0.0f ; - saturate [ i ] = 1.0f ; - } -} - -void jsJoystick::close () -{ - if ( ! error ) - ::close ( os->fd ) ; - delete os; -} - - -jsJoystick::jsJoystick ( int ident ) -{ - id = ident ; - os = new struct os_specific_s; - - sprintf ( os->fname, "/dev/input/js%d", ident ) ; - - if ( access ( os->fname, F_OK ) != 0 ) - sprintf ( os->fname, "/dev/js%d", ident ) ; - - open () ; -} - - -void jsJoystick::rawRead ( int *buttons, float *axes ) -{ - if ( error ) - { - if ( buttons ) - *buttons = 0 ; - - if ( axes ) - for ( int i = 0 ; i < num_axes ; i++ ) - axes[i] = 1500.0f ; - - return ; - } - - while (1) - { - int status = ::read ( os->fd, &(os->js), sizeof(js_event) ) ; - - if ( status != sizeof(js_event) ) - { - /* use the old values */ - - if ( buttons != NULL ) *buttons = os->tmp_buttons ; - if ( axes != NULL ) - memcpy ( axes, os->tmp_axes, sizeof(float) * num_axes ) ; - - if ( errno == EAGAIN ) - return ; - - perror( os->fname ) ; - setError () ; - return ; - } - - switch ( os->js.type & ~JS_EVENT_INIT ) - { - case JS_EVENT_BUTTON : - if ( os->js.value == 0 ) /* clear the flag */ - os->tmp_buttons &= ~(1 << os->js.number) ; - else - os->tmp_buttons |= (1 << os->js.number) ; - break ; - - case JS_EVENT_AXIS: - if ( os->js.number < num_axes ) - { - os->tmp_axes [ os->js.number ] = (float) os->js.value ; - - if ( axes ) - memcpy ( axes, os->tmp_axes, sizeof(float) * num_axes ) ; - } - break ; - - default: - ulSetError ( UL_WARNING, "PLIB_JS: Unrecognised /dev/js return!?!" ) ; - - /* use the old values */ - - if ( buttons != NULL ) *buttons = os->tmp_buttons ; - if ( axes != NULL ) - memcpy ( axes, os->tmp_axes, sizeof(float) * num_axes ) ; - - return ; - } - - if ( buttons != NULL ) - *buttons = os->tmp_buttons ; - } -} - -#endif -#endif diff --git a/src/Input/jsMacOSX.cxx b/src/Input/jsMacOSX.cxx deleted file mode 100644 index 07f87e876..000000000 --- a/src/Input/jsMacOSX.cxx +++ /dev/null @@ -1,466 +0,0 @@ -/* - PLIB - A Suite of Portable Game Libraries - Copyright (C) 1998,2002 Steve Baker - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - For further information visit http://plib.sourceforge.net - - $Id: jsMacOSX.cxx 2158 2009-08-29 12:35:36Z fayjf $ -*/ - -#ifdef __APPLE__ - -#include "FGjs.hxx" - -#include - -#include -#include -#include -#include -#include -#include -#include - -#ifdef MACOS_10_0_4 -# include -#else -/* The header was moved here in MacOS X 10.1 */ -# include -#endif - -static const int kNumDevices = 32; -static int numDevices = -1; -static io_object_t ioDevices[kNumDevices]; - -static int NS_hat[8] = {1, 1, 0, -1, -1, -1, 0, 1}; -static int WE_hat[8] = {0, 1, 1, 1, 0, -1, -1, -1}; - -struct os_specific_s { - IOHIDDeviceInterface ** hidDev; - IOHIDElementCookie buttonCookies[41]; - IOHIDElementCookie axisCookies[_JS_MAX_AXES]; - IOHIDElementCookie hatCookies[_JS_MAX_HATS]; - int num_hats; - long hat_min[_JS_MAX_HATS]; - long hat_max[_JS_MAX_HATS]; - - void enumerateElements(jsJoystick* joy, CFTypeRef element); - static void elementEnumerator( const void *element, void* vjs); - /// callback for CFArrayApply - void parseElement(jsJoystick* joy, CFDictionaryRef element); - void addAxisElement(jsJoystick* joy, CFDictionaryRef axis); - void addButtonElement(jsJoystick* joy, CFDictionaryRef button); - void addHatElement(jsJoystick* joy, CFDictionaryRef hat); -}; - -static void findDevices(mach_port_t); -static CFDictionaryRef getCFProperties(io_object_t); - - -void jsInit() -{ - if (numDevices < 0) { - numDevices = 0; - - mach_port_t masterPort; - IOReturn rv = IOMasterPort(bootstrap_port, &masterPort); - if (rv != kIOReturnSuccess) { - ulSetError(UL_WARNING, "error getting master Mach port"); - return; - } - - findDevices(masterPort); - } -} - -/** open the IOKit connection, enumerate all the HID devices, add their -interface references to the static array. We then use the array index -as the device number when we come to open() the joystick. */ -static void findDevices(mach_port_t masterPort) -{ - CFMutableDictionaryRef hidMatch = NULL; - IOReturn rv = kIOReturnSuccess; - io_iterator_t hidIterator; - - // build a dictionary matching HID devices - hidMatch = IOServiceMatching(kIOHIDDeviceKey); - - rv = IOServiceGetMatchingServices(masterPort, hidMatch, &hidIterator); - if (rv != kIOReturnSuccess || !hidIterator) { - ulSetError(UL_WARNING, "no joystick (HID) devices found"); - return; - } - - // iterate - io_object_t ioDev; - - while ((ioDev = IOIteratorNext(hidIterator))) { - // filter out keyboard and mouse devices - CFDictionaryRef properties = getCFProperties(ioDev); - long usage, page; - - CFTypeRef refPage = CFDictionaryGetValue (properties, CFSTR(kIOHIDPrimaryUsagePageKey)); - CFTypeRef refUsage = CFDictionaryGetValue (properties, CFSTR(kIOHIDPrimaryUsageKey)); - CFNumberGetValue((CFNumberRef) refUsage, kCFNumberLongType, &usage); - CFNumberGetValue((CFNumberRef) refPage, kCFNumberLongType, &page); - - // keep only joystick devices - if ( (page == kHIDPage_GenericDesktop) && - ((usage == kHIDUsage_GD_Joystick) || - (usage == kHIDUsage_GD_GamePad) - // || (usage == kHIDUsage_GD_MultiAxisController) - // || (usage == kHIDUsage_GD_Hatswitch) - ) - ) - { - // add it to the array - ioDevices[numDevices++] = ioDev; - } - } - - IOObjectRelease(hidIterator); -} - - -jsJoystick::jsJoystick(int ident) : - id(ident), - os(NULL), - error(JS_FALSE), - num_axes(0), - num_buttons(0) -{ - if (ident >= numDevices) { - setError(); - return; - } - - os = new struct os_specific_s; - os->num_hats = 0; - - // get the name now too - CFDictionaryRef properties = getCFProperties(ioDevices[id]); - CFTypeRef ref = CFDictionaryGetValue (properties, CFSTR(kIOHIDProductKey)); - if (!ref) - ref = CFDictionaryGetValue (properties, CFSTR("USB Product Name")); - - if (!ref || !CFStringGetCString ((CFStringRef) ref, name, 128, CFStringGetSystemEncoding ())) { - ulSetError(UL_WARNING, "error getting device name"); - name[0] = '\0'; - } - //printf("Joystick name: %s \n", name); - open(); -} - -void jsJoystick::open() -{ -#if 0 // test already done in the constructor - if (id >= numDevices) { - ulSetError(UL_WARNING, "device index out of range in jsJoystick::open"); - return; - } -#endif - - // create device interface - IOReturn rv; - SInt32 score; - IOCFPlugInInterface **plugin; - - rv = IOCreatePlugInInterfaceForService(ioDevices[id], - kIOHIDDeviceUserClientTypeID, - kIOCFPlugInInterfaceID, - &plugin, &score); - - if (rv != kIOReturnSuccess) { - ulSetError(UL_WARNING, "error creting plugin for io device"); - return; - } - - HRESULT pluginResult = (*plugin)->QueryInterface(plugin, - CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID), (LPVOID*)&(os->hidDev) ); - - if (pluginResult != S_OK) - ulSetError(UL_WARNING, "QI-ing IO plugin to HID Device interface failed"); - - (*plugin)->Release(plugin); // don't leak a ref - if (os->hidDev == NULL) return; - - // store the interface in this instance - rv = (*(os->hidDev))->open(os->hidDev, 0); - if (rv != kIOReturnSuccess) { - ulSetError(UL_WARNING, "error opening device interface"); - return; - } - - CFDictionaryRef props = getCFProperties(ioDevices[id]); - - // recursively enumerate all the bits (buttons, axes, hats, ...) - CFTypeRef topLevelElement = - CFDictionaryGetValue (props, CFSTR(kIOHIDElementKey)); - os->enumerateElements(this, topLevelElement); - CFRelease(props); - - // for hats to be implemented as axes: must be the last axes: - for (int h = 0; h<2*os->num_hats; h++) - { - int index = num_axes++; - dead_band [ index ] = 0.0f ; - saturate [ index ] = 1.0f ; - center [ index ] = 0.0f; - max [ index ] = 1.0f; - min [ index ] = -1.0f; - } -} - -CFDictionaryRef getCFProperties(io_object_t ioDev) -{ - IOReturn rv; - CFMutableDictionaryRef cfProperties; - -#if 0 - // comment copied from darwin/SDL_sysjoystick.c - /* Mac OS X currently is not mirroring all USB properties to HID page so need to look at USB device page also - * get dictionary for usb properties: step up two levels and get CF dictionary for USB properties - */ - - io_registry_entry_t parent1, parent2; - - rv = IORegistryEntryGetParentEntry (ioDev, kIOServicePlane, &parent1); - if (rv != kIOReturnSuccess) { - ulSetError(UL_WARNING, "error getting device entry parent"); - return NULL; - } - - rv = IORegistryEntryGetParentEntry (parent1, kIOServicePlane, &parent2); - if (rv != kIOReturnSuccess) { - ulSetError(UL_WARNING, "error getting device entry parent 2"); - return NULL; - } - -#endif - rv = IORegistryEntryCreateCFProperties( ioDev /*parent2*/, - &cfProperties, kCFAllocatorDefault, kNilOptions); - if (rv != kIOReturnSuccess || !cfProperties) { - ulSetError(UL_WARNING, "error getting device properties"); - return NULL; - } - - return cfProperties; -} - -void jsJoystick::close() -{ - if (os->hidDev != NULL) (*(os->hidDev))->close(os->hidDev); - if (os) delete os; -} - -/** element enumerator function : pass NULL for top-level*/ -void os_specific_s::enumerateElements(jsJoystick* joy, CFTypeRef element) -{ - assert(CFGetTypeID(element) == CFArrayGetTypeID()); - - CFRange range = {0, CFArrayGetCount ((CFArrayRef)element)}; - CFArrayApplyFunction((CFArrayRef) element, range, - &elementEnumerator, joy); -} - -void os_specific_s::elementEnumerator( const void *element, void* vjs) -{ - if (CFGetTypeID((CFTypeRef) element) != CFDictionaryGetTypeID()) { - ulSetError(UL_WARNING, "element enumerator passed non-dictionary value"); - return; - } - - static_cast(vjs)-> - os->parseElement( static_cast(vjs), (CFDictionaryRef) element); -} - -void os_specific_s::parseElement(jsJoystick* joy, CFDictionaryRef element) -{ - CFTypeRef refPage = CFDictionaryGetValue ((CFDictionaryRef) element, CFSTR(kIOHIDElementUsagePageKey)); - CFTypeRef refUsage = CFDictionaryGetValue ((CFDictionaryRef) element, CFSTR(kIOHIDElementUsageKey)); - - long type, page, usage; - - CFNumberGetValue((CFNumberRef) - CFDictionaryGetValue ((CFDictionaryRef) element, CFSTR(kIOHIDElementTypeKey)), - kCFNumberLongType, &type); - - switch (type) { - case kIOHIDElementTypeInput_Misc: - case kIOHIDElementTypeInput_Axis: - case kIOHIDElementTypeInput_Button: - //printf("got input element..."); - CFNumberGetValue((CFNumberRef) refUsage, kCFNumberLongType, &usage); - CFNumberGetValue((CFNumberRef) refPage, kCFNumberLongType, &page); - - if (page == kHIDPage_GenericDesktop) { - switch (usage) /* look at usage to determine function */ - { - case kHIDUsage_GD_X: - case kHIDUsage_GD_Y: - case kHIDUsage_GD_Z: - case kHIDUsage_GD_Rx: - case kHIDUsage_GD_Ry: - case kHIDUsage_GD_Rz: - case kHIDUsage_GD_Slider: // for throttle / trim controls - case kHIDUsage_GD_Dial: - //printf(" axis\n"); - /*joy->os->*/addAxisElement(joy, (CFDictionaryRef) element); - break; - - case kHIDUsage_GD_Hatswitch: - //printf(" hat\n"); - /*joy->os->*/addHatElement(joy, (CFDictionaryRef) element); - break; - - default: - ulSetError(UL_WARNING, "input type element has weird usage (%lx)\n", usage); - break; - } - } else if (page == kHIDPage_Simulation) { - switch (usage) /* look at usage to determine function */ - { - case kHIDUsage_Sim_Rudder: - case kHIDUsage_Sim_Throttle: - //printf(" axis\n"); - /*joy->os->*/addAxisElement(joy, (CFDictionaryRef) element); - break; - default: - ulSetError(UL_WARNING, "Simulation page input type element has weird usage (%lx)\n", usage); - } - } else if (page == kHIDPage_Button) { - //printf(" button\n"); - /*joy->os->*/addButtonElement(joy, (CFDictionaryRef) element); - } else if (page == kHIDPage_PID) { - ulSetError(UL_WARNING, "Force feedback and related data ignored\n", usage); - } else - ulSetError(UL_WARNING, "input type element has weird usage (%lx)\n", usage); - break; - - case kIOHIDElementTypeCollection: - /*joy->os->*/enumerateElements(joy, - CFDictionaryGetValue(element, CFSTR(kIOHIDElementKey)) - ); - break; - - default: - break; - } -} - -void os_specific_s::addAxisElement(jsJoystick* joy, CFDictionaryRef axis) -{ - long cookie, lmin, lmax; - CFNumberGetValue ((CFNumberRef) - CFDictionaryGetValue (axis, CFSTR(kIOHIDElementCookieKey)), - kCFNumberLongType, &cookie); - - int index = joy->num_axes++; - - /*joy->os->*/axisCookies[index] = (IOHIDElementCookie) cookie; - - CFNumberGetValue ((CFNumberRef) - CFDictionaryGetValue (axis, CFSTR(kIOHIDElementMinKey)), - kCFNumberLongType, &lmin); - - CFNumberGetValue ((CFNumberRef) - CFDictionaryGetValue (axis, CFSTR(kIOHIDElementMaxKey)), - kCFNumberLongType, &lmax); - - joy->min[index] = lmin; - joy->max[index] = lmax; - joy->dead_band[index] = 0.0; - joy->saturate[index] = 1.0; - joy->center[index] = (lmax - lmin) * 0.5 + lmin; -} - -void os_specific_s::addButtonElement(jsJoystick* joy, CFDictionaryRef button) -{ - long cookie; - CFNumberGetValue ((CFNumberRef) - CFDictionaryGetValue (button, CFSTR(kIOHIDElementCookieKey)), - kCFNumberLongType, &cookie); - - /*joy->os->*/buttonCookies[joy->num_buttons++] = (IOHIDElementCookie) cookie; - // anything else for buttons? -} - -void os_specific_s::addHatElement(jsJoystick* joy, CFDictionaryRef hat) -{ - long cookie, lmin, lmax; - CFNumberGetValue ((CFNumberRef) - CFDictionaryGetValue (hat, CFSTR(kIOHIDElementCookieKey)), - kCFNumberLongType, &cookie); - - int index = /*joy->*/num_hats++; - - /*joy->os->*/hatCookies[index] = (IOHIDElementCookie) cookie; - - CFNumberGetValue ((CFNumberRef) - CFDictionaryGetValue (hat, CFSTR(kIOHIDElementMinKey)), - kCFNumberLongType, &lmin); - - CFNumberGetValue ((CFNumberRef) - CFDictionaryGetValue (hat, CFSTR(kIOHIDElementMaxKey)), - kCFNumberLongType, &lmax); - - hat_min[index] = lmin; - hat_max[index] = lmax; - // do we map hats to axes or buttons? - // axes; there is room for that: Buttons are limited to 32. - // (a joystick with 2 hats will use 16 buttons!) -} - -void jsJoystick::rawRead(int *buttons, float *axes) -{ - if (buttons) - *buttons = 0; - - IOHIDEventStruct hidEvent; - - for (int b=0; bhidDev))->getElementValue(os->hidDev, os->buttonCookies[b], &hidEvent); - if (hidEvent.value && buttons) - *buttons |= 1 << b; - } - - // real axes: - int real_num_axes = num_axes - 2*os->num_hats; - for (int a=0; ahidDev))->getElementValue(os->hidDev, os->axisCookies[a], &hidEvent); - axes[a] = hidEvent.value; - } - - // hats: - for (int h=0; h < os->num_hats; ++h) { - (*(os->hidDev))->getElementValue(os->hidDev, os->hatCookies[h], &hidEvent); - long result = ( hidEvent.value - os->hat_min[h] ) * 8; - result /= ( os->hat_max[h] - os->hat_min[h] + 1 ); - if ( (result>=0) && (result<8) ) - { - axes[h+real_num_axes+1] = NS_hat[result]; - axes[h+real_num_axes] = WE_hat[result]; - } - else - { - axes[h+real_num_axes] = 0; - axes[h+real_num_axes+1] = 0; - } - } -} - -#endif diff --git a/src/Input/jsNone.cxx b/src/Input/jsNone.cxx deleted file mode 100644 index 5ce8cebdd..000000000 --- a/src/Input/jsNone.cxx +++ /dev/null @@ -1,56 +0,0 @@ -/* - Copyright (C) 1998,2002 Steve Baker - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - For further information visit http://plib.sourceforge.net - - $Id: jsNone.cxx 1960 2004-09-21 11:45:55Z smokydiamond $ -*/ - - -#if !defined(linux) && !defined(_WIN32) && !defined(__APPLE__) && !defined(__FreeBSD__) -#include "FGjs.hxx" - -struct os_specific_s ; - -void jsJoystick::open () -{ - error = TRUE ; - num_axes = num_buttons = 0 ; -} - -void jsJoystick::close () -{ - error = TRUE ; -} - - -jsJoystick::jsJoystick ( int ident ) -{ - error = TRUE ; - num_axes = num_buttons = 0 ; - os = NULL; -} - - -void jsJoystick::rawRead ( int *buttons, float *axes ) -{ if ( buttons != NULL ) *buttons = 0 ; -} - -void jsInit () {} - -#endif - diff --git a/src/Input/jsWindows.cxx b/src/Input/jsWindows.cxx deleted file mode 100644 index 6839f850c..000000000 --- a/src/Input/jsWindows.cxx +++ /dev/null @@ -1,274 +0,0 @@ -/* - PLIB - A Suite of Portable Game Libraries - Copyright (C) 1998,2002 Steve Baker - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - For further information visit http://plib.sourceforge.net - - $Id: jsWindows.cxx 2114 2006-12-21 20:53:13Z fayjf $ -*/ - -#if defined (_WIN32) - -#include "FGjs.hxx" -#include -#include -#include -#include - -#include - -#define _JS_MAX_AXES_WIN 8 /* X,Y,Z,R,U,V,POV_X,POV_Y */ - -struct os_specific_s { - std::string regKey; - static std::string getOEMProductName ( jsJoystick* joy); -}; - - -// Inspired by -// http://msdn.microsoft.com/archive/en-us/dnargame/html/msdn_sidewind3d.asp - -std::string -os_specific_s::getOEMProductName (jsJoystick* joy) -{ - if ( joy->error ) return "" ; - - char charbuf [ 256 ] ; - - HKEY hKey ; - DWORD dwcb ; - LONG lr ; - std::string name; - - // Open .. MediaResources\CurrentJoystickSettings - std::string key=REGSTR_PATH_JOYCONFIG; - key+= "\\" + joy->os->regKey + "\\" + REGSTR_KEY_JOYCURR; - - bool hkcu = false; - - if ( ERROR_SUCCESS != RegOpenKeyEx ( HKEY_LOCAL_MACHINE, key.c_str(), 0, KEY_QUERY_VALUE, &hKey)) { - hkcu = true; - if ( ERROR_SUCCESS != RegOpenKeyEx ( HKEY_CURRENT_USER, key.c_str(), 0, KEY_QUERY_VALUE, &hKey)) - return "" ; - } - // Get OEM Key name - dwcb = sizeof( charbuf) ; - - std::ostringstream value; - value << "Joystick" << joy->id+1 << REGSTR_VAL_JOYOEMNAME; - // JOYSTICKID1-16 is zero-based; registry entries for VJOYD are 1-based. - - lr = RegQueryValueEx ( hKey, value.str().c_str(), 0, 0, (LPBYTE) charbuf, &dwcb); - RegCloseKey ( hKey ) ; - - if ( lr != ERROR_SUCCESS ) return "" ; - - // Open OEM Key from ...MediaProperties - value.str(""); - value << REGSTR_PATH_JOYOEM << "\\" << charbuf; - - if (hkcu) { - lr = RegOpenKeyEx ( HKEY_CURRENT_USER, value.str().c_str(), 0, KEY_QUERY_VALUE, &hKey ) ; - } else { - lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, value.str().c_str(), 0, KEY_QUERY_VALUE, &hKey ) ; - } - if ( lr != ERROR_SUCCESS ) - return "" ; - - dwcb = sizeof( charbuf) ; - - lr = RegQueryValueEx ( hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, (LPBYTE) charbuf, &dwcb ) ; - RegCloseKey ( hKey ) ; - - if ( lr != ERROR_SUCCESS ) return "" ; - name = std::string( charbuf, dwcb-1); - return name; -} - - -void jsJoystick::open () -{ - JOYCAPS jsCaps ; - - name [0] = '\0' ; - - - - memset ( &jsCaps, 0, sizeof(jsCaps)) ; - - error = ( joyGetDevCaps( id, &jsCaps, sizeof(jsCaps) ) - != JOYERR_NOERROR ) ; - - os->regKey = jsCaps.szRegKey; - - num_buttons = jsCaps.wNumButtons ; - if ( jsCaps.wNumAxes == 0 ) - { - num_axes = 0 ; - setError () ; - } - else - { - // Device name from jsCaps is often "Microsoft PC-joystick driver", - // at least for USB. Try to get the real name from the registry. - name = os->getOEMProductName ( this); - - if (name == "") { - ulSetError ( UL_WARNING, - "JS: Failed to read joystick name from registry" ) ; - - name = jsCaps.szPname; - } - - // Windows joystick drivers may provide any combination of - // X,Y,Z,R,U,V,POV - not necessarily the first n of these. - if ( jsCaps.wCaps & JOYCAPS_HASPOV ) - { - num_axes = _JS_MAX_AXES_WIN ; - min [ 7 ] = -1.0 ; max [ 7 ] = 1.0 ; // POV Y - min [ 6 ] = -1.0 ; max [ 6 ] = 1.0 ; // POV X - } - else - num_axes = 6 ; - - min [ 5 ] = (float) jsCaps.wVmin ; max [ 5 ] = (float) jsCaps.wVmax ; - min [ 4 ] = (float) jsCaps.wUmin ; max [ 4 ] = (float) jsCaps.wUmax ; - min [ 3 ] = (float) jsCaps.wRmin ; max [ 3 ] = (float) jsCaps.wRmax ; - min [ 2 ] = (float) jsCaps.wZmin ; max [ 2 ] = (float) jsCaps.wZmax ; - min [ 1 ] = (float) jsCaps.wYmin ; max [ 1 ] = (float) jsCaps.wYmax ; - min [ 0 ] = (float) jsCaps.wXmin ; max [ 0 ] = (float) jsCaps.wXmax ; - } - - for ( int i = 0 ; i < num_axes ; i++ ) - { - center [ i ] = ( max[i] + min[i] ) / 2.0f ; - dead_band [ i ] = 0.0f ; - saturate [ i ] = 1.0f ; - } -} - - -void jsJoystick::close () -{ - delete os; -} - -jsJoystick::jsJoystick ( int ident ) -{ - id = ident ; - os = new struct os_specific_s; - - if (ident >= 0 && ident < (int)joyGetNumDevs()) { - open(); - } - else { - num_axes = 0; - setError(); - } -} - - -void jsJoystick::rawRead ( int *buttons, float *axes ) -{ - JOYINFOEX js; - - js.dwFlags = JOY_RETURNALL ; - js.dwSize = sizeof ( JOYINFOEX) ; - - if ( error ) - { - if ( buttons ) - *buttons = 0 ; - - if ( axes ) - for ( int i = 0 ; i < num_axes ; i++ ) - axes[i] = 1500.0f ; - - return ; - } - - - MMRESULT status = joyGetPosEx ( id, &js ) ; - - if ( status != JOYERR_NOERROR ) - { - setError() ; - return ; - } - - if ( buttons != NULL ) - *buttons = (int) js.dwButtons ; - - if ( axes != NULL ) - { - /* WARNING - Fall through case clauses!! */ - - switch ( num_axes ) - { - case 8: - // Generate two POV axes from the POV hat angle. - // Low 16 bits of js.dwPOV gives heading (clockwise from ahead) in - // hundredths of a degree, or 0xFFFF when idle. - - if ( ( js.dwPOV & 0xFFFF ) == 0xFFFF ) - { - axes [ 6 ] = 0.0 ; - axes [ 7 ] = 0.0 ; - } - else - { - // This is the contentious bit: how to convert angle to X/Y. - // wk: I know of no define for PI that we could use here: - // SG_PI would pull in sg, M_PI is undefined for MSVC - // But the accuracy of the value of PI is very unimportant at - // this point. - - float s = (float) sin ( ( js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180 ) ) ; - float c = (float) cos ( ( js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180 ) ) ; - - // Convert to coordinates on a square so that North-East - // is (1,1) not (.7,.7), etc. - // s and c cannot both be zero so we won't divide by zero. - if ( fabs ( s ) < fabs ( c ) ) - { - axes [ 6 ] = ( c < 0.0 ) ? -s/c : s/c ; - axes [ 7 ] = ( c < 0.0 ) ? -1.0f : 1.0f ; - } - else - { - axes [ 6 ] = ( s < 0.0 ) ? -1.0f : 1.0f ; - axes [ 7 ] = ( s < 0.0 ) ? -c/s : c/s ; - } - } - - case 6: axes[5] = (float) js . dwVpos ; - case 5: axes[4] = (float) js . dwUpos ; - case 4: axes[3] = (float) js . dwRpos ; - case 3: axes[2] = (float) js . dwZpos ; - case 2: axes[1] = (float) js . dwYpos ; - case 1: axes[0] = (float) js . dwXpos ; - break; - - default: - ulSetError ( UL_WARNING, "PLIB_JS: Wrong num_axes. Joystick input is now invalid" ) ; - } - } -} - -void jsInit() {} - -#endif diff --git a/src/Input/js_demo.cxx b/src/Input/js_demo.cxx index 448cecc2c..ee2b32e30 100644 --- a/src/Input/js_demo.cxx +++ b/src/Input/js_demo.cxx @@ -2,12 +2,12 @@ # include #endif -#ifdef _WIN32 -#include +#ifdef HAVE_WINDOWS_H +# include #endif #include // plib/js.h should really include this !!!!!! -#include "Input/FGjs.hxx" +#include #define Z 8 @@ -30,7 +30,7 @@ int main ( int, char ** ) { useful[i] = ! ( js[i]->notWorking () ); if ( useful[i] ) { t++; - printf ( "Joystick %i: \"%s\"\n", i, js[i]->getName().c_str() ) ; + printf ( "Joystick %i: \"%s\"\n", i, js[i]->getName() ) ; } else printf ( "Joystick %i not detected\n", i ) ; } if ( t == 0 ) exit ( 1 ) ; diff --git a/src/Input/jsinput.cxx b/src/Input/jsinput.cxx index 2c288f640..b57f828d2 100644 --- a/src/Input/jsinput.cxx +++ b/src/Input/jsinput.cxx @@ -21,13 +21,12 @@ #include #include -#include + using std::cout; using std::cin; using std::endl; #include "jsinput.h" -#include jsInput::jsInput(jsSuper *j) { jss=j; diff --git a/src/Input/jssuper.h b/src/Input/jssuper.h index 398ef579d..3b395c4cd 100644 --- a/src/Input/jssuper.h +++ b/src/Input/jssuper.h @@ -25,7 +25,8 @@ # include #endif -#include "FGjs.hxx" +#include // plib/js.h should really include this !!!!!! +#include #define MAX_JOYSTICKS 8 diff --git a/src/Main/CMakeLists.txt b/src/Main/CMakeLists.txt index 51dbead5a..ffc87c857 100644 --- a/src/Main/CMakeLists.txt +++ b/src/Main/CMakeLists.txt @@ -32,7 +32,6 @@ get_property(FG_LIBS GLOBAL PROPERTY FG_LIBS) target_link_libraries(fgfs ${FG_LIBS} - ${JS_LIBS} ${SIMGEAR_LIBRARIES} ${OPENSCENEGRAPH_LIBRARIES} ${OPENAL_LIBRARY} diff --git a/src/Main/Makefile.am b/src/Main/Makefile.am index 0b1e9bab1..7cfe0fd91 100644 --- a/src/Main/Makefile.am +++ b/src/Main/Makefile.am @@ -18,7 +18,7 @@ endif if HAVE_FRAMEWORK_PLIB fgfs_PLIB_FW = $(plib_FRAMEWORK) else -fgfs_PLIB_LIBS = -lplibpuaux -lplibpu -lplibfnt \ +fgfs_PLIB_LIBS = -lplibpuaux -lplibpu -lplibfnt -lplibjs \ -lplibsg -lplibul endif diff --git a/utils/fgviewer/CMakeLists.txt b/utils/fgviewer/CMakeLists.txt index 08ff3da34..f6654788b 100644 --- a/utils/fgviewer/CMakeLists.txt +++ b/utils/fgviewer/CMakeLists.txt @@ -6,7 +6,6 @@ target_link_libraries(fgviewer ${OPENSCENEGRAPH_LIBRARIES} ${OPENGL_LIBRARIES} ${ZLIB_LIBRARIES} - ${PLIB_LIBRARIES} - ${JS_LIBS}) + ${PLIB_LIBRARIES}) install(TARGETS fgviewer RUNTIME DESTINATION bin)