研究uinput/上的所有内容suinput,我不明白如何在操纵杆上创建多个按钮。例如python-uinput(伪代码——真正的代码将在 C 中):
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()
好的,但我需要创建一些按钮/轴。以及如何去做?
(我从 English Stack 复制了我自己的答案)
如果需要额外的按钮,则需要额外的按钮代码。按钮代码最初由
linux/input.h用户空间和uapi/linux/input-event-codes.h内核端的文件定义。对于 python 库,代码在ev.py. 如您所见,有很多代码,在这种情况下,BTN_JOYSTICK和之间的所有内容都很有趣BTN_THUMBR(但有时也使用集合中的值BTN_TRIGGER_HAPPY)。最受欢迎的是BTN_THUMB,,,和。BTN_PINKIEBTN_[ABC]BTN_SELECTBTN_START对于附加轴,情况相同,您可以使用
ABS_X和之间列表中的任何内容ABS_MISC。最流行的附加 -ABS_R[XYZ]和ABS_HAT0[XYZ].这些标识符的使用方式与
BTN_JOYSTICKwithABS_X和相同ABS_Y,从而获得额外的按钮/轴。在这方面还有什么有趣的是我们试图模拟的实际操纵杆使用了哪些代码。这些代码可以使用 evtest或evemu 程序获得(为此,当然,您需要真正的操纵杆)。此处讨论了一些广泛使用的游戏杆(Xbox 和 PS3)(如您所见,游戏杆使用的代码因型号而异)。好吧,为了确定(或模拟一个物理上不可访问的操纵杆),您可以查看操纵杆的内核驱动程序(尤其是它们使用 和 中的值
BTN_)ABS_。