クラス階層とデータ構造

\includegraphics[width=.5\hsize ]{fig/hiclass.eps}
Fig.  : HumanInterface class hierarchy

HumanInterfaceモジュールのクラス階層をFig. #.#.#に示します.

デバイスには実デバイスと仮想デバイスがあります. 実デバイスは現実のハードウェアに対応し,例えばWin32マウスやあるメーカのA/D変換ボードを表す実デバイスがあります. 一方,仮想デバイスは実デバイスが提供する機能単位を表し,処理系に依存しません. 例えば,1つのA/D変換ポートや抽象化されたマウスインタフェースがこれにあたります. 基本的に,初期化時を除いてはユーザは実デバイスに触れることはなく,仮想デバイスを通じてそれらの機能を利用することになります.

ヒューマンインタフェースはデバイスよりも高度で抽象化された操作インタフェースを提供します.

\includegraphics[width=.5\hsize ]{fig/humaninterface.eps}
Fig.  : HumanInterface module data structure

次にHumanInterfaceモジュールのデータ構造をFig. #.#.#に示します. HISdkオブジェクトはヒューマンインタフェースプールとデバイスプールを持っています. デバイスプールとは実デバイスの集まりで,それぞれの実デバイスはその機能をいくつかの仮想デバイスとして外部に提供します.

デバイスの機能を使うには,

  1. 実デバイスを作成する

  2. 実デバイスが提供する仮想デバイスにアクセスする

という2段階の手順を踏みます. 以下にそれに関係するHISdkの関数を紹介します.

HISdkIf

HIRealDeviceIf*

AddRealDevice(const IfInfo* ii, const void* desc = NULL)

HIRealDeviceIf*

FindRealDevice(const char* name)

HIRealDeviceIf*

FindRealDevice(const IfInfo* ii)

AddRealDeviceは型情報iiとディスクリプタdescを指定して実デバイスを作成します. FindRealDeviceは名前か型情報を指定して,既存の実デバイスを検索します. たとえば,内部でGLUTを用いるキーボード・マウス実デバイスを取得するには

hiSdk->FindRealDevice(DRKeyMouseGLUTIf::GetIfInfoStatic());

とします.

仮想デバイスを取得および返却する方法にはHISdkを介する方法とHIRealDeviceを直接呼び出す方法の2通りがあります.

HISdkIf

HIVirtualDeviceIf*

RentVirtualDevice(const IfInfo* ii, const char* name, int portNo)

bool

ReturnVirtualDevice(HIVirtualDeviceIf* dev)

RentVirtualDeviceはデバイスプールをスキャンして型情報に合致した最初の仮想デバイスを返します. 実デバイスを限定したい場合はnameで実デバイス名を指定します. また,複数の仮想デバイスを提供する実デバイスもあります. この場合はポート番号portNoで取得したい仮想デバイスを指定できます. デバイスの競合を防ぐために,一度取得された仮想デバイスは利用中状態になります. 利用中のデバイスは新たに取得することはできません. 使い終わったデバイスはReturnVirtualDeviceで返却することによって再び取得可能になります.

HIRealDeviceIf

HIVirtualDeviceIf*

Rent(const IfInfo* ii, const char* name, int portNo)

bool

Return(HIVirtualDeviceIf* dev)

こちらは実デバイスから直接取得,返却するための関数です.機能は同様です.