ワイヤレスファイルシステムライブラリ(WFS) 概要

はじめに

WFSライブラリは、DSダウンロードプレイなどで起動したROMを持たないプログラムが ワイヤレスなどを経由して外部のROMイメージを参照するための機能を提供します。 また、ROMイメージ自体をネットワーク越しの仮想的なドライブとして FSライブラリのファイルシステムに容易にマウントするための機能も用意しています。

WFSのシステムはROMイメージを供給する1個のサーバ側プログラムと それを要求する複数のクライアント側プログラムとで構成され、 WMライブラリのMP通信で1個のポートを使用して相互にコミュニケーションします。 ただしWFSライブラリ自身が直接WMライブラリの関数を呼び出すことはなく、 通信に必要な処理は全てフック関数として提供されています。 そのため、アプリケーションは特定のワイヤレス制御フレームワークに依存せずこれを導入することができます。

WFSライブラリのレイヤ

処理の流れ

WFSライブラリのおおよその処理の流れは以下のとおりです。

  1. コンテキストの初期化

    まず、WFSライブラリのためのコンテキスト構造体を用意して初期化します。
    親機(サーバ)ではWFS_InitServer( )を呼び出したのち WFS_RegisterServerTable( )またはWFS_ExecuteRomServerThread( )でROMイメージを登録します。
    子機(クライアント)側では単にWFS_InitClient( )を呼び出します。
    どちらも、ワイヤレス通信を開始する前にこの初期化処理を行っておく必要があります。

  2. ワイヤレス通信の確立

    初期化を終えてから、アプリケーションでワイヤレス通信を開始してMP通信可能な状態へ遷移します。
    子機(クライアント)は、親機(サーバ)と接続して自身のAIDが決定した時点でWFS_StartClient( )を呼び出す必要があります。

  3. MP通信のフック開始

    アプリケーションがMP通信可能になったら、WFSライブラリのために任意のポートを1個使用してMP連続通信を実行します。 具体的には、親子ともMP通信に関する各々のタイミングで以下のフック関数を呼び出します。

    タイミング親機(サーバ)子機(クライアント)
    相手の新規接続を検知 WFS_CallServerConnectHook( )を呼び出す。 WFS_CallClientConnectHook( )を呼び出す。
    相手の切断を検知 WFS_CallServerDisconnectHook( )を呼び出す。 WFS_CallClientDisconnectHook( )を呼び出す。
    自身からのMPパケット送信が可能 WFS_CallServerPacketSendHook( )を呼び出して得られたパケットデータをWM_SetMPDataToPort( )で送信。 WFS_CallClientPacketSendHook( )を呼び出して得られたパケットデータをWM_SetMPDataToPort( )で送信。
    相手からのMPパケット受信 受信したパケットデータを指定してWFS_CallServerPacketRecvHook( )を呼び出す。 受信したパケットデータを指定してWFS_CallClientPacketRecvHook( )を呼び出す。

  4. イベント通知の発生

    上記フック関数を繰り返し呼び出して通信を継続するうち、アプリケーションへ各種イベントが通知されます。 基本的には親機(サーバ)での通知は子機(クライアント)へROMイメージデータを供給するために発生し、 子機(クライアント)での通知は必要なデータが準備されたことを知らせるために発生します。
    イベント種別の詳細はWFSEventTypeをご参照ください。

  5. ROMイメージの読み込み

    子機(クライアント)は、WFS_RequestClientRead( )を使用して 親機(サーバ)から任意のROMイメージを読み込むことが出来ます。
    これは転送速度の違いを除けばおおよそCARD_ReadRom( )と同等の機能であり、 後述するファイルシステムのマウント処理はこの機能を応用して実現されます。 (ファイルシステムが不要であれば、単にこの関数だけを直接使用してもかまいません)

  6. ファイルシステムのマウント

    子機(クライアント)がWFS_GetTableFormat( )で参照できる情報には FSライブラリのファイルシステムへアーカイブをマウントするために必要な情報がすべて含まれています。 このデータとWFS_RequestClientRead( )の呼び出しを組み合わせて アーカイブプロシージャを記述すれば、通常のROMアプリケーションと同じようにFSライブラリ関数を使用してファイルアクセスを実行することができます。
    WFSライブラリではこのようなWFSアーカイブの単純な実装のひとつをWFS_ReplaceRomArchive( )として提供していますので、 ファイルアクセス機能を簡単に利用したい場合は通常これを呼び出すだけでよいでしょう。

  7. コンテキストの解放

    MP通信が終了したら、親子ともWFSライブラリのコンテキスト構造体を解放して終了処理を行う必要があります。
    親機(サーバ)は、全ての子機(クライアント)が切断してMP通信親機(サーバ)処理を終了した段階でWFS_EndServer( )を呼び出します。これにより、WFSライブラリ内部で自動的に生成されたスレッドは終了し、コンテキスト構造体と各種のメモリはユーザアプリケーションのもとへ解放されます。
    子機(クライアント)は、親機(サーバ)から切断した段階でWFS_EndClient( )を呼び出します。これにより、マウントされていたアーカイブは処理を終了して無効となります。子機(クライアント)から親機(サーバ)へのファイルアクセス中にMP通信が終了した場合はWFS_EndClient( )を呼び出さない限り完了通知されずに処理がブロッキングしたままになりますので、この点に注意が必要です。

以上のおおまかな処理の流れを下図にまとめます。

親機(サーバ) 子機(クライアント)

(WFSの初期化)
WFS_InitServer( )
WFS_RegisterServerTable( )またはWFS_ExecuteRomServerThread( )

(親機(サーバ)ワイヤレス通信の開始)
.
.
.
(親機(サーバ)ワイヤレス通信の確立)

(WFSの初期化)
WFS_InitClient( )

(子機(クライアント)ワイヤレス通信の開始)
.
.
.
(子機(クライアント)ワイヤレス通信の確立)
WFS_StartClient( )

(MP通信フック関数の呼び出し開始)
WFS_CallServerConnectHook( )---WFS_CallClientConnectHook( )
WFS_CallServerDisconnectHook( )---WFS_CallClientDisconnectHook( )
WFS_CallServerPacketSendHook( )---WFS_CallClientPacketRecvHook( )
WFS_CallServerPacketRecvHook( )---WFS_CallClientPacketSendHook( )
※双方とも、上記フック関数呼び出しを適宜繰り返す

(リクエスト待ちうけ開始)

WFS_EVENT_CLIENT_READYイベント通知

(WFS_ExecuteRomServerThread( )を使用した場合は内部スレッドが自動的に応答)

(WFS_RegisterServerTable( )を使用した場合)

WFS_EVENT_SERVER_SEGMENT_REQUESTイベント通知---
WFS_EVENT_SERVER_SEGMENT_REQUESTイベント通知---
WFS_EVENT_SERVER_SEGMENT_REQUESTイベント通知---

(アプリケーションが直接制御する場合)

---WFS_RequestClientRead( )
(データ転送実行中)



---完了コールバック

(用意されているアーカイブを利用する場合)
WFS_ReplaceRomArchive( )

FS_OpenFile(file, "rom:/abc.data");
FS_ReadFile(file, buffer, length);


(親機(サーバ)ワイヤレス通信の終了)
WFS_EndServer( )


(子機(クライアント)ワイヤレス通信の終了)
WFS_EndClient( )

履歴

2007/09/27 終了処理に関する子機(クライアント)側の注意事項を追記
2007/06/14 WFS_ExecuteRomServerThread( )追加にともない詳細追記
2007/06/11 関数追加にともない詳細追記
2007/06/06 初版