C语言 使用evdev从Linux上的两个独立游戏手柄获取重复的输入事件

rhfm7lfc  于 2024-01-06  发布在  Linux
关注(0)|答案(1)|浏览(126)

我正在为我的引擎编写一个输入系统,我目前正在尝试启动和运行控制器输入。我有一个第三方X-Box控制器和PS4控制器进行测试。我成功地从他们两个获得输入,所以我然后测试了系统,同时连接两个控制器。这是当我注意到一些奇怪的行为。
如果我先从X-Box控制器读取事件,然后再从PS4控制器读取事件,当我按下X-Box控制器上的按钮时,它会导致两个打印到控制台。PS4控制器的情况并非如此。
我颠倒了读取顺序,首先从PS4控制器读取。运行了相同的测试,这一次我在PS4控制器上按下按钮时得到了两个打印,但在X-Box控制器上没有。
经过进一步的调试,我准备相信我的控制器是相互镜像的?
我试着搜索有过类似经历的人,但没有成功。我也不太确定要搜索什么。从文档中看,我没有看到任何明显提到这样的情况,也没有发现区分控制器来解决问题的方法。
下面是我的代码。我使用open()打开“/dev/input/by-id”中的两个文件,并将它们存储在state. Gamepads中。我读取每个帧并相应地处理事件。

struct input_event e;
for (i32 i = 0; i < 2; ++i)
{
    if(state.Gamepads[i] <= 0) { continue; }
    read(state.Gamepads[i], &e, sizeof(e));

    if (e.type == EV_KEY && e.value == 1)
    {
        switch (e.code)
        {
            case BTN_WEST:
            LOG_INFO("BUTTON WEST PRESSED");
            break;
         }
     }

}

字符串
我希望从每个游戏手柄获得单独和唯一的输入,但我得到的是镜像输入。
我是一个在Linux上进行开发的新手,因为我不知道在哪里可以找到关于这些API的文档和信息,所以找起来很混乱。其他人遇到过这个问题吗?这是一个bug还是我做得完全错误?

ego6inou

ego6inou1#

我能够解决我的问题多亏了@dimich
他提供的到libevdev文档的链接非常有帮助,为API中的每个函数提供了清晰的示例和描述。
我从使用raw read()切换到libevdev_next_event(),这正确地捕获了来自两个游戏手柄的单个输入。
文档中还提供了完整的example,概述了每个步骤。

相关问题