diff --git a/source/FontSystem.cpp b/source/FontSystem.cpp index aeb82a88..74ede3a1 100644 --- a/source/FontSystem.cpp +++ b/source/FontSystem.cpp @@ -47,10 +47,13 @@ bool SetupDefaultFont(const char *path) { bool result = false; FILE *pfile = NULL; + char FontPath[300]; ClearFontData(); - if (path) pfile = fopen(path, "rb"); + snprintf(FontPath, sizeof(FontPath), "%sfont.ttf", path); + + pfile = fopen(FontPath, "rb"); if (pfile) { diff --git a/source/fatmounter.c b/source/fatmounter.c index 39212be0..bbf80851 100644 --- a/source/fatmounter.c +++ b/source/fatmounter.c @@ -51,10 +51,20 @@ int USBDevice_Init() USBDevice_deInit(); //right now mounts first FAT-partition - //usbstorage.startup is actually not needed since it's done in libfat - //let's still do it before mount and wait a bit for slow ass hdds before reading from them - __io_usbstorage2.startup(); - usleep(200000); + bool started = false; + int retries = 10; + + // wait 0.5 sec for the USB to spin up...stupid slow ass HDD + do + { + started = (!__io_usbstorage2.startup() || !__io_usbstorage2.isInserted()); + usleep(50000); + --retries; + } + while(!started && retries > 0); + + if(!started) + return -1; if (fatMount("USB", &__io_usbstorage2, 0, CACHE, SECTORS)) { @@ -62,18 +72,32 @@ int USBDevice_Init() return (fat_usb_mount = 1); } - __io_usbstorage.startup(); - usleep(200000); + return -1; +} - if(fatMount("USB", &__io_usbstorage, 0, CACHE, SECTORS)) +int USBDevice_Init_Loop() +{ + time_t starttime = time(0); + time_t timenow = starttime; + int ret = -1; + bool printStart = true; + + while(timenow-starttime < 30 && ret < 0) { - fat_usb_sec = _FAT_startSector; - return (fat_usb_mount = 1); + ret = USBDevice_Init(); + if(ret < 0) + { + if(printStart) + { + printf("failed\n"); + printf("\tWaiting for slow HDD...\n"); + printStart = false; + } + printf("%i ", (int) (timenow-starttime+1)); + } } - __io_usbstorage.shutdown(); - - return -1; + return ret; } void USBDevice_deInit() @@ -81,7 +105,6 @@ void USBDevice_deInit() //closing all open Files write back the cache and then shutdown em! fatUnmount("USB:/"); //only shutdown libogc usb and not the cios one - __io_usbstorage.shutdown(); __io_usbstorage2.shutdown(); fat_usb_mount = 0; @@ -100,11 +123,7 @@ int WBFSDevice_Init(u32 sector) fat_wbfs_mount = 1; fat_wbfs_sec = _FAT_startSector; - if (sector && fat_wbfs_sec != sector) - { - // This is an error situation...actually, but is ignored in Config loader also - // Should ask Oggzee about it... - } + return 0; } @@ -169,11 +188,7 @@ s32 MountNTFS(u32 sector) { ret = ntfsMount("NTFS", &__io_usbstorage2, sector, CACHE, SECTORS, NTFS_SHOW_HIDDEN_FILES | NTFS_RECOVER); if (!ret) - { - ret = ntfsMount("NTFS", &__io_usbstorage, sector, CACHE, SECTORS, NTFS_SHOW_HIDDEN_FILES | NTFS_RECOVER); - if(!ret) - return -2; - } + return -2; } else if (wbfsDev == WBFS_DEVICE_SDHC) { diff --git a/source/fatmounter.h b/source/fatmounter.h index 15dd2368..1b5dd94c 100644 --- a/source/fatmounter.h +++ b/source/fatmounter.h @@ -16,6 +16,7 @@ extern int fat_wbfs_mount; extern sec_t fat_wbfs_sec; int USBDevice_Init(); +int USBDevice_Init_Loop(); //! Wait's for the drive before mounting it, only used on bootup void USBDevice_deInit(); int WBFSDevice_Init(u32 sector); void WBFSDevice_deInit(); diff --git a/source/gecko.c b/source/gecko.c index c7ef25e5..ea0e38e3 100644 --- a/source/gecko.c +++ b/source/gecko.c @@ -4,8 +4,7 @@ #include /* init-globals */ -bool geckoinit = false; -bool textVideoInit = false; +static bool geckoinit = false; #ifndef NO_DEBUG #include @@ -37,6 +36,7 @@ bool InitGecko() { usb_flush(EXI_CHANNEL_1); CON_EnableGecko(1, true); + geckoinit = true; return true; } else return false; diff --git a/source/libs/libfat/common.h b/source/libs/libfat/common.h index cb065a5a..e0489e72 100644 --- a/source/libs/libfat/common.h +++ b/source/libs/libfat/common.h @@ -3,7 +3,7 @@ Common definitions and included files for the FATlib Copyright (c) 2006 Michael "Chishm" Chisholm - + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -30,9 +30,9 @@ #define _COMMON_H #define BYTES_PER_READ 512 +#include #include #include -#include // When compiling for NDS, make sure NDS is defined #ifndef NDS diff --git a/source/libs/libfat/directory.c b/source/libs/libfat/directory.c index 0e7b5ede..c2d93131 100644 --- a/source/libs/libfat/directory.c +++ b/source/libs/libfat/directory.c @@ -439,24 +439,25 @@ bool _FAT_directory_getVolumeLabel (PARTITION* partition, char *label) { end = false; //this entry should be among the first 3 entries in the root directory table, if not, then system can have trouble displaying the right volume label while(!end) { - if (_FAT_directory_incrementDirEntryPosition (partition, &entryEnd, false) == false) { - end = true; - } - if(!_FAT_cache_readPartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, entryEnd.cluster) + entryEnd.sector, entryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE)) { //error reading return false; } + if (entryData[DIR_ENTRY_attributes] == ATTRIB_VOL && entryData[0] != DIR_ENTRY_FREE) { for (i = 0; i < 11; i++) { - label[i] = entryData[DIR_ENTRY_name + i]; + label[i] = entryData[DIR_ENTRY_name + i]; } return true; } else if (entryData[0] == DIR_ENTRY_LAST) { end = true; } + + if (_FAT_directory_incrementDirEntryPosition (partition, &entryEnd, false) == false) { + end = true; + } } return false; } diff --git a/source/libs/libfat/fat.h b/source/libs/libfat/fat.h index b0ffc13a..82c973d3 100644 --- a/source/libs/libfat/fat.h +++ b/source/libs/libfat/fat.h @@ -1,7 +1,7 @@ /* fat.h Simple functionality for startup, mounting and unmounting of FAT-based devices. - + Copyright (c) 2006 - 2009 Michael "Chishm" Chisholm Dave "WinterMute" Murphy @@ -71,7 +71,7 @@ extern bool fatInitDefault (void); /* Mount the device pointed to by interface, and set up a devoptab entry for it as "name:". You can then access the filesystem using "name:/". -This will mount the active partition or the first valid partition on the disc, +This will mount the active partition or the first valid partition on the disc, and will use a cache size optimized for the host system. */ extern bool fatMountSimple (const char* name, const DISC_INTERFACE* interface); diff --git a/source/libs/libfat/fat_cache.c b/source/libs/libfat/fat_cache.c index 3fe34537..2b12b70b 100644 --- a/source/libs/libfat/fat_cache.c +++ b/source/libs/libfat/fat_cache.c @@ -158,7 +158,7 @@ bool _FAT_cache_readSectors(CACHE *cache,sec_t sector,sec_t numSectors,void *buf sec_t sec; sec_t secs_to_read; CACHE_ENTRY *entry; - uint8_t *dest = buffer; + uint8_t *dest = (uint8_t *)buffer; while(numSectors>0) { entry = _FAT_cache_getPage(cache,sector); @@ -264,7 +264,7 @@ bool _FAT_cache_eraseWritePartialSector (CACHE* cache, const void* buffer, sec_t return true; } - +#ifndef GEKKO static CACHE_ENTRY* _FAT_cache_findPage(CACHE *cache, sec_t sector, sec_t count) { unsigned int i; @@ -291,47 +291,46 @@ static CACHE_ENTRY* _FAT_cache_findPage(CACHE *cache, sec_t sector, sec_t count) return entry; } +#endif bool _FAT_cache_writeSectors (CACHE* cache, sec_t sector, sec_t numSectors, const void* buffer) { sec_t sec; sec_t secs_to_write; CACHE_ENTRY* entry; - const uint8_t *src = buffer; + const uint8_t *src = (const uint8_t *)buffer; while(numSectors>0) { +#ifdef GEKKO + entry = _FAT_cache_getPage(cache,sector); + if(entry==NULL) return false; +#else entry = _FAT_cache_findPage(cache,sector,numSectors); - if(entry!=NULL) { + if(entry==NULL) + return _FAT_disc_writeSectors(cache->disc,sector,numSectors,src); - if ( entry->sector > sector) { + if ( entry->sector > sector) { + secs_to_write = entry->sector - sector; - secs_to_write = entry->sector - sector; - - _FAT_disc_writeSectors(cache->disc,sector,secs_to_write,src); - src += (secs_to_write*BYTES_PER_READ); - sector += secs_to_write; - numSectors -= secs_to_write; - } - - sec = sector - entry->sector; - secs_to_write = entry->count - sec; - - if(secs_to_write>numSectors) secs_to_write = numSectors; - - memcpy(entry->cache + (sec*BYTES_PER_READ),src,(secs_to_write*BYTES_PER_READ)); - + _FAT_disc_writeSectors(cache->disc,sector,secs_to_write,src); src += (secs_to_write*BYTES_PER_READ); sector += secs_to_write; numSectors -= secs_to_write; - - entry->dirty = true; - - } else { - _FAT_disc_writeSectors(cache->disc,sector,numSectors,src); - numSectors=0; } +#endif + sec = sector - entry->sector; + secs_to_write = entry->count - sec; + if(secs_to_write>numSectors) secs_to_write = numSectors; + + memcpy(entry->cache + (sec*BYTES_PER_READ),src,(secs_to_write*BYTES_PER_READ)); + + src += (secs_to_write*BYTES_PER_READ); + sector += secs_to_write; + numSectors -= secs_to_write; + + entry->dirty = true; } return true; } diff --git a/source/libs/libfat/fatfile.c b/source/libs/libfat/fatfile.c index 0892f960..3ea6d323 100644 --- a/source/libs/libfat/fatfile.c +++ b/source/libs/libfat/fatfile.c @@ -654,10 +654,9 @@ ssize_t _FAT_write_r (struct _reent *r, int fd, const char *ptr, size_t len) { _FAT_lock(&partition->lock); // Only write up to the maximum file size, taking into account wrap-around of ints - if (remain + file->filesize > FILE_MAX_SIZE || len + file->filesize < file->filesize) { + if (len + file->filesize > FILE_MAX_SIZE || len + file->filesize < file->filesize) { len = FILE_MAX_SIZE - file->filesize; } - remain = len; // Short circuit cases where len is 0 (or less) if (len <= 0) { @@ -665,6 +664,8 @@ ssize_t _FAT_write_r (struct _reent *r, int fd, const char *ptr, size_t len) { return 0; } + remain = len; + // Get a new cluster for the start of the file if required if (file->startCluster == CLUSTER_FREE) { tempNextCluster = _FAT_fat_linkFreeCluster (partition, CLUSTER_FREE); @@ -772,7 +773,7 @@ ssize_t _FAT_write_r (struct _reent *r, int fd, const char *ptr, size_t len) { #endif (chunkSize + partition->bytesPerCluster < remain)) { - // pretend to use up all sectors in next_position + // pretend to use up all sectors in next_position next_position.sector = partition->sectorsPerCluster; // get or allocate next cluster _FAT_check_position_for_next_cluster(r, &next_position, partition, @@ -1130,6 +1131,7 @@ int _FAT_fsync_r (struct _reent *r, int fd) { return ret; } + typedef int (*_frag_append_t)(void *ff, u32 offset, u32 sector, u32 count); int _FAT_get_fragments (const char *path, _frag_append_t append_fragment, void *callback_data) diff --git a/source/libs/libfat/fatfile.h b/source/libs/libfat/fatfile.h index 448a5ee3..9fd0a23a 100644 --- a/source/libs/libfat/fatfile.h +++ b/source/libs/libfat/fatfile.h @@ -1,11 +1,11 @@ /* fatfile.h - - Functions used by the newlib disc stubs to interface with + + Functions used by the newlib disc stubs to interface with this library Copyright (c) 2006 Michael "Chishm" Chisholm - + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -69,31 +69,31 @@ struct _FILE_STRUCT { typedef struct _FILE_STRUCT FILE_STRUCT; -extern int _FAT_open_r (struct _reent *r, void *fileStruct, const char *path, int flags, int mode); +int _FAT_open_r (struct _reent *r, void *fileStruct, const char *path, int flags, int mode); -extern int _FAT_close_r (struct _reent *r, int fd); +int _FAT_close_r (struct _reent *r, int fd); -extern ssize_t _FAT_write_r (struct _reent *r,int fd, const char *ptr, size_t len); +ssize_t _FAT_write_r (struct _reent *r,int fd, const char *ptr, size_t len); -extern ssize_t _FAT_read_r (struct _reent *r, int fd, char *ptr, size_t len); +ssize_t _FAT_read_r (struct _reent *r, int fd, char *ptr, size_t len); -extern off_t _FAT_seek_r (struct _reent *r, int fd, off_t pos, int dir); +off_t _FAT_seek_r (struct _reent *r, int fd, off_t pos, int dir); -extern int _FAT_fstat_r (struct _reent *r, int fd, struct stat *st); +int _FAT_fstat_r (struct _reent *r, int fd, struct stat *st); -extern int _FAT_stat_r (struct _reent *r, const char *path, struct stat *st); +int _FAT_stat_r (struct _reent *r, const char *path, struct stat *st); -extern int _FAT_link_r (struct _reent *r, const char *existing, const char *newLink); +int _FAT_link_r (struct _reent *r, const char *existing, const char *newLink); -extern int _FAT_unlink_r (struct _reent *r, const char *name); +int _FAT_unlink_r (struct _reent *r, const char *name); -extern int _FAT_chdir_r (struct _reent *r, const char *name); +int _FAT_chdir_r (struct _reent *r, const char *name); -extern int _FAT_rename_r (struct _reent *r, const char *oldName, const char *newName); +int _FAT_rename_r (struct _reent *r, const char *oldName, const char *newName); -extern int _FAT_ftruncate_r (struct _reent *r, int fd, off_t len); +int _FAT_ftruncate_r (struct _reent *r, int fd, off_t len); -extern int _FAT_fsync_r (struct _reent *r, int fd); +int _FAT_fsync_r (struct _reent *r, int fd); /* Synchronizes the file data to disc. diff --git a/source/libs/libfat/file_allocation_table.c b/source/libs/libfat/file_allocation_table.c index 639a6374..7edd7cb1 100644 --- a/source/libs/libfat/file_allocation_table.c +++ b/source/libs/libfat/file_allocation_table.c @@ -246,7 +246,7 @@ uint32_t _FAT_fat_linkFreeCluster(PARTITION* partition, uint32_t cluster) { } partition->fat.firstFree = firstFree; - if ((cluster >= CLUSTER_FIRST) && (cluster < lastCluster)) + if ((cluster >= CLUSTER_FIRST) && (cluster <= lastCluster)) { // Update the linked from FAT entry _FAT_fat_writeFatEntry (partition, cluster, firstFree); diff --git a/source/libs/libfat/libfat.c b/source/libs/libfat/libfat.c index f62603ba..9f8dd014 100644 --- a/source/libs/libfat/libfat.c +++ b/source/libs/libfat/libfat.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "common.h" #include "partition.h" @@ -61,7 +62,9 @@ static const devoptab_t dotab_fat = { _FAT_statvfs_r, _FAT_ftruncate_r, _FAT_fsync_r, - NULL /* Device data */ + NULL, /* Device data */ + NULL, + NULL }; bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSector, uint32_t cacheSize, uint32_t SectorsPerPage) { @@ -69,7 +72,7 @@ bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSec devoptab_t* devops; char* nameCopy; - if(!name || !interface) + if(!name || strlen(name) > 8 || !interface) return false; if(!interface->startup()) @@ -78,6 +81,11 @@ bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSec if(!interface->isInserted()) return false; + char devname[10]; + sprintf(devname, "%s:", name); + if(FindDevice(devname) >= 0) + return true; + devops = _FAT_mem_allocate (sizeof(devoptab_t) + strlen(name) + 1); if (!devops) { return false; @@ -203,7 +211,7 @@ void fatGetVolumeLabel (const char* name, char *label) { return; namelen = strlen(name); - buf=(char*)_FAT_mem_allocate(sizeof(char)*namelen+2); + buf=(char*)_FAT_mem_allocate(sizeof(char)*namelen+2); strcpy(buf,name); if (name[namelen-1] == '/') { @@ -218,22 +226,22 @@ void fatGetVolumeLabel (const char* name, char *label) { devops = (devoptab_t*)GetDeviceOpTab(buf); - for(i=0;buf[i]!='\0' && buf[i]!=':';i++); + for(i=0;buf[i]!='\0' && buf[i]!=':';i++); if (!devops || strncasecmp(buf,devops->name,i)) { - free(buf); + _FAT_mem_free(buf); return; } - free(buf); + _FAT_mem_free(buf); // Perform a quick check to make sure we're dealing with a libfat controlled device if (devops->open_r != dotab_fat.open_r) { return; - } + } partition = (PARTITION*)devops->deviceData; - if(!_FAT_directory_getVolumeLabel(partition, label)) { + if(!_FAT_directory_getVolumeLabel(partition, label)) { strncpy(label,partition->label,11); label[11]='\0'; } diff --git a/source/libs/libfat/lock.h b/source/libs/libfat/lock.h index a93194c2..c52f3130 100644 --- a/source/libs/libfat/lock.h +++ b/source/libs/libfat/lock.h @@ -31,8 +31,6 @@ #include "common.h" -#ifdef USE_LWP_LOCK - static inline void _FAT_lock_init(mutex_t *mutex) { LWP_MutexInit(mutex, false); @@ -53,35 +51,6 @@ static inline void _FAT_unlock(mutex_t *mutex) LWP_MutexUnlock(*mutex); } -#else - -// We still need a blank lock type -#ifndef mutex_t -typedef int mutex_t; -#endif - -static inline void _FAT_lock_init(mutex_t *mutex) -{ - return; -} - -static inline void _FAT_lock_deinit(mutex_t *mutex) -{ - return; -} - -static inline void _FAT_lock(mutex_t *mutex) -{ - return; -} - -static inline void _FAT_unlock(mutex_t *mutex) -{ - return; -} - -#endif // USE_LWP_LOCK - #endif // _LOCK_H diff --git a/source/libwiigui/gui.h b/source/libwiigui/gui.h index 196524fc..340d5bb2 100644 --- a/source/libwiigui/gui.h +++ b/source/libwiigui/gui.h @@ -935,8 +935,6 @@ class GuiKeyboard: public GuiWindow GuiImageData * keyMediumOver; GuiImageData * keyLarge; GuiImageData * keyLargeOver; - GuiSound * keySoundOver; - GuiSound * keySoundClick; GuiTrigger * trigA; GuiTrigger * trigB; }; diff --git a/source/libwiigui/gui_keyboard.cpp b/source/libwiigui/gui_keyboard.cpp index ce4e80c1..b4e2183c 100644 --- a/source/libwiigui/gui_keyboard.cpp +++ b/source/libwiigui/gui_keyboard.cpp @@ -166,8 +166,8 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, int min, int lang) //keyBack->SetImage(keyBackImg); //keyBack->SetImageOver(keyBackOverImg); keyBack->SetLabel(keyBackText); - //keyBack->SetSoundOver(keySoundOver); - //keyBack->SetSoundClick(keySoundClick); + //keyBack->SetSoundOver(btnSoundOver); + //keyBack->SetSoundClick(btnSoundClick); //keyBack->SetTrigger(trigA); keyBack->SetTrigger(trigB); if (mode > 1) @@ -194,13 +194,13 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, int min, int lang) { 0, 0, 0, 0xff}); } keyClear = new GuiButton(keyClearImg, keyClearOverImg, 0, 3, (10 * 42 + 40) + eurocheck, 4 * 42 + 120, trigA, - keySoundOver, keySoundClick, 1); + btnSoundOver, btnSoundClick, 1); //keyClear = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight()); //keyClear->SetImage(keyClearImg); //keyClear->SetImageOver(keyClearOverImg); keyClear->SetLabel(keyClearText); - //keyClear->SetSoundOver(keySoundOver); - //keyClear->SetSoundClick(keySoundClick); + //keyClear->SetSoundOver(btnSoundOver); + //keyClear->SetSoundClick(btnSoundClick); //keyClear->SetTrigger(trigA); //keyClear->SetPosition((10*42+40)+eurocheck, 4*42+120);//(10*42+40, 0*42+80); //keyClear->SetEffectGrow(); @@ -210,14 +210,14 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, int min, int lang) keyAltOverImg = new GuiImage(keyMediumOver); keyAltText = new GuiText("Alt Gr", 20, ( GXColor ) { 0, 0, 0, 0xff}); - keyAlt = new GuiButton(keyAltImg, keyAltOverImg, 0, 3, 84 + eurocheck, 4 * 42 + 120, trigA, keySoundOver, - keySoundClick, 1); + keyAlt = new GuiButton(keyAltImg, keyAltOverImg, 0, 3, 84 + eurocheck, 4 * 42 + 120, trigA, btnSoundOver, + btnSoundClick, 1); //keyAlt = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight()); //keyAlt->SetImage(keyAltImg); //keyAlt->SetImageOver(keyAltOverImg); keyAlt->SetLabel(keyAltText); - //keyAlt->SetSoundOver(keySoundOver); - //keyAlt->SetSoundClick(keySoundClick); + //keyAlt->SetSoundOver(btnSoundOver); + //keyAlt->SetSoundClick(btnSoundClick); //keyAlt->SetTrigger(trigA); //keyAlt->SetPosition(84+eurocheck, 4*42+120);//(10*42+40, 4*42+120); //keyAlt->SetEffectGrow(); @@ -231,13 +231,13 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, int min, int lang) keyAlt2Text = new GuiText("Accent", 20, ( GXColor ) { 0, 0, 0, 0xff}); keyAlt2 = new GuiButton(keyAlt2Img, keyAlt2OverImg, 0, 3, (8 * 42 + 40) + eurocheck, 4 * 42 + 120, trigA, - keySoundOver, keySoundClick, 1); + btnSoundOver, btnSoundClick, 1); //keyAlt2 = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight()); //keyAlt2->SetImage(keyAlt2Img); //keyAlt2->SetImageOver(keyAlt2OverImg); keyAlt2->SetLabel(keyAlt2Text); - //keyAlt2->SetSoundOver(keySoundOver); - //keyAlt2->SetSoundClick(keySoundClick); + //keyAlt2->SetSoundOver(btnSoundOver); + //keyAlt2->SetSoundClick(btnSoundClick); //keyAlt2->SetTrigger(trigA); //keyAlt2->SetPosition((8*42+40)+eurocheck, 4*42+120);//(10*42+40, 4*42+120); //keyAlt2->SetEffectGrow(); @@ -250,14 +250,14 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, int min, int lang) keyCapsOverImg = new GuiImage(keyMediumOver); keyCapsText = new GuiText("Caps", 20, ( GXColor ) { 0, 0, 0, 0xff}); - keyCaps = new GuiButton(keyCapsImg, keyCapsOverImg, 0, 3, 0 + eurocheck, 2 * 42 + 120, trigA, keySoundOver, - keySoundClick, 1); + keyCaps = new GuiButton(keyCapsImg, keyCapsOverImg, 0, 3, 0 + eurocheck, 2 * 42 + 120, trigA, btnSoundOver, + btnSoundClick, 1); //keyCaps = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight()); //keyCaps->SetImage(keyCapsImg); //keyCaps->SetImageOver(keyCapsOverImg); keyCaps->SetLabel(keyCapsText); - //keyCaps->SetSoundOver(keySoundOver); - //keyCaps->SetSoundClick(keySoundClick); + //keyCaps->SetSoundOver(btnSoundOver); + //keyCaps->SetSoundClick(btnSoundClick); //keyCaps->SetTrigger(trigA); //keyCaps->SetPosition(0+eurocheck, 2*42+120);//(0, 2*42+80); //keyCaps->SetEffectGrow(); @@ -267,14 +267,14 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, int min, int lang) keyShiftOverImg = new GuiImage(keyMediumOver); keyShiftText = new GuiText("Shift", 20, ( GXColor ) { 0, 0, 0, 0xff}); - keyShift = new GuiButton(keyShiftImg, keyShiftOverImg, 0, 3, 21 + eurocheck, 3 * 42 + 120, trigA, keySoundOver, - keySoundClick, 1); + keyShift = new GuiButton(keyShiftImg, keyShiftOverImg, 0, 3, 21 + eurocheck, 3 * 42 + 120, trigA, btnSoundOver, + btnSoundClick, 1); //keyShift = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight()); //keyShift->SetImage(keyShiftImg); //keyShift->SetImageOver(keyShiftOverImg); keyShift->SetLabel(keyShiftText); - //keyShift->SetSoundOver(keySoundOver); - //keyShift->SetSoundClick(keySoundClick); + //keyShift->SetSoundOver(btnSoundOver); + //keyShift->SetSoundClick(btnSoundClick); //keyShift->SetTrigger(trigA); //keyShift->SetPosition(21+eurocheck, 3*42+120);//(21, 3*42+80); //keyShift->SetEffectGrow(); @@ -282,13 +282,13 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, int min, int lang) keySpaceImg = new GuiImage(keyLarge); keySpaceOverImg = new GuiImage(keyLargeOver); - keySpace = new GuiButton(keySpaceImg, keySpaceOverImg, 2, 3, 0 + eurocheck, 4 * 42 + 120, trigA, keySoundOver, - keySoundClick, 1); + keySpace = new GuiButton(keySpaceImg, keySpaceOverImg, 2, 3, 0 + eurocheck, 4 * 42 + 120, trigA, btnSoundOver, + btnSoundClick, 1); //keySpace = new GuiButton(keyLarge->GetWidth(), keyLarge->GetHeight()); //keySpace->SetImage(keySpaceImg); //keySpace->SetImageOver(keySpaceOverImg); - //keySpace->SetSoundOver(keySoundOver); - //keySpace->SetSoundClick(keySoundClick); + //keySpace->SetSoundOver(btnSoundOver); + //keySpace->SetSoundClick(btnSoundClick); //keySpace->SetTrigger(trigA); //keySpace->SetPosition(0+eurocheck, 4*42+120);//(0, 4*42+80); //keySpace->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); @@ -310,12 +310,12 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, int min, int lang) keyTxt[i][j]->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); keyTxt[i][j]->SetPosition(0, -10); keyBtn[i][j] = new GuiButton(keyImg[i][j], keyImgOver[i][j], 0, 3, (j * 42 + 21 * i + 40) + eurocheck, - i * 42 + 120, trigA, keySoundOver, keySoundClick, 1); + i * 42 + 120, trigA, btnSoundOver, btnSoundClick, 1); //keyBtn[i][j] = new GuiButton(key->GetWidth(), key->GetHeight()); //keyBtn[i][j]->SetImage(keyImg[i][j]); //keyBtn[i][j]->SetImageOver(keyImgOver[i][j]); - //keyBtn[i][j]->SetSoundOver(keySoundOver); - //keyBtn[i][j]->SetSoundClick(keySoundClick); + //keyBtn[i][j]->SetSoundOver(btnSoundOver); + //keyBtn[i][j]->SetSoundClick(btnSoundClick); //keyBtn[i][j]->SetTrigger(trigA); keyBtn[i][j]->SetLabel(keyTxt[i][j]); //keyBtn[i][j]->SetPosition((j*42+21*i+40)+eurocheck, i*42+120);//SetPosition(j*42+21*i+40, i*42+80); diff --git a/source/main.cpp b/source/main.cpp index 7f83b14a..4adff58a 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -6,7 +6,6 @@ * libwiigui * Tantric 2009 ***************************************************************************/ - #include #include #include @@ -33,6 +32,9 @@ #include "input.h" #include "filelist.h" #include "FileOperations/fileops.h" +#include "settings/CGameSettings.h" +#include "settings/CGameStatistics.h" +#include "themes/CTheme.h" #include "main.h" #include "fatmounter.h" #include "sys.h" @@ -48,44 +50,29 @@ extern "C" { - extern void __exception_setreload(int t); + void __exception_setreload(int t); } -extern bool geckoinit; - PartList partitions; int main(int argc, char *argv[]) { MEM2_init(48); setlocale(LC_ALL, "en.UTF-8"); - geckoinit = InitGecko(); InitVideo(); + InitGecko(); __exception_setreload(20); printf("\tStarting up\n"); NandTitles.Get(); - //Let's use libogc sd/usb for config loading - printf("\tInitialize sd card\n"); - SDCard_Init(); - printf("\tInitialize usb device\n"); - USBDevice_Init(); - - gettextCleanUp(); - printf("\tLoading configuration..."); - Settings.Load(); - VIDEO_SetWidescreen(Settings.widescreen); - printf("done\n"); - - // Let's load the cIOS now + // Let's try loading some cIOS if (IosLoader::LoadAppCios() < 0) { printf("\n\tWARNING!\n"); printf("\tUSB Loader GX needs unstubbed cIOS 222 v4+ or 249 v9+\n\n"); - printf( - "\tWe cannot determine the versions on your system,\n\tsince you have no patched ios 36 or 236 installed.\n"); + printf("\tWe cannot determine the versions on your system,\n\tsince you have no patched ios 36 or 236 installed.\n"); printf("\tTherefor, if loading of USB Loader GX fails, you\n\tprobably have installed the 4.2 update,\n"); printf("\tand you should go figure out how to get some cios action going on\n\tin your Wii.\n"); @@ -93,7 +80,35 @@ int main(int argc, char *argv[]) sleep(10); Sys_BackToLoader(); } - printf("\tLoaded cIOS = %u (Rev %u)\n", IOS_GetVersion(), IOS_GetRevision()); + + //Let's use libogc sd/usb for config loading + printf("\tInitialize sd card...%s\n", SDCard_Init() < 0 ? "failed" : "done"); + printf("\tInitialize usb device...%s\n", USBDevice_Init_Loop() < 0 ? "failed" : "done"); + + //Load configurations + printf("\tLoading config...%s\n", Settings.Load() ? "done" : "failed"); + printf("\tLoading language...%s\n", Settings.LoadLanguage(Settings.language_path, CONSOLE_DEFAULT) ? "done" : "failed"); + printf("\tLoading game settings...%s\n", GameSettings.Load(Settings.ConfigPath) ? "done" : "failed"); + printf("\tLoading game statistics...%s\n", GameStatistics.Load(Settings.ConfigPath) ? "done" : "failed"); + printf("\tLoading theme...%s\n", Theme.Load(Settings.theme_path) ? "done" : "failed (using default)"); + printf("\tLoading font system...%s\n", SetupDefaultFont(Settings.theme_path) ? "done" : "failed (using default)"); + + VIDEO_SetWidescreen(Settings.widescreen); + + if(Settings.cios != IOS_GetVersion()) + { + // Unmount fat before reloading IOS. + SDCard_deInit(); + USBDevice_deInit(); + + // Loading now the cios setup in the settings + IosLoader::LoadAppCios(); + printf("\tLoaded cIOS = %u (Rev %u)\n", IOS_GetVersion(), IOS_GetRevision()); + + // Remount devices after reloading IOS. + SDCard_Init(); + USBDevice_Init_Loop(); + } //if a ID was passed via args copy it and try to boot it after the partition is mounted //its not really a headless mode. more like hairless. @@ -108,11 +123,6 @@ int main(int argc, char *argv[]) SetupPads(); InitAudio(); - char *fontPath = NULL; - asprintf(&fontPath, "%sfont.ttf", Settings.theme_path); - SetupDefaultFont(fontPath); - free(fontPath); - MainMenu(MENU_DISCLIST); return 0; } diff --git a/source/menu.cpp b/source/menu.cpp index 1fb6398e..470c0b22 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -285,22 +285,16 @@ int MainMenu(int menu) ResumeGui(); - gprintf("Vor bgm\n"); bgMusic = new GuiBGM(bg_music_ogg, bg_music_ogg_size, Settings.volume); - gprintf("new bgm\n"); bgMusic->SetLoop(Settings.musicloopmode); //loop music - gprintf("SetLoop\n"); bgMusic->Load(Settings.ogg_path); - gprintf("Load\n"); bgMusic->Play(); - gprintf("Nach bgm\n"); MountGamePartition(); while (currentMenu != MENU_EXIT) { bgMusic->SetVolume(Settings.volume); - // gprintf("Current menu: %d\n", currentMenu); switch (currentMenu) { diff --git a/source/prompts/PromptWindows.cpp b/source/prompts/PromptWindows.cpp index 0e7eb501..104b0b2b 100644 --- a/source/prompts/PromptWindows.cpp +++ b/source/prompts/PromptWindows.cpp @@ -1724,7 +1724,7 @@ int GameWindowPrompt() ***************************************************************************/ int DiscWait(const char *title, const char *msg, const char *btn1Label, const char *btn2Label, int IsDeviceWait) { - int i = 30, ret = 0; + int ret = 0; u32 cover = 0; GuiWindow promptWindow(472, 320); @@ -1823,18 +1823,20 @@ int DiscWait(const char *title, const char *msg, const char *btn1Label, const ch if (IsDeviceWait) { - while (i >= 0) + time_t starttime = time(0); + time_t timenow = starttime; + do { - VIDEO_WaitVSync(); - timerTxt.SetTextf("%u %s", i, tr( "seconds left" )); - USBDevice_deInit(); - USBDevice_Init(); + gprintf("%i\n", (int) (timenow-starttime)); ret = WBFS_Init(WBFS_DEVICE_USB); if (ret >= 0) break; - i--; - sleep(1); + timerTxt.SetTextf("%i %s", (int) (30-(timenow-starttime)), tr( "seconds left" )); + USBDevice_deInit(); + USBDevice_Init(); + timenow = time(0); } + while (timenow-starttime < 30); } else { diff --git a/source/settings/CSettings.cpp b/source/settings/CSettings.cpp index 56a000d5..421d2fc2 100644 --- a/source/settings/CSettings.cpp +++ b/source/settings/CSettings.cpp @@ -39,6 +39,7 @@ CSettings::CSettings() { CONF_Init(); strcpy(BootDevice, "SD:"); + snprintf(ConfigPath, sizeof(ConfigPath), "%s/config/", BootDevice); this->SetDefault(); } @@ -48,20 +49,19 @@ CSettings::~CSettings() void CSettings::SetDefault() { - snprintf(ConfigPath, sizeof(ConfigPath), "%s/config/GXGlobal.cfg", BootDevice); - snprintf(covers_path, sizeof(covers_path), "%s/images/", BootDevice); - snprintf(covers2d_path, sizeof(covers2d_path), "%s/images/2D/", BootDevice); - snprintf(disc_path, sizeof(disc_path), "%s/images/disc/", BootDevice); - snprintf(titlestxt_path, sizeof(titlestxt_path), "%s/config/", BootDevice); - snprintf(languagefiles_path, sizeof(languagefiles_path), "%s/config/language/", BootDevice); + snprintf(covers_path, sizeof(covers_path), "%simages/", ConfigPath); + snprintf(covers2d_path, sizeof(covers2d_path), "%simages/2D/", ConfigPath); + snprintf(disc_path, sizeof(disc_path), "%simages/disc/", ConfigPath); + snprintf(titlestxt_path, sizeof(titlestxt_path), "%s", ConfigPath); + snprintf(languagefiles_path, sizeof(languagefiles_path), "%slanguage/", ConfigPath); snprintf(update_path, sizeof(update_path), "%s/apps/usbloader_gx/", BootDevice); - snprintf(theme_downloadpath, sizeof(theme_downloadpath), "%s/config/themes/", BootDevice); + snprintf(theme_downloadpath, sizeof(theme_downloadpath), "%sthemes/", ConfigPath); snprintf(homebrewapps_path, sizeof(homebrewapps_path), "%s/apps/", BootDevice); - snprintf(Cheatcodespath, sizeof(Cheatcodespath), "%s/codes/", BootDevice); - snprintf(TxtCheatcodespath, sizeof(TxtCheatcodespath), "%s/txtcodes/", BootDevice); - snprintf(BcaCodepath, sizeof(BcaCodepath), "%s/bca/", BootDevice); - snprintf(WipCodepath, sizeof(WipCodepath), "%s/wip/", BootDevice); - snprintf(theme_path, sizeof(theme_path), "%s/theme/", BootDevice); + snprintf(Cheatcodespath, sizeof(Cheatcodespath), "%scodes/", ConfigPath); + snprintf(TxtCheatcodespath, sizeof(TxtCheatcodespath), "%stxtcodes/", ConfigPath); + snprintf(BcaCodepath, sizeof(BcaCodepath), "%sbca/", ConfigPath); + snprintf(WipCodepath, sizeof(WipCodepath), "%swip/", ConfigPath); + snprintf(theme_path, sizeof(theme_path), "%stheme/", ConfigPath); snprintf(dolpath, sizeof(dolpath), "%s/", BootDevice); strcpy(language_path, ""); strcpy(ogg_path, ""); @@ -132,16 +132,10 @@ bool CSettings::Load() FindConfig(); //! Reset default path variables to the right device SetDefault(); - //! Set up the default path in the classes - //! in case the config file does not exist yet - char tempPath[100]; - snprintf(tempPath, sizeof(tempPath), "%s/config/", BootDevice); - GameStatistics.Load(tempPath); - GameSettings.Load(tempPath); char line[1024]; char filepath[300]; - snprintf(filepath, sizeof(filepath), "%s", ConfigPath); + snprintf(filepath, sizeof(filepath), "%sGXGlobal.cfg", ConfigPath); file = fopen(filepath, "r"); if (!file) return false; @@ -154,17 +148,6 @@ bool CSettings::Load() } fclose(file); - //!The following needs to be moved later - char GameSetPath[200]; - snprintf(GameSetPath, sizeof(GameSetPath), ConfigPath); - char * ptr = strrchr(GameSetPath, '/'); - if(ptr) ptr[1] = 0; - - GameStatistics.Load(GameSetPath); - GameSettings.Load(GameSetPath); - Theme.Load(theme_path); - this->LoadLanguage(this->language_path); - return true; } @@ -182,19 +165,12 @@ bool CSettings::Save() { if (!FindConfig()) return false; - char filedest[100]; - snprintf(filedest, sizeof(filedest), "%s", ConfigPath); + char filedest[300]; + snprintf(filedest, sizeof(filedest), "%sGXGlobal.cfg", ConfigPath); - char * tmppath = strrchr(filedest, '/'); - if (tmppath) - { - tmppath++; - tmppath[0] = '\0'; - } + if(!CreateSubfolder(ConfigPath)) return false; - if(!CreateSubfolder(filedest)) return false; - - file = fopen(ConfigPath, "w"); + file = fopen(filedest, "w"); if (!file) return false; fprintf(file, "# USB Loader global settings file\n"); @@ -572,17 +548,20 @@ bool CSettings::SetSetting(char *name, char *value) bool CSettings::FindConfig() { bool found = false; + char CheckPath[300]; strcpy(BootDevice, "SD:"); for (int i = 0; i < 2; ++i) { if (i == 1) strcpy(BootDevice, "USB:"); - snprintf(ConfigPath, sizeof(ConfigPath), "%s/config/GXGlobal.cfg", BootDevice); - if ((found = CheckFile(ConfigPath))) break; + snprintf(ConfigPath, sizeof(ConfigPath), "%s/apps/usbloader_gx/", BootDevice); + snprintf(CheckPath, sizeof(CheckPath), "%sGXGlobal.cfg", ConfigPath); + if ((found = CheckFile(CheckPath))) break; - snprintf(ConfigPath, sizeof(ConfigPath), "%s/apps/usbloader_gx/GXGlobal.cfg", BootDevice); - if ((found = CheckFile(ConfigPath))) break; + snprintf(ConfigPath, sizeof(ConfigPath), "%s/config/", BootDevice); + snprintf(CheckPath, sizeof(CheckPath), "%sGXGlobal.cfg", ConfigPath); + if ((found = CheckFile(CheckPath))) break; } if (!found) @@ -596,9 +575,8 @@ bool CSettings::FindConfig() if (!found) { snprintf(ConfigPath, sizeof(ConfigPath), "%s/apps/usbloader_gx/", BootDevice); - CreateSubfolder(ConfigPath); - strcat(ConfigPath, "GXGlobal.cfg"); - testFp = fopen(ConfigPath, "wb"); + snprintf(CheckPath, sizeof(CheckPath), "%sGXGlobal.cfg", ConfigPath); + testFp = fopen(CheckPath, "wb"); found = (testFp != NULL); fclose(testFp); } @@ -606,8 +584,8 @@ bool CSettings::FindConfig() { snprintf(ConfigPath, sizeof(ConfigPath), "%s/config/", BootDevice); CreateSubfolder(ConfigPath); - strcat(ConfigPath, "GXGlobal.cfg"); - testFp = fopen(ConfigPath, "wb"); + snprintf(CheckPath, sizeof(CheckPath), "%sGXGlobal.cfg", ConfigPath); + testFp = fopen(CheckPath, "wb"); found = (testFp != NULL); fclose(testFp); } @@ -716,7 +694,7 @@ bool CSettings::LoadLanguage(const char *path, int language) { bool ret = false; - if (language >= 0 || !path) + if (language >= 0 || !path || strlen(path) == 0) { if (language < 0) return false; @@ -785,7 +763,11 @@ bool CSettings::LoadLanguage(const char *path, int language) } ret = gettextLoadLanguage(filepath); - if (ret) strncpy(language_path, filepath, sizeof(language_path)); + if (ret) + { + strncpy(language_path, filepath, sizeof(language_path)); + strcpy(db_language, GetLangCode(language_path)); + } } else if (strlen(path) < 3) { @@ -799,7 +781,6 @@ bool CSettings::LoadLanguage(const char *path, int language) strncpy(language_path, path, sizeof(language_path)); strcpy(db_language, GetLangCode(language_path)); } - } return ret; diff --git a/source/settings/menus/CustomPathsSM.cpp b/source/settings/menus/CustomPathsSM.cpp index d9351244..d8ffa0c0 100644 --- a/source/settings/menus/CustomPathsSM.cpp +++ b/source/settings/menus/CustomPathsSM.cpp @@ -46,6 +46,7 @@ CustomPathsSM::CustomPathsSM() Options->SetName(Idx++, tr("Theme Download Path")); Options->SetName(Idx++, tr("BCA Codes Path")); Options->SetName(Idx++, tr("WIP Patches Path")); + Options->SetName(Idx++, tr("Languagefiles Path")); SetOptionValues(); } @@ -92,6 +93,9 @@ void CustomPathsSM::SetOptionValues() //! Settings: WIP Patches Path Options->SetValue(Idx++, Settings.WipCodepath); + + //! Settings: Languagefiles Path + Options->SetValue(Idx++, Settings.languagefiles_path); } int CustomPathsSM::GetMenuInternal() @@ -215,6 +219,13 @@ int CustomPathsSM::GetMenuInternal() ChangePath(Settings.WipCodepath, sizeof(Settings.WipCodepath)); } + //! Settings: Languagefiles Path + else if (ret == ++Idx) + { + titleTxt->SetText(tr( "Languagefiles Path" )); + ChangePath(Settings.languagefiles_path, sizeof(Settings.languagefiles_path)); + } + //! Global set back of the titleTxt after a change titleTxt->SetText(tr( "Custom Paths" )); SetOptionValues(); diff --git a/source/system/IosLoader.cpp b/source/system/IosLoader.cpp index 91a3f305..28b85488 100644 --- a/source/system/IosLoader.cpp +++ b/source/system/IosLoader.cpp @@ -44,17 +44,20 @@ bool IosLoader::IsWaninkokoIOS(s32 ios) */ s32 IosLoader::LoadAppCios() { + u32 activeCios = IOS_GetVersion(); s32 ret = -1; + // We have what we need + if((int) activeCios == Settings.cios) + return 0; + // Unmount fat before reloading IOS. SDCard_deInit(); USBDevice_deInit(); - __io_usbstorage.shutdown(); // libogc usb - __io_usbstorage2.shutdown(); // cios usb - USB_Deinitialize(); // main usb handle + __io_usbstorage.shutdown(); + USB_Deinitialize(); - u32 ciosLoadPriority[] = { 250, 249, 222, Settings.cios }; // Descending. - u32 activeCios = IOS_GetVersion(); + u32 ciosLoadPriority[] = { 250, 222, 249, Settings.cios }; // Descending. for (u8 i = (sizeof(ciosLoadPriority)/sizeof(ciosLoadPriority[0]))-1; i >= 0; i--) @@ -75,11 +78,6 @@ s32 IosLoader::LoadAppCios() } } - // Remount devices after reloading IOS. - SDCard_Init(); - USBDevice_Init(); - Disc_Init(); - return ret; }