From 161175b86693b798ead2ef4975c257c89aac2a1e Mon Sep 17 00:00:00 2001 From: admiralmachado Date: Tue, 11 Mar 2014 21:13:12 +0100 Subject: [PATCH 1/3] Handle "--trigger-as-button" option from xboxdrv --- src/com/limelight/input/EvdevConstants.java | 2 ++ src/com/limelight/input/EvdevHandler.java | 16 +++++++++++----- src/com/limelight/input/GamepadMapping.java | 2 ++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/com/limelight/input/EvdevConstants.java b/src/com/limelight/input/EvdevConstants.java index 5c1c8ff..8f80fc4 100644 --- a/src/com/limelight/input/EvdevConstants.java +++ b/src/com/limelight/input/EvdevConstants.java @@ -150,6 +150,8 @@ public class EvdevConstants { public static final short ABS_THROTTLE = 0x06; public static final short ABS_RUDDER = 0x07; + public static final short BTN_THROTTLE = 311; + public static final short BTN_RUDDER = 312; public static final short BTN_SOUTH = 0x130; public static final short BTN_EAST = 0x131; diff --git a/src/com/limelight/input/EvdevHandler.java b/src/com/limelight/input/EvdevHandler.java index 9c8e019..f8b3d05 100644 --- a/src/com/limelight/input/EvdevHandler.java +++ b/src/com/limelight/input/EvdevHandler.java @@ -135,11 +135,17 @@ public class EvdevHandler implements Runnable { conn.sendMouseButtonDown(mouseButton); else if (value==EvdevConstants.KEY_RELEASED) conn.sendMouseButtonUp(mouseButton); - } else if (gamepadButton>0) { - if (value==EvdevConstants.KEY_PRESSED) { - buttonFlags |= gamepadButton; - } else if (value==EvdevConstants.KEY_RELEASED){ - buttonFlags &= ~gamepadButton; + } else { + if (gamepadButton != 0) { + if (value==EvdevConstants.KEY_PRESSED) { + buttonFlags |= gamepadButton; + } else if (value==EvdevConstants.KEY_RELEASED){ + buttonFlags &= ~gamepadButton; + } + } else if (code==mapping.btn_throttle) { + leftTrigger = (byte) (value==EvdevConstants.KEY_PRESSED ? -1 : 0); + } else if (code==mapping.btn_rudder) { + rightTrigger = (byte) (value==EvdevConstants.KEY_PRESSED ? -1 : 0); } conn.sendControllerInput(buttonFlags, leftTrigger, rightTrigger, leftStickX, leftStickY, rightStickX, rightStickY); } diff --git a/src/com/limelight/input/GamepadMapping.java b/src/com/limelight/input/GamepadMapping.java index 823d7b2..9fad6fe 100644 --- a/src/com/limelight/input/GamepadMapping.java +++ b/src/com/limelight/input/GamepadMapping.java @@ -23,6 +23,8 @@ public class GamepadMapping { public short abs_throttle = EvdevConstants.ABS_THROTTLE; public short abs_rudder = EvdevConstants.ABS_RUDDER; + public short btn_throttle = EvdevConstants.BTN_THROTTLE; + public short btn_rudder = EvdevConstants.BTN_RUDDER; public boolean reverse_x, reverse_y; public boolean reverse_rx, reverse_ry; From 06fb196b6a8613db77bb549021719fd27dff7c05 Mon Sep 17 00:00:00 2001 From: admiralmachado Date: Tue, 11 Mar 2014 21:22:44 +0100 Subject: [PATCH 2/3] Added deadzone for left/right sticks --- src/com/limelight/input/EvdevHandler.java | 16 ++++++++++++---- src/com/limelight/input/GamepadMapping.java | 2 ++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/com/limelight/input/EvdevHandler.java b/src/com/limelight/input/EvdevHandler.java index f8b3d05..67aae6c 100644 --- a/src/com/limelight/input/EvdevHandler.java +++ b/src/com/limelight/input/EvdevHandler.java @@ -157,13 +157,13 @@ public class EvdevHandler implements Runnable { conn.sendMouseMove((short) 0, (short) value); } else if (type==EvdevConstants.EV_ABS) { if (code==mapping.abs_x) - leftStickX = absLX.getShort(value); + leftStickX = accountForDeadzone(absLX.getShort(value)); else if (code==mapping.abs_y) - leftStickY = absLY.getShort(value); + leftStickY = accountForDeadzone(absLY.getShort(value)); else if (code==mapping.abs_rx) - rightStickX = absRX.getShort(value); + rightStickX = accountForDeadzone(absRX.getShort(value)); else if (code==mapping.abs_ry) - rightStickY = absRY.getShort(value); + rightStickY = accountForDeadzone(absRY.getShort(value)); else if (code==mapping.abs_throttle) leftTrigger = absLT.getByte(value); else if (code==mapping.abs_rudder) @@ -198,6 +198,14 @@ public class EvdevHandler implements Runnable { } } + private short accountForDeadzone(short value) { + if (Math.abs(value) > mapping.abs_deadzone) { + return value; + } else { + return 0; + } + } + @Override public void run() { try { diff --git a/src/com/limelight/input/GamepadMapping.java b/src/com/limelight/input/GamepadMapping.java index 9fad6fe..73f210a 100644 --- a/src/com/limelight/input/GamepadMapping.java +++ b/src/com/limelight/input/GamepadMapping.java @@ -18,6 +18,8 @@ public class GamepadMapping { public short abs_rx = EvdevConstants.ABS_RX; public short abs_ry = EvdevConstants.ABS_RY; + public short abs_deadzone = 0; + public short abs_dpad_y = -1; public short abs_dpad_x = -1; From 821ad6fe5e15998f84ac8129026026ac1a6f157c Mon Sep 17 00:00:00 2001 From: admiralmachado Date: Tue, 11 Mar 2014 21:26:32 +0100 Subject: [PATCH 3/3] Adjusted short and byte scaling and reversal in EvdevAbsolute and accounting for signed and unsigned input --- src/com/limelight/input/EvdevAbsolute.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/com/limelight/input/EvdevAbsolute.java b/src/com/limelight/input/EvdevAbsolute.java index 5534b6e..2c41eb5 100644 --- a/src/com/limelight/input/EvdevAbsolute.java +++ b/src/com/limelight/input/EvdevAbsolute.java @@ -11,14 +11,18 @@ public class EvdevAbsolute { public final static int UP = 1, DOWN = -1, NONE = 0; + private static final int SHORT_MAX_UNSIGNED = 0xFFFF; + private static final int BYTE_MAX_UNSIGNED = 0xFF; private final static int ABS_OFFSET = 0x40; private final static int READ_ONLY = 2; private final static char EVDEV_TYPE = 'E'; + private int max; private int avg; private int range; private boolean reverse; + private boolean signed; public EvdevAbsolute(String filename, int axis, boolean reverse) { ByteBuffer buffer = ByteBuffer.allocate(6*4); @@ -29,10 +33,10 @@ public class EvdevAbsolute { buffer.getInt(); //Skip current value int min = buffer.getInt(); - int max = buffer.getInt(); + max = buffer.getInt(); avg = (min+max)/2; range = max-avg; - + signed = min < 0; this.reverse = reverse; } @@ -46,7 +50,10 @@ public class EvdevAbsolute { * @return input value as short */ public short getShort(int value) { - return (short) ((value-avg) * (reverse?-range:range) / Short.MAX_VALUE); + if (signed) + return (short) ((reverse ? -1 - value : value) * (Short.MAX_VALUE + 1) / (max + 1)); + else + return (short) ((reverse ? max - value : value) * SHORT_MAX_UNSIGNED / max); } /** @@ -55,7 +62,11 @@ public class EvdevAbsolute { * @return input value as byte */ public byte getByte(int value) { - return (byte) ((value-avg) * (reverse?-range:range) / Byte.MAX_VALUE); + if (signed) { + return (byte) ((reverse ? -1 - value : value) * (Byte.MAX_VALUE + 1) / (max + 1)); + } else { + return (byte) ((reverse ? max - value : value) * BYTE_MAX_UNSIGNED / max); + } } /**