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

标签 c linux uinput

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

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 作为按钮。以及如何创建第二个按钮/附加两个 ABS_X/ABS_Y

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

最佳答案

更多按钮——更多按钮代码。从用户空间的角度来看,最初按钮代码是在 linux/input.h header 中定义的,或者 uapi/linux/input-event-codes.h从内核的角度。对于 python,它们在 ev.py 中重复.如您所见,它们有很多,您最感兴趣的是 BTN_JOYSTICKBTN_THUMBR 之间的东西(但是 BTN_TRIGGER_HAPPY 值也是一些人使用)。最有趣的是 BTN_THUMBBTN_PINKIEBTN_[ABC]BTN_SELECTBTN_START.

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

因此,要使用这些额外的按钮/轴,您只需使用这些标识符,就像将 BTN_JOYSTICKABS_XABS_Y 一起使用一样。

现在,另一个有趣的问题可能是您尝试模拟的真实操纵杆使用了此列表中的哪些值。此值可以通过使用 evtest 获得或 evemu程序(当然使用真正的操纵杆)。一些广泛使用的操纵杆(Xbox 和 PS3)也是 discussed here (如您所见,操纵杆产生的按钮代码非常不同)。为了真正确定(或模拟某些您无法使用 evtest 检查的设备),您还可以查看 real joystick drivers (只是 BTN_ABS_ 他们使用的东西)。

关于c - Lib(s)uinput : creating joystick with more than one button,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39559063/

相关文章:

时间:2019-03-17 标签:c++segfault: char pointers

c - 如何将二进制文件读入C中的结构

c - 如何接受超时套接字

linux - 将 epoll 与设备(/dev/event/...)一起使用是否有效?

c - 在基于 linux 的 hmi 屏幕中使用 uinput 的触摸事件模拟不起作用?

c - 如何就地修改项目(无需复制/传递缓冲区)

java - Java能不能像C一样直接打开设备文件节点?

python - 我如何使用 CD 和 LS 等 Linux 终端命令?

php - Linux-Bash 的一些问题

c - 如何获取 uinput 创建的设备的名称(路径)