diff --git a/include/arm11/menu/menu_fb3ds.h b/include/arm11/menu/menu_fb3ds.h index f64dde7..d7bfc59 100644 --- a/include/arm11/menu/menu_fb3ds.h +++ b/include/arm11/menu/menu_fb3ds.h @@ -65,6 +65,7 @@ #define DESC_SPLASH_CUSTOM "Select a custom splash. This is compatible with Luma 3DS format splash screens." #define DESC_SPLASH_DEFAULT "Use default fastboot3DS splash screen." +#define DESC_SPLASH_DELAY "Change splash display duration." #define DESC_CHANGE_SPLASH "Change fastboot3ds splash screen. Will only be displayed in normal and quick boot modes." #define DESC_NAND_BACKUP "Backup current NAND to a file." @@ -134,10 +135,11 @@ } }, { // 4 - "Splash Screen Setup", 2, &menuPresetSplashConfig, MENU_FLAG_CONFIG, + "Splash Screen Setup", 3, &menuPresetSplashConfig, MENU_FLAG_CONFIG, { - { "Use custom splash...", DESC_SPLASH_CUSTOM, &menuSetSplash, 1 }, - { "Use default splash", DESC_SPLASH_DEFAULT, &menuSetSplash, 0 } + { "Use custom splash...", DESC_SPLASH_CUSTOM, &menuSetSplash, 1 }, + { "Use default splash", DESC_SPLASH_DEFAULT, &menuSetSplash, 0 }, + { "Set splash duration...", DESC_SPLASH_DELAY, &menuSetSplashDuration, 0 } } }, { // 5 diff --git a/include/arm11/menu/menu_func.h b/include/arm11/menu/menu_func.h index 5c25d2f..097c983 100644 --- a/include/arm11/menu/menu_func.h +++ b/include/arm11/menu/menu_func.h @@ -27,6 +27,8 @@ #define NAND_BACKUP_PATH "sdmc:/3DS" // NAND backups standard path #define DEVICE_BUFSIZE (((REG_CFG11_SOCINFO & 2) ? 1024 : 512) * 1024) // 1024 / 512 KiB #define PROGRESS_WIDTH 20 +#define SPLASH_DEFAULT_MSEC 1000 +#define VBLANK_APPROX_MSEC 16 @@ -48,6 +50,7 @@ u32 menuReturn(PrintConsole* term_con, PrintConsole* menu_con, u32 param); u32 menuSetBootMode(PrintConsole* term_con, PrintConsole* menu_con, u32 param); u32 menuSetSplash(PrintConsole* term_con, PrintConsole* menu_con, u32 param); +u32 menuSetSplashDuration(PrintConsole* term_con, PrintConsole* menu_con, u32 param); u32 menuSwitchFcramBoot(PrintConsole* term_con, PrintConsole* menu_con, u32 param); u32 menuSetupBootSlot(PrintConsole* term_con, PrintConsole* menu_con, u32 param); u32 menuSetupBootKeys(PrintConsole* term_con, PrintConsole* menu_con, u32 param); diff --git a/source/arm11/main.c b/source/arm11/main.c index b9eef9f..80a0738 100644 --- a/source/arm11/main.c +++ b/source/arm11/main.c @@ -177,7 +177,17 @@ if (splash_wait) { - for (u32 i = 0; i < 64; i++) // VBlank * 64 + u32 dmsec = SPLASH_DEFAULT_MSEC; + if (configDataExist(KSplashDuration)) + { + // prevent bad splash delays + s32 dkey = *(s32*) configGetData(KSplashDuration); + dmsec = (dkey < 500) ? 500 : (dkey) > 10000 ? 10000 : (u32) dkey; + } + + // convert msecs to vblanks and wait for the specified amount + u32 dvblank = (dmsec + (VBLANK_APPROX_MSEC-1)) / VBLANK_APPROX_MSEC; + for (u32 i = 0; i < dvblank; i++) { GFX_waitForEvent(GFX_EVENT_PDC0, true); hidScanInput(); diff --git a/source/arm11/menu/menu_func.c b/source/arm11/menu/menu_func.c index 83a245b..5b3bb31 100644 --- a/source/arm11/menu/menu_func.c +++ b/source/arm11/menu/menu_func.c @@ -104,7 +104,9 @@ u32 menuPresetSplashConfig(void) { - return configDataExist(KSplashScreen) ? (1 << 0) : (1 << 1); + u32 res = configDataExist(KSplashScreen) ? (1 << 0) : (1 << 1); + if (configDataExist(KSplashDuration)) res |= (1 << 2); + return res; } u32 menuPresetSlotConfig(u32 slot) @@ -312,6 +314,77 @@ return res; } +u32 menuSetSplashDuration(PrintConsole* term_con, PrintConsole* menu_con, u32 param) +{ + (void) menu_con; + (void) param; + s32 duration = SPLASH_DEFAULT_MSEC; + u32 dbutton_cooldown = 0; + + if (configDataExist(KSplashDuration)) + { + duration = *(s32*) configGetData(KSplashDuration); + duration -= (duration % 250); // so that duration is a multiple of 250 + } + + consoleSelect(term_con); + consoleClear(); + + while (true) + { + u32 kDown = 0; + u32 kHeld = 0; + + // make sure duration stays within boundaries + if (duration < 500) duration = 500; + else if (duration > 10000) duration = 10000; + + // update screen + ee_printf_screen_center("Change splash duration via arrow keys.\nPress [A] to confirm, [B] or HOME] to cancel.\n \nSplash duration: %li msec", duration); + updateScreens(); + + // directional button cooldown + for (u32 i = dbutton_cooldown; i > 0; i--) + { + hidScanInput(); + GFX_waitForEvent(GFX_EVENT_PDC0, true); // VBlank + if (!(hidKeysHeld() & (KEY_DDOWN|KEY_DUP|KEY_DLEFT|KEY_DRIGHT))) + break; + } + dbutton_cooldown = 0; + + do + { + GFX_waitForEvent(GFX_EVENT_PDC0, true); + + if(hidGetPowerButton(false)) // handle power button + return MENU_FAIL; + + hidScanInput(); + kDown = hidKeysDown(); + kHeld = hidKeysHeld(); + if (kDown & (KEY_SHELL)) sleepmode(); + else if (kDown & (KEY_B|KEY_HOME)) return MENU_OK; + else if (kDown & KEY_A) break; + } + while (!(kHeld & (KEY_DRIGHT|KEY_DLEFT|KEY_DUP|KEY_DDOWN))); + + // steps: left/right 250ms, up/down 1000ms + // done if [A] button is detected + if (kDown & KEY_A) break; + else if (kHeld & KEY_DRIGHT) duration += 250; + else if (kHeld & KEY_DLEFT) duration -= 250; + else if (kHeld & KEY_DUP) duration += 1000; + else if (kHeld & KEY_DDOWN) duration -= 1000; + + // set dbutton cooldown + dbutton_cooldown = 10; + } + + // set config key, return + return(configSetKeyData(KSplashDuration, &duration)) ? MENU_OK : MENU_FAIL; +} + u32 menuSetupBootSlot(PrintConsole* term_con, PrintConsole* menu_con, u32 param) { const u32 slot = param & 0xF;