Qt/Embeddedでタッチパネル

Qt/Embedded(バージョン4.7.4)でタッチパネルを使うにあたっての諸々をメモ。


デフォルトではマウスイベントは、/dev/input/mice を使ってるのかな。これは複数のマウス機器の入力をまとめたもの。(miceはmouseの複数形ぞな!) 僕の環境では /dev/input/mouse0 にタッチパネルからの入力が来ていて、これと同じデータが /dev/input/mice でも取れる。


ところが、この /dev/input/mouse0 に上がって来るデータは PS/2プロトコルで、つまり相対座標形式なのだ。なんでタッチパネルからの入力が相対座標なのか? どうも、タッチパネルの実際のイベントデバイスファイルは /dev/input/event1 で、/dev/input/mouse0 は、これを使ってPS/2マウスをエミュレートしているものらしい。
(参考URL) http://www.tatapa.org/~takuo/input_subsystem/input_subsystem.html


しかし、タッチパッドならともかく、液晶タッチパネルのイベントをPS/2マウスイベントに変換されても、タッチ点とポインタの位置が一致しなくなるので、使い物にならない。そこで、下記のページを参考に、tslib を使うことを考えた。
(参考URL) http://doc.qt.nokia.com/4.7-snapshot/qt-embedded-pointer.html


Qtのビルド時の configure のオプションに -qt-mouse-tslib を追加し、


./configure 諸々のオプション -qt-mouse-tslib
実行時に環境変数 QWS_MOUSE_PROTO を設定する。

export QWS_MOUSE_PROTO=tslib:/dev/input/event1
まあ、クロスビルド時には例によってライブラリのパス云々のトラブルがあったりするけど、そこはゴニョゴニョっと解決すべし。


さて、これでうまくいくかと思いきや、僕の環境ではうまく動かない(涙)。おそらくタッチパネルのデバイスドライバの問題と思うが、tslib が中途半端にしか機能しないのだ。いちおう、ts_test ではなにがしかのイベントメッセージがダンプされるのだが、ts_calibrate でキャリブができない。


なので、とりあえず tslib を使うことは一旦あきらめて、LinuxInputでいくことにした。
Qtのビルド時の configure のオプションに -qt-mouse-linuxinput を追加し、

./configure 諸々のオプション -qt-mouse-linuxinput
実行時に環境変数 QWS_MOUSE_PROTO を設定する。

export QWS_MOUSE_PROTO=LinuxInput:/dev/input/event1
これで、タッチがQtアプリで取れたー! ヽ(。>▽<。)ノ


キャリブが出来ない (単純に x'=k1*x, y'=k2*y) のが難点だけど、僕のボードのタッチパネルは精度が結構良くて、キャリブ無しでもじゅうぶん使い物になった。ちなみに tslib だと (x',y')=一次変換(x,y) なので、極端な話、誤配線で極性逆とかx/y逆とかになってたとしてもキャリブで補正できるのだけど。(キャリブで逆行列を計算しているっぽい。)