CTR-Pia  5.4.3
Game Communication Engine
 全て クラス ネームスペース 関数 変数 型定義 列挙型 列挙型の値 ページ
sync_SyncProtocol.h
1 /*--------------------------------------------------------------------------------*
2  Copyright (C)Nintendo All rights reserved.
3 
4  These coded instructions, statements, and computer programs contain proprietary
5  information of Nintendo and/or its licensed developers and are protected by
6  national and international copyright laws. They may not be disclosed to third
7  parties or copied or duplicated in any form, in whole or in part, without the
8  prior written consent of Nintendo.
9 
10  The content herein is highly confidential and should be handled accordingly.
11  *--------------------------------------------------------------------------------*/
12 
13 
14 #pragma once
15 
16 #include <nn/pia/sync/sync_Definitions.h>
17 
18 #include <nn/pia/transport/transport_Protocol.h>
19 
20 #include <nn/pia/transport/transport_ProtocolEvent.h>
21 #include <nn/pia/common/common_PacketDefine.h>
22 #include <nn/pia/transport/transport_Definitions.h>
23 
24 
25 // 先行宣言
26 namespace nn
27 {
28 namespace pia
29 {
30 namespace common
31 {
32 class ZlibCompressor;
33 class ZlibUncompressor;
34 }
35 }
36 }
37 
38 // 先行宣言
39 namespace
40 {
41 class DataMessageHeader;
42 }
43 
44 
45 namespace nn
46 {
47 namespace pia
48 {
49 namespace sync
50 {
51 
52 /*!
53  @brief データ同期通信を行うためのプロトコルです。<br/>
54  サポート対象のネットワークトポロジーはフルメッシュ型のみです。スター型、リレーメッシュ型はサポート対象外ですので注意してください。
55  */
57 {
58 public:
59  /*!
60  @cond PRIVATE
61  @brief デフォルトコンストラクタです。
62 
63  @details アプリケーションプログラムは、このコンストラクタを直接呼び出してはいけません。
64  インスタンスの作成は、@ref transport::Transport::CreateProtocol を利用してください。
65  */
66  SyncProtocol(void);
67  //! @endcond
68 
69 
70  /*!
71  @cond PRIVATE
72  @brief デストラクタです。
73 
74  @details アプリケーションプログラムは、このデストラクタを直接呼び出してはいけません。
75  インスタンスの破棄は、@ref transport::Transport::DestroyProtocol を利用してください。
76  */
77  virtual ~SyncProtocol(void);
78  //! @endcond
79 
80 
81  PIA_PROTOCOL_TYPE_INFO(nn::pia::transport::ProtocolTypeSync);
82 
83 
84  //! @ref SyncProtocol::Setting::maxDelay で指定する入力遅延の最大値で、単位はフレームです。
85  static const uint8_t FrameDelayMax = 32;
86 
87  //! データ ID の設定可能個数です。
88  static const uint32_t DataIdNum = 16;
89 
90  // 予約データ ID です。
91  static const uint32_t ReservedDataIdNum = 1;
92  static const uint32_t ReservedDataIdChangeDelay = DataIdNum + 0;
93 
94  // 前回と同じフレームのデータを送る度にカウントされ、どのカウントから送信をスキップするか示します。
95  static const uint32_t SendSkipMax = 2;
96 
97  // 同期データの最初の送信回数設定のデフォルト値です。
98  static const uint32_t DataFirstSendCount = 3;
99 
100  static const uint32_t CompressionLevelNone = 0; //!< @ref SyncProtocol::Setting::dataCompressionLevel で指定する同期データの圧縮レベル(圧縮なし)です。
101  static const uint32_t CompressionLevelLow = 1; //!< @ref SyncProtocol::Setting::dataCompressionLevel で指定する同期データの圧縮レベル(速度重視)です。
102  static const uint32_t CompressionLevelMiddle = 5; //!< @ref SyncProtocol::Setting::dataCompressionLevel で指定する同期データの圧縮レベルです。
103  static const uint32_t CompressionLevelHigh = 9; //!< @ref SyncProtocol::Setting::dataCompressionLevel で指定する同期データの圧縮レベル(圧縮率重視)です。
104 
105  /*!
106  @brief 初期化時に指定する設定構造体です。
107  @details 同期通信するステーション間で同じ値を指定する必要があります。
108  */
109  struct Setting
110  {
111  public:
112  /*!
113  @brief デフォルトコンストラクタです。
114  @details デフォルト値で初期化されます。
115  */
116  Setting();
117 
118  /*!
119  @brief 各データ ID に対応させる同期データのサイズを指定します。
120  @details 使用しないデータ ID には 0 を指定する必要があります。
121  設定できる最大値は、@ref SyncProtocol::GetDataUnitSizeMax で取得できます。
122  @see SyncProtocol::GetDataUnitSizeMax
123  */
125 
126  /*!
127  @brief 入力遅延の最大フレーム数です。
128  @details 1 ~ @ref SyncProtocol::FrameDelayMax の値を指定する必要があります。
129  */
130  uint32_t maxDelay;
131 
132  /*!
133  @brief パケットを受信できない状態がこのフレーム数(@ref SyncProtocol::Step の呼び出し回数)連続したら、タイムアウトとして同期通信を終了します。
134  @details 0 を指定すると、タイムアウトによる同期通信の終了は行わず、パケットを受信するまで待ち続けます。
135  */
136  uint32_t timeoutFrame;
137 
138  /*!
139  @brief 同期通信中の入力遅延変更機能を有効にするかを指定します。デフォルトは false(無効)です。
140  */
142 
143  /*!
144  @brief 同期データの圧縮レベルを指定します。
145  @details @ref SyncProtocol::CompressionLevelNone を指定すると圧縮を行いません。
146  @ref SyncProtocol::CompressionLevelLow が速度重視、@ref SyncProtocol::CompressionLevelHigh が圧縮率重視となります。
147  @ref SyncProtocol::CompressionLevelMiddle はその中間です。
148  デフォルト値は @ref SyncProtocol::CompressionLevelNone です。
149  これらの値以外はサポート対象外です。
150  プラットフォームの CPU 性能によって処理時間が大きく変動します。
151  */
153  };
154 
155 
156  /*!
157  @brief 同期データ 1 単位のサイズとして設定できる最大値(バイト数)を取得します。
158 
159  @details @ref transport::Transport の初期化時に設定するパラメータによって、取得される値は異なります。
160 
161  @return 同期データ 1 単位のサイズとして設定できる最大値(バイト数)です。
162 
163  @see SyncProtocol::Setting::dataUnitSize
164  */
165  uint32_t GetDataUnitSizeMax() const;
166 
167 
168  /*!
169  @brief インスタンスを初期化します。@ref sync::BeginSetup() ~ @ref sync::EndSetup() 間で呼び出す必要があります。
170 
171  @param[in] setting 各種設定情報です。
172  同期通信をするすべてのステーション間で、同じ値を設定する必要があります。異なる値を設定した場合の動作は不定です。
173 
174  @return 成功すれば、IsSuccess() が true を返す Result が返されます。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
175 
176  @retval ResultAlreadyInitialized 既に初期化されています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
177  @retval ResultInvalidArgument 引数が不正です。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
178 
179  @see SyncProtocol::Finalize
180  */
181  Result Initialize(const Setting& setting);
182 
183 
184  /*!
185  @brief 終了処理です。
186 
187  @see SyncProtocol::Initialize
188  */
189  void Finalize();
190 
191 
192  /*!
193  @brief @ref SyncProtocol::Initialize で指定したデータ ID の同期データのサイズを取得します。
194 
195  @param[in] dataId 調べたい同期データのデータ ID です。
196 
197  @return 指定された同期データのサイズです。
198  */
199  uint32_t GetDataSize(uint32_t dataId) const;
200 
201 
202  /*!
203  @brief @ref SyncProtocol::Initialize で指定した入力遅延の最大値を取得します。
204 
205  @return 入力遅延のフレーム数の最大値です。
206  */
207  uint32_t GetMaxDelay() const
208  {
209  return static_cast<uint32_t>(m_MaxDelay);
210  }
211 
212  /*!
213  @brief 実際に設定されている入力遅延の値を取得します。
214 
215  @return 入力遅延のフレーム数です。
216  */
217  uint32_t GetDelay() const
218  {
219  return static_cast<uint32_t>(m_Delay);
220  }
221 
222 
223  /*!
224  @brief @ref SyncProtocol::Initialize で指定したタイムアウトの設定値を取得します。
225 
226  @return タイムアウトの設定値です。
227  */
228  uint32_t GetTimeoutFrame() const
229  {
230  return static_cast<uint32_t>(m_TimeoutFrame);
231  }
232 
233 
234  /*!
235  @brief @ref SyncProtocol::Start や @ref SyncProtocol::SetSendPeriod で指定した送信間隔の設定値を取得します。
236 
237  @return 送信間隔の設定値です。
238  */
239  uint32_t GetSendPeriod() const
240  {
241  return m_SendPeriod;
242  }
243 
244  /*!
245  @brief 送信間隔を設定します。
246 
247  @param[in] sendPeriod 設定した同期データの送信、再送信処理の間隔を指定します。
248  ここで指定した回数 @ref SyncProtocol::Step() が呼び出されるたびに、@ref common::Scheduler::Dispatch() 呼び出し時に送信、再送信処理が行われます。
249  1 以上の値を指定する必要があります。
250 
251  @return 成功すれば、IsSuccess() が true を返す Result が返されます。
252 
253  @retval ResultInvalidArgument 引数が不正です。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
254  */
255  Result SetSendPeriod(uint32_t sendPeriod);
256 
257 
258  /*!
259  @brief 同期通信を 1 フレーム進めます。
260 
261  @details @ref SyncProtocol::State_NotSynchronized 以外の間は毎フレーム呼び出す必要があります。フレーム毎の処理の先頭で実行することを推奨します。
262  @ref SyncProtocol::NeedsSetData が true の時は、この関数を呼ぶ前に @ref SyncProtocol::SetData で送信する同期データを設定してください。
263  @ref SyncProtocol::State_NotSynchronized の時にこの関数を呼んでも問題ありません。
264 
265  @ref SyncProtocol::EndAlone 呼び出し成功後の単独同期終了処理中は本関数が失敗しますが、
266  内部処理を進行させるために毎フレーム呼び出す必要がある点に注意してください。
267 
268  @return 成功すれば、IsSuccess() が true を返す Result が返されます。
269 
270  @retval ResultInvalidState 通信中ではありません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
271  @retval ResultDataIsNotArrivedYet 同期データが他のステーションから届いていないためフレームを進めることができませんでした。
272  common::Scheduler::Dispatch() を呼んだあと再度この関数を呼ぶ必要があります。アプリケーションで適切にハンドリングしてください。
273  @retval ResultDataIsNotSet 自分が送信する同期データがまだ設定されていません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
274  @retval ResultTemporaryUnavailable 単独同期終了処理中です。
275 
276  @see SyncProtocol::SetData
277  */
278  Result Step();
279 
280 
281  /*!
282  @brief 同期通信を開始します。
283 
284  @details @ref SyncProtocol::State_NotSynchronized の間に呼ぶことができ、成功すると @ref SyncProtocol::State_Waiting に遷移します。
285  その後、通信相手でも同期通信が開始されると、@ref SyncProtocol::State_Starting, @ref SyncProtocol::State_Synchronized と遷移していきます。
286 
287  @param[in] usingDataIdBitmap @ref SyncProtocol::Initialize() で指定したデータ ID のうち、今回の同期通信でこのステーションから送信するデータ ID のリストをビットフラグで指定します。
288  ビットの下位から順に、データ ID の 0 から対応します。
289  ステーション毎に別々の値を指定できます。
290 
291  @param[in] delay このステーションが設定を希望する入力遅延を指定できます。
292  実際に設定される入力遅延は、各ステーションが希望した入力遅延の値の中の最大値となります。
293  初期化時に @ref SyncProtocol::Setting::maxDelay で指定した最大入力遅延以下の値である必要があります。
294 
295  @param[in] sendPeriod 設定した同期データの送信、再送信処理の間隔を指定します。
296  ここで指定した回数 @ref SyncProtocol::Step() が呼び出されるたびに、@ref common::Scheduler::Dispatch() 呼び出し時に送信、再送信処理が行われます。
297  1 以上の値を指定する必要があります。
298 
299  @return 成功すれば、IsSuccess() が true を返す Result が返されます。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
300 
301  @retval ResultInvalidState この関数を呼び出せる SyncProtocol::State ではありません。または、通信中ではありません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
302  @retval ResultInvalidArgument 引数の指定が不正です。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
303 
304  @see SyncProtocol::End
305  */
306  Result Start(uint32_t usingDataIdBitmap, uint32_t delay, uint32_t sendPeriod);
307 
308 
309  /*!
310  @brief 同期通信を終了します。
311 
312  @details @ref SyncProtocol::State_Waiting, @ref SyncProtocol::State_Starting, @ref SyncProtocol::State_Synchronized の間に呼ぶことができ、成功すると @ref SyncProtocol::State_Ending に遷移します。
313  その後、通信相手に終了することを通知したのち、@ref SyncProtocol::State_NotSynchronized に遷移します。
314  この関数で同期通信を終了させた場合、通常は終了の理由が、このステーションでは @ref SyncProtocol::EndReason_End に、
315  他のステーションでは、@ref SyncProtocol::EndReason_OtherStation になります。
316  ただし、同時に他の要因で終了する事になった場合はこの限りではありません。
317 
318  この関数を呼んだ直後の段階では @ref SyncProtocol::State_Ending ですので、再び @ref SyncProtocol::Start を呼ぶには、@ref SyncProtocol::State_NotSynchronized になるまで
319  数フレームの間 @ref SyncProtocol::Step を呼ぶ必要があります。
320 
321  @return 成功すれば、IsSuccess() が true を返す Result が返されます。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
322 
323  @retval ResultInvalidState この関数を呼び出せる SyncProtocol::State ではありません。または、通信中ではありません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
324 
325  @see SyncProtocol::Start
326  */
327  Result End();
328 
329  /*!
330  @brief 自分だけ単独で同期通信を終了します。
331 
332  @details @ref SyncProtocol::State_Synchronized の間に呼ぶことができます。
333  <br/>
334 
335  この関数を呼び出したフレームの同期データは取得できますが、
336  呼び出し後に他のステーションが単独同期終了を行ったことが通知された場合、
337  そのステーションが送信した同期データは取得できなくなり、同期ずれの原因となりますので、
338  この関数の呼び出しは、受信した同期データを取得後に行う必要があります。
339 
340  終了フレームは、既に同期データを設定済みのフレームの内、最後のフレームとなります。
341  通信相手に終了フレームを通知し、全ての通信相手が終了フレームに達したことを確認した後、
342  @ref SyncProtocol::State_EndedAlone に遷移します。
343  この関数を呼び出し成功後、@ref SyncProtocol::State_Synchronized の間は @ref SyncProtocol::Step に失敗し、
344  フレームを進めることができなくなるため、自分は終了フレームに達しない点に注意してください。
345  しかし、この場合でも @ref SyncProtocol::Step は内部処理進行のために毎フレーム呼ぶ必要があります。
346 
347  この関数で同期通信を終了した場合、通常はこのステーションの終了の理由は、@ref SyncProtocol::EndReason_EndAlone になります。
348  ただし、同時に他の要因で終了する事になった場合はこの限りではありません。
349 
350  @ref SyncProtocol::State_EndedAlone の状態で、全ての通信相手が同期通信を終了すると、
351  @ref SyncProtocol::State_NotSynchronized に遷移します。
352  また、@ref SyncProtocol::State_EndedAlone の状態、または、その後 @ref SyncProtocol::State_NotSynchronized に遷移した状態で
353  自分がセッションから離脱しても、他のステーションは同期通信を維持することができます。
354  ただし、@ref SyncProtocol::State_EndedAlone に遷移後に新規ステーションが接続し、
355  自分以外のステーションが再度同期通信を開始しようとして @ref SyncProtocol::State_Waiting になっているときに自分が切断すると、
356  自分以外のステーションは同期通信を終了し、@ref SyncProtocol::State_NotSynchronized に遷移します。
357  また、@ref SyncProtocol::State_EndedAlone で終了したステーションは @ref SyncProtocol::State_NotSynchronized に遷移後、
358  再度同期通信を開始することができますが、再度同期通信を開始、または、セッションからの離脱を行わなければ、
359  自分以外のステーションは同期通信中の状態になることができません。
360 
361  @return 成功すれば、IsSuccess() が true を返す Result が返されます。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
362 
363  @retval ResultInvalidState この関数を呼び出せる SyncProtocol::State ではありません。または、すでに終了フレームが設定されています。または、通信中ではありません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
364  */
365  Result EndAlone();
366 
367  /*!
368  @brief 指定したステーションが終了するフレームを取得します。
369 
370  @details @ref SyncProtocol::State_NotSynchronized, @ref SyncProtocol::State_Waiting 以外の状態のときに呼ぶことができます。
371  @ref SyncProtocol::State_Synchronized になる前に終了する場合、endFrameNo は 0 になりますが、
372  実際にはその前に終了しますので注意してください。
373  また、終了するステーション自身は、このフレームに達する前に終了することもある点に注意してください。
374 
375  @return 成功すれば、IsSuccess() が true を返す Result が返されます。
376 
377  @retval ResultInvalidArgument 引数の指定が不正です。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
378  @retval ResultInvalidState この関数を呼び出せる SyncProtocol::State ではありません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
379  @retval ResultNoData 終了するフレームが設定されていません。アプリケーションで適切にハンドリングしてください。
380  */
381  Result GetEndFrameNo(StationId stationId, uint32_t* endFrameNo) const;
382 
383  /*!
384  @brief 同期通信の進行状態を表します。
385  */
386  enum State
387  {
388  State_NotSynchronized = 0, //!< 同期通信中ではありません。
389  State_Waiting, //!< 同期通信を開始し、他のステーションが同期通信を開始するのを待っています。
390  State_Starting, //!< 同期通信を開始中です。送信する同期データを設定する必要がありますが、取得はまだできません。
391  State_Synchronized, //!< 同期通信を行っています。送信する同期データを設定する必要があり、取得もできます。
392  State_Ending, //!< 同期通信を終了中です。
393  State_EndedAlone //!< 自分だけ単独で同期通信を終了しました。
394  };
395 
396 
397  /*!
398  @brief 同期通信の進行状態を取得します。
399 
400  @return 同期通信の進行状態です。
401  */
402  State GetState() const
403  {
404  return m_State;
405  }
406 
407 
408  /*!
409  @brief 送信する同期データを設定する必要があるかどうかを取得します。
410 
411  @details @ref SyncProtocol::State_Starting, @ref SyncProtocol::State_Synchronized の間は送信する同期データを設定する必要があります。
412  ただし、@ref SyncProtocol::RequestToChangeDelay による同期通信中の入力遅延変更機能を使用している場合や、
413  @ref SyncProtocol::EndAlone による同期通信の単独終了を行った場合には、
414  これらの @ref SyncProtocol::State であっても同期データを設定する必要がない場合があります。
415  @ref SyncProtocol::Step を呼び出した時の返り値が失敗だった場合、フレームは進んでいないので、
416  次の @ref SyncProtocol::Step 呼び出し前に同期データを設定しなおす必要はありません。
417 
418  @return 設定する必要があるデータ ID のうちいずれかが設定されていなければ true を返します。
419  同期データを設定する必要が無い場合や同期データが既に設定されている場合は、false を返します。
420 
421  @see SyncProtocol::SetData
422  */
423  bool NeedsSetData() const;
424 
425 
426  /*!
427  @brief 特定のデータ ID の同期データを設定する必要があるかどうかを取得します。
428 
429  @details @ref SyncProtocol::State_Starting, @ref SyncProtocol::State_Synchronized の間は同期データを設定する必要があります。
430  ただし、@ref SyncProtocol::RequestToChangeDelay による同期通信中の入力遅延変更機能を使用している場合や、
431  @ref SyncProtocol::EndAlone による同期通信の単独終了を行った場合には、
432  これらの @ref SyncProtocol::State であっても同期データを設定する必要がない場合があります。
433  @ref SyncProtocol::Step を呼び出した時の返り値が失敗だった場合はフレームは進んでいないので、
434  次の @ref SyncProtocol::Step 呼び出し前に同期データを設定しなおす必要はありません。
435 
436  @param[in] dataId 同期データを設定する必要があるかどうかを調べたいデータ ID です。
437 
438  @return 指定したデータ ID の同期データを設定する必要がある場合、true を返します。
439  同期データを設定する必要が無い場合や同期データが既に設定されている場合は、false を返します。
440 
441  @see SyncProtocol::SetData
442  */
443  bool NeedsSetData(uint32_t dataId) const;
444 
445 
446  /*!
447  @brief 受信した同期データを取得できるかどうかを取得します。
448 
449  @details @ref SyncProtocol::State_Synchronized の間は同期データを取得できます。
450  ただし、同期通信中の入力遅延変更機能を使用している場合は、この関数が true を返しても
451  同期データを取得できないフレームがあるので、@ref SyncProtocol::GetIsNoDataFrame でデータを取得できないフレームかを確認する必要があります。
452 
453  @return 同期データを取得できる場合、true を返します。
454 
455  @see SyncProtocol::GetData
456  */
457  bool CanGetData() const;
458 
459 
460  /*!
461  @brief @ref SyncProtocol::State_Synchronized となってからのフレーム数を取得します。
462 
463  @details @ref SyncProtocol::State_Synchronized の間、@ref SyncProtocol::Step に成功すると 1 進みます。
464 
465  @return @ref SyncProtocol::State_Synchronized となってからのフレーム数です。
466  @ref SyncProtocol::State_Synchronized でなければ 0 を返しますが、@ref SyncProtocol::State_Synchronized となった最初のフレームも 0 となりますので注意してください。
467  */
468  uint32_t GetFrameNo() const;
469 
470 
471  /*!
472  @brief 指定したステーションが同期通信に参加しているかどうかを取得します。
473 
474  @param[in] stationId 調べたいステーションの @ref StationId です。
475 
476  @return 指定したステーションが同期通信に参加していれば true を返します。
477  */
478  bool CheckEntry(StationId stationId) const;
479 
480 
481  /*!
482  @brief 指定したステーションが送信しているデータ ID のリストをビットフラグで取得します。
483 
484  @param[in] stationId 調べたいステーションの @ref StationId です。
485 
486  @return 指定したステーションが送信しているデータ ID のリストです。
487  @ref SyncProtocol::CheckEntry で false となるステーションは同期通信を行っていないので、0 を返します。
488  */
489  uint32_t GetUsingDataIdBitmap(StationId stationId) const;
490 
491 
492  /*!
493  @brief 同期通信が終了した際の終了理由を表します。
494  */
496  {
497  EndReason_Nothing = 0, //!< 同期通信は終了していません。
498  EndReason_End, //!< このステーションで @ref SyncProtocol::End が呼ばれたために終了しました。
499  EndReason_OtherStation, //!< 他のステーションが同期通信を終了したために終了しました。
500  EndReason_ChangeConnection, //!< セッションに参加しているステーションに変更があったため終了しました。
501  EndReason_Timeout, //!< @ref SyncProtocol::Setting::timeoutFrame フレーム間同期データが届かなかったため終了しました。
502  EndReason_EndAlone //!< このステーションで @ref SyncProtocol::EndAlone が呼ばれたために終了しました。
503  };
504 
505 
506  /*!
507  @brief 同期通信が終了した際の終了理由を取得します。
508 
509  @details @ref SyncProtocol::Start を呼んで次の同期通信を開始した際に値はリセットされます。
510 
511  @return 同期通信が終了した際の終了理由です。
512  */
513  EndReason GetLastEndReason() const;
514 
515 
516  /*!
517  @brief 同期通信で送信する同期データを設定します。
518 
519  @details @ref SyncProtocol::NeedsSetData が true の時は、@ref SyncProtocol::Step を呼ぶ前に、同期データを設定する必要があります。
520  @ref SyncProtocol::State_Synchronized のとき、設定する同期データは、(@ref SyncProtocol::GetFrameNo + @ref SyncProtocol::GetDelay) フレーム用のデータとなります。
521 
522  @param[in] dataId 設定する同期データのデータ ID です。
523  @param[in] cpData 設定する同期データです。サイズは @ref SyncProtocol::Initialize で指定したものになります。
524 
525  @return 成功すれば、IsSuccess() が true を返す Result が返されます。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
526 
527  @retval ResultInvalidState この関数を呼び出せる SyncProtocol::State ではありません。または、通信中ではありません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
528  @retval ResultInvalidArgument 引数の指定が不正です。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
529  @retval ResultAlreadyExists 同期データは既に設定されています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
530 
531  @see SyncProtocol::NeedsSetData、SyncProtocol::Step
532  */
533  Result SetData(uint32_t dataId, const void* cpData);
534 
535 
536  /*!
537  @brief 同期通信で受信した同期データを取得します。
538 
539  @details @ref SyncProtocol::CanGetData が true の時は、@ref SyncProtocol::CheckEntry が true となるステーションから、@ref SyncProtocol::GetUsingDataIdBitmap でビットが立っているデータ ID の同期データを取得できます。
540  同期通信中の入力遅延変更機能を使用している場合は、同期データを取得できないフレームがあり、そのフレームでは @ref ResultInvalidState を返します。
541  同期データを取得できないフレームかどうかは、@ref SyncProtocol::GetIsNoDataFrame で確認する必要があります。
542 
543  @param[in] stationId 取得する同期データを送信するステーションの @ref StationId です。
544  @param[in] dataId 取得する同期データのデータ ID です。
545  @param[out] pBuffer 同期データを格納するバッファのポインタです。必要なサイズは @ref SyncProtocol::Initialize で指定したサイズです。
546 
547  @return 成功すれば、IsSuccess() が true を返す Result が返されます。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
548 
549  @retval ResultInvalidState この関数を呼び出せる SyncProtocol::State ではありません。または、同期データを取得できないフレームです。または、通信中ではありません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
550  @retval ResultInvalidArgument 引数の指定が不正です。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
551  */
552  Result GetData(StationId stationId, uint32_t dataId, void* pBuffer) const
553  {
554  return this->GetData(stationId, dataId, pBuffer, 0);
555  }
556 
557 
558  /*!
559  @cond PRIVATE
560  @brief 同期通信で受信した未来のフレーム用の同期データを取得します。
561 
562  @details @ref SyncProtocol::CanGetData が true の時は、@ref SyncProtocol::CheckEntry が true となるステーションから、@ref SyncProtocol::GetUsingDataIdBitmap でビットが立っているデータ ID の同期データを取得できます。
563  取得したい同期データのフレームの、現在のフレームからのオフセットを指定できます。
564  同期通信中の入力遅延変更機能を使用している場合は、同期データを取得できないフレームがあり、そのフレームでは @ref ResultInvalidState を返します。
565  同期データを取得できないフレームかどうかは、@ref SyncProtocol::GetIsNoDataFrame で確認する必要があります。
566  また、指定した未来のフレームの同期データをまだ受信していない場合は、@ref ResultNoData を返します。
567 
568  @param[in] stationId 取得する同期データを送信するステーションの @ref StationId です。
569  @param[in] dataId 取得する同期データのデータ ID です。
570  @param[out] pBuffer 同期データを格納するバッファのポインタです。必要なサイズは @ref SyncProtocol::Initialize で指定したサイズです。
571  @param[in] frameOffset 取得したい同期データのフレームの、現在のフレームからのオフセットです。
572 
573  @return 成功すれば、IsSuccess() が true を返す Result が返されます。
574 
575  @retval ResultInvalidState この関数を呼び出せる SyncProtocol::State ではありません。または、同期データを取得できないフレームです。または、通信中ではありません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
576  @retval ResultInvalidArgument 引数の指定が不正です。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
577  @retval ResultNoData 同期データがありません。アプリケーションで適切にハンドリングしてください。
578  */
579  Result GetData(StationId stationId, uint32_t dataId, void* pBuffer, uint32_t frameOffset) const;
580  //! @endcond
581 
582 
583  /*!
584  @brief 同期通信で受信した同期データへのポインタを取得します。
585 
586  @details @ref SyncProtocol::CanGetData が true の時は、@ref SyncProtocol::CheckEntry が true となるステーションから、@ref SyncProtocol::GetUsingDataIdBitmap でビットが立っているデータ ID の同期データを取得できます。
587  取得したポインタは、次に @ref SyncProtocol::Step を呼ぶまで有効です。
588  同期データのサイズは @ref SyncProtocol::Initialize で指定したサイズです。
589 
590  @param[in] stationId 取得する同期データを送信するステーションの @ref StationId です。
591  @param[in] dataId 取得する同期データのデータ ID です。
592 
593  @return 同期通信で受信した同期データへのポインタです。
594  参照できる同期データが存在しない場合は NULL を返します。
595  */
596  const void* GetDataPtr(StationId stationId, uint32_t dataId) const;
597 
598 
599  /*!
600  @cond PRIVATE
601  @brief 指定したステーションから、現在のフレームから何フレーム後の同期データまでをすでに受信しているかを取得します。
602 
603  @details 取得できる同期データ数には、現在のフレーム用の同期データは含みません。
604  stationId に自分を指定した場合は、(設定されている入力遅延 - 1) の値を返します。
605  stationId が不正な場合や、@ref SyncProtocol::GetUsingDataIdBitmap で 0 が返るステーションの場合は、0 を返します。
606 
607  @param[in] stationId 受信した同期データの送信元のステーションの @ref StationId です。
608 
609  @return 指定したステーションから受信した、未来のフレーム用の同期データ数です。
610  */
611  uint32_t GetReceivedDataNum(StationId stationId) const;
612  //! @endcond
613 
614  /*!
615  @cond PRIVATE
616  @brief 指定したステーションから見た、自分の先行フレーム数を取得します。
617 
618  @details 受信した同期データ数や RTT に基づき、指定したステーションから見て自分のフレームがどれだけ先行しているかを推定します。
619  自分が先行している場合は正の値を、自分が遅れている場合は負の値を返します。
620  パケロスにより同期データが受信できなかった場合等、実際の先行フレーム数とは異なる値になる点に注意してください。
621  また、各ステーションで推定した先行フレーム数は、互いに整合性が取れない点にも注意してください。
622 
623  @param[in] stationId フレーム数の比較対象ステーションの @ref StationId です。
624  @param[in] frameRate アプリのフレームレートです。
625 
626  @return 指定したステーションから見た、自分の先行フレーム数です。
627  */
628  int32_t EstimateLeadingFrameNum(StationId stationId, uint32_t frameRate) const;
629  //! @endcond
630 
631  /*!
632  @brief 入力遅延の変更依頼を同期データとして設定します。
633 
634  @details 依頼する入力遅延は、初期化時に @ref SyncProtocol::Setting::maxDelay で指定した最大入力遅延以下の値である必要があります。
635  依頼する入力遅延として 0 を指定した場合は、変更依頼を行わないものとして扱われます。
636  この関数が成功しても、依頼した入力遅延の値に変更されることは保証されません。
637  同じフレームで複数の依頼を受け取った場合は、依頼された入力遅延の値の最大値が優先されます。
638  入力遅延の変更依頼を同期データとして受け取った時点で、すでに他の依頼による入力遅延の変更中であった場合は、依頼は無視されます。
639 
640  @param[in] newDelay 依頼する入力遅延の値です。
641 
642  @return 成功すれば、IsSuccess() が true を返す Result が返されます。
643 
644  @retval ResultInvalidState 呼び出し状態が不正です。または、通信中ではありません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
645  @retval ResultInvalidArgument 引数の指定が不正です。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
646  @retval ResultAlreadyExists 既に設定されています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
647  */
648  Result RequestToChangeDelay(uint32_t newDelay);
649 
650  /*!
651  @brief 同期データを取得できないフレームかどうかを取得します。
652 
653  @details 同期通信中の入力遅延変更機能を使用している場合は、同期データを取得できないフレームがあるため、この関数で同期データを取得できないフレームかを確認する必要があります。
654  同期通信中の入力遅延変更機能を使用していない場合は、この関数を使用する必要はありません。
655 
656  @param[out] isNoDataFrame 同期データを取得できないフレームであるかです。
657 
658  @return 成功すれば、IsSuccess() が true を返す Result が返されます。
659 
660  @retval ResultInvalidState 呼び出し状態が不正です。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
661  @retval ResultInvalidArgument 引数の指定が不正です。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
662  */
663  Result GetIsNoDataFrame(bool* isNoDataFrame) const
664  {
665  return this->GetIsNoDataFrame(isNoDataFrame, 0);
666  }
667 
668  /*!
669  @cond PRIVATE
670  @brief 同期データを取得できないフレームかどうかを取得します。
671 
672  @details 同期通信中の入力遅延変更機能を使用している場合は、同期データを取得できないフレームがあるため、この関数で同期データを取得できないフレームかを確認する必要があります。
673  同期通信中の入力遅延変更機能を使用していない場合は、この関数を使用する必要はありません。
674 
675  @param[out] isNoDataFrame 同期データを取得できないフレームであるかです。
676  @param[in] frameOffset 現在のフレームからのオフセットです。
677 
678  @return 成功すれば、IsSuccess() が true を返す Result が返されます。
679 
680  @retval ResultInvalidState 呼び出し状態が不正です。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
681  @retval ResultInvalidArgument 引数の指定が不正です。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
682  */
683  Result GetIsNoDataFrame(bool* isNoDataFrame, uint32_t frameOffset) const;
684  //! @endcond
685 
686  /*!
687  @cond PRIVATE
688  @brief 同期データを取得できないフレームかどうかが決定しているフレームのオフセットの最大値を取得します。
689 
690  @details 現在のフレームからこの関数が返すオフセット後のフレームまでは、同期データを取得できないフレームかどうかが決定しています。
691 
692  @return 同期データを取得できないフレームかどうかが決定しているフレームのオフセットの最大値です。
693  */
694  uint32_t GetMaxFrameOffsetDecidedIfNoDataFrameOrNot() const;
695  //! @endcond
696 
697  /*!
698  @brief 送信する同期データを 1 パケットに収めるための、各データ ID のデータサイズの合計の最大値を求めます。
699 
700  @details この関数で求められる値は、送信間隔 1 のときに、送信や再送により送信する同期データサイズが最大となった場合を想定した値です。
701 
702  @param[in] delay 入力遅延の値です。
703  @param[in] dataIdNum 使用するデータ ID の数です。
704 
705  @return 送信する同期データを 1 パケットに収めるための、各データ ID のデータサイズの合計の最大値が返されます。
706  */
707  uint32_t CalcMaxSyncDataSizeSentInOnePacket(uint32_t delay, uint32_t dataIdNum);
708 
709 
710  /*!
711  @cond PRIVATE
712  @brief コマ落ち時、同期データの設定を行わずにフレームを進めます。
713 
714  @details コマ落ち時に @ref SyncProtocol::Step の代わりに呼び出します。成功すると、同期データの設定を行わずに 1 フレーム進めることができ、同期データを設定するフレームのオフセット を -1 します。@ref SyncProtocol::State_Synchronized 以外のときに呼び出すと失敗します。同期通信中の入力遅延変更機能とは併用できません。
715 
716  @return 成功すれば、IsSuccess() が true を返す Result が返されます。
717  失敗したときは、@ref SyncProtocol::Step() と同様の Result、または、@ref ResultInvalidState が返されます。
718 
719  @retval ResultInvalidState (入力遅延のフレーム数 + 同期データを設定するフレームのオフセット) が 1 以下、または、この関数を呼び出せる @ref SyncProtocol::State ではありません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
720  */
721  Result StepWithoutSetData();
722  //! @endcond
723 
724 
725  /*!
726  @cond PRIVATE
727  @brief 処理落ち時に、同期データの設定を終わった後、呼び出します。
728 
729  @details 処理落ち時に、同期データの設定を終わった後、呼び出す必要があります。成功すると、同期データを設定するフレームのオフセット を +1 します。@ref SyncProtocol::State_Synchronized 以外のときに呼び出すと失敗します。同期通信中の入力遅延変更機能とは併用できません。
730 
731  @return 成功すれば、IsSuccess() が true を返す Result が返されます。
732 
733  @retval ResultInvalidState (入力遅延のフレーム数 + 同期データを設定するフレームのオフセット) が 入力遅延のフレーム数の最大値以上、または、この関数を呼び出せる @ref SyncProtocol::State ではありません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
734  @retval ResultDataIsNotSet 自分が送信する同期データがまだ設定されていません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
735  */
736  Result EndSetDataInNoProcessFrame();
737  //! @endcond
738 
739 
740  /*!
741  @cond PRIVATE
742  @brief 同期データを設定するフレームのオフセットを返します。
743  */
744  int32_t GetSetDataOffset()
745  {
746  return m_SetDataOffset;
747  }
748  //! @endcond
749 
750 
751  /*!
752  @cond PRIVATE
753  @brief 受信済みの同期データをチェックし、再送処理を抑える機能を使用するかを設定します。
754  */
755  void SetUsingReceivedDataCheck(bool isUsingReceivedDataCheck);
756  //! @endcond
757 
758 
759  /*!
760  @cond PRIVATE
761  @brief 通信を開始します。
762 
763  @param[in] localStationAddress 自分の @ref StationIndex です。
764 
765  @return 成功すれば、IsSuccess() が true を返す Result が返されます。
766 
767  @retval ResultNotInitialized 初期化されていません。
768  @retval ResultInvalidState 既に通信中です。
769  @retval ResultInvalidArgument 引数が誤っています。
770  */
771  virtual Result StartupWithStationAddress(const common::StationAddress& localStationAddress);
772  //! @endcond
773 
774 
775  /*!
776  @cond PRIVATE
777  @brief 通信を終了します。
778  */
779  virtual void CleanupWithStationAddress();
780  //! @endcond
781 
782 
783  /*!
784  @cond PRIVATE
785  @brief メインの処理です。
786 
787  @return ResultSuccess が返されます。
788  */
789  virtual Result Dispatch();
790  //! @endcond
791 
792 
793  /*!
794  @cond PRIVATE
795  @brief 接続状態の切り替え。
796 
797  @param[in] event 操作内容を表すイベントです。
798 
799  @return 成功すれば、IsSuccess() が true を返す Result が返されます。
800 
801  @retval ResultInvalidState 呼び出し状態が不正です。
802  @retval ResultInvalidArgument 引数が誤っています。
803  */
804  virtual Result UpdateProtocolEvent(const transport::ProtocolEvent& event);
805  //! @endcond
806 
807 
808  /*!
809  @brief デバッグに有用な情報をプリントします。
810 
811  @param[in] flag トレースフラグの論理和。詳細は @ref TraceFlag 型を参照してください。
812  */
813  virtual void Trace(uint64_t flag) const;
814 
815 
816 private:
817  enum MessageType
818  {
819  MessageType_Start = 0x01,
820  MessageType_End = 0x02,
821  MessageType_StartEnd = 0x03,
822  MessageType_EndAlone = 0x04,
823  MessageType_StartAck = 0x11,
824  MessageType_EndAck = 0x12,
825  MessageType_StartEndAck = 0x13,
826  MessageType_EndAloneAck = 0x14,
827  MessageType_Data = 0x21,
828  MessageType_CompressedData = 0x22
829  };
830 
831  struct StationInfo
832  {
833  public:
834  StationInfo()
835  {
836  Clear();
837  }
838 
839  void Clear();
840 
841  public:
842  bool isConnected;
843  bool isSyncStarted;
844 
845  uint16_t syncId;
846  uint32_t usingDataIdBitmap;
847 
848  uint32_t preparedFrameNo;
849  uint32_t receivedDataBitmap;
850 
851  uint32_t lastReceiveStepCount;
852 
853  bool isEndAloneCalled;
854  uint32_t endFrameNo;
855  bool isEndedAloneInCurrentSession;
856  };
857 
858  bool IsInitialized() const
859  {
860  return (m_StationNum > 0);
861  }
862  bool IsInCommunication() const
863  {
864  return (m_LocalStationIndex != StationIndex_Invalid);
865  }
866 
867  void CheckTimeout();
868 
869  void DispatchReceive();
870  void ReceiveStartMessage(StationIndex stationIndex, uint16_t syncId, uint32_t usingDataIdBitmap, int32_t delay, uint16_t connectedStationBitmap);
871  void ReceiveEndMessage(StationIndex stationIndex, uint16_t syncId);
872  void ReceiveStartEndMessage(StationIndex stationIndex, uint16_t syncId);
873  void ReceiveEndAloneMessage(StationIndex stationIndex, uint16_t syncId, uint32_t endFrameNo);
874  void ReceiveStartAckMessage(StationIndex stationIndex, uint16_t syncId);
875  void ReceiveEndAckMessage(StationIndex stationIndex, uint16_t syncId);
876  void ReceiveEndAloneAckMessage(StationIndex stationIndex, uint16_t syncId);
877  void ReceiveDataMessage(StationIndex stationIndex, uint16_t syncId, const void* payloadPtr, uint32_t size, bool isCompressedData);
878 
879  void DispatchSend();
880  bool SendCommand(StationIndex stationIndex, int type, uint16_t syncId = 0);
881  bool SendCommandMulti(uint32_t destBmp, int type);
882  void SendData();
883  void ResetSendDataFrameNo();
884  bool CreateDataChunk(uint32_t* pSize, bool isDisableDataCompressionForced = false);
885 
886  void UpdatePreparedFrameNo();
887  void UpdateReceivedDataBitmap();
888  bool IsAllReceivedData(uint32_t sendDataFrameNo);
889 
890  uint64_t MakeSendFrameBitmap(uint32_t dataFirstSendCount) const;
891  bool IsFrameNoSendNeeded(uint32_t sendDataFrameNo);
892  uint32_t* GetSendProcessCountPtr(uint32_t frameNo)
893  {
894  return &m_paSendProcessCnt[GetDataBufferIdx(m_LocalStationIndex, frameNo)];
895  }
896 
897  StationInfo* GetStationInfo(StationIndex stationIndex);
898  const StationInfo* GetStationInfo(StationIndex stationIndex) const
899  {
900  return const_cast<SyncProtocol*>(this)->GetStationInfo(stationIndex);
901  }
902 
903  int GetDataBufferIdx(StationIndex stationIndex, uint32_t frameNo) const;
904 
905  uint32_t* GetValidDataFlag(StationIndex stationIndex, uint32_t frameNo)
906  {
907  return &m_paValidDataFlag[stationIndex * m_BufferFrameNum + GetDataBufferIdx(stationIndex, frameNo)];
908  }
909  const uint32_t* GetValidDataFlag(StationIndex stationIndex, uint32_t frameNo) const
910  {
911  return const_cast<SyncProtocol*>(this)->GetValidDataFlag(stationIndex, frameNo);
912  }
913 
914  uint32_t* GetNoDataFrameFlag(uint32_t frameNo)
915  {
916  return &m_paNoDataFrameFlag[GetDataBufferIdx(m_LocalStationIndex, frameNo)];
917  }
918  const uint32_t* GetNoDataFrameFlag(uint32_t frameNo) const
919  {
920  return const_cast<SyncProtocol*>(this)->GetNoDataFrameFlag(frameNo);
921  }
922 
923  void* GetDataBuffer(StationIndex stationIndex, uint32_t frameNo, uint32_t dataId)
924  {
925  PIA_ASSERT(dataId < DataIdNum + ReservedDataIdNum);
926  return &m_pDataBuffer[(stationIndex * m_BufferFrameNum + GetDataBufferIdx(stationIndex, frameNo)) * m_TotalDataSize + m_DataInfo[dataId].offset];
927  }
928  const void* GetDataBuffer(StationIndex stationIndex, uint32_t frameNo, uint32_t dataId) const
929  {
930  return const_cast<SyncProtocol*>(this)->GetDataBuffer(stationIndex, frameNo, dataId);
931  }
932 
933  // 入力遅延の動的変更
934  Result ChangeDelay(uint32_t newDelay);
935  bool IsChangeDelayEnabled() const
936  {
937  return m_DataInfo[ReservedDataIdChangeDelay].size != 0;
938  }
939 
940  bool EndImpl(EndReason reason);
941 
942  void CheckEndedAlone();
943 
944  uint16_t CalcConnectedStationBitmap() const;
945 
946  // StationIndex 用
947  bool CheckEntry(StationIndex stationIndex) const;
948  Result GetData(StationIndex stationIndex, uint32_t dataId, void* pBuffer) const
949  {
950  return this->GetData(stationIndex, dataId, pBuffer, 0);
951  }
952  Result GetData(StationIndex stationIndex, uint32_t dataId, void* pBuffer, uint32_t frameOffset) const;
953  uint32_t GetUsingDataIdBitmap(StationIndex stationIndex) const;
954 
955  void RegisterDataMessageHeader(DataMessageHeader* pDMH, MessageType messageType);
956 
957 private:
958  uint32_t m_StationNum;
959  StationIndex m_LocalStationIndex;
960 
961  State m_State;
962 
963  static const uint32_t MessageBufferSize = common::ProtocolMessgaePayloadSizeMax / sizeof(uint32_t) * sizeof(uint32_t);
964 
965  uint32_t m_MessageBuffer[MessageBufferSize / sizeof(uint32_t)];
966  uint32_t* m_pCompressedMessageBuffer;
967 
968  StationInfo* m_paStationInfo;
969  uint32_t* m_paValidDataFlag;
970  uint32_t* m_paNoDataFrameFlag;
971  uint8_t* m_pDataBuffer;
972  int32_t* m_pDelayBuffer;
973 
974  struct
975  {
976  uint32_t offset;
977  uint32_t size;
978  } m_DataInfo[DataIdNum + ReservedDataIdNum];
979 
980  uint32_t m_TotalDataSize;
981 
982  int32_t m_Delay;
983  int32_t m_MaxDelay;
984  int32_t m_BufferFrameNum;
985  uint32_t m_SendPeriod;
986  int32_t m_TimeoutFrame;
987 
988  uint32_t m_CurrentFrameNo;
989  uint32_t m_PreparedFrameNo;
990  uint32_t m_ReceivedDataBitmap; // m_PreparedFrameNo + 1 以降のフレームの内、全ステーションから同期データを受信済みのフレーム
991  bool m_IsUsingReceivedDataCheck;
992 
993  int32_t m_CurrentDataBufferIdx;
994 
995  EndReason m_LastEndReason;
996 
997  uint32_t m_StepCount;
998  uint32_t m_StepCountOffset;
999  bool m_IsSendStartNeeded;
1000  bool m_IsSendEndNeeded;
1001  bool m_IsSendEndAloneNeeded;
1002  uint32_t m_ParticipantBmp;
1003  uint32_t m_SendStartDestBmp;
1004  uint32_t m_SendEndDestBmp;
1005  uint32_t m_SendEndAloneDestBmp;
1006  uint32_t m_SendDataFrameNo;
1007  uint32_t m_SendDataId;
1008  bool m_IsResetSendDataFrameNoNeeded;
1009 
1010  // 入力遅延の動的変更用
1011  int32_t m_NewDelay;
1012  uint32_t m_ChangeDelayRequestFrameNo;
1013 
1014  // 送信する同期データを設定するフレームのオフセット
1015  int32_t m_SetDataOffset;
1016 
1017  // 送信する同期データが設定されているかのチェックをしないで Step するフラグ
1018  bool m_IsStepWithoutSetData;
1019 
1020  // データ圧縮・解凍用
1021  bool m_IsDataCompressionEnabled;
1022  uint32_t m_DataCompressionLevel;
1023  static const uint32_t ZlibCompressorWindowBits = 12;
1024  static const uint32_t ZlibCompressorMemLevel = 5;
1025 #if defined(NN_BUILD_TARGET_PLATFORM_ADDRESS_64) && NN_BUILD_TARGET_PLATFORM_ADDRESS_64 || NN_PIA_B
1026  // NX-x64 : 38688
1027  // NX64 : 38704
1028  // NN_PIA_B: 32bitは38596で十分だが64bitでは足りない。32bitが今後廃れる事を見越して常に多めに確保する
1029  static const uint32_t ZlibCompressorWorkMemorySize = 38704;
1030 #else
1031  static const uint32_t ZlibCompressorWorkMemorySize = 38596;
1032 #endif
1033  common::ZlibCompressor* m_pZlibCompressor;
1034  uint32_t* m_paZlibCompressorMemory;
1035  common::ZlibUncompressor* m_pZlibUncompressor;
1036  uint32_t* m_paZlibUncompressorMemory;
1037 
1038  // 同じ同期データの送信スキップ用
1039  uint32_t m_SendSkipMax;
1040  uint32_t m_SendSkip;
1041  uint32_t m_SameDataCount;
1042  uint32_t m_PreSendFrameNoMin;
1043  uint32_t m_PreSendFrameNoMax;
1044 
1045  // 同期データを送信するかの判定用
1046  uint32_t* m_paSendProcessCnt; // 各フレームを送信しようとした回数カウント用バッファ
1047  uint32_t m_SendProcessFrameNoMin; // 送信しようとしたフレーム番号の最小値
1048  uint32_t m_SendProcessFrameNoMax; // 送信しようとしたフレーム番号の最大値
1049  uint32_t m_DataFirstSendCount; // 同期データの最初の送信回数設定
1050  uint64_t m_SendFrameBitmap; // 送信判定用ビットマップ
1051 
1052  // MonitoringData 用
1053  uint8_t m_MonitoringMinDelay; // ゲーム通信中の入力遅延の最小値
1054  uint8_t m_MonitoringMaxDelay; // ゲーム通信中の入力遅延の最大値
1055  uint8_t m_MonitoringMinSendPeriod; // 送信頻度の最小値
1056  uint8_t m_MonitoringMaxSendPeriod; // 送信頻度の最大値
1057  uint32_t m_MonitoringStepCount; // Step 呼び出し回数
1058  uint32_t m_MonitoringPreSendFrameNoMaxBuf; // 前回送信した最大フレーム番号保存用
1059  uint32_t m_MonitoringResendCountedFrameNoMax; // 再送フレームとしてカウント済みの最大フレーム番号
1060  uint8_t m_MonitoringResendFrameCnt; // 再送フレーム数カウント用
1061  uint8_t m_MonitoringMaxResendFrameNum; // 再送されたフレーム数の最大値
1062 };
1063 }
1064 }
1065 } // end of namespace nn::pia::sync