From 7fb3cf1236f4c6c51c98ce592d34ba648d8b0ce7 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Wed, 23 Aug 2023 17:20:51 +0300 Subject: [PATCH] Implement more of AC --- include/services/ac.hpp | 8 +++++++- src/core/services/ac.cpp | 25 +++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/include/services/ac.hpp b/include/services/ac.hpp index 3d3c3216..55f46d3e 100644 --- a/include/services/ac.hpp +++ b/include/services/ac.hpp @@ -1,4 +1,6 @@ #pragma once +#include + #include "helpers.hpp" #include "kernel_types.hpp" #include "logger.hpp" @@ -15,10 +17,14 @@ class ACService { void closeAsync(u32 messagePointer); void createDefaultConfig(u32 messagePointer); void getLastErrorCode(u32 messagePointer); + void isConnected(u32 messagePointer); void registerDisconnectEvent(u32 messagePointer); void setClientVersion(u32 messagePointer); -public: + bool connected = false; + std::optional disconnectEvent = std::nullopt; + + public: ACService(Memory& mem) : mem(mem) {} void reset(); void handleSyncRequest(u32 messagePointer); diff --git a/src/core/services/ac.cpp b/src/core/services/ac.cpp index 56326609..ac9d3a1e 100644 --- a/src/core/services/ac.cpp +++ b/src/core/services/ac.cpp @@ -8,11 +8,15 @@ namespace ACCommands { CloseAsync = 0x00080004, GetLastErrorCode = 0x000A0000, RegisterDisconnectEvent = 0x00300004, + IsConnected = 0x003E0042, SetClientVersion = 0x00400042, }; } -void ACService::reset() {} +void ACService::reset() { + connected = false; + disconnectEvent = std::nullopt; +} void ACService::handleSyncRequest(u32 messagePointer) { const u32 command = mem.read32(messagePointer); @@ -21,6 +25,7 @@ void ACService::handleSyncRequest(u32 messagePointer) { case ACCommands::CloseAsync: closeAsync(messagePointer); break; case ACCommands::CreateDefaultConfig: createDefaultConfig(messagePointer); break; case ACCommands::GetLastErrorCode: getLastErrorCode(messagePointer); break; + case ACCommands::IsConnected: isConnected(messagePointer); break; case ACCommands::RegisterDisconnectEvent: registerDisconnectEvent(messagePointer); break; case ACCommands::SetClientVersion: setClientVersion(messagePointer); break; default: Helpers::panic("AC service requested. Command: %08X\n", command); @@ -37,6 +42,11 @@ void ACService::cancelConnectAsync(u32 messagePointer) { void ACService::closeAsync(u32 messagePointer) { log("AC::CloseAsync (stubbed)\n"); + connected = false; + + if (disconnectEvent.has_value()) { + Helpers::warn("AC::DisconnectEvent should be signalled but isn't implemented yet"); + } // TODO: Verify if this response header is correct on hardware mem.write32(messagePointer, IPC::responseHeader(0x8, 1, 0)); @@ -59,6 +69,15 @@ void ACService::getLastErrorCode(u32 messagePointer) { mem.write32(messagePointer + 8, 0); // Hopefully this means no error? } +void ACService::isConnected(u32 messagePointer) { + log("AC::IsConnected\n"); + // This has parameters according to the command word but it's unknown what they are + + mem.write32(messagePointer, IPC::responseHeader(0x3E, 2, 0)); + mem.write32(messagePointer + 4, Result::Success); + mem.write8(messagePointer + 8, connected ? 1 : 0); // Hopefully this means no error? +} + void ACService::setClientVersion(u32 messagePointer) { u32 version = mem.read32(messagePointer + 4); log("AC::SetClientVersion (version = %d)\n", version); @@ -71,9 +90,11 @@ void ACService::registerDisconnectEvent(u32 messagePointer) { log("AC::RegisterDisconnectEvent (stubbed)\n"); const u32 pidHeader = mem.read32(messagePointer + 4); const u32 copyHandleHeader = mem.read32(messagePointer + 12); - // Event signaled when disconnecting from AC + // Event signaled when disconnecting from AC. TODO: Properly implement it. const Handle eventHandle = mem.read32(messagePointer + 16); + disconnectEvent = eventHandle; + mem.write32(messagePointer, IPC::responseHeader(0x30, 1, 0)); mem.write32(messagePointer + 4, Result::Success); } \ No newline at end of file