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