From 8006ec63b0ea45448d85b708dbfb2155a3ab21b9 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Fri, 4 Aug 2023 19:09:43 +0300 Subject: [PATCH 01/11] [Applets] Add initial stuff --- CMakeLists.txt | 6 ++++-- include/applets/applet.hpp | 16 ++++++++++++++++ include/applets/mii_selector.hpp | 8 ++++++++ src/core/applets/applet.cpp | 0 src/core/applets/mii_selector.cpp | 5 +++++ 5 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 include/applets/applet.hpp create mode 100644 include/applets/mii_selector.hpp create mode 100644 src/core/applets/applet.cpp create mode 100644 src/core/applets/mii_selector.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index c5725ff0..087558d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -130,6 +130,7 @@ set(FS_SOURCE_FILES src/core/fs/archive_self_ncch.cpp src/core/fs/archive_save_d src/core/fs/ivfc.cpp ) +set(APPLET_SOURCE_FILES src/core/applets/applet.cpp src/core/applets/mii_selector.cpp) set(RENDERER_SW_SOURCE_FILES src/core/renderer_sw/renderer_sw.cpp) set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/termcolor.hpp @@ -157,7 +158,7 @@ set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/termcolor.hpp include/crypto/aes_engine.hpp include/metaprogramming.hpp include/PICA/pica_vertex.hpp include/config.hpp include/services/ir_user.hpp include/http_server.hpp include/cheats.hpp include/action_replay.hpp include/renderer_sw/renderer_sw.hpp include/compiler_builtins.hpp - include/fs/romfs.hpp include/fs/ivfc.hpp + include/fs/romfs.hpp include/fs/ivfc.hpp include/applets/applet.hpp include/applets/mii_selector.hpp ) set(THIRD_PARTY_SOURCE_FILES third_party/imgui/imgui.cpp @@ -175,6 +176,7 @@ source_group("Source Files\\Core\\Filesystem" FILES ${FS_SOURCE_FILES}) source_group("Source Files\\Core\\Kernel" FILES ${KERNEL_SOURCE_FILES}) source_group("Source Files\\Core\\Loader" FILES ${LOADER_SOURCE_FILES}) source_group("Source Files\\Core\\Services" FILES ${SERVICE_SOURCE_FILES}) +source_group("Source Files\\Core\\Applets" FILES ${APPLET_SOURCE_FILES}) source_group("Source Files\\Core\\PICA" FILES ${PICA_SOURCE_FILES}) source_group("Source Files\\Core\\Software Renderer" FILES ${RENDERER_SW_SOURCE_FILES}) source_group("Source Files\\Third Party" FILES ${THIRD_PARTY_SOURCE_FILES}) @@ -236,7 +238,7 @@ endif() source_group("Header Files\\Core" FILES ${HEADER_FILES}) set(ALL_SOURCES ${SOURCE_FILES} ${FS_SOURCE_FILES} ${CRYPTO_SOURCE_FILES} ${KERNEL_SOURCE_FILES} ${LOADER_SOURCE_FILES} ${SERVICE_SOURCE_FILES} - ${RENDERER_SW_SOURCE_FILES} ${PICA_SOURCE_FILES} ${THIRD_PARTY_SOURCE_FILES} ${HEADER_FILES}) + ${APPLET_SOURCE_FILES} ${RENDERER_SW_SOURCE_FILES} ${PICA_SOURCE_FILES} ${THIRD_PARTY_SOURCE_FILES} ${HEADER_FILES}) if(ENABLE_OPENGL) # Add the OpenGL source files to ALL_SOURCES diff --git a/include/applets/applet.hpp b/include/applets/applet.hpp new file mode 100644 index 00000000..9f31f4e4 --- /dev/null +++ b/include/applets/applet.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "helpers.hpp" +#include "memory.hpp" +#include "result/result.hpp" + +class AppletBase { + Memory& mem; + + public: + // Called by APT::StartLibraryApplet and similar + virtual Result::HorizonResult start() = 0; + virtual void reset() = 0; + + AppletBase(Memory& mem) : mem(mem) {} +}; \ No newline at end of file diff --git a/include/applets/mii_selector.hpp b/include/applets/mii_selector.hpp new file mode 100644 index 00000000..fb0f3325 --- /dev/null +++ b/include/applets/mii_selector.hpp @@ -0,0 +1,8 @@ +#include "applets/applet.hpp" + +class MiiSelectorApplet final : public AppletBase { + virtual Result::HorizonResult start() override; + virtual void reset() override; + + MiiSelectorApplet(Memory& memory) : AppletBase(memory) {} +}; \ No newline at end of file diff --git a/src/core/applets/applet.cpp b/src/core/applets/applet.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/core/applets/mii_selector.cpp b/src/core/applets/mii_selector.cpp new file mode 100644 index 00000000..f35f8f0f --- /dev/null +++ b/src/core/applets/mii_selector.cpp @@ -0,0 +1,5 @@ +#include "applets/mii_selector.hpp" + +void MiiSelectorApplet::reset() {} + +Result::HorizonResult MiiSelectorApplet::start() { return Result::Success; } \ No newline at end of file From 412fba079e9c02e3db00c302004cb3abd6f2ce44 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Fri, 4 Aug 2023 19:18:46 +0300 Subject: [PATCH 02/11] Add applet list --- include/applets/applet.hpp | 54 ++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/include/applets/applet.hpp b/include/applets/applet.hpp index 9f31f4e4..4be0868d 100644 --- a/include/applets/applet.hpp +++ b/include/applets/applet.hpp @@ -4,13 +4,51 @@ #include "memory.hpp" #include "result/result.hpp" -class AppletBase { - Memory& mem; +namespace Applets { + enum class AppletIDs : u32 { + None = 0, + SysAppletMask = 0x100, + HomeMenu = 0x101, + AltMenu = 0x103, + Camera = 0x110, + Friends = 0x112, + GameNotes = 0x113, + Browser = 0x114, + InstructionManual = 0x115, + Notifications = 0x116, + Miiverse = 0x117, + MiiversePosting = 0x118, + AmiiboSettings = 0x119, + SysLibraryAppletMask = 0x200, + SoftwareKeyboard = 0x201, + MiiSelector = 0x202, + PNote = 0x204, // TODO: What dis? + SNote = 0x205, // What is this too? + ErrDisp = 0x206, + EshopMint = 0x207, + CirclePadProCalib = 0x208, + Notepad = 0x209, + Application = 0x300, + EshopTiger = 0x301, + LibraryAppletMask = 0x400, + SoftwareKeyboard2 = 0x401, + MiiSelector2 = 0x402, + Pnote2 = 0x404, + SNote2 = 0x405, + ErrDisp2 = 0x406, + EshopMint2 = 0x407, + CirclePadProCalib2 = 0x408, + Notepad2 = 0x409, + }; - public: - // Called by APT::StartLibraryApplet and similar - virtual Result::HorizonResult start() = 0; - virtual void reset() = 0; + class AppletBase { + Memory& mem; - AppletBase(Memory& mem) : mem(mem) {} -}; \ No newline at end of file + public: + // Called by APT::StartLibraryApplet and similar + virtual Result::HorizonResult start() = 0; + virtual void reset() = 0; + + AppletBase(Memory& mem) : mem(mem) {} + }; +} // namespace Applets \ No newline at end of file From 17724e77ca3970ad747d45dc463541af86a7273a Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Fri, 4 Aug 2023 19:26:12 +0300 Subject: [PATCH 03/11] More appleting --- include/applets/mii_selector.hpp | 13 ++++++++----- include/services/apt.hpp | 7 ++++++- src/core/applets/mii_selector.cpp | 3 ++- src/core/services/apt.cpp | 2 ++ 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/include/applets/mii_selector.hpp b/include/applets/mii_selector.hpp index fb0f3325..8555b5c1 100644 --- a/include/applets/mii_selector.hpp +++ b/include/applets/mii_selector.hpp @@ -1,8 +1,11 @@ #include "applets/applet.hpp" -class MiiSelectorApplet final : public AppletBase { - virtual Result::HorizonResult start() override; - virtual void reset() override; +namespace Applets { + class MiiSelectorApplet final : public AppletBase { + public: + virtual Result::HorizonResult start() override; + virtual void reset() override; - MiiSelectorApplet(Memory& memory) : AppletBase(memory) {} -}; \ No newline at end of file + MiiSelectorApplet(Memory& memory) : AppletBase(memory) {} + }; +} // namespace Applets \ No newline at end of file diff --git a/include/services/apt.hpp b/include/services/apt.hpp index 56bf3083..187fd22f 100644 --- a/include/services/apt.hpp +++ b/include/services/apt.hpp @@ -6,6 +6,8 @@ #include "memory.hpp" #include "result/result.hpp" +#include "applets/mii_selector.hpp" + // Yay, more circular dependencies class Kernel; @@ -24,6 +26,9 @@ class APTService { ConsoleModel model = ConsoleModel::Old3DS; + // Applets here + Applets::MiiSelectorApplet miiSelector; + MAKE_LOG_FUNCTION(log, aptLogger) // Service commands @@ -67,7 +72,7 @@ class APTService { u32 screencapPostPermission; public: - APTService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel) {} + APTService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel), miiSelector(mem) {} void reset(); void handleSyncRequest(u32 messagePointer); }; \ No newline at end of file diff --git a/src/core/applets/mii_selector.cpp b/src/core/applets/mii_selector.cpp index f35f8f0f..04658736 100644 --- a/src/core/applets/mii_selector.cpp +++ b/src/core/applets/mii_selector.cpp @@ -1,5 +1,6 @@ #include "applets/mii_selector.hpp" -void MiiSelectorApplet::reset() {} +using namespace Applets; +void MiiSelectorApplet::reset() {} Result::HorizonResult MiiSelectorApplet::start() { return Result::Success; } \ No newline at end of file diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp index becf637f..48c635d4 100644 --- a/src/core/services/apt.cpp +++ b/src/core/services/apt.cpp @@ -58,6 +58,8 @@ void APTService::reset() { lockHandle = std::nullopt; notificationEvent = std::nullopt; resumeEvent = std::nullopt; + + miiSelector.reset(); } void APTService::handleSyncRequest(u32 messagePointer) { From 77dff17107d76a65cbd451b5e4b9afdacde2579c Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Fri, 4 Aug 2023 20:32:09 +0300 Subject: [PATCH 04/11] I hate this --- include/applets/applet.hpp | 72 ++++++++++++++++++----------------- include/services/apt.hpp | 5 +++ include/services/gsp_gpu.hpp | 2 + src/core/services/apt.cpp | 41 +++++++++++++++++++- src/core/services/gsp_gpu.cpp | 23 ++++++++++- 5 files changed, 105 insertions(+), 38 deletions(-) diff --git a/include/applets/applet.hpp b/include/applets/applet.hpp index 4be0868d..5aeef718 100644 --- a/include/applets/applet.hpp +++ b/include/applets/applet.hpp @@ -5,41 +5,43 @@ #include "result/result.hpp" namespace Applets { - enum class AppletIDs : u32 { - None = 0, - SysAppletMask = 0x100, - HomeMenu = 0x101, - AltMenu = 0x103, - Camera = 0x110, - Friends = 0x112, - GameNotes = 0x113, - Browser = 0x114, - InstructionManual = 0x115, - Notifications = 0x116, - Miiverse = 0x117, - MiiversePosting = 0x118, - AmiiboSettings = 0x119, - SysLibraryAppletMask = 0x200, - SoftwareKeyboard = 0x201, - MiiSelector = 0x202, - PNote = 0x204, // TODO: What dis? - SNote = 0x205, // What is this too? - ErrDisp = 0x206, - EshopMint = 0x207, - CirclePadProCalib = 0x208, - Notepad = 0x209, - Application = 0x300, - EshopTiger = 0x301, - LibraryAppletMask = 0x400, - SoftwareKeyboard2 = 0x401, - MiiSelector2 = 0x402, - Pnote2 = 0x404, - SNote2 = 0x405, - ErrDisp2 = 0x406, - EshopMint2 = 0x407, - CirclePadProCalib2 = 0x408, - Notepad2 = 0x409, - }; + namespace AppletIDs { + enum : u32 { + None = 0, + SysAppletMask = 0x100, + HomeMenu = 0x101, + AltMenu = 0x103, + Camera = 0x110, + Friends = 0x112, + GameNotes = 0x113, + Browser = 0x114, + InstructionManual = 0x115, + Notifications = 0x116, + Miiverse = 0x117, + MiiversePosting = 0x118, + AmiiboSettings = 0x119, + SysLibraryAppletMask = 0x200, + SoftwareKeyboard = 0x201, + MiiSelector = 0x202, + PNote = 0x204, // TODO: What dis? + SNote = 0x205, // What is this too? + ErrDisp = 0x206, + EshopMint = 0x207, + CirclePadProCalib = 0x208, + Notepad = 0x209, + Application = 0x300, + EshopTiger = 0x301, + LibraryAppletMask = 0x400, + SoftwareKeyboard2 = 0x401, + MiiSelector2 = 0x402, + Pnote2 = 0x404, + SNote2 = 0x405, + ErrDisp2 = 0x406, + EshopMint2 = 0x407, + CirclePadProCalib2 = 0x408, + Notepad2 = 0x409, + }; + } class AppletBase { Memory& mem; diff --git a/include/services/apt.hpp b/include/services/apt.hpp index 187fd22f..df98c825 100644 --- a/include/services/apt.hpp +++ b/include/services/apt.hpp @@ -28,6 +28,7 @@ class APTService { // Applets here Applets::MiiSelectorApplet miiSelector; + Applets::AppletBase* getApplet(u32 id); MAKE_LOG_FUNCTION(log, aptLogger) @@ -38,17 +39,21 @@ class APTService { void checkNew3DS(u32 messagePointer); void checkNew3DSApp(u32 messagePointer); void enable(u32 messagePointer); + void getAppletInfo(u32 messagePointer); void getSharedFont(u32 messagePointer); void getWirelessRebootInfo(u32 messagePointer); void glanceParameter(u32 messagePointer); void initialize(u32 messagePointer); void inquireNotification(u32 messagePointer); + void isRegistered(u32 messagePointer); void notifyToWait(u32 messagePointer); void preloadLibraryApplet(u32 messagePointer); void receiveParameter(u32 messagePointer); void replySleepQuery(u32 messagePointer); void setApplicationCpuTimeLimit(u32 messagePointer); void setScreencapPostPermission(u32 messagePointer); + void prepareToStartLibraryApplet(u32 messagePointer); + void startLibraryApplet(u32 messagePointer); void theSmashBrosFunction(u32 messagePointer); // Percentage of the syscore available to the application, between 5% and 89% diff --git a/include/services/gsp_gpu.hpp b/include/services/gsp_gpu.hpp index 0757ea2d..c533cb6d 100644 --- a/include/services/gsp_gpu.hpp +++ b/include/services/gsp_gpu.hpp @@ -43,7 +43,9 @@ class GPUService { // Service commands void acquireRight(u32 messagePointer); void flushDataCache(u32 messagePointer); + void importDisplayCaptureInfo(u32 messagePointer); void registerInterruptRelayQueue(u32 messagePointer); + void saveVramSysArea(u32 messagePointer); void setAxiConfigQoSMode(u32 messagePointer); void setInternalPriorities(u32 messagePointer); void setLCDForceBlack(u32 messagePointer); diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp index 48c635d4..e2dff928 100644 --- a/src/core/services/apt.cpp +++ b/src/core/services/apt.cpp @@ -7,10 +7,13 @@ namespace APTCommands { GetLockHandle = 0x00010040, Initialize = 0x00020080, Enable = 0x00030040, + GetAppletInfo = 0x00060040, + IsRegistered = 0x00090040, InquireNotification = 0x000B0040, ReceiveParameter = 0x000D0080, GlanceParameter = 0x000E0080, PreloadLibraryApplet = 0x00160040, + StartLibraryApplet = 0x001E0084, ReplySleepQuery = 0x003E0080, NotifyToWait = 0x00430040, GetSharedFont = 0x00440000, @@ -62,6 +65,17 @@ void APTService::reset() { miiSelector.reset(); } +Applets::AppletBase* APTService::getApplet(u32 id) { + using namespace Applets; + + switch (id) { + case AppletIDs::MiiSelector: + case AppletIDs::MiiSelector2: return &miiSelector; + + default: return nullptr; + } +} + void APTService::handleSyncRequest(u32 messagePointer) { const u32 command = mem.read32(messagePointer); switch (command) { @@ -69,9 +83,11 @@ void APTService::handleSyncRequest(u32 messagePointer) { case APTCommands::CheckNew3DS: checkNew3DS(messagePointer); break; case APTCommands::CheckNew3DSApp: checkNew3DSApp(messagePointer); break; case APTCommands::Enable: enable(messagePointer); break; + case APTCommands::GetAppletInfo: getAppletInfo(messagePointer); break; case APTCommands::GetSharedFont: getSharedFont(messagePointer); break; case APTCommands::Initialize: initialize(messagePointer); break; case APTCommands::InquireNotification: [[likely]] inquireNotification(messagePointer); break; + case APTCommands::IsRegistered: isRegistered(messagePointer); break; case APTCommands::GetApplicationCpuTimeLimit: getApplicationCpuTimeLimit(messagePointer); break; case APTCommands::GetLockHandle: getLockHandle(messagePointer); break; case APTCommands::GetWirelessRebootInfo: getWirelessRebootInfo(messagePointer); break; @@ -84,7 +100,7 @@ void APTService::handleSyncRequest(u32 messagePointer) { case APTCommands::SetScreencapPostPermission: setScreencapPostPermission(messagePointer); break; case APTCommands::TheSmashBrosFunction: theSmashBrosFunction(messagePointer); break; default: - Helpers::panicDev("APT service requested. Command: %08X\n", command); + Helpers::panic("APT service requested. Command: %08X\n", command); mem.write32(messagePointer + 4, Result::Success); break; } @@ -102,9 +118,30 @@ void APTService::appletUtility(u32 messagePointer) { mem.write32(messagePointer + 4, Result::Success); } +void APTService::getAppletInfo(u32 messagePointer) { + const u32 appID = mem.read32(messagePointer + 4); + Helpers::warn("APT::GetAppletInfo (appID = %X)\n", appID); + + mem.write32(messagePointer, IPC::responseHeader(0x06, 7, 0)); + mem.write32(messagePointer + 4, Result::Success); + + mem.write8(messagePointer + 20, 1); // 1 = registered + mem.write8(messagePointer + 24, 1); // 1 = loaded + // TODO: The rest of this +} + +void APTService::isRegistered(u32 messagePointer) { + const u32 appID = mem.read32(messagePointer + 4); + Helpers::warn("APT::IsRegistered (appID = %X)\n", appID); + + mem.write32(messagePointer, IPC::responseHeader(0x09, 2, 0)); + mem.write32(messagePointer + 4, Result::Success); + mem.write8(messagePointer + 8, 1); // Return that the app is always registered. This might break with home menu? +} + void APTService::preloadLibraryApplet(u32 messagePointer) { const u32 appID = mem.read32(messagePointer + 4); - log("APT::PreloadLibraryApplet (app ID = %d) (stubbed)\n", appID); + log("APT::PreloadLibraryApplet (app ID = %X) (stubbed)\n", appID); mem.write32(messagePointer, IPC::responseHeader(0x16, 1, 0)); mem.write32(messagePointer + 4, Result::Success); diff --git a/src/core/services/gsp_gpu.cpp b/src/core/services/gsp_gpu.cpp index 5d4b27a4..68a97fe8 100644 --- a/src/core/services/gsp_gpu.cpp +++ b/src/core/services/gsp_gpu.cpp @@ -13,6 +13,8 @@ namespace ServiceCommands { FlushDataCache = 0x00080082, SetLCDForceBlack = 0x000B0040, TriggerCmdReqQueue = 0x000C0000, + ImportDisplayCaptureInfo = 0x00180000, + SaveVramSysArea = 0x00190000, SetInternalPriorities = 0x001E0080, StoreDataCache = 0x001F0082 }; @@ -40,14 +42,16 @@ void GPUService::reset() { void GPUService::handleSyncRequest(u32 messagePointer) { const u32 command = mem.read32(messagePointer); switch (command) { + case ServiceCommands::TriggerCmdReqQueue: [[likely]] triggerCmdReqQueue(messagePointer); break; case ServiceCommands::AcquireRight: acquireRight(messagePointer); break; case ServiceCommands::FlushDataCache: flushDataCache(messagePointer); break; + case ServiceCommands::ImportDisplayCaptureInfo: importDisplayCaptureInfo(messagePointer); break; case ServiceCommands::RegisterInterruptRelayQueue: registerInterruptRelayQueue(messagePointer); break; + case ServiceCommands::SaveVramSysArea: saveVramSysArea(messagePointer); break; case ServiceCommands::SetAxiConfigQoSMode: setAxiConfigQoSMode(messagePointer); break; case ServiceCommands::SetInternalPriorities: setInternalPriorities(messagePointer); break; case ServiceCommands::SetLCDForceBlack: setLCDForceBlack(messagePointer); break; case ServiceCommands::StoreDataCache: storeDataCache(messagePointer); break; - case ServiceCommands::TriggerCmdReqQueue: [[likely]] triggerCmdReqQueue(messagePointer); break; case ServiceCommands::WriteHwRegs: writeHwRegs(messagePointer); break; case ServiceCommands::WriteHwRegsWithMask: writeHwRegsWithMask(messagePointer); break; ; default: Helpers::panic("GPU service requested. Command: %08X\n", command); @@ -395,3 +399,20 @@ void GPUService::triggerTextureCopy(u32* cmd) { // NSMB2 relies on this requestInterrupt(GPUInterrupt::PPF); } + +// Used when transitioning from the app to an OS applet, such as software keyboard, mii maker, mii selector, etc +// Stubbed until we decide to support LLE applets +void GPUService::saveVramSysArea(u32 messagePointer) { + Helpers::warn("GSP::GPU::SaveVramSysArea (stubbed)\n"); + + mem.write32(messagePointer, IPC::responseHeader(0x19, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); +} + +// Used in similar fashion to the SaveVramSysArea function +void GPUService::importDisplayCaptureInfo(u32 messagePointer) { + Helpers::warn("GSP::GPU::ImportDisplayCaptureInfo (stubbed)\n"); + + mem.write32(messagePointer, IPC::responseHeader(0x18, 9, 0)); + mem.write32(messagePointer + 4, Result::Success); +} \ No newline at end of file From e9cdf07af325db070a3ae21713ea1545b9f7e229 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sat, 5 Aug 2023 00:35:44 +0300 Subject: [PATCH 05/11] [APT] SendParameter --- include/services/apt.hpp | 1 + src/core/services/apt.cpp | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/services/apt.hpp b/include/services/apt.hpp index df98c825..53c6eafc 100644 --- a/include/services/apt.hpp +++ b/include/services/apt.hpp @@ -52,6 +52,7 @@ class APTService { void replySleepQuery(u32 messagePointer); void setApplicationCpuTimeLimit(u32 messagePointer); void setScreencapPostPermission(u32 messagePointer); + void sendParameter(u32 messagePointer); void prepareToStartLibraryApplet(u32 messagePointer); void startLibraryApplet(u32 messagePointer); void theSmashBrosFunction(u32 messagePointer); diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp index e2dff928..fd65c5ee 100644 --- a/src/core/services/apt.cpp +++ b/src/core/services/apt.cpp @@ -10,6 +10,7 @@ namespace APTCommands { GetAppletInfo = 0x00060040, IsRegistered = 0x00090040, InquireNotification = 0x000B0040, + SendParameter = 0x000C0104, ReceiveParameter = 0x000D0080, GlanceParameter = 0x000E0080, PreloadLibraryApplet = 0x00160040, @@ -97,6 +98,7 @@ void APTService::handleSyncRequest(u32 messagePointer) { case APTCommands::ReceiveParameter: [[likely]] receiveParameter(messagePointer); break; case APTCommands::ReplySleepQuery: replySleepQuery(messagePointer); break; case APTCommands::SetApplicationCpuTimeLimit: setApplicationCpuTimeLimit(messagePointer); break; + case APTCommands::SendParameter: sendParameter(messagePointer); break; case APTCommands::SetScreencapPostPermission: setScreencapPostPermission(messagePointer); break; case APTCommands::TheSmashBrosFunction: theSmashBrosFunction(messagePointer); break; default: @@ -216,6 +218,22 @@ void APTService::notifyToWait(u32 messagePointer) { mem.write32(messagePointer + 4, Result::Success); } +void APTService::sendParameter(u32 messagePointer) { + const u32 sourceAppID = mem.read32(messagePointer + 4); + const u32 destAppID = mem.read32(messagePointer + 8); + const u32 cmd = mem.read32(messagePointer + 12); + const u32 paramSize = mem.read32(messagePointer + 16); + + const u32 parameterHandle = mem.read32(messagePointer + 24); // What dis? + const u32 parameterPointer = mem.read32(messagePointer + 32); + log("APT::SendParameter (source app = %X, dest app = %X, cmd = %X, size = %X) (Stubbed)", sourceAppID, destAppID, cmd, paramSize); + + mem.write32(messagePointer, IPC::responseHeader(0x0C, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); + + kernel.signalEvent(notificationEvent.value()); +} + void APTService::receiveParameter(u32 messagePointer) { const u32 app = mem.read32(messagePointer + 4); const u32 size = mem.read32(messagePointer + 8); From 0bd3729417b60a099fa7c9421ca8baa65f8fe696 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Tue, 22 Aug 2023 23:11:14 +0300 Subject: [PATCH 06/11] Stub APT::PrepareLibraryApplet --- include/services/apt.hpp | 2 +- src/core/services/apt.cpp | 14 ++++++++++++-- src/core/services/gsp_gpu.cpp | 4 ++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/include/services/apt.hpp b/include/services/apt.hpp index 53c6eafc..3944e850 100644 --- a/include/services/apt.hpp +++ b/include/services/apt.hpp @@ -48,12 +48,12 @@ class APTService { void isRegistered(u32 messagePointer); void notifyToWait(u32 messagePointer); void preloadLibraryApplet(u32 messagePointer); + void prepareToStartLibraryApplet(u32 messagePointer); void receiveParameter(u32 messagePointer); void replySleepQuery(u32 messagePointer); void setApplicationCpuTimeLimit(u32 messagePointer); void setScreencapPostPermission(u32 messagePointer); void sendParameter(u32 messagePointer); - void prepareToStartLibraryApplet(u32 messagePointer); void startLibraryApplet(u32 messagePointer); void theSmashBrosFunction(u32 messagePointer); diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp index 4839c152..a775c2cc 100644 --- a/src/core/services/apt.cpp +++ b/src/core/services/apt.cpp @@ -16,6 +16,7 @@ namespace APTCommands { ReceiveParameter = 0x000D0080, GlanceParameter = 0x000E0080, PreloadLibraryApplet = 0x00160040, + PrepareToStartLibraryApplet = 0x00180040, StartLibraryApplet = 0x001E0084, ReplySleepQuery = 0x003E0080, NotifyToWait = 0x00430040, @@ -97,6 +98,7 @@ void APTService::handleSyncRequest(u32 messagePointer) { case APTCommands::GlanceParameter: glanceParameter(messagePointer); break; case APTCommands::NotifyToWait: notifyToWait(messagePointer); break; case APTCommands::PreloadLibraryApplet: preloadLibraryApplet(messagePointer); break; + case APTCommands::PrepareToStartLibraryApplet: prepareToStartLibraryApplet(messagePointer); break; case APTCommands::ReceiveParameter: [[likely]] receiveParameter(messagePointer); break; case APTCommands::ReplySleepQuery: replySleepQuery(messagePointer); break; case APTCommands::SetApplicationCpuTimeLimit: setApplicationCpuTimeLimit(messagePointer); break; @@ -150,7 +152,7 @@ void APTService::getAppletInfo(u32 messagePointer) { void APTService::isRegistered(u32 messagePointer) { const u32 appID = mem.read32(messagePointer + 4); - Helpers::warn("APT::IsRegistered (appID = %X)\n", appID); + Helpers::warn("APT::IsRegistered (appID = %X)", appID); mem.write32(messagePointer, IPC::responseHeader(0x09, 2, 0)); mem.write32(messagePointer + 4, Result::Success); @@ -165,6 +167,14 @@ void APTService::preloadLibraryApplet(u32 messagePointer) { mem.write32(messagePointer + 4, Result::Success); } +void APTService::prepareToStartLibraryApplet(u32 messagePointer) { + const u32 appID = mem.read32(messagePointer + 4); + log("APT::PrepareToStartLibraryApplet (app ID = %X) (stubbed)\n", appID); + + mem.write32(messagePointer, IPC::responseHeader(0x16, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); +} + void APTService::checkNew3DS(u32 messagePointer) { log("APT::CheckNew3DS\n"); mem.write32(messagePointer, IPC::responseHeader(0x102, 2, 0)); @@ -247,7 +257,7 @@ void APTService::sendParameter(u32 messagePointer) { mem.write32(messagePointer, IPC::responseHeader(0x0C, 1, 0)); mem.write32(messagePointer + 4, Result::Success); - kernel.signalEvent(notificationEvent.value()); + kernel.signalEvent(resumeEvent.value()); } void APTService::receiveParameter(u32 messagePointer) { diff --git a/src/core/services/gsp_gpu.cpp b/src/core/services/gsp_gpu.cpp index 16962cf8..0e27c0ec 100644 --- a/src/core/services/gsp_gpu.cpp +++ b/src/core/services/gsp_gpu.cpp @@ -464,7 +464,7 @@ void GPUService::triggerTextureCopy(u32* cmd) { // Used when transitioning from the app to an OS applet, such as software keyboard, mii maker, mii selector, etc // Stubbed until we decide to support LLE applets void GPUService::saveVramSysArea(u32 messagePointer) { - Helpers::warn("GSP::GPU::SaveVramSysArea (stubbed)\n"); + Helpers::warn("GSP::GPU::SaveVramSysArea (stubbed)"); mem.write32(messagePointer, IPC::responseHeader(0x19, 1, 0)); mem.write32(messagePointer + 4, Result::Success); @@ -472,7 +472,7 @@ void GPUService::saveVramSysArea(u32 messagePointer) { // Used in similar fashion to the SaveVramSysArea function void GPUService::importDisplayCaptureInfo(u32 messagePointer) { - Helpers::warn("GSP::GPU::ImportDisplayCaptureInfo (stubbed)\n"); + Helpers::warn("GSP::GPU::ImportDisplayCaptureInfo (stubbed)"); mem.write32(messagePointer, IPC::responseHeader(0x18, 9, 0)); mem.write32(messagePointer + 4, Result::Success); From f099cc12fa6e54ba9282fac64f1c93d01b4eef6d Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Wed, 23 Aug 2023 01:16:27 +0300 Subject: [PATCH 07/11] Add swkbd applet --- CMakeLists.txt | 4 ++-- include/applets/applet.hpp | 4 ++++ include/applets/mii_selector.hpp | 2 ++ include/applets/software_keyboard.hpp | 13 +++++++++++++ include/services/apt.hpp | 4 +++- src/core/applets/mii_selector.cpp | 7 ++++++- src/core/applets/software_keyboard.cpp | 11 +++++++++++ src/core/services/apt.cpp | 14 ++++++++++++++ 8 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 include/applets/software_keyboard.hpp create mode 100644 src/core/applets/software_keyboard.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ce1885bc..55c0c13c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,7 +150,7 @@ set(FS_SOURCE_FILES src/core/fs/archive_self_ncch.cpp src/core/fs/archive_save_d src/core/fs/ivfc.cpp ) -set(APPLET_SOURCE_FILES src/core/applets/applet.cpp src/core/applets/mii_selector.cpp) +set(APPLET_SOURCE_FILES src/core/applets/applet.cpp src/core/applets/mii_selector.cpp src/core/applets/software_keyboard.cpp) set(RENDERER_SW_SOURCE_FILES src/core/renderer_sw/renderer_sw.cpp) set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/termcolor.hpp @@ -180,7 +180,7 @@ set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/termcolor.hpp include/action_replay.hpp include/renderer_sw/renderer_sw.hpp include/compiler_builtins.hpp include/fs/romfs.hpp include/fs/ivfc.hpp include/discord_rpc.hpp include/services/http.hpp include/result/result_cfg.hpp include/applets/applet.hpp include/applets/mii_selector.hpp include/math_util.hpp include/services/soc.hpp - include/services/news_u.hpp + include/services/news_u.hpp include/applets/software_keyboard.hpp ) cmrc_add_resource_library( diff --git a/include/applets/applet.hpp b/include/applets/applet.hpp index 5aeef718..a424e79d 100644 --- a/include/applets/applet.hpp +++ b/include/applets/applet.hpp @@ -47,8 +47,12 @@ namespace Applets { Memory& mem; public: + virtual const char* name() = 0; + // Called by APT::StartLibraryApplet and similar virtual Result::HorizonResult start() = 0; + // Transfer parameters from application -> applet + virtual Result::HorizonResult receiveParameter() = 0; virtual void reset() = 0; AppletBase(Memory& mem) : mem(mem) {} diff --git a/include/applets/mii_selector.hpp b/include/applets/mii_selector.hpp index 8555b5c1..e40547fb 100644 --- a/include/applets/mii_selector.hpp +++ b/include/applets/mii_selector.hpp @@ -3,7 +3,9 @@ namespace Applets { class MiiSelectorApplet final : public AppletBase { public: + virtual const char* name() override { return "Mii Selector"; } virtual Result::HorizonResult start() override; + virtual Result::HorizonResult receiveParameter() override; virtual void reset() override; MiiSelectorApplet(Memory& memory) : AppletBase(memory) {} diff --git a/include/applets/software_keyboard.hpp b/include/applets/software_keyboard.hpp new file mode 100644 index 00000000..1fb721a1 --- /dev/null +++ b/include/applets/software_keyboard.hpp @@ -0,0 +1,13 @@ +#include "applets/applet.hpp" + +namespace Applets { + class SoftwareKeyboardApplet final : public AppletBase { + public: + virtual const char* name() override { return "Software Keyboard"; } + virtual Result::HorizonResult start() override; + virtual Result::HorizonResult receiveParameter() override; + virtual void reset() override; + + SoftwareKeyboardApplet(Memory& memory) : AppletBase(memory) {} + }; +} // namespace Applets \ No newline at end of file diff --git a/include/services/apt.hpp b/include/services/apt.hpp index 3944e850..02448b8d 100644 --- a/include/services/apt.hpp +++ b/include/services/apt.hpp @@ -7,6 +7,7 @@ #include "result/result.hpp" #include "applets/mii_selector.hpp" +#include "applets/software_keyboard.hpp" // Yay, more circular dependencies class Kernel; @@ -28,6 +29,7 @@ class APTService { // Applets here Applets::MiiSelectorApplet miiSelector; + Applets::SoftwareKeyboardApplet swkbd; Applets::AppletBase* getApplet(u32 id); MAKE_LOG_FUNCTION(log, aptLogger) @@ -78,7 +80,7 @@ class APTService { u32 screencapPostPermission; public: - APTService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel), miiSelector(mem) {} + APTService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel), miiSelector(mem), swkbd(mem) {} void reset(); void handleSyncRequest(u32 messagePointer); }; \ No newline at end of file diff --git a/src/core/applets/mii_selector.cpp b/src/core/applets/mii_selector.cpp index 04658736..817545e8 100644 --- a/src/core/applets/mii_selector.cpp +++ b/src/core/applets/mii_selector.cpp @@ -3,4 +3,9 @@ using namespace Applets; void MiiSelectorApplet::reset() {} -Result::HorizonResult MiiSelectorApplet::start() { return Result::Success; } \ No newline at end of file +Result::HorizonResult MiiSelectorApplet::start() { return Result::Success; } + +Result::HorizonResult MiiSelectorApplet::receiveParameter() { + Helpers::panic("Mii Selector received parameter"); + return Result::Success; +} \ No newline at end of file diff --git a/src/core/applets/software_keyboard.cpp b/src/core/applets/software_keyboard.cpp new file mode 100644 index 00000000..a360ef10 --- /dev/null +++ b/src/core/applets/software_keyboard.cpp @@ -0,0 +1,11 @@ +#include "applets/software_keyboard.hpp" + +using namespace Applets; + +void SoftwareKeyboardApplet::reset() {} +Result::HorizonResult SoftwareKeyboardApplet::start() { return Result::Success; } + +Result::HorizonResult SoftwareKeyboardApplet::receiveParameter() { + Helpers::panic("Software keyboard received parameter"); + return Result::Success; +} \ No newline at end of file diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp index a775c2cc..1298eab3 100644 --- a/src/core/services/apt.cpp +++ b/src/core/services/apt.cpp @@ -76,6 +76,9 @@ Applets::AppletBase* APTService::getApplet(u32 id) { case AppletIDs::MiiSelector: case AppletIDs::MiiSelector2: return &miiSelector; + case AppletIDs::SoftwareKeyboard: + case AppletIDs::SoftwareKeyboard2: return &swkbd; + default: return nullptr; } } @@ -257,6 +260,17 @@ void APTService::sendParameter(u32 messagePointer) { mem.write32(messagePointer, IPC::responseHeader(0x0C, 1, 0)); mem.write32(messagePointer + 4, Result::Success); + if (sourceAppID != Applets::AppletIDs::Application) { + Helpers::warn("APT::SendParameter: Unimplemented source applet ID"); + } + + Applets::AppletBase* destApplet = getApplet(destAppID); + if (destApplet == nullptr) { + Helpers::warn("APT::SendParameter: Unimplemented dest applet ID"); + } else { + auto result = destApplet->receiveParameter(); + } + kernel.signalEvent(resumeEvent.value()); } From 74f7aeedbb5b78553ae3db953055630f9c7aaf00 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:07:24 +0300 Subject: [PATCH 08/11] Proper applet manager class --- CMakeLists.txt | 4 ++-- include/applets/applet_manager.hpp | 17 +++++++++++++++++ include/services/apt.hpp | 11 +++-------- src/core/applets/applet_manager.cpp | 21 +++++++++++++++++++++ src/core/services/apt.cpp | 18 ++---------------- 5 files changed, 45 insertions(+), 26 deletions(-) create mode 100644 include/applets/applet_manager.hpp create mode 100644 src/core/applets/applet_manager.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 55c0c13c..a7b9df5b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,7 +150,7 @@ set(FS_SOURCE_FILES src/core/fs/archive_self_ncch.cpp src/core/fs/archive_save_d src/core/fs/ivfc.cpp ) -set(APPLET_SOURCE_FILES src/core/applets/applet.cpp src/core/applets/mii_selector.cpp src/core/applets/software_keyboard.cpp) +set(APPLET_SOURCE_FILES src/core/applets/applet.cpp src/core/applets/mii_selector.cpp src/core/applets/software_keyboard.cpp src/core/applets/applet_manager.cpp) set(RENDERER_SW_SOURCE_FILES src/core/renderer_sw/renderer_sw.cpp) set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/termcolor.hpp @@ -180,7 +180,7 @@ set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/termcolor.hpp include/action_replay.hpp include/renderer_sw/renderer_sw.hpp include/compiler_builtins.hpp include/fs/romfs.hpp include/fs/ivfc.hpp include/discord_rpc.hpp include/services/http.hpp include/result/result_cfg.hpp include/applets/applet.hpp include/applets/mii_selector.hpp include/math_util.hpp include/services/soc.hpp - include/services/news_u.hpp include/applets/software_keyboard.hpp + include/services/news_u.hpp include/applets/software_keyboard.hpp include/applets/applet_manager.hpp ) cmrc_add_resource_library( diff --git a/include/applets/applet_manager.hpp b/include/applets/applet_manager.hpp new file mode 100644 index 00000000..95b54009 --- /dev/null +++ b/include/applets/applet_manager.hpp @@ -0,0 +1,17 @@ +#include "applets/mii_selector.hpp" +#include "applets/software_keyboard.hpp" +#include "helpers.hpp" +#include "memory.hpp" +#include "result/result.hpp" + +namespace Applets { + class AppletManager { + MiiSelectorApplet miiSelector; + SoftwareKeyboardApplet swkbd; + + public: + AppletManager(Memory& mem); + void reset(); + AppletBase* getApplet(u32 id); + }; +} // namespace Applets \ No newline at end of file diff --git a/include/services/apt.hpp b/include/services/apt.hpp index 02448b8d..a7df056f 100644 --- a/include/services/apt.hpp +++ b/include/services/apt.hpp @@ -6,8 +6,7 @@ #include "memory.hpp" #include "result/result.hpp" -#include "applets/mii_selector.hpp" -#include "applets/software_keyboard.hpp" +#include "applets/applet_manager.hpp" // Yay, more circular dependencies class Kernel; @@ -26,11 +25,7 @@ class APTService { std::optional resumeEvent = std::nullopt; ConsoleModel model = ConsoleModel::Old3DS; - - // Applets here - Applets::MiiSelectorApplet miiSelector; - Applets::SoftwareKeyboardApplet swkbd; - Applets::AppletBase* getApplet(u32 id); + Applets::AppletManager appletManager; MAKE_LOG_FUNCTION(log, aptLogger) @@ -80,7 +75,7 @@ class APTService { u32 screencapPostPermission; public: - APTService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel), miiSelector(mem), swkbd(mem) {} + APTService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel), appletManager(mem) {} void reset(); void handleSyncRequest(u32 messagePointer); }; \ No newline at end of file diff --git a/src/core/applets/applet_manager.cpp b/src/core/applets/applet_manager.cpp new file mode 100644 index 00000000..c94eee28 --- /dev/null +++ b/src/core/applets/applet_manager.cpp @@ -0,0 +1,21 @@ +#include "applets/applet_manager.hpp" +using namespace Applets; + +AppletManager::AppletManager(Memory& mem) : miiSelector(mem), swkbd(mem) {} + +void AppletManager::reset() { + miiSelector.reset(); + swkbd.reset(); +} + +AppletBase* AppletManager::getApplet(u32 id) { + switch (id) { + case AppletIDs::MiiSelector: + case AppletIDs::MiiSelector2: return &miiSelector; + + case AppletIDs::SoftwareKeyboard: + case AppletIDs::SoftwareKeyboard2: return &swkbd; + + default: return nullptr; + } +} \ No newline at end of file diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp index 1298eab3..ef0d1450 100644 --- a/src/core/services/apt.cpp +++ b/src/core/services/apt.cpp @@ -66,21 +66,7 @@ void APTService::reset() { notificationEvent = std::nullopt; resumeEvent = std::nullopt; - miiSelector.reset(); -} - -Applets::AppletBase* APTService::getApplet(u32 id) { - using namespace Applets; - - switch (id) { - case AppletIDs::MiiSelector: - case AppletIDs::MiiSelector2: return &miiSelector; - - case AppletIDs::SoftwareKeyboard: - case AppletIDs::SoftwareKeyboard2: return &swkbd; - - default: return nullptr; - } + appletManager.reset(); } void APTService::handleSyncRequest(u32 messagePointer) { @@ -264,7 +250,7 @@ void APTService::sendParameter(u32 messagePointer) { Helpers::warn("APT::SendParameter: Unimplemented source applet ID"); } - Applets::AppletBase* destApplet = getApplet(destAppID); + Applets::AppletBase* destApplet = appletManager.getApplet(destAppID); if (destApplet == nullptr) { Helpers::warn("APT::SendParameter: Unimplemented dest applet ID"); } else { From b3443623f55e94184754abd1dc027f65fe14e785 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:44:01 +0300 Subject: [PATCH 09/11] Add more applet types --- include/applets/applet.hpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/include/applets/applet.hpp b/include/applets/applet.hpp index a424e79d..0c3ab519 100644 --- a/include/applets/applet.hpp +++ b/include/applets/applet.hpp @@ -43,6 +43,34 @@ namespace Applets { }; } + enum class APTSignal : u32 { + None = 0x0, + Wakeup = 0x1, + Request = 0x2, + Response = 0x3, + Exit = 0x4, + Message = 0x5, + HomeButtonSingle = 0x6, + HomeButtonDouble = 0x7, + DspSleep = 0x8, + DspWakeup = 0x9, + WakeupByExit = 0xA, + WakeupByPause = 0xB, + WakeupByCancel = 0xC, + WakeupByCancelAll = 0xD, + WakeupByPowerButtonClick = 0xE, + WakeupToJumpHome = 0xF, + RequestForSysApplet = 0x10, + WakeupToLaunchApplication = 0x11, + }; + + struct Parameter { + u32 senderID; + u32 destID; + APTSignal signal; + std::vector data; + }; + class AppletBase { Memory& mem; From 467ab161ff7b545f6453f894a3c274fdcbd151fe Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Thu, 24 Aug 2023 01:32:57 +0300 Subject: [PATCH 10/11] Applets: Warn instead of panic --- src/core/applets/mii_selector.cpp | 2 +- src/core/applets/software_keyboard.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/applets/mii_selector.cpp b/src/core/applets/mii_selector.cpp index 817545e8..211e6f07 100644 --- a/src/core/applets/mii_selector.cpp +++ b/src/core/applets/mii_selector.cpp @@ -6,6 +6,6 @@ void MiiSelectorApplet::reset() {} Result::HorizonResult MiiSelectorApplet::start() { return Result::Success; } Result::HorizonResult MiiSelectorApplet::receiveParameter() { - Helpers::panic("Mii Selector received parameter"); + Helpers::warn("Mii Selector: Unimplemented ReceiveParameter"); return Result::Success; } \ No newline at end of file diff --git a/src/core/applets/software_keyboard.cpp b/src/core/applets/software_keyboard.cpp index a360ef10..2ff22792 100644 --- a/src/core/applets/software_keyboard.cpp +++ b/src/core/applets/software_keyboard.cpp @@ -6,6 +6,6 @@ void SoftwareKeyboardApplet::reset() {} Result::HorizonResult SoftwareKeyboardApplet::start() { return Result::Success; } Result::HorizonResult SoftwareKeyboardApplet::receiveParameter() { - Helpers::panic("Software keyboard received parameter"); + Helpers::warn("Software keyboard: Unimplemented ReceiveParameter"); return Result::Success; } \ No newline at end of file From 150cac89a4ab175f7883bc92c1e00a7bb67e40b9 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Thu, 24 Aug 2023 01:35:40 +0300 Subject: [PATCH 11/11] [APT] Check for resume event before signalling --- src/core/services/apt.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp index ef0d1450..2bb3e4a2 100644 --- a/src/core/services/apt.cpp +++ b/src/core/services/apt.cpp @@ -257,7 +257,9 @@ void APTService::sendParameter(u32 messagePointer) { auto result = destApplet->receiveParameter(); } - kernel.signalEvent(resumeEvent.value()); + if (resumeEvent.has_value()) { + kernel.signalEvent(resumeEvent.value()); + } } void APTService::receiveParameter(u32 messagePointer) {