From ea90a2d3b4f0f147556a155328b77acd54e7e39a Mon Sep 17 00:00:00 2001 From: endolf Date: Sun, 12 Aug 2007 20:09:14 +0000 Subject: [PATCH] Make the joystick plugin on linux respect POV Hats --- .../games/input/LinuxEnvironmentPlugin.java | 29 +++++++++- .../java/games/input/LinuxJoystickAxis.java | 9 ++- .../java/games/input/LinuxJoystickDevice.java | 34 +++++++++++- .../java/games/input/LinuxJoystickPOV.java | 55 +++++++++++++++++++ 4 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 plugins/linux/src/java/net/java/games/input/LinuxJoystickPOV.java diff --git a/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java b/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java index ebfc0f0..2b93099 100644 --- a/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java +++ b/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java @@ -314,6 +314,8 @@ public final class LinuxEnvironmentPlugin extends ControllerEnvironment implemen List components = new ArrayList(); byte[] axisMap = device.getAxisMap(); char[] buttonMap = device.getButtonMap(); + LinuxJoystickAxis[] hatBits = new LinuxJoystickAxis[6]; + for (int i = 0; i < device.getNumButtons(); i++) { Component.Identifier.Button button_id = (Component.Identifier.Button)LinuxNativeTypesMap.getButtonID(buttonMap[i]); if (button_id != null) { @@ -326,8 +328,33 @@ public final class LinuxEnvironmentPlugin extends ControllerEnvironment implemen Component.Identifier.Axis axis_id; axis_id = (Component.Identifier.Axis) LinuxNativeTypesMap.getAbsAxisID(axisMap[i]); LinuxJoystickAxis axis = new LinuxJoystickAxis(axis_id); + device.registerAxis(i, axis); - components.add(axis); + + if(axisMap[i]==NativeDefinitions.ABS_HAT0X) { + hatBits[0] = axis; + } else if(axisMap[i]==NativeDefinitions.ABS_HAT0Y) { + hatBits[1] = axis; + axis = new LinuxJoystickPOV(Component.Identifier.Axis.POV, hatBits[0], hatBits[1]); + device.registerPOV((LinuxJoystickPOV)axis); + components.add(axis); + } else if(axisMap[i]==NativeDefinitions.ABS_HAT1X) { + hatBits[2] = axis; + } else if(axisMap[i]==NativeDefinitions.ABS_HAT1Y) { + hatBits[3] = axis; + axis = new LinuxJoystickPOV(Component.Identifier.Axis.POV, hatBits[2], hatBits[3]); + device.registerPOV((LinuxJoystickPOV)axis); + components.add(axis); + } else if(axisMap[i]==NativeDefinitions.ABS_HAT2X) { + hatBits[4] = axis; + } else if(axisMap[i]==NativeDefinitions.ABS_HAT2Y) { + hatBits[5] = axis; + axis = new LinuxJoystickPOV(Component.Identifier.Axis.POV, hatBits[4], hatBits[5]); + device.registerPOV((LinuxJoystickPOV)axis); + components.add(axis); + } else { + components.add(axis); + } } return new LinuxJoystickAbstractController(device, (Component[])components.toArray(new Component[]{}), new Controller[]{}, new Rumbler[]{}); diff --git a/plugins/linux/src/java/net/java/games/input/LinuxJoystickAxis.java b/plugins/linux/src/java/net/java/games/input/LinuxJoystickAxis.java index 0b2621b..47adc99 100644 --- a/plugins/linux/src/java/net/java/games/input/LinuxJoystickAxis.java +++ b/plugins/linux/src/java/net/java/games/input/LinuxJoystickAxis.java @@ -46,9 +46,15 @@ import java.io.IOException; */ class LinuxJoystickAxis extends AbstractComponent { private float value; + private boolean analog; public LinuxJoystickAxis(Component.Identifier.Axis axis_id) { + this(axis_id, true); + } + + public LinuxJoystickAxis(Component.Identifier.Axis axis_id, boolean analog) { super(axis_id.getName(), axis_id); + this.analog = analog; } public final boolean isRelative() { @@ -56,11 +62,12 @@ class LinuxJoystickAxis extends AbstractComponent { } public final boolean isAnalog() { - return true; + return analog; } final void setValue(float value) { this.value = value; + resetHasPolled(); } protected final float poll() throws IOException { diff --git a/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java b/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java index bc37e7b..0dcd5da 100644 --- a/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java +++ b/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java @@ -48,6 +48,8 @@ final class LinuxJoystickDevice implements LinuxDevice { private final Event event = new Event(); private final LinuxJoystickButton[] buttons; private final LinuxJoystickAxis[] axes; + private final Map povXs = new HashMap(); + private final Map povYs = new HashMap(); private final byte[] axisMap; private final char[] buttonMap; @@ -100,7 +102,17 @@ final class LinuxJoystickDevice implements LinuxDevice { if (axis != null) { float value = (float)joystick_event.getValue()/AXIS_MAX_VALUE; axis.setValue(value); - event.set(axis, value, joystick_event.getNanos()); + if(povXs.containsKey(new Integer(index))) { + LinuxJoystickPOV pov = (LinuxJoystickPOV)(povXs.get(new Integer(index))); + pov.updateValue(); + event.set(pov, pov.getPollData(), joystick_event.getNanos()); + } else if(povYs.containsKey(new Integer(index))) { + LinuxJoystickPOV pov = (LinuxJoystickPOV)(povYs.get(new Integer(index))); + pov.updateValue(); + event.set(pov, pov.getPollData(), joystick_event.getNanos()); + } else { + event.set(axis, value, joystick_event.getNanos()); + } break; } } @@ -121,6 +133,26 @@ final class LinuxJoystickDevice implements LinuxDevice { public final void registerButton(int index, LinuxJoystickButton button) { buttons[index] = button; } + + public final void registerPOV(LinuxJoystickPOV pov) { + // The x and y on a joystick device are not the same as on an event device + LinuxJoystickAxis xAxis = pov.getYAxis(); + LinuxJoystickAxis yAxis = pov.getXAxis(); + int xIndex; + int yIndex; + for(xIndex=0;xIndex