Armadilloフォーラム

タッチパネルのタッチ位置の座標について

k-suzuki

2018年3月19日 14時37分

お世話になります。

Armadillo840(カーネル:Linux armadillo840-0 3.4-at23)
タッチパネル LP104X0115-FNR(ドライバ:eGTouch_v2.5.5814.L-ma)、RS232C接続

上記の組み合わせで、Qtのアプリケーションを作成しています。
Qtでタッチのイベントは拾えているのですが、その座標が変です。具体的には、下記のような現象です。

前提条件
・「https://users.atmark-techno.com/blog/750/737」を参考に、tslibをインストール・キャリブレーション
・QTアプリケーションの画面解像度は、1024x768

Qtアプリの起動直後、マウスカーソルが「X=0,Y=0」の位置に表示されています。この時に、タッチパネル上の「X=1024,Y=0」あたりをタッチした場合、Qtアプリでは「X=0,Y=0」として認識します。「X=1024,Y=768」「X=0,Y=768」あたりをタッチした場合も同様に、「X=0,Y=0」として認識します。

この時、マウスカーソルがある辺り・・・つまり「X=0,Y=0」あたりをタッチした以降は、普通のタッチパネルの動作となります。つまり、Qtが(?)、eGTouchからの入力を、マウスカーソルの現在座標に相対的に置き換えて入力値としているようなのです。これは、キャリブレーション有無による座標のずれとは別の現象かと思われます。

このような現象を回避できる方法はありますでしょうか?

以降、調査で行った事を記します。

・「evtest /dev/input/event0」でタッチ位置の座標を確認した所、そこでは正しい座標が取れている(上記で言うと、マウスカーソルが「X=0,Y=0」の時に「X=1024,Y=0」をタッチすると、evtestでは「X=1024,Y=0」となっている)
・タッチパネルのドライバに、タッチ位置をターミナルに出力するモードがあるので、それで座標を確認した所(「eGTouchD -D -f -p2」というコマンド)、正しい座標が取れている
・「/etc/config/rc.local」にて「export QWS_MOUSE_PROTO=...」を用いたタッチパネルのイベントをマウスのイベントとして変換する設定を行っても、上記現象は変わらず
・tslibを用いない設定でも、上記現象は変わらず(eGTouchは、それ用のドライバのみでタッチパネルが使用できるようです)
・「/etc/config/rc.local」にて「export QT_QPA_EGLFS_HIDECURSOR=1」として、マウスカーソルを表示しない設定にしても、上記現象は変わらず(マウスカーソルを消去する事で、上記の座標が変わる事に期待したが、駄目だった)

今後の調査のきっかけとなるような情報がありましたら、教えて頂ければ幸いです。

以上、お手数をおかけしますが、宜しくお願い致します。

コメント

at_ohsawa

2018年3月19日 16時18分

> ・「evtest /dev/input/event0」でタッチ位置の座標を確認した所、そこでは正しい座標が取れている(上記で言うと、マウスカーソルが「X=0,Y=0」の時に「X=1024,Y=0」をタッチすると、evtestでは「X=1024,Y=0」となっている)

この状況でのevtestの出力結果を見せてもらえますか。

報告頂いた内容だけだとはっきりした事は分らないのですが、
もしかしたら、ご利用のタッチパネルのデバイスドライバはマルチタッチ仕様
(IDが2つ以上あるタイプ)のイベントを出力していませんか?この場合tslibは
対応できないので、タッチパネルのデバイスドライバ側でシングルタッチイベント
を出すようにして欲しいのですが、もし不可能であればmtdevを使うことになります。

補足です。
>・tslibを用いない設定でも、上記現象は変わらず(eGTouchは、それ用のドライバのみでタッチパネルが使用できるようです)

tslibはデバイスドライバではなく、ユーザー空間で動くライブラリなので、
/dev/input/eventX自体には影響を与えません。
/dev/input/eventXを提供するのがデバイスドライバの仕事で、これをそのまま
アプリケーションが読んでも良いのですが、tslibの関数を経由すると
キャリブレーション値を加減乗除した値が取得できる等の機能を提供します。

