我正在用 C 语言开发一个程序,它使用USB SNES 控制器在基于 RPM 的发行版上进行输入。是否有任何人都知道的库可以使交互更容易,或者是否有一些工具(joydev?)可以正确读取设备的输入?我不需要整个游戏引擎;它仅用于字符设备的输入。
如果有一个图书馆已经为我做了这件事,那就太好了(我可以自己看看图书馆做了什么),这可以通过一个链接关闭;否则,如果我必须自己这样做,我有几个具体问题:
问题:
- 是否有现有的 C 库可以为我处理我的所有 USB 设备与游戏手柄的交互?我很乐意学习一个新的图书馆。(我的 google-fu 在这里让我失望了,如果这过于明显,我深表歉意)
- 当事件*名称在会话/初始化之间发生变化时,确保您每次都打开正确的字符设备的适当方法是什么?
- 从我的应用程序处理来自这些设备的输入的适当方法是什么?当我们轮询字符设备时,只需确定每个按钮按下的价值并根据该输入执行操作吗?
简而言之,pseduo-C,是这样的吗?
struct gamepad {
int fd;
};
void get_input(struct gamepad *gamepad)
{
char *buf;
read(gamepad->fd, buf, 48);
switch(buf)
{
/* insert cases about handling differing buttons */
}
}
设备如何呈现自身:
据我所知,我可以清楚地看到设备注册正确:
$ dmesg | tail
[198564.517068] usb 1-1: USB disconnect, device number 17
[198566.154324] usb 1-1: new low-speed USB device number 18 using xhci_hcd
[198566.323309] usb 1-1: New USB device found, idVendor=12bd, idProduct=d015
[198566.323312] usb 1-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[198566.323313] usb 1-1: Product: 2Axes 11Keys Game Pad
[198566.323792] usb 1-1: ep 0x81 - rounding interval to 64 microframes, ep desc says 80 microframes
[198566.328692] input: 2Axes 11Keys Game Pad as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/input/input20
[198566.329036] hid-generic 0003:12BD:D015.0006: input,hidraw2: USB HID v1.10 Gamepad [2Axes 11Keys Game Pad] on usb-0000:00:14.0-1/input0
如果我从设备读取,我可以看到它接收到来自设备的中断和输入,只是使用 hexdump:
$ ls -lattr /dev/input/by-id/usb-12bd_2Axes_11Keys_Game_Pad-event-joystick
lrwxrwxrwx. 1 root root 10 Jan 20 15:56 /dev/input/by-id/usb-12bd_2Axes_11Keys_Game_Pad-event-joystick -> ../event17
当我按下一个键(不释放)时,它似乎按预期工作,尽管我无法在没有上下文的情况下破译从缓冲区返回的内容:
$ hexdump /dev/input/event17
0000000 f53a 569f 0000 0000 ac6c 000c 0000 0000
0000010 0003 0000 007f 0000 f53a 569f 0000 0000
0000020 ac6c 000c 0000 0000 0000 0000 0000 0000
释放按钮时,您会收到类似的输出:
0000030 f53c 569f 0000 0000 8be3 0007 0000 0000
0000040 0003 0001 007f 0000 f53c 569f 0000 0000
0000050 8be3 0007 0000 0000 0000 0000 0000 0000
那就是上面按下并释放的“向上”按钮。
这项研究:
为了确定其他库是如何做到这一点的,我考虑过pygame
在 python 中做一个 strace 并查看它打开了哪些设备以及它如何读取输入,但我仍在学习如何使用它。我还看到一些关于joydev 的模糊提及,但是,同样,还没有学会如何使用它们。我目前正在这样做,如果我学到任何有价值的东西,我会发布结果。
除此之外,通过 ASCII 和 hexdump 观看按钮按下,我注意到它们具有基于按钮的类似输入,但似乎我认为是上面输出结束时 USB 总线的中断计数(0xf53a 到0xf53c)。这似乎总是在增加,并且,出于我的目的,可能会被丢弃。
还有一种可能是我没有正确安装设备,因为我缺少一些模块或包(再次思考joydev及其应该做什么)。我根本不经常使用 USB,所以这种类型的设备处理对我来说是新的。
搜索了一段时间,我没有看到任何能准确显示我正在寻找的东西,但我很乐意接受重定向到其他问题/主题以供阅读。
先感谢您!