mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-08 20:45:07 +01:00
c7fc442724
I can't remember which one are fixed so please check if your issue is fixed and report.
202 lines
5.0 KiB
C++
202 lines
5.0 KiB
C++
#include <dirent.h>
|
|
#include <unistd.h>
|
|
|
|
#include "gecko.h"
|
|
#include "menus.h"
|
|
#include "wpad.h"
|
|
#include "fatmounter.h"
|
|
#include "usbloader/getentries.h"
|
|
#include "usbloader/wbfs.h"
|
|
|
|
extern int load_from_fs;
|
|
extern char game_partition[6];
|
|
|
|
static lwp_t checkthread = LWP_THREAD_NULL;
|
|
static bool checkHalt = false;
|
|
static bool ExitRequested = false;
|
|
static u8 sdState =0;
|
|
u8 hddState = 0;
|
|
u8 checkthreadState = 0;
|
|
bool ScreenshotTriggered = false;
|
|
|
|
extern u8 shutdown;
|
|
extern u8 reset;
|
|
|
|
void ResumeCheck()
|
|
{
|
|
checkHalt = false;
|
|
LWP_ResumeThread(checkthread);
|
|
}
|
|
|
|
void HaltCheck()
|
|
{
|
|
if(checkHalt)
|
|
return;
|
|
|
|
checkHalt = true;
|
|
|
|
while (!LWP_ThreadIsSuspended(checkthread))
|
|
usleep(50);
|
|
}
|
|
|
|
int CheckPartition()
|
|
{
|
|
s32 ret2 = -1;
|
|
memset(game_partition, 0, 6);
|
|
load_from_fs = -1;
|
|
|
|
extern PartList partitions;
|
|
// Added for slow HDD
|
|
for (int runs = 0; runs < 10; runs++)
|
|
{
|
|
if (Partition_GetList(WBFS_DEVICE_USB, &partitions) != 0)
|
|
continue;
|
|
|
|
if (Settings.partition != -1 && partitions.num > Settings.partition)
|
|
{
|
|
PartInfo pinfo = partitions.pinfo[Settings.partition];
|
|
if (WBFS_OpenPart(pinfo.part_fs, pinfo.index, partitions.pentry[Settings.partition].sector, partitions.pentry[Settings.partition].size, (char *) &game_partition) == 0)
|
|
{
|
|
ret2 = 0;
|
|
load_from_fs = pinfo.part_fs;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (partitions.wbfs_n != 0)
|
|
{
|
|
ret2 = WBFS_Open();
|
|
for (int p = 0; p < partitions.num; p++)
|
|
{
|
|
if (partitions.pinfo[p].fs_type == FS_TYPE_WBFS)
|
|
{
|
|
Settings.partition = p;
|
|
load_from_fs = PART_FS_WBFS;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
else if (Sys_IsHermes() && (partitions.fat_n != 0 || partitions.ntfs_n != 0))
|
|
{
|
|
// Loop through FAT/NTFS partitions, and find the first partition with games on it (if there is one)
|
|
u32 count;
|
|
for (int i = 0; i < partitions.num; i++)
|
|
{
|
|
if (partitions.pinfo[i].fs_type == FS_TYPE_FAT32 || partitions.pinfo[i].fs_type == FS_TYPE_NTFS)
|
|
{
|
|
if (!WBFS_OpenPart(partitions.pinfo[i].part_fs, partitions.pinfo[i].index, partitions.pentry[i].sector, partitions.pentry[i].size, (char *) &game_partition))
|
|
{
|
|
// Get the game count...
|
|
WBFS_GetCount(&count);
|
|
if (count > 0)
|
|
{
|
|
load_from_fs = partitions.pinfo[i].part_fs;
|
|
Settings.partition = i;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
WBFS_Close();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ((ret2 >= 0 || load_from_fs != PART_FS_WBFS) && isInserted(bootDevice))
|
|
{
|
|
cfg_save_global();
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (ret2 < 0 && load_from_fs != PART_FS_WBFS)
|
|
return -1;
|
|
|
|
ret2 = Disc_Init();
|
|
if (ret2 < 0)
|
|
return ret2;
|
|
|
|
hddState = 1;
|
|
|
|
return hddState;
|
|
}
|
|
|
|
int CheckHDD()
|
|
{
|
|
USBDevice_deInit();
|
|
USBDevice_Init();
|
|
|
|
int wbfsinit = WBFS_Init(WBFS_DEVICE_USB);
|
|
|
|
if (wbfsinit >= 0)
|
|
wbfsinit = CheckPartition();
|
|
|
|
return wbfsinit;
|
|
}
|
|
|
|
static void * CheckDevices (void *arg)
|
|
{
|
|
sdState = isInserted(bootDevice);
|
|
while (!ExitRequested)
|
|
{
|
|
if (checkHalt && !ExitRequested)
|
|
{
|
|
LWP_SuspendThread(checkthread);
|
|
continue;
|
|
}
|
|
|
|
if (shutdown == 1)
|
|
Sys_Shutdown();
|
|
|
|
else if (reset == 1)
|
|
Sys_Reboot();
|
|
|
|
if (!hddState)
|
|
{
|
|
if(CheckHDD() >= 0)
|
|
{
|
|
// open database if needed, load titles if needed
|
|
if(isInserted(bootDevice))
|
|
OpenXMLDatabase(Settings.titlestxt_path,Settings.db_language, Settings.db_JPtoEN, true, Settings.titlesOverride == 1 ? true: false, true);
|
|
|
|
checkthreadState = 1;
|
|
}
|
|
}
|
|
|
|
//this really doesnt work right. it seems that isInserted() isn't what it should be.
|
|
int sdNow = isInserted(bootDevice);
|
|
if (sdState != sdNow)
|
|
{
|
|
sdState = sdNow;
|
|
checkthreadState = 2;
|
|
}
|
|
|
|
if(ScreenshotTriggered)
|
|
{
|
|
gprintf("\n\tscreenShotBtn clicked");
|
|
ScreenShot();
|
|
ScreenshotTriggered = false;
|
|
gprintf("...It's easy, mmmmmmKay");
|
|
}
|
|
|
|
usleep(20000);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void InitCheckThread()
|
|
{
|
|
LWP_CreateThread(&checkthread, CheckDevices, NULL, NULL, 0, 0);
|
|
}
|
|
|
|
void ExitCheckThread()
|
|
{
|
|
ExitRequested = true;
|
|
LWP_ResumeThread(checkthread);
|
|
LWP_JoinThread(checkthread, NULL);
|
|
checkthread = LWP_THREAD_NULL;
|
|
}
|