From 392da3cc59524591ff9ea3a50acb5d0e8bfadb17 Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Wed, 8 Jan 2014 21:48:44 +0100 Subject: [PATCH] Remove Gamepad from limelight-pc --- jni/gamepad_jni/Gamepad.h | 125 ---------- jni/gamepad_jni/buildlinux.sh | 5 - jni/gamepad_jni/buildosx.sh | 5 - jni/gamepad_jni/buildwin.sh | 3 - jni/gamepad_jni/gamepad_jni.c | 108 --------- jni/gamepad_jni/lin32/libstem_gamepad.a | Bin 12510 -> 0 bytes jni/gamepad_jni/lin64/libstem_gamepad.a | Bin 16644 -> 0 bytes jni/gamepad_jni/osx/libstem_gamepad.a | Bin 29472 -> 0 bytes jni/gamepad_jni/win32/libstem_gamepad.a | Bin 9410 -> 0 bytes jni/gamepad_jni/win32/libxinput9_1_0.a | Bin 5322 -> 0 bytes jni/gamepad_jni/win64/libstem_gamepad.a | Bin 8312 -> 0 bytes jni/gamepad_jni/win64/libxinput9_1_0.a | Bin 5242 -> 0 bytes src/com/limelight/Limelight.java | 4 - src/com/limelight/input/gamepad/Gamepad.java | 222 ------------------ .../input/gamepad/GamepadComponent.java | 45 ---- .../input/gamepad/GamepadListener.java | 83 ------- .../input/gamepad/GamepadMapping.java | 114 --------- .../input/gamepad/NativeGamepad.java | 182 -------------- .../input/gamepad/NativeGamepadListener.java | 13 - .../input/gamepad/SourceComponent.java | 46 ---- .../settings/GamepadSettingsManager.java | 46 ---- 21 files changed, 1001 deletions(-) delete mode 100644 jni/gamepad_jni/Gamepad.h delete mode 100755 jni/gamepad_jni/buildlinux.sh delete mode 100644 jni/gamepad_jni/buildosx.sh delete mode 100644 jni/gamepad_jni/buildwin.sh delete mode 100644 jni/gamepad_jni/gamepad_jni.c delete mode 100644 jni/gamepad_jni/lin32/libstem_gamepad.a delete mode 100644 jni/gamepad_jni/lin64/libstem_gamepad.a delete mode 100644 jni/gamepad_jni/osx/libstem_gamepad.a delete mode 100644 jni/gamepad_jni/win32/libstem_gamepad.a delete mode 100644 jni/gamepad_jni/win32/libxinput9_1_0.a delete mode 100644 jni/gamepad_jni/win64/libstem_gamepad.a delete mode 100644 jni/gamepad_jni/win64/libxinput9_1_0.a delete mode 100644 src/com/limelight/input/gamepad/Gamepad.java delete mode 100644 src/com/limelight/input/gamepad/GamepadComponent.java delete mode 100644 src/com/limelight/input/gamepad/GamepadListener.java delete mode 100644 src/com/limelight/input/gamepad/GamepadMapping.java delete mode 100644 src/com/limelight/input/gamepad/NativeGamepad.java delete mode 100644 src/com/limelight/input/gamepad/NativeGamepadListener.java delete mode 100644 src/com/limelight/input/gamepad/SourceComponent.java delete mode 100644 src/com/limelight/settings/GamepadSettingsManager.java diff --git a/jni/gamepad_jni/Gamepad.h b/jni/gamepad_jni/Gamepad.h deleted file mode 100644 index 3879f2a..0000000 --- a/jni/gamepad_jni/Gamepad.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - Copyright (c) 2013 Alex Diener - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Alex Diener adiener@sacredsoftware.net -*/ - -#ifndef __GAMEPAD_H__ -#define __GAMEPAD_H__ -#ifdef __cplusplus -extern "C" { -#endif - -#include - -struct Gamepad_device { - // Unique device identifier for application session, starting at 0 for the first device attached and - // incrementing by 1 for each additional device. If a device is removed and subsequently reattached - // during the same application session, it will have a new deviceID. - unsigned int deviceID; - - // Human-readable device name - const char * description; - - // USB vendor/product IDs as returned by the driver. Can be used to determine the particular model of device represented. - int vendorID; - int productID; - - // Number of axis elements belonging to the device - unsigned int numAxes; - - // Number of button elements belonging to the device - unsigned int numButtons; - - // Array[numAxes] of values representing the current state of each axis, in the range [-1..1] - float * axisStates; - - // Array[numButtons] of values representing the current state of each button - bool * buttonStates; - - // Platform-specific device data storage. Don't touch unless you know what you're doing and don't - // mind your code breaking in future versions of this library. - void * privateData; -}; - -/* Initializes gamepad library and detects initial devices. Call this before any other Gamepad_*() - function, other than callback registration functions. If you want to receive deviceAttachFunc - callbacks from devices detected in Gamepad_init(), you must call Gamepad_deviceAttachFunc() - before calling Gamepad_init(). */ -void Gamepad_init(); - -/* Tears down all data structures created by the gamepad library and releases any memory that was - allocated. It is not necessary to call this function at application termination, but it's - provided in case you want to free memory associated with gamepads at some earlier time. */ -void Gamepad_shutdown(); - -/* Returns the number of currently attached gamepad devices. */ -unsigned int Gamepad_numDevices(); - -/* Returns the specified Gamepad_device struct, or NULL if deviceIndex is out of bounds. */ -struct Gamepad_device * Gamepad_deviceAtIndex(unsigned int deviceIndex); - -/* Polls for any devices that have been attached since the last call to Gamepad_detectDevices() or - Gamepad_init(). If any new devices are found, the callback registered with - Gamepad_deviceAttachFunc() (if any) will be called once per newly detected device. - - Note that depending on implementation, you may receive button and axis event callbacks for - devices that have not yet been detected with Gamepad_detectDevices(). You can safely ignore - these events, but be aware that your callbacks might receive a device ID that hasn't been seen - by your deviceAttachFunc. */ -void Gamepad_detectDevices(); - -/* Reads pending input from all attached devices and calls the appropriate input callbacks, if any - have been registered. */ -void Gamepad_processEvents(); - -/* Registers a function to be called whenever a device is attached. The specified function will be - called only during calls to Gamepad_init() and Gamepad_detectDevices(), in the thread from - which those functions were called. Calling this function with a NULL argument will stop any - previously registered callback from being called subsequently. */ -void Gamepad_deviceAttachFunc(void (* callback)(struct Gamepad_device * device, void * context), void * context); - -/* Registers a function to be called whenever a device is detached. The specified function can be - called at any time, and will not necessarily be called from the main thread. Calling this - function with a NULL argument will stop any previously registered callback from being called - subsequently. */ -void Gamepad_deviceRemoveFunc(void (* callback)(struct Gamepad_device * device, void * context), void * context); - -/* Registers a function to be called whenever a button on any attached device is pressed. The - specified function will be called only during calls to Gamepad_processEvents(), in the - thread from which Gamepad_processEvents() was called. Calling this function with a NULL - argument will stop any previously registered callback from being called subsequently. */ -void Gamepad_buttonDownFunc(void (* callback)(struct Gamepad_device * device, unsigned int buttonID, double timestamp, void * context), void * context); - -/* Registers a function to be called whenever a button on any attached device is released. The - specified function will be called only during calls to Gamepad_processEvents(), in the - thread from which Gamepad_processEvents() was called. Calling this function with a NULL - argument will stop any previously registered callback from being called subsequently. */ -void Gamepad_buttonUpFunc(void (* callback)(struct Gamepad_device * device, unsigned int buttonID, double timestamp, void * context), void * context); - -/* Registers a function to be called whenever an axis on any attached device is moved. The - specified function will be called only during calls to Gamepad_processEvents(), in the - thread from which Gamepad_processEvents() was called. Calling this function with a NULL - argument will stop any previously registered callback from being called subsequently. */ -void Gamepad_axisMoveFunc(void (* callback)(struct Gamepad_device * device, unsigned int axisID, float value, float lastValue, double timestamp, void * context), void * context); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/jni/gamepad_jni/buildlinux.sh b/jni/gamepad_jni/buildlinux.sh deleted file mode 100755 index 82a6c73..0000000 --- a/jni/gamepad_jni/buildlinux.sh +++ /dev/null @@ -1,5 +0,0 @@ -rm *.o libgamepad_jni.so -gcc -I /usr/lib/jvm/java-7-openjdk-amd64/include/ -fPIC -c *.c -gcc -shared -Wl,-soname,libgamepad_jni.so -Wl,--no-undefined -o libgamepad_jni.so *.o -L./lin64 -lstem_gamepad -lpthread -rm *.o - diff --git a/jni/gamepad_jni/buildosx.sh b/jni/gamepad_jni/buildosx.sh deleted file mode 100644 index 6b07d63..0000000 --- a/jni/gamepad_jni/buildosx.sh +++ /dev/null @@ -1,5 +0,0 @@ -rm *.o libgamepad_jni.dylib -gcc -I /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/include/ -I /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/include/darwin -fPIC -c *.c -gcc -shared -o libgamepad_jni.dylib *.o -L./osx -lstem_gamepad -lpthread -framework IOKit -framework CoreFoundation -rm *.o - diff --git a/jni/gamepad_jni/buildwin.sh b/jni/gamepad_jni/buildwin.sh deleted file mode 100644 index 9ac9177..0000000 --- a/jni/gamepad_jni/buildwin.sh +++ /dev/null @@ -1,3 +0,0 @@ -rm gamepad_jni.dll gamepad_jni64.dll -/C/MinGW/bin/gcc -m32 -shared -Wall -I"/C/Program Files (x86)/Java/jdk1.7.0_45/include" -I"/C/Program Files (x86)/Java/jdk1.7.0_45/include/win32" *.c -L./win32 -lstem_gamepad -lxinput9_1_0 -Wl,--no-undefined -Wl,--kill-at -o gamepad_jni.dll -/C/MinGW-w64/bin/gcc -m64 -shared -Wall -I"/C/Program Files (x86)/Java/jdk1.7.0_45/include" -I"/C/Program Files (x86)/Java/jdk1.7.0_45/include/win32" *.c -L./win64 -lstem_gamepad -lxinput9_1_0 -Wl,--no-undefined -Wl,--kill-at -o gamepad_jni64.dll diff --git a/jni/gamepad_jni/gamepad_jni.c b/jni/gamepad_jni/gamepad_jni.c deleted file mode 100644 index 44b3b77..0000000 --- a/jni/gamepad_jni/gamepad_jni.c +++ /dev/null @@ -1,108 +0,0 @@ -#include -#include - -#include "Gamepad.h" - -static JavaVM *jvm; -static jclass nativeGamepadClass; -static jmethodID jdeviceAttached; -static jmethodID jdeviceRemoved; -static jmethodID jbuttonDown; -static jmethodID jbuttonUp; -static jmethodID jaxisMove; - -static JNIEnv *getThreadEnv(void) { - JNIEnv *env; - (*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_6); - return env; -} - -static void invokeJavaCallback(jmethodID method, ...) { - JNIEnv *env = getThreadEnv(); - va_list args; - va_start(args, method); - (*env)->CallStaticVoidMethodV(env, nativeGamepadClass, method, args); - va_end(args); -} - -static void deviceAttachCallback(struct Gamepad_device * device, void * context) { - invokeJavaCallback(jdeviceAttached, device->deviceID, device->numButtons, device->numAxes); -} - -static void deviceRemoveCallback(struct Gamepad_device * device, void * context) { - invokeJavaCallback(jdeviceRemoved, device->deviceID); -} - -static void buttonDownCallback(struct Gamepad_device * device, unsigned int buttonID, double timestamp, void * context) { - invokeJavaCallback(jbuttonDown, device->deviceID, buttonID); -} - -static void buttonUpCallback(struct Gamepad_device * device, unsigned int buttonID, double timestamp, void * context) { - invokeJavaCallback(jbuttonUp, device->deviceID, buttonID); -} - -static void axisMoveCallback(struct Gamepad_device * device, unsigned int axisID, float value, float lastValue, double timestamp, void * context) { - invokeJavaCallback(jaxisMove, device->deviceID, axisID, value, lastValue); -} - -// This function must be called first -JNIEXPORT void JNICALL -Java_com_limelight_input_gamepad_NativeGamepad_init(JNIEnv *env, jobject this) { - Gamepad_deviceAttachFunc(deviceAttachCallback, NULL); - Gamepad_deviceRemoveFunc(deviceRemoveCallback, NULL); - Gamepad_buttonDownFunc(buttonDownCallback, NULL); - Gamepad_buttonUpFunc(buttonUpCallback, NULL); - Gamepad_axisMoveFunc(axisMoveCallback, NULL); - - Gamepad_init(); -} - -// This function must be called last -JNIEXPORT void JNICALL -Java_com_limelight_input_gamepad_NativeGamepad_shutdown(JNIEnv *env, jobject this) { - Gamepad_shutdown(); - - // Remove the class reference - (*env)->DeleteGlobalRef(env, nativeGamepadClass); -} - -// This returns the number of connected devices -JNIEXPORT jint JNICALL -Java_com_limelight_input_gamepad_NativeGamepad_numDevices(JNIEnv *env, jobject this) { - return Gamepad_numDevices(); -} - -// This triggers device detection -JNIEXPORT void JNICALL -Java_com_limelight_input_gamepad_NativeGamepad_detectDevices(JNIEnv *env, jobject this) { - Gamepad_detectDevices(); -} - -// This polls for events and calls the appropriate callbacks -JNIEXPORT void JNICALL -Java_com_limelight_input_gamepad_NativeGamepad_processEvents(JNIEnv *env, jobject this) { - Gamepad_processEvents(); -} - -// This is called when the library is first loaded -JNIEXPORT jint JNICALL -JNI_OnLoad(JavaVM *pjvm, void *reserved) { - JNIEnv *env; - - // This has to be saved before getThreadEnv() can be called - jvm = pjvm; - - env = getThreadEnv(); - - // We use a global reference to keep the class loaded - nativeGamepadClass = (*env)->NewGlobalRef(env, (*env)->FindClass(env, "com/limelight/input/gamepad/NativeGamepad")); - - // These method IDs are only valid as long as the NativeGamepad class is loaded - jdeviceAttached = (*env)->GetStaticMethodID(env, nativeGamepadClass, "deviceAttachCallback", "(III)V"); - jdeviceRemoved = (*env)->GetStaticMethodID(env, nativeGamepadClass, "deviceRemoveCallback", "(I)V"); - jbuttonDown = (*env)->GetStaticMethodID(env, nativeGamepadClass, "buttonDownCallback", "(II)V"); - jbuttonUp = (*env)->GetStaticMethodID(env, nativeGamepadClass, "buttonUpCallback", "(II)V"); - jaxisMove = (*env)->GetStaticMethodID(env, nativeGamepadClass, "axisMovedCallback", "(IIFF)V"); - - return JNI_VERSION_1_6; -} diff --git a/jni/gamepad_jni/lin32/libstem_gamepad.a b/jni/gamepad_jni/lin32/libstem_gamepad.a deleted file mode 100644 index 2ddf5f67b34e5fafe8e2fd46cbcde8109cb53f18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12510 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 CD1;>d diff --git a/jni/gamepad_jni/lin64/libstem_gamepad.a b/jni/gamepad_jni/lin64/libstem_gamepad.a deleted file mode 100644 index c78ee7905a49831ab4f2821d3d1e0d2784a398d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16644 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 G`2PkHSopF4 diff --git a/jni/gamepad_jni/osx/libstem_gamepad.a b/jni/gamepad_jni/osx/libstem_gamepad.a deleted file mode 100644 index dff25763271ef3f7afb69f4f0ef722e880848847..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29472 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 A`v3p{ diff --git a/jni/gamepad_jni/win32/libstem_gamepad.a b/jni/gamepad_jni/win32/libstem_gamepad.a deleted file mode 100644 index 669aa33a868248a20041e0822c6d55e944b6538f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9410 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 diff --git a/jni/gamepad_jni/win32/libxinput9_1_0.a b/jni/gamepad_jni/win32/libxinput9_1_0.a deleted file mode 100644 index d4bc6933a421bf99036709339172af3e8793ab9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5322 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 P8a%)%XH@)Nwd(x?2Bx_3 diff --git a/src/com/limelight/Limelight.java b/src/com/limelight/Limelight.java index ea99f3a..0936aaf 100644 --- a/src/com/limelight/Limelight.java +++ b/src/com/limelight/Limelight.java @@ -5,8 +5,6 @@ import java.io.IOException; import com.limelight.binding.LibraryHelper; import com.limelight.binding.PlatformBinding; import com.limelight.input.EvdevHandler; -import com.limelight.input.gamepad.Gamepad; -import com.limelight.input.gamepad.GamepadListener; import com.limelight.nvstream.NvConnection; import com.limelight.nvstream.NvConnectionListener; import com.limelight.nvstream.StreamConfiguration; @@ -59,8 +57,6 @@ public class Limelight implements NvConnectionListener { displayError("Input", "Input (" + input + ") could not be found"); } } - - GamepadListener.getInstance().addDeviceListener(new Gamepad(conn)); } private void pair() { diff --git a/src/com/limelight/input/gamepad/Gamepad.java b/src/com/limelight/input/gamepad/Gamepad.java deleted file mode 100644 index 96914bd..0000000 --- a/src/com/limelight/input/gamepad/Gamepad.java +++ /dev/null @@ -1,222 +0,0 @@ -package com.limelight.input.gamepad; - -import com.limelight.input.Device; -import com.limelight.input.DeviceListener; -import com.limelight.input.gamepad.GamepadMapping.Mapping; -import com.limelight.input.gamepad.SourceComponent.Type; -import com.limelight.nvstream.NvConnection; -import com.limelight.nvstream.input.ControllerPacket; -import com.limelight.settings.GamepadSettingsManager; - -/** - * Represents a gamepad connected to the system - * @author Diego Waxemberg - */ -public class Gamepad implements DeviceListener { - - private short inputMap = 0x0000; - private byte leftTrigger = 0x00; - private byte rightTrigger = 0x00; - private short rightStickX = 0x0000; - private short rightStickY = 0x0000; - private short leftStickX = 0x0000; - private short leftStickY = 0x0000; - - private NvConnection conn; - - public Gamepad(NvConnection conn) { - this.conn = conn; - } - - public Gamepad() { - this(null); - } - - public void setConnection(NvConnection conn) { - this.conn = conn; - } - - @Override - public void handleButton(Device device, int buttonId, boolean pressed) { - GamepadMapping mapping = GamepadSettingsManager.getSettings(); - - Mapping mapped = mapping.get(new SourceComponent(Type.BUTTON, buttonId)); - if (mapped == null) { - System.out.println("Unmapped button pressed: " + buttonId); - return; - } - - if (!mapped.padComp.isAnalog()) { - handleDigitalComponent(mapped, pressed); - } else { - handleAnalogComponent(mapped.padComp, sanitizeValue(mapped, pressed)); - } - - //printInfo(device, new SourceComponent(Type.BUTTON, buttonId), mapped.padComp, pressed ? 1F : 0F); - } - - @Override - public void handleAxis(Device device, int axisId, float newValue, float lastValue) { - GamepadMapping mapping = GamepadSettingsManager.getSettings(); - - Mapping mapped = mapping.get(new SourceComponent(Type.AXIS, axisId)); - if (mapped == null) { - System.out.println("Unmapped axis moved: " + axisId); - return; - } - - float value = sanitizeValue(mapped, newValue); - - if (mapped.padComp.isAnalog()) { - handleAnalogComponent(mapped.padComp, value); - } else { - handleDigitalComponent(mapped, (value > 0.5)); - } - - //printInfo(device, new SourceComponent(Type.AXIS, axisId), mapped.padComp, newValue); - } - - private float sanitizeValue(Mapping mapped, boolean value) { - if (mapped.invert) { - return value ? 0F : 1F; - } else { - return value ? 1F : 0F; - } - } - - private float sanitizeValue(Mapping mapped, float value) { - float retVal = value; - if (mapped.invert) { - retVal = -retVal; - } - if (mapped.trigger) { - retVal = (retVal + 1) / 2; - } - return retVal; - } - - private void handleAnalogComponent(GamepadComponent padComp, float value) { - switch (padComp) { - case LS_X: - leftStickX = (short)Math.round(value * 0x7FFF); - break; - case LS_Y: - leftStickY = (short)Math.round(value * 0x7FFF); - break; - case RS_X: - rightStickX = (short)Math.round(value * 0x7FFF); - break; - case RS_Y: - rightStickY = (short)Math.round(value * 0x7FFF); - break; - case LT: - leftTrigger = (byte)Math.round(value * 0xFF); - break; - case RT: - rightTrigger = (byte)Math.round(value * 0xFF); - break; - default: - System.out.println("A mapping error has occured. Ignoring: " + padComp.name()); - break; - } - if (conn != null) { - sendControllerPacket(); - } - } - - - private void handleDigitalComponent(Mapping mapped, boolean pressed) { - switch (mapped.padComp) { - case BTN_A: - toggle(ControllerPacket.A_FLAG, pressed); - break; - case BTN_X: - toggle(ControllerPacket.X_FLAG, pressed); - break; - case BTN_Y: - toggle(ControllerPacket.Y_FLAG, pressed); - break; - case BTN_B: - toggle(ControllerPacket.B_FLAG, pressed); - break; - case DPAD_UP: - toggle(ControllerPacket.UP_FLAG, pressed); - break; - case DPAD_DOWN: - toggle(ControllerPacket.DOWN_FLAG, pressed); - break; - case DPAD_LEFT: - toggle(ControllerPacket.LEFT_FLAG, pressed); - break; - case DPAD_RIGHT: - toggle(ControllerPacket.RIGHT_FLAG, pressed); - break; - case LS_THUMB: - toggle(ControllerPacket.LS_CLK_FLAG, pressed); - break; - case RS_THUMB: - toggle(ControllerPacket.RS_CLK_FLAG, pressed); - break; - case LB: - toggle(ControllerPacket.LB_FLAG, pressed); - break; - case RB: - toggle(ControllerPacket.RB_FLAG, pressed); - break; - case BTN_START: - toggle(ControllerPacket.PLAY_FLAG, pressed); - break; - case BTN_BACK: - toggle(ControllerPacket.BACK_FLAG, pressed); - break; - case BTN_SPECIAL: - toggle(ControllerPacket.SPECIAL_BUTTON_FLAG, pressed); - break; - default: - System.out.println("A mapping error has occured. Ignoring: " + mapped.padComp.name()); - return; - } - if (conn != null) { - sendControllerPacket(); - } - } - - /* - * Sends a controller packet to the specified connection containing the current gamepad values - */ - private void sendControllerPacket() { - if (conn != null) { - conn.sendControllerInput(inputMap, leftTrigger, rightTrigger, - leftStickX, leftStickY, rightStickX, rightStickY); - } - } - - /* - * Prints out the specified event information for the given gamepad - * used for debugging, normally unused. - */ - @SuppressWarnings("unused") - private void printInfo(Device device, SourceComponent sourceComp, GamepadComponent padComp, float value) { - - StringBuilder builder = new StringBuilder(); - - builder.append(sourceComp.getType().name() + ": "); - builder.append(sourceComp.getId() + " "); - builder.append("mapped to: " + padComp + " "); - builder.append("changed to "); - - System.out.println(builder.toString()); - } - - /* - * Toggles a flag that indicates the specified button was pressed or released - */ - private void toggle(short button, boolean pressed) { - if (pressed) { - inputMap |= button; - } else { - inputMap &= ~button; - } - } - -} diff --git a/src/com/limelight/input/gamepad/GamepadComponent.java b/src/com/limelight/input/gamepad/GamepadComponent.java deleted file mode 100644 index 4b47e71..0000000 --- a/src/com/limelight/input/gamepad/GamepadComponent.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.limelight.input.gamepad; - -import java.io.Serializable; - -import javax.swing.JLabel; - -/** - * Enumerator for every gamepad component GFE recognizes - * @author Diego Waxemberg - */ -public enum GamepadComponent implements Serializable { - BTN_A("Button 1 (A)", false), BTN_X("Button 2 (X)", false), BTN_Y("Button 3 (Y)", false), BTN_B("Button 4 (B)", false), - DPAD_UP("D-pad Up", false), DPAD_DOWN("D-pad Down", false), DPAD_LEFT("D-pad Left", false), DPAD_RIGHT("D-pad Right", false), - LS_X("Left Stick X", true), LS_Y("Left Stick Y", true), RS_X("Right Stick X", true), RS_Y("Right Stick Y", true), - LS_THUMB("Left Stick Button", false), RS_THUMB("Right Stick Button", false), - LT("Left Trigger", true), RT("Right Trigger", true), LB("Left Bumper", false), RB("Right Bumper", false), - BTN_START("Start Button", false), BTN_BACK("Back Button", false), BTN_SPECIAL("Special Button", false); - - private JLabel label; - private boolean analog; - - /* - * Constructs the enumerator with the given name for a label and whether it is analog or not - */ - private GamepadComponent(String name, boolean analog) { - this.label = new JLabel(name); - this.analog = analog; - } - - /** - * Gets the label for this gamepad component - * @return a label with the name of this component as the text - */ - public JLabel getLabel() { - return label; - } - - /** - * Checks if this component is analog or digital - * @return whether this component is analog - */ - public boolean isAnalog() { - return analog; - } -} diff --git a/src/com/limelight/input/gamepad/GamepadListener.java b/src/com/limelight/input/gamepad/GamepadListener.java deleted file mode 100644 index b764469..0000000 --- a/src/com/limelight/input/gamepad/GamepadListener.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.limelight.input.gamepad; - -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; - -import com.limelight.input.Device; -import com.limelight.input.DeviceListener; - -/** - * Listens to Controllers connected to this computer and gives any gamepad to the gamepad handler - * @author Diego Waxemberg - */ -public class GamepadListener implements NativeGamepadListener { - private HashMap devices; - private List listeners; - - private static GamepadListener singleton; - - public static GamepadListener getInstance() { - if (singleton == null) { - singleton = new GamepadListener(); - } - return singleton; - } - - private GamepadListener() { - devices = new HashMap(); - listeners = new LinkedList(); - } - - public int deviceCount() { - return devices.size(); - } - - public void addDeviceListener(DeviceListener listener) { - listeners.add(listener); - } - - public List getListeners() { - return Collections.unmodifiableList(listeners); - } - - public void removeListener(DeviceListener listener) { - listeners.remove(listener); - } - - @Override - public void deviceAttached(int deviceId, int numButtons, int numAxes) { - devices.put(deviceId, new Device(deviceId, numButtons, numAxes)); - } - - @Override - public void deviceRemoved(int deviceId) { - devices.remove(deviceId); - } - - @Override - public void buttonDown(int deviceId, int buttonId) { - Device dev = devices.get(deviceId); - for (DeviceListener listener : listeners) { - listener.handleButton(dev, buttonId, true); - } - } - - @Override - public void buttonUp(int deviceId, int buttonId) { - Device dev = devices.get(deviceId); - for (DeviceListener listener : listeners) { - listener.handleButton(dev, buttonId, false); - } - } - - @Override - public void axisMoved(int deviceId, int axisId, float value, float lastValue) { - Device dev = devices.get(deviceId); - for (DeviceListener listener : listeners) { - listener.handleAxis(dev, axisId, value, lastValue); - } - } - -} diff --git a/src/com/limelight/input/gamepad/GamepadMapping.java b/src/com/limelight/input/gamepad/GamepadMapping.java deleted file mode 100644 index a4f328f..0000000 --- a/src/com/limelight/input/gamepad/GamepadMapping.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.limelight.input.gamepad; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map.Entry; - -/** - * Mappings for gamepad components - * @author Diego Waxemberg - */ -public class GamepadMapping implements Serializable { - private static final long serialVersionUID = -185035113915743149L; - - private HashMap mapping; - - /** - * Constructs a new mapping that has nothing mapped. - */ - public GamepadMapping() { - mapping = new HashMap(); - } - - /** - * Inserts the specified mapping into this map - * @param toMap a Mapping that will be mapped to the specified gamepad component - * @param comp the gamepad component to map to. - */ - public void insertMapping(Mapping toMap, SourceComponent comp) { - mapping.put(comp, toMap); - } - - /** - * Gets the mapping for the specified gamepad component - * @param comp the gamepad component to get a mapping for - * @return a mapping for the requested component - */ - public Mapping get(SourceComponent comp) { - return mapping.get(comp); - } - - /** - * Removes the mapping to the specified component - * @param comp the component to no longer be mapped. - */ - public void remove(SourceComponent comp) { - mapping.remove(comp); - } - - /** - * Gets the mapped ControllerComponent for the specified ControllerComponent.
- * NOTE: Iterates a hashmap, use sparingly - * @param padComp the component to get a mapping for - * @return a mapping or an null if there is none - */ - public Mapping get(GamepadComponent padComp) { - //#allTheJank - for (Entry entry : mapping.entrySet()) { - if (entry.getValue().padComp == padComp) { - return entry.getValue(); - } - } - return null; - } - - /** - * Gets the mapping for the specified component.
- * NOTE: Iterates a hashmap, use sparingly - * @param padComp the component to get a mapping for - * @return a mapping or an empty string if there is none - */ - public SourceComponent getMapping(GamepadComponent padComp) { - for (Entry entry : mapping.entrySet()) { - if (entry.getValue().padComp == padComp) { - return entry.getKey(); - } - } - return null; - } - - /** - * Represents a mapping, that is which gamepad component, whether it is inverted, a trigger, etc. - * @author Diego Waxemberg - */ - public class Mapping implements Serializable { - private static final long serialVersionUID = -8407172977953214242L; - - /** - * The component this mapping belongs to - */ - public GamepadComponent padComp; - - /** - * Whether the value of this component should be inverted - */ - public boolean invert; - - /** - * Whether this component should be treated as a trigger - */ - public boolean trigger; - - /** - * Constructs a new mapping with the specified configuration - * @param padComp the component this mapping belongs to - * @param invert whether the value should be inverted - * @param trigger whether this component should be treated as a trigger - */ - public Mapping(GamepadComponent padComp, boolean invert, boolean trigger) { - this.padComp = padComp; - this.invert = invert; - this.trigger = trigger; - } - } -} diff --git a/src/com/limelight/input/gamepad/NativeGamepad.java b/src/com/limelight/input/gamepad/NativeGamepad.java deleted file mode 100644 index 83fa5c2..0000000 --- a/src/com/limelight/input/gamepad/NativeGamepad.java +++ /dev/null @@ -1,182 +0,0 @@ -package com.limelight.input.gamepad; - -import java.util.ArrayList; - -public class NativeGamepad { - public static final int DEFAULT_DEVICE_POLLING_INTERVAL = 1000; - public static final int DEFAULT_EVENT_POLLING_INTERVAL = 20; - - private static ArrayList listenerList = - new ArrayList(); - private static boolean running = false; - private static boolean initialized = false; - private static Thread deviceThread = null; - private static Thread eventThread = null; - private static int devicePollingIntervalMs = DEFAULT_DEVICE_POLLING_INTERVAL; - private static int eventPollingIntervalMs = DEFAULT_EVENT_POLLING_INTERVAL; - - static { - System.loadLibrary("gamepad_jni"); - } - - private static native void init(); - private static native void shutdown(); - private static native int numDevices(); - private static native void detectDevices(); - private static native void processEvents(); - - public static void addListener(NativeGamepadListener listener) { - listenerList.add(listener); - } - - public static void removeListener(NativeGamepadListener listener) { - listenerList.remove(listener); - } - - public static boolean isRunning() { - return running; - } - - public static void setDevicePollingInterval(int interval) { - devicePollingIntervalMs = interval; - } - - public static int getDevicePollingInterval() { - return devicePollingIntervalMs; - } - - public static void setEventPollingInterval(int interval) { - eventPollingIntervalMs = interval; - } - - public static int getEventPollingInterval() { - return eventPollingIntervalMs; - } - - public static void start() { - if (!initialized) { - NativeGamepad.init(); - initialized = true; - } - if (!running) { - startDevicePolling(); - startEventPolling(); - running = true; - } - } - - public static void stop() { - if (running) { - stopEventPolling(); - stopDevicePolling(); - running = false; - } - } - - public static void release() { - if (running) { - throw new IllegalStateException("Cannot release running NativeGamepad"); - } - - if (initialized) { - NativeGamepad.shutdown(); - initialized = false; - } - } - - public static int getDeviceCount() { - if (!running) { - throw new IllegalStateException("NativeGamepad not running"); - } - - return NativeGamepad.numDevices(); - } - - private static void startDevicePolling() { - deviceThread = new Thread() { - @Override - public void run() { - while (!isInterrupted()) { - NativeGamepad.detectDevices(); - - try { - Thread.sleep(devicePollingIntervalMs); - } catch (InterruptedException e) { - return; - } - } - } - }; - deviceThread.setName("Native Gamepad - Device Polling Thread"); - deviceThread.start(); - } - - private static void startEventPolling() { - eventThread = new Thread() { - @Override - public void run() { - while (!isInterrupted()) { - NativeGamepad.processEvents(); - - try { - Thread.sleep(eventPollingIntervalMs); - } catch (InterruptedException e) { - return; - } - } - } - }; - eventThread.setName("Native Gamepad - Event Polling Thread"); - eventThread.start(); - } - - private static void stopDevicePolling() { - if (deviceThread != null) { - deviceThread.interrupt(); - - try { - deviceThread.join(); - } catch (InterruptedException e) {} - } - } - - private static void stopEventPolling() { - if (eventThread != null) { - eventThread.interrupt(); - - try { - eventThread.join(); - } catch (InterruptedException e) {} - } - } - - public static void deviceAttachCallback(int deviceId, int numButtons, int numAxes) { - for (NativeGamepadListener listener : listenerList) { - listener.deviceAttached(deviceId, numButtons, numAxes); - } - } - - public static void deviceRemoveCallback(int deviceId) { - for (NativeGamepadListener listener : listenerList) { - listener.deviceRemoved(deviceId); - } - } - - public static void buttonUpCallback(int deviceId, int buttonId) { - for (NativeGamepadListener listener : listenerList) { - listener.buttonUp(deviceId, buttonId); - } - } - - public static void buttonDownCallback(int deviceId, int buttonId) { - for (NativeGamepadListener listener : listenerList) { - listener.buttonDown(deviceId, buttonId); - } - } - - public static void axisMovedCallback(int deviceId, int axisId, float value, float lastValue) { - for (NativeGamepadListener listener : listenerList) { - listener.axisMoved(deviceId, axisId, value, lastValue); - } - } -} diff --git a/src/com/limelight/input/gamepad/NativeGamepadListener.java b/src/com/limelight/input/gamepad/NativeGamepadListener.java deleted file mode 100644 index 95bbd54..0000000 --- a/src/com/limelight/input/gamepad/NativeGamepadListener.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.limelight.input.gamepad; - -public interface NativeGamepadListener { - public void deviceAttached(int deviceId, int numButtons, int numAxes); - - public void deviceRemoved(int deviceId); - - public void buttonDown(int deviceId, int buttonId); - - public void buttonUp(int deviceId, int buttonId); - - public void axisMoved(int deviceId, int axisId, float value, float lastValue); -} diff --git a/src/com/limelight/input/gamepad/SourceComponent.java b/src/com/limelight/input/gamepad/SourceComponent.java deleted file mode 100644 index fe48c1e..0000000 --- a/src/com/limelight/input/gamepad/SourceComponent.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.limelight.input.gamepad; - -import java.io.Serializable; - -public class SourceComponent implements Serializable { - private static final long serialVersionUID = 2366409458045238273L; - - public enum Type { AXIS, BUTTON } - private Type type; - private int id; - - public SourceComponent(Type type, int id) { - this.type = type; - this.id = id; - } - - public Type getType() { - return type; - } - - public int getId() { - return id; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + id; - result = prime * result + ((type == null) ? 0 : type.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || !(obj instanceof SourceComponent)) { - return false; - } - SourceComponent other = (SourceComponent) obj; - - return id == other.id && type == other.type; - } -} diff --git a/src/com/limelight/settings/GamepadSettingsManager.java b/src/com/limelight/settings/GamepadSettingsManager.java deleted file mode 100644 index a84d9d5..0000000 --- a/src/com/limelight/settings/GamepadSettingsManager.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.limelight.settings; - -import java.io.File; - -import com.limelight.input.gamepad.GamepadMapping; - -/** - * Manages the gamepad settings - * @author Diego Waxemberg - */ -public abstract class GamepadSettingsManager { - private static GamepadMapping cachedSettings; - - /** - * Reads the gamepad settings from the gamepad file and caches the configuration - * @return the gamepad settings - */ - public static GamepadMapping getSettings() { - if (cachedSettings == null) { - System.out.println("Reading Gamepad Settings"); - File gamepadFile = SettingsManager.getInstance().getGamepadFile(); - GamepadMapping savedMapping = (GamepadMapping)SettingsManager.readSettings(gamepadFile); - cachedSettings = savedMapping; - } - if (cachedSettings == null) { - System.out.println("Unable to get gamepad settings. Using an empty mapping instead."); - cachedSettings = new GamepadMapping(); - writeSettings(cachedSettings); - } - return cachedSettings; - } - - /** - * Writes the specified mapping to the gamepad file and updates the cached settings - * @param settings the new gamepad mapping to be written out - */ - public static void writeSettings(GamepadMapping settings) { - cachedSettings = settings; - System.out.println("Writing Gamepad Settings"); - - File gamepadFile = SettingsManager.getInstance().getGamepadFile(); - - SettingsManager.writeSettings(gamepadFile, settings); - } - -}