Wiiリモコンで操作できるプレゼン・マシンの製作(2) ―― Wiiリモコンを動作させるためのミドルウェアを組み込む
tag: 組み込み ディジタル・デザイン
技術解説 2009年10月27日
第1回ではビルド環境を作るところから,実際にAndroidが起動するまでを駆け足で紹介しました.本稿では,Wiiリモコンを動作させるためのミドルウェアの組み込み方法を紹介します.Wiiリモコンのミドルウェアだけでなく,他のオープン・ソース・ソフトウェア(OSS)をポーティングする際にも参考となるでしょう.番外編では,BeagleBoardをケースに格納する例を紹介します.みなさんも,自分だけのAndroidマシンを作ってみましょう!(編集部)
※ 本稿で使用するパッチ・ファイルはこちらからダウンロードできます.
●AndroidマシンをWiiリモコンで操作しよう!
前回構築したAndroidをベースに,今回はWiiリモコンのミドルウェアを導入し,WiiリモコンでAndroidを操作できるようにしたいと思います(写真1).今回はプレゼンテーションの用途ですが,BeagleBoardとAndroidでホーム・ネットワーク・サーバを組み上げることもできるので,それらとWiiリモコンを組み合わせれば,さらにに可能性が広がるのではないでしょうか.
1.Androidにミドルウェアをポーティングする
●一般的なオープン・ソース・ソフトウェアのポーティング
Androidでは100を超えるオープン・ソース・ソフトウェア(OSS)が組み込まれています.世の中で公開されているOSSのほとんどはUNIXやLinux向けに作られているため,そのままではAndroidでビルドすることができません.OSS(主にC/C++などのネイティブで動作するもの)をAndroid向けにビルドするには,Android専用のメイク・ファイル(Android.mk)を用意しなければなりません.
また,Androidのbionic(C/C++ライブラリ)ではサポートしていない関数やステートメント(C++のtry/catchなど)があるため,これらをbionicがサポートするもので置き換える必要があります,ほかにもAPI(Application Program Interface)を公開する場合や,ログ出力,IPC(Inter Process Communication;プロセス間通信)を行う場合は,Android用に実装を追加したり,処理を変更しなければならないことがあります.このようにAndroidにポーティングするためにはさまざまな対処が必要になります.
●Wiiリモコンを動作させるためのミドルウェア「CWiid」
Wiiリモコンは特殊なイベントを送信するHID(Human Interface Device)です.通常のHIDプロファイルでは処理できないイベントを通知するため,専用のミドルウェアが必要となります(AndroidにHIDプロファイル・マネージャを実装しても正しく動作しない).WiiリモコンをLinux上で動作させるためのミドルウェアの一つに,「CWiid」があります.「CWiid」ではwminputというデーモンを使用し,Wiiリモコンからのinputイベントを処理します.Linux上で動作するデーモンをAndroidに組み込むのは比較的簡単なため,本稿ではこれをポーティングすることにします.
まずは,CWiidとAndroidのinputイベント処理の仕組みを理解しましょう(図1).
図1の中の数字の順番に処理が進みます.
① wminputを起動します.wminputは指定されたセンサ種別のプラグインを読み込み,uinputにより仮想inputデバイスを生成したあと,Wiiリモコンとペアリングを行い,コネクションを確立します.
② Wiiリモコンからのinputイベントをbluetoothデバイス(本稿ではUSBアダプタ)が受信します.
③ カーネルは,デバイスが受信したイベントをユーザ空間に通します.
④ wminputはCWiidライブラリ,bluezライブラリを使用し,Wiiリモコンのinputイベントを受信します.
⑤ wminputは,起動時に指定されたプラグインを呼び出します.プラグインはキー・マップ・ファイルに従い,Wiiリモコンのinputイベントをmouseやキーボードなどの一般的なinputイベントに変換します.
⑥ wminputは,変換されたinputイベントをuinputに通知します.
⑦ uinputは,変換されたinputイベントをLinuxのinputイベント・キューに積みます(通常のinputデバイスの処理も同様にイベント・キューに積まれる).
⑧ WindowManager(正確にはInputDispatcherThread)はEventHubを使用し,inputイベント・キューからinputイベントを刈り取ります.inputイベントはキー・レイアウト・ファイルに従ってAndroidのキー・イベントに変換されます.
⑨ WindowManagerはフォアグラウンドのActivityにキー・イベントを通知します.キー・イベントを受信したActivity(Viewのキー・イベント・リスナ)では,キー・イベントに対応する処理が実行されます.