From bd1d7b7a810422c81257ac5b573f7f3b115f8049 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sun, 12 Nov 2023 21:07:44 +0200 Subject: [PATCH] [APT] Properly forward parameters in SendParameter --- include/applets/applet.hpp | 4 ++-- include/applets/mii_selector.hpp | 2 +- include/applets/software_keyboard.hpp | 2 +- src/core/applets/applet_manager.cpp | 9 +++++++-- src/core/applets/mii_selector.cpp | 2 +- src/core/applets/software_keyboard.cpp | 6 +++--- src/core/services/apt.cpp | 16 +++++++++++++++- 7 files changed, 30 insertions(+), 11 deletions(-) diff --git a/include/applets/applet.hpp b/include/applets/applet.hpp index f1a91afd..79fba1cb 100644 --- a/include/applets/applet.hpp +++ b/include/applets/applet.hpp @@ -67,7 +67,7 @@ namespace Applets { struct Parameter { u32 senderID; u32 destID; - APTSignal signal; + u32 signal; std::vector data; }; @@ -82,7 +82,7 @@ namespace Applets { // Called by APT::StartLibraryApplet and similar virtual Result::HorizonResult start() = 0; // Transfer parameters from application -> applet - virtual Result::HorizonResult receiveParameter() = 0; + virtual Result::HorizonResult receiveParameter(const Parameter& parameter) = 0; virtual void reset() = 0; AppletBase(Memory& mem, std::optional& nextParam) : mem(mem), nextParameter(nextParam) {} diff --git a/include/applets/mii_selector.hpp b/include/applets/mii_selector.hpp index 7a882615..c90d4b59 100644 --- a/include/applets/mii_selector.hpp +++ b/include/applets/mii_selector.hpp @@ -5,7 +5,7 @@ namespace Applets { public: virtual const char* name() override { return "Mii Selector"; } virtual Result::HorizonResult start() override; - virtual Result::HorizonResult receiveParameter() override; + virtual Result::HorizonResult receiveParameter(const Applets::Parameter& parameter) override; virtual void reset() override; MiiSelectorApplet(Memory& memory, std::optional& nextParam) : AppletBase(memory, nextParam) {} diff --git a/include/applets/software_keyboard.hpp b/include/applets/software_keyboard.hpp index 89b87953..f4179012 100644 --- a/include/applets/software_keyboard.hpp +++ b/include/applets/software_keyboard.hpp @@ -5,7 +5,7 @@ namespace Applets { public: virtual const char* name() override { return "Software Keyboard"; } virtual Result::HorizonResult start() override; - virtual Result::HorizonResult receiveParameter() override; + virtual Result::HorizonResult receiveParameter(const Applets::Parameter& parameter) override; virtual void reset() override; SoftwareKeyboardApplet(Memory& memory, std::optional& nextParam) : AppletBase(memory, nextParam) {} diff --git a/src/core/applets/applet_manager.cpp b/src/core/applets/applet_manager.cpp index 196b1f60..4c241027 100644 --- a/src/core/applets/applet_manager.cpp +++ b/src/core/applets/applet_manager.cpp @@ -28,7 +28,7 @@ Applets::Parameter AppletManager::glanceParameter() { // 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) { + if (param.signal == static_cast(APTSignal::DspWakeup) || param.signal == static_cast(APTSignal::DspSleep)) { nextParameter = std::nullopt; } @@ -37,7 +37,12 @@ Applets::Parameter AppletManager::glanceParameter() { // 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 = {}}; + return Applets::Parameter{ + .senderID = 0, + .destID = Applets::AppletIDs::Application, + .signal = static_cast(APTSignal::Wakeup), + .data = {}, + }; } } diff --git a/src/core/applets/mii_selector.cpp b/src/core/applets/mii_selector.cpp index 211e6f07..f392d846 100644 --- a/src/core/applets/mii_selector.cpp +++ b/src/core/applets/mii_selector.cpp @@ -5,7 +5,7 @@ using namespace Applets; void MiiSelectorApplet::reset() {} Result::HorizonResult MiiSelectorApplet::start() { return Result::Success; } -Result::HorizonResult MiiSelectorApplet::receiveParameter() { +Result::HorizonResult MiiSelectorApplet::receiveParameter(const Applets::Parameter& 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 3c203133..be5a9e21 100644 --- a/src/core/applets/software_keyboard.cpp +++ b/src/core/applets/software_keyboard.cpp @@ -5,13 +5,13 @@ using namespace Applets; void SoftwareKeyboardApplet::reset() {} Result::HorizonResult SoftwareKeyboardApplet::start() { return Result::Success; } -Result::HorizonResult SoftwareKeyboardApplet::receiveParameter() { +Result::HorizonResult SoftwareKeyboardApplet::receiveParameter(const Applets::Parameter& parameter) { Helpers::warn("Software keyboard: Unimplemented ReceiveParameter"); Applets::Parameter param = Applets::Parameter{ - .senderID = AppletIDs::SoftwareKeyboard, + .senderID = parameter.destID, .destID = AppletIDs::Application, - .signal = APTSignal::Response, + .signal = static_cast(APTSignal::Response), .data = {}, }; diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp index 64ff5cef..f1c43b26 100644 --- a/src/core/services/apt.cpp +++ b/src/core/services/apt.cpp @@ -234,7 +234,21 @@ void APTService::sendParameter(u32 messagePointer) { if (destApplet == nullptr) { Helpers::warn("APT::SendParameter: Unimplemented dest applet ID"); } else { - auto result = destApplet->receiveParameter(); + // Construct parameter, send it to applet + Applets::Parameter param; + param.senderID = sourceAppID; + param.destID = destAppID; + param.signal = cmd; + + // Fetch parameter data buffer + param.data.reserve(paramSize); + u32 pointer = parameterPointer; + + for (u32 i = 0; i < paramSize; i++) { + param.data.push_back(mem.read8(pointer++)); + } + + auto result = destApplet->receiveParameter(param); } if (resumeEvent.has_value()) {