5. 処理フロー

この章では、NFP ライブラリを利用する際の処理フローを、全体図と各処理を細分化したシーケンスで説明します。

NFP ライブラリを利用する際の処理フローの全体図を簡単に表すと以下のようになります。

図 5-1. NFP ライブラリを利用する際の処理フロー(全体図)

初期化 タグ検知の開始 タグを検知した? Y N NFPタグ? Y N NFPタグへのアクセス タグ検知を終了する? Y N タグ検知の終了 終了

5.1. 初期化シーケンス

NFP ライブラリの初期化を行うシーケンスです。

アプリケーションの途中で NFP ライブラリの終了処理を行わない限り、アプリケーションの起動から NFP ライブラリの関数を呼び出すまでに、一度だけ行います。

図 5-2. 初期化シーケンスのフロー図

初期化シーケンス Initialize() エラー発生 ResultInvalidOperation 初期化済みなので続行可能 ResultNeedRetry リトライ 成功 SetActivateEvent() SetDeactivateEvent() 初期化シーケンス完了

5.2. 終了シーケンス

NFP ライブラリの終了処理を行うシーケンスです。

アプリケーションで NFP ライブラリを使用する必要がなくなったときに行います。

図 5-3. 終了シーケンスのフロー図

終了シーケンス Finalize() 終了シーケンス完了

5.3. 共通エラーハンドリング

NFP ライブラリの関数を呼び出した際に、共通して返されるエラーをハンドリングするシーケンスの例です。

このシーケンス例でハンドリングしているエラーは、基本的にタグの検知開始からやり直す必要のあるエラーです。また、通信が完了するまで同じタグでタッチし続け、別のタグに入れ替わったときにはエラーが発生することを前提にしています。

無線オフモードであれば無線オンモードにすることでそのエラーが発生しなくなるように、エラーの原因をユーザーの手で取り除く方法がある場合は、ユーザーにその方法を通知してください。

図 5-4. 共通エラーハンドリングのフロー図

共通エラーハンドリング ステートは INIT? Y N StopDetection() 返り値は? ResultSleep スリープからの復帰を待ち受ける スリープからの復帰 処理をやり直す必要があることをユーザーに通知する ResultInvalidOperation エラーが発生したことをユーザーに通知する ResultWifiOff 無線オフモードであることをユーザーに通知する ResultTagNotFound タッチし続ける必要があることをユーザーに通知する タグ検知開始シーケンスへ

補足:

CTR 向けの NFC リーダー/ライターを利用する場合は、タグ検知開始シーケンスではなく、NFC リーダー/ライター接続シーケンスに進むようにしてください。

5.4. タグチェックシーケンス

オーナーの情報やアプリ専用領域の情報にはアクセスしないアプリケーションで、どのキャラクターの NFP タグがタッチされたかをチェックするシーケンスです。

図 5-5. タグチェックシーケンスのフロー図

タグチェックシーケンス StartDetection() エラー発生 ResultWifiOff ResultSleep ResultInvalidOperation 共通エラーハンドリングへ 成功 タグでタッチするように促す タグ発見通知を待ち受ける 通知を受け取った MountRom() エラー発生 ResultWifiOff ResultSleep ResultInvalidOperation ResultTagNotFound 共通エラーハンドリングへ ResultNotSupported 読み込めないタグであることをユーザーに通知する 成功 GetNfpRomInfo() エラー発生 ResultWifiOff ResultSleep ResultInvalidOperation ResultTagNotFound 共通エラーハンドリングへ 対応する characterId? Y N 対応していないタグであることをユーザーに通知する タグ喪失通知を待ち受ける タグ喪失通知を受け取った StopDetection() 対応しているタグであることをユーザーに通知する StopDetection() タグチェックシーケンス完了

5.5. タグ検知開始シーケンス

NFC モジュールによるタグの探索を開始し、ユーザーにタグのタッチを促すシーケンスです。

フローにはありませんが、必ずタグ発見通知の待ち受けをユーザーがキャンセルできるようにしてください。

図 5-6. タグ検知開始シーケンスのフロー図

タグ検知開始シーケンス StartDetection() エラー発生 ResultWifiOff ResultSleep ResultInvalidOperation 共通エラーハンドリングへ 成功 タグでタッチするように促す タグ発見通知を待ち受ける 通知を受け取った タグマウントシーケンスへ

