Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Mar 2026 06:44:52 +0000
From:      Aymeric Wibo <obiwac@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Cc:        Majed Alkhaleefah <majedalkhaleefah@gmail.com>
Subject:   git: c586944fa208 - main - hid/hgame: Fix desync in hgame_dpad_cb()
Message-ID:  <69c232e4.426fe.64e62e4b@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by obiwac:

URL: https://cgit.FreeBSD.org/src/commit/?id=c586944fa20899ab0f6b58b550e753d13d889c5b

commit c586944fa20899ab0f6b58b550e753d13d889c5b
Author:     Majed Alkhaleefah <majedalkhaleefah@gmail.com>
AuthorDate: 2026-03-24 06:37:09 +0000
Commit:     Aymeric Wibo <obiwac@FreeBSD.org>
CommitDate: 2026-03-24 06:37:19 +0000

    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
---
 sys/dev/hid/hgame.c | 16 ++++------------
 1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/sys/dev/hid/hgame.c b/sys/dev/hid/hgame.c
index 8dde6b5550c9..693c5afee034 100644
--- a/sys/dev/hid/hgame.c
+++ b/sys/dev/hid/hgame.c
@@ -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;


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69c232e4.426fe.64e62e4b>