1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     dlp_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 
14  *---------------------------------------------------------------------------*/
15 #ifndef NN_DLP_CTR_DLP_TYPE_H_
16 #define NN_DLP_CTR_DLP_TYPE_H_
17 
18 #include <nn/Handle.h>
19 #include <nn/Result.h>
20 #include <nn/types.h>
21 #include <nn/cfg.h>
22 #include <nn/uds.h>
23 
24 namespace nn {
25 namespace dlp {
26 namespace CTR {
27 /*!--------------------------------------------------------------------------*
28     @name   サイズ、数の定義
29     @{
30   *--------------------------------------------------------------------------*/
31 const size_t    MAX_CHILD_IMPORT_SIZE           = 32 * 1024 * 1024;     //!< 子機プログラムの最大サイズ
32 const s32       SHORT_TITLE_NAME_LENGTH         = 64;                   //!< 1 行タイトル名の文字長
33 const s32       LONG_TITLE_NAME_LENGTH          = 128;                  //!< 2 行タイトル名の文字長
34 const s32       ICON_HEIGHT_PIXEL               = 48;                   //!< アイコンのピクセル高
35 const s32       ICON_WIDTH_PIXEL                = 48;                   //!< アイコンのピクセル幅
36 const s32       ICON_PIXEL_COUNT                = ICON_WIDTH_PIXEL * ICON_HEIGHT_PIXEL; //!< アイコンのピクセル数
37 const s32       RATING_INFO_SIZE                = 16;                   //!< ペアレンタルコントロールの情報サイズ
38 const u16       MAX_NODE_NUM                    = nn::uds::NODE_MAX;    //!< サーバを含むネットワークに存在する最大のノード数
39 const u16       MAX_CLIENT_NUM                  = MAX_NODE_NUM - 1;     //!< サーバに接続可能なクライアントの最大台数
40 const u8        MAX_SCAN_NUM                    = 16;                   //!< クライアントにおいて一度にスキャンできるタイトルの最大数
41 const size_t    MIN_NETWORK_BLOCK_BUFFER_NUM    = 2;                    //!< ネットワークブロックバッファの最低数
42 const size_t    MAX_NETWORK_BLOCK_BUFFER_NUM    = 4;                    //!< ネットワークブロックバッファの最大数
43 const size_t    MIN_NETWORK_BLOCK_BUFFER_SIZE   = 128*1024;             //!< ネットワークブロックバッファの最低サイズ
44 const size_t    MAX_NETWORK_BLOCK_BUFFER_SIZE   = 512*1024;             //!< ネットワークブロックバッファの最大サイズ
45 
46 /*!
47      @}
48  */
49 
50 
51 /*!--------------------------------------------------------------------------*
52   @brief   ダウンロードセッションの種類
53  *--------------------------------------------------------------------------*/
54 enum SessionType
55 {
56     SESSION_TYPE_INVALID            = 0,
57     SESSION_TYPE_TITLE              = 1,        //!< タイトルのダウンロードセッション
58     SESSION_TYPE_SYSTEM             = 2         //!< タイトルを起動するのに必要なシステムのダウンロードセッション
59 };
60 
61 
62 /*!--------------------------------------------------------------------------*
63   @brief        クライアントの状態
64  *---------------------------------------------------------------------------*/
65 enum ClientState
66 {
67     CLIENT_STATE_INVALID                        = 0x00,    //!< サーバでこの状態を認識できません。クライアントは未初期化の状態です。
68     CLIENT_STATE_DISCONNECTED_NETWORK           = 0x01,    //!< サーバでこの状態を認識できません。ネットワークに接続していない 状態です。
69     CLIENT_STATE_SCANNING                       = 0x02,    //!< サーバでこの状態を認識できません。スキャン中の状態です。
70     CLIENT_STATE_WAITING_CONNECT                = 0x03,    //!< サーバでこの状態を認識できません。ネットワークへの接続を待っています。
71     CLIENT_STATE_WAITING_INVITE                 = 0x04,    //!< ネットワークに接続しました。サーバからのINVITEコマンドを待っています。
72     CLIENT_STATE_JOINED_SESSION                 = 0x05,    //!< セッションへ 参加しています。
73     CLIENT_STATE_DOWNLOADING                    = 0x06,    //!< ダウンロード中です。ただし、サーバからデータが出ていない場合も含みます。
74     CLIENT_STATE_DOWNLOAD_COMPLETE              = 0x07,    //!< ダウンロードが完了した状態です。
75     CLIENT_STATE_RECONNECTING_NETWORK           = 0x08,    //!< システムのダウンロード後に、アプリケーションの再接続処理を待っている状態です。
76     CLIENT_STATE_REBOOTING                      = 0x09,    //!< サーバでこの状態を認識できません。ダウンロード後に、アプリケーションのリブート処理を待っている状態です。
77     CLIENT_STATE_ERROR                          = 0x80,    //!< サーバでこの状態を認識できません。エラーが発生し再初期化しないといけない状態です。遷移条件は、Initialize() から Finalize() の間に SLEEP か WIFI ボタンが OFF になるか、ダウンロードセッション開始後(CLIENT_STATE_WAITING_INVITE から CLIENT_STATE_REBOOTING) にサーバから切断されるか他のクライアントが切断することです。
78     CLIENT_STATE_WAITING_ACCEPT                 = 0x40,    //!< クライアントでこの状態を認識できません。ネットワークに接続していますが、サーバの ACCEPT を待っています。
79     CLIENT_STATE_CONFIRMING_DOWNLOAD_PROGRESS   = 0x41     //!< クライアントでこの状態を認識できません。ダウンロードの進捗を確認しています。
80 };
81 
82 
83 /*!--------------------------------------------------------------------------*
84   @brief        サーバの状態
85  *---------------------------------------------------------------------------*/
86 enum ServerState
87 {
88     SERVER_STATE_INVALID = 0,                       //!< サーバは未初期化の状態です。
89     SERVER_STATE_INITIALIZED,                       //!< 初期化が完了した状態です。
90     SERVER_STATE_OPENED_SESSIONS,                   //!< セッションへの参加を受け付けている状態です。
91     SERVER_STATE_PREPARING_FOR_SYSTEM_DISTRIBUTION, //!< システム配信を行う前の状態です。
92     SERVER_STATE_DISTRIBUTING_SYSTEM,               //!< システムを配信している状態です。
93     SERVER_STATE_WAITING_RECONNECT,                 //!< システム配信後にリブートしたクライアントが再接続してくるのを待っている状態です。クライアントは必ず再接続するとは限らないので 、ユーザが ダウンロードプレイを中断できるようにしてください。
94     SERVER_STATE_PREPARING_FOR_TITLE_DISTRIBUTION,  //!< サーバがタイトル配信を行う前の状態です。
95     SERVER_STATE_DISTRIBUTING_TITLE,                //!< サーバがタイトルを配信している状態です。
96     SERVER_STATE_COMPLETE_DISTRIBUTION,             //!< サーバがシステム、タイトルの配信を完了した状態です。
97     SERVER_STATE_REBOOTING_CLIENTS,                 //!< サーバがクライアントのリブートを行っている状態です。全てのクライアントの切断を確認したら、ダウンロードプレイを終了してください。 その後、 ローカル通信を行う場合は、UDS でクライアントの接続を待ってください。ただし、クライアントは必ず再接続するとは限らないので注意してください。
98     SERVER_STATE_ERROR                              //!< エラーが発生し再初期化しないといけない状態です。遷移条件は、Initialize() から Finalize() の間に SLEEP か WIFI ボタンが OFF になるか、ダウンロードセッション開始後(SERVER_STATE_PREPARING_FOR_SYSTEM_DISTRIBUTION から SERVER_STATE_COMPLETE_DISTRIBUTION) に CLIENT_STATE_RECONNECTING_NETWORK 以外のクライアントが切断するかカードが抜けることです。
99 };
100 
101 
102 /*!--------------------------------------------------------------------------*
103   @brief        通知されるイベントの種類
104  *---------------------------------------------------------------------------*/
105 enum EventType
106 {
107     EVENT_TYPE_INVALID = 0,
108     // SERVER
109     EVENT_TYPE_SERVER_STATE_PREPARING_FOR_SYSTEM_DISTRIBUTION,  //!< サーバにおいて SERVER_STATE_PREPARING_FOR_SYSTEM_DISTRIBUTION 状態に遷移したときのイベント
110     EVENT_TYPE_SERVER_STATE_DISTRIBUTING_SYSTEM,               //!< サーバにおいて SERVER_STATE_DISTRIBUTING_SYSTEM 状態に遷移したときのイベント
111     EVENT_TYPE_SERVER_STATE_WAITING_RECONNECT,                 //!< サーバにおいて SERVER_STATE_WAITING_RECONNECT 状態に遷移したときのイベント
112     EVENT_TYPE_SERVER_STATE_PREPARING_FOR_TITLE_DISTRIBUTION,  //!< サーバにおいて SERVER_STATE_PREPARING_FOR_TITLE_DISTRIBUTION 状態に遷移したときのイベント
113     EVENT_TYPE_SERVER_STATE_DISTRIBUTING_TITLE,                //!< サーバにおいて SERVER_STATE_DISTRIBUTING_TITLE 状態に遷移したときのイベント
114     EVENT_TYPE_SERVER_STATE_COMPLETE_DISTRIBUTION,             //!< サーバにおいて SERVER_STATE_COMPLETE_DISTRIBUTION 状態に遷移したときのイベント
115     EVENT_TYPE_SERVER_STATE_ERROR,                             //!< サーバにおいて SERVER_STATE_ERROR 状態に遷移したときのイベント
116 
117     // CLIENT
118     EVENT_TYPE_CLIENT_DISCOVERED_SERVER,                        //!< クライアントにおいて サーバーが発見されましたときのイベント
119     EVENT_TYPE_CLIENT_SCAN_BUFFER_FULL,                         //!< クライアントにおいて スキャンバッファがいっぱいになったときのイベント(サーバーの情報の更新は続けられます。)
120     EVENT_TYPE_CLIENT_DISCOVERED_TITLE,                         //!< クライアントにおいて タイトルが発見されたときのイベント
121     EVENT_TYPE_CLIENT_STATE_WAITING_INVITE,                     //!< クライアントにおいて CLIENT_STATE_WAITING_INVITE 状態に遷移したときのイベント
122     EVENT_TYPE_CLIENT_STATE_JOINED_SESSION,                     //!< クライアントにおいて CLIENT_STATE_JOINED_SESSION 状態に遷移したときのイベント
123     EVENT_TYPE_CLIENT_STATE_DOWNLOADING,                        //!< クライアントにおいて CLIENT_STATE_DOWNLOADING 状態に遷移したときのイベント
124     EVENT_TYPE_CLIENT_STATE_DOWNLOAD_COMPLETE,                  //!< クライアントにおいて CLIENT_STATE_DOWNLOAD_COMPLETE 状態に遷移したときのイベント
125     EVENT_TYPE_CLIENT_STATE_RECONNECTING_NETWORK,               //!< クライアントにおいて CLIENT_STATE_RECONNECTING_NETWORK 状態に遷移したときのイベント
126     EVENT_TYPE_CLIENT_STATE_REBOOTING,                          //!< クライアントにおいて CLIENT_STATE_REBOOTING 状態に遷移したときのイベント
127     EVENT_TYPE_CLIENT_STATE_DISCONNECTED_NETWORK,               //!< クライアントにおいて CLIENT_STATE_DISCONNECTED_NETWORK 状態に遷移したときのイベント
128     EVENT_TYPE_CLIENT_STATE_ERROR                               //!< クライアントにおいて CLIENT_STATE_ERROR 状態に遷移したときのイベント
129 };
130 
131 
132 /*!--------------------------------------------------------------------------*
133   @brief        EventDesc の type が EVENT_TYPE_CLIENT_DISCOVERED_SERVER のときのイベント情報です。
134  *---------------------------------------------------------------------------*/
135 typedef struct
136 {
137     u8 mac[6];                                  //!< スキャンによって発見されたサーバの MAC アドレスです。
138     NN_PADDING2;
139 } ClientDiscoveredServer;
140 
141 
142 /*!--------------------------------------------------------------------------*
143   @brief        EventDesc の type が EVENT_TYPE_CLIENT_DISCOVERED_TITLE のときのイベント情報です。
144  *---------------------------------------------------------------------------*/
145 typedef struct
146 {
147     u32             uniqueId;                   //!< スキャンによって発見されたタイトルの Unique ID です。
148     u8              childIndex;                 //!< スキャンによって発見されたタイトルの Child index です。
149     NN_PADDING3;
150     u8              mac[6];                     //!< スキャンによって発見されたタイトルを持つサーバの MAC アドレスです。
151     u16             programVersion;             //!< スキャンによって発見されたタイトルのプログラムバージョンです。
152 } ClientDiscoveredTitle;
153 
154 
155 /*!--------------------------------------------------------------------------*
156   @brief        EventDesc の type が EVENT_TYPE_CLIENT_STATE_WAITING_INVITE のときのイベント情報です。
157  *---------------------------------------------------------------------------*/
158 typedef struct
159 {
160     u16 nodeId;                                 //!< 自分の ノード ID です。
161     NN_PADDING2;
162 } ClientStateWaitingInvite;
163 
164 
165 /*!--------------------------------------------------------------------------*
166   @brief        DLP 内で発生したイベントを通知します。 type メンバによって情報が変わります。
167  *---------------------------------------------------------------------------*/
168 typedef struct
169 {
170     EventType type;
171     NN_PADDING3;
172     NN_PADDING4;
173     union{
174         // Client
175         ClientDiscoveredServer      clientDiscoveredServer;
176         ClientDiscoveredTitle       clientDiscoveredTitle;
177         ClientStateWaitingInvite    clientStateWaitingInvite;
178 
179         u8 placeHolder[16]; // IPC 用
180     } ;
181 } EventDesc;
182 
183 
184 /*!--------------------------------------------------------------------------*
185   @brief        ノードの情報
186  *---------------------------------------------------------------------------*/
187 typedef nn::uds::NodeInformation NodeInfo;
188 
189 
190 /*!--------------------------------------------------------------------------*
191   @brief        クライアントの状態、ダウンロードの進捗
192  *---------------------------------------------------------------------------*/
193 typedef struct
194 {
195     u16             nodeId;                   //!< ノードID
196     SessionType     sessionType;              //!< 参加しているダウンロードセッションの種類
197     ClientState     state;                    //!< クライアントの状態
198     size_t          totalNum;                 //!< ダウンロードしなくてはならない総数 (パケット数)
199     size_t          downloadedNum;            //!< ダウンロード済みの数(パケット数)
200 } ClientStatus;
201 
202 /*!--------------------------------------------------------------------------*
203   @brief        アイコンの情報
204  *---------------------------------------------------------------------------*/
205 typedef struct
206 {
207    bit16                            image[ICON_PIXEL_COUNT];    //!< アイコンの画像データ
208 } IconInfo;
209 
210 
211 /*!--------------------------------------------------------------------------*
212   @brief        タイトルの情報
213  *---------------------------------------------------------------------------*/
214 typedef struct
215 {
216     u32                             uniqueId;                                   //!< Unique ID
217     u8                              childIndex;                                 //!< Child index
218     NN_PADDING3;
219     u8                              mac[6];                                     //!< サーバのMACアドレス
220     u16                             programVersion;                             //!< プログラムのバージョン
221     bit8                            ratingInfo[RATING_INFO_SIZE];               //!< レーティング情報
222     wchar_t                         shortTitleName[SHORT_TITLE_NAME_LENGTH];    //!< 1 行のタイトル名
223     wchar_t                         longTitleName[LONG_TITLE_NAME_LENGTH];      //!< 2 行のタイトル名
224     IconInfo                        icon;                                       //!< アイコン情報
225     u32                             importSize;                                 //!< インポートに必要な NAND のバイトサイズ
226     nn::cfg::CfgRegionCode          region;                                     //!< リージョン
227     bool                            ulcd;                                       //!< ULCD表示をするか
228     NN_PADDING2;
229 } TitleInfo;
230 
231 
232 /*!--------------------------------------------------------------------------*
233   @brief        サーバの情報
234  *---------------------------------------------------------------------------*/
235 typedef struct
236 {
237     u8                                  mac[6];                         //!< サーバのMACアドレス
238     u8                                  channel;                        //!< サーバの存在するチャンネル
239     nn::uds::LinkLevel                  linkLevel;                      //!< リンクレベル、スキャンしている間(CLIENT_STATE_SCANNING状態)だけ更新されます。
240     u8                                  maxNodeNum;                     //!< サーバを含む接続可能な最大ノード数
241     u8                                  nodeNum;                        //!< サーバを含む現在の接続しているノード数、スキャンしている間(CLIENT_STATE_SCANNING状態)だけ更新されます。
242     bit16                               dlpVersion;                     //!< ダウンロードプレイのバージョン
243     NN_PADDING4;
244     NodeInfo                            nodeInfo[MAX_NODE_NUM];         //!< サーバに接続しているノードの情報、スキャンしている間(CLIENT_STATE_SCANNING状態)だけ更新されます。
245     nn::os::Tick                        lastUpdateTick;                 //!< 最後に更新された Tick です。
246 } ServerInfo;
247 
248 
249 /*!--------------------------------------------------------------------------*
250   @brief        リブート後に親機に再接続するための情報を格納するための構造体
251  *---------------------------------------------------------------------------*/
252 typedef struct
253 {
254     u8                                  bssid[6];                       //!< サーバの BSSID (MAC アドレス) が格納されます
255     NN_PADDING2;
256 } RebootInfo;
257 
258 } // end of namespace CTR
259 } // end of namespace dlp
260 } // end of namespace nn
261 
262 #endif  // ifndef NN_DLP_CTR_DLP_TYPE_H_
263