From 79a7fd9017aca7ee4a1e21459d0932fdc973c4d7 Mon Sep 17 00:00:00 2001
From: dimok321 <15055714+dimok789@users.noreply.github.com>
Date: Sun, 5 Jul 2009 20:22:29 +0000
Subject: [PATCH] *Changed whole GameInstall ProgressWindow behaviour This
should fix the weird freezes and crashes while installing. The
ProgressWindow is now in its own thread and updates the values fast again.
*Added Speed to InstallProgressWindow
Lets see who got the fastest WiiDiskDrive :P (i got up to 5.8MB/s)
---
gui.pnproj | 2 +-
source/libwbfs/libwbfs.c | 16 +-
source/main.cpp | 53 ++---
source/menu.cpp | 44 ++--
source/prompts/ProgressWindow.cpp | 380 ++++++++++++++++++++++++++++++
source/prompts/ProgressWindow.h | 22 ++
source/prompts/PromptWindows.cpp | 196 +--------------
source/prompts/PromptWindows.h | 1 -
source/usbloader/wbfs.c | 53 +----
source/usbloader/wbfs.h | 2 +-
10 files changed, 472 insertions(+), 297 deletions(-)
create mode 100644 source/prompts/ProgressWindow.cpp
create mode 100644 source/prompts/ProgressWindow.h
diff --git a/gui.pnproj b/gui.pnproj
index 572401d6..df4eb19b 100644
--- a/gui.pnproj
+++ b/gui.pnproj
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/source/libwbfs/libwbfs.c b/source/libwbfs/libwbfs.c
index b891c3b5..cd1c5a9a 100644
--- a/source/libwbfs/libwbfs.c
+++ b/source/libwbfs/libwbfs.c
@@ -4,7 +4,6 @@
#include "libwbfs.h"
-#include
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
@@ -406,8 +405,6 @@ u32 wbfs_add_disc(wbfs_t*p,read_wiidisc_callback_t read_src_wii_disc,
wbfs_disc_info_t *info = 0;
u8* copy_buffer = 0;
used = wbfs_malloc(p->n_wii_sec_per_disc);
- time_t last_time = 0;
- time_t time_now = 0;
if(!used)
ERROR("unable to alloc memory");
if(!copy_1_1)
@@ -464,17 +461,8 @@ u32 wbfs_add_disc(wbfs_t*p,read_wiidisc_callback_t read_src_wii_disc,
p->write_hdsector(p->callback_data,p->part_lba+bl*(p->wbfs_sec_sz/p->hd_sec_sz)+j*(p->wii_sec_sz/p->hd_sec_sz),
p->wii_sec_sz/p->hd_sec_sz,copy_buffer);
cur++;
- }
- if(spinner) {
- if(last_time == 0)
- time(&last_time);
-
- time(&time_now);
- /* Update that crap only every 0.5 secs */
- if (difftime(time_now,last_time) > 0.5) {
- spinner(cur,tot);
- last_time = 0;
- }
+ if(spinner)
+ spinner(cur,tot);
}
}
info->wlba_table[i] = wbfs_htons(bl);
diff --git a/source/main.cpp b/source/main.cpp
index c48cd718..a5ad8b1e 100644
--- a/source/main.cpp
+++ b/source/main.cpp
@@ -33,6 +33,8 @@
#include "wpad.h"
#include "fat.h"
+//#define SPECIAL_FOR_ARDI // Fix Problem with Trekstor Classic 250GB
+
/* Constants */
#define CONSOLE_XCOORD 260
#define CONSOLE_YCOORD 115
@@ -46,7 +48,22 @@ int
main(int argc, char *argv[])
{
s32 ret2;
+ u8 preloaded_ios = 0;
+#ifdef SPECIAL_FOR_ARDI
+ if( (ret2 = IOS_ReloadIOS(249)) >=0 )
+ preloaded_ios = 249;
+ else
+ {
+ if( (ret2 = IOS_ReloadIOS(222)) >=0 )
+ {
+ load_ehc_module();
+ preloaded_ios = 222;
+ }
+ }
+#endif
+ SDCard_Init(); // mount SD for loading cfg's
+ USBDevice_Init(); // and mount USB:/
bool bootDevice_found=false;
if(argc >= 1)
{
@@ -66,49 +83,33 @@ main(int argc, char *argv[])
strcpy(bootDevice, "USB:");
}
- ret2 = IOS_ReloadIOS(249);
- if(ret2 < 0) {
- ret2 = IOS_ReloadIOS(222);
- load_ehc_module();
- }
-
- SDCard_Init(); // mount SD for loading cfg's
- USBDevice_Init(); // and mount USB:/
-
gettextCleanUp();
+ //lang_default();
CFG_Load();
+ SDCard_deInit();// unmount SD for reloading IOS
+ USBDevice_deInit();// unmount USB for reloading IOS
+
/* Load Custom IOS */
- if(Settings.cios == ios222 && IOS_GetVersion() != 222) {
- SDCard_deInit();// unmount SD for reloading IOS
- USBDevice_deInit();// unmount USB for reloading IOS
+ if(Settings.cios == ios222 && preloaded_ios != 222) {
ret2 = IOS_ReloadIOS(222);
load_ehc_module();
if (ret2 < 0) {
Settings.cios = ios249;
ret2 = IOS_ReloadIOS(249);
}
- SDCard_Init(); // now mount SD:/
- USBDevice_Init(); // and mount USB:/
- } else if(Settings.cios == ios249 && IOS_GetVersion() != 249) {
- SDCard_deInit();// unmount SD for reloading IOS
- USBDevice_deInit();// unmount USB for reloading IOS
+ } else if(preloaded_ios != 249) {
ret2 = IOS_ReloadIOS(249);
- if(ret2 < 0) {
- Settings.cios = ios222;
- ret2 = IOS_ReloadIOS(222);
- load_ehc_module();
- }
- SDCard_Init(); // now mount SD:/
- USBDevice_Init(); // and mount USB:/
}
if (ret2 < 0) {
printf("ERROR: cIOS could not be loaded!");
- sleep(5);
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
}
+ SDCard_Init(); // now mount SD:/
+ USBDevice_Init(); // and mount USB:/
+
Sys_Init();
/** PAD_Init has to be before InitVideo don't move that **/
@@ -137,5 +138,3 @@ main(int argc, char *argv[])
MainMenu(MENU_CHECK);
return 0;
}
-
-
diff --git a/source/menu.cpp b/source/menu.cpp
index 9d546a7d..e6f78d94 100644
--- a/source/menu.cpp
+++ b/source/menu.cpp
@@ -23,6 +23,7 @@
#include "language/gettext.h"
#include "settings/Settings.h"
#include "prompts/PromptWindows.h"
+#include "prompts/ProgressWindow.h"
#include "prompts/gameinfo.h"
#include "mload/mload.h"
#include "patches/patchcode.h"
@@ -38,7 +39,6 @@
#include "fatmounter.h"
#define MAX_CHARACTERS 38
-#define GB_SIZE 1073741824.0
/*** Variables that are also used extern ***/
GuiWindow * mainWindow = NULL;
@@ -108,8 +108,7 @@ HaltGui()
*
* Primary thread to allow GUI to respond to state changes, and draws GUI
***************************************************************************/
-static void *
-UpdateGUI (void *arg)
+static void * UpdateGUI (void *arg)
{
while(1)
{
@@ -193,7 +192,9 @@ UpdateGUI (void *arg)
void InitGUIThreads()
{
LWP_CreateThread(&guithread, UpdateGUI, NULL, NULL, 0, 70);
+ InitProgressThread();
}
+
void ExitGUIThreads()
{
ExitRequested = 1;
@@ -1239,8 +1240,7 @@ static int MenuInstall()
Disc_SetUSB(NULL);
int ret, choice = 0;
- char *name;
- static char buffer[MAX_CHARACTERS + 4];
+ char name[200];
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, Settings.sfxvolume);
@@ -1290,16 +1290,7 @@ static int MenuInstall()
}
Disc_ReadHeader(&headerdisc);
- name = headerdisc.title;
- if (strlen(name) < (MAX_CHARACTERS + 3)) {
- memset(buffer, 0, sizeof(buffer));
- sprintf(name, "%s", name);
- } else {
- strncpy(buffer, name, MAX_CHARACTERS);
- buffer[MAX_CHARACTERS] = '\0';
- strncat(buffer, "...", 3);
- sprintf(name, "%s", buffer);
- }
+ snprintf(name, sizeof(name), "%s", headerdisc.title);
ret = WBFS_CheckGame(headerdisc.id);
if (ret) {
@@ -1311,7 +1302,8 @@ static int MenuInstall()
f32 freespace, used;
WBFS_DiskSpace(&used, &freespace);
- gamesize = WBFS_EstimeGameSize()/GB_SIZE;
+ gamesize = WBFS_EstimeGameSize()/GBSIZE;
+
char gametxt[50];
sprintf(gametxt, "%s : %.2fGB", name, gamesize);
@@ -1328,7 +1320,11 @@ static int MenuInstall()
sprintf(errortxt, "%s: %.2fGB, %s: %.2fGB",tr("Game Size"), gamesize, tr("Free Space"), freespace);
choice = WindowPrompt(tr("Not enough free space!"),errortxt,tr("OK"), tr("Return"));
if (choice == 1) {
- ret = ProgressWindow(gametxt, name);
+ USBStorage_Watchdog(0);
+ SetupGameInstallProgress(gametxt, name);
+ ret = WBFS_AddGame();
+ ProgressStop();
+ USBStorage_Watchdog(1);
wiilight(0);
if (ret != 0) {
WindowPrompt (tr("Install Error!"),0,tr("Back"));
@@ -1348,10 +1344,14 @@ static int MenuInstall()
}
else {
- ret = ProgressWindow(gametxt, name);
+ USBStorage_Watchdog(0);
+ SetupGameInstallProgress(gametxt, name);
+ ret = WBFS_AddGame();
+ ProgressStop();
+ USBStorage_Watchdog(1);
wiilight(0);
if (ret != 0) {
- WindowPrompt (tr("Install Error!"),0,tr("Back"));
+ WindowPrompt(tr("Install Error!"),0,tr("Back"));
menu = MENU_DISCLIST;
break;
} else {
@@ -1383,8 +1383,6 @@ static int MenuInstall()
mainWindow->Remove(&w);
ResumeGui();
-/// SDCard_deInit();
-/// SDCard_Init();
return menu;
}
/****************************************************************************
@@ -1412,7 +1410,7 @@ static int MenuFormat()
partitionEntry *entry = &partitions[cnt];
/* Calculate size in gigabytes */
- f32 size = entry->size * (sector_size / GB_SIZE);
+ f32 size = entry->size * (sector_size / GBSIZE);
if (size) {
sprintf(options.name[cnt], "%s %d:",tr("Partition"), cnt+1);
@@ -1481,7 +1479,7 @@ static int MenuFormat()
if (cnt == selected) {
partitionEntry *entry = &partitions[selected];
if (entry->size) {
- sprintf(text, "%s %d : %.2fGB",tr("Partition"), selected+1, entry->size * (sector_size / GB_SIZE));
+ sprintf(text, "%s %d : %.2fGB",tr("Partition"), selected+1, entry->size * (sector_size / GBSIZE));
choice = WindowPrompt(
tr("Do you want to format:"),
text,
diff --git a/source/prompts/ProgressWindow.cpp b/source/prompts/ProgressWindow.cpp
new file mode 100644
index 00000000..170dbb3a
--- /dev/null
+++ b/source/prompts/ProgressWindow.cpp
@@ -0,0 +1,380 @@
+/****************************************************************************
+ * ProgressWindow
+ * USB Loader GX 2009
+ *
+ * ProgressWindow.cpp
+ ***************************************************************************/
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "menu.h"
+#include "language/gettext.h"
+#include "libwiigui/gui.h"
+#include "prompts/PromptWindows.h"
+#include "usbloader/wbfs.h"
+
+/*** Variables used only in this file ***/
+static lwp_t progressthread = LWP_THREAD_NULL;
+static char progressTitle[100];
+static char progressMsg1[150];
+static char progressMsg2[150];
+static char progressTime[80];
+static char progressSizeLeft[80];
+static int showProgress = 0;
+static f32 progressDone = 0.0;
+static bool showTime = false;
+static bool showSize = false;
+static s32 gameinstalldone = 0;
+static s32 gameinstalltotal = -1;
+static time_t start;
+
+/*** Extern variables ***/
+extern GuiWindow * mainWindow;
+extern float gamesize;
+
+/*** Extern functions ***/
+extern void ResumeGui();
+extern void HaltGui();
+
+
+/****************************************************************************
+ * GameInstallProgress
+ * GameInstallValue updating function
+***************************************************************************/
+static void GameInstallProgress() {
+
+ if(gameinstalltotal <= 0)
+ return;
+
+ GetProgressValue(&gameinstalldone, &gameinstalltotal);
+
+ if(gameinstalldone > gameinstalltotal)
+ gameinstalldone = gameinstalltotal;
+
+ static u32 expected = 300;
+
+ u32 elapsed, h, m, s;
+ f32 speed = 0;
+
+ //Elapsed time
+ elapsed = time(0) - start;
+
+ //Calculate speed in MB/s
+ if(elapsed > 0)
+ speed = KBSIZE * gamesize * gameinstalldone/(gameinstalltotal*elapsed);
+
+ if (gameinstalldone != gameinstalltotal) {
+ //Expected time
+ if (elapsed)
+ expected = (expected * 3 + elapsed * gameinstalltotal / gameinstalldone) / 4;
+
+ //Remaining time
+ elapsed = (expected > elapsed) ? (expected - elapsed) : 0;
+ }
+
+ //Calculate time values
+ h = elapsed / 3600;
+ m = (elapsed / 60) % 60;
+ s = elapsed % 60;
+
+ progressDone = 100.0*gameinstalldone/gameinstalltotal;
+
+ snprintf(progressTime, sizeof(progressTime), "%s %d:%02d:%02d",tr("Time left:"),h,m,s);
+ snprintf(progressSizeLeft, sizeof(progressSizeLeft), "%.2fGB/%.2fGB %.1fMB/s", gamesize * gameinstalldone/gameinstalltotal, gamesize, speed);
+}
+
+/****************************************************************************
+ * SetupGameInstallProgress
+***************************************************************************/
+void SetupGameInstallProgress(char * title, char * game) {
+
+ strncpy(progressTitle, title, sizeof(progressTitle));
+ strncpy(progressMsg1, game, sizeof(progressMsg1));
+ gameinstalltotal = 1;
+ showProgress = 1;
+ showSize = true;
+ showTime = true;
+ LWP_ResumeThread(progressthread);
+ start = time(0);
+}
+
+/****************************************************************************
+ * ProgressWindow
+ *
+ * Opens a window, which displays progress to the user. Can either display a
+ * progress bar showing % completion, or a throbber that only shows that an
+ * action is in progress.
+ ***************************************************************************/
+static void ProgressWindow(const char *title, const char *msg1, const char *msg2)
+{
+ GuiWindow promptWindow(472,320);
+ promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
+ promptWindow.SetPosition(0, -10);
+
+ char imgPath[100];
+ snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path);
+ GuiImageData btnOutline(imgPath, button_dialogue_box_png);
+ snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", CFG.theme_path);
+ GuiImageData dialogBox(imgPath, dialogue_box_png);
+
+ GuiTrigger trigA;
+ trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
+
+ GuiImage dialogBoxImg(&dialogBox);
+ if (Settings.wsprompt == yes){
+ dialogBoxImg.SetWidescreen(CFG.widescreen);
+ }
+
+ snprintf(imgPath, sizeof(imgPath), "%sprogressbar_outline.png", CFG.theme_path);
+ GuiImageData progressbarOutline(imgPath, progressbar_outline_png);
+
+ GuiImage progressbarOutlineImg(&progressbarOutline);
+ if (Settings.wsprompt == yes){
+ progressbarOutlineImg.SetWidescreen(CFG.widescreen);}
+ progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
+ progressbarOutlineImg.SetPosition(25, 40);
+
+ snprintf(imgPath, sizeof(imgPath), "%sprogressbar_empty.png", CFG.theme_path);
+ GuiImageData progressbarEmpty(imgPath, progressbar_empty_png);
+ GuiImage progressbarEmptyImg(&progressbarEmpty);
+ progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
+ progressbarEmptyImg.SetPosition(25, 40);
+ progressbarEmptyImg.SetTile(100);
+
+ snprintf(imgPath, sizeof(imgPath), "%sprogressbar.png", CFG.theme_path);
+ GuiImageData progressbar(imgPath, progressbar_png);
+ GuiImage progressbarImg(&progressbar);
+ progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
+ progressbarImg.SetPosition(25, 40);
+
+ GuiText titleTxt(title, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
+ titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
+ titleTxt.SetPosition(0,60);
+
+ GuiText msg1Txt(msg1, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
+ msg1Txt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
+ if(msg2)
+ msg1Txt.SetPosition(0,120);
+ else
+ msg1Txt.SetPosition(0,100);
+ msg1Txt.SetMaxWidth(430, GuiText::DOTTED);
+
+ GuiText msg2Txt(msg2, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
+ msg2Txt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
+ msg2Txt.SetPosition(0,125);
+ msg2Txt.SetMaxWidth(430, GuiText::DOTTED);
+
+ GuiText prsTxt("%", 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
+ prsTxt.SetAlignment(ALIGN_RIGHT, ALIGN_MIDDLE);
+ prsTxt.SetPosition(-188,40);
+
+ GuiText timeTxt(NULL, 24, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
+ timeTxt.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
+ timeTxt.SetPosition(280,-50);
+
+ GuiText sizeTxt(NULL, 24, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
+ sizeTxt.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
+ sizeTxt.SetPosition(35, -50);
+
+ GuiText prTxt(NULL, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
+ prTxt.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
+ prTxt.SetPosition(200, 40);
+
+ if ((Settings.wsprompt == yes) && (CFG.widescreen)){/////////////adjust for widescreen
+ progressbarOutlineImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
+ progressbarOutlineImg.SetPosition(0, 40);
+ progressbarEmptyImg.SetPosition(80,40);
+ progressbarEmptyImg.SetTile(78);
+ progressbarImg.SetPosition(80, 40);
+ msg1Txt.SetMaxWidth(380, GuiText::DOTTED);
+ msg2Txt.SetMaxWidth(380, GuiText::DOTTED);
+
+ timeTxt.SetPosition(250,-50);
+ timeTxt.SetFontSize(20);
+ sizeTxt.SetPosition(90, -50);
+ sizeTxt.SetFontSize(20);
+ }
+
+ usleep(400000); // wait to see if progress flag changes soon
+ if(!showProgress)
+ return;
+
+ promptWindow.Append(&dialogBoxImg);
+ promptWindow.Append(&progressbarEmptyImg);
+ promptWindow.Append(&progressbarImg);
+ promptWindow.Append(&progressbarOutlineImg);
+ promptWindow.Append(&prTxt);
+ promptWindow.Append(&prsTxt);
+ if(title)
+ promptWindow.Append(&titleTxt);
+ if(msg1)
+ promptWindow.Append(&msg1Txt);
+ if(msg2)
+ promptWindow.Append(&msg2Txt);
+ if(showTime)
+ promptWindow.Append(&timeTxt);
+ if(showSize)
+ promptWindow.Append(&sizeTxt);
+
+ HaltGui();
+ promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
+ mainWindow->SetState(STATE_DISABLED);
+ mainWindow->Append(&promptWindow);
+ mainWindow->ChangeFocus(&promptWindow);
+ ResumeGui();
+
+ while(promptWindow.GetEffect() > 0) usleep(100);
+
+ while(showProgress)
+ {
+ usleep(20000);
+
+ GameInstallProgress();
+
+ if(CFG.widescreen && Settings.wsprompt == yes)
+ progressbarImg.SetTile(0.8*progressDone);
+ else
+ progressbarImg.SetTile(progressDone);
+
+ prTxt.SetTextf("%.2f", progressDone);
+
+ if(showSize)
+ sizeTxt.SetText(progressSizeLeft);
+ if(showTime)
+ timeTxt.SetText(progressTime);
+ }
+
+ promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
+ while(promptWindow.GetEffect() > 0) usleep(100);
+
+ HaltGui();
+ mainWindow->Remove(&promptWindow);
+ mainWindow->SetState(STATE_DEFAULT);
+ ResumeGui();
+}
+
+/****************************************************************************
+ * ProgressThread
+ ***************************************************************************/
+
+static void * ProgressThread (void *arg)
+{
+ while(1)
+ {
+ if(!showProgress)
+ LWP_SuspendThread (progressthread);
+
+ ProgressWindow(progressTitle, progressMsg1, progressMsg2);
+ usleep(100);
+ }
+ return NULL;
+}
+
+/****************************************************************************
+ * ProgressStop
+ ***************************************************************************/
+void ProgressStop()
+{
+ showProgress = 0;
+ gameinstalltotal = -1;
+
+ // wait for thread to finish
+ while(!LWP_ThreadIsSuspended(progressthread))
+ usleep(100);
+}
+
+/****************************************************************************
+ * ShowProgress
+ *
+ * Callbackfunction for updating the progress values
+ * Use this function as standard callback
+ ***************************************************************************/
+void ShowProgress(const char *title, const char *msg1, const char *msg2, f32 done, f32 total, bool swSize, bool swTime)
+{
+ if(total <= 0)
+ return;
+
+ else if(done > total)
+ done = total;
+
+ showSize = swSize;
+ showTime = swTime;
+
+ if(title)
+ strncpy(progressTitle, title, sizeof(progressTitle));
+ if(msg1)
+ strncpy(progressMsg1, msg1, sizeof(progressMsg1));
+ if(msg2)
+ strncpy(progressMsg2, msg2, sizeof(progressMsg2));
+
+ if(swTime == true) {
+ static u32 expected;
+
+ u32 elapsed, h, m, s, speed = 0;
+
+ if (!done) {
+ start = time(0);
+ expected = 300;
+ }
+
+ //Elapsed time
+ elapsed = time(0) - start;
+
+ //Calculate speed in KB/s
+ if(elapsed > 0)
+ speed = done/(elapsed*KBSIZE);
+
+ if (done != total) {
+ //Expected time
+ if (elapsed)
+ expected = (expected * 3 + elapsed * total / done) / 4;
+
+ //Remaining time
+ elapsed = (expected > elapsed) ? (expected - elapsed) : 0;
+ }
+
+ //Calculate time values
+ h = elapsed / 3600;
+ m = (elapsed / 60) % 60;
+ s = elapsed % 60;
+
+ snprintf(progressTime, sizeof(progressTime), "%s %d:%02d:%02d",tr("Time left:"),h,m,s);
+ }
+
+ if(swSize == true) {
+ if(total < MBSIZE*10)
+ snprintf(progressSizeLeft, sizeof(progressSizeLeft), "%0.2fKB/%0.2fKB", 100.0* done/total / KBSIZE, total/KBSIZE);
+ else if(total > MBSIZE*10 && total < GBSIZE)
+ snprintf(progressSizeLeft, sizeof(progressSizeLeft), "%0.2fMB/%0.2fMB", 100.0* done/total / MBSIZE, total/MBSIZE);
+ else
+ snprintf(progressSizeLeft, sizeof(progressSizeLeft), "%0.2fGB/%0.2fGB", 100.0* done/total / GBSIZE, total/GBSIZE);
+ }
+
+ showProgress = 1;
+ progressDone = 100.0*done/total;
+
+ LWP_ResumeThread(progressthread);
+}
+
+/****************************************************************************
+ * InitProgressThread
+ *
+ * Startup Progressthread in idle prio
+ ***************************************************************************/
+void InitProgressThread() {
+ LWP_CreateThread(&progressthread, ProgressThread, NULL, NULL, 0, 0);
+}
+
+/****************************************************************************
+ * ExitProgressThread
+ *
+ * Shutdown Progressthread
+ ***************************************************************************/
+void ExitProgressThread() {
+ LWP_JoinThread(progressthread, NULL);
+ progressthread = LWP_THREAD_NULL;
+}
diff --git a/source/prompts/ProgressWindow.h b/source/prompts/ProgressWindow.h
new file mode 100644
index 00000000..38c3948b
--- /dev/null
+++ b/source/prompts/ProgressWindow.h
@@ -0,0 +1,22 @@
+/****************************************************************************
+ * ProgressWindow
+ * USB Loader GX 2009
+ *
+ * ProgressWindow.h
+ ***************************************************************************/
+
+#ifndef _PROGRESSWINDOW_H_
+#define _PROGRESSWINDOW_H_
+
+#define KBSIZE 1024.0
+#define MBSIZE 1048576.0
+#define GBSIZE 1073741824.0
+
+void InitProgressThread();
+void ExitProgressThread();
+void SetupGameInstallProgress(char * titl, char * game);
+void ShowProgress (const char *title, const char *msg1, const char *msg2,
+ f32 done, f32 total, bool swSize = false, bool swTime = false);
+void ProgressStop();
+
+#endif
diff --git a/source/prompts/PromptWindows.cpp b/source/prompts/PromptWindows.cpp
index 76dac086..081bf071 100644
--- a/source/prompts/PromptWindows.cpp
+++ b/source/prompts/PromptWindows.cpp
@@ -30,11 +30,6 @@
int cntMissFiles = 0;
/*** Variables used only in this file ***/
-static GuiText prTxt(NULL, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
-static GuiText timeTxt(NULL, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
-static GuiText sizeTxt(NULL, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
-static GuiImageData progressbar(progressbar_png);
-static GuiImage progressbarImg(&progressbar);
static char missingFiles[500][12];
/*** Extern variables ***/
@@ -1774,183 +1769,7 @@ void SearchMissingImages(int choice2)
}
/****************************************************************************
- * ShowProgress
- *
- * Updates the variables used by the progress window for drawing a progress
- * bar. Also resumes the progress window thread if it is suspended.
- ***************************************************************************/
-void
-ShowProgress (s32 done, s32 total)
-{
-
- static time_t start;
- static u32 expected;
-
- u32 d, h, m, s;
-
- //first time
- if (!done) {
- start = time(0);
- expected = 300;
- }
-
- //Elapsed time
- d = time(0) - start;
-
- if (done != total) {
- //Expected time
- if (d)
- expected = (expected * 3 + d * total / done) / 4;
-
- //Remaining time
- d = (expected > d) ? (expected - d) : 0;
- }
-
- //Calculate time values
- h = d / 3600;
- m = (d / 60) % 60;
- s = d % 60;
-
- //Calculate percentage/size
- f32 percent = (done * 100.0) / total;
-
- prTxt.SetTextf("%0.2f", percent);
-
- timeTxt.SetTextf("%s %d:%02d:%02d",tr("Time left:"),h,m,s);
-
- f32 gamesizedone = gamesize * done/total;
-
- sizeTxt.SetTextf("%0.2fGB/%0.2fGB", gamesizedone, gamesize);
-
- if ((Settings.wsprompt == yes) && (CFG.widescreen)){
- progressbarImg.SetTile((int)(80*done/total));}
- else {progressbarImg.SetTile((int)(100*done/total));}
-
-}
-
-/****************************************************************************
- * ProgressWindow
- *
- * Opens a window, which displays progress to the user. Can either display a
- * progress bar showing % completion, or a throbber that only shows that an
- * action is in progress.
- ***************************************************************************/
-int
-ProgressWindow(const char *title, const char *msg)
-{
-
- wbfs_t * hdd = NULL;
- hdd = GetHddInfo();
-
- GuiWindow promptWindow(472,320);
- promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
- promptWindow.SetPosition(0, -10);
- char imgPath[100];
- snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path);
- GuiImageData btnOutline(imgPath, button_dialogue_box_png);
- snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", CFG.theme_path);
- GuiImageData dialogBox(imgPath, dialogue_box_png);
- GuiTrigger trigA;
- trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
-
- GuiImage dialogBoxImg(&dialogBox);
- if (Settings.wsprompt == yes){
- dialogBoxImg.SetWidescreen(CFG.widescreen);}
-
- snprintf(imgPath, sizeof(imgPath), "%sprogressbar_outline.png", CFG.theme_path);
- GuiImageData progressbarOutline(imgPath, progressbar_outline_png);
-
- GuiImage progressbarOutlineImg(&progressbarOutline);
- if (Settings.wsprompt == yes){
- progressbarOutlineImg.SetWidescreen(CFG.widescreen);}
- progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
- progressbarOutlineImg.SetPosition(25, 40);
-
- snprintf(imgPath, sizeof(imgPath), "%sprogressbar_empty.png", CFG.theme_path);
- GuiImageData progressbarEmpty(imgPath, progressbar_empty_png);
- GuiImage progressbarEmptyImg(&progressbarEmpty);
- progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
- progressbarEmptyImg.SetPosition(25, 40);
- progressbarEmptyImg.SetTile(100);
-
- snprintf(imgPath, sizeof(imgPath), "%sprogressbar.png", CFG.theme_path);
- GuiImageData progressbar(imgPath, progressbar_png);
-
- progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
- progressbarImg.SetPosition(25, 40);
-
- GuiText titleTxt(title, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
- titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
- titleTxt.SetPosition(0,60);
- GuiText msgTxt(msg, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
- msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
- msgTxt.SetPosition(0,120);
-
- GuiText prsTxt("%", 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
- prsTxt.SetAlignment(ALIGN_RIGHT, ALIGN_MIDDLE);
- prsTxt.SetPosition(-188,40);
-
- timeTxt.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
- timeTxt.SetPosition(275,-50);
-
- sizeTxt.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
- sizeTxt.SetPosition(50, -50);
-
- prTxt.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
- prTxt.SetPosition(200, 40);
-
- if ((Settings.wsprompt == yes) && (CFG.widescreen)){/////////////adjust for widescreen
- progressbarOutlineImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
- progressbarOutlineImg.SetPosition(0, 40);
- progressbarEmptyImg.SetPosition(80,40);
- progressbarEmptyImg.SetTile(78);
- progressbarImg.SetPosition(80, 40);
- msgTxt.SetMaxWidth(380);
-
- timeTxt.SetPosition(250,-50);
- timeTxt.SetFontSize(22);
- sizeTxt.SetPosition(90, -50);
- sizeTxt.SetFontSize(22);
- }
-
- promptWindow.Append(&dialogBoxImg);
- promptWindow.Append(&titleTxt);
- promptWindow.Append(&msgTxt);
- promptWindow.Append(&progressbarEmptyImg);
- promptWindow.Append(&progressbarImg);
- promptWindow.Append(&progressbarOutlineImg);
- promptWindow.Append(&prTxt);
- promptWindow.Append(&prsTxt);
- promptWindow.Append(&timeTxt);
-
- HaltGui();
- mainWindow->SetState(STATE_DISABLED);
- mainWindow->Append(&promptWindow);
- mainWindow->ChangeFocus(&promptWindow);
- ResumeGui();
- promptWindow.Append(&prTxt);
- promptWindow.Append(&sizeTxt);
-
- s32 ret;
-
- USBStorage_Watchdog(0);
-
- ret = wbfs_add_disc(hdd, __WBFS_ReadDVD, NULL, ShowProgress, ONLY_GAME_PARTITION, 0);
-
- USBStorage_Watchdog(1);
-
- HaltGui();
- mainWindow->Remove(&promptWindow);
- mainWindow->SetState(STATE_DEFAULT);
- ResumeGui();
- if (ret < 0) {
- return ret;
- }
- return 0;
-}
-
-/****************************************************************************
- * ProgressWindow
+ * ProgressDownloadWindow
*
* Opens a window, which displays progress to the user. Can either display a
* progress bar showing % completion, or a throbber that only shows that an
@@ -1998,6 +1817,7 @@ ProgressDownloadWindow(int choice2)
snprintf(imgPath, sizeof(imgPath), "%sprogressbar.png", CFG.theme_path);
GuiImageData progressbar(imgPath, progressbar_png);
+ GuiImage progressbarImg(&progressbar);
progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
progressbarImg.SetPosition(25, 40);
@@ -2017,7 +1837,7 @@ ProgressDownloadWindow(int choice2)
msg3Txt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
msg3Txt.SetPosition(0,160);
-
+ GuiText prTxt(NULL, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
prTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
prTxt.SetPosition(0, 40);
@@ -2343,8 +2163,7 @@ ProgressDownloadWindow(int choice2)
* progress bar showing % completion, or a throbber that only shows that an
* action is in progress.
***************************************************************************/
-#define BLOCKSIZE 1024
-
+ #define BLOCKSIZE 1024
int ProgressUpdateWindow()
{
int ret = 0, failed = 0;
@@ -2385,6 +2204,7 @@ int ProgressUpdateWindow()
snprintf(imgPath, sizeof(imgPath), "%sprogressbar.png", CFG.theme_path);
GuiImageData progressbar(imgPath, progressbar_png);
+ GuiImage progressbarImg(&progressbar);
progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
progressbarImg.SetPosition(25, 7);
@@ -2403,6 +2223,7 @@ int ProgressUpdateWindow()
msg2Txt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
msg2Txt.SetPosition(0, 50);
+ GuiText prTxt(NULL, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
prTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
prTxt.SetPosition(0, 7);
@@ -2491,9 +2312,9 @@ int ProgressUpdateWindow()
if(filesize > 0) {
FILE * pfile;
pfile = fopen(dolpath, "wb");
- u8 blockbuffer[BLOCKSIZE] ATTRIBUTE_ALIGN(32);
+ u8 * blockbuffer = new unsigned char[BLOCKSIZE];
for (s32 i = 0; i < filesize; i += BLOCKSIZE) {
- VIDEO_WaitVSync();
+ usleep(100);
prTxt.SetTextf("%i%%", 100*i/filesize);
if ((Settings.wsprompt == yes) && (CFG.widescreen)) {
progressbarImg.SetTile(80*i/filesize);
@@ -2526,6 +2347,7 @@ int ProgressUpdateWindow()
fwrite(blockbuffer,1,blksize, pfile);
}
fclose(pfile);
+ delete blockbuffer;
if(!failed) {
//remove old
if(checkfile(dolpathsuccess)){
diff --git a/source/prompts/PromptWindows.h b/source/prompts/PromptWindows.h
index 8111b9fe..2f03acd3 100644
--- a/source/prompts/PromptWindows.h
+++ b/source/prompts/PromptWindows.h
@@ -21,7 +21,6 @@ int GameWindowPrompt();
int DiscWait(const char *title, const char *msg, const char *btn1Label, const char *btn2Label, int IsDeviceWait);
int FormatingPartition(const char *title, partitionEntry *entry);
void SearchMissingImages(int choice2);
-int ProgressWindow(const char *title, const char *msg);
int ProgressDownloadWindow(int choice2);
int ProgressUpdateWindow();
char * GetMissingFiles();
diff --git a/source/usbloader/wbfs.c b/source/usbloader/wbfs.c
index 539d35c7..622010d8 100644
--- a/source/usbloader/wbfs.c
+++ b/source/usbloader/wbfs.c
@@ -22,53 +22,20 @@ static wbfs_t *hdd = NULL;
/* WBFS callbacks */
static rw_sector_callback_t readCallback = NULL;
static rw_sector_callback_t writeCallback = NULL;
-
+static s32 done = -1, total = -1;
/* Variables */
static u32 nb_sectors, sector_size;
-void __WBFS_Spinner(s32 x, s32 max)
+static void WBFS_Spinner(s32 x, s32 max)
{
- static time_t start;
- static u32 expected;
-
- f32 percent, size;
- u32 d, h, m, s;
-
- /* First time */
- if (!x) {
- start = time(0);
- expected = 300;
- }
-
- /* Elapsed time */
- d = time(0) - start;
-
- if (x != max) {
- /* Expected time */
- if (d)
- expected = (expected * 3 + d * max / x) / 4;
-
- /* Remaining time */
- d = (expected > d) ? (expected - d) : 0;
- }
-
- /* Calculate time values */
- h = d / 3600;
- m = (d / 60) % 60;
- s = d % 60;
-
- /* Calculate percentage/size */
- percent = (x * 100.0) / max;
- size = (hdd->wii_sec_sz / GB_SIZE) * max;
+ done = x;
+ total = max;
+}
- //Con_ClearLine();
-
- /* Show progress */
- if (x != max) {
- printf(" %.2f%% of %.2fGB (%c) ETA: %d:%02d:%02d\r", percent, size, "/|\\-"[(x / 10) % 4], h, m, s);
- fflush(stdout);
- } else
- printf(" %.2fGB copied in %d:%02d:%02d\n", size, h, m, s);
+void GetProgressValue(s32 * d, s32 * m)
+{
+ *d = done;
+ *m = total;
}
wbfs_t *GetHddInfo(void)
@@ -444,7 +411,7 @@ s32 WBFS_AddGame(void)
return -1;
/* Add game to device */
- ret = wbfs_add_disc(hdd, __WBFS_ReadDVD, NULL, __WBFS_Spinner, ALL_PARTITIONS, 0);
+ ret = wbfs_add_disc(hdd, __WBFS_ReadDVD, NULL, WBFS_Spinner, ONLY_GAME_PARTITION, 0);
if (ret < 0)
return ret;
diff --git a/source/usbloader/wbfs.h b/source/usbloader/wbfs.h
index b396c00e..8cd9f09b 100644
--- a/source/usbloader/wbfs.h
+++ b/source/usbloader/wbfs.h
@@ -18,7 +18,7 @@ enum {
#define WBFS_MAX_DEVICE 2
/* Prototypes */
-
+void GetProgressValue(s32 * d, s32 * m);
s32 WBFS_Init(u32);
s32 WBFS_Open(void);
s32 WBFS_Close(void);