AM Daemon ライブラリリファレンス
JvsSwitchInput.h
[詳解]
1 /// @file
2 /// @brief JVSスイッチ入力情報を提供するクラス JvsSwitchInput のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_JVSSWITCHINPUT_H
7 #define AMDAEMON_JVSSWITCHINPUT_H
8 
9 #include "amdaemon/env.h"
11 
12 #include <vector>
13 #include <cstdint>
14 #include <cstddef>
15 
16 namespace amdaemon
17 {
18 /// @addtogroup g_jvs
19 /// @{
20 
21  // 内部クラスの前方宣言
22  class InnerIndexHolder;
23 
24  /// @brief JVSスイッチ入力情報を提供するクラス。
25  /// @see Jvs, JvsNode
26  ///
27  /// このクラスのインスタンスをアプリ側で直接生成することはできない。
28  /// JvsNode クラスのメンバ関数 JvsNode#getSwitchInput から取得すること。
30  {
31  public:
32  /// システムスイッチ入力の最大数。
33  static const std::size_t MaxSystemBitCount = 8;
34 
35  /// プレイヤー単位スイッチ入力の最大数。
36  static const std::size_t MaxPlayerBitCount = 64;
37 
38  public:
39  /// @brief コンストラクタ。
40  /// @note アプリ側からは利用できない。
41  explicit JvsSwitchInput(InnerIndexHolder);
42 
43  // 下記は暗黙の定義を用いる。
44  //‾JvsSwitchInput() = default;
45 
46  /// @brief システムスイッチの入力状態ビット列を取得する。
47  /// @return システムスイッチの入力状態ビット列。
48  ///
49  /// スイッチ入力がON状態の場合、対応するビットは 1 になる。
50  /// それ以外の場合、対応するビットは 0 となる。
51  /// 各ビットがどのボタンに対応しているかはデバイス依存である。
52  ///
53  /// iostream との親和性のために戻り値の型を std::uint16_t としているが、
54  /// 実際に値が入るのは最大でも下位 #MaxSystemBitCount ビットまでとなる。
55  ///
56  /// ビット演算を行いたくない場合、メンバ関数 #isSystemOn で各ビットの
57  /// 状態を個別に取得するか、 std::bitset クラスで戻り値をラップするとよい。
58  ///
59  /// @code
60  /// amdaemon::Jvs jvs;
61  ///
62  /// // メンバ関数 getSystemBits の戻り値を bitset に変換
63  /// // std::bitset<sizeof(std::uint16_t) * 8> 型の値が返る
64  /// auto bits =
65  /// amdaemon::util::toBitset(
66  /// jvs.getNode(0).getSwitchInput().getSystemBits());
67  /// @endcode
68  std::uint16_t getSystemBits() const;
69 
70  /// @brief システムスイッチの入力状態を取得する。
71  /// @param[in] bitIndex ビットインデックス。
72  /// @retval true スイッチ入力がON状態である場合。
73  /// @retval false スイッチ入力がOFF状態である場合。
74  ///
75  /// @exception Exception
76  /// 引数 bitIndex に #MaxSystemBitCount 以上の値を指定した場合。
77  bool isSystemOn(std::size_t bitIndex) const;
78 
79  /// @brief プレイヤー数を取得する。
80  /// @return プレイヤー数。
81  ///
82  /// このプレイヤー数はJVS規格のスイッチ入力におけるプレイヤー数であり、
83  /// Core#getPlayerCount で取得できるプレイヤー数とは異なる。
84  std::size_t getPlayerCount() const;
85 
86  /// @brief プレイヤー単位スイッチの入力状態ビット列を取得する。
87  /// @param[in] playerIndex プレイヤーインデックス。
88  /// @return プレイヤー単位スイッチの入力状態ビット列。
89  ///
90  /// @exception Exception
91  /// 引数 playerIndex にプレイヤー数以上の値を指定した場合。
92  /// プレイヤー数はメンバ関数 #getPlayerCount で取得できる。
93  ///
94  /// スイッチ入力がON状態の場合、対応するビットは 1 になる。
95  /// それ以外の場合、対応するビットは 0 となる。
96  /// 各ビットがどのボタンに対応しているかはデバイス依存である。
97  ///
98  /// ビット演算を行いたくない場合、メンバ関数 #isPlayerOn で各ビットの
99  /// 状態を個別に取得するか、 std::bitset クラスで戻り値をラップするとよい。
100  ///
101  /// @code
102  /// amdaemon::Jvs jvs;
103  ///
104  /// // メンバ関数 getPlayerBits の戻り値を bitset に変換
105  /// // std::bitset<sizeof(std::uint64_t) * 8> 型の値が返る
106  /// auto bits =
107  /// amdaemon::util::toBitset(
108  /// jvs.getNode(0).getSwitchInput().getPlayerBits(0));
109  /// @endcode
110  std::uint64_t getPlayerBits(std::size_t playerIndex) const;
111 
112  /// @brief プレイヤー単位スイッチの入力状態を取得する。
113  /// @param[in] playerIndex プレイヤーインデックス。
114  /// @param[in] bitIndex ビットインデックス。
115  /// @retval true スイッチ入力がON状態である場合。
116  /// @retval false スイッチ入力がOFF状態である場合。
117  ///
118  /// @exception Exception
119  /// - 引数 playerIndex にプレイヤー数以上の値を指定した。
120  /// プレイヤー数はメンバ関数 #getPlayerCount で取得できる。
121  /// - 引数 bitIndex に #MaxPlayerBitCount 以上の値を指定した。
122  bool isPlayerOn(std::size_t playerIndex, std::size_t bitIndex) const;
123 
124  /// @brief プレイヤー単位スイッチの入力状態ビット列配列を取得する。
125  /// @return プレイヤー単位スイッチの入力状態ビット列配列。
126  ///
127  /// 範囲for文や各種アルゴリズム関数に渡すことを想定している。
128  ///
129  /// - プレイヤー数を知りたいだけならばメンバ関数 #getPlayerCount を用いること。
130  /// - 特定プレイヤーのスイッチ入力状態ビット列を取得したいだけならばメンバ関数
131  /// #getPlayerBits を用いること。
132  std::vector<std::uint64_t> getPlayersBits() const
133  {
134  return
135  ::amdaemon::util::toContainer<decltype(getPlayersBits())>(
136  getPlayerCount(),
137  [this](std::size_t i) { return getPlayerBits(i); });
138  }
139 
140  private:
141  std::size_t _nodeIndex; ///< ノードインデックス。
142 
143  private:
144  // コピー禁止
145  JvsSwitchInput(const JvsSwitchInput&); // 宣言のみ
146  JvsSwitchInput& operator=(const JvsSwitchInput&); // 宣言のみ
147  };
148 
149 /// @}
150 } // namespace amdaemon
151 
152 #endif // AMDAEMON_JVSSWITCHINPUT_H
static const std::size_t MaxSystemBitCount
システムスイッチ入力の最大数。
Definition: JvsSwitchInput.h:33
std::uint16_t getSystemBits() const
システムスイッチの入力状態ビット列を取得する。
static const std::size_t MaxPlayerBitCount
プレイヤー単位スイッチ入力の最大数。
Definition: JvsSwitchInput.h:36
Daemonライブラリの環境定義を行うヘッダ。
bool isSystemOn(std::size_t bitIndex) const
システムスイッチの入力状態を取得する。
std::size_t getPlayerCount() const
プレイヤー数を取得する。
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
std::uint64_t getPlayerBits(std::size_t playerIndex) const
プレイヤー単位スイッチの入力状態ビット列を取得する。
コンテナクラス関連の便利処理を提供するヘッダ。
JVSスイッチ入力情報を提供するクラス。
Definition: JvsSwitchInput.h:29
bool isPlayerOn(std::size_t playerIndex, std::size_t bitIndex) const
プレイヤー単位スイッチの入力状態を取得する。
std::vector< std::uint64_t > getPlayersBits() const
プレイヤー単位スイッチの入力状態ビット列配列を取得する。
Definition: JvsSwitchInput.h:132
JvsSwitchInput(InnerIndexHolder)
コンストラクタ。