From 07c6c55577c6862a452cfaaa747c0a80e4297146 Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Tue, 28 Jan 2014 14:42:13 +0100 Subject: [PATCH] Suport for Dpads which use absolute values in evdev --- mappings/default.conf | 8 ++++-- src/com/limelight/input/EvdevAbsolute.java | 16 ++++++++++++ src/com/limelight/input/EvdevHandler.java | 29 ++++++++++++++++++++- src/com/limelight/input/GamepadMapping.java | 3 +++ 4 files changed, 53 insertions(+), 3 deletions(-) diff --git a/mappings/default.conf b/mappings/default.conf index 96b1014..854ff49 100644 --- a/mappings/default.conf +++ b/mappings/default.conf @@ -2,10 +2,14 @@ abs_x = 0 abs_y = 1 abs_rx = 3 abs_ry = 4 - + +#Unused in default configuration +#abs_dpad_y = -1 +#abs_dpad_x = -1 + abs_throttle = 6 abs_rudder = 7 - + btn_south = 304 btn_east = 305 btn_north = 307 diff --git a/src/com/limelight/input/EvdevAbsolute.java b/src/com/limelight/input/EvdevAbsolute.java index be0e95d..4aea23f 100644 --- a/src/com/limelight/input/EvdevAbsolute.java +++ b/src/com/limelight/input/EvdevAbsolute.java @@ -9,6 +9,8 @@ import java.nio.ByteOrder; */ public class EvdevAbsolute { + public final static int UP = 1, DOWN = -1, NONE = 0; + private final static int ABS_OFFSET = 0x40; private final static int READ_ONLY = 2; private final static char EVDEV_TYPE = 'E'; @@ -52,4 +54,18 @@ public class EvdevAbsolute { return (byte) ((value-avg) * range / Byte.MAX_VALUE); } + /** + * Convert input value to direction + * @param value received input + * @return input value as direction + */ + public byte getDirection(int value) { + if (value>(avg+range/4)) + return UP; + else if (value<(avg-range/4)) + return DOWN; + else + return NONE; + } + } diff --git a/src/com/limelight/input/EvdevHandler.java b/src/com/limelight/input/EvdevHandler.java index 58efa6e..097e1a0 100644 --- a/src/com/limelight/input/EvdevHandler.java +++ b/src/com/limelight/input/EvdevHandler.java @@ -28,7 +28,7 @@ public class EvdevHandler implements Runnable { private byte leftTrigger, rightTrigger; private short leftStickX, leftStickY, rightStickX, rightStickY; - private EvdevAbsolute absLX, absLY, absRX, absRY, absLT, absRT; + private EvdevAbsolute absLX, absLY, absRX, absRY, absLT, absRT, absDX, absDY; private NvConnection conn; private FileChannel deviceInput; @@ -56,6 +56,8 @@ public class EvdevHandler implements Runnable { absRY = new EvdevAbsolute(device, mapping.abs_ry); absLT = new EvdevAbsolute(device, mapping.abs_rudder); absRT = new EvdevAbsolute(device, mapping.abs_throttle); + absDX = new EvdevAbsolute(device, mapping.abs_dpad_x); + absDY = new EvdevAbsolute(device, mapping.abs_dpad_y); translator = new KeyboardTranslator(conn); } @@ -160,6 +162,31 @@ public class EvdevHandler implements Runnable { leftTrigger = absLT.getByte(value); else if (code==mapping.abs_rudder) rightTrigger = absRT.getByte(value); + else if (code==mapping.abs_dpad_x) { + int dir = absRT.getDirection(value); + if (dir==EvdevAbsolute.UP) { + buttonFlags |= ControllerPacket.RIGHT_FLAG; + buttonFlags &= ~ControllerPacket.LEFT_FLAG; + } else if (dir==EvdevAbsolute.NONE) { + buttonFlags &= ~ControllerPacket.LEFT_FLAG; + buttonFlags &= ~ControllerPacket.RIGHT_FLAG; + } else if (dir==EvdevAbsolute.DOWN) { + buttonFlags |= ControllerPacket.LEFT_FLAG; + buttonFlags &= ~ControllerPacket.RIGHT_FLAG; + } + } else if (code==mapping.abs_dpad_y) { + int dir = absRT.getDirection(value); + if (dir==EvdevAbsolute.UP) { + buttonFlags |= ControllerPacket.UP_FLAG; + buttonFlags &= ~ControllerPacket.DOWN_FLAG; + } else if (dir==EvdevAbsolute.NONE) { + buttonFlags &= ~ControllerPacket.DOWN_FLAG; + buttonFlags &= ~ControllerPacket.UP_FLAG; + } else if (dir==EvdevAbsolute.DOWN) { + buttonFlags |= ControllerPacket.DOWN_FLAG; + buttonFlags &= ~ControllerPacket.UP_FLAG; + } + } 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 4b7302a..e9b76c2 100644 --- a/src/com/limelight/input/GamepadMapping.java +++ b/src/com/limelight/input/GamepadMapping.java @@ -18,6 +18,9 @@ public class GamepadMapping { public short abs_rx = EvdevConstants.ABS_RX; public short abs_ry = EvdevConstants.ABS_RY; + public short abs_dpad_y = -1; + public short abs_dpad_x = -1; + public short abs_throttle = EvdevConstants.ABS_THROTTLE; public short abs_rudder = EvdevConstants.ABS_RUDDER;