1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     uds_Type.h
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 33784 $
14  *---------------------------------------------------------------------------*/
15 
16 /*! @file
17     @brief    UDS 型の定義
18 */
19 
20 #ifndef NN_UDS_CTR_UDS_TYPE_H_
21 #define NN_UDS_CTR_UDS_TYPE_H_
22 
23 #include <nn.h>
24 #include <nn/cfg.h>
25 
26 namespace nn {
27 namespace uds {
28 namespace CTR {
29 
30     namespace
31     {
32         const char PORT_NAME_UDS[]    = "nwm::UDS";
33     }
34 
35 const u16 BROADCAST_NODE_ID = 0xffff;               //!<ネットワークの全ノード宛を示す ノード ID です。 BROADCAST_NODE_ID 宛に送信したデータは Spectator も取得可能です。
36 
37 const u8 NODE_MAX     = 16;                         //!< ネットワークの最大接続数の最大値です。将来的に 16 台通信をサポートする予定ですが、CTR-SDK 0.14 現在では多台数での十分な動作確認が行えていないため 13 台以上の通信は動作保証範囲外とします。
38 const u8 ENDPOINT_MAX = 16;                         //!< 生成できる endpoint の最大数です。この値は将来変更される可能性があります。
39 
40 
41 /*!
42   @name   送受信データサイズ関連
43   @{
44 */
45 const u8  NET_DESC_APPDATA_SIZE_MAX      = 200;     //!< ビーコンにセットできる任意データの最大サイズです。
46 const u16 UDS_PACKET_PAYLOAD_MAX_SIZE   = 1478;     //!< 一回の @ref nn::uds::CTR::SendTo で送信可能なデータの最大サイズです。
47 const size_t ATTACH_BUFFER_SIZE_MIN     = (UDS_PACKET_PAYLOAD_MAX_SIZE + 128); 	//!< @ref Attach で指定する受信バッファの最小値です。 UDS_PACKET_PAYLOAD_MAX_SIZE にシステム管理領域を追加した値となっています。
48 const size_t ATTACH_BUFFER_SIZE_DEFAULT = (UDS_PACKET_PAYLOAD_MAX_SIZE * 8);   	//!< @ref Attach で指定する受信バッファのデフォルトサイズです。
49 /*!
50   @}
51 */
52 /*!
53   @name   パスフレーズの文字列長
54   @{
55 */
56 const size_t UDS_PASSPHRASE_LENGTH_MIN = 8;         //!< 通信に使用する暗号鍵生成のパスフレーズの最小サイズです。
57 const size_t UDS_PASSPHRASE_LENGTH_MAX = 255;       //!< 通信に使用する暗号鍵生成のパスフレーズの最大サイズです。
58 /*!
59   @}
60 v*/
61 
62 /*!
63   @name   ローカル通信 ID 関連
64   @{
65 */
66 const bit32 TEST_UNIQUE_ID_MASK = 0x000FFF00;  //!< テストプログラムや実験プロジェクトなど アプリケーションのユニーク ID が割り当てられない場合、0xFFF00 - 0xFFFFF をテスト用IDとして利用可能です。SDK のサンプルもこれを利用します。
67 /*!
68   @}
69 */
70 /*!
71   @name   送受信オプション
72   @{
73 */
74 const bit8 NO_WAIT = 0x01;         //!< @ref SendTo で指定した場合、UDS 内のバッファリングを省略し、即時無線送信を行います。 <BR> @ref Receive / @ref ReceiveFrom で指定した場合、データを受信していない場合でも即時終了します。
75 const bit8 FORCE_DIRECT_BC = 0x02; //!< @ref SendTo で指定した場合、送信先を問わず Direct Broadcast 送信します。Client 間の Unicast 通信もMaster を介さないため、低レイテンシで通信できますが、隠れ端末問題が生じます。
76 const bit8 FORCE_UNICAST   = 0x04; //!< @ref SendTo で指定した場合、Client は必ず Master を経由してパケットを送信します。隠れ端末問題を考慮する必要がなくなりますが、Client の送信のレイテンシが高くなります。
77 /*!
78   @}
79 */
80 
81 const u8 MAC_ADDRESS_SIZE   = 6;
82 const u8 OUI_SIZE           = 3;
83 
84 /*!
85   @brief        UDS のステートを表す列挙型です。
86 */
87 enum State
88 {
89     STATE_NONE,                     //!< 未初期化 (Initialize をしていない) 状態です
90     STATE_PROCESSING_INITIALIZE,    //!< Initialize 処理中を示す内部ステートです。アプリがこの値を取得することはありません
91     STATE_PROCESSING_FINALIZE,      //!< Finalize 処理中を示す内部ステートです。アプリがこの値を取得することはありません
92     STATE_DISCONNECTED,             //!< 通信を行っていない(未接続)状態です
93     STATE_CREATING_NETWORK,         //!< 未接続状態から、新規にネットワークを構築し Master として動作するまでの中間ステートです。 自動的に STATE_MASTER に遷移します
94     STATE_DESTROYING_NETWORK,       //!< Master としての動作を終了し、未接続状態になるまでの中間ステートです。 自動的に STATE_DISCONNECTED に遷移します
95     STATE_MASTER,                   //!< Master として動作している状態です
96     STATE_CONNECTING_NETWORK,       //!< 未接続状態から、指定したネットワークを構築し Client もしくは Spectator として動作するまでの中間ステートです。接続に失敗した場合は STATE_DISCONNECTED に、接続に成功した場合は STATE_CLIENT/STATE_SPECTATOR に遷移します
97     STATE_DISCONNECTING_NETWORK,    //!< ネットワークから離脱し、未接続状態になるまでの中間ステートです。 自動的に STATE_DISCONNECTED に遷移します。
98     STATE_CLIENT,                   //!< Client として動作している状態です。通信状況が悪化しネットワーク接続が維持できなくなった場合、自動的に STATE_DISCONNECTING_NETWORK に遷移します。
99     STATE_SPECTATOR,                //!< Spectator として動作している状態です。通信状況が悪化しネットワーク接続が維持できなくなった場合、自動的に STATE_DISCONNECTING_NETWORK に遷移します。
100     STATE_ERROR,                    //!< UDS ライブラリを Finalize すべき状態です。UDS を使用中に無線スイッチが OFF されたり、スリープが発生した場合に遷移します。
101     STATE_MAX,
102     STATE_MAX_BIT = (1u << 31)
103 
104 };
105 
106 const State STATE_AUDIENCE = STATE_SPECTATOR;
107 
108 /*!
109   @brief        切断理由を表す列挙型です。
110 */
111 enum DisconnectReason
112 {
113     BEFORE_COMMUNICATION,       //!< まだ通信をしていない状態を示します。
114     NETWORK_IS_AVAILABLE,       //!< 接続は維持されている
115     REQUEST_FROM_MYSELF,        //!< 自身の操作でネットワークから切断した
116     REQUEST_FROM_SYSTEM,        //!< CTR のシステムからの要求 (無線OFFモードへの遷移、スリープ遷移) でネットワークから切断した
117     DISCARDED_FROM_NETWORK,     //!< Master からの指示でネットワークから追放された
118     CONNECTION_LOST,            //!< 通信状況が悪化し、接続が維持できなくなった
119     UNKNOWN_DISCONNECT_REASON,   //!< 未知の理由で切断された
120     DISCONNECT_REASON_MAX,
121     DISCONNECT_REASON_MAX_BIT = (1u << 31)
122 };
123 
124 /*!
125   @brief        ネットワークに接続する際のモードを表す列挙型です。
126 */
127 enum ConnectType
128 {
129     CONNECT_AS_CLIENT = 1,          //!< Client ( 送受信が行え、接続時に ノードID が付与されるノード)  としてネットワークに接続
130     CONNECT_AS_SPECTATOR,           //!< Spectator ( 受信のみが可能な、接続時に ノードID が付与されないノード ) としてネットワークに接続
131     CONNECT_AS_MASTER               //!< Master としてネットワークに接続 (ライブラリの内部でのみ使用します)
132 };
133 
134 const ConnectType CONNECT_AS_AUDIENCE  = CONNECT_AS_SPECTATOR ;
135 
136 /*!
137   @brief        ネットワークの省電力モードを表す列挙型です。
138 */
139 enum PowerSaveMode
140 {
141     ALWAYS_ACTIVE,      //!< レイテンシ/トラフィック重視で、省電力機能を使わないモード
142     POWERSAVE_NORMAL,   //!< 通常設定です。レイテンシが高くなりますが ALWAYS_ACTIVE よりも 20% 弱通信にかかる電力が低減します。
143     POWERSAVE_HIGH,      //!< 省電力重視設定です。レイテンシが高くなりますが ALWAYS_ACTIVE よりも 50% 弱通信にかかる電力が低減します。
144     POWERSAVE_MODE_MAX
145 };
146 
147 /*!
148   @brief        通信品質(リンクレベル) を表す列挙型です。
149 */
150 enum LinkLevel
151 {
152     LINK_LEVEL_0 = 0,   //!< 非常に通信品質が悪い、もしくは通信が成立していない
153     LINK_LEVEL_1,       //!< 通信品質が悪い
154     LINK_LEVEL_2,       //!< 通信品質があまり良くない
155     LINK_LEVEL_3        //!< 通信品質がよい
156 };
157 
158 
159 
160 /*!
161   @brief        UDS の接続状態を示す構造体です。
162 */
163 struct ConnectionStatus
164 {
165     State               nowState;                   //!< 現在のステート
166     DisconnectReason    disconnectReason;           //!< 切断理由。 ネットワーク接続中は必ず NETWORK_IS_AVAILABLE を返します
167     u16                 myNodeId;                   //!< 自身のノードID
168     bit16               updateNodeBitmap;           //!< 前回 GetConnectionStatus した時から変化のあった NodeID リストを示すビットマップです。
169     u16                 nodeIdList[NODE_MAX];       //!< 現在ネットワークに接続しているノードの一覧。
170     u8                  nowEntry;                   //!< ネットワークに接続しているノードの数
171     u8                  maxEntry;                   //!< ネットワークの最大同時接続数 (通信中に変化することはありません)
172     bit16               slotBitmap;                 //!< どのスロットにノード情報が格納されているかを示すビットマップです。 updateNodeBitmap と異なり、前回の差分ではありません。
173 };
174 
175 static const size_t SCRAMBLED_LOCAL_FRINED_CODE_SIZE = 12; //!< @ref ScrambledLocalFriendCode のバイト長です。
176 
177 /*!
178   @brief @ref friends ライブラリを利用することで、ローカルフレンドコードに変換可能な情報です。
179 
180         ローカル通信でフレンド機能を容易に行えるように、かつ特定ユーザーの追跡は出来ないというユーザーのプライバシーを守る意味合いから
181         UDS ライブラリではローカルフレンドコードそのものではなく、 @ref friends ライブラリに問い合わせることでローカルフレンドコードを
182         取得可能な @ref SCRAMBLED_LOCAL_FRINED_CODE_SIZE Byte のデータ列を取得するようにしています。
183 
184         このデータは同じデバイスでも次回の通信では別の値になるため、デバイスを特定する用途には利用できません。
185 */
186 struct ScrambledLocalFriendCode
187 {
188         bit16 value[SCRAMBLED_LOCAL_FRINED_CODE_SIZE/sizeof(bit16)];
189 };
190 
191 /*!
192   @brief        ネットワークに接続しているノードのユーザー情報を示す構造体です。
193 */
194 struct NodeInformation
195 {
196     ScrambledLocalFriendCode scrambledLocalFriendCode; //!< プライバシー保護を考慮した、friends ライブラリ経由でローカルフレンドコードに変換可能なデータです。
197     nn::cfg::CTR::UserName userName; //!< ユーザー名情報です。 詳細は @ref nn::cfg::CTR::UserName を参照してください
198     u16     nodeId;             //!< ノードID
199     NN_PADDING2;
200 };
201 
202 const u8 NODE_INFORMATION_SIZE = sizeof(NodeInformation);
203 
204 /*!
205   @brief        endpoint ディスクリプタ。ソケット記述子に相当します。
206 
207                 現在は ID のみを格納していますが、今後フィールドが追加される可能性があります。
208 */
209 struct EndpointDescriptor
210 {
211     u32  id;                 //!< @ref CreateEndpoint を実行する毎に振り分けられる ID です。
212 };
213 
214 
215 //以下 内部処理で使用する定義です。
216 namespace detail{
217 
218     /*!
219     :private
220     @brief RadioStrengthInfo クラス内部用の構造体です。
221     */
222     struct RadioStrength
223     {
224         s8   rssi;
225         bool isValid;
226     };
227 
228     /*!
229     :private
230     @class nn::uds::CTR::detail::RadioStrengthInfo
231     @brief GeLinkLevel よりも詳細な受信している電波の強さを取得します。@ref GetRadioStrangthInfo で取得してください。
232            取得できる値は相対的な電波の強弱を判断するための指標としてお使い下さい。
233     */
234     class RadioStrengthInfo
235     {
236     public:
RadioStrengthInfo()237         RadioStrengthInfo(){m_IsInitialized = false;}
238         void Initialize( const RadioStrength& masterLink, const RadioStrength directLink[NODE_MAX] );
~RadioStrengthInfo()239         ~RadioStrengthInfo(){m_IsInitialized = false;}
240 
241         s8 GetAverage();    //!< 自身が受信している電波強度の平均値
242         s8 GetMinimum();    //!< 自身が受信している電波強度の最小値
243         s8 GetMaximum();    //!< 自身が受信している電波強度の最大値
244         s8 GetMasterLink(); //!< Master から受信される電波の強度、自身が Master の場合は 0
245 
246     private:
247         bool m_IsInitialized;
248         void GetRawData(s8 rawLink[NODE_MAX] ); //!< 自身が受信している電波の強度の生データを取得 (0=無効なデータ)
249 
250         RadioStrength m_MasterLink;
251         RadioStrength m_DirectLink[NODE_MAX];
252     };
253 
254     // DestroyEndpoint 時に取得可能な Endpoint 毎の受信結果
255     struct ReceiveReport
256     {
257         u32 id;             //!< Endpoint の ID ( EndpointDescriptor.id )
258         u16 targetNodeId;   //!< 対象ノード ID
259         u16 port;           //!< ポート番号
260         u32 receiveCount;   //!< Attach した Endpoint が受信したパケット総数
261         u32 lostCount;      //!< 受信バッファ溢れによってロストしたパケット数
262     };
263 
UDS_BE2LE16(u16 value)264     inline u16 UDS_BE2LE16( u16 value )
265     {
266         return static_cast<u16>( (((value) & 0xFF00UL) >> 8UL) | (((value) & 0x00FFUL) << 8UL));
267     }
268 
UDS_BE2LE32(u32 value)269     inline u32 UDS_BE2LE32( u32 value )
270     {
271     return static_cast<u32>( (((value) & 0xFF000000UL) >> 24UL) | (((value) & 0x00FF0000UL) >> 8UL) | (((value) & 0x0000FF00UL) << 8UL) | (((value) & 0x000000FFUL) << 24UL));
272     }
273 
UDS_BE2LE64(u64 value)274     inline u64 UDS_BE2LE64( u64 value )
275     {
276         u64 returnValue;
277         u32* tmpA = reinterpret_cast<u32*>(&(returnValue));
278         u32* tmpB = reinterpret_cast<u32*>(&(value));
279 
280         tmpA[0] = UDS_BE2LE32(tmpB[1]);
281         tmpA[1] = UDS_BE2LE32(tmpB[0]);
282 
283         return returnValue;
284     }
285 
UDS_LE2BE32(u32 value)286     inline u32 UDS_LE2BE32( u32 value)
287     {
288         return static_cast<u32>( (((value) & 0xFF000000UL) >> 24UL) | (((value) & 0x00FF0000UL) >> 8UL) | (((value) & 0x0000FF00UL) << 8UL) | (((value) & 0x000000FFUL) << 24UL));
289     }
290 
UDS_LE2BE16(u16 value)291     inline u16 UDS_LE2BE16( u16 value )
292     {
293         return static_cast<u16>( (((value) & 0xFF00UL) >> 8UL) | (((value) & 0x00FFUL) << 8UL));
294     }
295 
UDS_LE2BE64(u64 value)296     inline u64 UDS_LE2BE64( u64 value )
297     {
298         u64 returnValue;
299         u32* tmpA = reinterpret_cast<u32*>(&(returnValue));
300         u32* tmpB = reinterpret_cast<u32*>(&(value));
301 
302         tmpA[0] = UDS_LE2BE32(tmpB[1]);
303         tmpA[1] = UDS_LE2BE32(tmpB[0]);
304 
305         return returnValue;
306     }
307 
308 /*
309 inline u32 UDS_LE2BE32( u32 value)
310 {
311     NN_ASM("rev value, value");
312     return value;
313 }
314 */
315 
316 } //end of namespace detail
317 
318 } // end of namespace CTR
319 } // end of namespace uds
320 } // end of namespace nn
321 
322 #endif /* NN_UDS_CTR_UDS_TYPE_H_ */
323