mirror of
https://github.com/wiiu-env/AutobootModule.git
synced 2024-11-25 12:06:58 +01:00
Improve disc launching in quick start menu
This commit is contained in:
parent
603478ccc6
commit
803f2ca80b
@ -1,4 +1,4 @@
|
|||||||
FROM ghcr.io/wiiu-env/devkitppc:20221228
|
FROM ghcr.io/wiiu-env/devkitppc:20230402
|
||||||
|
|
||||||
COPY --from=ghcr.io/wiiu-env/libmocha:20220919 /artifacts $DEVKITPRO
|
COPY --from=ghcr.io/wiiu-env/libmocha:20220919 /artifacts $DEVKITPRO
|
||||||
|
|
||||||
|
@ -3,15 +3,19 @@
|
|||||||
#include "DrawUtils.h"
|
#include "DrawUtils.h"
|
||||||
#include "icon_png.h"
|
#include "icon_png.h"
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
|
#include "utils.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include <coreinit/debug.h>
|
#include <coreinit/debug.h>
|
||||||
|
#include <coreinit/mcp.h>
|
||||||
#include <coreinit/screen.h>
|
#include <coreinit/screen.h>
|
||||||
|
#include <coreinit/thread.h>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <gx2/state.h>
|
#include <gx2/state.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <nn/act/client_cpp.h>
|
#include <nn/act/client_cpp.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <sysapp/title.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <vpad/input.h>
|
#include <vpad/input.h>
|
||||||
|
|
||||||
@ -414,3 +418,111 @@ void handleUpdateWarningScreen() {
|
|||||||
|
|
||||||
free(screenBuffer);
|
free(screenBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool handleDiscInsertScreen(uint64_t expectedTitleId, uint64_t *titleIdToLaunch) {
|
||||||
|
if (titleIdToLaunch == nullptr) {
|
||||||
|
DEBUG_FUNCTION_LINE_ERR("titleIdToLaunch is NULL");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SYSCheckTitleExists(expectedTitleId)) {
|
||||||
|
*titleIdToLaunch = expectedTitleId;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto result = false;
|
||||||
|
auto screenBuffer = DrawUtils::InitOSScreen();
|
||||||
|
if (!screenBuffer) {
|
||||||
|
OSFatal("Failed to alloc memory for screen");
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t tvBufferSize = OSScreenGetBufferSizeEx(SCREEN_TV);
|
||||||
|
uint32_t drcBufferSize = OSScreenGetBufferSizeEx(SCREEN_DRC);
|
||||||
|
|
||||||
|
DrawUtils::initBuffers(screenBuffer, tvBufferSize, (void *) ((uint32_t) screenBuffer + tvBufferSize), drcBufferSize);
|
||||||
|
if (!DrawUtils::initFont()) {
|
||||||
|
OSFatal("Failed to init font");
|
||||||
|
}
|
||||||
|
DrawUtils::beginDraw();
|
||||||
|
DrawUtils::clear(COLOR_BACKGROUND);
|
||||||
|
DrawUtils::endDraw();
|
||||||
|
|
||||||
|
uint64_t titleIdOfDisc = 0;
|
||||||
|
bool discInserted;
|
||||||
|
|
||||||
|
uint32_t attempt = 0;
|
||||||
|
while (!GetTitleIdOfDisc(&titleIdOfDisc, &discInserted)) {
|
||||||
|
if (++attempt > 20) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
OSSleepTicks(OSMillisecondsToTicks(100));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wrongDiscInserted = discInserted && (titleIdOfDisc != expectedTitleId);
|
||||||
|
|
||||||
|
if (discInserted && !wrongDiscInserted) {
|
||||||
|
*titleIdToLaunch = expectedTitleId;
|
||||||
|
DrawUtils::deinitFont();
|
||||||
|
free(screenBuffer);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawUtils::beginDraw();
|
||||||
|
DrawUtils::clear(COLOR_BACKGROUND);
|
||||||
|
DrawUtils::setFontColor(COLOR_TEXT);
|
||||||
|
|
||||||
|
DrawUtils::setFontSize(48);
|
||||||
|
|
||||||
|
if (wrongDiscInserted) {
|
||||||
|
const char *title = "The disc inserted into the console";
|
||||||
|
DrawUtils::print(SCREEN_WIDTH / 2 + DrawUtils::getTextWidth(title) / 2, 40 + 48 + 8, title, true);
|
||||||
|
title = "is for a different software title.";
|
||||||
|
DrawUtils::print(SCREEN_WIDTH / 2 + DrawUtils::getTextWidth(title) / 2, 40 + 2 * 48 + 8, title, true);
|
||||||
|
title = "Please change the disc.";
|
||||||
|
DrawUtils::print(SCREEN_WIDTH / 2 + DrawUtils::getTextWidth(title) / 2, 40 + 4 * 48 + 8, title, true);
|
||||||
|
} else {
|
||||||
|
const char *title = "Please insert a disc.";
|
||||||
|
DrawUtils::print(SCREEN_WIDTH / 2 + DrawUtils::getTextWidth(title) / 2, 40 + 48 + 8, title, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawUtils::setFontSize(18);
|
||||||
|
const char *exitHints = "\ue000 Launch Wii U Menu";
|
||||||
|
DrawUtils::print(SCREEN_WIDTH / 2 + DrawUtils::getTextWidth(exitHints) / 2, SCREEN_HEIGHT - 8, exitHints, true);
|
||||||
|
|
||||||
|
DrawUtils::endDraw();
|
||||||
|
|
||||||
|
// When an unexpected disc was inserted we need to eject it first.
|
||||||
|
bool allowDisc = !wrongDiscInserted;
|
||||||
|
while (true) {
|
||||||
|
VPADStatus vpad{};
|
||||||
|
VPADRead(VPAD_CHAN_0, &vpad, 1, nullptr);
|
||||||
|
|
||||||
|
if (vpad.trigger & VPAD_BUTTON_A) {
|
||||||
|
result = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetTitleIdOfDisc(&titleIdOfDisc, &discInserted)) {
|
||||||
|
if (discInserted) {
|
||||||
|
if (!allowDisc) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
*titleIdToLaunch = titleIdOfDisc;
|
||||||
|
DEBUG_FUNCTION_LINE("Disc inserted! %016llX", titleIdOfDisc);
|
||||||
|
result = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
allowDisc = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawUtils::clear(COLOR_BLACK);
|
||||||
|
DrawUtils::endDraw();
|
||||||
|
|
||||||
|
DrawUtils::deinitFont();
|
||||||
|
|
||||||
|
free(screenBuffer);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
@ -36,3 +36,5 @@ int32_t handleMenuScreen(std::string &configPath, int32_t autobootOptionInput, c
|
|||||||
nn::act::SlotNo handleAccountSelectScreen(const std::vector<std::shared_ptr<AccountInfo>> &data);
|
nn::act::SlotNo handleAccountSelectScreen(const std::vector<std::shared_ptr<AccountInfo>> &data);
|
||||||
|
|
||||||
void handleUpdateWarningScreen();
|
void handleUpdateWarningScreen();
|
||||||
|
|
||||||
|
bool handleDiscInsertScreen(uint64_t expectedTitleId, uint64_t *titleIdToLaunch);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
|
||||||
#include "BootUtils.h"
|
#include "BootUtils.h"
|
||||||
|
#include "MenuUtils.h"
|
||||||
#include "QuickStartUtils.h"
|
#include "QuickStartUtils.h"
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
|
|
||||||
@ -124,8 +125,6 @@ bool getQuickBoot() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_FUNCTION_LINE("Trying to autoboot for titleId %016llX", info.titleId);
|
|
||||||
|
|
||||||
if (info.titleId == 0x0005001010040000L ||
|
if (info.titleId == 0x0005001010040000L ||
|
||||||
info.titleId == 0x0005001010040100L ||
|
info.titleId == 0x0005001010040100L ||
|
||||||
info.titleId == 0x0005001010040200L) {
|
info.titleId == 0x0005001010040200L) {
|
||||||
@ -207,21 +206,36 @@ bool getQuickBoot() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!SYSCheckTitleExists(info.titleId)) {
|
uint64_t titleIdToLaunch = info.titleId;
|
||||||
DEBUG_FUNCTION_LINE("Title %016llX doesn't exist", info.titleId);
|
|
||||||
return false;
|
switch (info.mediaType) {
|
||||||
|
case nn::sl::NN_SL_MEDIA_TYPE_ODD: {
|
||||||
|
if (!handleDiscInsertScreen(titleIdToLaunch, &titleIdToLaunch)) {
|
||||||
|
DEBUG_FUNCTION_LINE("Launch Wii U Menu!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
if (!SYSCheckTitleExists(titleIdToLaunch)) {
|
||||||
|
DEBUG_FUNCTION_LINE("Title %016llX doesn't exist", titleIdToLaunch);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MCPTitleListType titleInfo;
|
MCPTitleListType titleInfo;
|
||||||
int32_t handle = MCP_Open();
|
int32_t handle = MCP_Open();
|
||||||
auto err = MCP_GetTitleInfo(handle, info.titleId, &titleInfo);
|
auto err = MCP_GetTitleInfo(handle, titleIdToLaunch, &titleInfo);
|
||||||
MCP_Close(handle);
|
MCP_Close(handle);
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
|
DEBUG_FUNCTION_LINE("Launch %016llX", titleIdToLaunch);
|
||||||
ACPAssignTitlePatch(&titleInfo);
|
ACPAssignTitlePatch(&titleInfo);
|
||||||
_SYSLaunchTitleWithStdArgsInNoSplash(info.titleId, nullptr);
|
_SYSLaunchTitleWithStdArgsInNoSplash(titleIdToLaunch, nullptr);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEBUG_FUNCTION_LINE("Launch Wii U Menu!");
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
DEBUG_FUNCTION_LINE("No quick start");
|
DEBUG_FUNCTION_LINE("No quick start");
|
||||||
|
33
source/utils.cpp
Normal file
33
source/utils.cpp
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#include "logger.h"
|
||||||
|
#include <coreinit/mcp.h>
|
||||||
|
|
||||||
|
bool GetTitleIdOfDisc(uint64_t *titleId, bool *discPresent) {
|
||||||
|
if (discPresent) {
|
||||||
|
*discPresent = false;
|
||||||
|
}
|
||||||
|
alignas(0x40) MCPTitleListType titles[4];
|
||||||
|
uint32_t count = 0;
|
||||||
|
|
||||||
|
int handle = MCP_Open();
|
||||||
|
if (handle < 0) {
|
||||||
|
DEBUG_FUNCTION_LINE_ERR("MCP_Open failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
auto res = MCP_TitleListByDeviceType(handle, MCP_DEVICE_TYPE_ODD, &count, titles, sizeof(titles));
|
||||||
|
MCP_Close(handle);
|
||||||
|
|
||||||
|
if (res >= 0 && count > 0) {
|
||||||
|
if (discPresent) {
|
||||||
|
*discPresent = true;
|
||||||
|
}
|
||||||
|
for (uint32_t i = 0; i < count; i++) {
|
||||||
|
if ((titles[i].titleId & 0xFFFFFFFF00000000L) == (0x0005000000000000)) {
|
||||||
|
if (titleId) {
|
||||||
|
*titleId = titles[i].titleId;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
@ -18,3 +18,5 @@ template<class T, class... Args>
|
|||||||
std::shared_ptr<T> make_shared_nothrow(Args &&...args) noexcept(noexcept(T(std::forward<Args>(args)...))) {
|
std::shared_ptr<T> make_shared_nothrow(Args &&...args) noexcept(noexcept(T(std::forward<Args>(args)...))) {
|
||||||
return std::shared_ptr<T>(new (std::nothrow) T(std::forward<Args>(args)...));
|
return std::shared_ptr<T>(new (std::nothrow) T(std::forward<Args>(args)...));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GetTitleIdOfDisc(uint64_t *titleId, bool *discPresent);
|
Loading…
Reference in New Issue
Block a user