5.6. タグ喪失通知待ち受けシーケンス

タグとの通信が完了したときや、処理対象のタグとは別のタグが検知されたときなど、タッチしているタグを NFC モジュールの通信可能範囲内から離す必要がある場合に行われるシーケンスです。

フロー図では引き続き別のタグを検知することを想定していますが、通信完了後にタグの検知を行わない場合はタグ喪失通知を待ち受ける必要はありません。

図 5-7. タグ喪失通知待ち受けシーケンスのフロー図

タグ喪失通知待ち受けシーケンス ステートは RW_MOUNT? Y N Unmount() タグを離す必要があることをユーザーに通知する タグ喪失通知を待ち受ける タグ喪失通知を受け取った ステートは INIT? Y N StopDetection() タグ検知開始シーケンスへ

5.7. タグマウントシーケンス

NFP ライブラリが検知したタグをマウントするシーケンスです。

フロー図では、エラーのために処理を再開する必要があった場合や前のシーンで読み込んでいたタグに書き込みを行う場合を想定し、マウントを行う前にタグ情報の取得を行って、タグの UID をチェックするようにしています。

処理でエラーが発生してもリトライが可能な場合の再試行数はフロー図で示した回数でなくてもかまいません。

図 5-8. タグマウントシーケンスのフロー図

タグマウントシーケンス GetTagInfo() エラー発生 ResultTagNotFound ResultWifiOff ResultSleep ResultInvalidOperation 共通エラーハンドリングへ 成功 UIDをチェックする? Y N 記録していたUIDと同じ? Y N 違うタグでタッチされていることをユーザーに通知する タグ喪失通知待ち受けシーケンスへ タグのUIDを記録しておく アクセス中はタグを離さないようにユーザーに通知する Mount() エラー発生 ResultTagNotFound ResultWifiOff ResultSleep ResultInvalidOperation 共通エラーハンドリングへ ResultNeedRetry 3回目のリトライ? Y N タッチし直す必要があることをユーザーに通知する ResultNotSupported 読み込めないタグであることをユーザーに通知する ResultNeedRestore 破損しているタグを復旧するかをユーザーに確認する タグを復旧する? Y N タグ復旧シーケンスへ ResultNeedFormat 「amiibo設定」でタグを初期化するかをユーザーに確認する タグを初期化する? Y N 「amiibo設定」起動シーケンスへ タグ喪失通知待ち受けシーケンスへ 成功 共用情報取得シーケンスへ

5.8. タグ復旧シーケンス

NFP タグが破損していたものの、アプリケーションで復旧可能な場合にタグを復旧するシーケンスです。以下のシーケンスを実装せず、 amiibo 設定を復旧モードで起動することでも NFP タグを復旧できます。

フロー図では、マウントを試みたあとにタグが離された場合や違うタグがタッチされた場合に備えて、タグの検知から再開するようにしています。

図 5-9. タグ復旧シーケンスのフロー図

タグ復旧シーケンス ステートは RW_ACTIVE? Y N StartDetection() エラー発生 ResultWifiOff ResultSleep ResultInvalidOperation 共通エラーハンドリングへ 成功 タグでタッチするように促す タグ発見通知を待ち受ける 通知を受け取った GetTagInfo() エラー発生 ResultTagNotFound ResultWifiOff ResultSleep ResultInvalidOperation 共通エラーハンドリングへ 成功 記録していたUIDと同じUID? Y N 違うタグでタッチされていることをユーザーに通知する StopDetection() タグ復旧シーケンスへ タグの復旧中であることをユーザーに通知する Restore() エラー発生 ResultTagNotFound ResultWifiOff ResultSleep ResultInvalidOperation 共通エラーハンドリングへ ResultNeedRetry 3回目のリトライ? Y N ResultOperationFailed タグの復旧に失敗したことをユーザーに通知する ResultNotSupported ResultNotBroken (別のタグ?) StopDetection() タグ復旧シーケンスへ 成功 タグを復旧したことをユーザーに通知する Unmount() StopDetection() タグ検知開始シーケンスへ

5.9. 「amiibo設定」起動シーケンス

NFP タグの初期化やアプリ専用領域の削除などを行うために、「amiibo設定」を起動するシーケンスです。

