・セーブデータ救済処理をスレッド化

・表示の整理
・コードの整理

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlToolsRED@549 7061adef-622a-194b-ae81-725974e89856
This commit is contained in:
N2205 2011-04-26 01:13:35 +00:00
parent 5d72e1f499
commit f8e65ada11
2 changed files with 117 additions and 162 deletions

View File

@ -21,15 +21,18 @@
#include "screen.h" #include "screen.h"
// define data------------------------------------------ // define data------------------------------------------
typedef enum DetectError #define THREAD_PRIO 17
#define STACK_SIZE 0x2000
typedef enum RepairResult
{ {
DETECT_ERROR_NONE = 0, REPAIR_RESULT_SUCCESS = 0,
DETECT_ERROR_DIR_OPEN = 1, REPAIR_RESULT_DIR_OPEN = 1,
DETECT_ERROR_RESCUE_DATA = 2, REPAIR_RESULT_RESCUE_DATA = 2,
DETECT_ERROR_VERIFY_DATA = 3, REPAIR_RESULT_VERIFY_DATA = 3,
DETECT_ERROR_MAX REPAIR_RESULT_MAX
} }
DetectError; RepairResult;
typedef enum RunningMode typedef enum RunningMode
{ {
@ -53,14 +56,14 @@ SDStat;
// function's prototype declaration--------------------- // function's prototype declaration---------------------
static void MenuScene( void ); static void MenuScene( void );
DetectError ResucuSDSaveData( void ); static void ResucuSDSaveData( void *arg );
static void* AllocForNAM(u32 size); static void* AllocForNAM(u32 size);
static void FreeForNAM(void* ptr); static void FreeForNAM(void* ptr);
// global variable ------------------------------------- // global variable -------------------------------------
// static variable ------------------------------------- // static variable -------------------------------------
static DetectError s_result; static RepairResult s_result;
static char s_mode = 0; static char s_mode = 0;
static s32 s_SDCheck = 0; static s32 s_SDCheck = 0;
@ -68,17 +71,21 @@ static BOOL s_protected = FALSE;
static BOOL s_protect_checked = FALSE; static BOOL s_protect_checked = FALSE;
static FSEventHook s_hook; static FSEventHook s_hook;
static s32 s_debug = 0; static s32 s_error_code = 0;
static KeyInfo gKey; static KeyInfo gKey;
static OSThread s_thread;
static u64 s_stack[ STACK_SIZE / sizeof(u64) ];
static u8 s_font_color = 0xff;
// const data ----------------------------------------- // const data -----------------------------------------
static const char *s_result_message[ DETECT_ERROR_MAX ] = static const char *s_result_message[ REPAIR_RESULT_MAX ] =
{ {
"Success", "Success",
"Directory Access Error", "Directory Access Error",
"Rescue Save Data Error", "Rescue SaveData Error",
"Verify Save Data Error" "Verify SaveData Error"
}; };
@ -137,6 +144,7 @@ static BOOL IsCardRemoved( void )
return FALSE; return FALSE;
} }
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: DrawMainScene Name: DrawMainScene
@ -149,13 +157,18 @@ static BOOL IsCardRemoved( void )
0xf9, // くすんだ青 0xfa, // くすんだ黄色 0xfb, // 紫 0xf9, // くすんだ青 0xfa, // くすんだ黄色 0xfb, // 紫
0xfc, // うすい青 0xfd, // 灰色 0xfe, // 濃い灰色 0xfc, // うすい青 0xfd, // 灰色 0xfe, // 濃い灰色
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#define CHANGE_INTERVAL 5
#define PROC_MARK_BASE_X 27
#define PROC_MARK_BASE_Y 20
static void DrawMainScene( void ) static void DrawMainScene( void )
{ {
PutMainScreen( 2, 2, 0xff, "+--------------------------+"); static u8 count = 0;
PutMainScreen( 2, 3, 0xff, "+ +");
PutMainScreen( 2, 4, 0xff, "+ Repair Exported SaveData +"); PutMainScreen( 2, 2, s_font_color, "+--------------------------+");
PutMainScreen( 2, 5, 0xff, "+ +"); PutMainScreen( 2, 3, s_font_color, "+ +");
PutMainScreen( 2, 6, 0xff, "+--------------------------+"); PutMainScreen( 2, 4, s_font_color, "+ Repair Exported SaveData +");
PutMainScreen( 2, 5, s_font_color, "+ +");
PutMainScreen( 2, 6, s_font_color, "+--------------------------+");
// モードごとの描画処理 // モードごとの描画処理
switch( s_mode ) switch( s_mode )
@ -176,18 +189,72 @@ static void DrawMainScene( void )
} }
break; break;
case MODE_PROC: case MODE_PROC:
count++;
if( count >= 0 && count < CHANGE_INTERVAL )
{
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y , 0xfc, "+++");
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, 0xfc, "++");
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+2, 0xfc, "+");
}
else if( count >= CHANGE_INTERVAL && count < CHANGE_INTERVAL*2 )
{
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y , 0xfc, "+++");
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, 0xfc, "+++");
}
else if( count >= CHANGE_INTERVAL*2 && count < CHANGE_INTERVAL*3 )
{
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y , 0xfc, "+++");
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, 0xfc, " ++");
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+2, 0xfc, " +");
}
else if( count >= CHANGE_INTERVAL*3 && count < CHANGE_INTERVAL*4 )
{
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y , 0xfc, " ++");
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, 0xfc, " ++");
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+2, 0xfc, " ++");
}
else if( count >= CHANGE_INTERVAL*4 && count < CHANGE_INTERVAL*5 )
{
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y , 0xfc, " +");
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, 0xfc, " ++");
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+2, 0xfc, "+++");
}
else if( count >= CHANGE_INTERVAL*5 && count < CHANGE_INTERVAL*6 )
{
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, 0xfc, "+++");
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+2, 0xfc, "+++");
}
else if( count >= CHANGE_INTERVAL*6 && count < CHANGE_INTERVAL*7 )
{
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y , 0xfc, "+");
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, 0xfc, "++");
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+2, 0xfc, "+++");
}
else if( count >= CHANGE_INTERVAL*7 && count < CHANGE_INTERVAL*8)
{
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y , 0xfc, "++");
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+1, 0xfc, "++");
PutMainScreen( PROC_MARK_BASE_X, PROC_MARK_BASE_Y+2, 0xfc, "++");
}
if( count == CHANGE_INTERVAL*8 - 1 )
{
count = 0;
}
PutMainScreen( 3, 12, 0xf4, "Now Accessing SD card"); PutMainScreen( 3, 12, 0xf4, "Now Accessing SD card");
PutMainScreen( 3, 14, 0xf4, "Please Do not Touch SD card"); PutMainScreen( 3, 14, 0xf4, "Please Do not Touch SD card");
break; break;
case MODE_RESULT: case MODE_RESULT:
if( s_result == DETECT_ERROR_NONE ) if( s_result == REPAIR_RESULT_SUCCESS )
{ {
PutMainScreen( 5, 12, 0xf2, "%s", s_result_message[s_result]); PutMainScreen( 4, 12, s_font_color, "%s!", s_result_message[s_result]);
PutMainScreen( 4, 14, s_font_color, "Repair SaveData Completed");
PutMainScreen( 4, 16, s_font_color, "Please Turn Off Power");
} }
else else
{ {
PutMainScreen( 6, 12, 0xf1, "%s", s_result_message[s_result]); PutMainScreen( 4, 12, s_font_color, "%s", s_result_message[s_result]);
PutMainScreen( 7, 14, 0xf1, "Error Code : %d", s_debug); PutMainScreen( 4, 14, s_font_color, "Error Code : %d", s_error_code);
} }
break; break;
default: default:
@ -196,17 +263,6 @@ static void DrawMainScene( void )
} }
/*---------------------------------------------------------------------------*
Name: CheckCard
Description:
*---------------------------------------------------------------------------*/
static void CheckCard( void )
{
return;
}
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: RepairSaveDataInit Name: RepairSaveDataInit
@ -265,8 +321,6 @@ void RepairSaveDataMain(void)
// SD カードが刺さったら一回だけプロテクトチェックする // SD カードが刺さったら一回だけプロテクトチェックする
// 再び刺さるまでチェックしない // 再び刺さるまでチェックしない
// 割り込み禁止
intrmode = OS_DisableInterrupts(); intrmode = OS_DisableInterrupts();
if( !s_protect_checked ) if( !s_protect_checked )
{ {
@ -296,8 +350,8 @@ void RepairSaveDataMain(void)
// キー入力があれば読み込みスレッド起動してライティングモードへ // キー入力があれば読み込みスレッド起動してライティングモードへ
if( gKey.trg == PAD_BUTTON_A ) if( gKey.trg == PAD_BUTTON_A )
{ {
//OS_CreateThread( &readwrite_thread, SaveCardToSD, NULL, stack+STACK_SIZE/sizeof(u64), STACK_SIZE, THREAD_PRIO ); OS_CreateThread( &s_thread, ResucuSDSaveData, NULL, s_stack+STACK_SIZE/sizeof(u64), STACK_SIZE, THREAD_PRIO );
//OS_WakeupThreadDirect( &readwrite_thread ); OS_WakeupThreadDirect( &s_thread );
s_mode = MODE_PROC; s_mode = MODE_PROC;
break; break;
} }
@ -321,33 +375,24 @@ void RepairSaveDataMain(void)
// 処理モード // 処理モード
case MODE_PROC: case MODE_PROC:
s_result = ResucuSDSaveData();
// SDカード抜け検出 // SDカード抜け検出
if ( IsCardRemoved() == TRUE ) if ( IsCardRemoved() == TRUE )
{ {
// とりあえず読み込みスレッド終了を待ってから終わる // とりあえず読み込みスレッド終了を待ってから終わる
// そうしないと読み込み用スレッド並立してしまう可能性 // そうしないと読み込み用スレッド並立してしまう可能性
//while( !OS_IsThreadTerminated( &readwrite_thread ) ){} while( !OS_IsThreadTerminated( &s_thread ) ){}
break; break;
} }
// 読み込みスレッドが終了したらライト可モードへ // 読み込みスレッドが終了したらライト可モードへ
/*if( OS_IsThreadTerminated( &readwrite_thread ) ) if( OS_IsThreadTerminated( &s_thread ) )
{ {
s_mode = MODE_WRITABLE; s_mode = MODE_RESULT;
s_read_count = 0; // 読み込みスレッド終わってからでないとかっこわるい s_font_color = (s_result == REPAIR_RESULT_SUCCESS) ? (u8)0xf2 : (u8)0xf1;
break; break;
}*/ }
/* break;
if( gKey.trg == PAD_BUTTON_A )
{
s_mode = MODE_RESULT;
}
*/
s_mode = MODE_RESULT;
break;
// 結果モード // 結果モード
case MODE_RESULT: case MODE_RESULT:
@ -363,11 +408,12 @@ void RepairSaveDataMain(void)
Description: SDカードに退避されたアプリのセーブデータの署名を付け替える Description: SDカードに退避されたアプリのセーブデータの署名を付け替える
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
DetectError ResucuSDSaveData( void ) static void ResucuSDSaveData( void *arg )
{ {
#pragma unused( arg )
FSFile file; FSFile file;
FSDirectoryEntryInfo dir; FSDirectoryEntryInfo dir;
DetectError retval = DETECT_ERROR_NONE; RepairResult result = REPAIR_RESULT_SUCCESS;
FS_InitFile(&file); FS_InitFile(&file);
@ -405,21 +451,21 @@ DetectError ResucuSDSaveData( void )
FS_CloseFile(&tempFile); FS_CloseFile(&tempFile);
} }
s_debug = NAM_RescueBkp( path_buf ); s_error_code = NAM_RescueBkp( path_buf );
// セーブデータの救済処置 // セーブデータの救済処置
if(s_debug == NAM_OK) if(s_error_code == NAM_OK)
{ {
// 処理が成功したらベリファイ // 処理が成功したらベリファイ
if(NAM_VerifyBkpStrict( path_buf ) != NAM_OK) if(NAM_VerifyBkpStrict( path_buf ) != NAM_OK)
{ {
retval = DETECT_ERROR_VERIFY_DATA; result = REPAIR_RESULT_VERIFY_DATA;
break; break;
} }
} }
else else
{ {
retval = DETECT_ERROR_RESCUE_DATA; result = REPAIR_RESULT_RESCUE_DATA;
break; break;
} }
} }
@ -428,10 +474,15 @@ DetectError ResucuSDSaveData( void )
FS_CloseDirectory(&file); FS_CloseDirectory(&file);
return retval; s_result = result;
} }
/*---------------------------------------------------------------------------*
Name: AllocForNAM
Description:
*---------------------------------------------------------------------------*/
static void* AllocForNAM(u32 size) static void* AllocForNAM(u32 size)
{ {
void* ptr; void* ptr;
@ -446,6 +497,12 @@ static void* AllocForNAM(u32 size)
} }
/*---------------------------------------------------------------------------*
Name: FreeForNAM
Description:
*---------------------------------------------------------------------------*/
static void FreeForNAM(void* ptr) static void FreeForNAM(void* ptr)
{ {
OS_FreeToMain(ptr); OS_FreeToMain(ptr);

View File

@ -15,39 +15,10 @@
$Author$ $Author$
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#include <twl.h> #include <twl.h>
//#include <twl/fatfs.h>
//#include <twl/nam.h>
//#include <twl/aes.h>
//#include <twl/os/common/banner.h>
#include "RepairExportSaveData.h" #include "RepairExportSaveData.h"
#include "common.h" #include "common.h"
#include "screen.h" #include "screen.h"
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
/*
typedef void* (*NAMUTAlloc)(u32 size);
typedef void (*NAMUTFree)(void* ptr);
static NAMUTAlloc spAllocFunc;
static NAMUTFree spFreeFunc;
// キー入力
static KeyInfo gKey;
*/
/*---------------------------------------------------------------------------*
Prototype
*---------------------------------------------------------------------------*/
/*
static void DrawScene(void);
static void* AllocForNAM(u32 size);
static void FreeForNAM(void* ptr);
void* MyNAMUT_Alloc(u32 size);
void MyNAMUT_Free(void* buffer);
*/
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -66,16 +37,6 @@ void TwlMain(void)
ClearScreen(); ClearScreen();
RepairSaveDataInit(); RepairSaveDataInit();
// spAllocFunc = AllocForNAM;
// spFreeFunc = FreeForNAM;
// FS_Init( FS_DMA_NOT_USE );
// NAM_Init(AllocForNAM, FreeForNAM);
// PutMainScreen( 7, 12, 0xf6, "--- Now Loading ---");
// PutSubScreen( 7, 12, 0xf6, "--- Now Loading ---");
while(TRUE) while(TRUE)
{ {
// 処理 // 処理
@ -94,69 +55,6 @@ void TwlMain(void)
} }
/*---------------------------------------------------------------------------*
Name: DrawScene
Description:
0xf0, // 黒 0xf1, // 赤 0xf2, // 緑
0xf3, // 青 0xf4, // 黄 0xf5, // ピンク
0xf6, // 水色 0xf7, // くすんだ赤 0xf8, // くすんだ緑
0xf9, // くすんだ青 0xfa, // くすんだ黄色 0xfb, // 紫
0xfc, // うすい青 0xfd, // 灰色 0xfe, // 濃い灰色
*---------------------------------------------------------------------------*/
/*
#define COMMON_COLOR ((u8)0xff)
#define PERSONALIZED_COLOR ((u8)0xfc)
#define GAME_CODE_BASE_X 1
static void DrawScene(void)
{
PutMainScreen( 10, 12, 0xf1, "--- Error ---");
PutSubScreen( 10, 12, 0xf1, "--- Error ---");
}
void* MyNAMUT_Alloc(u32 size)
{
const u32 allocSize = MATH_ROUNDUP32(size);
SDK_ASSERTMSG( spAllocFunc != NULL, "NAMUT_Init should be called previously.\n");
return spAllocFunc(allocSize);
}
static void* AllocForNAM(u32 size)
{
void* ptr;
ptr = OS_AllocFromMain(size);
if (ptr == NULL)
{
OS_Panic("alloc failed.");
}
return ptr;
}
void MyNAMUT_Free(void* buffer)
{
SDK_ASSERTMSG( spFreeFunc != NULL, "NAMUT_Init should be called previously.\n");
if (buffer)
{
spFreeFunc(buffer);
}
}
static void FreeForNAM(void* ptr)
{
OS_FreeToMain(ptr);
}
*/
void VBlankIntr(void) void VBlankIntr(void)
{ {
// テキスト表示を更新 // テキスト表示を更新