web-dev-qa-db-ja.com

xinput_calibrator:キャリブレーションデータはどのように生成されますか?

私は、eGalaxドライバーを使用するこのタッチスクリーンで遊んでいます。
接続先のボードのOSはUbuntu LTS 16.04.01です

何らかの理由で、適切に調整することはできませんが、それはこの質問のポイントではありません。

システムに対してxinput_calibratorを実行して、小さなドットをすべて押して魔法のように調整しようとすると、実際には4つのコンマ区切りのデータポイントが生成され、最終的にそのデバイスのxinputプロパティにプラグインされます(つまり、「Evdev Axis Calibration ")。

これらの4つの数値がどのように計算されるかを理解したいと思います。

このプログラムがこれらの数値を算出するために正確に説明する適切なリソースをオンラインで見つけることはできませんが、この情報は現在および将来のトラブルシューティングに役立つ可能性があります。

参考として、ここに私のキャリブレーションセッションの1つを示します。

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
MD-7

このデータは、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);

現在、この(set_calibration)の親関数は finish_data で呼び出されます。これは、順番に finish によって呼び出されます。

つまり、画面サイズとキャプチャされたポイントに基づいて複雑なスケーリングを行い、有効なX/Y範囲のパラメーター値を返します。これは、画面の新しく定義された「コーナー」です。

基本的に、すべてのキャリブレーションクリックの平均を取得し、スケーリングを決定し、Xが認識できるようにそれをより多くのスケーリングに解析してから、「きれいな」値に丸めます。必要に応じて、タッチスクリーンのセットアップに合わせて、オプションでタッチスクリーンのキャリブレーションデータを反転/交換します。

0
Kaz Wolfe