From 3f16bcc704cebde40fc296b6a58d3fd81aaf7447 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sat, 12 Aug 2023 22:13:46 +0300 Subject: [PATCH] [PTM] Implement GetAdapterState, GetBatteryLevel --- include/services/ptm.hpp | 24 ++++++++++++++++++++++++ src/core/services/ptm.cpp | 24 +++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/include/services/ptm.hpp b/include/services/ptm.hpp index ea07f08d..73bb5431 100644 --- a/include/services/ptm.hpp +++ b/include/services/ptm.hpp @@ -12,6 +12,8 @@ class PTMService { // Service commands void configureNew3DSCPU(u32 messagePointer); + void getAdapterState(u32 messagePointer); + void getBatteryLevel(u32 messagePointer); void getStepHistory(u32 messagePointer); void getTotalStepCount(u32 messagePointer); @@ -19,4 +21,26 @@ public: PTMService(Memory& mem) : mem(mem) {} void reset(); void handleSyncRequest(u32 messagePointer); + + // 0% -> 0 (shutting down) + // 1-5% -> 1 + // 6-10% -> 2 + // 11-30% -> 3 + // 31-60% -> 4 + // 61-100% -> 5 + static constexpr u8 batteryPercentToLevel(u8 percent) { + if (percent == 0) { + return 0; + } else if (percent >= 1 && percent <= 5) { + return 1; + } else if (percent >= 6 && percent <= 10) { + return 2; + } else if (percent >= 11 && percent <= 30) { + return 3; + } else if (percent >= 31 && percent <= 60) { + return 4; + } else { + return 5; + } + } }; \ No newline at end of file diff --git a/src/core/services/ptm.cpp b/src/core/services/ptm.cpp index 1c530987..a0ec9e96 100644 --- a/src/core/services/ptm.cpp +++ b/src/core/services/ptm.cpp @@ -3,9 +3,11 @@ namespace PTMCommands { enum : u32 { + GetAdapterState = 0x00050000, + GetBatteryLevel = 0x00070000, GetStepHistory = 0x000B00C2, GetTotalStepCount = 0x000C0000, - ConfigureNew3DSCPU = 0x08180040 + ConfigureNew3DSCPU = 0x08180040, }; } @@ -15,12 +17,32 @@ void PTMService::handleSyncRequest(u32 messagePointer) { const u32 command = mem.read32(messagePointer); switch (command) { case PTMCommands::ConfigureNew3DSCPU: configureNew3DSCPU(messagePointer); break; + case PTMCommands::GetAdapterState: getAdapterState(messagePointer); break; + case PTMCommands::GetBatteryLevel: getBatteryLevel(messagePointer); break; case PTMCommands::GetStepHistory: getStepHistory(messagePointer); break; case PTMCommands::GetTotalStepCount: getTotalStepCount(messagePointer); break; default: Helpers::panic("PTM service requested. Command: %08X\n", command); } } +void PTMService::getAdapterState(u32 messagePointer) { + log("PTM::GetAdapterState\n"); + constexpr bool adapterConnected = true; // Pretend the 3DS is charging cause why not + + mem.write32(messagePointer, IPC::responseHeader(0x5, 2, 0)); + mem.write32(messagePointer + 4, Result::Success); + mem.write8(messagePointer + 8, adapterConnected ? 1 : 0); +} + +void PTMService::getBatteryLevel(u32 messagePointer) { + log("PTM::GetBatteryLevel"); + constexpr u8 batteryPercent = 3; // 3% battery so users can suffer + + mem.write32(messagePointer, IPC::responseHeader(0x7, 2, 0)); + mem.write32(messagePointer + 4, Result::Success); + mem.write8(messagePointer + 8, batteryPercentToLevel(batteryPercent)); +} + void PTMService::getStepHistory(u32 messagePointer) { log("PTM::GetStepHistory [stubbed]\n"); mem.write32(messagePointer, IPC::responseHeader(0xB, 1, 2));