QtはクロスプラットフォームのアプリケーションとUI(ユーザーインターフェース)作成のためのフレームワークです。Qtを使うことで、比較的簡単にGUIアプリケーションの開発ができるようになります。
Qtを使用して作成したプログラムは、対象のプラットフォームごとにコンパイルしなおすことで、同じソースコードのままでWindowsやMac OS、Linuxなど様々なOS上で動作します。それは組み込みシステムも例外ではなく、もちろんArmadilloでも動作します。
しかしながら、組み込み用にプログラムを作成したり、組み込みLinuxで動作させるためには、いくつか注意すべきポイントがあります。
本シリーズでは、3回に分けてArmadillo上で動作するQtアプリの作り方をご紹介します。
なにはともあれ動かしてみる
Qtを使うとどんなプログラムが作れるようになるのか、Armadillo上でどの程度動くのか、まずは実際に動かしてみながら確認してみましょう。
サンプルイメージの書き込み
Armadillo上でのQtアプリの動作確認のために、Qtのサンプルアプリを追加し、諸々の設定をしたユーザーランドイメージを用意しました。一度Armadillo-440を標準イメージで起動してから、下記のコマンドを実行しこのイメージを書き込んでください。
[armadillo ~]# netflash -knusr /dev/flash/userland https://download.atmark-techno.com/sample/a440-qt-howto/romfs-qt-20121105.img.gz
書き込みが完了すると、再起動します。しかし、起動途中に下記のようなメッセージが表示されて正常に起動できません。
RAMDISK: ext2 filesystem found at block 0
RAMDISK: image too big! (50574KiB/32768KiB)
List of all partitions:
1f00 128 mtdblock0 (driver?)
1f01 2048 mtdblock1 (driver?)
1f02 30464 mtdblock2 (driver?)
1f03 128 mtdblock3 (driver?)
No filesystem could mount root, tried: ext3 ext2 msdos vfat
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)
「RAMDISK: image too big!」とのメッセージが示すように、Qtアプリを含んだユーザーランドは標準のものよりかなり大きくなり、RAMDISKのデフォルトサイズ(32MB)をオーバーしてしまいます。
最終的には、不要なアプリやライブラリを削除してユーザーランドを小さくしたり、Linuxカーネルの設定を変更してRAMDISKのサイズを大きくするなどして対処することになります。しかし、今はとりあえずQtアプリを動かしてみたいので、カーネルパラメータで一時的にRAMDISKのサイズを大きくすることで回避したいと思います。
一度Armadillo-440の電源を切り、JP2にジャンパソケットを挿してショートしてから再度電源を投入してください。すると、Hermitの保守モードで起動します。その状態で、下記のようにsetenvコマンドを使用し、"ramdisk_size"パラメータを指定してください。この例ではRAMDISKのサイズを60MB(61440kB)に設定しています。
hermit> setenv console=ttymxc1 ramdisk_size=61440
カーネルパラメータを指定しRAMDISKを大きくしておくと、正常に起動できるようになります。下記のようなログインプロンプトが表示されることを確認してください。いつものように、root/rootでログインできます。
atmark-dist v1.30.1 (AtmarkTechno/Armadillo-440.Qt)
Linux 2.6.26-at16 [armv5tejl arch]
armadillo440.Qt-0 login:
※このユーザーランドイメージでは、SSHサーバー(sshd)が自動起動するように設定してあります。初回はSSHサーバーが使用する鍵を生成するため、起動に時間がかかります。SSHサーバーは、次回以降に紹介するQt Creator(Qt用のIDE)を使ったデプロイ/リモートデバッグに使用します。
Qtアプリの実行
ログインできたら、さっそくQtを使ったサンプルアプリを実行してみましょう。サンプルアプリは、/usr/binディレクトリにhello_qt、hello_qml、samegameという名前で3つ置かれています。samegameはちょっとしたゲームになっており、動かしてみて面白いので、これを実行してみます。/usr/binディレクトリにはPATHが通っていますので、単に"samegame"と入力してEnterキーを押せば実行される、はずです。
[armadillo ~]# samegame
QWSSocket::connectToLocalFile could not connect:: No such file or directory
QWSSocket::connectToLocalFile could not connect:: No such file or directory
QWSSocket::connectToLocalFile could not connect:: No such file or directory
同じメッセージを繰り返し表示するだけで、画面には何も表示されません :-
正常に起動させるためには、"-qws"オプションを付ける必要があります。
[armadillo ~]# samegame -qws
なぜ"-qws"オプションが必要なのかについては、少し説明が必要でしょう。LinuxでGUIアプリを動かす場合、何がしかのWindow Systemが必要となります。PC Linuxでは、X Window System(X11)が主流です。Armadillo-440でも、これまではKdriveというX Window Systemの亜種を使ってGUIアプリを動作させていました。組み込み用Qt(Qt/Embeddedと呼んだりします)では、QWS(Qt Window System)という独自のコンパクトなWindow Systemを使用します。これにより、Xなどの外部のWindow Systemが不要になり、全体の容量を節約することができます。
QWSでは、他のWindow Systemと同様に、サーバー/クライアント型のアーキテクチャをとります。サーバーとして動作するプロセスが一つあり、そのプロセスがマウスやキーボード入力などのイベントを処理し、他のクライアント(複数存在する)に通知します。
http://qt-project.org/doc/qt-4.8/qt-embedded-architecture.html より引用
"-qws"オプションを付けてQtアプリを起動すると、そのアプリ自身がQWSサーバーとして動作します。"-qws"オプションを付けずに起動した場合、QWSクライアントとして動作します。先ほどの「QWSSocket::connectToLocalFile could not connect...」という表示は、「QWSクライアントとして起動したけど、QWSサーバーに接続できない」といった意味になります。
マウスの設定
さて、アプリを無事起動できたのは良いのですが、タッチパネルに触っても何も反応しません。マウスカーソルは表示されているので、マウスの設定をしてあげれば良さそうです。
タッチパネルからの入力イベント処理には、tslibを使用します。QWSサーバーにtslibを使うことと、どのデバイスファイルがタッチパネル入力に対応しているかを教えてあげると、入力を処理できるようになります。そのためには、QWSサーバーを実行するまえに、環境変数QWS_MOUSE_PROTOを設定しておく必要があります。Ctrl-Cで一度samegameを終了し、環境変数を設定してから、再度同じように起動してみてください。
[armadillo ~]# export QWS_MOUSE_PROTO=tslib:/dev/input/event1
[armadillo ~]# samegame -qws
すると、タッチパネル入力を処理できるようになります。触った場所にマウスカーソルが移動することを確認してください。
左下の「New Game」ボタンをクリックすると、ゲームが始まります。二個以上連続しているボールをクリックすると、弾けて消えていきます。ボールがバウンドしたり、消えるときにフェードアウトしていくなど、様々な視覚効果が使われています。Qtを使うと、Armadillo-440でもこのようなリッチなGUIアプリを作成することができます。
まとめ
- Qtを使うとユーザーランドが大きくなりがち。RAMDISKのサイズを大きくすることで対応できる
- 一番目のアプリを起動するときは、"-qws"オプションを付けてQWSサーバーとして動作させる
- Qtを使うとArmadillo-440でもリッチなGUIを実現できる
次は「作ってみる」
次のHowtoでは、簡単なQtアプリを作ってみて、アプリ作成の勘所をつかみたいと思います。