mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-04-18 03:31:31 +12:00
commit
4869375a93
2 changed files with 30 additions and 3 deletions
|
@ -1,4 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
#include "helpers.hpp"
|
#include "helpers.hpp"
|
||||||
#include "kernel_types.hpp"
|
#include "kernel_types.hpp"
|
||||||
#include "logger.hpp"
|
#include "logger.hpp"
|
||||||
|
@ -15,10 +17,14 @@ class ACService {
|
||||||
void closeAsync(u32 messagePointer);
|
void closeAsync(u32 messagePointer);
|
||||||
void createDefaultConfig(u32 messagePointer);
|
void createDefaultConfig(u32 messagePointer);
|
||||||
void getLastErrorCode(u32 messagePointer);
|
void getLastErrorCode(u32 messagePointer);
|
||||||
|
void isConnected(u32 messagePointer);
|
||||||
void registerDisconnectEvent(u32 messagePointer);
|
void registerDisconnectEvent(u32 messagePointer);
|
||||||
void setClientVersion(u32 messagePointer);
|
void setClientVersion(u32 messagePointer);
|
||||||
|
|
||||||
public:
|
bool connected = false;
|
||||||
|
std::optional<Handle> disconnectEvent = std::nullopt;
|
||||||
|
|
||||||
|
public:
|
||||||
ACService(Memory& mem) : mem(mem) {}
|
ACService(Memory& mem) : mem(mem) {}
|
||||||
void reset();
|
void reset();
|
||||||
void handleSyncRequest(u32 messagePointer);
|
void handleSyncRequest(u32 messagePointer);
|
||||||
|
|
|
@ -8,11 +8,15 @@ namespace ACCommands {
|
||||||
CloseAsync = 0x00080004,
|
CloseAsync = 0x00080004,
|
||||||
GetLastErrorCode = 0x000A0000,
|
GetLastErrorCode = 0x000A0000,
|
||||||
RegisterDisconnectEvent = 0x00300004,
|
RegisterDisconnectEvent = 0x00300004,
|
||||||
|
IsConnected = 0x003E0042,
|
||||||
SetClientVersion = 0x00400042,
|
SetClientVersion = 0x00400042,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void ACService::reset() {}
|
void ACService::reset() {
|
||||||
|
connected = false;
|
||||||
|
disconnectEvent = std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
void ACService::handleSyncRequest(u32 messagePointer) {
|
void ACService::handleSyncRequest(u32 messagePointer) {
|
||||||
const u32 command = mem.read32(messagePointer);
|
const u32 command = mem.read32(messagePointer);
|
||||||
|
@ -21,6 +25,7 @@ void ACService::handleSyncRequest(u32 messagePointer) {
|
||||||
case ACCommands::CloseAsync: closeAsync(messagePointer); break;
|
case ACCommands::CloseAsync: closeAsync(messagePointer); break;
|
||||||
case ACCommands::CreateDefaultConfig: createDefaultConfig(messagePointer); break;
|
case ACCommands::CreateDefaultConfig: createDefaultConfig(messagePointer); break;
|
||||||
case ACCommands::GetLastErrorCode: getLastErrorCode(messagePointer); break;
|
case ACCommands::GetLastErrorCode: getLastErrorCode(messagePointer); break;
|
||||||
|
case ACCommands::IsConnected: isConnected(messagePointer); break;
|
||||||
case ACCommands::RegisterDisconnectEvent: registerDisconnectEvent(messagePointer); break;
|
case ACCommands::RegisterDisconnectEvent: registerDisconnectEvent(messagePointer); break;
|
||||||
case ACCommands::SetClientVersion: setClientVersion(messagePointer); break;
|
case ACCommands::SetClientVersion: setClientVersion(messagePointer); break;
|
||||||
default: Helpers::panic("AC service requested. Command: %08X\n", command);
|
default: Helpers::panic("AC service requested. Command: %08X\n", command);
|
||||||
|
@ -37,6 +42,11 @@ void ACService::cancelConnectAsync(u32 messagePointer) {
|
||||||
|
|
||||||
void ACService::closeAsync(u32 messagePointer) {
|
void ACService::closeAsync(u32 messagePointer) {
|
||||||
log("AC::CloseAsync (stubbed)\n");
|
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
|
// TODO: Verify if this response header is correct on hardware
|
||||||
mem.write32(messagePointer, IPC::responseHeader(0x8, 1, 0));
|
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?
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
void ACService::setClientVersion(u32 messagePointer) {
|
void ACService::setClientVersion(u32 messagePointer) {
|
||||||
u32 version = mem.read32(messagePointer + 4);
|
u32 version = mem.read32(messagePointer + 4);
|
||||||
log("AC::SetClientVersion (version = %d)\n", version);
|
log("AC::SetClientVersion (version = %d)\n", version);
|
||||||
|
@ -71,9 +90,11 @@ void ACService::registerDisconnectEvent(u32 messagePointer) {
|
||||||
log("AC::RegisterDisconnectEvent (stubbed)\n");
|
log("AC::RegisterDisconnectEvent (stubbed)\n");
|
||||||
const u32 pidHeader = mem.read32(messagePointer + 4);
|
const u32 pidHeader = mem.read32(messagePointer + 4);
|
||||||
const u32 copyHandleHeader = mem.read32(messagePointer + 12);
|
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);
|
const Handle eventHandle = mem.read32(messagePointer + 16);
|
||||||
|
|
||||||
|
disconnectEvent = eventHandle;
|
||||||
|
|
||||||
mem.write32(messagePointer, IPC::responseHeader(0x30, 1, 0));
|
mem.write32(messagePointer, IPC::responseHeader(0x30, 1, 0));
|
||||||
mem.write32(messagePointer + 4, Result::Success);
|
mem.write32(messagePointer + 4, Result::Success);
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue