ホームページmini2440>その5・DebianとQtのチューンアップ

その5・DebianとQtのチューンアップ

目次
 はじめに

 Qtが動作することは確認できましたが、いろいろ改善したい点もあり、それらのうちでメドの立った(諦めた?)ものをまとめておくことにしました。

 なお、検証マシンはMac mini mid 2010、OSは10.11.2、Qtは4.8.6、Qt Creatorは3.2.1です。
 また、各バージョンは試行時のもので、最新版とは異なる場合があります。


 改善対象点

 改善したい点は、以下の通りです。
 タッチスクリーン

 前回ビルドのQtでも、アプリを起動してタッチすると、カーソルが動きました。
(カーネルオプションで「タッチパネル有効」を指定しているので、デバドラのレベルでは動作している?)
 ただ、その動きはメチャクチャ(90°ずれてる?)で、最適化がなされていない状態です。

 タッチスクリーンの制御用ライブラリとしては、オリジナル(Qtopia)でもtslibを使っていたので、これを使うことにしました。
 tslib自体はAdvanced Sysrootで既にビルド済なので、qmake.confに以下を追加しました。
QMAKE_INCDIR    += <Advanced Sysrootのホーム>/sysroot/include
QMAKE_LIBDIR    += <Advanced Sysrootのホーム>/sysroot/lib
 更に、configureの方も以下のオプションを追加して、ビルドし直しました。
-qt-mouse-tslib

 さて、Qt Creatorからテストアプリを実行させると、libts-0.0.so.0他が見つからないと言われてしまいました。
 これは、プロジェクトファイル(.pro)に以下を追加することで解決しました。
unix:QMAKE_RPATHDIR += <Advanced Sysrootのホーム>/sysroot/lib

 再び実行してみると、タッチスクリーンの挙動は以前と変わりません。
 tslibを有効にするには環境変数の設定が必要、とのことで、この時点ではQt Creatorのプロジェクトで指定する方法がわからなかったので(その後判明)、ターミナルで、
root@mini2440:~# export QWS_MOUSE_PROTO=tslib:/dev/input/event1
してから実行すると、
root@mini2440:~# ./test1 -qws
Could not read calibration: "/etc/pointercal" 
Couldnt open tslib config file: No such file or directory
QWSTslibMouseHandlerPrivate: ts_config() failed with error: 'No such file or directory'
Please check your tslib installation!
 /etc/pointercalは、タッチパネルのキャリブレーション(座標位置補正)ファイルで、ts_calibrateを実行すると作られる、とのこと。
 ts_calibrateは、<Advanced Sysrootのホーム>/sysroot/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-ts_calibrateとして作成済なので、これを実機に持って行って実行したところ、あれがないこれがないで、言われるままにファイルをコピー&環境変数を設定したのですが、キャリブレート用のスクリーンは出るものの、以下のメッセージが。
root@mini2440:~# selected device is not a touchscreen I understand
(以下、座標データが延々と出続ける…)
 まだ何か足りないと思われますが、これ以上は分かりませんでした。

 結局、こちらのルートは諦め、Debianの標準的なインストール方法であるapt-getを使うことにしました。
(厳密には、版数の齟齬が発生する恐れがあるが、それはいつもの「エラーが出たら対処する」で…)
root@mini2440:~# apt-get install tslib libts-bin
 インストール後に実行したところ、キャリブレート用スクリーンが表示されてタッチの取得もできました。
root@mini2440:~# export TSLIB_FBDEVICE=/dev/fb0
root@mini2440:~# export TSLIB_TSDEVICE=/dev/input/event1
root@mini2440:~# ts_calibrate
xres = 320, yres = 240
Took 12 samples...
Top left : X =  292 Y =  803
Took 12 samples...
Top right : X =  293 Y =  210
Took 10 samples...
Bot right : X =  760 Y =  207
Took 6 samples...
Bot left : X =  765 Y =  807
Took 3 samples...
Center : X =  531 Y =  505
346.550720 0.000401 -0.368805
-36.815552 0.297849 -0.001003
Calibration constants: 22711548 26 -24170 -2412744 19519 -65 65536 

 Qt Creatorのプロジェクトに環境変数(QWS_MOUSE_PROTO)を追加後、テストアプリを実行したところ、タッチが正常に動作することが確認できました。
