Lib(s)uinput:创建具有多个按钮的操纵杆

Lib(s)uinput: creating joystick with more than one button

我找不到有关如何使用 uinput/suinput 创建带有多个按钮的操纵杆的信息。 python 使用 python-uinput 的示例:

import uinput

def main():
    events = (
        uinput.BTN_JOYSTICK,
        uinput.ABS_X + (0, 255, 0, 0),
        uinput.ABS_Y + (0, 255, 0, 0),
        )

    with uinput.Device(events) as device:
        for i in range(20):
            # syn=False to emit an "atomic" (5, 5) event.
            device.emit(uinput.ABS_X, 5, syn=False)
            device.emit(uinput.ABS_Y, 5)
        device.emit_click(uinput.BTN_JOYSTICK)

if __name__ == "__main__":
    main()

如您所见,在此示例中使用 BTN_JOYSTICK 作为按钮。以及如何创建第二个 button/addictional 两个 ABS_X/ABS_Y?

注意:我以 python 为例,应用程序语言是 Clibsuinput

更多按钮——更多按钮代码。从用户空间的角度来看,最初按钮代码是在 linux/input.h header 或 uapi/linux/input-event-codes.h from the kernel perspective. For python they are duplicated in the ev.py 中定义的。如您所见,它们有很多,您最感兴趣的是 BTN_JOYSTICKBTN_THUMBR 之间的值(但某些人也使用 BTN_TRIGGER_HAPPY 值)。最有趣的是 BTN_THUMBBTN_PINKIEBTN_[ABC]BTN_SELECTBTN_START

至于附加轴,选择ABS_XABS_MISC之间的任意一个。最有趣的附加值是 ABS_R[XYZ]ABS_HAT0[XYZ].

因此,要使用额外的 buttons/axis,您只需以与 BTN_JOYSTICKABS_XABS_Y.

相同的方式使用这些标识符

现在,另一个有趣的问题可能是您尝试模拟的真实操纵杆使用了此列表中的哪些值。这个值可以通过使用 evtest or evemu programs (using real joystick, of course). Some widely available joysticks (Xbox and PS3) were also discussed here (as you can see, joysticks are very different in what button codes they produce). And to be really sure (or to emulate some device you can't check with evtest) you can also take a look at real joystick drivers 获得(只是 BTN_ABS_ 他们使用的东西)。