diff --git a/include/services/cecd.hpp b/include/services/cecd.hpp index 0cbd900c..392cbc67 100644 --- a/include/services/cecd.hpp +++ b/include/services/cecd.hpp @@ -1,19 +1,25 @@ #pragma once +#include #include "helpers.hpp" #include "kernel_types.hpp" #include "logger.hpp" #include "memory.hpp" +class Kernel; + class CECDService { Handle handle = KernelHandles::CECD; Memory& mem; + Kernel& kernel; MAKE_LOG_FUNCTION(log, cecdLogger) + std::optional infoEvent; + // Service commands - void getEventHandle(u32 messagePointer); + void getInfoEventHandle(u32 messagePointer); public: - CECDService(Memory& mem) : mem(mem) {} + CECDService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel) {} void reset(); void handleSyncRequest(u32 messagePointer); }; \ No newline at end of file diff --git a/include/services/frd.hpp b/include/services/frd.hpp index f189f592..9f893729 100644 --- a/include/services/frd.hpp +++ b/include/services/frd.hpp @@ -22,7 +22,9 @@ class FRDService { void attachToEventNotification(u32 messagePointer); void getFriendKeyList(u32 messagePointer); void getMyFriendKey(u32 messagePointer); + void getMyMii(u32 messagePointer); void getMyPresence(u32 messagePointer); + void getMyProfile(u32 messagePointer); void getMyScreenName(u32 messsagePointer); void setClientSDKVersion(u32 messagePointer); void setNotificationMask(u32 messagePointer); diff --git a/src/core/services/cecd.cpp b/src/core/services/cecd.cpp index cc4bfffb..56936acf 100644 --- a/src/core/services/cecd.cpp +++ b/src/core/services/cecd.cpp @@ -1,9 +1,10 @@ #include "services/cecd.hpp" #include "ipc.hpp" +#include "kernel.hpp" namespace CECDCommands { enum : u32 { - GetEventHandle = 0x000F0000 + GetInfoEventHandle = 0x000F0000 }; } @@ -13,22 +14,27 @@ namespace Result { }; } -void CECDService::reset() {} +void CECDService::reset() { + infoEvent = std::nullopt; +} void CECDService::handleSyncRequest(u32 messagePointer) { const u32 command = mem.read32(messagePointer); switch (command) { - case CECDCommands::GetEventHandle: getEventHandle(messagePointer); break; + case CECDCommands::GetInfoEventHandle: getInfoEventHandle(messagePointer); break; default: Helpers::panic("CECD service requested. Command: %08X\n", command); } } -void CECDService::getEventHandle(u32 messagePointer) { - log("CECD::GetEventHandle (stubbed)\n"); - Helpers::panic("TODO: Actually implement CECD::GetEventHandle"); +void CECDService::getInfoEventHandle(u32 messagePointer) { + log("CECD::GetInfoEventHandle (stubbed)\n"); + + if (!infoEvent.has_value()) { + infoEvent = kernel.makeEvent(ResetType::OneShot); + } mem.write32(messagePointer, IPC::responseHeader(0xF, 1, 2)); mem.write32(messagePointer + 4, Result::Success); // TODO: Translation descriptor here? - mem.write32(messagePointer + 12, 0x66666666); + mem.write32(messagePointer + 12, infoEvent.value()); } \ No newline at end of file diff --git a/src/core/services/frd.cpp b/src/core/services/frd.cpp index 4bb1b421..8af0f012 100644 --- a/src/core/services/frd.cpp +++ b/src/core/services/frd.cpp @@ -1,5 +1,6 @@ #include #include "services/frd.hpp" +#include "services/region_codes.hpp" #include "ipc.hpp" namespace FRDCommands { @@ -8,8 +9,10 @@ namespace FRDCommands { SetNotificationMask = 0x00210040, SetClientSdkVersion = 0x00320042, GetMyFriendKey = 0x00050000, + GetMyProfile = 0x00070000, GetMyPresence = 0x00080000, GetMyScreenName = 0x00090000, + GetMyMii = 0x000A0000, GetFriendKeyList = 0x00110080 }; } @@ -28,7 +31,9 @@ void FRDService::handleSyncRequest(u32 messagePointer) { case FRDCommands::AttachToEventNotification: attachToEventNotification(messagePointer); break; case FRDCommands::GetFriendKeyList: getFriendKeyList(messagePointer); break; case FRDCommands::GetMyFriendKey: getMyFriendKey(messagePointer); break; + case FRDCommands::GetMyMii: getMyMii(messagePointer); break; case FRDCommands::GetMyPresence: getMyPresence(messagePointer); break; + case FRDCommands::GetMyProfile: getMyProfile(messagePointer); break; case FRDCommands::GetMyScreenName: getMyScreenName(messagePointer); break; case FRDCommands::SetClientSdkVersion: setClientSDKVersion(messagePointer); break; case FRDCommands::SetNotificationMask: setNotificationMask(messagePointer); break; @@ -81,6 +86,23 @@ void FRDService::getMyPresence(u32 messagePointer) { mem.write32(messagePointer + 4, Result::Success); } +void FRDService::getMyProfile(u32 messagePointer) { + mem.write32(messagePointer, IPC::responseHeader(0x7, 3, 0)); // Not sure if the header here has the correct # of responses? + mem.write32(messagePointer + 4, Result::Success); + + // TODO: Should maybe make these user-configurable. Not super important though + mem.write8(messagePointer + 8, static_cast(Regions::USA)); // Region + mem.write8(messagePointer + 9, static_cast(CountryCodes::US)); // Country + mem.write8(messagePointer + 10, 2); // Area (this should be Washington) + mem.write8(messagePointer + 11, static_cast(LanguageCodes::English)); // Language + mem.write8(messagePointer + 12, 2); // Platform (always 2 for CTR) + + // Padding + mem.write8(messagePointer + 13, 0); + mem.write8(messagePointer + 14, 0); + mem.write8(messagePointer + 15, 0); +} + void FRDService::getMyScreenName(u32 messagePointer) { log("FRD::GetMyScreenName\n"); static const std::u16string name = u"Pander"; @@ -110,4 +132,12 @@ void FRDService::setNotificationMask(u32 messagePointer) { mem.write32(messagePointer, IPC::responseHeader(0x21, 1, 0)); mem.write32(messagePointer + 4, Result::Success); +} + +void FRDService::getMyMii(u32 messagePointer) { + log("FRD::GetMyMii (stubbed)\n"); + + // TODO: How is the mii data even returned? + mem.write32(messagePointer, IPC::responseHeader(0xA, 2, 0)); + mem.write32(messagePointer + 4, Result::Success); } \ No newline at end of file diff --git a/src/core/services/service_manager.cpp b/src/core/services/service_manager.cpp index 082a8e9a..9ab529d3 100644 --- a/src/core/services/service_manager.cpp +++ b/src/core/services/service_manager.cpp @@ -4,8 +4,8 @@ #include "kernel.hpp" ServiceManager::ServiceManager(std::array& regs, Memory& mem, GPU& gpu, u32& currentPID, Kernel& kernel) - : regs(regs), mem(mem), kernel(kernel), ac(mem), am(mem), boss(mem), act(mem), apt(mem, kernel), cam(mem), cecd(mem), - cfg(mem), dsp(mem, kernel), hid(mem), frd(mem), fs(mem, kernel), gsp_gpu(mem, gpu, kernel, currentPID), gsp_lcd(mem), + : regs(regs), mem(mem), kernel(kernel), ac(mem), am(mem), boss(mem), act(mem), apt(mem, kernel), cam(mem), + cecd(mem, kernel), cfg(mem), dsp(mem, kernel), hid(mem), frd(mem), fs(mem, kernel), gsp_gpu(mem, gpu, kernel, currentPID), gsp_lcd(mem), ldr(mem), mic(mem), nfc(mem, kernel), nim(mem), ndm(mem), ptm(mem), y2r(mem, kernel) {} static constexpr int MAX_NOTIFICATION_COUNT = 16;