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