hid/hgame: Fix desync in hgame_dpad_cb()

hgame_dpad_cb() previously exited early whenever conflicting directions
were input (e.g., UP + DOWN) without saving said input to the
hgame_softc state. This led to a desync between the driver and the
gamepad.

This patch instead handles conflicting inputs by cancelling them out
with each other.

Remove early return. Calculate axis value by subtraction.

Reviewed by:	obiwac
Approved by:	obiwac
Differential Revision:	https://reviews.freebsd.org/D55849
This commit is contained in:
Majed Alkhaleefah
2026-03-24 14:37:09 +08:00
committed by Aymeric Wibo
parent c6bcf6e6fd
commit c586944fa2
+4 -12
View File
@@ -134,28 +134,20 @@ hgame_dpad_cb(HIDMAP_CB_ARGS)
data = ctx.data;
switch (HIDMAP_CB_UDATA64) {
case HUG_D_PAD_UP:
if (sc->dpad_down)
return (ENOMSG);
evdev_push_abs(evdev, ABS_HAT0Y, (data == 0) ? 0 : -1);
sc->dpad_up = (data != 0);
evdev_push_abs(evdev, ABS_HAT0Y, sc->dpad_down - sc->dpad_up);
break;
case HUG_D_PAD_DOWN:
if (sc->dpad_up)
return (ENOMSG);
evdev_push_abs(evdev, ABS_HAT0Y, (data == 0) ? 0 : 1);
sc->dpad_down = (data != 0);
evdev_push_abs(evdev, ABS_HAT0Y, sc->dpad_down - sc->dpad_up);
break;
case HUG_D_PAD_RIGHT:
if (sc->dpad_left)
return (ENOMSG);
evdev_push_abs(evdev, ABS_HAT0X, (data == 0) ? 0 : 1);
sc->dpad_right = (data != 0);
evdev_push_abs(evdev, ABS_HAT0X, sc->dpad_right - sc->dpad_left);
break;
case HUG_D_PAD_LEFT:
if (sc->dpad_right)
return (ENOMSG);
evdev_push_abs(evdev, ABS_HAT0X, (data == 0) ? 0 : -1);
sc->dpad_left = (data != 0);
evdev_push_abs(evdev, ABS_HAT0X, sc->dpad_right - sc->dpad_left);
break;
}
break;