AM Daemon ライブラリリファレンス
AimeUnit.h
[詳解]
1 /// @file
2 /// @brief Aimeリーダー単体の処理を提供するクラス AimeUnit のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_AIMEUNIT_H
7 #define AMDAEMON_AIMEUNIT_H
8 
9 #include "amdaemon/env.h"
10 #include "amdaemon/AimeResult.h"
11 #include "amdaemon/AimeErrorInfo.h"
12 #include "amdaemon/AimeCommand.h"
13 #include "amdaemon/AimeConfirm.h"
14 #include "amdaemon/AimeLedStatus.h"
15 #include "amdaemon/deprecated.h"
16 
17 #include <cstddef>
18 
19 namespace amdaemon
20 {
21 /// @addtogroup g_aime
22 /// @{
23 
24  // 内部クラスの前方宣言
25  class InnerIndexHolder;
26 
27  /// @brief Aimeリーダー単体の処理を提供するクラス。
28  /// @see Aime
29  ///
30  /// このクラスのインスタンスをアプリ側で直接生成することはできない。
31  /// Aime クラスのメンバ関数 Aime#getUnit から取得すること。
32  ///
33  /// 一部の関数は処理完了まで呼び出し元スレッドをブロックする。
34  ///
35  /// @par UID値読み取り手順
36  /// -# メンバ関数 #start を、引数に AimeCommand::Scan を渡して呼び出す。
37  /// -# 下記のいずれかの状態になるまで待機する。
38  /// - メンバ関数 #hasConfirm が true を返す。
39  /// - メンバ関数 #isBusy が false を返す。
40  /// -# メンバ関数 #hasConfirm が true を返す場合はプレイヤーへの要確認事項がある。
41  /// - メンバ関数 #getConfirm で内容を確認し、アプリ側で適切な確認表示を行う。
42  /// - プレイヤーが承諾した場合はメンバ関数 #acceptConfirm を呼び出し、再び待機する。
43  /// - プレイヤーが拒否した場合はメンバ関数 #cancel を呼び出し、処理を中断する。
44  /// -# メンバ関数 #isBusy が false を返す場合は処理が完了している。
45  /// -# メンバ関数 #hasError が true を返す場合はエラーが発生している。
46  /// メンバ関数 #getErrorInfo でエラー情報を取得し、アプリ側で適切に処理する。
47  /// -# メンバ関数 #getResult で結果情報を得る。
48  /// 処理に成功していれば getResult().getAimeId() によってUID値を取得できる。
49  ///
50  /// @par ポーリング処理途中の結果情報取得
51  /// メンバ関数 #start 呼び出しによるポーリング処理途中であっても、
52  /// 内部フェーズの進行により下記のように情報が取得可能になる。
53  /// @par
54  /// - hasResult() == true である場合(即ち getResult().valid() == true である場合)、
55  /// getResult().isReaderDetected() の値は有効である。
56  /// - getResult().getOfflineId().valid() == true である場合、
57  /// getResult().getOfflineId(), getResult().isMobile() の値は有効である。
58  /// - getResult().getAccessCode().valid() == true である場合、
59  /// getResult().getAccessCode() の値は有効である。
60  /// - getResult().getAimeId().valid() == true である場合、
61  /// getResult().getAimeId(), getResult().isPortalRegistered(),
62  /// getResult().isSegaIdRegistered() の値は有効である。
63  /// @par
64  /// エラーが発生した場合も、エラー発生手前までの情報は取得可能である。
65  ///
66  /// @par Daemonプロセス初期化時のAimeリーダー接続チェック
67  /// - Daemonプロセスの初期化時、Aimeリーダーの接続チェックが自動的に開始される。
68  /// - 初期化時とは、Daemonプロセス起動時と、ゲームテストモード終了時を指す。
69  /// ゲームテストモード状態の設定は Sequence クラスで行う。
70  /// - 接続チェックが完了すると hasResult() == true となり、
71  /// getResult().isReaderDetected() によってチェック結果を取得できる。
72  /// - 通常の初期化時は即座に接続チェックが開始されるが、
73  /// Aimeリーダーのファームウェア更新処理が必要な場合はそちらが優先され、
74  /// ファームウェア更新処理が完了してから接続チェックが行われる。
75  /// - ファームウェア更新処理中であるか否かは Aime クラスのメンバ関数
76  /// Aime#isFirmUpdating で判別できる。
77  ///
78  /// @par LED点灯処理
79  /// - 通常シーケンスでの明示的なLED点灯処理にはメンバ関数 #setLedStatus を用いること。
80  /// - ゲームテストモードでのLED点灯確認処理にはメンバ関数 #setLed を用いること。
81  /// - Daemonプロセスは下記のLED点灯処理を自動で行う。
82  /// - ポーリング処理によってAimeリーダーの接続が確認できた時、
83  /// @ref #setLedStatus "setLedStatus"(AimeLedStatus::Scanning)
84  /// 相当のLED白点灯処理を行う。
85  /// - ポーリング処理中にエラーが発生し、そのエラーカテゴリが
86  /// AimeErrorCategory::Warning である場合、
87  /// @ref #setLedStatus "setLedStatus"(AimeLedStatus::Error)
88  /// 相当のLED赤点灯処理を行う。
89  /// - 上記以外のLED自動点灯処理は一切行わない。
90  /// - たとえ読み取りに成功した場合であっても、ゲーム固有サーバとの通信成否等によって
91  /// 点灯させるべきLED色が異なるため、自動化することができない。
92  /// - 基本的にはAime作成基準に準拠し、例えば下記のように実装すること。
93  /// - 次の場合は @ref #setLedStatus "setLedStatus"(AimeLedStatus::Success) を呼び出す。
94  /// - 読み取り成功し、各種ネットワークサービスも正常に受けられる場合。
95  /// - 次の場合は @ref #setLedStatus "setLedStatus"(AimeLedStatus::Warning) を呼び出す。
96  /// - 読み取り成功したが、一部ネットワークサービスを受けられない状態の場合。
97  /// - 読み取り失敗したが、 AimeOfflineId を用いたオフラインプレイを行える場合。
98  /// - 次の場合は @ref #setLedStatus "setLedStatus"(AimeLedStatus::Error) を呼び出す。
99  /// - 読み取り失敗し、黄点灯および自動赤点灯の条件を満たさない場合。
100  /// - 上記のLED点灯処理が完了してから続けてポーリング処理等を行いたい場合、
101  /// メンバ関数 #getLedStatus で現在のLED点灯ステータスを毎フレーム確認し、
102  /// ステータスが AimeLedStatus::None に戻るまで待機すること。
103  class AimeUnit
104  {
105  public:
106  /// @brief コンストラクタ。
107  /// @note アプリ側からは利用できない。
108  explicit AimeUnit(InnerIndexHolder);
109 
110  // 下記は暗黙の定義を用いる。
111  //‾AimeUnit() = default;
112 
113  public:
114  // ポーリング
115 
116  /// @brief ポーリング処理を開始する。
117  /// @param[in] command ポーリング処理コマンド。
118  /// @retval true 正常にポーリング開始できた場合。
119  /// @retval false ポーリング開始できなかった場合。
120  ///
121  /// @exception Exception
122  /// 引数 command に不正な値を指定した場合。
123  ///
124  /// 下記のいずれかを満たす場合、この関数は即座に false を返す。
125  ///
126  /// - 既にポーリング処理中または中断処理中である場合。
127  /// 即ちメンバ関数 #isBusy が true を返す場合。
128  /// - ファームウェア更新処理中である場合。
129  /// 即ち Aime クラスのメンバ関数 Aime#isFirmUpdating が true を返す場合。
130  ///
131  /// Daemonプロセスがポーリング開始するまで呼び出し元スレッドをブロックする。
132  ///
133  /// 正常にポーリング開始された場合、開始直後は下記のようになる。
134  ///
135  /// - メンバ関数 #isBusy は true を返す。
136  /// - メンバ関数 #hasError は false を返す。
137  /// - メンバ関数 #hasResult は false を返す。
138  ///
139  /// ポーリングが進むことでこれらのメンバ関数が返す値は変化する。
140  /// 詳細は各メンバ関数の説明を参照すること。
141  bool start(AimeCommand command);
142 
143  /// @brief ポーリング処理の中断を開始する。
144  /// @retval true 正常に中断開始できた場合。
145  /// @retval false 中断開始できなかった場合。
146  ///
147  /// この関数は中断開始するのみであり、呼び出しただけでは中断完了しない。
148  /// メンバ関数 #isBusy が false を返すようになって初めて中断完了となる。
149  ///
150  /// 下記のいずれかを満たす場合、この関数は即座に false を返す。
151  ///
152  /// - ポーリング処理中ではない場合。
153  /// 即ちメンバ関数 #isBusy が false を返す場合。
154  /// - ファームウェア更新の実処理中である場合。
155  /// 即ち Aime クラスのメンバ関数 Aime#isFirmUpdating が true を返す場合。
156  ///
157  /// 中断開始済みかつ中断未完了の状態でこの関数を呼び出した場合、
158  /// この関数は true を返すが、内部的には何も行われない。
159  ///
160  /// Daemonプロセスが処理完了するまで呼び出し元スレッドをブロックする。
161  bool cancel();
162 
163  /// @brief ポーリング処理中または中断処理中であるか否かを取得する。
164  /// @retval true ポーリング処理中または中断処理中である場合。
165  /// @retval false ポーリング処理中でも中断処理中でもない場合。
166  ///
167  /// ポーリング処理中であっても各メンバ関数が返す値は変化する場合がある。
168  /// 詳細は各メンバ関数の説明を参照すること。
169  bool isBusy() const;
170 
171  /// @brief ポーリング処理中または中断処理中の処理コマンドを取得する。
172  /// @return ポーリング処理中または中断処理中の処理コマンド。
173  /// @see isBusy
174  ///
175  /// ポーリング処理中または中断処理中ではない場合、この関数は不定値を返す。
176  AimeCommand getBusyCommand() const;
177 
178  /// @brief Aime登録に関する要確認事項が存在するか否かを取得する。
179  /// @retval true 要確認事項が存在する場合。
180  /// @retval false 要確認事項が存在しない場合。
181  ///
182  /// 条件式 (getConfirm() != AimeConfirm::None) の結果を返す。
183  ///
184  /// メンバ関数 #start を AimeCommand::Scan を引数として呼び出した後、
185  /// そのポーリング処理中にこの関数が true を返す場合がある。
186  ///
187  /// リーダーにかざされたAimeがFeliCaDBやAimeDBに未登録である場合、
188  /// それらのDBへ登録して構わないかプレイヤーに確認を取る必要がある。
189  /// そういった要確認事項が発生した場合にこの関数が true を返す。
190  ///
191  /// 具体的な確認事項はメンバ関数 #getConfirm で取得できる。
192  bool hasConfirm() const
193  {
194  return (getConfirm() != AimeConfirm::None);
195  }
196 
197  /// @brief Aime登録に関する要確認事項を取得する。
198  /// @return Aime登録に関する要確認事項。存在しない場合は AimeConfirm::None 。
199  ///
200  /// メンバ関数 #hasConfirm が true を返す場合、この関数によって具体的な
201  /// 確認事項を取得し、アプリ側で適切な確認画面表示を行う。
202  ///
203  /// その結果、確認事項が承諾された場合はメンバ関数 #acceptConfirm を呼び出して
204  /// ポーリング処理を継続すること。
205  /// 拒否された場合はメンバ関数 #cancel を呼び出してポーリング処理を中断すること。
206  AimeConfirm getConfirm() const;
207 
208  /// @brief Aime登録に関する要確認事項が承諾されたことを通知する。
209  /// @retval true 正常に通知できた場合。
210  /// @retval false 通知できなかった場合。
211  ///
212  /// メンバ関数 #getConfirm によって取得できる要確認事項に対し、
213  /// プレイヤーがその内容を承諾した場合にこの関数を呼び出すこと。
214  /// この関数を呼び出すことでポーリング処理が継続される。
215  ///
216  /// 要確認事項が存在しない場合は即座に false を返す。
217  ///
218  /// Daemonプロセスが通知を受理するまで呼び出し元スレッドをブロックする。
219  bool acceptConfirm();
220 
221  /// @brief ポーリング処理の結果が存在するか否かを取得する。
222  /// @retval true ポーリング処理の結果が存在する場合。
223  /// @retval false ポーリング処理の結果が存在しない場合。
224  ///
225  /// getResult().valid() を返す。
226  ///
227  /// ポーリング処理中であっても、途中経過として結果が設定される場合がある。
228  /// そのため、この関数の戻り値でポーリング処理の完了判定を行ってはならない。
229  /// ポーリング処理の完了判定はメンバ関数 #isBusy で行うこと。
230  bool hasResult() const
231  {
232  return getResult().valid();
233  }
234 
235  /// @brief ポーリング処理の結果を取得する。
236  /// @return ポーリング処理の結果。
237  ///
238  /// メンバ関数 #start 呼び出しによるポーリング処理中であっても、
239  /// 内部的なフェーズ完了ごとに情報が更新される。
240  /// 例えば AimeCommand::Scan を引数としてメンバ関数 #start を呼び出した場合、
241  /// 下記のタイミングで情報が更新される。
242  ///
243  /// - Aimeリーダーの接続確認が完了した時。
244  /// - オフラインID情報(アクセスコードまたはFeliCaID)の取得が完了した時。
245  ///
246  /// メンバ関数 #isBusy が false を返す場合、この関数も最終的な結果を返す。
247  ///
248  /// また、ポーリング処理中にエラーが発生した場合や中断された場合であっても、
249  /// 成功済みの内部フェーズ分の情報は取得可能である。
250  const AimeResult& getResult() const
251  {
252  return _result;
253  }
254 
255  /// @brief ポーリング処理中にエラーが発生したか否かを取得する。
256  /// @retval true エラーが発生した場合。
257  /// @retval false エラーが発生していない場合。
258  ///
259  /// getErrorInfo().isOccurred() を返す。
260  bool hasError() const
261  {
262  return getErrorInfo().isOccurred();
263  }
264 
265  /// @brief ポーリング処理中に発生したエラー情報を取得する。
266  /// @return エラー情報。
268  {
269  return _errorInfo;
270  }
271 
272  public:
273  // LED制御
274 
275  /// @brief 現在のLED点灯ステータスを取得する。
276  /// @return 現在のLED点灯ステータス。
277  ///
278  /// メンバ関数 #setLedStatus で設定したか、
279  /// もしくはDaemonプロセスが自動で設定したLED点灯ステータスを取得できる。
280  ///
281  /// AimeLedStatus::Scanning 以外の点灯ステータスは、一定時間点灯後に自動で消灯して
282  /// AimeLedStatus::None を返すようになる。
283  /// そのため、LEDが自動消灯するまで待機するためにこの関数を利用することもできる。
284  AimeLedStatus getLedStatus() const;
285 
286  /// @brief LED点灯ステータスを設定する。
287  /// @param[in] status 要求するLED点灯ステータス。
288  /// @retval true 正常に処理要求できた場合。
289  /// @retval false 処理要求に失敗した場合。
290  ///
291  /// @exception Exception
292  /// 引数 status に不正な値を指定した場合。
293  ///
294  /// LED点灯処理の詳細は、当クラスの説明およびAime作成基準を参照すること。
295  ///
296  /// 引数 status に AimeLedStatus::Scanning 以外の点灯ステータスを渡した場合、
297  /// 一定時間点灯後にDaemonプロセスが自動で消灯処理を行い、点灯ステータスを
298  /// AimeLedStatus::None に移行させる。
299  /// そのため明示的に消灯処理を行う必要はない。
300  ///
301  /// ファームウェア更新処理中である場合、この関数は即座に false を返す。
302  /// 更新処理中であるか否かは Aime クラスのメンバ関数
303  /// Aime#isFirmUpdating で取得できる。
304  ///
305  /// Daemonプロセスが処理完了するまで呼び出し元スレッドをブロックする。
306  bool setLedStatus(AimeLedStatus status);
307 
308  /// @brief LEDの点灯状態をRGB別に設定する。
309  /// @param[in] onR 赤成分を点灯させるならば true 。
310  /// @param[in] onG 緑成分を点灯させるならば true 。
311  /// @param[in] onB 青成分を点灯させるならば true 。
312  /// @retval true 正常に点灯させることができた場合。
313  /// @retval false 処理に失敗した場合。
314  /// @note ゲームテストモード用。
315  ///
316  /// この関数はゲームテストモードでのLED点灯確認処理のために用意されている。
317  /// 通常シーケンスではこちらではなくメンバ関数 #setLedStatus を用いること。
318  ///
319  /// この関数が成功すると、LED点灯ステータスは AimeLedStatus::None となる。
320  ///
321  /// ファームウェア更新処理中である場合、この関数は即座に false を返す。
322  /// 更新処理中であるか否かは Aime クラスのメンバ関数
323  /// Aime#isFirmUpdating で取得できる。
324  ///
325  /// Daemonプロセスが処理完了するまで呼び出し元スレッドをブロックする。
326  bool setLed(bool onR, bool onG, bool onB);
327 
328  private:
329  std::size_t _unitIndex; ///< ユニットインデックス。
330  AimeResult _result; ///< ポーリング結果。
331  AimeErrorInfo _errorInfo; ///< ポーリングエラー情報。
332 
333  private:
334  // コピー禁止
335  AimeUnit(const AimeUnit&); // 宣言のみ
336  AimeUnit& operator=(const AimeUnit&); // 宣言のみ
337  };
338 
339 /// @}
340 } // namespace amdaemon
341 
342 #endif // AMDAEMON_AIMEUNIT_H
bool start(AimeCommand command)
ポーリング処理を開始する。
確認事項なし。
bool hasResult() const
ポーリング処理の結果が存在するか否かを取得する。
Definition: AimeUnit.h:230
AimeLedStatus getLedStatus() const
現在のLED点灯ステータスを取得する。
AimeConfirm getConfirm() const
Aime登録に関する要確認事項を取得する。
bool cancel()
ポーリング処理の中断を開始する。
const AimeErrorInfo & getErrorInfo() const
ポーリング処理中に発生したエラー情報を取得する。
Definition: AimeUnit.h:267
非推奨機能であることを示す AMDAEMON_DEPRECATED マクロを定義するヘッダ。
初期化処理やポーリング処理によって取得したAime関連情報を保持するクラス AimeResult のヘッダ。 ...
初期化処理やポーリング処理によって取得したAime関連情報を保持するクラス。
Definition: AimeResult.h:32
Daemonライブラリの環境定義を行うヘッダ。
AimeのLED点灯ステータス列挙 AimeLedStatus のヘッダ。
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
AimeUnit(InnerIndexHolder)
コンストラクタ。
AimeCommand getBusyCommand() const
ポーリング処理中または中断処理中の処理コマンドを取得する。
bool acceptConfirm()
Aime登録に関する要確認事項が承諾されたことを通知する。
bool setLed(bool onR, bool onG, bool onB)
LEDの点灯状態をRGB別に設定する。
Aimeポーリング処理コマンド列挙 AimeCommand のヘッダ。
Aime関連エラー情報を提供するクラス。
Definition: AimeErrorInfo.h:29
bool isBusy() const
ポーリング処理中または中断処理中であるか否かを取得する。
bool setLedStatus(AimeLedStatus status)
LED点灯ステータスを設定する。
AimeConfirm
Aime登録に関する要確認事項種別列挙。
Definition: AimeConfirm.h:17
bool hasError() const
ポーリング処理中にエラーが発生したか否かを取得する。
Definition: AimeUnit.h:260
bool isOccurred() const override
エラーが発生しているか否かを取得する。
Definition: AimeErrorInfo.h:55
Aime登録に関する要確認事項種別列挙 AimeConfirm のヘッダ。
AimeCommand
Aimeポーリング処理コマンド列挙。
Definition: AimeCommand.h:17
bool valid() const
有効な情報が保持されているか否かを取得する。
bool hasConfirm() const
Aime登録に関する要確認事項が存在するか否かを取得する。
Definition: AimeUnit.h:192
const AimeResult & getResult() const
ポーリング処理の結果を取得する。
Definition: AimeUnit.h:250
AimeLedStatus
AimeのLED点灯ステータス列挙。
Definition: AimeLedStatus.h:19
Aime関連エラー情報を提供するクラス AimeErrorInfo のヘッダ。
Aimeリーダー単体の処理を提供するクラス。
Definition: AimeUnit.h:103