TWL領域の読み書き中も進捗表示するように

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@38 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2011-02-08 07:34:18 +00:00
parent 0ccfc904fd
commit 6af0509df7
9 changed files with 171 additions and 32 deletions

View File

@ -31,7 +31,9 @@ namespace
typedef enum BackupState typedef enum BackupState
{ {
STARTUP, // 初期値 STARTUP, // 初期値
IN_PROGRESS, // 吸出し中 EXPORT_TWL_SOUND, // TWLサウンド領域の吸出し中
EXPORT_TWL_PHOTO, // TWL写真領域の吸出し中
EXPORT_CTR_NAND, // 吸出し中
DONE, // 吸出し完了 DONE, // 吸出し完了
FINISHED, // SDカード抜き完了 FINISHED, // SDカード抜き完了
FAIL // 失敗 FAIL // 失敗
@ -132,14 +134,54 @@ void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep,
if (nextStep && !error) if (nextStep && !error)
{ {
COMMON_LOGGER("Start Export Data\n"); COMMON_LOGGER("Start Export Data\n");
s_BackupState = IN_PROGRESS; s_BackupState = EXPORT_TWL_SOUND;
common::PlaySound(common::SOUND_CURSOR); common::PlaySound(common::SOUND_CURSOR);
} }
} }
break; break;
// TWLサウンド領域の吸出し中
case EXPORT_TWL_SOUND:
{
static bool init = true;
if(init)
{
// データを書き込む
ExportTwlSoundData();
init = false;
}
// 処理が完了した
if (IsExportFinished())
{
FinalizeExportThread();
s_BackupState = EXPORT_TWL_PHOTO;
}
}
break;
// TWL写真領域の吸出し中
case EXPORT_TWL_PHOTO:
{
static bool init = true;
if(init)
{
// データを書き込む
ExportTwlPhotoData();
init = false;
}
// 処理が完了した
if (IsExportFinished())
{
FinalizeExportThread();
s_BackupState = EXPORT_CTR_NAND;
}
}
break;
// 吸出し中 // 吸出し中
case IN_PROGRESS: case EXPORT_CTR_NAND:
{ {
continueBackup = true; continueBackup = true;
@ -208,7 +250,7 @@ void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep,
bool InProgress() bool InProgress()
{ {
return s_BackupState == IN_PROGRESS; return s_BackupState == EXPORT_CTR_NAND;
} }
bool IsBackupSucceeded() bool IsBackupSucceeded()

View File

@ -278,7 +278,7 @@ void GetSaveDataDirectoryRoot()
NN_LOG("%s\n", s_SysSaveRoot.c_str()); NN_LOG("%s\n", s_SysSaveRoot.c_str());
} }
void CreateTwlDirectory(enum common::TWL_PATHNAME path) void CreateTwlDirectory(enum common::TWL_PATH_INDEX path)
{ {
NN_ASSERT(path < common::TWL_PATHNAME_MAX); NN_ASSERT(path < common::TWL_PATHNAME_MAX);
@ -286,7 +286,7 @@ void CreateTwlDirectory(enum common::TWL_PATHNAME path)
std::wstring(common::SD_TWL_ROOTNAME_TABLE[path])).c_str()); std::wstring(common::SD_TWL_ROOTNAME_TABLE[path])).c_str());
} }
void WriteTwlData(enum common::TWL_PATHNAME path) void WriteTwlData(enum common::TWL_PATH_INDEX path)
{ {
NN_ASSERT(path < common::TWL_PATHNAME_MAX); NN_ASSERT(path < common::TWL_PATHNAME_MAX);
@ -300,6 +300,18 @@ void WriteTwlData(enum common::TWL_PATHNAME path)
size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize();
NN_LOG("AllocatableSize = %d\n", bufSize); NN_LOG("AllocatableSize = %d\n", bufSize);
u32 fileNum = 0;
u32 fileSize = 0;
common::CalculateFileNum(::std::wstring(common::NAND_TWL_ROOT_PATHNAME_WITH_SLASH_TABLE[path]), fileNum, fileSize);
nn::fs::Unmount(common::NAND_ARCHIVE_NAME);
NN_LOG("File Number = %d\n", fileNum);
NN_LOG("File Size = %d\n", fileSize);
// 進捗表示用
common::SetTotalSize(fileSize);
common::ClearFinishedSize();
void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); void* buf = common::HeapManager::GetHeap()->Allocate(bufSize);
if (buf != NULL) if (buf != NULL)
{ {
@ -321,21 +333,35 @@ void WriteTwlData(enum common::TWL_PATHNAME path)
void WriteTwlPhotoData() void WriteTwlPhotoData()
{ {
COMMON_LOGGER("Create Twl Photo Backup.\n"); COMMON_LOGGER("Export Twl Photo Data.\n");
CreateTwlDirectory(common::TWL_PHOTO); CreateTwlDirectory(common::TWL_PHOTO);
WriteTwlData(common::TWL_PHOTO); WriteTwlData(common::TWL_PHOTO);
} }
void WriteTwlSoundData() void WriteTwlSoundData()
{ {
COMMON_LOGGER("Create Twl Sound Backup.\n"); COMMON_LOGGER("Export Twl Sound Data.\n");
CreateTwlDirectory(common::TWL_SOUND); CreateTwlDirectory(common::TWL_SOUND);
WriteTwlData(common::TWL_SOUND); WriteTwlData(common::TWL_SOUND);
} }
void ExportTwlPhotoData()
{
s_ExportThread.Start(WriteTwlPhotoData, s_ExportThreadStack);
}
void ExportTwlSoundData()
{
// 不要なデータを削除する
DeleteTrash();
s_ExportThread.Start(WriteTwlSoundData, s_ExportThreadStack);
}
void WriteMcuRtcData() void WriteMcuRtcData()
{ {
COMMON_LOGGER("Create RTC Backup.\n"); COMMON_LOGGER("Export RTC Data.\n");
nn::Result result; nn::Result result;
nn::Handle handle = GetMcuHandle(); nn::Handle handle = GetMcuHandle();
@ -404,6 +430,7 @@ nn::Result WriteSaveData()
NN_LOG("File Size = %d\n", fileSize); NN_LOG("File Size = %d\n", fileSize);
// 進捗表示用 // 進捗表示用
common::SetTotalSize(fileSize); common::SetTotalSize(fileSize);
common::ClearFinishedSize();
::std::mbstowcs(s_RootName, s_SysSaveRoot.c_str(), s_SysSaveRoot.size() + 1); ::std::mbstowcs(s_RootName, s_SysSaveRoot.c_str(), s_SysSaveRoot.size() + 1);
@ -445,9 +472,6 @@ void ExportData()
if (init) if (init)
{ {
// 不要なデータを削除する
DeleteTrash();
// 国データと言語データをSDに書き込む // 国データと言語データをSDに書き込む
WriteCountryLanguageData(); WriteCountryLanguageData();
@ -463,12 +487,6 @@ void ExportData()
// IVSからセーブデータディレクトリ名を計算 // IVSからセーブデータディレクトリ名を計算
GetSaveDataDirectoryRoot(); GetSaveDataDirectoryRoot();
// TWL写真領域のデータをSDに書き出す
WriteTwlPhotoData();
// TWLサウンド領域のデータをSDに書き出す
WriteTwlSoundData();
// プレイ履歴をSDに書き出す // プレイ履歴をSDに書き出す
//WritePlayHistory(); //WritePlayHistory();

View File

@ -21,7 +21,8 @@
namespace ConsoleBackup namespace ConsoleBackup
{ {
void ExportTwlPhotoData();
void ExportTwlSoundData();
void ExportData(); void ExportData();
u32 GetProgress(); u32 GetProgress();

View File

@ -40,6 +40,8 @@ typedef enum RestoreState
SERIAL_IS_NOT_IN_SD, // シリアルナンバーファイルがSDカードにないことを表示 SERIAL_IS_NOT_IN_SD, // シリアルナンバーファイルがSDカードにないことを表示
SERIAL_IN_SD, // シリアルナンバーの情報を表示 SERIAL_IN_SD, // シリアルナンバーの情報を表示
UPDATE_IN_PROGRESS, // アップデート中 UPDATE_IN_PROGRESS, // アップデート中
RESTORE_TWL_SOUND, // TWLサウンドの書き込み中
RESTORE_TWL_PHOTO, // TWL写真の書き込み中
RESTORE_IN_PROGRESS, // 書き込み中 RESTORE_IN_PROGRESS, // 書き込み中
POST_RESTORE, // 書き込み後の処理 POST_RESTORE, // 書き込み後の処理
RESTORE_DONE, // 書き込み完了 RESTORE_DONE, // 書き込み完了
@ -320,7 +322,7 @@ void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep,
else else
{ {
COMMON_LOGGER("Start Import Data\n"); COMMON_LOGGER("Start Import Data\n");
s_RestoreState = RESTORE_IN_PROGRESS; s_RestoreState = RESTORE_TWL_SOUND;
PlaySound(SOUND_CURSOR); PlaySound(SOUND_CURSOR);
} }
} }
@ -342,7 +344,7 @@ void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep,
if (nextStep) if (nextStep)
{ {
s_RestoreState = RESTORE_IN_PROGRESS; s_RestoreState = RESTORE_TWL_SOUND;
} }
} }
break; break;
@ -416,6 +418,47 @@ void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep,
} }
break; break;
// TWLサウンド領域の書き込み中
case RESTORE_TWL_SOUND:
{
static bool init = true;
if (init)
{
// データを書き込む
ImportTwlSoundData();
init = false;
}
// 処理が完了した
if (IsImportFinished())
{
FinalizeImportThread();
s_RestoreState = RESTORE_TWL_PHOTO;
}
}
break;
// TWL写真領域の書き込み
case RESTORE_TWL_PHOTO:
{
static bool init = true;
if (init)
{
// データを書き込む
ImportTwlPhotoData();
init = false;
}
// 処理が完了した
if (IsImportFinished())
{
FinalizeImportThread();
s_RestoreState = RESTORE_IN_PROGRESS;
}
}
break;
// 書き込み中 // 書き込み中
case RESTORE_IN_PROGRESS: case RESTORE_IN_PROGRESS:
{ {

View File

@ -591,6 +591,7 @@ void ImportSaveData()
// ファイルサイズ設定 // ファイルサイズ設定
common::SetTotalSize(fileSize); common::SetTotalSize(fileSize);
common::ClearFinishedSize();
NN_LOG("File Number = %d\n", fileNum); NN_LOG("File Number = %d\n", fileNum);
NN_LOG("File Size = %d\n", fileSize); NN_LOG("File Size = %d\n", fileSize);
@ -679,6 +680,12 @@ void DeleteConsoleInitializedFile()
common::SdMountManager::Unmount(); common::SdMountManager::Unmount();
} }
void FinalizeImportThread()
{
s_ImportThread.Join();
s_ImportThread.Finalize();
}
bool IsImportFinished() bool IsImportFinished()
{ {
return !s_ImportThread.IsAlive(); return !s_ImportThread.IsAlive();
@ -1098,7 +1105,7 @@ CheckedNetworkSetting* GetTempNetworkSetting()
return &s_CurrentNetowrkSetting1; return &s_CurrentNetowrkSetting1;
} }
void ImportTwlData(enum common::TWL_PATHNAME path) void ImportTwlData(enum common::TWL_PATH_INDEX path)
{ {
NN_ASSERT(path < common::TWL_PATHNAME_MAX); NN_ASSERT(path < common::TWL_PATHNAME_MAX);
@ -1112,6 +1119,20 @@ void ImportTwlData(enum common::TWL_PATHNAME path)
size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize();
NN_LOG("AllocatableSize = %d\n", bufSize); NN_LOG("AllocatableSize = %d\n", bufSize);
u32 fileNum = 0;
u32 fileSize = 0;
common::CalculateFileNum(::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + ::std::wstring(
common::SD_TWL_ROOTNAME_TABLE[path]), fileNum, fileSize);
// ファイルサイズ設定
common::SetTotalSize(fileSize);
common::ClearFinishedSize();
NN_LOG("File Number = %d\n", fileNum);
NN_LOG("File Size = %d\n", fileSize);
void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); void* buf = common::HeapManager::GetHeap()->Allocate(bufSize);
if (buf != NULL) if (buf != NULL)
{ {
@ -1119,7 +1140,7 @@ void ImportTwlData(enum common::TWL_PATHNAME path)
::std::mbstowcs(archiveName, common::TWL_ARCHIVE_NAME_TABLE[path], std::strlen(common::TWL_ARCHIVE_NAME_TABLE[path]) + 1); ::std::mbstowcs(archiveName, common::TWL_ARCHIVE_NAME_TABLE[path], std::strlen(common::TWL_ARCHIVE_NAME_TABLE[path]) + 1);
std::wstring archiveString(archiveName); std::wstring archiveString(archiveName);
common::CopyDirectory( common::CopyDirectory(
(common::SDMC_ROOT_DIRECTORY_PATH + ::std::wstring(common::SD_TWL_ROOTNAME_TABLE[path])).c_str(), (::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + ::std::wstring(common::SD_TWL_ROOTNAME_TABLE[path])).c_str(),
(archiveString + ::std::wstring(L"/")).c_str(), (archiveString + ::std::wstring(L"/")).c_str(),
buf, bufSize); buf, bufSize);
@ -1131,18 +1152,29 @@ void ImportTwlData(enum common::TWL_PATHNAME path)
} }
void ImportTwlPhotoData() void ImportTwlPhotoDataFunc()
{ {
COMMON_LOGGER("Import Twl Photo Data.\n"); COMMON_LOGGER("Import Twl Photo Data.\n");
ImportTwlData(common::TWL_PHOTO); ImportTwlData(common::TWL_PHOTO);
} }
void ImportTwlSoundData() void ImportTwlSoundDataFunc()
{ {
COMMON_LOGGER("Import Twl Sound Data.\n"); COMMON_LOGGER("Import Twl Sound Data.\n");
ImportTwlData(common::TWL_SOUND); ImportTwlData(common::TWL_SOUND);
} }
void ImportTwlPhotoData()
{
s_ImportThread.Start(ImportTwlPhotoDataFunc, s_ImportThreadStack);
}
void ImportTwlSoundData()
{
s_ImportThread.Start(ImportTwlSoundDataFunc, s_ImportThreadStack);
}
void ClearFileReadResult() void ClearFileReadResult()
{ {
s_CheckedEqualsIVSFileandIVS = false; s_CheckedEqualsIVSFileandIVS = false;
@ -1252,12 +1284,6 @@ void ImportData()
// NORデータを書き込む // NORデータを書き込む
ImportNorData(); ImportNorData();
// TWL写真領域のデータをNANDに書き込む
ImportTwlPhotoData();
// TWLサウンド領域のデータをNANDに書き込む
ImportTwlSoundData();
// タッチパネルキャリブレーションデータをSDカードに出力する // タッチパネルキャリブレーションデータをSDカードに出力する
// 本体初期化後はcal値が設定されている // 本体初期化後はcal値が設定されている
ExportTouchPanelCfgData(); ExportTouchPanelCfgData();

View File

@ -26,7 +26,10 @@ namespace ConsoleRestore
bool EqualsIVSFileandIVS(); bool EqualsIVSFileandIVS();
u8* ReadSerialNumber(); u8* ReadSerialNumber();
void FinalizeImportThread();
bool IsImportFinished(); bool IsImportFinished();
void ImportTwlSoundData();
void ImportTwlPhotoData();
void ImportData(); void ImportData();
void CreateWriteFinishedFile(); void CreateWriteFinishedFile();
void CreateUpdateFinishedFile(); void CreateUpdateFinishedFile();

View File

@ -52,7 +52,7 @@ const wchar_t* const PLAYHISTORY_PATHNAME = L"sdmc:/CTR_Console_Repair/playhisto
const wchar_t* const PLAYHISTORY_COUNT_PATHNAME = L"sdmc:/CTR_Console_Repair/playhistoryCount.bin"; const wchar_t* const PLAYHISTORY_COUNT_PATHNAME = L"sdmc:/CTR_Console_Repair/playhistoryCount.bin";
const wchar_t* const TOUCH_PANEL_CALIBRATION_PATHNAME = L"sdmc:/CTR_Console_Repair/tpCalibration.bin"; const wchar_t* const TOUCH_PANEL_CALIBRATION_PATHNAME = L"sdmc:/CTR_Console_Repair/tpCalibration.bin";
enum TWL_PATHNAME enum TWL_PATH_INDEX
{ {
TWL_PHOTO = 0, TWL_PHOTO = 0,
TWL_SOUND, TWL_SOUND,

View File

@ -245,4 +245,9 @@ void SetTotalSize(u64 size)
s_TotalFileSize = size; s_TotalFileSize = size;
} }
void ClearFinishedSize()
{
s_FinishedFileSize = 0;
}
} }

View File

@ -27,6 +27,7 @@ nn::Result CalculateFileNum(std::wstring currentDirectory, u32& fileNum, u32& fi
bool CopyDirectory(const wchar_t * from_path, const wchar_t * to_path, void* buf, const size_t bufSize); bool CopyDirectory(const wchar_t * from_path, const wchar_t * to_path, void* buf, const size_t bufSize);
u32 GetProgress(); u32 GetProgress();
void SetTotalSize(u64 size); void SetTotalSize(u64 size);
void ClearFinishedSize();
} }