有线 Xbox One 控制器在 lsusb 中显示,但有时停止检测 Steam 中的输入

有线 Xbox One 控制器在 lsusb 中显示,但有时停止检测 Steam 中的输入

重新启动后,我的有线控制器可以使用 Steam。控制器上有一个灯,每当它工作时就会亮起。然而,有时,灯会随机关闭,然后输入在我的游戏中停止工作。如果重新插入控制器而不重新启动,也会发生这种情况。此时该设备仍然显示在 lsusb 中。如果我在上面运行 usbreset,灯会重新亮起,然后它会再次开始工作。我有一个帮助程序脚本,可以搜索设备并在需要时重置它,但是,使用 alt+tab 来运行它很不方便。

希望自动化它是某种系统任务。不过,我不知道如何以编程方式判断它何时处于这种状态。我尝试了 lsusb --verbose 但无论是否检测到输入,输出都是相同的。控制器也不会显示在 xinput 中。我不确定还可以在哪里检查,因此寻找一些关于如何判断是否使用脚本从 USB 设备检测到输入的想法。我可以从那里处理剩下的事情。预先感谢您的任何帮助!

答案1

我发现我可以用它jstest来实现我想要的。最终制作了这样的脚本:

#!/bin/bash
function xboxControllerReset() {
    device_id="$(docker run -it --rm --name my-running-script -v /home/<me>/.local/bin:/usr/src/myapp -w /usr/src/myapp python-runner python getLsUsbDeviceIdForXboxController.py)"
    echo "Resetting device with ID: $device_id"
    sudo usbreset "$device_id"
}

function detectControllerReset() {
  jstest --event /dev/input/js0 || sleep 1 && xboxControllerReset && sleep 1 && detectControllerReset
}

detectControllerReset

当我的控制器变为非活动状态时,它会在 jstest 中抛出“未找到设备”错误。我用来||捕获此错误,重置deviceId,然后再次调用此脚本来启动jstest提要。我有大约一秒钟的停机时间。我确信这可以优化为不需要一秒钟的睡眠时间,但我不需要这个来达到我的目的。

相关内容