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