首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >evdev:找到游戏垫轴的"rest“值

evdev:找到游戏垫轴的"rest“值
EN

Stack Overflow用户
提问于 2019-12-23 11:30:22
回答 1查看 986关注 0票数 0

如何找到游戏控制器的任意轴的静止值?例如,在我的Dual休克4上,下面是来自evtest的相关数据

代码语言:javascript
复制
Event code 0 (ABS_X)
  Value    126
  Min        0
  Max      255
  Flat      15
Event code 1 (ABS_Y)
  Value    127
  Min        0
  Max      255
  Flat      15
Event code 2 (ABS_Z)
  Value    255
  Min        0
  Max      255
  Flat      15
Event code 3 (ABS_RX)
  Value    127
  Min        0
  Max      255
  Flat      15
Event code 4 (ABS_RY)
  Value    123
  Min        0
  Max      255
  Flat      15
Event code 5 (ABS_RZ)
  Value      0
  Min        0
  Max      255
  Flat      15

在上面的示例中,在运行evtest时,我一直在扣动正确的触发器;因此,ABS_Zvalue为255而不是0。因此,既然我们不能使用value来实现这个目的,那么他们有什么方法来找出安息值是什么呢?

编辑:--我正在使用libevdev API访问游戏垫。上面打印的信息可以从input_absinfo结构中访问。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-26 20:05:08

这不能仅仅使用evdev提供的信息来实现。

大多数游戏垫使用前6个轴报告轴输入(拇指棒和触发器):

代码语言:javascript
复制
ABS_X
ABS_Y
ABS_Z
ABS_RX
ABS_RY
ABS_RZ

左大拇指通常使用ABS_X和ABS_Y,右大拇指有时使用ABS_Z和ABS_RZ,但也可能使用ABS_RX和ABS_RY,这是DS4的情况。对于拇指轴,中性值介于Min和Max之间。

触发器通常使用剩余的任何内容。例如,如果右边的大拇指是ABS_Z/ABS_RZ,那么触发器通常是ABS_RX/ABS_RY。有些游戏用ABS_制动器/ABS_GAS代替。对于触发器轴,中性值为Min。

一些设备正确地报告了拇指轴的负值。例如,对于通过USB连接的Xbox One控制器,evtest得到了什么:

代码语言:javascript
复制
Event code 0 (ABS_X)
  Value      0
  Min   -32768
  Max    32767
  Fuzz      16
  Flat     128
Event code 1 (ABS_Y)
  Value      0
  Min   -32768
  Max    32767
  Fuzz      16
  Flat     128
Event code 2 (ABS_Z)
  Value      0
  Min        0
  Max     1023
Event code 3 (ABS_RX)
  Value      0
  Min   -32768
  Max    32767
  Fuzz      16
  Flat     128
Event code 4 (ABS_RY)
  Value      0
  Min   -32768
  Max    32767
  Fuzz      16
  Flat     128
Event code 5 (ABS_RZ)
  Value      0
  Min        0
  Max     1023

在这种情况下,驱动程序(xpad)识别设备并知道每个轴的逻辑范围,而不依赖于设备报告的信息。DS4的问题是它是一个符合HID的游戏垫。HID协议允许设备定义其逻辑范围,DS4报告0作为每个轴的最小值。DS4驱动程序(Hid)报告这些轴的边界为-is。

下面是DS4的HID报表描述符中定义大拇指轴的部分:

代码语言:javascript
复制
0x09, 0x30,        //   Usage (X)
0x09, 0x31,        //   Usage (Y)
0x09, 0x32,        //   Usage (Z)
0x09, 0x35,        //   Usage (Rz)
0x15, 0x00,        //   Logical Minimum (0)
0x26, 0xFF, 0x00,  //   Logical Maximum (255)
0x75, 0x08,        //   Report Size (8)
0x95, 0x04,        //   Report Count (4)
0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)

其中带有“使用”的行定义了每个轴输入所使用的轴。X,Y,Z和Rz在evdev中被翻译成ABS_X,ABS_Y,ABS_Z,ABS_RZ。轴范围由适用于所有四个轴的“逻辑最小”和“逻辑最大值”定义。我们还可以从“报表大小”中看到,每个轴都是一个8位值。

下面是定义触发器的部分,注意逻辑范围的定义与大拇指轴的定义完全相同:

代码语言:javascript
复制
0x09, 0x33,        //   Usage (Rx)
0x09, 0x34,        //   Usage (Ry)
0x15, 0x00,        //   Logical Minimum (0)
0x26, 0xFF, 0x00,  //   Logical Maximum (255)
0x75, 0x08,        //   Report Size (8)
0x95, 0x02,        //   Report Count (2)
0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)

由于这类歧义,您不能仅仅依靠启发式来区分触发器和大拇指轴。要在一般情况下做到这一点,您将需要一个已知游戏垫的注册表,该注册表可以告诉您哪些输入被映射到哪个轴。SDL2在这方面做得很好,它有一个大型的游戏垫注册中心,包括许多控制台游戏垫,比如DS4。

https://github.com/spurious/SDL-mirror/blob/master/src/joystick/controller_type.h#L72

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59454590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档