k-suzuki

2018年3月19日 16時55分

at_ohsawa様

お世話になります

>この状況でのevtestの出力結果を見せてもらえますか。
下記に、ログを示します。

[root@armadillo840-0 (ttySC2) ~]# evtest /dev/input/event0
Input driver version is 1.0.1
Input device ID: bus 0x6 vendor 0xeef product 0x10 version 0x1
Input device name: "eGalaxTouch Virtual Device for Single"
Supported events:
Event type 0 (Sync)
Event type 1 (Key)
Event code 272 (LeftBtn)
Event code 273 (RightBtn)
Event code 276 (ExtraBtn)
Event type 3 (Absolute)
Event code 0 (X)
Value 0
Min 0
Max 2047
Event code 1 (Y)
Value 0
Min 0
Max 2047
Event code 3 (Rx)
Value 0
Min 0
Max 2047
Event code 4 (Ry)
Value 0
Min 0
Max 2047
Testing ... (interrupt to exit)
Event: time 1426922480.414972, type 3 (Absolute), code 0 (X), value 1002
Event: time 1426922480.414987, type 3 (Absolute), code 1 (Y), value 9
Event: time 1426922480.414996, type 1 (Key), code 272 (LeftBtn), value 1
Event: time 1426922480.415003, -------------- Report Sync ------------
Event: time 1426922480.569112, type 3 (Absolute), code 0 (X), value 1000
Event: time 1426922480.569126, type 3 (Absolute), code 1 (Y), value 10
Event: time 1426922480.569136, type 1 (Key), code 272 (LeftBtn), value 0
Event: time 1426922480.569142, -------------- Report Sync ------------

「X=1024,Y=0」付近をタッチした結果です。value値を見る限り、evtestでは
「X=1024,Y=0」をタッチした結果となっています(ただし、Qtアプリでは、先述
の通り「X=0,Y=0」となっています)

>もしかしたら、ご利用のタッチパネルのデバイスドライバはマルチタッチ仕様
>(IDが2つ以上あるタイプ)のイベントを出力していませんか?
先述の調査内容に記しましたが「eGTouchD -D -f -p2」というコマンドがあり、そこではeGTouch
(つまりタッチパネルに用意されたドライバ)から見たログを出力できます。そこで
タッチする箇所を2か所にして操作してみた所、以下のようなログとなりました。

[root@armadillo840-0 (ttySC2) ~]# /usr/bin/eGTouchD -D -f -p2
[16:36:14:606]-: Daemon Version: [2.5.5814]
[16:36:14:607]-: DebugMode[FFFFF], ShowDebugPosition[2]
[16:36:14:607]-: MaxDeviceNums[1], ScanInterface[0], DeviceBaudRate[0]
[16:36:14:607]-: UseDriverCalib[0]
[16:36:14:607]-: SkipFirstByte[0]
[16:36:14:607]-: ShiftByteBothEnd[1]
[16:36:14:607]-: CustomSerialPath[0] = /dev/ttySC1
[16:36:14:607]-: UinputPath = /dev/input/uinput

(長いので省略)

