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

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

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

View File

@ -15,39 +15,10 @@
$Author$
*---------------------------------------------------------------------------*/
#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 "common.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();
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)
{
// 処理
@ -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)
{
// テキスト表示を更新