1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     applet_API.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: 26565 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_APPLET_CTR_APPLET_API_H_
17 #define NN_APPLET_CTR_APPLET_API_H_
18 
19 #include <nn/os.h>
20 #include <nn/applet/CTR/applet_Ipc.h>
21 #include <nn/applet/CTR/applet_Parameters.h>
22 
23 #include <nn/gx.h>
24 #include <nn/hid.h>
25 
26 /*! @file
27     @blief APPLET に関する API の宣言
28 */
29 namespace nn {
30 namespace applet {
31 namespace CTR {
32 namespace detail {
33 
34     using namespace nn::applet::CTR;
35 
36     //---- 初期化・終了
37     Result Initialize( AppletAttr appletAttr = DEFAULT_APPLET_ATTRIBUTE );
38 
39     void   Lock(void);
40     bool   TryLock( nn::fnd::TimeSpan timeout=NO_WAIT);
41     void   Unlock(void);
42 
43     //---- for applet and application
44     int    CountRegisteredApplet(void);
45     bool   IsRegistered( AppletId appletId );
46     bool   WaitForRegister( AppletId appletId, nn::fnd::TimeSpan span );
47     bool   IsActive(void);
48     void   SetActive(void);
49     void   SetInactive(void);
50     void   SetAppletMode(void);
51     nn::Result SaveVramSysArea(void);
52     nn::Result RestoreVramSysArea(void);
53 
54     //================
55     // GPU権利
56     void   AssignGpuRight( bool flag=true );
ReleaseGpuRight(void)57     inline void ReleaseGpuRight(void)
58     {
59         AssignGpuRight(false);
60     }
61     bool   IsGpuRightGiven(void);
62 
63     //================
64     // DSP権利
65     void   AssignDspRight( bool flag = true );
ReleaseDspRight(void)66     inline void ReleaseDspRight( void )
67     {
68         AssignDspRight(false);
69     }
70 
71     //================
72     // sheredMemory のアタッチ
73     void AttachSharedMemoryHandle( os::SharedMemoryBlock* sharedMemory, nn::Handle handle, size_t size, bool readOnly );
74 
75     //================
76     // アプレットへのユーザメッセージ送り
77     Result SendMessage( AppletId receiverId, const u8* pParam, size_t paramSize, nn::Handle handle=NN_APPLET_HANDLE_NONE, nn::fnd::TimeSpan timeout=WAIT_INFINITE );
78     Result TrySendMessage( AppletId receiverId, const u8* pParam, size_t paramSize, nn::Handle handle=NN_APPLET_HANDLE_NONE );
79 
80 
81     //================
82     // ホームボタン状態
83     AppletHomeButtonState GetAbsoluteHomeButtonState(void);
84     void ClearAbsoluteHomeButtonState(void);
85 
86     // シャットダウン通知状態
87     AppletShutdownState GetShutdownState(void);
88     void ClearShutdownState(void);
89 
90     // 電源ボタンクリック通知
91     AppletPowerButtonState GetPowerButtonState(void);
92     void ClearPowerButtonState(void);
93 
94     //================
95     // ライブラリアプレットのプリロード
96     Result PreloadLibraryApplet( AppletId id );
97 
98     // ライブラリアプレット起動
99     Result PrepareToStartLibraryApplet( AppletId id );
100     Result StartLibraryApplet( AppletId id, const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE, nn::fnd::TimeSpan timeout=WAIT_INFINITE );
101 
102     // 起動キャンセル
103     Result CancelLibraryApplet(void);
104 
105     // アプリケーション終了
106     Result PrepareToCloseApplication(void);
107     Result CloseApplication( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE );
108 
109     // ホームメニュー移行準備
110     Result PrepareToJumpToHomeMenu(void);
111     Result JumpToHomeMenu( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE );
112 
113     // アプリケーションジャンプ
114     Result JumpToOtherApplication( ProgramId programId, const u8 pParam[], const u8 pHmacBuf[] );
115 
116 
117     //================
118     // 引数受け取り
119     bool ReceiveDeliverArg( u8 pParam[], u8 pHmacBuf[] );
120 
121     // 動作準備状況の取得
122     AppletPreparationState GetAppletPreparationState(void);
123 
124 
125     //================
126     //デバッグ用(そのうち消します)
127     Result DebugFunc(u32 param=0);
128     Result ArrangeAppletManagerForDebug(ProgramId programId);
129     Result MapProgramIdForDebug(AppletId id, ProgramId programId);
130 }
131 }
132 }
133 }
134 
135 namespace nn {
136 namespace applet {
137 namespace CTR {
138 
139     using namespace nn::applet::CTR;
140 
141     //================================================================
142     // 初期化
143     //================================================================
144     /*!
145         @name   初期化
146         @{
147      */
148     /*!
149         @brief      APPLET ライブラリの初期化を行います。
150 
151                     この関数を呼ぶことで他のAPPLET関数を呼ぶことが出来るようになります。
152 
153                     アプリケーションはこれを呼ぶことが必須です。
154                     複数回呼ばないようにしてください。通常はプログラムの最初に記述すれば結構です。
155 
156                     appletAttr には描画処理があるかどうかなどを示しますが
157                     通常は何も指定せずにデフォルト引数を用いてください。
158 
159                     (本SDKバージョンでの注意)
160 
161                     開発中にホームメニューを経由せずにアプリケーションを起動するときは、
162                     Initialize() の後に ArrangeAppletManagerForDebug(1) を呼ぶようにしてください。
163                     (呼ぶ位置は、applet::Initialize() の直後です。)
164 
165                     これは、アプリケーションがホームメニューから起動されていない場合も
166                     あたかもそのアプリケーションがホームメニューから起動されたように
167                     アプレットマネージャの内部状態を変更するための関数です。
168 
169                     製品版では不要になりますし、開発用途でも次バージョンから廃止する予定です。
170                     また、その際には入れたままにしても何も影響ないようにしますので、
171                     現状は入れておいてください。常に入れておいて構いません。
172 
173         @param[in]  appletAttr  アプレットライブラリを初期化する際のオプションです。
174         @return     初期化処理の結果を返します。
175      */
176     inline Result Initialize(AppletAttr appletAttr = NN_APPLET_DEFAULT_APPLET_ATTRIBUTE )
177     {
178         return detail::Initialize( appletAttr );
179     }
180     /*!
181         @}
182      */
183 
184     //================================================================
185     // 排他制御
186     //================================================================
187     /*!
188         @name   排他制御
189         @{
190      */
191     /*! :private
192         @brief      APPLET ライブラリにおける mutex をロックします。
193 
194                     とりあえず用意されていますが、使い方等が変更となるかもしれません。
195      */
Lock(void)196     inline void Lock(void)
197     {
198         detail::Lock();
199     }
200 
201     /*! :private
202         @brief      APPLET ライブラリにおける mutex のロックを試みます。
203 
204                     とりあえず用意されていますが、使い方等が変更となるかもしれません。
205 
206                     timeout は ロックできなかった場合に待つ時間の最大値です。
207                     0 を指定すると即座に終了します。
208 
209         @param[in]  timeout     タイムアウト時間を指定します。
210 
211         @return     ロックできれば true を、出来なければ false を返します。
212      */
213     inline bool TryLock(nn::fnd::TimeSpan timeout = NN_APPLET_NO_WAIT)
214     {
215         return detail::TryLock(timeout);
216     }
217 
218     /*! :private
219         @brief      APPLET ライブラリにおける mutex をアンロックします。
220 
221                     とりあえず用意されていますが、使い方等が変更となるかもしれません。
222      */
Unlock(void)223     inline void Unlock(void)
224     {
225         detail::Unlock();
226     }
227     /*!
228         @}
229      */
230 
231     //================================================================
232     // 情報取得
233     //================================================================
234     /*!
235         @name   情報取得
236         @{
237      */
238     /*!
239         @brief      DeliverArg および HMAC 情報を取得します。
240         @param[out] pParam      受信用 DeliverArg バッファ
241         @param[out] pHmacBuf    受信用 HMAC バッファ
242      */
ReceiveDeliverArg(u8 pParam[],u8 pHmacBuf[])243     inline bool ReceiveDeliverArg( u8 pParam[], u8 pHmacBuf[] )
244     {
245         return detail::ReceiveDeliverArg( pParam, pHmacBuf );
246     }
247 
248     /*! :private
249         @brief      登録されている APPLET の数を数えます。
250 
251                     アプリケーション自体も 1 つと数えます。
252 
253         @return     登録されている APPLET の数を返します。
254      */
CountRegisteredApplet(void)255     inline int CountRegisteredApplet(void)
256     {
257         return detail::CountRegisteredApplet();
258     }
259 
260     /*!
261         @brief      指定した ID のアプレットが登録されているか確認します。
262         @param[in]  appletId    アプレット ID
263         @return     登録されていれば true を、されていなければ false 返します。
264      */
IsRegistered(AppletId appletId)265     inline bool IsRegistered( AppletId appletId )
266     {
267         return detail::IsRegistered( appletId );
268     }
269 
270     /*!
271         @brief      アプリケーションが現在動作中かを調べます。
272 
273         @detail     アプリケーションプログラムが動作しているときは active ですが、
274                     ライブラリアプレットを呼び出したり、ホームメニューに遷移して、
275                     動作が中断されているときは activeではありません。
276 
277                     スリープ問い合わせのコールバックなど、activeでなくても呼び出されるものもあります。
278                     そのコールバック中で、現在アプリケーションが動作中かを判定することができます。
279 
280         @return     active ならば true を、そうでないならば false を返します。
281      */
IsActive(void)282     inline bool IsActive(void)
283     {
284         return detail::IsActive();
285     }
286 
287     /*! :private
288         @brief      アプリケーションをアクティブにします。
289      */
SetActive(void)290     inline void SetActive(void)
291     {
292         detail::SetActive();
293     }
294 
295     /*! :private
296         @brief      アプリケーションを非アクティブにします。
297      */
SetInactive(void)298     inline void SetInactive(void)
299     {
300         detail::SetInactive();
301     }
302 
303     /*! :private
304         @brief      アプリケーションのアプレット ID を取得します。
305                     アプリケーションでは返る値が固定です。
306 
307         @return     アプレット ID を返します。
308      */
309     AppletId   GetId(void);
310 
311     /*! :private
312         @brief      アプリケーションのアプレットアトリビュートを取得します。
313 
314                     取得できるのは Initialize() 時に指定したアトリビュートとなります。
315 
316         @return     アトリビュートを返します。
317      */
318     AppletAttr GetAttribute(void);
319     /*!
320         @}
321      */
322 
323     //================================================================
324     // 動作制御
325     //================================================================
326     /*!
327         @name   動作制御
328         @{
329      */
330     /*!
331         @brief      指定した ID のアプレットが登録されるのを、指定時間だけ待ちます。
332 
333                     NN_APPLET_WAIT_INFINITE を指定した場合は、登録完了まで待ちます。
334                     すなわち返り値は必ず true です。
335 
336                     NN_APPLET_NO_WAIT を指定した場合は、処理がすぐに戻ります。
337                     登録されていたかどうかで返り値は true か false になります。
338 
339         @param[in]  appletId    アプレット ID
340         @param[in]  span        待ち時間の上限
341         @return     登録されていれば true を、されていなければ false を返します。
342      */
343     inline bool WaitForRegister( AppletId appletId, nn::fnd::TimeSpan span = NN_APPLET_WAIT_INFINITE )
344     {
345         return detail::WaitForRegister( appletId, span );
346     }
347 
348     //================================================================
349     // 描画権
350     //================================================================
351     /*!
352         @name   描画権
353         @{
354      */
355     /*! :private
356         @brief      アプリケーションが描画権限を与えられているかを調べます。
357 
358         @return     描画権限を与えられていれば true を、そうでなければ false を返します。
359      */
IsGpuRightGiven(void)360     inline bool IsGpuRightGiven(void)
361     {
362         return detail::IsGpuRightGiven();
363     }
364 
365     /*!
366         @brief      アプリケーションが描画することを宣言します。
367 
368                     この関数は、ライブラリアプレットやホームメニューなどから切り替わった後に、
369                     自らが描画を行うことを宣言するものです。
370 
371                     通常、アプリケーションが呼ぶ必要はありません。
372 
373         @param[in]  flag        true なら取得、false なら放棄
374      */
375     inline void AssignGpuRight( bool flag = true )
376     {
377         detail::AssignGpuRight(flag);
378     }
379 
380     /*!
381         @brief      アプリケーションが他のプログラムに描画を切り替えることを宣言します。
382 
383                     この関数は、ライブラリアプレットやホームメニューなどに切り替わる際に、
384                     アプリケーションでの描画をやめることを宣言するものです。
385 
386                     通常、アプリケーションが呼ぶ必要はありません。
387      */
ReleaseGpuRight(void)388     inline void ReleaseGpuRight(void)
389     {
390         detail::AssignGpuRight(false);
391     }
392     /*!
393         @}
394      */
395 
396     //================================================================
397     // DSP使用権
398     //================================================================
399     /*!
400         @name   DSP使用権
401         @{
402      */
403     /*! :private
404         @brief      DSP の使用権を取得、放棄します。
405 
406                     必要に応じて、内部で DSP 処理を中断、再開します。
407 
408         @param[in]  flag        true なら再開、false なら中断
409      */
410     inline void AssignDspRight( bool flag = true )
411     {
412         detail::AssignDspRight(flag);
413     }
414 
415     /*! :private
416         @brief      DSP の使用権を放棄します。
417 
418                     必要に応じて、内部で DSP での処理を一時中断します。
419      */
ReleaseDspRight(void)420     inline void ReleaseDspRight( void )
421     {
422         detail::AssignDspRight(false);
423     }
424     /*!
425         @}
426      */
427 
428     /*! :private
429         @brief      共有メモリハンドルをアタッチします。
430         @param[out] sharedMemory    共有メモリブロックポインタ
431         @param[in]  handle          ハンドル
432         @param[in]  size            共有メモリのサイズ
433         @param[in]  readOnly        読み取り専用フラグ
434      */
AttachSharedMemoryHandle(os::SharedMemoryBlock * sharedMemory,nn::Handle handle,size_t size,bool readOnly)435     inline void AttachSharedMemoryHandle( os::SharedMemoryBlock* sharedMemory, nn::Handle handle, size_t size, bool readOnly )
436     {
437         detail::AttachSharedMemoryHandle( sharedMemory, handle, size, readOnly );
438     }
439 
440     //================================================================
441     // メッセージ
442     //================================================================
443     /*!
444         @name   メッセージ
445         @{
446      */
447     /*! :private
448         @brief      アプレットへのメッセージ送信を行います。
449         @param[in]  receiverId  宛先のアプレット ID
450         @param[in]  pParam      アプレットへ送るパラメータバッファ
451         @param[in]  paramSize   アプレットへ送るパラメータバッファのサイズ
452         @param[in]  handle      アプレットへ送るハンドル
453         @param[in]  timeout     タイムアウト時間
454         @return     処理結果を返します。
455      */
456     inline Result SendMessage( AppletId receiverId, const u8* pParam, size_t paramSize, nn::Handle handle=NN_APPLET_HANDLE_NONE, nn::fnd::TimeSpan timeout=WAIT_INFINITE )
457     {
458         return detail::SendMessage( receiverId, pParam, paramSize, handle, timeout );
459     }
460 
461     /*! :private
462         @brief      アプレットへのメッセージ送信を行います。
463         @param[in]  receiverId  宛先のアプレット ID
464         @param[in]  pParam      アプレットへ送るパラメータバッファ
465         @param[in]  paramSize   アプレットへ送るパラメータバッファサイズ
466         @param[in]  handle      アプレットへ送るハンドル
467         @return     処理結果を返します。
468      */
469     inline Result TrySendMessage( AppletId receiverId, const u8* pParam, size_t paramSize, nn::Handle handle=NN_APPLET_HANDLE_NONE )
470     {
471         return detail::TrySendMessage( receiverId, pParam, paramSize, handle );
472     }
473     /*!
474         @}
475      */
476 
477     /*! :private
478         @brief      現在のホームボタンの状態を取得します。
479 
480                     @ref GetHomeButtonState 関数よりも正確な値が得られます。
481 
482         @return     状態を返します。
483      */
GetAbsoluteHomeButtonState(void)484     inline AppletHomeButtonState GetAbsoluteHomeButtonState(void)
485     {
486         return detail::GetAbsoluteHomeButtonState();
487     }
488     /*! :private
489         @brief      ホームボタンの状態をクリアします。
490      */
ClearAbsoluteHomeButtonState(void)491     inline void ClearAbsoluteHomeButtonState(void)
492     {
493         return detail::ClearAbsoluteHomeButtonState();
494     }
495 
496     //================================================================
497     // シャットダウン
498     //================================================================
499     /*!
500         @name   シャットダウン
501         @{
502      */
503     /*! :private
504         @brief      シャットダウン状態を取得します。
505         @return     状態を返します。
506      */
GetShutdownState(void)507     inline AppletShutdownState GetShutdownState(void)
508     {
509         return detail::GetShutdownState();
510     }
511 
512     /*! :private
513         @brief      シャットダウン状態をクリアします。
514      */
ClearShutdownState(void)515     inline void ClearShutdownState(void)
516     {
517         detail::ClearShutdownState();
518     }
519     /*!
520         @}
521      */
522 
523     //================================================================
524     // 電源ボタン
525     //================================================================
526     /*!
527         @name   電源ボタン
528         @{
529      */
530     /*! :private
531         @brief      電源ボタンの状態を取得します。
532         @return     状態を返します。
533      */
GetPowerButtonState(void)534     inline AppletPowerButtonState GetPowerButtonState(void)
535     {
536         return detail::GetPowerButtonState();
537     }
538 
539     /*! :private
540         @brief      電源ボタンの状態をクリアします。
541      */
ClearPowerButtonState(void)542     inline void ClearPowerButtonState(void)
543     {
544         detail::ClearPowerButtonState();
545     }
546     /*!
547         @}
548      */
549 
550     //================================================================
551     // ライブラリアプレット・プリロードと終了
552     //================================================================
553     /*!
554         @name   ライブラリアプレットのプリロードと終了
555         @{
556      */
557     /*!
558         @brief      起動するライブラリアプレットのプリロードを行います。
559         @param[in]  id          ライブラリアプレットのアプレット ID
560         @return     処理結果を返します。
561      */
PreloadLibraryApplet(AppletId id)562     inline Result PreloadLibraryApplet( AppletId id )
563     {
564         return detail::PreloadLibraryApplet(id);
565     }
566 
567     /*!
568         @brief      プリロードされているライブラリアプレットを終了します。
569         @return     処理結果を返します。
570      */
CancelLibraryApplet(void)571     inline Result CancelLibraryApplet(void)
572     {
573         return detail::CancelLibraryApplet();
574     }
575     /*!
576         @}
577      */
578 
579     //================================================================
580     // ライブラリアプレット・起動
581     //================================================================
582     /*!
583         @name   ライブラリアプレット起動
584         @{
585      */
586     /*!
587         @brief      ライブラリアプレットを起動する準備を行います。
588 
589                     ライブラリアプレットを呼び出す準備を行う関数です。
590 
591                     この関数が呼ばれた後に StartLibraryApplet() を呼ぶことでライブラリアプレットを起動します。
592 
593         @param[in]  id          ライブラリアプレットのアプレット ID
594         @return     処理結果を返します。
595      */
PrepareToStartLibraryApplet(AppletId id)596     inline Result PrepareToStartLibraryApplet( AppletId id )
597     {
598         return detail::PrepareToStartLibraryApplet(id);
599     }
600 
601     /*!
602         @brief      ライブラリアプレットを起動します。
603 
604                     ライブラリアプレットを呼び出す関数です。
605 
606                     この関数の前に PrepareToStartLibraryApplet() が呼ばれている必要があります。
607 
608                     この関数を呼んだ後に、WaitForStarting() で起動待ちを行ってください。
609 
610                     @param[in]  id          ライブラリアプレットのアプレット ID
611         @param[in]  pParam      ライブラリアプレットに送るパラメータバッファ
612         @param[in]  paramSize   ライブラリアプレットに送るパラメータバッファサイズ
613         @param[in]  handle      ライブラリアプレットに送るハンドル
614         @param[in]  timeout     タイムアウト時間
615         @return     処理結果を返します。
616      */
617     inline Result StartLibraryApplet( AppletId id, const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE, nn::fnd::TimeSpan timeout=WAIT_INFINITE )
618     {
619         return detail::StartLibraryApplet(id, pParam, paramSize, handle, timeout);
620     }
621 
622     /*!
623         @}
624      */
625 
626     //================================================================
627     // アプリケーション終了
628     //================================================================
629     /*!
630         @name   アプリケーション終了
631         @{
632      */
633     /*!
634         @brief      アプリケーションを終了する準備を行います。
635 
636                     この関数の後に CloseApplication() を呼び出すことでアプリケーションが終了します。
637 
638         @return     処理結果を返します。
639      */
PrepareToCloseApplication(void)640     inline Result PrepareToCloseApplication(void)
641     {
642         return detail::PrepareToCloseApplication();
643     }
644 
645     /*!
646         @brief      アプリケーションを終了します。
647 
648                     この関数の前に PrepareToCloseApplication() が呼ばれている必要があります。
649 
650                     終了した後は、制御がホームメニューに移ります。
651                     この関数からは戻ってきません。
652 
653         @param[in]  pParam      パラメータバッファ
654         @param[in]  paramSize   パラメータバッファサイズ
655         @param[in]  handle      ハンドル
656         @return     処理結果を返します。
657      */
658     inline Result CloseApplication( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE )
659     {
660         return detail::CloseApplication( pParam, paramSize, handle );
661     }
662     /*!
663         @}
664      */
665 
666     //================================================================
667     // ホームメニュー
668     //================================================================
669     /*!
670         @name   ホームメニュー
671         @{
672      */
673     /*!
674         @brief      ホームメニューへ移行する準備を行います。
675 
676                     この関数の後に CloseApplication() を呼ぶことでホームメニューへ移行します。
677 
678         @return     処理結果を返します。
679      */
PrepareToJumpToHomeMenu(void)680     inline Result PrepareToJumpToHomeMenu(void)
681     {
682         return detail::PrepareToJumpToHomeMenu();
683     }
684 
685     /*!
686         @brief      ホームメニューへ移行します。
687 
688                     この関数の前に PrepareToJumpToHomeMenu() が呼ばれている必要があります。
689 
690                     この関数を呼んだ後に、WaitForStarting() で起動待ちを行ってください。
691 
692         @param[in]  pParam      ホームメニューへ送るパラメータバッファ
693         @param[in]  paramSize   ホームメニューへ送るパラメータバッファのサイズ
694         @param[in]  handle      ホームメニューへ送るハンドル
695         @return     処理結果を返します。
696      */
697     inline Result JumpToHomeMenu( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE )
698     {
699         return detail::JumpToHomeMenu( pParam, paramSize, handle );
700     }
701     /*!
702         @}
703      */
704 
705     //================================================================
706     // アプリケーションジャンプ
707     //================================================================
708     /*!
709         @name   アプリケーションジャンプ
710         @{
711      */
712     /*! :private
713         @brief      自身を終了し、他のアプリケーションを起動します。
714         @param[in]  programId   起動するアプリケーションのプログラム ID
715         @param[in]  pParam      起動するアプリケーションに渡す DeliverArg バッファ
716         @param[in]  pHmacBuf    起動するアプリケーションに渡す HMAC バッファ
717         @return     処理結果を返します。
718      */
719     inline Result JumpToOtherApplication( ProgramId programId, const u8 pParam[]=NULL, const u8 pHmacBuf[]=NULL )
720     {
721         return detail::JumpToOtherApplication( programId, pParam, pHmacBuf );
722     }
723     /*!
724         @}
725      */
726 
727     //================================================================
728     // 非公開
729     //================================================================
730     /*! :private
731         @brief      アプレットマネージャの遷移の準備状態を取得します。
732         @return     状態を返します。
733      */
GetAppletPreparationState(void)734     inline AppletPreparationState GetAppletPreparationState(void)
735     {
736         return detail::GetAppletPreparationState();
737     }
738 
739     /*! :private
740         @brief      アプリケーションがアプレットであることを宣言します。
741      */
SetAppletMode(void)742     inline void SetAppletMode(void)
743     {
744         detail::SetAppletMode();
745     }
746 
747     /*! :private
748         @brief      VRAM のシステム領域を退避させます。
749         @return     処理結果を返します。
750      */
SaveVramSysArea(void)751     inline nn::Result SaveVramSysArea(void)
752     {
753         return detail::SaveVramSysArea();
754     }
755 
756     /*! :private
757         @brief      VRAM のシステム領域を復元します。
758         @return     処理結果を返します。
759      */
RestoreVramSysArea(void)760     inline nn::Result RestoreVramSysArea(void)
761     {
762         return detail::RestoreVramSysArea();
763     }
764     /*!
765         @}
766      */
767 
768     //================================================================
769     // デバッグ用途
770     //================================================================
771     /*!
772         @name   開発用途
773         @{
774      */
775     inline Result DebugFunc(u32 param=0)
776     {
777         return detail::DebugFunc(param);
778     }
779     /*! :private
780         @brief      (開発用途) アプレットマネージャの状態を調整します。
781 
782                     通常アプリケーションは、ホームメニューから起動されるのですが
783                     開発中はそうでないケースがあります。
784 
785                     そのときに、あたかもそのアプリケーションがホームメニューから起動されたように
786                     アプレットマネージャの内部状態を変更するためにこの関数が用意されています。
787 
788                     製品版では不要になりますし、開発用途でも将来的に廃止する予定です。
789                     また、その際には入れたままにしても何も影響ないようにしますので、
790                     現状は入れておいてください。
791                     お手数ですが宜しくお願いいたします。
792 
793                     呼ぶ位置は、applet::Initialize() の直後です。
794 
795                     programId は、アプリケーションのプログラムIDを入れるための引数ですが、
796                     現状、0以外の値ならば何であっても問題ありません。
797 
798         @param[in]  programId  アプリケーションのプログラム ID (現在、0以外なら何でも構いません)
799      */
ArrangeAppletManagerForDebug(ProgramId programId)800     inline Result ArrangeAppletManagerForDebug( ProgramId programId )
801     {
802         return detail::ArrangeAppletManagerForDebug(programId);
803     }
804     /*!
805         @}
806      */
807 }
808 }
809 }
810 
811 /*!
812    @defgroup nn_applet applet
813 
814    @brief  APPLET を扱うモジュールです。
815 
816    @{
817 */
818 
819 #include <nn/util/detail/util_CLibImpl.h>
820 
821 
822 /*!
823   @brief   APPLET ライブラリの初期化を行い、APPLET を登録します。
824 
825   @detail  対応する C++ 関数 @ref nn::applet::CTR::Initialize() を参照してください。
826 */
827 NN_EXTERN_C inline nn::Result nnappletInitialize( AppletAttr appletAttr = NN_APPLET_DEFAULT_APPLET_ATTRIBUTE)
828 {
829     return nn::applet::CTR::Initialize(appletAttr);
830 }
831 /*!
832   @brief   APPLET ライブラリにおける mutex をロックします。
833 
834   @detail  対応する C++ 関数 @ref nn::applet::CTR::Lock() を参照してください。
835 */
nnappletLock(void)836 NN_EXTERN_C inline void nnappletLock(void)
837 {
838     nn::applet::CTR::Lock();
839 }
840 /*!
841   @brief   APPLET ライブラリにおける mutex のロックを試みます。
842 
843   @detail  対応する C++ 関数 @ref nn::applet::CTR::TryLock() を参照してください。
844 */
845 NN_EXTERN_C inline bool nnappletTryLock(nn::fnd::TimeSpan timeout=NN_APPLET_NO_WAIT)
846 {
847     return nn::applet::CTR::TryLock(timeout);
848 }
849 /*!
850   @brief   APPLET ライブラリにおける mutex をアンロックします。
851 
852   @detail  対応する C++ 関数 @ref nn::applet::CTR::Unlock() を参照してください。
853 */
nnappletUnlock(void)854 NN_EXTERN_C inline void nnappletUnlock(void)
855 {
856     nn::applet::CTR::Unlock();
857 }
858 
859 //----------------------------------------------------------------
860 /*!
861   @brief   登録されている APPLET の数を数えます。
862 
863   @detail  対応する C++ 関数 @ref nn::applet::CTR::CountRegisteredApplet() を参照してください。
864 */
nnappletCountRegisteredApplet(void)865 NN_EXTERN_C inline int nnappletCountRegisteredApplet(void)
866 {
867     return nn::applet::CTR::CountRegisteredApplet();
868 }
869 /*!
870   @brief   APPLET が登録されているかを調べます。
871 
872   @detail  対応する C++ 関数 @ref nn::applet::CTR::IsRegistered() を参照してください。
873 */
nnappletIsRegistered(AppletId appletId)874 NN_EXTERN_C inline bool nnappletIsRegistered( AppletId appletId )
875 {
876     return nn::applet::CTR::IsRegistered( appletId );
877 }
878 
879 NN_EXTERN_C inline bool nnappletWaitForRegister( AppletId appletId, nn::fnd::TimeSpan span=NN_APPLET_WAIT_INFINITE )
880 {
881     return nn::applet::CTR::WaitForRegister( appletId, span );
882 }
883 
884     /*!
885   @brief   APPLET が現在動作選択されて active かを調べます。
886 
887   @detail  対応する C++ 関数 @ref nn::applet::CTR::IsActive() を参照してください。
888 */
nnappletIsActive(void)889 NN_EXTERN_C inline bool nnappletIsActive(void)
890 {
891     return nn::applet::CTR::IsActive();
892 }
893 
894 NN_EXTERN_C inline void nnappletAssignGpuRight(bool flag=true)
895 {
896     nn::applet::CTR::AssignGpuRight(flag);
897 }
nnappletReleaseGpuRight(void)898 NN_EXTERN_C inline void nnappletReleaseGpuRight(void)
899 {
900     nn::applet::CTR::AssignGpuRight(false);
901 }
902 
903 /*!
904   @brief   APPLET が現在描画権限を与えられているかを調べます。
905 
906   @detail  対応する C++ 関数 @ref nn::applet::CTR::IsGpuRightGiven() を参照してください。
907 */
nnappletIsGpuRightGiven(void)908 NN_EXTERN_C inline bool nnappletIsGpuRightGiven(void)
909 {
910     return nn::applet::CTR::IsGpuRightGiven();
911 }
912 
nnappletAttachSharedMemoryHandle(nn::os::SharedMemoryBlock * sharedMemory,nn::Handle handle,size_t size,bool readOnly)913 NN_EXTERN_C inline void nnappletAttachSharedMemoryHandle( nn::os::SharedMemoryBlock* sharedMemory, nn::Handle handle, size_t size, bool readOnly )
914 {
915     nn::applet::CTR::AttachSharedMemoryHandle( sharedMemory, handle, size, readOnly );
916 }
917 
918 #if 0
919 NN_EXTERN_C inline void nnappletSetExitCallback( AppletExitCallback callback, uptr parameter )
920 {
921     nn::applet::CTR::SetExitCallback( callback, parameter );
922 }
923 #endif
924 
925 
926 
927 /*!
928     @}
929 */
930 
931 #endif  // ifndef NN_APPLET_CTR_APPLET_API_H_
932