Correct handling of triggers

This commit is contained in:
Iwan Timmer
2015-02-18 17:07:34 +01:00
parent e6ec6ad640
commit 545c3397db
2 changed files with 16 additions and 14 deletions

View File

@@ -13,8 +13,9 @@ public class EvdevAbsolute {
private final static int ABS_OFFSET = 0x40;
private int min, max;
private int avg;
private int range;
private int range, diff;
private int flat;
private boolean reverse;
@@ -27,12 +28,13 @@ public class EvdevAbsolute {
IO.ioctl(filename, data, request);
buffer.getInt(); //Skip current value
int min = buffer.getInt();
int max = buffer.getInt();
min = buffer.getInt();
max = buffer.getInt();
buffer.getInt(); //Skip fuzz
flat = buffer.getInt();
avg = (min+max)/2;
range = max-avg;
diff = max-min;
this.reverse = reverse;
}
@@ -45,9 +47,9 @@ public class EvdevAbsolute {
public short getShort(int value) {
if (Math.abs(value-avg)<flat)
return 0;
else if (value>avg+range)
else if (value>max)
return reverse?Short.MIN_VALUE:Short.MAX_VALUE;
else if (value<avg-range)
else if (value<min)
return reverse?Short.MAX_VALUE:Short.MIN_VALUE;
else {
value += value<avg?flat:-flat;
@@ -61,15 +63,15 @@ public class EvdevAbsolute {
* @return input value as byte
*/
public byte getByte(int value) {
if (Math.abs(value-avg)<flat)
if (Math.abs(value-min)<flat)
return 0;
else if (value>avg+range)
return reverse?Byte.MIN_VALUE:Byte.MAX_VALUE;
else if (value<avg-range)
return reverse?Byte.MAX_VALUE:Byte.MIN_VALUE;
else if (value>max)
return reverse?0:(byte) 0xFF;
else if (value<min)
return reverse?(byte) 0xFF:0;
else {
value += value<avg?flat:-flat;
return (byte) ((value-avg) * Byte.MAX_VALUE / (reverse?flat-range:range-flat));
value -= -flat;
return (byte) ((value-min) * 0xFF / (reverse?flat-diff:diff-flat));
}
}

View File

@@ -162,9 +162,9 @@ public class EvdevHandler extends EvdevReader {
else if (value==EvdevConstants.KEY_RELEASED)
buttonFlags &= ~gamepadButton;
} else if (code==mapping.btn_tl2)
leftTrigger = (byte) (value==EvdevConstants.KEY_PRESSED ? -1 : 0);
leftTrigger = (byte) (value==EvdevConstants.KEY_PRESSED ? 0xFF : 0);
else if (code==mapping.btn_tr2)
rightTrigger = (byte) (value==EvdevConstants.KEY_PRESSED ? -1 : 0);
rightTrigger = (byte) (value==EvdevConstants.KEY_PRESSED ? 0xFF : 0);
else
gamepadModified = false;
}