[Linux] evtestコマンドを使用してタッチパネルから座標データを取得する

タッチパネルは、ユーザーインターフェースの一部として広く使用されており、Linuxシステム上でタッチパネルからの座標データを取得し理解する方法は重要です。この記事では、evtestコマンドを使用して、タッチパネルからの座標データを取得する方法を説明します。


## 1: evtest
evtestは、Linuxシステムで/dev/input/eventXデバイスからの生データをわかりやすく解析できるツールです。/dev/input/eventXデバイスは、さまざまな入力デバイス（キーボード、マウス、タッチパネルなど）からの情報を提供しますが、そのデータは通常バイナリ形式であり、直接読み取ると理解が難しいことがあります。evtestはこの問題を解決し、入力イベントデバイスからの情報をわかりやすく表示し、デバッグやトラブルシューティングに役立ちます。

## 2: evtestのインストール

最初に、evtestコマンドをインストールする方法を説明します。通常、多くのLinuxディストリビューションでは、パッケージマネージャーを使用してevtestをインストールできます。例えば、Debian/Ubuntuでは以下のようにします。

```
$ sudo apt-get install evtest
```

## 3: タッチパネルデバイスの特定

次に、使用するタッチパネルデバイスを特定します。Linuxでは、入力デバイスは /dev/input/eventXで表されます。evtestを使用する前に、どのデバイスを監視するかを特定する必要があります。

evtestコマンドを実行すると、利用可能な入力デバイスが一覧表示されます。タッチパネルデバイスを特定し、それに関連するデバイスファイル（通常は /dev/input/eventX）をメモします。

```
$ sudo evtest 
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:	Power Button
/dev/input/event1:	himax-touchscreen
/dev/input/event2:	AT Translated Set 2 keyboard
/dev/input/event3:	VMware VMware Virtual USB Mouse
/dev/input/event4:	VirtualPS/2 VMware VMMouse
/dev/input/event5:	VirtualPS/2 VMware VMMouse
Select the device event number [0-5]:
```

## 4: evtestを使用してデータを取得

タッチパネルデバイスが特定できたら、そのままイベント番号を入力し、イベントデータをリアルタイムで表示します。
以下の例では /dev/input/event1: himax-touchscreen を使用します。

```
       :
Select the device event number [0-5]: 1
```

以下のコマンドでも代替可能です。

```
$ sudo evtest /dev/input/event1
```


## 5: 座標データの解釈