[16:37:29:425]-: Send Single Event: ID[0], State[1], X[800], Y[29]
[16:37:29:448]-: Send Single Event: ID[0], State[1], X[790], Y[26]
[16:37:29:464]-: Send Single Event: ID[0], State[1], X[780], Y[24]
[16:37:29:886]-: Send Single Event: ID[0], State[1], X[790], Y[21]
[16:37:30:891]-: Send Single Event: ID[0], State[1], X[781], Y[31]
[16:37:30:917]-: Send Single Event: ID[0], State[1], X[779], Y[41]
[16:37:30:943]-: Send Single Event: ID[0], State[1], X[775], Y[51]
[16:37:30:969]-: Send Single Event: ID[0], State[1], X[768], Y[61]
[16:37:30:995]-: Send Single Event: ID[0], State[1], X[756], Y[69]
[16:37:31:021]-: Send Single Event: ID[0], State[1], X[745], Y[77]
[16:37:31:047]-: Send Single Event: ID[0], State[1], X[735], Y[86]
[16:37:31:079]-: Send Single Event: ID[0], State[1], X[728], Y[96]
[16:37:31:110]-: Send Single Event: ID[0], State[1], X[726], Y[106]
[16:37:31:146]-: Send Single Event: ID[0], State[1], X[727], Y[116]
[16:37:32:459]-: Send Single Event: ID[0], State[1], X[738], Y[116]
[16:37:32:480]-: Send Single Event: ID[0], State[0], X[741], Y[116]
[16:37:32:493]-: Send Single Event: ID[0], State[1], X[976], Y[168]
[16:37:33:062]-: Send Single Event: ID[0], State[0], X[982], Y[168]

これはタッチパネル上部を2か所同時にタッチして、それぞれドラッグした後
順番にタッチ箇所を離した物です。「Send Single Event」という文言、そして
2か所タッチしていても「ID[0]」という文言である事から、シングルタッチ用の
ドライバ及びイベントを出力している思われます(evtestのログに
「eGalaxTouch Virtual Device for Single」ともあります)

原因を解明するのに難しい内容だと思いますが、宜しくお願い致します。

at_ohsawa

2018年3月20日 14時29分

Rx Ryのイベント構造体のメンバが見えているのが気になるのですが、
確証がありません。
確認したいのですが、最初に報告されている挙動は標準イメージで起動する
photoviwerでの挙動でしょうか。

k-suzuki

2018年3月20日 15時00分

at_ohsawa様

お世話になります

> 確認したいのですが、最初に報告されている挙動は標準イメージで起動する
> photoviwerでの挙動でしょうか。
自作のアプリケーションでの挙動です。rc.localに、以下のような形で記述しています

#!/bin/sh

. /etc/init.d/functions

PATH=/bin:/sbin:/usr/bin:/usr/sbin

# First read /etc/profile
test -f /etc/profile && . /etc/profile
/usr/bin/eGTouchD &
sleep 10;
#
# Starting a default application
#
#START_PHOTOVIEWER_WITH_QMLSCENE=y
#if [ "${START_PHOTOVIEWER_WITH_QMLSCENE}" = "y" ]; then
# echo -n "Starting photoviewer: "
# qmlscene /usr/share/qt5/photoviewer/photoviewer.qml >/dev/null 2>&1 &
# check_status
#fi
export QT_QPA_EGLFS_HEIGHT=768
export QT_QPA_EGLFS_WIDTH=1024
/usr/local/bin/(アプリケーション名)

(以下省略)

タッチパネルのドライバ「/usr/bin/eGTouchD」を記述し、既存のphotoviewerをコメントにして、
その代わりに自作のアプリケーションを起動しています。
そのアプリケーションは、atde5-i386-20161130、QT Creator 2.7.0(Qt4.8.4を使用)で作成しました

以上、宜しくお願い致します。

at_ohsawa

2018年3月20日 15時03分

> タッチパネルのドライバ「/usr/bin/eGTouchD」を記述し、既存のphotoviewerをコメントにして、
> その代わりに自作のアプリケーションを起動しています。

わかりました。photoviewerでも同じ挙動になりますか?
画面に表示される写真のカテゴリのサムネイルをタップすると
写真が展開された画面に遷移すると思いますが、正しく動作するか
確認してみてください。

k-suzuki

2018年3月20日 15時33分

at_ohsawa様

お世話になります

>わかりました。photoviewerでも同じ挙動になりますか?
>画面に表示される写真のカテゴリのサムネイルをタップすると
>写真が展開された画面に遷移すると思いますが、正しく動作するか
>確認してみてください。

上記rc.localで、photoviewerのコメントを外し、自作アプリケーションまわりをコメント
にして、photoviewerを起動するようにした所、自作アプリと同じ挙動(タッチ座標がおかしい状態)となりました
(初報で書いた、マウスカーソルの位置をタッチして、今回の問題を解消した以降は正しい動作となります)