環境変数は、プロジェクト>ビルドと実行>実行>実行時の環境変数、で指定する。(スクリーンショット

 Qtの表示周り

 <縦画面で表示する>
 手元のmini2440は横長のディスプレイを搭載しているのですが、アプリによっては縦長の画面で使った方が効率がいい場合もあるので、調べてみました。
(注:あくまでQtアプリの話です。コンソール(Debianのログイン)画面のことではありません。)

 ググってみると、configureでオプションを追加すればいいことが分かりました。
-qt-gfx-transformed
(Embeddedという性格上、仕方ないのでしょうが、tslibの時といい、オプション一つ追加する度に一時間強かけて再ビルドするというのは、なかなかしんどいです。)

 あとは、環境変数を以下の通り設定すれば、画面が90°回転して表示されるようになります。
QWS_DISPLAY=Transformed:Rot90

 参考サイト(1):Qt for Embedded Linux Display Management | Qt 4.8

 <文字列(例えばウィンドウタイトル)が芥子粒のようなサイズで表示される>
 結論から言うと、Qtの環境変数に以下を指定すると、フォントが拡大されました。(数値は各自の好みで。)
QWS_DISPLAY=LinuxFB:mmWidth=160:mmHeight=120
 参考サイト(1)によると、どうも結果としてDPI値が調整される、ということのようです。
(改めて「QWS_DISPLAY mmWidth」でググってみたら、mini2440関連トピックが結構ヒットして、mini2440使いにとっては常識ってこと?)

 本設定は、画面回転の設定と共用することになる(LinuxFBがTransformedの下位レイヤーとなる)ので、最終的には以下の通りとなります。(スクリーンショット
QWS_DISPLAY=Transformed:Rot90: LinuxFB:mmWidth=160:mmHeight=120

 <Qt Creatorのデザインモードでフォント指定できない>
 Qt Creatorのデザインモードで(例えば)ラベルを置くと、プロパティの一つとしてfontファミリー(名)を指定できるのですが、表示されるのはMac内臓フォントです。
 これを実機側のフォントにする方法がわかりません。(ポップアップに実機側のリストを持ってくるのが難しいのなら、せめて直接文字列が指定できればいいのですが、)
 この件は、現時点では解決していません。
 まぁ、コードでは書けるので、それで行け、ということなのかもしれませんが。

 <日本語が表示されない>
 当初、Qt Creatorのデザインモードで(例えば)ラベルを置き、そこに日本語を記述して実行すると、何も表示されませんでした。
 Qtのフォントアサインの仕組みを調べてみると、(実機にコピーした)Qtのlib/fontsディレクトリが参照されて、指定されたフォントを割り付ける、ということのようです。(QT_QWS_FONTDIRで明示的に指定した場合は、そちらが優先されるようです。)

 あれこれ実験した結果、どうもQtは、このフォントディレクトリ内にTrueTypeフォントファイル(以下、ttf)があると、フォント名を明示的に指定しない場合は、自動的にttfをアサインして表示してくれるようです。
 この時、文字列が日本語だと、日本語ttfをアサインして表示してくれます。(プロパティの「locale」に従う?。なお、日本語ttfが見つからないと、日本語部分は何も表示されない。)
 あくまで実験の結果なので、推測レベルですが。

 なので、フォントディレクトリ内に日本語ttfをインストールしてやれば、とりあえず日本語を表示することができるようになります。
日本語ttfのインストール方法ですが、当初はapt-get installしようとしたのですが、以下のメッセージが出て解凍できませんでした。(単にメモリ不足?)
dpkg-deb (subprocess): decompressing archive member: lzma error: Cannot allocate memory
なので、Ubuntuマシンの/usr/share/fonts/truetype/takao-gothic/TakaoExGothic.ttf他を/usr/local/Qt4.8.6-arm/lib/fontsにコピーしました。

また、Qtのfontsディレクトリには、日本語に対応したビットマップフォントが含まれていますが、これらは自動的にはアサインされません。ビットマップフォントは見栄えが悪かったり、使い勝手が悪かったりする(サイズ指定が反映されない場合がある)ので、ファイルサイズが大きい(一書体6〜8MB程度)ことには目を瞑って、ttfを使う方が良さそうです。
 フォント名を指定して表示したい場合は、コードでの方法となりますが、例えば以下のサイトが参考になります。

 参考サイト(2):Armadillo:Qt4でいろんなフォントで表示 | アットマークテクノ ユーザーズサイト
addApplicationFontのパスは、各自の設定に合わせる。ここでは、/usr/local/Qt4.8.6-arm/lib/fonts/TakaoExGothic.ttf
 <有効表示面積を広くする>
 Qt Creatorのデザインモードでは標準で、メニューバー/ツールバー/ステータスバー/ウィンドウのリサイズといったリッチな機能が使えるようになっているのですが、テストに使うアプリではこれらは必要なく、その一方でオブジェクト配置可能領域は出来るだけ広くしたいことから、カスタマイズを考えてみました。

 以下は、テストアプリの実行画面です。左が標準、右がカスタマイズしたものです。カスタマイズ点は以下の通りです。
・メニューバー/ツールバー/ステータスバーを削除(Qt Creatorのデザインモードでコンテキストメニューから選択)
・ウィンドウサイズを固定化(Qt CreatorのデザインモードでsizePolicyをFixed、minimumSizeとmaximumSizeをgeometryに合わせる)
・タイトルバーの最大化/最小化ボタンを無効化(コードに以下を追加)
Qt::WindowFlags flags = 0;
flags |= Qt::WindowCloseButtonHint;
this->setWindowFlags(flags);
・タイトルバーの外観をDefaultに(実行の引数で「-decoration default」を指定)

 双方とも、PushButtonはこれ以上下げると欠ける、という位置まで下げてあります。
 また、カスタマイズ後の方は、「日本語ラベル」の位置が最上部(y=0)です。
 

 <環境変数の設定(スクリーンショット)>



 ロケール

 ロケールに関しては、まずリモート(Mac/Linuxからssh)接続に関する問題があります。
 Macのターミナルで実機にssh接続した後、localeすると、
root@mini2440:~# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=ja_JP.UTF-8
LANGUAGE=
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
と表示されますが、これは以下の参考サイトが示している状況と思われます。

 参考サイト(3):Ubuntu Server 12.04: 警告「Setting locale failed」への対処法 - tkrdの日記 (rails や ubuntu のことなど)

 当面、ssh接続はmini2440しかしないので、Macの/etc/ssh/ssh_configで当該行をコメントアウトしました。再接続してlocaleすると、
root@mini2440:~# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
 ここで、例えば以下のサイトの通り指定しても、localeするとWarningが出てしまいます。

 参考サイト(4):IT備忘録: Debian 言語設定

 まだ設定が足りないものと思われますが、現状POSIXのままでも特にWarningとかは出ないので、結局(Debian側の設定は)元に戻してあります。
 Debianを日本語で使うことはまず考えなくていいので、en_US.UTF-8あたりにしておくのが無難なのでしょうか…。


 おわりに

 ひとまず気になる点はクリアできた?ので、今後は内容にシフトしていこうかと思案中です。
 まずは(折角購入したので)カメラアプリ辺りでしょうか。


 お世話になったサイト

 有用なソフトウェアおよび貴重な情報をご提供頂いている皆様に、お礼申し上げます。(以下、順不同)

 参考サイト(1):Qt for Embedded Linux Display Management | Qt 4.8
 参考サイト(2):Armadillo:Qt4でいろんなフォントで表示 | アットマークテクノ ユーザーズサイト
 参考サイト(3):Ubuntu Server 12.04: 警告「Setting locale failed」への対処法 - tkrdの日記 (rails や ubuntu のことなど)
 参考サイト(4):IT備忘録: Debian 言語設定


 更新履歴

 2016.02.10 章番号を変更。
 2016.01.14 新規作成


[Home]  [MacSoft]  [Donation]  [History]