mirror of
https://github.com/moonlight-stream/moonlight-embedded.git
synced 2026-04-23 08:36:42 +00:00
Initial NativeGamepad class
This commit is contained in:
172
src/com/limelight/input/gamepad/NativeGamepad.java
Normal file
172
src/com/limelight/input/gamepad/NativeGamepad.java
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
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<NativeGamepadListener> listenerList =
|
||||||
|
new ArrayList<NativeGamepadListener>();
|
||||||
|
private static boolean running = 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");
|
||||||
|
|
||||||
|
NativeGamepad.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
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 (!running) {
|
||||||
|
startDevicePolling();
|
||||||
|
startEventPolling();
|
||||||
|
running = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void stop() {
|
||||||
|
if (running) {
|
||||||
|
stopEventPolling();
|
||||||
|
stopDevicePolling();
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void release() {
|
||||||
|
NativeGamepad.shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user