mirror of
https://github.com/moonlight-stream/moonlight-embedded.git
synced 2026-02-16 10:30:47 +00:00
Adjusted short and byte scaling and reversal in EvdevAbsolute and accounting for signed and unsigned input
This commit is contained in:
committed by
Iwan Timmer
parent
06fb196b6a
commit
821ad6fe5e
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user