photoviewer・自作アプリで、タッチパネルの動作(タッチ座標がおかしい状態)に違いは無いようです。

以上、宜しくお願い致します。

at_ohsawa

2018年3月20日 15時42分

> photoviewer・自作アプリで、タッチパネルの動作(タッチ座標がおかしい状態)に違いは無いようです。

このとき、-plugin tslib:/dev/input/event0を付けて起動しているでしょうか。

なるべく書き下さずに、そのままのファイルや入力したコマンドを
提示して下さった方が確認が少なくなりますので、よろしくお願いします。

k-suzuki

2018年3月20日 16時05分

at_ohsawa様

>このとき、-plugin tslib:/dev/input/event0を付けて起動しているでしょうか。
付けていません。先述のrc.localの内容及び、記述した編集方法で動作確認しています。

at_ohsawa様が提示されたオプション「-plugin tslib:/dev/input/event0」を付加して
photoviewerを起動しましたが、自作アプリと同じ挙動(タッチ座標がおかしい状態)となりました。

その時のrc.localを、以下に示します。

#!/bin/sh

. /etc/init.d/functions

PATH=/bin:/sbin:/usr/bin:/usr/sbin

# First read /etc/profile
test -f /etc/profile && . /etc/profile
/usr/bin/eGTouchD &
sleep 10;
#
# Starting a default application
#
START_PHOTOVIEWER_WITH_QMLSCENE=y
if [ "${START_PHOTOVIEWER_WITH_QMLSCENE}" = "y" ]; then
echo -n "Starting photoviewer: "
qmlscene /usr/share/qt5/photoviewer/photoviewer.qml -plugin tslib:/dev/input/event0 >/dev/null 2>&1 &
check_status
fi
#export QT_QPA_EGLFS_HEIGHT=768
#export QT_QPA_EGLFS_WIDTH=1024
#/usr/local/bin/(アプリケーション名)

また、提示されたオプションを付加して自作アプリを起動しましたが、タッチ座標がおかしい状態は
変わりませんでした。

その時のrc.localを、以下に示します。

#!/bin/sh

. /etc/init.d/functions

PATH=/bin:/sbin:/usr/bin:/usr/sbin

# First read /etc/profile
test -f /etc/profile && . /etc/profile
/usr/bin/eGTouchD &
sleep 10;
#
# Starting a default application
#
#START_PHOTOVIEWER_WITH_QMLSCENE=y
#if [ "${START_PHOTOVIEWER_WITH_QMLSCENE}" = "y" ]; then
# echo -n "Starting photoviewer: "
# qmlscene /usr/share/qt5/photoviewer/photoviewer.qml -plugin tslib:/dev/input/event0 >/dev/null 2>&1 &
# check_status
#fi
export QT_QPA_EGLFS_HEIGHT=768
export QT_QPA_EGLFS_WIDTH=1024
/usr/local/bin/(アプリケーション名) -plugin tslib:/dev/input/event0

以上、宜しくお願い致します。

at_ohsawa

2018年3月22日 14時09分

> export TSLIB_TSDEVICE=/dev/input/event0
> export TSLIB_PLUGINDIR=/usr/lib/ts0
> export TSLIB_CALIBFILE=/etc/config/pointercal
rc.localの中でもこれらの環境変数をエクスポートしていますか?

k-suzuki

2018年3月22日 14時19分

at_ohsawa様

お世話になっております。

> rc.localの中でもこれらの環境変数をエクスポートしていますか?
していません。質問させて頂いた以降は、ここで提示しているrc.localを用いています。

※質問前はrc.localに上記の環境をエクスポートして動作確認も行っていましたが、タッチ座標がおかしい状態は同じでした。

以上、宜しくお願い致します。

k-suzuki

2018年3月30日 20時16分

at_ohsawa様

お世話になっております。

最後の返信から一週間以上経過しましたが、状況を教えて下さい。

以上、宜しくお願い致します。