From 135c8cb508fda0ec454833c39616d12d58b3ce5d Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sat, 11 Nov 2023 20:11:40 +0200 Subject: [PATCH] [Applets] Proper glance/receiveParameter sorta --- include/applets/applet_manager.hpp | 7 +++++ include/services/apt.hpp | 25 ++++++++++++++++ src/core/applets/applet_manager.cpp | 29 ++++++++++++++++++ src/core/services/apt.cpp | 46 +++++++++-------------------- 4 files changed, 75 insertions(+), 32 deletions(-) diff --git a/include/applets/applet_manager.hpp b/include/applets/applet_manager.hpp index 95b54009..e75e1268 100644 --- a/include/applets/applet_manager.hpp +++ b/include/applets/applet_manager.hpp @@ -1,3 +1,6 @@ +#pragma once +#include + #include "applets/mii_selector.hpp" #include "applets/software_keyboard.hpp" #include "helpers.hpp" @@ -8,10 +11,14 @@ namespace Applets { class AppletManager { MiiSelectorApplet miiSelector; SoftwareKeyboardApplet swkbd; + std::optional nextParameter = std::nullopt; public: AppletManager(Memory& mem); void reset(); AppletBase* getApplet(u32 id); + + Applets::Parameter glanceParameter(); + Applets::Parameter receiveParameter(); }; } // namespace Applets \ No newline at end of file diff --git a/include/services/apt.hpp b/include/services/apt.hpp index a7df056f..48a59c2d 100644 --- a/include/services/apt.hpp +++ b/include/services/apt.hpp @@ -15,6 +15,31 @@ enum class ConsoleModel : u32 { Old3DS, New3DS }; +// https://www.3dbrew.org/wiki/NS_and_APT_Services#Command +namespace APT::Transitions { + enum : u32 { + None = 0, + Wakeup = 1, + Request = 2, + Response = 3, + Exit = 4, + Message = 5, + HomeButtonSingle = 6, + HomeButtonDouble = 7, + DSPSleep = 8, + DSPWakeup = 9, + WakeupByExit = 10, + WakuepByPause = 11, + WakeupByCancel = 12, + WakeupByCancelAll = 13, + WakeupByPowerButton = 14, + WakeupToJumpHome = 15, + RequestForApplet = 16, + WakeupToLaunchApp = 17, + ProcessDed = 0x41 + }; +} + class APTService { Handle handle = KernelHandles::APT; Memory& mem; diff --git a/src/core/applets/applet_manager.cpp b/src/core/applets/applet_manager.cpp index c94eee28..192a76c0 100644 --- a/src/core/applets/applet_manager.cpp +++ b/src/core/applets/applet_manager.cpp @@ -1,4 +1,7 @@ #include "applets/applet_manager.hpp" + +#include "services/apt.hpp" + using namespace Applets; AppletManager::AppletManager(Memory& mem) : miiSelector(mem), swkbd(mem) {} @@ -18,4 +21,30 @@ AppletBase* AppletManager::getApplet(u32 id) { default: return nullptr; } +} + +Applets::Parameter AppletManager::glanceParameter() { + if (nextParameter) { + // Copy parameter + Applets::Parameter param = nextParameter.value(); + // APT module clears next parameter even for GlanceParameter for these 2 signals + if (param.signal == APTSignal::DspWakeup || param.signal == APTSignal::DspSleep) { + nextParameter = std::nullopt; + } + + return param; + } + + // Default return value. This is legacy code from before applets were implemented. TODO: Update it + else { + return Applets::Parameter{.senderID = 0, .destID = Applets::AppletIDs::Application, .signal = APTSignal::Wakeup, .data = {}}; + } +} + +Applets::Parameter AppletManager::receiveParameter() { + Applets::Parameter param = glanceParameter(); + // ReceiveParameter always clears nextParameter whereas glanceParameter does not + nextParameter = std::nullopt; + + return param; } \ No newline at end of file diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp index d969f2a4..64ff5cef 100644 --- a/src/core/services/apt.cpp +++ b/src/core/services/apt.cpp @@ -32,31 +32,6 @@ namespace APTCommands { }; } -// https://www.3dbrew.org/wiki/NS_and_APT_Services#Command -namespace APTTransitions { - enum : u32 { - None = 0, - Wakeup = 1, - Request = 2, - Response = 3, - Exit = 4, - Message = 5, - HomeButtonSingle = 6, - HomeButtonDouble = 7, - DSPSleep = 8, - DSPWakeup = 9, - WakeupByExit = 10, - WakuepByPause = 11, - WakeupByCancel = 12, - WakeupByCancelAll = 13, - WakeupByPowerButton = 14, - WakeupToJumpHome = 15, - RequestForApplet = 16, - WakeupToLaunchApp = 17, - ProcessDed = 0x41 - }; -} - void APTService::reset() { // Set the default CPU time limit to 30%. Seems safe, as this is what Metroid 2 uses by default cpuTimeLimit = 30; @@ -273,13 +248,16 @@ void APTService::receiveParameter(u32 messagePointer) { log("APT::ReceiveParameter(app ID = %X, size = %04X) (STUBBED)\n", app, size); if (size > 0x1000) Helpers::panic("APT::ReceiveParameter with size > 0x1000"); + auto parameter = appletManager.receiveParameter(); - // TODO: Properly implement this. We currently stub somewhat like 3dmoo mem.write32(messagePointer, IPC::responseHeader(0xD, 4, 4)); mem.write32(messagePointer + 4, Result::Success); - mem.write32(messagePointer + 8, 0); // Sender App ID - mem.write32(messagePointer + 12, APTTransitions::Wakeup); // Command - mem.write32(messagePointer + 16, 0); + // Sender App ID + mem.write32(messagePointer + 8, parameter.senderID); + // Command + mem.write32(messagePointer + 12, static_cast(parameter.signal)); + // Size of parameter data + mem.write32(messagePointer + 16, parameter.data.size()); mem.write32(messagePointer + 20, 0x10); mem.write32(messagePointer + 24, 0); mem.write32(messagePointer + 28, 0); @@ -291,13 +269,17 @@ void APTService::glanceParameter(u32 messagePointer) { log("APT::GlanceParameter(app ID = %X, size = %04X) (STUBBED)\n", app, size); if (size > 0x1000) Helpers::panic("APT::GlanceParameter with size > 0x1000"); + auto parameter = appletManager.glanceParameter(); // TODO: Properly implement this. We currently stub it similar mem.write32(messagePointer, IPC::responseHeader(0xE, 4, 4)); mem.write32(messagePointer + 4, Result::Success); - mem.write32(messagePointer + 8, 0); // Sender App ID - mem.write32(messagePointer + 12, APTTransitions::Wakeup); // Command - mem.write32(messagePointer + 16, 0); + // Sender App ID + mem.write32(messagePointer + 8, parameter.senderID); + // Command + mem.write32(messagePointer + 12, static_cast(parameter.signal)); + // Size of parameter data + mem.write32(messagePointer + 16, parameter.data.size()); mem.write32(messagePointer + 20, 0); mem.write32(messagePointer + 24, 0); mem.write32(messagePointer + 28, 0);