Experimental: Added time based debouncing to GamepadChecker

This commit is contained in:
2023-01-19 23:18:52 -06:00
parent 4f519af193
commit c49736d59c

View File

@@ -9,49 +9,58 @@ public class GamepadChecker {
private final CyberarmEngine engine;
private final Gamepad gamepad;
private final HashMap<String, Boolean> buttons = new HashMap<>();
private final HashMap<String, Long> buttonsDebounceInterval = new HashMap<>();
private final long debounceTime = 50L; // ms
public GamepadChecker(CyberarmEngine engine, Gamepad gamepad) {
this.engine = engine;
this.gamepad = gamepad;
buttons.put("a", false);
buttons.put("b", false);
buttons.put("x", false);
buttons.put("y", false);
buttons.put("a", false); buttonsDebounceInterval.put("a", 0L);
buttons.put("b", false); buttonsDebounceInterval.put("b", 0L);
buttons.put("x", false); buttonsDebounceInterval.put("x", 0L);
buttons.put("y", false); buttonsDebounceInterval.put("y", 0L);
buttons.put("start", false);
buttons.put("guide", false);
buttons.put("back", false);
buttons.put("start", false); buttonsDebounceInterval.put("start", 0L);
buttons.put("guide", false); buttonsDebounceInterval.put("guide", 0L);
buttons.put("back", false); buttonsDebounceInterval.put("back", 0L);
buttons.put("left_bumper", false);
buttons.put("right_bumper", false);
buttons.put("left_bumper", false); buttonsDebounceInterval.put("left_bumper", 0L);
buttons.put("right_bumper", false); buttonsDebounceInterval.put("right_bumper", 0L);
buttons.put("left_stick_button", false);
buttons.put("right_stick_button", false);
buttons.put("left_stick_button", false); buttonsDebounceInterval.put("left_stick_button", 0L);
buttons.put("right_stick_button", false); buttonsDebounceInterval.put("right_stick_button", 0L);
buttons.put("dpad_left", false);
buttons.put("dpad_right", false);
buttons.put("dpad_up", false);
buttons.put("dpad_down", false);
buttons.put("dpad_left", false); buttonsDebounceInterval.put("dpad_left", 0L);
buttons.put("dpad_right", false); buttonsDebounceInterval.put("dpad_right", 0L);
buttons.put("dpad_up", false); buttonsDebounceInterval.put("dpad_up", 0L);
buttons.put("dpad_down", false); buttonsDebounceInterval.put("dpad_down", 0L);
}
public void update() {
long milliseconds = System.currentTimeMillis();
for (String btn : buttons.keySet()) {
try {
Field field = gamepad.getClass().getDeclaredField(btn);
boolean button = field.getBoolean(gamepad);
if (field.getBoolean(gamepad)) {
if (!buttons.get(btn)) {
engine.buttonDown(gamepad, btn);
if (button != buttons.get(btn) && milliseconds - buttonsDebounceInterval.get(btn) >= debounceTime) {
if (button) {
if (!buttons.get(btn)) {
engine.buttonDown(gamepad, btn);
}
buttons.put(btn, true);
} else {
if (buttons.get(btn)) {
engine.buttonUp(gamepad, btn);
}
buttons.put(btn, false);
}
buttons.put(btn, true);
} else {
if (buttons.get(btn)) {
engine.buttonUp(gamepad, btn);
}
buttons.put(btn, false);
} else if (button == buttons.get(btn)) {
buttonsDebounceInterval.put(btn, milliseconds);
}
} catch (NoSuchFieldException|IllegalAccessException e) {
e.printStackTrace();