xinput_calibrator:校准数据是如何生成的?

xinput_calibrator:校准数据是如何生成的?

我一直在玩这个使用 eGalax 驱动程序的触摸屏。
它所连接的主板的操作系统是 Ubuntu LTS 16.04.01

由于某种原因,我无法完全正确校准它,但这并不是这个问题的重点。

当我运行 xinput_calibrator 让系统尝试通过击中所有小点来神奇地为我校准它时,它实际上只是生成 4 个以逗号分隔的数据点,这些数据点最终会插入到该设备的 xinput 属性中(即“Evdev Axis Calibration”)。

我想了解这 4 个数字是如何计算出来的。

我在网上找不到合适的资源来准确解释这个程序是如何得出这些数字的,但这些信息可能对现在和将来的故障排除有用。

作为参考,这是我的一次校准会话:

root@MyDevice:~# xinput_calibrator -v
DEBUG: XInputExtension version is 2.3
DEBUG: Skipping virtual master devices and devices without axis valuators.
DEBUG: Skipping device 'Virtual core XTEST pointer' id=4, does not report Absolute events.
Warning: multiple calibratable devices found, calibrating last one (eGalax Inc. USB TouchController)
        use --device to select another one.
DEBUG: Selected device: eGalax Inc. USB TouchController
DEBUG: Not usbtouchscreen calibrator: Not a usbtouchscreen device
DEBUG: Read axes swap value of 0.
DEBUG: Read InvertX=0, InvertY=0.
Calibrating EVDEV driver for "eGalax Inc. USB TouchController" id=12
        current calibration values (from XInput): min_x=2226, max_x=294 and min_y=402, max_y=2138
DEBUG: Found that 'eGalax Inc. USB TouchController' is a sysfs name.
DEBUG: Adding click 0 (X=0, Y=63)
DEBUG: Adding click 1 (X=696, Y=61)
DEBUG: Adding click 2 (X=0, Y=479)
DEBUG: Adding click 3 (X=685, Y=479)

Doing dynamic recalibration:
        Setting calibration data: 2504, 281, 375, 2386
DEBUG: Successfully applied axis calibration.
        --> Making the calibration permanent <--
DEBUG: Found that 'eGalax Inc. USB TouchController' is a sysfs name.
  copy the snippet below into '/etc/X11/xorg.conf.d/99-calibration.conf' (/usr/share/X11/xorg.conf.d/ in some distro's)
Section "InputClass"
        Identifier      "calibration"
        MatchProduct    "eGalax Inc. USB TouchController"
        Option  "Calibration"   "2504 281 375 2386"
        Option  "SwapAxes"      "0"
EndSection

所以你可以看到,校准器将我之前的校准数据读取为“min_x=2226、max_x=294 和 min_y=402、max_y=2138”,然后根据刚刚发生的校准会话生成数据点“2504、281、375、2386”。

数据点“2504、281、375、2386”是如何计算出来的?

答案1

这些数据是从 读取的evdev。而且,由于这是一个开源项目,我们甚至可以看到代码

事实上,输出该数据的行是就在这儿

printf("\tSetting calibration data: %d, %d, %d, %d\n", new_axys.x.min, new_axys.x.max, new_axys.y.min, new_axys.y.max);

现在,this() 的父函数set_calibration被调用于finish_data. 这又被称为finish

简而言之,它根据屏幕尺寸和捕获的点进行一些复杂的缩放,然后返回有效 X/Y 范围的参数值,这是屏幕新定义的“角落”。

基本上,它会取您所有校准点击的平均值,确定缩放比例,将其解析为更多缩放比例以便 X 可以理解,然后将其四舍五入为“漂亮”的值。如果需要,它会选择性地反转/交换触摸屏校准数据以适应触摸屏的设置。

相关内容