図 5-10. 「amiibo設定」起動シーケンスのフロー図

「amiibo設定」起動シーケンス Finalize() InitializeParameter() StartAmiiboSettings() 「amiibo設定」起動 「amiibo設定」からの復帰 初期化シーケンスへ

5.10. NFP タグへのアクセスを行う処理フロー

5.10.1. 共用情報取得シーケンス

NFP タグの共用領域に記録されている共用情報を取得するシーケンスです。

アプリケーションが対応するキャラクターの NFP タグであるかどうかを判定し、共用情報に記録されているキャラクターID(characterId)がアプリケーションで対応していないものである場合は、タッチされた NFP タグには対応していないことをユーザーに通知してください。

図 5-11. 共用情報取得シーケンスのフロー図

共用情報取得シーケンス GetNfpCommonInfo() エラー発生 ResultTagNotFound ResultWifiOff ResultSleep ResultInvalidOperation 共通エラーハンドリングへ 成功 対応する characterId? Y N 対応していないタグであることをユーザーに通知する タグ喪失通知待ち受けシーケンスへ 登録情報取得シーケンスへ

5.10.2. 登録情報取得シーケンス

NFP タグの共用領域に記録されている登録情報を取得するシーケンスです。

登録情報には、オーナーの Mii のデータや amiibo のニックネームが記録されています。

アプリケーションがオーナーの Mii のデータを必要とする場合、オーナー登録されていない NFP タグであることを検知したときには、「amiibo設定」でオーナー登録をするために、「amiibo設定」を起動するシーケンスに移ってください。

アプリケーションが amiibo のニックネームを必要とする場合、ニックネームが空の NFP タグであることを検知したときには、「amiibo設定」でニックネームを登録をするために、「amiibo設定」を起動するシーケンスに移ってください。

図 5-12. 登録情報取得シーケンスのフロー図

登録情報取得シーケンス GetNfpRegisterInfo() エラー発生 ResultNeedRegister 「amiibo設定」でオーナー登録する必要があることをユーザーに通知する 「amiibo設定」起動シーケンスへ ResultTagNotFound ResultWifiOff ResultSleep ResultInvalidOperation 共通エラーハンドリングへ ニックネームが空? Y N ニックネームは必須? Y N ニックネームを表示する? Y N ニックネームは推奨? Y N 「amiibo設定」でニックネームを登録するかをユーザーに確認する 「amiibo設定」でニックネームを登録する必要があることをユーザーに通知する ニックネームを設定する? Y N ニックネームの代替文字列を用意 アプリ専用領域にアクセスする? Y N アプリ専用領域アクセス開始シーケンスへ タグ喪失通知待ち受けシーケンスへ 「amiibo設定」起動シーケンスへ

5.10.3. アプリ専用領域アクセス開始シーケンス

マウントした NFP タグのアプリ専用領域に対するアクセスを開始するシーケンスです。

アプリ専用領域が NFP タグ内に作成されていない場合は、アプリ専用領域を作成するためにアプリ専用領域作成シーケンスへと遷移してください。

すでにアプリ専用領域が作成されていて、アプリ専用領域が作成されたときに指定されたアクセスID がアプリケーションのアクセスID と異なる場合は、そのままではアプリ専用領域の読み書きを行うことができません。「amiibo設定」でアプリ専用領域を削除する必要がありますので、ユーザーにその旨を通知して、「amiibo設定」を起動してください。

上記の通知を行うときには、アプリケーションがアプリ専用領域を利用した場合と利用しない場合の挙動の違いをユーザーに通知することを推奨します。また、アプリ専用領域を利用しなくてもゲームを続けることができるようにしてください。

図 5-13. アプリ専用領域アクセス開始シーケンスのフロー図

アプリ専用領域アクセス開始シーケンス OpenApplicationArea() エラー発生 ResultTagNotFound ResultWifiOff ResultSleep ResultInvalidOperation 共通エラーハンドリングへ ResultNeedCreate アプリ専用領域作成シーケンスへ ResultAccessIdMisMatch ほかのアプリケーションによって作成されたアプリ専用領域のため、アプリ専用領域をこのアプリケーション用にするには「amiibo設定」で削除する必要があることをユーザーに通知し、「amiibo設定」を起動するかをユーザーに確認する 「amiibo設定」を起動する? Y N 「amiibo設定」起動シーケンスへ アプリ専用領域を利用せずに処理を続けることをユーザーに通知する タグ喪失通知待ち受けシーケンスへ 読み込み? Y N アプリ専用領域読み込みシーケンスへ アプリ専用領域書き込みシーケンスへ

