この章では、NFP ライブラリを利用する際の処理フローを、全体図と各処理を細分化したシーケンスで説明します。
NFP ライブラリを利用する際の処理フローの全体図を簡単に表すと以下のようになります。
5.1. 初期化シーケンス
NFP ライブラリの初期化を行うシーケンスです。
アプリケーションの途中で NFP ライブラリの終了処理を行わない限り、アプリケーションの起動から NFP ライブラリの関数を呼び出すまでに、一度だけ行います。
5.2. 終了シーケンス
5.3. 共通エラーハンドリング
NFP ライブラリの関数を呼び出した際に、共通して返されるエラーをハンドリングするシーケンスの例です。
このシーケンス例でハンドリングしているエラーは、基本的にタグの検知開始からやり直す必要のあるエラーです。また、通信が完了するまで同じタグでタッチし続け、別のタグに入れ替わったときにはエラーが発生することを前提にしています。
無線オフモードであれば無線オンモードにすることでそのエラーが発生しなくなるように、エラーの原因をユーザーの手で取り除く方法がある場合は、ユーザーにその方法を通知してください。
CTR 向けの NFC リーダー/ライターを利用する場合は、タグ検知開始シーケンスではなく、NFC リーダー/ライター接続シーケンスに進むようにしてください。
5.4. タグチェックシーケンス
オーナーの情報やアプリ専用領域の情報にはアクセスしないアプリケーションで、どのキャラクターの NFP タグがタッチされたかをチェックするシーケンスです。
5.5. タグ検知開始シーケンス
NFC モジュールによるタグの探索を開始し、ユーザーにタグのタッチを促すシーケンスです。
フローにはありませんが、必ずタグ発見通知の待ち受けをユーザーがキャンセルできるようにしてください。
5.6. タグ喪失通知待ち受けシーケンス
タグとの通信が完了したときや、処理対象のタグとは別のタグが検知されたときなど、タッチしているタグを NFC モジュールの通信可能範囲内から離す必要がある場合に行われるシーケンスです。
フロー図では引き続き別のタグを検知することを想定していますが、通信完了後にタグの検知を行わない場合はタグ喪失通知を待ち受ける必要はありません。
5.7. タグマウントシーケンス
NFP ライブラリが検知したタグをマウントするシーケンスです。
フロー図では、エラーのために処理を再開する必要があった場合や前のシーンで読み込んでいたタグに書き込みを行う場合を想定し、マウントを行う前にタグ情報の取得を行って、タグの UID をチェックするようにしています。
処理でエラーが発生してもリトライが可能な場合の再試行数はフロー図で示した回数でなくてもかまいません。
5.8. タグ復旧シーケンス
NFP タグが破損していたものの、アプリケーションで復旧可能な場合にタグを復旧するシーケンスです。以下のシーケンスを実装せず、 amiibo 設定を復旧モードで起動することでも NFP タグを復旧できます。
フロー図では、マウントを試みたあとにタグが離された場合や違うタグがタッチされた場合に備えて、タグの検知から再開するようにしています。
5.9. 「amiibo設定」起動シーケンス
5.10. NFP タグへのアクセスを行う処理フロー
5.10.1. 共用情報取得シーケンス
NFP タグの共用領域に記録されている共用情報を取得するシーケンスです。
アプリケーションが対応するキャラクターの NFP タグであるかどうかを判定し、共用情報に記録されているキャラクターID(characterId
)がアプリケーションで対応していないものである場合は、タッチされた NFP タグには対応していないことをユーザーに通知してください。
5.10.2. 登録情報取得シーケンス
NFP タグの共用領域に記録されている登録情報を取得するシーケンスです。
登録情報には、オーナーの Mii のデータや amiibo のニックネームが記録されています。
アプリケーションがオーナーの Mii のデータを必要とする場合、オーナー登録されていない NFP タグであることを検知したときには、「amiibo設定」でオーナー登録をするために、「amiibo設定」を起動するシーケンスに移ってください。
アプリケーションが amiibo のニックネームを必要とする場合、ニックネームが空の NFP タグであることを検知したときには、「amiibo設定」でニックネームを登録をするために、「amiibo設定」を起動するシーケンスに移ってください。
5.10.3. アプリ専用領域アクセス開始シーケンス
マウントした NFP タグのアプリ専用領域に対するアクセスを開始するシーケンスです。
アプリ専用領域が NFP タグ内に作成されていない場合は、アプリ専用領域を作成するためにアプリ専用領域作成シーケンスへと遷移してください。
すでにアプリ専用領域が作成されていて、アプリ専用領域が作成されたときに指定されたアクセスID がアプリケーションのアクセスID と異なる場合は、そのままではアプリ専用領域の読み書きを行うことができません。「amiibo設定」でアプリ専用領域を削除する必要がありますので、ユーザーにその旨を通知して、「amiibo設定」を起動してください。
上記の通知を行うときには、アプリケーションがアプリ専用領域を利用した場合と利用しない場合の挙動の違いをユーザーに通知することを推奨します。また、アプリ専用領域を利用しなくてもゲームを続けることができるようにしてください。
5.10.4. アプリ専用領域作成シーケンス
アプリ専用領域を作成するシーケンスです。
アプリ専用領域にデータを書き込むためにアプリ専用領域へのアクセスを開始した際にこのシーケンスへと遷移していた場合は、書き込もうとしていたデータを nn::nfp::InitializeCreateInfo()
に渡す初期化データとすることで nn::nfp::CreateApplicationArea()
が成功した時点で書き込みのシーケンスに遷移する必要はなくなります。
作成済みであることを nn::nfp::CreateApplicationArea()
が返した場合はアプリ専用領域の内容が意図したものではない可能性があります。
処理でエラーが発生してもリトライが可能な場合の再試行数はフロー図で示した回数でなくてもかまいません。
5.10.5. アプリ専用領域チェックシーケンス
書き込みを行う直前などにアプリ専用領域の整合性を確認するシーケンスです。
ゲームシーンの前後でアプリ専用領域の読み込みと書き込みを行うなど、アプリ専用領域の読み込みと書き込みとの間に時間がある場合は、以下のような行為で書き込みを行えなくなることがあるため、書き込みを行う前にアプリ専用領域の整合性を確認することを推奨します。
- 別の NFP タグでタッチする
- ほかの機器でアプリ専用領域を書き換える
- 「amiibo設定」でアプリ専用領域を削除する
なお、下のフロー図は、NFP タグのマウントまでが正常に完了していることを前提にしています。
5.10.6. アプリ専用領域読み込みシーケンス
5.10.7. アプリ専用領域書き込みシーケンス
5.11. 3DS のアプリケーションで必要となる処理
3DS のアプリケーションでは、HOMEボタン、スリープ、電源ボタンといった 3DS の機能に対応した処理が必要になります。
5.11.1. HOMEメニュー遷移シーケンス
HOMEボタンが押されると HOMEメニューへの遷移がシステムから要求され、アプリケーションは HOMEメニューへの遷移を行うかどうかを判断しなければなりません。
まだ書き込まれていないデータがあるなど、すぐに HOMEメニューへ遷移することができない場合は、HOMEボタン禁止アイコンを表示して HOMEメニューへの遷移を拒否することができます。
HOMEメニューから起動されるアプレットが NFC 機能を使用できるようにするために、NFP ライブラリを終了する必要があります。
5.11.2. スリープ遷移シーケンス
蓋を閉じる(FTR はスリープスイッチをスライドする)ことで、アプリケーションにスリープ状態への遷移が要求され、アプリケーションはスリープ状態への遷移を承諾するかどうかを判断しなければなりません。
まだ書き込まれていないデータがあるなど、すぐにスリープ状態へ遷移することができない場合は、スリープ状態への遷移が可能になるまで要求への回答を保留して処理を続行することができます。アプリケーションがスリープ状態への遷移を承諾すると、システムによってタグの検知やマウントが自動的に解除されるため、スリープ状態から復帰した後は再びタグ検知開始シーケンスから始める必要があります。
5.11.3. 電源断シーケンス
POWER ボタンが押されると電源メニューへの遷移がシステムから要求され、通常すぐにアプリケーションの終了処理を行わなければなりません。
まだ書き込まれていないデータがある場合は、アプリケーションに与えられた終了処理時間中に処理を完了できるならば、書き込み処理を続行することができます。
また、電源メニューを表示する前に NFP ライブラリを終了する必要があります。
5.11.4. NFC リーダー/ライター接続シーケンス
CTR 向けの NFC リーダー/ライターを利用する場合は、アプリケーションから明示的に機器への接続を行わなければなりません。
スリープ状態や無線オフモードに遷移したことが原因で、 nn::nfp::Connect()
でエラーが発生した場合は、戻り値に応じた処理を行ってください。
NFC リーダー/ライターに接続できなかった場合は、その原因を nn::nfp::GetConnectResult()
で確認し、適切にハンドリングする必要があります。
nn::nfp::ResultUpdateRequired
が発生していた場合は、NFC リーダー/ライターのファームウェアを更新する必要があるため、「amiibo設定」を起動する必要があります。
nn::nfp::ResultIrFunctionError
が発生していた場合は、 CTR の赤外線通信モジュールの故障の疑いがあります。このエラーが発生した場合は、CTR 本体の電源入れ直しを案内するようにし、何度も発生するようであれば、サービスセンターに問い合わせるように誘導してください。
nn::nfp::ResultNfcTargetError
が発生していた場合は、NFC リーダー/ライターの故障の疑いがあります。このエラーが発生した場合は、NFC リーダー/ライターの電源入れ直しを案内するようにし、何度も発生するようであれば、サービスセンターに問い合わせるように誘導してください。
nn::nfp::ResultConnectCanceled
が発生していた場合は、接続がキャンセルされたか、内部エラーが発生しています。NFC リーダー/ライター接続をリトライしてください。
なお、このエラーはアプリケーション自身が nn::nfp::Disconnect()
を呼び出して切断した場合にも発生します。
nn::nfp::ResultTimeOutError
が発生していた場合は NFC リーダー/ライターからの返答がありません。NFC リーダー/ライターの電源を入れた直後や、置く場所がずれている可能性があります。NFC リーダー/ライター接続をリトライしてください。
接続に成功した後であっても、ユーザーが NFC リーダー/ライターを CTR から離す等して、通信出来ない状態にすると、1秒後に切断状態となります。そのため、定期的に GetTargetConnectionStatus()
が TARGET_DISCONNECTED
になっていないか、確認する必要があることに気をつけてください。