evtestが実行されると、最初にタッチパネルから取得できるイベントデータの一覧が出力されます。
各イベントの詳細は下記リンクのLinuxカーネルの公式ドキュメンテーションの一部で、マルチタッチ入力デバイスに関連するプロトコルに関するページを参照ください。
[3. Multi-touch (MT) Protocol](https://www.kernel.org/doc/html/latest/input/multi-touch-protocol.html)


```
Input driver version is 1.0.1
Input device ID: bus 0x0 vendor 0x0 product 0x0 version 0x0
Input device name: "himax-touchscreen"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 102 (KEY_HOME)
    Event code 139 (KEY_MENU)
    Event code 158 (KEY_BACK)
    Event code 217 (KEY_SEARCH)
    Event code 330 (BTN_TOUCH)
    Event code 580 (KEY_APPSELECT)
  Event type 3 (EV_ABS)
    Event code 47 (ABS_MT_SLOT)
      Value      0
      Min        0
      Max        1
    Event code 48 (ABS_MT_TOUCH_MAJOR)
      Value      0
      Min        0
      Max      200
    Event code 50 (ABS_MT_WIDTH_MAJOR)
      Value      0
      Min        0
      Max      200
    Event code 53 (ABS_MT_POSITION_X)
      Value      0
      Min        0
      Max     1599
    Event code 54 (ABS_MT_POSITION_Y)
      Value      0
      Min        0
      Max      719
    Event code 57 (ABS_MT_TRACKING_ID)
      Value      0
      Min        0
      Max    65535
    Event code 58 (ABS_MT_PRESSURE)
      Value      0
      Min        0
      Max      200
Properties:
  Property type 1 (INPUT_PROP_DIRECT)
Testing ... (interrupt to exit)
```

座標取得に関連する主なイベントコードは以下の通りです。


##### ABS_MT_TOUCH_MAJOR
タッチポイント（指やポインタ）の主要な軸（通常は横軸または縦軸）の大きさを表します。
例: タッチパネル上で指を使って画面上のオブジェクトをタッチすると、その指の物理的なサイズに基づいて、ABS_MT_TOUCH_MAJOR イベントが生成されます。この情報は、タッチポイントの大きさやタッチの広がりを捉えるのに役立ちます。
##### ABS_MT_WIDTH_MAJOR
タッチポイントの主要な軸（通常は横軸または縦軸）の幅を表します。
例: タッチパネル上で指を使って線を描くと、指の幅に基づいて線の太さが調整されます。このとき、ABS_MT_WIDTH_MAJOR イベントがタッチポイントの幅情報を提供し、描画操作に反映されます。

※今回のタッチパネルの取得データではABS_MT_TOUCH_MAJOR == ABS_MT_WIDTH_MAJORとなっています。 

##### ABS_MT_PRESSURE
各タッチポイント（指やポインタ）が画面に対して加えている圧力を表します。この圧力情報は、タッチポイントがどれだけ画面に強く押し付けられているかを示します。
##### ABS_MT_POSITION_X
各タッチポイント（指やポインタ）のX軸上での位置を表します。この位置情報は、デバイスの物理的な画面上の位置を示します。タッチポイントが画面上を移動すると、対応する ABS_MT_POSITION_X イベントが生成され、新しいX座標が提供されます。
##### ABS_MT_POSITION_Y
各タッチポイント（指やポインタ）のY軸上での位置を表します。この位置情報は、デバイスの物理的な画面上の位置を示します。タッチポイントが画面上を移動すると、対応する ABS_MT_POSITION_Y イベントが生成され、新しいY座標が提供されます。
##### ABS_MT_TRACKING_ID
各タッチポイント（指やポインタ）を一意に識別するための ID を表します。新しいタッチポイントが画面に触れると、それぞれのポイントに一意の ABS_MT_TRACKING_ID が割り当てられます。また、タッチポイントが画面上を移動する場合にも使用されます。各タッチポイントがその一意の ID を保持し、移動中でも識別可能です。
##### ABS_MT_SLOT
タッチパネルが複数の指をサポートする場合、カーネルは ABS_MT_SLOT イベントを介して、どのスロットがアクティブかを示します。
##### BTN_TOUCH
デバイスがタッチを検出した場合に発生します。これは、デバイス上で指やポインタが画面に触れた状態を示します。タッチを検出したときに BTN_TOUCH イベントが生成され、指が画面から離れた場合にイベントが終了します。






## 6: イベントログ
画面をタッチしながら指を移動させて取得したイベントデータは以下の通りです。
Ｘ座標：ABS_MT_POSITION_X
Ｙ座標：ABS_MT_POSITION_Y
```
     :
Properties:
  Property type 1 (INPUT_PROP_DIRECT)
Testing ... (interrupt to exit)
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 12
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 12
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 58 (ABS_MT_PRESSURE), value 12
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 1234
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 423
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 168
Event: time 1645780643.1645780643, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 1645780643.1645780643, -------------- SYN_REPORT ------------
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 24
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 24
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 58 (ABS_MT_PRESSURE), value 24
Event: time 1645780643.1645780643, -------------- SYN_REPORT ------------
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 36
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 36
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 58 (ABS_MT_PRESSURE), value 36
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 47 (ABS_MT_SLOT), value 1
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 7
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 7
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 58 (ABS_MT_PRESSURE), value 7
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 1294
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 335
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 169
Event: time 1645780643.1645780643, -------------- SYN_REPORT ------------
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 47 (ABS_MT_SLOT), value 0
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 46
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 46
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 58 (ABS_MT_PRESSURE), value 46
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 47 (ABS_MT_SLOT), value 1
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 9
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 9
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 58 (ABS_MT_PRESSURE), value 9
Event: time 1645780643.1645780643, -------------- SYN_REPORT ------------
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 47 (ABS_MT_SLOT), value 0
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 52
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 52
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 58 (ABS_MT_PRESSURE), value 52
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 1229
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 424
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 47 (ABS_MT_SLOT), value 1
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 0
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 0
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 58 (ABS_MT_PRESSURE), value 0
Event: time 1645780643.1645780643, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
Event: time 1645780643.1645780643, -------------- SYN_REPORT ------------
                             :
```


タッチパネルの４隅あたりをタッチして取得したイベントデータは以下の通りです。

```
解像度  1600 *　720

(0, 0)       　　　                    (1600, 0)
　　　　  +--------------------------+
　　　　  |                          |
　　　　  |                          |
　　　　  |                          |
(0, 720) +--------------------------+ (1600, 720)

(X, Y)
```


X座標：ABS_MT_POSITION_X
Y座標：ABS_MT_POSITION_Y
###### 画面左上をタッチした時
```
Event: time 1645781311.1645781311, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 4
Event: time 1645781311.1645781311, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 4
Event: time 1645781311.1645781311, type 3 (EV_ABS), code 58 (ABS_MT_PRESSURE), value 4
Event: time 1645781311.1645781311, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 28
Event: time 1645781311.1645781311, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 22
Event: time 1645781311.1645781311, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 174
Event: time 1645781311.1645781311, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 1645781311.1645781311, -------------- SYN_REPORT ------------
```
###### 画面左下をタッチした時
```
Event: time 1645781286.1645781286, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 6
Event: time 1645781286.1645781286, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 6
Event: time 1645781286.1645781286, type 3 (EV_ABS), code 58 (ABS_MT_PRESSURE), value 6
Event: time 1645781286.1645781286, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 38
Event: time 1645781286.1645781286, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 689
Event: time 1645781286.1645781286, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 173
Event: time 1645781286.1645781286, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 1645781286.1645781286, -------------- SYN_REPORT ------------
```
###### 画面右上をタッチした時
```
Event: time 1645781253.1645781253, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 5
Event: time 1645781253.1645781253, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 5
Event: time 1645781253.1645781253, type 3 (EV_ABS), code 58 (ABS_MT_PRESSURE), value 5
Event: time 1645781253.1645781253, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 1577
Event: time 1645781253.1645781253, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 31
Event: time 1645781253.1645781253, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 172
Event: time 1645781253.1645781253, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 1645781253.1645781253, -------------- SYN_REPORT ------------
```

######  画面右下をタッチした時
```
Event: time 1645780813.1645780813, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 4
Event: time 1645780813.1645780813, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 4
Event: time 1645780813.1645780813, type 3 (EV_ABS), code 58 (ABS_MT_PRESSURE), value 4
Event: time 1645780813.1645780813, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 1578
Event: time 1645780813.1645780813, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 695
Event: time 1645780813.1645780813, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 171
Event: time 1645780813.1645780813, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 1645780813.1645780813, -------------- SYN_REPORT ------------
```



## 7: おわりに
座標データをわかりやすく表示させることができました。evtestは、デバイスからの生データを解析し、デバイスの動作を理解するための有効なツールです。特にデバイスドライバや入力イベントのデバッグ、タッチパネルやマルチタッチデバイスの動作確認など、入力デバイスに関する作業に役立ちます。