AM Daemon ライブラリリファレンス
UsbIOUniqueOutput.h
[詳解]
1 /// @file
2 /// @brief USB I/O のユニーク出力処理を行うクラス UsbIOUniqueOutput のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_USBIOUNIQUEOUTPUT_H
7 #define AMDAEMON_USBIOUNIQUEOUTPUT_H
8 
9 #include "amdaemon/env.h"
10 #include "amdaemon/RequestState.h"
11 #include "amdaemon/util/traits.h"
12 
13 #include <algorithm>
14 #include <type_traits>
15 #include <vector>
16 #include <cstdint>
17 #include <cstddef>
18 
19 namespace amdaemon
20 {
21 /// @addtogroup g_usbio
22 /// @{
23 
24  // 内部クラスの前方宣言
25  class InnerIndexHolder;
26 
27  /// @brief USB I/O のユニーク出力処理を行うクラス。
28  /// @see UsbIO, UsbIONode
29  ///
30  /// このクラスのインスタンスをアプリ側で直接生成することはできない。
31  /// UsbIONode クラスのメンバ関数 UsbIONode#getUniqueOutput から取得すること。
32  ///
33  /// ユニークコマンドによる USB I/O のインタラプト出力を行う。
34  /// Daemonプロセスの設定ファイルで指定した命令コードのみがサポートされる。
36  {
37  public:
38  /// 最大データサイズ。
39  static const std::size_t MaxDataSize = 62;
40 
41  public:
42  /// @brief コンストラクタ。
43  /// @note アプリ側からは利用できない。
44  explicit UsbIOUniqueOutput(InnerIndexHolder);
45 
46  // 下記は暗黙の定義を用いる。
47  //‾UsbIOUniqueOutput();
48 
49  /// @brief 指定した命令コードがサポートされているか否かを取得する。
50  /// @param[in] command 命令コード。
51  /// @retval true サポートされている場合。
52  /// @retval false サポートされていない場合。
53  ///
54  /// Daemonプロセスの設定ファイルで指定した命令コードであれば true を返す。
55  bool isSupported(std::uint8_t command) const;
56 
57  /// @brief ユニークコマンドの出力値を設定する。
58  /// @param[in] command 命令コード。
59  /// @param[in] data 出力データ。不要ならば nullptr を指定可能。
60  /// @param[in] dataSize 出力データサイズ。 #MaxDataSize 以下。データが不要ならば 0 。
61  /// @return 要求状態値。
62  ///
63  /// @exception Exception
64  /// - 引数 command にサポートされていない命令コードを指定した場合。
65  /// - 引数 data に nullptr を指定した上で引数 dataSize に 0 以外の値を指定した場合。
66  /// - 引数 dataSize に #MaxDataSize より大きい値を指定した場合。
67  ///
68  /// この関数を呼び出しても即座に出力されるわけではない。
69  /// 反映状況は戻り値の要求状態値で確認できる。
70  ///
71  /// この関数を同一フレーム内で複数回呼びだした場合、
72  /// 最後の呼び出し時に指定した値のみが実際の更新要求に使われる。
73  RequestState set(std::uint8_t command, const void* data, std::size_t dataSize);
74 
75  /// @brief ユニークコマンドの出力値を設定する。
76  /// @param[in] command 命令コード。
77  /// @param[in] data 出力データ。
78  /// @param[in] dataSize
79  /// 出力データサイズ。既定値は SIZE_MAX (std::size_t 型の最大値)。
80  /// この値と data.size() のうち小さい方の値が実際のサイズとして利用される。
81  /// @return 要求状態値。
82  ///
83  /// @exception Exception
84  /// - 引数 command にサポートされていない命令コードを指定した場合。
85  /// - 引数 dataSize に #MaxDataSize より大きい値を指定し、
86  /// かつ引数 data の要素数も #MaxDataSize より大きい場合。
87  ///
88  /// 出力データを可変長配列型で指定するオーバロード。
89  /// 挙動は
90  /// set(std::uint8_t, const void*, std::size_t)
91  /// オーバロードに準ずる。
93  std::uint8_t command,
94  const std::vector<std::uint8_t>& data,
95  std::size_t dataSize = SIZE_MAX)
96  {
97  return this->set(command, data.data(), std::min(dataSize, data.size()));
98  }
99 
100  /// @brief ユニークコマンドの出力値を設定する。
101  /// @tparam Data 出力データ型。後述の要件を満たす型でなければならない。
102  /// @param[in] command 命令コード。
103  /// @param[in] data 出力データ。
104  /// @param[in] dataSize
105  /// 出力データサイズ。既定値は sizeof(Data) 。
106  /// この値と sizeof(data) のうち小さい方の値が実際のサイズとして利用される。
107  /// @return 要求状態値。
108  ///
109  /// @exception Exception
110  /// - 引数 command にサポートされていない命令コードを指定した場合。
111  /// - 引数 dataSize に #MaxDataSize より大きい値を指定し、
112  /// かつ sizeof(data) も #MaxDataSize より大きい場合。
113  ///
114  /// 出力データを任意のデータ型(固定長配列等)で指定するオーバロード。
115  /// 挙動は
116  /// set(std::uint8_t, const void*, std::size_t)
117  /// オーバロードに準ずる。
118  ///
119  /// 型 Data から参照性を取り除いた型(例えば型 Data が int& ならば int)は
120  /// 下記の要件をすべて満たす必要がある。
121  ///
122  /// - オブジェクト型(スカラ型、配列、クラス&構造体、共用体のいずれか)である。
123  /// - トリビアルコピー可能な型である。
124  /// - ポインタ型ではない。
125  /// - std::nullptr_t 型ではない。
126  ///
127  /// 要するに、安全に std::memcpy によるコピーが可能な型である必要がある。
128  /// 1つでも満たしていない場合はコンパイルエラーとなる。
129  template<class Data>
130  auto set(
131  std::uint8_t command,
132  Data&& data,
133  std::size_t dataSize = sizeof(Data))
134  ->
135  typename std::enable_if<
137  typename std::remove_reference<Data>::type>::value,
138  RequestState>::type
139  {
140  return this->set(command, &data, std::min(dataSize, sizeof(Data)));
141  }
142 
143  /// @brief ユニークコマンドの出力値を設定する。
144  /// @param[in] command 命令コード。
145  /// @return 要求状態値。
146  ///
147  /// @exception Exception
148  /// 引数 command にサポートされていない命令コードを指定した場合。
149  ///
150  /// 出力データを持たないユニークコマンド用のオーバロード。
151  /// 挙動は
152  /// set(std::uint8_t, const void*, std::size_t)
153  /// オーバロードに準ずる。
154  RequestState set(std::uint8_t command)
155  {
156  return this->set(command, nullptr, 0);
157  }
158 
159  /// @brief 現在設定されている出力データを取得する。
160  /// @param[in] command 命令コード。
161  /// @return 現在設定されている出力データ。データサイズは #MaxDataSize 。
162  ///
163  /// @exception Exception
164  /// 引数 command にサポートされていない命令コードを指定した場合。
165  ///
166  /// 現在ライブラリ内で保持している出力データを返す。
167  /// 起動直後などは、実デバイスにこの値が設定されているとは限らない。
168  const void* getCurrent(std::uint8_t command) const;
169 
170  private:
171  std::size_t _nodeIndex; ///< ノードインデックス。
172 
173  private:
174  // コピー禁止
175  UsbIOUniqueOutput(const UsbIOUniqueOutput&); // 宣言のみ
176  UsbIOUniqueOutput& operator=(const UsbIOUniqueOutput&); // 宣言のみ
177  };
178 
179 /// @}
180 } // namespace amdaemon
181 
182 #endif // AMDAEMON_USBIOUNIQUEOUTPUT_H
USB I/O のユニーク出力処理を行うクラス。
Definition: UsbIOUniqueOutput.h:35
Daemonプロセスへの処理要求状態を保持するクラス。
Definition: RequestState.h:37
型に関するメタ関数を定義するヘッダ。
Daemonライブラリの環境定義を行うヘッダ。
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
UsbIOUniqueOutput(InnerIndexHolder)
コンストラクタ。
Daemonプロセスへの処理要求状態を保持するクラス RequestState のヘッダ。
型 T がバイナリベースでコピー可能な型であるか否かを調べるメタ関数。
Definition: traits.h:34
bool isSupported(std::uint8_t command) const
指定した命令コードがサポートされているか否かを取得する。
static const std::size_t MaxDataSize
最大データサイズ。
Definition: UsbIOUniqueOutput.h:39
const void * getCurrent(std::uint8_t command) const
現在設定されている出力データを取得する。