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); + } } /**