From a59330463e56b8c4db0292e7b40883f33da3d7ce Mon Sep 17 00:00:00 2001 From: "fix94.1" Date: Wed, 14 Aug 2013 19:11:38 +0000 Subject: [PATCH] -added progress bar to the wad installer -updated the gc game installer progress bar --- source/loader/gc_disc_dump.cpp | 3 +- source/menu/menu.cpp | 7 +++ source/menu/menu.hpp | 14 ++++- source/menu/menu_wad.cpp | 95 ++++++++++++++++++++++++++++++---- source/menu/menu_wbfs.cpp | 24 ++------- 5 files changed, 113 insertions(+), 30 deletions(-) diff --git a/source/loader/gc_disc_dump.cpp b/source/loader/gc_disc_dump.cpp index 8f1539fb..6085ff78 100644 --- a/source/loader/gc_disc_dump.cpp +++ b/source/loader/gc_disc_dump.cpp @@ -161,7 +161,7 @@ s32 GCDump::__DiscWriteFile(FILE *f, u64 offset, u32 length, u8 *ReadBuffer) offset += toread; length -= toread; gc_done += toread; - mainMenu.GC_Refresh(gc_done/1024, DiscSizeCalculated); + mainMenu.update_pThread(toread); } return wrote; } @@ -666,6 +666,7 @@ s32 GCDump::CheckSpace(u32 *needed, bool comp) gamedone = true; } MEM2_free(ReadBuffer); + mainMenu.m_thrdTotal = size; DiscSizeCalculated = size/0x400; *needed = (size/0x8000) >> 2; gprintf("Free space needed: %d Mb (%d blocks)\n", size/0x100000, (size/0x8000) >> 2); diff --git a/source/menu/menu.cpp b/source/menu/menu.cpp index f4a4743f..b069d68c 100644 --- a/source/menu/menu.cpp +++ b/source/menu/menu.cpp @@ -135,6 +135,13 @@ CMenu::CMenu() m_file = NULL; m_buffer = NULL; m_filesize = 0; + /* thread stuff */ + m_thrdPtr = LWP_THREAD_NULL; + m_thrdInstalling = false; + m_thrdUpdated = false; + m_thrdDone = false; + m_thrdWritten = 0; + m_thrdTotal = 0; } void CMenu::init() diff --git a/source/menu/menu.hpp b/source/menu/menu.hpp index 16a7cfc8..626a602e 100644 --- a/source/menu/menu.hpp +++ b/source/menu/menu.hpp @@ -1069,9 +1069,21 @@ private: public: void _hideWaitMessage(); bool m_Emulator_boot; - void GC_Refresh(int status, int total); void GC_Messenger(int message, int info, char *cinfo); + + /* general thread updating stuff */ + u64 m_thrdTotal; + void update_pThread(u64 added); private: + static int _pThread(void *obj); + void _start_pThread(void); + void _stop_pThread(void); + lwp_t m_thrdPtr; + volatile bool m_thrdInstalling; + volatile bool m_thrdUpdated; + volatile bool m_thrdDone; + vu64 m_thrdWritten; + GuiSound *_sound(CMenu::SoundSet &soundSet, const char *domain, const char *key, const u8 * snd, u32 len, const char *name, bool isAllocated); GuiSound *_sound(CMenu::SoundSet &soundSet, const char *domain, const char *key, const char *name); u16 _textStyle(const char *domain, const char *key, u16 def); diff --git a/source/menu/menu_wad.cpp b/source/menu/menu_wad.cpp index 10372cdf..254fe6ab 100644 --- a/source/menu/menu_wad.cpp +++ b/source/menu/menu_wad.cpp @@ -76,8 +76,8 @@ int installWad(const char *path) fread(&hdr, sizeof(hdr), 1, wad_file); skip_align(wad_file, sizeof(hdr)); - if(size < (hdr.certs_len + hdr.crl_len + hdr.tik_len + hdr.tmd_len + hdr.data_len + hdr.footer_len) - || hdr.tik_len == 0 || hdr.tmd_len == 0 || hdr.data_len == 0) + mainMenu.m_thrdTotal = (hdr.certs_len + hdr.crl_len + hdr.tik_len + hdr.tmd_len + hdr.data_len + hdr.footer_len); + if(size < mainMenu.m_thrdTotal || hdr.tik_len == 0 || hdr.tmd_len == 0 || hdr.data_len == 0) { fclose(wad_file); return -3; @@ -234,6 +234,7 @@ int installWad(const char *path) ISFS_Write(fd, decBuf, size_dec); /* dont forget to increase the read size */ read += size_enc; + mainMenu.update_pThread(size_enc); } sha1 app_sha1; SHA1Final(app_sha1, &ctx); @@ -344,6 +345,75 @@ int getTID(const char *path, u64 *tid) return 0; } +int CMenu::_pThread(void *obj) +{ + CMenu *m = (CMenu*)obj; + while(m->m_thrdInstalling) + { + m->_mainLoopCommon(); + if(m->m_thrdUpdated) + { + m->m_thrdUpdated = false; + m->_addDiscProgress(m->m_thrdWritten, m->m_thrdTotal, obj); + m->m_thrdDone = true; + } + if(m->m_thrdMessageAdded) + { + m->m_thrdMessageAdded = false; + if(!m->m_thrdMessage.empty()) + m_btnMgr.setText(m->m_wbfsLblDialog, m->m_thrdMessage); + if(m->m_thrdProgress > 0.f) + { + m_btnMgr.setText(m->m_wbfsLblMessage, wfmt(L"%i%%", (int)(m->m_thrdProgress * 100.f))); + m_btnMgr.setProgress(m->m_wbfsPBar, m->m_thrdProgress); + } + } + } + m->m_thrdWorking = false; + return 0; +} + +void CMenu::_start_pThread(void) +{ + m_thrdPtr = LWP_THREAD_NULL; + m_thrdWorking = true; + m_thrdMessageAdded = false; + m_thrdInstalling = true; + m_thrdUpdated = false; + m_thrdDone = true; + m_thrdProgress = 0.f; + m_thrdWritten = 0; + m_thrdTotal = 0; + LWP_CreateThread(&m_thrdPtr, (void *(*)(void *))_pThread, (void*)this, 0, 8 * 1024, 64); +} + +void CMenu::_stop_pThread(void) +{ + if(m_thrdPtr == LWP_THREAD_NULL) + return; + + if(LWP_ThreadIsSuspended(m_thrdPtr)) + LWP_ResumeThread(m_thrdPtr); + m_thrdInstalling = false; + while(m_thrdWorking) + usleep(50); + LWP_JoinThread(m_thrdPtr, NULL); + m_thrdPtr = LWP_THREAD_NULL; + + m_btnMgr.setProgress(m_wbfsPBar, 1.f); + m_btnMgr.setText(m_wbfsLblMessage, L"100%"); +} + +void CMenu::update_pThread(u64 added) +{ + if(m_thrdDone) + { + m_thrdDone = false; + m_thrdWritten += added; + m_thrdUpdated = true; + } +} + void CMenu::_Wad(const char *wad_path) { if(wad_path == NULL) @@ -383,22 +453,27 @@ void CMenu::_Wad(const char *wad_path) if(m_btnMgr.selected(m_wadBtnInstall)) { _hideWad(true); - m_btnMgr.setText(m_wbfsLblMessage, _t("wad4", L"Installing WAD, please wait...")); - m_btnMgr.show(m_wbfsLblMessage, true); - /* who cares about making a thread, just refresh a second */ - for(u8 i = 0; i < 60; ++i) - _mainLoopCommon(); + m_btnMgr.setProgress(m_wbfsPBar, 0.f); + m_btnMgr.setText(m_wbfsLblMessage, L""); + m_btnMgr.setText(m_wbfsLblDialog, L""); + m_btnMgr.show(m_wbfsPBar); + m_btnMgr.show(m_wbfsLblMessage); + m_btnMgr.show(m_wbfsLblDialog); /* mios is real nand, chans are emu */ if(mios == false) { const char *emu_char = m_cfg.getString(CHANNEL_DOMAIN, "path", "/").c_str(); NandHandle.SetPaths(emu_char, DeviceName[currentPartition]); } + _start_pThread(); + m_thrdMessage = _t("wad4", L"Installing WAD, please wait..."); + m_thrdMessageAdded = true; int result = installWad(wad_path); + _stop_pThread(); if(result < 0) - m_btnMgr.setText(m_wbfsLblMessage, wfmt(_fmt("wad5", L"Installation error %i!"), result)); + m_btnMgr.setText(m_wbfsLblDialog, wfmt(_fmt("wad5", L"Installation error %i!"), result)); else - m_btnMgr.setText(m_wbfsLblMessage, wfmt(_fmt("wad6", L"Installation finished with %i hash fails."), result)); + m_btnMgr.setText(m_wbfsLblDialog, wfmt(_fmt("wad6", L"Installation finished with %i hash fails."), result)); } else if((m_btnMgr.selected(m_configBtnPartitionP) || m_btnMgr.selected(m_configBtnPartitionM))) { @@ -413,6 +488,8 @@ void CMenu::_Wad(const char *wad_path) _hideWad(); /* onscreen message might be onscreen still */ m_btnMgr.hide(m_wbfsLblMessage); + m_btnMgr.hide(m_wbfsLblDialog); + m_btnMgr.hide(m_wbfsPBar); } void CMenu::_initWad() diff --git a/source/menu/menu_wbfs.cpp b/source/menu/menu_wbfs.cpp index 12ac7842..868c760c 100644 --- a/source/menu/menu_wbfs.cpp +++ b/source/menu/menu_wbfs.cpp @@ -111,10 +111,7 @@ void CMenu::GC_Messenger(int message, int info, char *cinfo) m_thrdMessage = _t("wbfsop25", L"Disc read error!! Please clean the disc"); else if(message == 11) m_thrdMessage = _t("wbfsop26", L"Disc ejected!! Please insert disc again"); - - if(!m_thrdMessage.empty()) - m_btnMgr.setText(m_wbfsLblDialog, m_thrdMessage); - _mainLoopCommon(); + m_thrdMessageAdded = true; } int CMenu::_gameInstaller(void *obj) @@ -364,14 +361,16 @@ bool CMenu::_wbfsOp(CMenu::WBFS_OP op) break; } strncpy(cfPos, GameID, 6); - m_btnMgr.setText(m_wbfsLblDialog, wfmt(_fmt("wbfsop6", L"Installing [%s] %s..."), GameID, gc_hdr.title)); done = true; upd_dml = true; m_thrdWorking = true; m_thrdProgress = 0.f; - m_thrdMessageAdded = false; //LWP_CreateThread(&thread, (void *(*)(void *))_GCgameInstaller, (void *)this, 0, 8 * 1024, 64); + _start_pThread(); + m_thrdMessage = wfmt(_fmt("wbfsop6", L"Installing [%s] %s..."), GameID, gc_hdr.title); + m_thrdMessageAdded = true; _GCgameInstaller(); + _stop_pThread(); } else { @@ -535,16 +534,3 @@ void CMenu::_textWBFS(void) { m_btnMgr.setText(m_wbfsBtnGo, _t("wbfsop5", L"Go")); } - -void CMenu::GC_Refresh(int status, int total) -{ - m_progress = (float)status / (float)total; - // Don't synchronize too often - if(m_progress - m_thrdProgress >= 0.01f) - { - m_thrdProgress = m_progress; - m_btnMgr.setProgress(m_wbfsPBar, m_thrdProgress); - m_btnMgr.setText(m_wbfsLblMessage, wfmt(L"%i%%", (int)(m_thrdProgress * 100.f))); - _mainLoopCommon(); - } -}