Possible to reverse directions in gamepad mapping

This commit is contained in:
Iwan Timmer
2014-01-28 14:49:58 +01:00
parent 07c6c55577
commit 61a2c8abad
4 changed files with 38 additions and 16 deletions

View File

@@ -10,6 +10,15 @@ abs_ry = 4
abs_throttle = 6 abs_throttle = 6
abs_rudder = 7 abs_rudder = 7
reverse_x = false
reverse_y = false
reverse_rx = false
reverse_ry = false
reverse_dpad_y = false
reverse_dpad_x = false
reverse_throttle = false
reverse_rudder = false
btn_south = 304 btn_south = 304
btn_east = 305 btn_east = 305
btn_north = 307 btn_north = 307

View File

@@ -18,7 +18,9 @@ public class EvdevAbsolute {
private int avg; private int avg;
private int range; private int range;
public EvdevAbsolute(String filename, int axis) { private boolean reverse;
public EvdevAbsolute(String filename, int axis, boolean reverse) {
ByteBuffer buffer = ByteBuffer.allocate(6*4); ByteBuffer buffer = ByteBuffer.allocate(6*4);
buffer.order(ByteOrder.nativeOrder()); buffer.order(ByteOrder.nativeOrder());
byte[] data = buffer.array(); byte[] data = buffer.array();
@@ -30,6 +32,8 @@ public class EvdevAbsolute {
int max = buffer.getInt(); int max = buffer.getInt();
avg = (min+max)/2; avg = (min+max)/2;
range = max-avg; range = max-avg;
this.reverse = reverse;
} }
private int getRequest(int dir, int type, int nr, int size) { private int getRequest(int dir, int type, int nr, int size) {
@@ -42,7 +46,7 @@ public class EvdevAbsolute {
* @return input value as short * @return input value as short
*/ */
public short getShort(int value) { public short getShort(int value) {
return (short) ((value-avg) * range / Short.MAX_VALUE); return (short) ((value-avg) * (reverse?-range:range) / Short.MAX_VALUE);
} }
/** /**
@@ -51,7 +55,7 @@ public class EvdevAbsolute {
* @return input value as byte * @return input value as byte
*/ */
public byte getByte(int value) { public byte getByte(int value) {
return (byte) ((value-avg) * range / Byte.MAX_VALUE); return (byte) ((value-avg) * (reverse?-range:range) / Byte.MAX_VALUE);
} }
/** /**
@@ -59,11 +63,11 @@ public class EvdevAbsolute {
* @param value received input * @param value received input
* @return input value as direction * @return input value as direction
*/ */
public byte getDirection(int value) { public int getDirection(int value) {
if (value>(avg+range/4)) if (value>(avg+range/4))
return UP; return (reverse?DOWN:UP);
else if (value<(avg-range/4)) else if (value<(avg-range/4))
return DOWN; return (reverse?UP:DOWN);
else else
return NONE; return NONE;
} }

View File

@@ -50,14 +50,14 @@ public class EvdevHandler implements Runnable {
inputBuffer = ByteBuffer.allocate(EvdevConstants.MAX_STRUCT_SIZE_BYTES); inputBuffer = ByteBuffer.allocate(EvdevConstants.MAX_STRUCT_SIZE_BYTES);
inputBuffer.order(ByteOrder.nativeOrder()); inputBuffer.order(ByteOrder.nativeOrder());
absLX = new EvdevAbsolute(device, mapping.abs_x); absLX = new EvdevAbsolute(device, mapping.abs_x, mapping.reverse_x);
absLY = new EvdevAbsolute(device, mapping.abs_y); absLY = new EvdevAbsolute(device, mapping.abs_y, mapping.reverse_y);
absRX = new EvdevAbsolute(device, mapping.abs_rx); absRX = new EvdevAbsolute(device, mapping.abs_rx, mapping.reverse_rx);
absRY = new EvdevAbsolute(device, mapping.abs_ry); absRY = new EvdevAbsolute(device, mapping.abs_ry, mapping.reverse_ry);
absLT = new EvdevAbsolute(device, mapping.abs_rudder); absLT = new EvdevAbsolute(device, mapping.abs_rudder, mapping.reverse_rudder);
absRT = new EvdevAbsolute(device, mapping.abs_throttle); absRT = new EvdevAbsolute(device, mapping.abs_throttle, mapping.reverse_throttle);
absDX = new EvdevAbsolute(device, mapping.abs_dpad_x); absDX = new EvdevAbsolute(device, mapping.abs_dpad_x, mapping.reverse_dpad_x);
absDY = new EvdevAbsolute(device, mapping.abs_dpad_y); absDY = new EvdevAbsolute(device, mapping.abs_dpad_y, mapping.reverse_dpad_y);
translator = new KeyboardTranslator(conn); translator = new KeyboardTranslator(conn);
} }

View File

@@ -24,6 +24,11 @@ public class GamepadMapping {
public short abs_throttle = EvdevConstants.ABS_THROTTLE; public short abs_throttle = EvdevConstants.ABS_THROTTLE;
public short abs_rudder = EvdevConstants.ABS_RUDDER; public short abs_rudder = EvdevConstants.ABS_RUDDER;
public boolean reverse_x, reverse_y;
public boolean reverse_rx, reverse_ry;
public boolean reverse_dpad_y, reverse_dpad_x;
public boolean reverse_throttle, reverse_rudder;
public short btn_south = EvdevConstants.BTN_SOUTH; public short btn_south = EvdevConstants.BTN_SOUTH;
public short btn_east = EvdevConstants.BTN_EAST; public short btn_east = EvdevConstants.BTN_EAST;
public short btn_north = EvdevConstants.BTN_NORTH; public short btn_north = EvdevConstants.BTN_NORTH;
@@ -48,8 +53,12 @@ public class GamepadMapping {
for (Map.Entry entry:props.entrySet()) { for (Map.Entry entry:props.entrySet()) {
try { try {
Field field = this.getClass().getField(entry.getKey().toString()); String key = entry.getKey().toString();
field.setShort(this, Short.parseShort(entry.getValue().toString())); Field field = this.getClass().getField(key);
if (key.startsWith("reverse_"))
field.setBoolean(this, Boolean.parseBoolean(entry.getValue().toString()));
else
field.setShort(this, Short.parseShort(entry.getValue().toString()));
} catch (NoSuchFieldException e) { } catch (NoSuchFieldException e) {
System.err.println("No mapping found named " + entry.getKey()); System.err.println("No mapping found named " + entry.getKey());
} catch (NumberFormatException e) { } catch (NumberFormatException e) {