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: 26466 $
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_Ipc.h>
21 #include <nn/applet/CTR/applet_Parameters.h>
22 #include <nn/applet/CTR/applet_API.h>
23 #include <nn/applet/CTR/applet_Gfx.h>
24 
25 namespace nn {
26 namespace applet {
27 namespace CTR {
28 namespace detail {
29 
30     AppletWakeupState WaitForStarting( AppletId* pSenderId=NULL, u8* pParam=NULL, size_t paramSize=0, s32* pReadLen=NULL,
31                                        nn::Handle *pHandle=NULL, nn::fnd::TimeSpan span=NN_APPLET_WAIT_INFINITE );
32     AppletWakeupState ProcessHomeButtonIfPrepared(void);
33 }
34 }
35 }
36 }
37 
38 namespace nn {
39 namespace applet {
40 namespace CTR {
41     /*!
42         @name   ホームボタン
43         @{
44      */
45     /*!
46         @brief      ホームボタンの状態を取得します。
47 
48                     nn::applet::CTR::HOME_BUTTON_NONE, HOME_BUTTON_SINGLE_PRESSED,
49                     HOME_BUTTON_DOUBLE_PRESSED のいずれかを返します。
50 
51                     nn::applet::CTR::HOME_BUTTON_NONE 以外の状態のときには
52                     アプリケーションで必要な処理を行った後に、
53                     PrepareToJumpToHomeMenu(), JumpToHomeMenu() を呼んで WaitForStarting() で起動待ちを行うか、
54                     JumpToHomeMenuIfPrepared() を呼んでください。
55 
56                     JumpToHomeMenuIfPrepared() は
57                     PrepareToJumpToHomeMenu(), JumpToHomeMenu() を呼んで WaitForStarting() で起動待ちを行う
58                     という一連の流れを内部で行っています。
59 
60         @return     状態を返します。
61      */
62     AppletHomeButtonState GetHomeButtonState(void);
63 
64     /*!
65         @brief      ホームボタンの状態をクリアします。
66      */
67     void ClearHomeButtonState(void);
68     /*!
69         @}
70      */
71 
72     /*!
73         @name   ホームメニュー
74         @{
75      */
76     /*!
77         @brief      ホームボタン処理を行います。
78 
79                     GetHomeButtonState() でホームボタンの状態を調べ、
80                     必要なら PrepareToJumpToHomeMenu()、JumpToHomeMenu() を呼び出して
81                     WaitForStarting() で起動待ちを行うという一連の動作をまとめて行います。
82 
83                     返り値は、WaitForStarting() の値をそのまま返しています。
84                     nn::applet::CTR::WAKEUP_BY_CANCEL の場合は速やかにアプリケーションを終了させてください。
85 
86                     それ以外の返り値の場合は通常再開してください。
87 
88         @return     起床した原因を返します。
89      */
ProcessHomeButtonIfPrepared(void)90     inline AppletWakeupState ProcessHomeButtonIfPrepared(void)
91     {
92         return detail::ProcessHomeButtonIfPrepared();
93     }
94     /*!
95         @}
96      */
97 
98     /*!
99         @name   スリープ
100         @{
101      */
102     /*!
103         @brief      スリープ通知状態を取得します。
104 
105                     nn::applet::CTR::NOTIFY_NONE, NOTIFY_SLEEP_QUERY, NOTIFY_SLEEP_ACCEPT,
106                     NOTIFY_SLEEP_REJECT, NOTIFY_SLEEP, NOTIFY_AWAKE のいずれかを返します。
107 
108                     スリープ問い合わせのコールバックが呼ばれ、"保留"(nn::applet::CTR::REPLY_LATER)
109                     を返した後は nn::applet::CTR::NOTIFY_QUERY となっています。
110                     このときには、速やかに ReplySleepQuery() で返答するようにしてください。
111 
112         @return     状態を返します。
113      */
114     AppletSleepNotificationState GetSleepNotificationState(void);
115 
116     /*!
117         @brief      スリープ通知状態をクリアします。
118 
119                     GetSleepNotificationState() で取得できる状態が、
120                     nn::applet::CTR::NOTIFY_NONE となります。
121 
122                     システムでは、この状態を用いて何かの動作を行っていませんので、
123                     どのようなタイミングで状態を変更しても問題はありません。
124      */
125     void ClearSleepNotificationState(void);
126 
127     /*!
128         @brief      スリープ問い合わせへの返答を行います。
129 
130                     この関数は、スリープ問い合わせのコールバック
131                     (SetSleepQueryCallback() で設定します)
132                     で、"保留"(nn::CTR::applet::REPLY_LATER) を返した後に
133                     問い合わせの返答を行うために使用してください。
134 
135         @param[in]  reply       返答
136      */
137     void ReplySleepQuery( AppletQueryReply reply );
138     /*!
139         @}
140      */
141 
142     /*!
143         @name   コールバック設定
144         @{
145      */
146     /*!
147         @brief      ホームボタン検出コールバックを設定します。
148         @param[in]  callback    コールバック
149         @param[in]  arg         コールバックへの引数
150      */
151     void SetHomeButtonCallback( AppletHomeButtonCallback callback, uptr arg=0 );
152 
153     /*!
154         @brief      メッセージ受け取りコールバックを設定します。
155         @param[in]  callback    コールバック
156         @param[in]  arg         コールバックへの引数
157      */
158     void SetReceiveMessageCallback( AppletMessageCallback callback, uptr arg=0 );
159 
160     /*!
161         @brief      電源ボタン検出コールバックを設定します。
162         @param[in]  callback    コールバック
163         @param[in]  arg         コールバックへの引数
164      */
165     void SetPowerButtonCallback( AppletPowerButtonCallback callback, uptr arg=0 );
166 
167     /*! :private
168         @brief      共有メモリ要求受け取りコールバックを設定します。
169         @param[in]  callback    コールバック
170         @param[in]  arg         コールバックへの引数
171      */
172     void SetRequestMemoryCallback( AppletRequestMemoryCallback callback, uptr arg=0 );
173     /*! :private
174         @brief      共有メモリ解放コールバックを設定します。
175         @param[in]  callback    コールバック
176         @param[in]  arg         コールバックへの引数
177      */
178     void SetReleaseMemoryCallback( AppletReleaseMemoryCallback callback, uptr arg=0 );
179 
180     /*! :private
181         @brief      DSP スリープコールバックを設定します。
182         @param[in]  callback    コールバック
183         @param[in]  arg         コールバックへの引数
184      */
185     void SetDspSleepCallback( AppletDspSleepCallback callback, uptr arg=0 );
186     /*! :private
187         @brief      DSP スリープ復帰コールバックを設定します。
188         @param[in]  callback    コールバック
189         @param[in]  arg         コールバックへの引数
190      */
191     void SetDspWakeUpCallback( AppletDspWakeUpCallback callback, uptr arg=0 );
192 
193     /*!
194         @brief      スリープ問い合わせコールバックを設定します。
195         @param[in]  callback    コールバック
196         @param[in]  arg         コールバックへの引数
197      */
198     void SetSleepQueryCallback( AppletSleepQueryCallback callback, uptr arg=0 );
199     /*!
200         @brief      スリープコールバックを設定します。
201 
202                     この関数は廃止される予定です。
203 
204         @param[in]  callback    コールバック
205         @param[in]  arg         コールバックへの引数
206      */
207     void SetSleepCallback( AppletSleepCallback callback, uptr arg=0 );
208     /*!
209         @brief      スリープ復帰コールバックを設定します。
210         @param[in]  callback    コールバック
211         @param[in]  arg         コールバックへの引数
212      */
213     void SetAwakeCallback( AppletAwakeCallback callback, uptr arg=0 );
214 
215     /*!
216         @brief      シャットダウン通知コールバックを設定します。
217         @param[in]  callback    コールバック
218         @param[in]  arg         コールバックへの引数
219      */
220     void SetShutdownCallback( AppletShutdownCallback callback, uptr arg=0 );
221 
222     /*!
223         @brief      アプレット終了時コールバックを設定します。
224         @param[in]  callback    コールバック
225         @param[in]  arg         コールバックへの引数
226      */
227     void SetCloseAppletCallback( AppletCloseAppletCallback callback, uptr arg=0 );
228     /*!
229         @}
230      */
231 
232     /*!
233         @name   動作制御
234         @{
235      */
236     /*!
237         @brief      自身の開始イベントが来るのを待ちます。
238 
239                     開始のイベントを受け取るまでこの関数から戻ります。
240                     関数から戻る際には、AppletWakeupState 列挙型の値が返りますが、その値によって
241                     以降の動作(通常再開するとか、アプリケーションを終了するとか)を決定する必要があります。
242 
243                     nn::applet::CTR::WAKEUP_BY_CANCEL を受け取った場合、速やかにアプリケーションを
244                     終了させてください。
245 
246                     アプリケーションでは、それ以外は通常再開してください。
247 
248         @param[out] pSenderId   イベント送信元の アプレットID
249         @param[out] pParam      パラメータバッファ
250         @param[in]  paramSize   パラメータバッファサイズ
251         @param[out] pReadLen    読み込みサイズ
252         @param[out] pHandle     ハンドラ
253         @param[in]  timeout     タイムアウト時間
254         @return     状態を返します。
255      */
256     inline AppletWakeupState WaitForStarting( AppletId* pSenderId=NULL, u8* pParam=NULL, size_t paramSize=0, s32* pReadLen=NULL,
257                                               nn::Handle *pHandle=NULL, nn::fnd::TimeSpan timeout=NN_APPLET_WAIT_INFINITE )
258     {
259         return detail::WaitForStarting( pSenderId, pParam, paramSize, pReadLen, pHandle, timeout );
260     }
261     /*!
262         @}
263      */
264 }
265 }
266 }
267 
268 #include <nn/util/detail/util_CLibImpl.h>
nnappletGetHomeButtonState(void)269 NN_EXTERN_C inline AppletHomeButtonState nnappletGetHomeButtonState(void)
270 {
271     return nn::applet::CTR::GetHomeButtonState();
272 }
nnappletClearHomeButtonState(void)273 NN_EXTERN_C inline void nnappletClearHomeButtonState(void)
274 {
275     nn::applet::CTR::ClearHomeButtonState();
276 }
277 
278 NN_EXTERN_C inline AppletWakeupState nnappletWaitForStarting( AppletId* pSenderId=NULL, u8* pParam=NULL, size_t paramSize=0, s32* pReadLen=NULL, nn::Handle *pHandle=NULL )
279 {
280     return nn::applet::CTR::WaitForStarting( pSenderId, pParam, paramSize, pReadLen, pHandle );
281 }
nnappletProcessHomeButtonIfPrepared(void)282 NN_EXTERN_C inline AppletWakeupState nnappletProcessHomeButtonIfPrepared(void)
283 {
284     return nn::applet::CTR::ProcessHomeButtonIfPrepared();
285 }
286 
287 #endif  // ifndef NN_APPLET_CTR_APPLET_WRAPPER_H_
288