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: 32608 $
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 
207                     なお、スリープから復帰したあとに nngxStartLcdDisplay() で
208                     LCD の復帰を行うのはアプリケーションで行う必要があります。
209 
210         @param[in]  callback    コールバック
211         @param[in]  arg         コールバックへの引数
212      */
213     void SetAwakeCallback( AppletAwakeCallback callback, uptr arg=0 );
214 
215     /*! :private
216         @brief      シャットダウン通知コールバックを設定します。
217         @param[in]  callback    コールバック
218         @param[in]  arg         コールバックへの引数
219      */
220     void SetShutdownCallback( AppletShutdownCallback callback, uptr arg=0 );
221 
222     /*! :private
223         @brief      アプレット終了時コールバックを設定します。
224         @param[in]  callback    コールバック
225         @param[in]  arg         コールバックへの引数
226      */
227     void SetCloseAppletCallback( AppletCloseAppletCallback callback, uptr arg=0 );
228 
229     /*! :private
230         @brief      アプリケーションからホームメニュー/システムアプレット遷移時のコールバックを設定します。
231         @param[in]  callback    コールバック
232         @param[in]  arg         コールバックへの引数
233      */
234     void SetTransitionCallback( AppletTransitionCallback callback, uptr arg=0 );
235 
236     /*! :private
237         @brief      アプリケーション終了コールバックを設定します。
238         @param[in]  callback    コールバック
239         @param[in]  arg         コールバックへの引数
240      */
241     void SetCloseCallback( AppletCloseCallback callback, uptr arg=0 );
242 
243     /*!
244         @}
245      */
246 
247     /*!
248         @name   動作制御
249         @{
250      */
251     /*!
252         @brief      自身の開始イベントが来るのを待ちます。
253 
254         @param[out] pSenderId   イベント送信元の アプレットID
255         @param[out] pParam      パラメータバッファ
256         @param[in]  paramSize   パラメータバッファサイズ
257         @param[out] pReadLen    読み込みサイズ
258         @param[out] pHandle     ハンドラ
259         @param[in]  timeout     タイムアウト時間
260 
261         @return     起床理由を返します。
262      */
263     inline AppletWakeupState WaitForStarting( AppletId* pSenderId=NULL, u8* pParam=NULL, size_t paramSize=0, s32* pReadLen=NULL,
264                                               nn::Handle *pHandle=NULL, nn::fnd::TimeSpan timeout=NN_APPLET_WAIT_INFINITE )
265     {
266         return detail::WaitForStarting( pSenderId, pParam, paramSize, pReadLen, pHandle, timeout );
267     }
268     /*!
269         @}
270      */
271 
272 
273     bool IsAppletPreloaded( AppletId id );
274     void WaitForAppletPreloaded( AppletId id );
275 
276     /*!
277         @name   ライブラリアプレットのプリロードと終了
278         @{
279      */
280     /*! :private
281         @brief      ライブラリアプレットのプリロードが完了したかを調べます。
282         @param[in]  id          ライブラリアプレットのアプレット ID
283         @return     終了していれば true となります。
284      */
IsLibraryAppletPreloaded(void)285     inline bool IsLibraryAppletPreloaded(void)
286     {
287         return IsAppletPreloaded( APPLIB_APPLET_ID );
288     }
289     /*! :private
290         @brief      ライブラリアプレットのプリロードが完了するまで待ちます。
291      */
WaitForLibraryAppletPreloaded(void)292     inline void WaitForLibraryAppletPreloaded(void)
293     {
294         WaitForAppletPreloaded( APPLIB_APPLET_ID );
295     }
296     /*!
297         @}
298      */
299 
300     /*!
301         @name   スリープ
302         @{
303      */
304     /*!
305         @brief      スリープを可能にします。
306         @param[in]  isSleepCheck true ならば、蓋が閉じられていればスリープ動作に入ります。
307      */
308     void EnableSleep( bool isSleepCheck=nn::applet::CTR::SLEEP_IF_SHELL_CLOSED );
309 
310     /*!
311         @brief      スリープを禁止にします。
312          @param[in]  isReplyReject true ならば、スリープの問い合わせが来ている場合には
313                      applet::ReplySleepQuery( applet::REPLY_REJECT ) を行います。
314      */
315     void DisableSleep( bool isReplyReject=nn::applet::CTR::REPLY_REJECT_IF_LATER );
316 
317     /*! :private
318         @brief      スリープが可能かどうかを取得します。
319 
320                     EnableSleep() が呼ばれスリープ可能か、DisableSleep() が呼ばれスリープが禁止状態か
321                     を調べて結果を取得します。
322 
323          @return    true ならばスリープ可能です。
324      */
325     bool IsEnableSleep();
326     /*!
327         @}
328      */
329 }
330 }
331 }
332 
333 #include <nn/util/detail/util_CLibImpl.h>
nnappletGetHomeButtonState(void)334 NN_EXTERN_C inline AppletHomeButtonState nnappletGetHomeButtonState(void)
335 {
336     return nn::applet::CTR::GetHomeButtonState();
337 }
nnappletClearHomeButtonState(void)338 NN_EXTERN_C inline void nnappletClearHomeButtonState(void)
339 {
340     nn::applet::CTR::ClearHomeButtonState();
341 }
342 
343 NN_EXTERN_C inline AppletWakeupState nnappletWaitForStarting( AppletId* pSenderId=NULL, u8* pParam=NULL, size_t paramSize=0, s32* pReadLen=NULL, nn::Handle *pHandle=NULL )
344 {
345     return nn::applet::CTR::WaitForStarting( pSenderId, pParam, paramSize, pReadLen, pHandle );
346 }
nnappletProcessHomeButton(void)347 NN_EXTERN_C inline bool nnappletProcessHomeButton(void)
348 {
349     return nn::applet::CTR::ProcessHomeButton();
350 }
351 
352 #endif  // ifndef NN_APPLET_CTR_APPLET_WRAPPER_H_
353