AM Daemon ライブラリリファレンス
CanAck.h
[詳解]
1 /// @file
2 /// @brief CANボードから送信されたアクノリッジパケット情報を提供するクラス CanAck のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_CANACK_H
7 #define AMDAEMON_CANACK_H
8 
9 #include "amdaemon/env.h"
11 #include "amdaemon/Exception.h"
12 #include "amdaemon/util/traits.h"
13 
14 #include <type_traits>
15 #include <cstdint>
16 #include <cstddef>
17 
18 namespace amdaemon
19 {
20 /// @addtogroup g_can
21 /// @{
22 
23  // 内部クラスの前方宣言
24  class InnerIndexHolder;
25 
26  /// @brief CANボードから送信されたアクノリッジパケット情報を提供するクラス。
27  /// @see CanTarget
28  ///
29  /// このクラスのインスタンスをアプリ側で直接生成することはできない。
30  /// CanTarget クラスのメンバ関数 CanTarget#getAck から取得すること。
31  ///
32  /// CanTarget クラスから同じ命令コードのリクエストパケットを送信したり、
33  /// Core クラスのメンバ関数 Core#execute 呼び出しによって新しいアクノリッジパケットを
34  /// 受け取った時点で、インスタンスの各メンバ関数が返す情報は更新される。
35  /// ある時点における情報を保持したい場合、各メンバ関数の戻り値をコピーしておくこと。
36  ///
37  /// メンバ関数 #isError が true を返す場合、
38  /// そのインスタンスは当該コマンドのアクノリッジパケット情報ではなく、
39  /// エラーレポート取得コマンド(命令コード値は CanErrorReportCommand)の
40  /// アクノリッジパケット情報を返す。
41  class CanAck
42  {
43  public:
44  /// @brief コンストラクタ。
45  /// @note アプリ側からは利用できない。
46  CanAck(InnerIndexHolder, InnerIndexHolder, std::uint8_t);
47 
48  // 下記は暗黙の定義を用いる。
49  //‾CanAck() = default;
50 
51  /// @brief パケットが存在するか否かを取得する。
52  /// @retval true 存在する場合。
53  /// @retval false 存在しない場合。
54  ///
55  /// この関数が false を返す場合、他のメンバ関数の返す値を利用してはならない。
56  bool exists() const
57  {
58  return (this->getData() != nullptr);
59  }
60 
61  /// @brief 命令コードを取得する。
62  /// @return 命令コード。
63  std::uint8_t getCommand() const
64  {
65  return _command;
66  }
67 
68  /// @brief
69  /// このインスタンスがコマンド処理結果ではなく
70  /// エラーレポート情報を保持しているか否かを取得する。
71  /// @retval true エラーレポート情報を保持している場合。
72  /// @retval false コマンド処理結果を保持している場合。(正常時)
73  bool isError() const
74  {
75  return (this->getErrorReport() != CanErrorReport::None);
76  }
77 
78  /// @brief エラーレポート種別を取得する。
79  /// @return エラーレポート種別。エラーが発生していない場合は CanErrorReport::None 。
81 
82  /// @brief パケットデータを取得する。
83  /// @return パケットデータ。パケットが存在しない場合は nullptr 。
84  ///
85  /// - メンバ関数 #isError が false を返す場合、
86  /// この関数は当該コマンドのパケットデータを返す。
87  /// - メンバ関数 #isError が true を返す場合、
88  /// この関数はエラーレポート取得コマンド(命令コード値は CanErrorReportCommand)の
89  /// アクノリッジパケットデータを返す。
90  /// - 特に加工せずパケットデータをそのまま返すため、
91  /// 1バイト目はメンバ関数 #getCommand の戻り値と等しくなり、
92  /// 2バイト目はメンバ関数 #getErrorReport の戻り値と等しくなる。
93  const void* getData() const;
94 
95  /// @brief パケットデータを指定した型の参照として取得する。
96  /// @tparam Data パケットデータ型。後述の要件を満たす型でなければならない。
97  /// @return パケットデータ。
98  /// @see #getData
99  ///
100  /// @exception Exception
101  /// パケットが存在しない場合。
102  ///
103  /// メンバ関数 #getData の戻り値を単純にキャストし、 const Data& 型として返す。
104  /// 型 Data の const 修飾および volatile 修飾は取り除かれる。
105  ///
106  /// 型 Data は下記の要件をすべて満たす必要がある。
107  ///
108  /// - オブジェクト型(スカラ型、配列、クラス&構造体、共用体のいずれか)である。
109  /// - トリビアルコピー可能な型である。
110  /// - ポインタ型ではない。
111  /// - std::nullptr_t 型ではない。
112  ///
113  /// 要するに、安全に std::memcpy によるコピーが可能な型である必要がある。
114  /// 1つでも満たしていない場合はコンパイルエラーとなる。
115  template<class Data>
116  auto getDataAs() const
117  ->
118  typename std::enable_if<
119  ::amdaemon::util::IsBinaryCopyable<Data>::value,
120  const typename std::remove_cv<Data>::type&>::type
121  {
122  const void* data = this->getData();
123  if (data == nullptr)
124  {
125  AMDAEMON_RAISE_EXCEPTION_MSG(Operation, L"Packet is not exists.");
126  }
127  return *static_cast<const typename std::remove_cv<Data>::type*>(data);
128  }
129 
130  /// @brief パケットデータサイズを取得する。
131  /// @return パケットデータサイズ。コマンドによっては 0 の場合もある。
132  std::size_t getDataSize() const;
133 
134  private:
135  std::size_t _portIndex; ///< ポート定義インデックス。
136  std::size_t _targetIndex; ///< ターゲット定義インデックス。
137  std::uint8_t _command; ///< 命令コード。
138 
139  private:
140  // コピー禁止
141  CanAck(const CanAck&); // 宣言のみ
142  CanAck& operator=(const CanAck&); // 宣言のみ
143  };
144 
145 /// @}
146 } // namespace amdaemon
147 
148 #endif // AMDAEMON_CANACK_H
bool isError() const
このインスタンスがコマンド処理結果ではなく エラーレポート情報を保持しているか否かを取得する。 ...
Definition: CanAck.h:73
Definition: AccessCode.h:202
bool exists() const
パケットが存在するか否かを取得する。
Definition: CanAck.h:56
型に関するメタ関数を定義するヘッダ。
std::uint8_t getCommand() const
命令コードを取得する。
Definition: CanAck.h:63
Error クラスのメンバ関数 Error::reset 呼び出しでのみリセット可能。
Daemonライブラリの環境定義を行うヘッダ。
#define AMDAEMON_RAISE_EXCEPTION_MSG(cate, msg)
付随メッセージ付きの例外を発生させる。
Definition: Exception.h:193
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
AM Daemon の例外クラス Exception のヘッダ。
CanAck(InnerIndexHolder, InnerIndexHolder, std::uint8_t)
コンストラクタ。
auto getDataAs() const -> typename std::enable_if< ::amdaemon::util::IsBinaryCopyable< Data >::value, const typename std::remove_cv< Data >::type & >::type
パケットデータを指定した型の参照として取得する。
Definition: CanAck.h:116
CANボードから送信されたアクノリッジパケット情報を提供するクラス。
Definition: CanAck.h:41
CanErrorReport getErrorReport() const
エラーレポート種別を取得する。
CAN通信で発生したエラーの種別を表す列挙 CanErrorReport のヘッダ。
const void * getData() const
パケットデータを取得する。
CanErrorReport
CAN通信で発生したエラーの種別を表す列挙。
Definition: CanErrorReport.h:17
std::size_t getDataSize() const
パケットデータサイズを取得する。