From d7e3961a3aed9089d75030f2ecf83c258face436 Mon Sep 17 00:00:00 2001 From: yosiokat Date: Wed, 6 Aug 2008 12:12:47 +0000 Subject: [PATCH] =?UTF-8?q?WDS=E3=83=A9=E3=82=A4=E3=83=96=E3=83=A9?= =?UTF-8?q?=E3=83=AA=E3=82=9220080806=E5=8F=97=E9=A0=98=E7=89=88=E3=81=AB?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2119 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../wds/ARM9/src/WDSWrapper.c | 104 +++++++++++++++--- build/libraries_sysmenu/wds/readme.txt | 19 +++- .../Launcher/ARM9/src/scanWDS.c | 19 +++- build/tests/WDSWrapperTest/src/main.c | 71 ++++++++++-- include/sysmenu/WDS.h | 4 + include/sysmenu/WDSWrapper.h | 2 + 6 files changed, 183 insertions(+), 36 deletions(-) diff --git a/build/libraries_sysmenu/wds/ARM9/src/WDSWrapper.c b/build/libraries_sysmenu/wds/ARM9/src/WDSWrapper.c index 4ec4b266..f4059ed2 100644 --- a/build/libraries_sysmenu/wds/ARM9/src/WDSWrapper.c +++ b/build/libraries_sysmenu/wds/ARM9/src/WDSWrapper.c @@ -44,8 +44,10 @@ typedef struct WDSWrapperWork u8 *wdswork; //!< WDSが使用するワークエリア - WDSBriefApInfo briefapinfo[WDS_APINFO_MAX]; //!< WDSラッパーがWDSを使用した結果を格納する領域 - int briefapinfonum; //!< WDSラッパーがWDSを使用した結果を格納する領域 + WDSBriefApInfo briefapinfo[WDS_APINFO_MAX]; //!< WDSラッパーがWDSを使用した結果を格納する領域 + WDSBriefApInfo briefapinfo_previous[WDS_APINFO_MAX]; //!< 直前のWDSを使用した結果を格納する領域 + int briefapinfonum; //!< WDSラッパーがWDSを使用した結果を格納する領域 + int briefapinfonum_previous; //!< 直前のWDSを使用した結果を格納する領域 WDSWrapperInitializeParam initparam; //!< 初期化時パラメータのコピー WDSWrapperStateThreadState state; //!< WDSラッパーのステート @@ -55,7 +57,9 @@ typedef struct WDSWrapperWork BOOL idle; //!< 間欠スキャン中断フラグ BOOL restart; //!< 間欠スキャン再開フラグ +#ifdef SDK_TWL OSDeliverArgInfo deliverinfo; //!< TWL用アプリ間引数ワークエリア +#endif BOOL callingback; //!< コールバック関数呼び出し中はTRUE } WDSWrapperWork; @@ -106,19 +110,47 @@ static void DumpWDSApInfo( WDSApInfo *apinfo ) buf[WDS_APNUM_BUF_SIZE] = 0x00; OS_TPrintf( "APNUM: %s\n", buf ); + // HOTSPOTID + OS_TPrintf( "hotspotid: %d\n", apinfo->hotspotid ); + + // HOTSPOTNAME + OS_TPrintf( "hotspotname: " ); + for( i = 0 ; i < WDS_HOTSPOTNAME_BUF_SIZE ; i++ ) + { + OS_TPrintf( "%02x", apinfo->hotspotname[i] ); + } + OS_TPrintf( "\n" ); + + // WEPKEY + OS_TPrintf( "wepkey: " ); + for( i = 0 ; i < WDS_WEPKEY_BUF_SIZE ; i++ ) + { + OS_TPrintf( "%02x", apinfo->wepkey[i] ); + } + OS_TPrintf( "\n" ); + // CHANNEL OS_TPrintf( "channel: %d\n", apinfo->channel ); // ENCRYPTFLAG OS_TPrintf( "encryptmethod: %d\n", apinfo->encryptflag); - // WEPKEY - OS_TPrintf( "WEPKEY: " ); - for( i = 0 ; i < WDS_WEPKEY_BUF_SIZE ; i++ ) + // INFOFLAG + OS_TPrintf( "infoflag: %02d\n", apinfo->infoflag); + + // RESERVE + OS_TPrintf( "reserve: " ); + for( i = 0 ; i < 5 ; i++ ) { - OS_TPrintf( "%02x", apinfo->wepkey[i] ); + OS_TPrintf( "%02x", apinfo->reserve[i] ); } OS_TPrintf( "\n" ); + + // MTU + OS_TPrintf( "mtu: %d\n", apinfo->mtu); + + // CRC + OS_TPrintf( "crc: %04x\n", apinfo->crc); } //-------------------------------------------------------------------------------- @@ -139,6 +171,9 @@ static void WDS_WrapperBeforeInitState( void ) // 連続スキャン開始時間の記録 g_wdswrapperwork->tickstart = OS_GetTick(); + // 現スキャン状態のスキャン結果をクリア + g_wdswrapperwork->briefapinfonum = 0; + // スキャン開始ステートへ g_wdswrapperwork->state = WDSWRAPPER_STATE_INIT; return; @@ -159,6 +194,9 @@ static void WDS_WrapperBeforeInitState( void ) // 連続スキャン開始時間の記録 g_wdswrapperwork->tickstart = OS_GetTick(); + // 現スキャン状態のスキャン結果をクリア + g_wdswrapperwork->briefapinfonum = 0; + // スキャン開始ステートへ g_wdswrapperwork->state = WDSWRAPPER_STATE_INIT; } @@ -257,7 +295,6 @@ static void WDS_WrapperScanState( void ) #ifdef WDSWRAPPER_DEBUGPRINT OS_Printf("WDS_StartScan successed\n"); #endif - g_wdswrapperwork->briefapinfonum = 0; } else { // スキャン開始に失敗したのでWDS解放開始ステートへ @@ -364,10 +401,14 @@ static void WDS_WrapperStartScan_CB( void *arg ) // コールバックパラメータの設定 param.callback = WDSWRAPPER_CALLBACK_STARTSCAN2; param.errcode = WDSWRAPPER_ERRCODE_SUCCESS; - + // コールバック関数の呼び出し WDS_WrapperCallUserCallback( ¶m ); + // これまでのスキャン結果を直前のスキャン結果を保持しておく場所にコピー + MI_CpuCopy8( g_wdswrapperwork->briefapinfo, g_wdswrapperwork->briefapinfo_previous, sizeof(g_wdswrapperwork->briefapinfo) ); + g_wdswrapperwork->briefapinfonum_previous = g_wdswrapperwork->briefapinfonum; + // 十分長い時間スキャンしたのでスキャン中断ステートへ g_wdswrapperwork->state = WDSWRAPPER_STATE_ENDSCAN; } @@ -548,6 +589,14 @@ static void WDS_WrapperIdleState( void ) { g_wdswrapperwork->idle = FALSE; g_wdswrapperwork->restart = FALSE; + + // 連続スキャン開始時間の記録 + g_wdswrapperwork->tickstart = OS_GetTick(); + + // 現スキャン状態のスキャン結果をクリア + g_wdswrapperwork->briefapinfonum = 0; + + // スキャン開始ステートへ g_wdswrapperwork->state = WDSWRAPPER_STATE_INIT; } } @@ -562,7 +611,10 @@ static void WDS_WrapperThreadFunc( void *arg ) #pragma unused( arg ) WDSWrapperCallbackParam param; - // ステートの初期化 + // 間欠受信のビーコン数を初期化 + g_wdswrapperwork->briefapinfonum = 0; + + // スキャン開始ステートへ g_wdswrapperwork->state = WDSWRAPPER_STATE_INIT; while( 1 ) { @@ -801,13 +853,23 @@ WDSWrapperErrCode WDS_WrapperCheckValidBeacon( void ) if( g_wdswrapperwork->callingback != TRUE ) return WDSWRAPPER_ERRCODE_FAILURE; + if( g_wdswrapperwork->briefapinfonum_previous > 0 ) { + // 直前のWDSの結果が生きていればまずそれをチェックする + for( i = 0; i < g_wdswrapperwork->briefapinfonum_previous; i++ ) { + if( g_wdswrapperwork->briefapinfo_previous[i].isvalid == TRUE && + g_wdswrapperwork->briefapinfo_previous[i].apinfo.infoflag & WDS_INFOFLAG_NOTIFY ) { + ret = WDSWRAPPER_ERRCODE_SUCCESS; + break; + } + } + } if( g_wdswrapperwork->briefapinfonum > 0 ) { + // 現在スキャン中のデータもチェックする for( i = 0; i < g_wdswrapperwork->briefapinfonum; i++ ) { - if( g_wdswrapperwork->briefapinfo[i].isvalid == TRUE ) { - if( g_wdswrapperwork->briefapinfo[i].apinfo.infoflag & WDS_INFOFLAG_NOTIFY ) { - ret = WDSWRAPPER_ERRCODE_SUCCESS; - break; - } + if( g_wdswrapperwork->briefapinfo[i].isvalid == TRUE && + g_wdswrapperwork->briefapinfo[i].apinfo.infoflag & WDS_INFOFLAG_NOTIFY ) { + ret = WDSWRAPPER_ERRCODE_SUCCESS; + break; } } } @@ -823,6 +885,7 @@ WDSWrapperErrCode WDS_WrapperCheckValidBeacon( void ) @return WDSWRAPPER_ERRCODE_FAILURE: 親機ビーコン情報をArgument領域にセットできなかった @return WDSWRAPPER_ERRCODE_UNINITIALIZED: WDSラッパーライブラリが初期化されていない *///------------------------------------------------------------------------------ +#ifdef SDK_TWL WDSWrapperErrCode WDS_WrapperSetArgumentParam( void ) { int err; @@ -831,11 +894,15 @@ WDSWrapperErrCode WDS_WrapperSetArgumentParam( void ) if( g_wdswrapperwork == NULL ) return WDSWRAPPER_ERRCODE_UNINITIALIZED; - // TWL用のArgumentシステムを初期化 - OS_InitDeliverArgInfo( &g_wdswrapperwork->deliverinfo, sizeof( g_wdswrapperwork->briefapinfo ) ); + // TWL用のArgumentシステムに取得したビーコンデータを書き込む + if( g_wdswrapperwork->briefapinfonum_previous <= 0 && g_wdswrapperwork->briefapinfonum > 0) { + // 直前のスキャンがビーコンなしだが、現在のスキャン結果にビーコンがある場合は現在スキャン中の情報を使う + g_wdswrapperwork->briefapinfonum_previous = g_wdswrapperwork->briefapinfonum; + MI_CpuCopy8( g_wdswrapperwork->briefapinfo, g_wdswrapperwork->briefapinfo_previous, sizeof( g_wdswrapperwork->briefapinfo ) ); + } + OS_InitDeliverArgInfo( &g_wdswrapperwork->deliverinfo, sizeof( g_wdswrapperwork->briefapinfo_previous ) ); + err = OS_SetBinaryToDeliverArg( g_wdswrapperwork->briefapinfo_previous, sizeof( g_wdswrapperwork->briefapinfo_previous ) ); - // Argument領域に書き込み - err = OS_SetBinaryToDeliverArg( g_wdswrapperwork->briefapinfo, sizeof( g_wdswrapperwork->briefapinfo ) ); if( err != OS_DELIVER_ARG_SUCCESS ) { #ifdef WDSWRAPPER_DEBUGPRINT OS_TPrintf( "WDS_WrapperSetArgumentParam: failed %d\n", err ); @@ -858,6 +925,7 @@ WDSWrapperErrCode WDS_WrapperSetArgumentParam( void ) return WDSWRAPPER_ERRCODE_SUCCESS; } +#endif //-------------------------------------------------------------------------------- /** diff --git a/build/libraries_sysmenu/wds/readme.txt b/build/libraries_sysmenu/wds/readme.txt index f001ceef..fe04c983 100644 --- a/build/libraries_sysmenu/wds/readme.txt +++ b/build/libraries_sysmenu/wds/readme.txt @@ -1,6 +1,6 @@ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■ ■ -■ TWLWDSライブラリ 2008/7/ 3版 ■ +■ TWLWDSライブラリ 2008/8/06版 ■ ■ ■ ■ ネットワーク開発部からのお知らせ ■ ■ ■ @@ -8,14 +8,13 @@ ●動作確認バージョン ・SDK -(TwlSDK-5_00fc-080325-1027-branch-5_0fc-TS400_jp) -(TwlSDK-5_00fc-patch-plus4-080609_jp) -(TwlSDK-5_00fcplus2-080428-1417-private-crypto-branch-5_0fcplus2_jp) +(TwlSDK-5_00rc1-080729_jp) +(TwlSDK-5_00rc1-080729-private-NADK_jp) ・コンパイラ (CodeWarrior v2.0) (20080215_cw_ds_2.0_sp2_Buildtools_Patch2.jpSP1) ・デバッグ環境 -(IS-TWL-DEBUGGER Version 0.63.0805.2900) +(IS-TWL-DEBUGGER Version 0.70.0807.2400) ●ビルドする際の注意事項 ・ライブラリのビルドは @@ -26,8 +25,16 @@ %make TWLSDK_PLATFORM=TWL ●変更履歴 +2008/08/06 20080806版 +・WDS_WrapperStopScan関数を使用してビーコン受信を中断した場合、 +中断の直前に呼び出したWDS_WrapperCheckValidBeacon関数ではビーコンが +受信されていると通知されるにもかかわらず、中断後にはWDSWrapperライブラリの +状態が、ビーコンが受信されていない状態になる場合があるバグを修正しました。 -2008/06/26 20080703版 +2008/07/14 20080714版 +・WDSWrapperTestサンプルにスリープモードに関連する処理を追加しました。 + +2008/07/03 20080703版 ・WDSラッパー内部で行っていた排他制御に関連して発生していたフリーズ問題を修正しました。 2008/06/26 20080626版 diff --git a/build/systemMenu_RED/Launcher/ARM9/src/scanWDS.c b/build/systemMenu_RED/Launcher/ARM9/src/scanWDS.c index 4a601ecb..c4d0327f 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/scanWDS.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/scanWDS.c @@ -68,6 +68,13 @@ void Callback_WDSWrapper( void *ptr ) if( WDS_WrapperCheckValidBeacon() == WDSWRAPPER_ERRCODE_SUCCESS ) WDS_PRINTF( "強調表示をつけます" ); break; + case WDSWRAPPER_CALLBACK_STOPSCAN: + if( WDS_WrapperCheckValidBeacon() == WDSWRAPPER_ERRCODE_FAILURE ) + OS_TPrintf( "強調表示を消します" ); + else { + OS_TPrintf( "強調表示をつけます" ); + } + break; case WDSWRAPPER_CALLBACK_CLEANUP: s_isStarted = FALSE; s_isClearnup = TRUE; @@ -84,14 +91,22 @@ void Callback_WDSPreSleep( void *ptr ) WDS_WrapperCleanup(); while ( WDS_WrapperCheckThreadRunning() == WDSWRAPPER_ERRCODE_SUCCESS ) { - OS_Sleep(1); + OS_Sleep( 100 ); } } void Callback_WDSPostSleep( void *ptr ) { #pragma unused( ptr ) - InitializeWDS(); + WDSWrapperInitializeParam param; + + // WDSWrapper初期化と動作開始 + param.threadprio = WDS_THREAD_PRIO; + param.dmano = WDS_DMA_NO; + param.callback = Callback_WDSWrapper; + param.alloc = SYSM_Alloc; + param.free = SYSM_Free; + (void)WDS_WrapperInitialize( param ); } // 初期化関数 diff --git a/build/tests/WDSWrapperTest/src/main.c b/build/tests/WDSWrapperTest/src/main.c index 30bbc726..c103a5d8 100644 --- a/build/tests/WDSWrapperTest/src/main.c +++ b/build/tests/WDSWrapperTest/src/main.c @@ -63,34 +63,76 @@ static void Callback_WDSWrapper( void *ptr ) WDSWrapperCallbackParam *callback = (WDSWrapperCallbackParam *)ptr; OS_TPrintf("Callback_WDSWrapper: %s %d ", callbackstring[callback->callback], callback->errcode ); - if( callback->callback == WDSWRAPPER_CALLBACK_STARTSCAN2 ) { + 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( "強調表示をつけます" ); - if( WDS_WrapperSetArgumentParam() == WDSWRAPPER_ERRCODE_SUCCESS ) - OS_TPrintf( "\nArgument領域にパラメータを代入\n" ); - else - OS_TPrintf( "\nArgument領域にパラメータを代入失敗\n" ); } - } - else if( callback->callback == WDSWRAPPER_CALLBACK_STARTSCAN ) { + // 受信したビーコン情報データを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(); @@ -102,7 +144,13 @@ void NitroMain(void) 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" ); @@ -111,6 +159,7 @@ void NitroMain(void) OS_TPrintf( "Aボタン: スキャンを再開\n" ); OS_TPrintf( "Yボタン: スキャンを中断し、WDSラッパーとWDSを解放\n" ); OS_TPrintf( "スタートボタン: ヒープをダンプ表示\n" ); + OS_TPrintf( "セレクトボタン: スリープモードin/out\n" ); // キー入力で中断・再開・解放をやる while( 1 ) { @@ -140,7 +189,9 @@ void NitroMain(void) 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 ); } } diff --git a/include/sysmenu/WDS.h b/include/sysmenu/WDS.h index 965eecfa..d8de2433 100644 --- a/include/sysmenu/WDS.h +++ b/include/sysmenu/WDS.h @@ -18,7 +18,11 @@ extern "C" { //----------------------------------------------------- // Include //----------------------------------------------------- +#ifdef SDK_TWL #include +#else +#include +#endif //----------------------------------------------------- // Macros diff --git a/include/sysmenu/WDSWrapper.h b/include/sysmenu/WDSWrapper.h index 6818c81d..d5979efb 100644 --- a/include/sysmenu/WDSWrapper.h +++ b/include/sysmenu/WDSWrapper.h @@ -126,7 +126,9 @@ WDSWrapperErrCode WDS_WrapperCleanup( void ); WDSWrapperErrCode WDS_WrapperStartScan( void ); WDSWrapperErrCode WDS_WrapperStopScan( void ); WDSWrapperErrCode WDS_WrapperCheckValidBeacon( void ); +#ifdef SDK_TWL WDSWrapperErrCode WDS_WrapperSetArgumentParam( void ); +#endif WDSWrapperErrCode WDS_WrapperCheckThreadRunning( void ); OSThread *WDS_WrapperGetOSThread( void );