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: 26093 $ 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; //!< ネットワークの最大接続数の最大値です。現在この値は調整中で、12台以上の通信は動作保証範囲外となります。 38 const u8 ENDPOINT_MAX = 16; //!< 生成できる endpoint の最大数です。この値は将来変更される可能性があります。 39 40 const u16 UDS_PACKET_PAYLOAD_MAX_SIZE = 1478; //!< 一回の @ref nn::uds::CTR::SendTo で送信可能なデータの最大サイズです。 41 const u8 NET_DESC_APPDATA_SIZE_MAX = 200; //!< ビーコンにセットできる任意データの最大サイズです。 42 43 /*! 44 @name ローカル通信 ID 関連 45 @{ 46 */ 47 const bit32 TEST_UNIQUE_ID_MASK = 0x000FFF00; //!< テストプログラムや実験プロジェクトなど アプリケーションのユニーク ID が割り当てられない場合、0xFFF00 - 0xFFFFF をテスト用IDとして利用可能です。SDK のサンプルもこれを利用します。 48 /*! 49 @} 50 */ 51 /*! 52 @name 送受信オプション 53 @{ 54 */ 55 const bit8 NO_WAIT = 0x01; //!< @ref SendTo で指定した場合、UDS 内のバッファリングを省略し、即時無線送信を行います。 <BR> @ref Receive / @ref ReceiveFrom で指定した場合、データを受信していない場合でも即時終了します。 56 const bit8 FORCE_DIRECT_BC = 0x02; //SendTo で指定した場合、送信先を問わず Direct-Broadcast します。 57 const bit8 FORCE_UNICAST = 0x04; //SendTo で指定した場合、必ず Master を経由してパケットを送信します。 58 /*! 59 @} 60 */ 61 62 const u8 MAC_ADDRESS_SIZE = 6; 63 const u8 OUI_SIZE = 3; 64 65 /*! 66 @brief UDS のステートを表す列挙型です。 67 */ 68 enum State 69 { 70 STATE_NONE, //!< 未初期化 (Initialize をしていない) 状態です 71 STATE_PROCESSING_INITIALIZE, //!< Initialize 処理中を示す内部ステートです。アプリがこの値を取得することはありません 72 STATE_PROCESSING_FINALIZE, //!< Finalize 処理中を示す内部ステートです。アプリがこの値を取得することはありません 73 STATE_DISCONNECTED, //!< 通信を行っていない(未接続)状態です 74 STATE_CREATING_NETWORK, //!< 未接続状態から、新規にネットワークを構築し Master として動作するまでの中間ステートです。 自動的に STATE_MASTER に遷移します 75 STATE_DESTROYING_NETWORK, //!< Master としての動作を終了し、未接続状態になるまでの中間ステートです。 自動的に STATE_DISCONNECTED に遷移します 76 STATE_MASTER, //!< Master として動作している状態です 77 STATE_CONNECTING_NETWORK, //!< 未接続状態から、指定したネットワークを構築し Client もしくは Spectator として動作するまでの中間ステートです。接続に失敗した場合は STATE_DISCONNECTED に、接続に成功した場合は STATE_CLIENT/STATE_SPECTATOR に遷移します 78 STATE_DISCONNECTING_NETWORK, //!< ネットワークから離脱し、未接続状態になるまでの中間ステートです。 自動的に STATE_DISCONNECTED に遷移します。 79 STATE_CLIENT, //!< Client として動作している状態です。通信状況が悪化しネットワーク接続が維持できなくなった場合、自動的に STATE_DISCONNECTING_NETWORK に遷移します。 80 STATE_SPECTATOR, //!< Spectator として動作している状態です。通信状況が悪化しネットワーク接続が維持できなくなった場合、自動的に STATE_DISCONNECTING_NETWORK に遷移します。 81 STATE_ERROR, //!< UDS ライブラリを Finalize すべき状態です。UDS を使用中に無線スイッチが OFF されたり、スリープが発生した場合に遷移します。 82 STATE_MAX, 83 STATE_MAX_BIT = (1u << 31) 84 85 }; 86 87 const State STATE_AUDIENCE = STATE_SPECTATOR; 88 89 /*! 90 @brief 切断理由を表す列挙型です。 91 */ 92 enum DisconnectReason 93 { 94 BEFORE_COMMUNICATION, //!< まだ通信をしていない状態を示します。 95 NETWORK_IS_AVAILABLE, //!< 接続は維持されている 96 REQUEST_FROM_MYSELF, //!< 自身の操作でネットワークから切断した 97 REQUEST_FROM_SYSTEM, //!< CTR のシステムからの要求 (無線OFFモードへの遷移、スリープ遷移) でネットワークから切断した 98 DISCARDED_FROM_NETWORK, //!< Master からの指示でネットワークから追放された 99 CONNECTION_LOST, //!< 通信状況が悪化し、接続が維持できなくなった 100 UNKNOWN_DISCONNECT_REASON, //!< 未知の理由で切断された 101 DISCONNECT_REASON_MAX, 102 DISCONNECT_REASON_MAX_BIT = (1u << 31) 103 }; 104 105 /*! 106 @brief ネットワークに接続する際のモードを表す列挙型です。 107 */ 108 enum ConnectType 109 { 110 CONNECT_AS_CLIENT = 1, //!< Client ( 送受信が行え、接続時に ノードID が付与されるノード) としてネットワークに接続 111 CONNECT_AS_SPECTATOR, //!< Spectator ( 受信のみが可能な、接続時に ノードID が付与されないノード ) としてネットワークに接続 112 CONNECT_AS_MASTER //!< Master としてネットワークに接続 (ライブラリの内部でのみ使用します) 113 }; 114 115 const ConnectType CONNECT_AS_AUDIENCE = CONNECT_AS_SPECTATOR ; 116 117 /*! 118 @brief ネットワークの省電力モードを表す列挙型です。 119 */ 120 enum PowerSaveMode 121 { 122 ALWAYS_ACTIVE, //!< レイテンシ/トラフィック重視で、省電力機能を使わないモード 123 POWERSAVE_NORMAL, //!< 通常設定です。レイテンシが高くなりますが ALWAYS_ACTIVE よりも 20% 弱通信にかかる電力が低減します。 124 POWERSAVE_HIGH //!< 省電力重視設定です。レイテンシが高くなりますが ALWAYS_ACTIVE よりも 50% 弱通信にかかる電力が低減します。 125 }; 126 127 /*! 128 @brief 通信品質(リンクレベル) を表す列挙型です。 リンクレベルは現在調整中です。 129 */ 130 enum LinkLevel 131 { 132 LINK_LEVEL_0 = 0, //!< 非常に通信品質が悪い、もしくは通信が成立していない 133 LINK_LEVEL_1, //!< 通信品質が悪い 134 LINK_LEVEL_2, //!< 通信品質があまり良くない 135 LINK_LEVEL_3 //!< 通信品質がよい 136 }; 137 138 139 140 /*! 141 @brief UDS の接続状態を示す構造体です。 142 */ 143 struct ConnectionStatus 144 { 145 State nowState; //!< 現在のステート 146 DisconnectReason disconnectReason; //!< 切断理由。 ネットワーク接続中は必ず NETWORK_IS_AVAILABLE を返します 147 u16 myNodeId; //!< 自身のノードID 148 bit16 updateNodeBitmap; //!< 前回 GetConnectionStatus した時から変化のあった NodeID リストを示すビットマップです。 149 u16 nodeIdList[NODE_MAX]; //!< 現在ネットワークに接続しているノードの一覧。 150 u8 nowEntry; //!< ネットワークに接続しているノードの数 151 u8 maxEntry; //!< ネットワークの最大同時接続数 (通信中に変化することはありません) 152 bit16 slotBitmap; //!< どのスロットにノード情報が格納されているかを示すビットマップです。 @ref updateNodeBitmap と異なり、前回の差分ではありません。 153 }; 154 155 /*! 156 @brief ネットワークに接続しているノードのユーザー情報を示す構造体です。 157 */ 158 struct NodeInformation 159 { 160 u64 friendCode; //!< ローカルフレンドコード。 ユーザー毎に固有の値が振り分けられますのでユーザーの識別に利用可能です 161 nn::cfg::CTR::UserName userName; //!< ユーザー名情報です。 詳細は @ref nn::cfg::CTR::UserName を参照してください 162 u16 nodeId; //!< ノードID 163 NN_PADDING2; 164 NN_PADDING2; //8Byte 整合の必要があるため 165 NN_PADDING2; 166 }; 167 168 const u8 NODE_INFORMATION_SIZE = sizeof(NodeInformation); 169 170 /*! 171 @brief endpoint ディスクリプタ。ソケット記述子に相当します。 172 現在は ID のみを格納していますが、今後フィールドが追加される可能性があります。 173 */ 174 struct EndpointDescriptor 175 { 176 u32 id; //!< @ref CreateEndpoint を実行する毎に振り分けられる ID です。 177 }; 178 179 //TODO: SDKでエンディアン変換マクロがサポートされるまでの繋ぎ。 180 181 /* 182 inline u32 UDS_BE2LE32( u32 value) 183 { 184 NN_ASM("rev value, value"); 185 return value; 186 } 187 */ 188 189 //以下 内部処理で使用する定義です。 190 namespace detail{ 191 struct NodeInformationList 192 { 193 NodeInformation nodeInfo[NODE_MAX]; 194 }; 195 196 // DestroyEndpoint 時に取得可能な Endpoint 毎の受信結果 197 struct ReceiveReport 198 { 199 u32 id; //!< Endpoint の ID ( EndpointDescriptor.id ) 200 u16 targetNodeId; //!< 対象ノード ID 201 u16 port; //!< ポート番号 202 u32 receiveCount; //!< Attach した Endpoint が受信したパケット総数 203 u32 lostCount; //!< 受信バッファ溢れによってロストしたパケット数 204 }; 205 UDS_BE2LE16(u16 value)206 inline u16 UDS_BE2LE16( u16 value ) 207 { 208 return static_cast<u16>( (((value) & 0xFF00UL) >> 8UL) | (((value) & 0x00FFUL) << 8UL)); 209 } 210 UDS_BE2LE32(u32 value)211 inline u32 UDS_BE2LE32( u32 value ) 212 { 213 return static_cast<u32>( (((value) & 0xFF000000UL) >> 24UL) | (((value) & 0x00FF0000UL) >> 8UL) | (((value) & 0x0000FF00UL) << 8UL) | (((value) & 0x000000FFUL) << 24UL)); 214 } 215 UDS_BE2LE64(u64 value)216 inline u64 UDS_BE2LE64( u64 value ) 217 { 218 u64 returnValue; 219 u32* tmpA = reinterpret_cast<u32*>(&(returnValue)); 220 u32* tmpB = reinterpret_cast<u32*>(&(value)); 221 222 tmpA[0] = UDS_BE2LE32(tmpB[1]); 223 tmpA[1] = UDS_BE2LE32(tmpB[0]); 224 225 return returnValue; 226 } 227 UDS_LE2BE32(u32 value)228 inline u32 UDS_LE2BE32( u32 value) 229 { 230 return static_cast<u32>( (((value) & 0xFF000000UL) >> 24UL) | (((value) & 0x00FF0000UL) >> 8UL) | (((value) & 0x0000FF00UL) << 8UL) | (((value) & 0x000000FFUL) << 24UL)); 231 } 232 UDS_LE2BE16(u16 value)233 inline u16 UDS_LE2BE16( u16 value ) 234 { 235 return static_cast<u16>( (((value) & 0xFF00UL) >> 8UL) | (((value) & 0x00FFUL) << 8UL)); 236 } 237 UDS_LE2BE64(u64 value)238 inline u64 UDS_LE2BE64( u64 value ) 239 { 240 u64 returnValue; 241 u32* tmpA = reinterpret_cast<u32*>(&(returnValue)); 242 u32* tmpB = reinterpret_cast<u32*>(&(value)); 243 244 tmpA[0] = UDS_LE2BE32(tmpB[1]); 245 tmpA[1] = UDS_LE2BE32(tmpB[0]); 246 247 return returnValue; 248 } 249 250 /* 251 inline u32 UDS_LE2BE32( u32 value) 252 { 253 NN_ASM("rev value, value"); 254 return value; 255 } 256 */ 257 258 } //end of namespace detail 259 260 } // end of namespace CTR 261 } // end of namespace uds 262 } // end of namespace nn 263 264 #endif /* NN_UDS_CTR_UDS_TYPE_H_ */ 265