1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     cec_Control.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: 26754 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_CEC_CTR_CEC_CONTROL_H_
17 #define NN_CEC_CTR_CEC_CONTROL_H_
18 
19 #include <nn/fnd.h>
20 #include <nn/cec/CTR/cec_Api.h>
21 
22 namespace nn {
23 namespace cec {
24 namespace CTR {
25 
26 struct CecAllocFunc
27 {
28     void* (*allocFunc)(size_t);  //!< メモリアロケート関数へのポインタです。
29     void  (*freeFunc)(void*);    //!< メモリ解放関数へのポインタです。
30 };
31 
32 //------------------------------------------------------------
33 // 通知用
34 
35 /*!
36     @struct     CecNotificationParam
37     @brief      受信情報のBOX個々の情報
38 */
39 struct CecNotificationParam
40 {
41     nn::fnd::DateTimeParameters     recvDate;       //!<    受信日時
42     u32                             cecTitleId;     //!<    BOXの cecTitleId
43     u8                              messageId[CEC_SIZEOF_MESSAGEID];    //!< 受信MessageのMessageID(先頭のMessageのみ)
44 };
45 
46 /*!
47     @struct     CecNotificationData
48     @brief      受信情報
49 */
50 struct CecNotificationData
51 {
52     size_t  num;                //!< 項目数
53     s32     count;              //!< 受信回数(本体起動から)
54     CecNotificationParam param[MESSAGE_BOX_NUM_MAX];    //!< 個々のBOXの情報
55 };
56 
57 
58 /*!
59     @class CecControl
60     @brief Cecの状態を変更します。
61 
62            (Cecの状態はシステムに管理され、自動的に動作します。通常は、手動で状態を変更する必要はありません。)
63 */
64 
65 class CecControl {
66 
67 public:
68 
69     enum ChangeDaemonState{
70         DAEMON_CHANGE_STATE_READY ,
71         DAEMON_CHANGE_STATE_STARTSCAN ,
72         DAEMON_CHANGE_STATE_STOP,
73         DAEMON_CHANGE_STATE_STOP_DAEMON,
74         DAEMON_CHANGE_STATE_START_DAEMON,
75         DAEMON_CHANGE_STATE_RESET_FILTER,
76 
77         DAEMON_CHANGE_STATE_NDM_RESUME,
78         DAEMON_CHANGE_STATE_NDM_SUSPEND
79 
80     };
81 
82     /*!
83         @brief @ref GetCecState で取得される、Cecの状態を示す値です。DAEMON_STATE_IDLE のときしか BOXにアクセスすることはできません。
84     */
85     enum DaemonState
86     {
87         DAEMON_STATE_STOP,          //!< 動作していません
88         DAEMON_STATE_IDLE,          //!< 停止中
89         DAEMON_STATE_BUSY           //!< 動作中
90     };
91 
92 
93     CecControl(size_t bufSize);
94     CecControl();
95     ~CecControl();
96 
97     /*!
98     :private
99      * @brief       cec に接続します。cec にアクセスするために最初に呼ぶ必要があります。
100      * @return      nn::Result
101      */
102     static nn::Result  Initialize();
103     //static nn::Result  Initialize(CecAllocFunc& cecAllocFunc);
104     static nn::Result  Initialize(nn::fnd::IAllocator& cecAllocFunc);
105     #if 0
106     static nn::Result  InitializeSys();
107     #endif
108 
109     /*!
110     :private
111      * @brief       cec へのアクセスを終了します。
112      * @return      nn::Result
113      */
114     static nn::Result  Finalize();
115 
116     #if 0
117     static nn::Result  FinalizeSys();
118     #endif
119 
120 
121     static bool IsInitialized();
122     #if 0
123     static bool IsInitializedSys();
124     #endif
125 
126     /*!
127      :private
128      * @brief       cec を Ready 状態に移行させます。nn::cec::Initialize() ~ Finalize() の間は呼ぶことはできません。
129                    (暫定的に用意されたAPIです。今後のバージョンでは、cecの状態を直接変更するAPIは削除されます。)
130      * @return      nn::Result
131      */
132     static nn::Result  ReadyDaemon();
133 
134     /*!
135      * @brief       cec の動作を開始させます。
136 
137      * @param[in]   reset         true をセットすると、BOXの内容を読み直して Scan を開始します。<br>
138                                   また、記憶していた通信相手のリストも消去され、同じ相手と再接続することが可能になります。このとき、設定中のボックスだけでなく、全てのボックス(アプリ)のデータが、再度交換される可能性があります。<br>
139                                   デバッグ時等、同じ相手と再接続する必要があるとき以外は使用しないでください。<br>
140                                   リストの消去は、nn::cec::CTR::MessageBox::DeleteMessageBox() で BOXを削除したときも行われます。
141 
142      * @return      nn::Result
143      */
144     static nn::Result  StartScanning(bool reset = false);
145 
146     /*!
147      * @brief       cec の動作を停止します。MessageBox にアクセスするには、停止状態である必要があります。
148 
149      * @param[in]   b_Immediate   true をセットすると、通信を中断して停止ステータスに移行します。
150      * @return      nn::Result
151      */
152     static nn::Result  StopScanning(bool b_Immediate = false);
153 
154     /*!
155      :private
156      * @brief       CecDaemon を 停止させます。
157                    (暫定的に用意されたAPIです。今後のバージョンでは、cecの状態を直接変更するAPIは削除されます。)
158 
159                    停止後は StartScanning を呼んでも動作開始しません。
160      * @return      nn::Result
161      */
162     static nn::Result  StopDaemon();
163 
164     /*!
165      :private
166      * @brief       CecDaemon を 動作開始させます。
167                    (暫定的に用意されたAPIです。今後のバージョンでは、cecの状態を直接変更するAPIは削除されます。)
168      * @return      nn::Result
169      */
170     static nn::Result  StartDaemon();
171 
172     /*!
173      :private
174      * @brief       受信したMessageの情報を取得します。
175      * @param[in]   cecTitleId              CecTitleId を指定します。
176      * @param[out]  pCecInfoBuffer          CecNotificationData を受け取るバッファを指定します。
177      * @param[in]   size                    バッファのサイズを指定します。
178      * @return      nn::Result
179      */
180     static nn::Result GetCecInfoBuffer(  u32 cecTitleId, u8 pCecInfoBuffer[], size_t size );
GetCecInfoBuffer(u8 pCecInfoBuffer[],size_t size)181     static nn::Result GetCecInfoBuffer(  u8 pCecInfoBuffer[], size_t size )
182     {
183         return GetCecInfoBuffer(  0, pCecInfoBuffer, size );
184     };
185 
186     /*!
187      * @brief       CECの状態を取得します。
188      * @param[out]  state          状態を示す @ref DaemonState が格納されます。 DAEMON_STATE_IDLE のときのみ、BOXにアクセス可能です。
189      * @return      nn::Result
190      */
191     static nn::Result GetCecState( u32* state );
192 
193     /*!
194      :private
195      * @brief       受信の通知を受ける Event をセットします。
196      * @param[out]  event          受信があったときに Signal される Event です。
197      * @return      nn::Result
198      */
199     static nn::Result GetCecRecvEventHandle( nn::os::Event& event );
200 
201     static nn::Result GetChangeStateEventHandle( nn::os::Event& event );
202 
203     /* @brief       NAND上の CECのBOX保存領域をフォーマットします。デバッグ用です。 */
204     static nn::Result FormatSaveData();
205 };
206 
207 /*!
208  * @brief       CEC Daemon に接続します。CEC MessageBox にアクセスするために最初に呼ぶ必要があります。
209 
210  * @param[in]   cecAllocFunc        CEC ライブラリが使用するアロケータを指定します。
211 
212                                     CEC ライブラリのMessageデータ処理に必要なメモリを確保するために
213                                     使用されます。最大で扱うMessageデータサイズ × 2 程度のメモリが使用されます。
214  * @return      nn::Result
215  */
216 nn::Result  Initialize(nn::fnd::IAllocator& cecAllocFunc);
217 
218 /*!
219  * @brief       CEC Daemon に接続します。CEC MessageBox にアクセスするために最初に呼ぶ必要があります。
220 
221  * @return      nn::Result
222  */
223 nn::Result  Initialize();
224 
Initialize()225 inline nn::Result  Initialize()
226 {
227     return CecControl::Initialize();
228 }
229 
230 nn::Result  Initialize(nn::cec::CTR::CecAllocFunc& cecAllocFunc);
231 
Initialize(nn::fnd::IAllocator & cecAllocFunc)232 inline nn::Result  Initialize(nn::fnd::IAllocator& cecAllocFunc)
233 {
234     return CecControl::Initialize(cecAllocFunc);
235 }
236 
237 /*!
238  * @brief       CEC Daemon へのアクセスを終了します。
239  * @return      nn::Result
240  */
241 nn::Result  Finalize();
242 
Finalize()243 inline nn::Result  Finalize()
244 {
245     return CecControl::Finalize();
246 }
247 
248 /*!
249  * @brief       受信の通知を受ける Event を指定します。
250  * @param[out]  event          受信があったときに Signal される Event です。
251  * @return      nn::Result
252  */
253 nn::Result GetCecRecvEventHandle( nn::os::Event& event );
GetCecRecvEventHandle(nn::os::Event & event)254 inline nn::Result GetCecRecvEventHandle( nn::os::Event& event )
255 {
256     return CecControl::GetCecRecvEventHandle( event );
257 }
258 
259 
260 /*!
261  * @brief       受信したMessageの情報を取得します。
262 
263                 グルーピングして複数のMessageを受け取ったときでも、取得できる情報は1つ分だけです。
264 
265  * @param[in]   cecTitleId              CecTitleId を指定します。
266  * @param[out]  pCecInfoBuffer          CecNotificationData を受け取るバッファを指定します。
267  * @param[in]   size                    バッファのサイズを指定します。
268  * @return      nn::Result
269  */
270 nn::Result GetCecInfoBuffer( u32 cecTitleId, u8 pCecInfoBuffer[], size_t size );
271 nn::Result GetCecInfoBuffer( u8 pCecInfoBuffer[], size_t size );
272 
GetCecInfoBuffer(u32 cecTitleId,u8 pCecInfoBuffer[],size_t size)273 inline nn::Result GetCecInfoBuffer( u32 cecTitleId, u8 pCecInfoBuffer[], size_t size )
274 {
275     return CecControl::GetCecInfoBuffer(cecTitleId, pCecInfoBuffer, size );
276 }
277 
GetCecInfoBuffer(u8 pCecInfoBuffer[],size_t size)278 inline nn::Result GetCecInfoBuffer( u8 pCecInfoBuffer[], size_t size )
279 {
280     return CecControl::GetCecInfoBuffer(0, pCecInfoBuffer, size );
281 }
282 
283 
284 
285 } // end of namespace CTR
286 } // end of namespace cec
287 } // end of namespace nn
288 
289 
290 
291 #endif  // ifndef NN_CEC_CTR_CEC_CONTROL_H_
292