我想校准一个没有按钮且只有一个轴 (Z) 的操纵杆(自定义硬件)。我使用 evtest 读取移动范围,即最小/最大值和中心(操纵杆放置的点),该中心大约位于该范围的中间: [min, center, max] = [2028, 3228, 4225] 。
然后我使用 evdev-joystick --e 应用这些最小/最大值和 fuzz = 100 只是为了测试目的(不知道如何应用死区值,这是该值应该返回 0 的点吗?在我的情况下是 3228? evdev-joystick 显示了一些百分比,但我不明白它的意思,忽略该死区值下的所有内容?但这不是我所期望的......死区应该由中心周围的两个值组成,对吗?中心周围的一定百分比)。
当我再次运行 evtest 时,摘要显示我使用 evdev-joystick 设置的新值,但只有模糊值似乎有任何效果。如果我在移动范围内设置最小/最大值,我可以获得该新范围之外的事件。我尝试了不同的死区值(0、3228,几乎是最大值...),但没有任何效果。我期望进行一些范围或中心校正,但看起来 evtest 忽略了校准(除了模糊之外,我没有在模糊范围内获得连续值),即使它在开始时显示它。
evtest 是否应该忽略最小/最大/死区校准并提供原始值?我应该使用不同的工具测试校准吗?顺便说一句,我只能使用命令行工具。
我还尝试过使用 jstest 和 jscal 来使用旧的操纵杆 API,实际上它看起来比新的操纵杆 API 好得多,因为 jscal 提供了交互式校准,其中最小/最大/中心/模糊值会自动保存,并且可以使用以下命令来测试校准jstest ,原始范围被更正为 [-32767, 0, 32767]。不幸的是,我只被允许使用 evdev API,因为我担心旧的 Joystick API 在不久的将来会被完全删除。
编辑:我深入研究了工具的代码,它们利用了位于 input.h uapi 中的 input_absinfo 结构,其中有以下注释:
* Note that input core does not clamp reported values to the
* [minimum, maximum] limits, such task is left to userspace.
因此 evtest 工具没有进行夹紧,因此没有范围校正。但该文件中的平面定义仍然不明确:
* @flat: values that are within this value will be discarded by
* joydev interface and reported as 0 instead.
这个值以内的值??乔伊德夫界面?这不是旧 API 的一部分吗?
编辑2:旧的 jstest 工具似乎显示校正值,因为它依赖于 Joydev 设备驱动程序,该驱动程序计算校正系数并进行钳位。 Evtest 不使用 Joydev,因此不使用“原始”值。那么校准之后该怎么走呢?我看到有些游戏使用了 SDL2 库。在使用 evdev-joystick 进行校准后,我能否通过该库获得 Joydev 提供的功能(死区、夹紧)?我还看到 SDL 有一些测试工具,但它们似乎都不是在我的嵌入式系统上使用的命令行工具,所以到目前为止我无法进一步了解。
答案1
记录一下:最后,我使用 libevdev(对于像我这样的简单应用程序来说比 SDL2 轻得多)和 systemd 服务编写了自己的交互式校准工具,该服务使校正非常像 Joydev 对旧 API 所做的那样。