5.10.4. アプリ専用領域作成シーケンス

アプリ専用領域を作成するシーケンスです。

アプリ専用領域にデータを書き込むためにアプリ専用領域へのアクセスを開始した際にこのシーケンスへと遷移していた場合は、書き込もうとしていたデータを nn::nfp::InitializeCreateInfo() に渡す初期化データとすることで nn::nfp::CreateApplicationArea() が成功した時点で書き込みのシーケンスに遷移する必要はなくなります。

作成済みであることを nn::nfp::CreateApplicationArea() が返した場合はアプリ専用領域の内容が意図したものではない可能性があります。

処理でエラーが発生してもリトライが可能な場合の再試行数はフロー図で示した回数でなくてもかまいません。

図 5-14. アプリ専用領域作成シーケンスのフロー図

アプリ専用領域作成シーケンス InitializeCreateInfo() エラー発生 ResultInvalidOperation 共通エラーハンドリングへ 成功 書き込み中であることをユーザーに通知する CreateApplicationArea() エラー発生 ResultTagNotFound ResultWifiOff ResultSleep ResultInvalidOperation 共通エラーハンドリングへ ResultTimeoutError ResultNeedRetry 3回目のリトライ? Y N 書き込みをやり直す必要があることをユーザーに通知する ResultOperationFailed タグが破損した可能性があることをユーザーに通知する ResultNotSupported 違うタグでタッチされたことをユーザーに通知する ResultAlreadyCreated 読み込み? Y N アプリ専用領域書き込みシーケンスへ 書き込みが完了したことをユーザーに通知する タグ喪失通知待ち受けシーケンスへ

5.10.5. アプリ専用領域チェックシーケンス

書き込みを行う直前などにアプリ専用領域の整合性を確認するシーケンスです。

ゲームシーンの前後でアプリ専用領域の読み込みと書き込みを行うなど、アプリ専用領域の読み込みと書き込みとの間に時間がある場合は、以下のような行為で書き込みを行えなくなることがあるため、書き込みを行う前にアプリ専用領域の整合性を確認することを推奨します。

  • 別の NFP タグでタッチする
  • ほかの機器でアプリ専用領域を書き換える
  • 「amiibo設定」でアプリ専用領域を削除する

なお、下のフロー図は、NFP タグのマウントまでが正常に完了していることを前提にしています。

図 5-15. アプリ専用領域チェックシーケンスのフロー図

アプリ専用領域チェックシーケンス GetTagInfo() エラー発生 ResultTagNotFound ResultWifiOff ResultSleep ResultInvalidOperation チェック失敗 共通エラーハンドリングへ 成功 UIDのチェック OK NG チェック失敗 違うタグでタッチされている OpenApplicationArea() エラー発生 ResultTagNotFound ResultWifiOff ResultSleep ResultInvalidOperation チェック失敗 共通エラーハンドリングへ ResultNeedCreate チェック失敗 アプリ専用領域が未作成 ResultAccessIdMisMatch チェック失敗 ほかのアプリケーションが作成 ReadApplicationArea() エラー発生 ResultTagNotFound ResultWifiOff ResultSleep ResultInvalidOperation チェック失敗 共通エラーハンドリングへ 成功 整合性のチェック OK NG チェック失敗 データの整合性に問題あり チェック成功

5.10.6. アプリ専用領域読み込みシーケンス

アプリ専用領域の読み込みを行うシーケンスです。

図 5-16. アプリ専用領域読み込みシーケンスのフロー図

アプリ専用領域読み込みシーケンス ReadApplicationArea() エラー発生 ResultTagNotFound ResultWifiOff ResultSleep ResultInvalidOperation 共通エラーハンドリングへ 成功 タグ喪失通知待ち受けシーケンスへ

5.10.7. アプリ専用領域書き込みシーケンス

アプリ専用領域にデータを書き込むシーケンスです。

