mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2119 b08762b0-b915-fc4b-9d8c-17b2551a87ff
198 lines
6.0 KiB
C
198 lines
6.0 KiB
C
/*---------------------------------------------------------------------------*
|
|
Project: TwlIPL - tests - WDSWrapperTest
|
|
File: main.c
|
|
|
|
Copyright 2007 Nintendo. All rights reserved.
|
|
|
|
These coded instructions, statements, and computer programs contain
|
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
|
Company Ltd., and are protected by Federal copyright law. They may
|
|
not be disclosed to third parties or copied or duplicated in any form,
|
|
in whole or in part, without the prior written consent of Nintendo.
|
|
|
|
$Date:: $
|
|
$Rev$
|
|
$Author$
|
|
*---------------------------------------------------------------------------*/
|
|
#include <sysmenu/WDSWrapper.h>
|
|
|
|
// Vブランク関数
|
|
static void VBlankIntr(void)
|
|
{
|
|
OS_SetIrqCheckFlag(OS_IE_V_BLANK);
|
|
}
|
|
|
|
// ヒープ初期化関数
|
|
static void InitializeAllocateSystem(void)
|
|
{
|
|
void *tempLo;
|
|
OSHeapHandle hh;
|
|
|
|
tempLo = OS_InitAlloc(OS_ARENA_MAIN, OS_GetMainArenaLo(), OS_GetMainArenaHi(), 1);
|
|
OS_SetArenaLo(OS_ARENA_MAIN, tempLo);
|
|
hh = OS_CreateHeap(OS_ARENA_MAIN, OS_GetMainArenaLo(), OS_GetMainArenaHi());
|
|
if (hh < 0)
|
|
{
|
|
OS_Panic("ARM9: Fail to create heap...\n");
|
|
}
|
|
hh = OS_SetCurrentHeap(OS_ARENA_MAIN, hh);
|
|
}
|
|
|
|
// WDSWrapper用アロケータ
|
|
static void *Alloc_WDSWrapper( u32 size )
|
|
{
|
|
return OS_Alloc( size );
|
|
}
|
|
|
|
static void Free_WDSWrapper( void *ptr )
|
|
{
|
|
OS_Free( ptr );
|
|
}
|
|
|
|
char *callbackstring[] = {
|
|
"WDSWRAPPER_CALLBACK_INITIALIZE",
|
|
"WDSWRAPPER_CALLBACK_CLEANUP",
|
|
"WDSWRAPPER_CALLBACK_STARTSCAN",
|
|
"WDSWRAPPER_CALLBACK_STARTSCAN2",
|
|
"WDSWRAPPER_CALLBACK_STOPSCAN",
|
|
};
|
|
|
|
// WDSWrapper用コールバック関数
|
|
static void Callback_WDSWrapper( void *ptr )
|
|
{
|
|
WDSWrapperCallbackParam *callback = (WDSWrapperCallbackParam *)ptr;
|
|
OS_TPrintf("Callback_WDSWrapper: %s %d ", callbackstring[callback->callback], callback->errcode );
|
|
|
|
switch( callback->callback ) {
|
|
case WDSWRAPPER_CALLBACK_INITIALIZE:
|
|
OS_TPrintf( "初期化完了" );
|
|
break;
|
|
case WDSWRAPPER_CALLBACK_STARTSCAN2:
|
|
// n秒間隔のビーコン間欠スキャン一回分が完了
|
|
// ビーコンを受け取っていないという結果が出た場合、強調表示を消します
|
|
if( WDS_WrapperCheckValidBeacon() == WDSWRAPPER_ERRCODE_FAILURE )
|
|
OS_TPrintf( "強調表示を消します" );
|
|
else {
|
|
OS_TPrintf( "強調表示をつけます" );
|
|
}
|
|
// 受信したビーコン情報データをArgument領域に書き込む
|
|
#ifdef SDK_TWL
|
|
OS_TPrintf( "\n" );
|
|
WDS_WrapperSetArgumentParam();
|
|
#endif
|
|
break;
|
|
case WDSWRAPPER_CALLBACK_STARTSCAN:
|
|
// n秒間隔のビーコン間欠スキャン一回分が完了
|
|
// ビーコンを受け取っている場合のみ強調表示を付けます
|
|
if( WDS_WrapperCheckValidBeacon() == WDSWRAPPER_ERRCODE_SUCCESS )
|
|
OS_TPrintf( "強調表示をつけます" );
|
|
break;
|
|
case WDSWRAPPER_CALLBACK_STOPSCAN:
|
|
if( WDS_WrapperCheckValidBeacon() == WDSWRAPPER_ERRCODE_FAILURE )
|
|
OS_TPrintf( "強調表示を消します" );
|
|
else {
|
|
OS_TPrintf( "強調表示をつけます" );
|
|
}
|
|
break;
|
|
case WDSWRAPPER_CALLBACK_CLEANUP:
|
|
OS_TPrintf( "解放完了" );
|
|
break;
|
|
}
|
|
OS_TPrintf( "\n" );
|
|
}
|
|
|
|
// スリープモードに入る前に呼び出されるコールバック関数
|
|
static void Callback_WDSPreSleep( void *ptr )
|
|
{
|
|
#pragma unused( ptr )
|
|
WDS_WrapperCleanup();
|
|
while( WDS_WrapperCheckThreadRunning() == WDSWRAPPER_ERRCODE_SUCCESS )
|
|
OS_Sleep( 100 );
|
|
}
|
|
|
|
// スリープモードから復帰する際に呼び出されるコールバック関数
|
|
static void Callback_WDSPostSleep( void *ptr )
|
|
{
|
|
#pragma unused( ptr )
|
|
WDSWrapperInitializeParam param;
|
|
|
|
// WDSWrapper初期化と動作開始
|
|
param.threadprio = 20;
|
|
param.dmano = 1;
|
|
|
|
param.callback = Callback_WDSWrapper;
|
|
param.alloc = Alloc_WDSWrapper;
|
|
param.free = Free_WDSWrapper;
|
|
WDS_WrapperInitialize( param );
|
|
}
|
|
|
|
// メイン関数
|
|
void NitroMain(void)
|
|
{
|
|
WDSWrapperInitializeParam param;
|
|
u16 lastpad = 0x0000;
|
|
u16 nowpad = 0x0000;
|
|
PMSleepCallbackInfo presleepcallbackinfo, postsleepcallbackinfo;
|
|
|
|
// 各種初期化処理
|
|
OS_Init();
|
|
OS_InitTick();
|
|
OS_InitAlarm();
|
|
|
|
//---- interrupt setting
|
|
OS_SetIrqFunction(OS_IE_V_BLANK, VBlankIntr);
|
|
OS_EnableIrqMask(OS_IE_V_BLANK);
|
|
OS_EnableIrq();
|
|
GX_VBlankIntr(TRUE);
|
|
|
|
//---- power manager callback
|
|
PM_SetSleepCallbackInfo( &presleepcallbackinfo, Callback_WDSPreSleep, NULL );
|
|
PM_AppendPreSleepCallback( &presleepcallbackinfo );
|
|
PM_SetSleepCallbackInfo( &postsleepcallbackinfo, Callback_WDSPostSleep, NULL );
|
|
PM_AppendPostSleepCallback( &postsleepcallbackinfo );
|
|
|
|
InitializeAllocateSystem();
|
|
|
|
OS_TPrintf( "WDSWrapper Sample\n\n" );
|
|
OS_TPrintf( "Xボタン: WDSラッパーとWDSを初期化し、間欠スキャンを開始\n" );
|
|
OS_TPrintf( "Bボタン: スキャンを中断\n" );
|
|
OS_TPrintf( "Aボタン: スキャンを再開\n" );
|
|
OS_TPrintf( "Yボタン: スキャンを中断し、WDSラッパーとWDSを解放\n" );
|
|
OS_TPrintf( "スタートボタン: ヒープをダンプ表示\n" );
|
|
OS_TPrintf( "セレクトボタン: スリープモードin/out\n" );
|
|
|
|
// キー入力で中断・再開・解放をやる
|
|
while( 1 ) {
|
|
lastpad = nowpad;
|
|
nowpad = PAD_Read();
|
|
|
|
// Aボタン: スキャンを再開
|
|
// Bボタン: スキャンを中断
|
|
// Xボタン: ラッパーを初期化
|
|
// Yボタン: ラッパーを解放
|
|
// スタートボタン: ヒープをダンプ表示
|
|
if( ( lastpad ^ nowpad ) & PAD_BUTTON_A && !( nowpad & PAD_BUTTON_A ) )
|
|
WDS_WrapperStartScan();
|
|
if( ( lastpad ^ nowpad ) & PAD_BUTTON_B && !( nowpad & PAD_BUTTON_B ) )
|
|
WDS_WrapperStopScan();
|
|
if( ( lastpad ^ nowpad ) & PAD_BUTTON_X && !( nowpad & PAD_BUTTON_X ) ) {
|
|
// WDSWrapper初期化と動作開始
|
|
param.threadprio = 20;
|
|
param.dmano = 1;
|
|
|
|
param.callback = Callback_WDSWrapper;
|
|
param.alloc = Alloc_WDSWrapper;
|
|
param.free = Free_WDSWrapper;
|
|
WDS_WrapperInitialize( param );
|
|
}
|
|
if( ( lastpad ^ nowpad ) & PAD_BUTTON_Y && !( nowpad & PAD_BUTTON_Y ) )
|
|
WDS_WrapperCleanup();
|
|
if( ( lastpad ^ nowpad ) & PAD_BUTTON_START && !( nowpad & PAD_BUTTON_START ) )
|
|
OS_DumpHeap( OS_ARENA_MAIN, OS_CURRENT_HEAP_HANDLE );
|
|
if( ( lastpad ^ nowpad ) & PAD_BUTTON_SELECT && !( nowpad & PAD_BUTTON_SELECT ) ) {
|
|
PM_GoSleepMode( PM_TRIGGER_KEY, PM_PAD_LOGIC_OR, PAD_BUTTON_SELECT );
|
|
}
|
|
OS_Sleep( 100 );
|
|
}
|
|
}
|