1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     applet_Wrapper.h
4 
5   Copyright (C)2010 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: 33746 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_APPLET_CTR_APPLET_WRAPPER_H_
17 #define NN_APPLET_CTR_APPLET_WRAPPER_H_
18 
19 #include <nn/os.h>
20 #include <nn/applet/CTR/applet_Parameters.h>
21 #include <nn/applet/CTR/applet_API.h>
22 #include <nn/applet/CTR/applet_Gfx.h>
23 
24 namespace nn {
25 namespace applet {
26 namespace CTR {
27 namespace detail {
28 
29     AppletWakeupState WaitForStarting( AppletId* pSenderId=NULL, u8* pParam=NULL, size_t paramSize=0, s32* pReadLen=NULL,
30                                        nn::Handle *pHandle=NULL, nn::fnd::TimeSpan span=NN_APPLET_WAIT_INFINITE );
31     bool ProcessHomeButton(void);
32 }
33 }
34 }
35 }
36 
37 namespace nn {
38 namespace applet {
39 namespace CTR {
40     /*!
41         @name   ホームメニュー
42         @{
43      */
44     /*!
45         @brief      ホームボタンの状態を取得します。
46         @return     状態を返します。
47      */
48     AppletHomeButtonState GetHomeButtonState(void);
49 
50     /*!
51         @brief      ホームボタンの状態をクリアします。
52     */
53     void ClearHomeButtonState(void);
54 
55     // 内部関数(非公開)
56     bool IsExpectedToJumpToHomeMenu(void);
57     // 内部関数(非公開)
58     void SetExpectationToJumpToHomeMenu( bool sw );
59 
60     /*!
61         @brief      ホームボタンの処理を行う要求があるかを調べます。
62         @return     処理要求の有無を返します。true ならばホームボタン処理が必要です。
63     */
64     bool IsExpectedToProcessHomeButton(void);
65     /*!
66         @}
67      */
68 
69     /*!
70         @name   ホームメニュー
71         @{
72      */
73     /*!
74         @brief      ホームメニュー遷移処理を行います。
75         @return     ウェイトする必要があるかどうかを返します。
76      */
ProcessHomeButton(void)77     inline bool ProcessHomeButton(void)
78     {
79         return detail::ProcessHomeButton();
80     }
81 
82     // ↓この関数は古い表記です。変わりにProcessHomeButton()を使ってください。
83     //   (互換性のために本バージョンでは残してあります)
ProcessHomeButtonIfPrepared(void)84     inline bool ProcessHomeButtonIfPrepared(void)
85     {
86         return detail::ProcessHomeButton();
87     }
88     /*!
89         @}
90      */
91 
92     /*!
93         @name   電源ボタン
94         @{
95      */
96     /*!
97         @brief      電源ボタン遷移処理を行います。
98         @return     待ちうけを行う必要があるかどうかを返します。
99      */
100     bool ProcessPowerButton(void);
101     /*!
102         @}
103      */
104 
105     /*!
106         @name   スリープ
107         @{
108      */
109     /*!
110         @brief      スリープ通知状態を取得します。
111         @return     状態を返します。
112      */
113     AppletSleepNotificationState GetSleepNotificationState(void);
114 
115     /*!
116         @brief      スリープ通知状態が、返答の保留中という状態かどうかを調べます。
117         @return     返答保留中ならば true を返します。
118      */
119     bool IsExpectedToReplySleepQuery(void);
120 
IsExpectedToReplySleepQuery(void)121     inline bool IsExpectedToReplySleepQuery(void)
122     {
123         return (GetSleepNotificationState() == nn::applet::CTR::NOTIFY_SLEEP_QUERY)? true: false;
124     }
125 
126     /*!
127         @brief      スリープ通知状態をクリアします。
128      */
129     void ClearSleepNotificationState(void);
130 
131     /*!
132         @brief      スリープ問い合わせへの返答を行います。
133         @param[in]  reply       返答
134      */
135     void ReplySleepQuery( AppletQueryReply reply );
136     /*!
137         @}
138      */
139 
140 
141     /*!
142         @name   コールバック設定
143         @{
144      */
145     /*!
146         @brief      ホームボタン検出コールバックを設定します。
147         @param[in]  callback    コールバック
148         @param[in]  arg         コールバックへの引数
149      */
150     void SetHomeButtonCallback( AppletHomeButtonCallback callback, uptr arg=0 );
151 
152     /*! :private
153         @brief      メッセージ受け取りコールバックを設定します。
154         @param[in]  callback    コールバック
155         @param[in]  arg         コールバックへの引数
156      */
157     void SetReceiveMessageCallback( AppletMessageCallback callback, uptr arg=0 );
158 
159     /*!
160         @brief      電源ボタン検出コールバックを設定します。
161         @param[in]  callback    コールバック
162         @param[in]  arg         コールバックへの引数
163      */
164     void SetPowerButtonCallback( AppletPowerButtonCallback callback, uptr arg=0 );
165 
166     /*! :private
167         @brief      共有メモリ要求受け取りコールバックを設定します。
168         @param[in]  callback    コールバック
169         @param[in]  arg         コールバックへの引数
170      */
171     void SetRequestMemoryCallback( AppletRequestMemoryCallback callback, uptr arg=0 );
172     /*! :private
173         @brief      共有メモリ解放コールバックを設定します。
174         @param[in]  callback    コールバック
175         @param[in]  arg         コールバックへの引数
176      */
177     void SetReleaseMemoryCallback( AppletReleaseMemoryCallback callback, uptr arg=0 );
178 
179     /*! :private
180         @brief      DSP スリープコールバックを設定します。
181         @param[in]  callback    コールバック
182         @param[in]  arg         コールバックへの引数
183      */
184     void SetDspSleepCallback( AppletDspSleepCallback callback, uptr arg=0 );
185     /*! :private
186         @brief      DSP スリープ復帰コールバックを設定します。
187         @param[in]  callback    コールバック
188         @param[in]  arg         コールバックへの引数
189      */
190     void SetDspWakeUpCallback( AppletDspWakeUpCallback callback, uptr arg=0 );
191 
192     /*!
193         @brief      スリープ問い合わせコールバックを設定します。
194         @param[in]  callback    コールバック
195         @param[in]  arg         コールバックへの引数
196      */
197     void SetSleepQueryCallback( AppletSleepQueryCallback callback, uptr arg=0 );
198     /*!
199         @brief      スリープキャンセルコールバックを設定します。
200         @param[in]  callback    コールバック
201         @param[in]  arg         コールバックへの引数
202      */
203     void SetSleepCanceledCallback( AppletSleepCanceledCallback callback, uptr arg=0 );
204     /*!
205         @brief      スリープ復帰コールバックを設定します。
206         @param[in]  callback    コールバック
207         @param[in]  arg         コールバックへの引数
208      */
209     void SetAwakeCallback( AppletAwakeCallback callback, uptr arg=0 );
210 
211     /*! :private
212         @brief      シャットダウン通知コールバックを設定します。
213         @param[in]  callback    コールバック
214         @param[in]  arg         コールバックへの引数
215      */
216     void SetShutdownCallback( AppletShutdownCallback callback, uptr arg=0 );
217 
218     /*! :private
219         @brief      アプレット終了時コールバックを設定します。
220         @param[in]  callback    コールバック
221         @param[in]  arg         コールバックへの引数
222      */
223     void SetCloseAppletCallback( AppletCloseAppletCallback callback, uptr arg=0 );
224 
225     /*! :private
226         @brief      アプリケーションからホームメニュー/システムアプレット遷移時のコールバックを設定します。
227         @param[in]  callback    コールバック
228         @param[in]  arg         コールバックへの引数
229      */
230     void SetTransitionCallback( AppletTransitionCallback callback, uptr arg=0 );
231 
232     /*! :private
233         @brief      アプリケーション終了コールバックを設定します。
234         @param[in]  callback    コールバック
235         @param[in]  arg         コールバックへの引数
236      */
237     void SetCloseCallback( AppletCloseCallback callback, uptr arg=0 );
238 
239     /*!
240         @}
241      */
242 
243     /*!
244         @name   動作制御
245         @{
246      */
247     /*!
248         @brief      自身の開始イベントが来るのを待ちます。
249 
250         @param[out] pSenderId   イベント送信元の アプレットID
251         @param[out] pParam      パラメータバッファ
252         @param[in]  paramSize   パラメータバッファサイズ
253         @param[out] pReadLen    読み込みサイズ
254         @param[out] pHandle     ハンドラ
255         @param[in]  timeout     タイムアウト時間
256 
257         @return     起床理由を返します。
258      */
259     inline AppletWakeupState WaitForStarting( AppletId* pSenderId=NULL, u8* pParam=NULL, size_t paramSize=0, s32* pReadLen=NULL,
260                                               nn::Handle *pHandle=NULL, nn::fnd::TimeSpan timeout=NN_APPLET_WAIT_INFINITE )
261     {
262         return detail::WaitForStarting( pSenderId, pParam, paramSize, pReadLen, pHandle, timeout );
263     }
264     /*!
265         @}
266      */
267 
268 
269     bool IsAppletPreloaded( AppletId id );
270     void WaitForAppletPreloaded( AppletId id );
271 
272     /*!
273         @name   ライブラリアプレットのプリロードと終了
274         @{
275      */
276     /*! :private
277         @brief      ライブラリアプレットのプリロードが完了したかを調べます。
278         @param[in]  id          ライブラリアプレットのアプレット ID
279         @return     終了していれば true となります。
280      */
IsLibraryAppletPreloaded(void)281     inline bool IsLibraryAppletPreloaded(void)
282     {
283         return IsAppletPreloaded( APPLIB_APPLET_ID );
284     }
285     /*! :private
286         @brief      ライブラリアプレットのプリロードが完了するまで待ちます。
287      */
WaitForLibraryAppletPreloaded(void)288     inline void WaitForLibraryAppletPreloaded(void)
289     {
290         WaitForAppletPreloaded( APPLIB_APPLET_ID );
291     }
292     /*!
293         @}
294      */
295 
296     /*!
297         @name   スリープ
298         @{
299      */
300     /*!
301         @brief      スリープを可能にします。
302         @param[in]  isSleepCheck true ならば、蓋が閉じられていればスリープ動作に入ります。
303      */
304     void EnableSleep( bool isSleepCheck=nn::applet::CTR::SLEEP_IF_SHELL_CLOSED );
305 
306     /*!
307         @brief      スリープを禁止にします。
308          @param[in]  isReplyReject true ならば、スリープの問い合わせが来ている場合には
309                      applet::ReplySleepQuery( applet::REPLY_REJECT ) を行います。
310      */
311     void DisableSleep( bool isReplyReject=nn::applet::CTR::REPLY_REJECT_IF_LATER );
312 
313     /*! :private
314         @brief      スリープが可能かどうかを取得します。
315 
316                     EnableSleep() が呼ばれスリープ可能か、DisableSleep() が呼ばれスリープが禁止状態か
317                     を調べて結果を取得します。
318 
319          @return    true ならばスリープ可能です。
320      */
321     bool IsEnableSleep();
322     /*!
323         @}
324      */
325 }
326 }
327 }
328 
329 #include <nn/util/detail/util_CLibImpl.h>
nnappletGetHomeButtonState(void)330 NN_EXTERN_C inline AppletHomeButtonState nnappletGetHomeButtonState(void)
331 {
332     return nn::applet::CTR::GetHomeButtonState();
333 }
nnappletClearHomeButtonState(void)334 NN_EXTERN_C inline void nnappletClearHomeButtonState(void)
335 {
336     nn::applet::CTR::ClearHomeButtonState();
337 }
338 
339 NN_EXTERN_C inline AppletWakeupState nnappletWaitForStarting( AppletId* pSenderId=NULL, u8* pParam=NULL, size_t paramSize=0, s32* pReadLen=NULL, nn::Handle *pHandle=NULL )
340 {
341     return nn::applet::CTR::WaitForStarting( pSenderId, pParam, paramSize, pReadLen, pHandle );
342 }
nnappletProcessHomeButton(void)343 NN_EXTERN_C inline bool nnappletProcessHomeButton(void)
344 {
345     return nn::applet::CTR::ProcessHomeButton();
346 }
347 
348 #endif  // ifndef NN_APPLET_CTR_APPLET_WRAPPER_H_
349