フロー図では、書き込みが完了したあとにタグが通信範囲外になることを待ち受けていますが、続けてタグの検知を再開しないのであれば nn::nfp::StopDetection() を呼び出し、次にタグ検知を再開するまでタグ検知を停止しておくことを推奨します。

処理でエラーが発生してもリトライが可能な場合の再試行数はフロー図で示した回数でなくてもかまいません。

図 5-17. アプリ専用領域書き込みシーケンスのフロー図

アプリ専用領域書き込みシーケンス 書き込み中であることをユーザーに通知する WriteApplicationArea() エラー発生 ResultWifiOff ResultSleep ResultInvalidOperation 共通エラーハンドリングへ ResultUidMisMatch 違うタグでタッチされたことをユーザーに通知する タグ喪失通知待ち受けシーケンスへ 成功 Flush() エラー発生 ResultTagNotFound ResultWifiOff ResultSleep ResultInvalidOperation 共通エラーハンドリングへ ResultNeedRetry 3回目のリトライ? Y N 書き込みをやり直す必要があることをユーザーに通知する ResultOperationFailed タグが破損した可能性があることをユーザーに通知する ResultNotSupported 違うタグでタッチされたことをユーザーに通知する 成功 書き込みが完了したことをユーザーに通知する タグ喪失通知待ち受けシーケンスへ

5.11. 3DS のアプリケーションで必要となる処理

3DS のアプリケーションでは、HOMEボタン、スリープ、電源ボタンといった 3DS の機能に対応した処理が必要になります。

5.11.1. HOMEメニュー遷移シーケンス

HOMEボタンが押されると HOMEメニューへの遷移がシステムから要求され、アプリケーションは HOMEメニューへの遷移を行うかどうかを判断しなければなりません。

まだ書き込まれていないデータがあるなど、すぐに HOMEメニューへ遷移することができない場合は、HOMEボタン禁止アイコンを表示して HOMEメニューへの遷移を拒否することができます。

HOMEメニューから起動されるアプレットが NFC 機能を使用できるようにするために、NFP ライブラリを終了する必要があります。

図 5-18. HOMEメニュー遷移シーケンスのフロー図

HOMEメニュー遷移シーケンス Flush で書き込むデータがある? Y N HOMEボタン禁止アイコンを表示 HOMEメニュー遷移シーケンス終了 ステートは INIT? Y N StopDetection() HOMEメニューへ遷移 HOMEメニューからの復帰 タグ検知開始シーケンスへ

5.11.2. スリープ遷移シーケンス

蓋を閉じる(FTR はスリープスイッチをスライドする)ことで、アプリケーションにスリープ状態への遷移が要求され、アプリケーションはスリープ状態への遷移を承諾するかどうかを判断しなければなりません。

まだ書き込まれていないデータがあるなど、すぐにスリープ状態へ遷移することができない場合は、スリープ状態への遷移が可能になるまで要求への回答を保留して処理を続行することができます。アプリケーションがスリープ状態への遷移を承諾すると、システムによってタグの検知やマウントが自動的に解除されるため、スリープ状態から復帰した後は再びタグ検知開始シーケンスから始める必要があります。

図 5-19. スリープ遷移シーケンスのフロー図

スリープ遷移シーケンス スリープ状態への遷移を保留する ステートは RW_MOUNT? Y N Flush で書き込むデータがある? Y N Flush() Unmount() ステートは INIT? Y N StopDetection() スリープ状態への遷移を承諾する スリープ状態からの復帰 タグ検知開始シーケンスへ

5.11.3. 電源断シーケンス

POWER ボタンが押されると電源メニューへの遷移がシステムから要求され、通常すぐにアプリケーションの終了処理を行わなければなりません。

まだ書き込まれていないデータがある場合は、アプリケーションに与えられた終了処理時間中に処理を完了できるならば、書き込み処理を続行することができます。

また、電源メニューを表示する前に NFP ライブラリを終了する必要があります。

図 5-20. 電源断シーケンスのフロー図

電源断シーケンス ステートは RW_MOUNT? Y N Flush で書き込むデータがある? Y N Flush() Unmount() ステートは INIT? Y N StopDetection() Finalize() アプリケーション終了

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 になっていないか、確認する必要があることに気をつけてください。 

図 5-21. NFCリーダー/ライター接続シーケンスのフロー図