summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/ptm
diff options
context:
space:
mode:
authorSubv <subv2112@gmail.com>2015-02-27 03:13:08 +0100
committerSubv <subv2112@gmail.com>2015-03-04 03:48:08 +0100
commit83a8975cb89b908b4737d647a210c19775f25ed7 (patch)
tree53fd0e37dcab9c3a5328338273315b159381d949 /src/core/hle/service/ptm
parentMerge pull request #622 from Subv/titles (diff)
downloadyuzu-83a8975cb89b908b4737d647a210c19775f25ed7.tar
yuzu-83a8975cb89b908b4737d647a210c19775f25ed7.tar.gz
yuzu-83a8975cb89b908b4737d647a210c19775f25ed7.tar.bz2
yuzu-83a8975cb89b908b4737d647a210c19775f25ed7.tar.lz
yuzu-83a8975cb89b908b4737d647a210c19775f25ed7.tar.xz
yuzu-83a8975cb89b908b4737d647a210c19775f25ed7.tar.zst
yuzu-83a8975cb89b908b4737d647a210c19775f25ed7.zip
Diffstat (limited to '')
-rw-r--r--src/core/hle/service/ptm/ptm.cpp76
-rw-r--r--src/core/hle/service/ptm/ptm.h65
-rw-r--r--src/core/hle/service/ptm/ptm_play.cpp (renamed from src/core/hle/service/ptm_play.cpp)16
-rw-r--r--src/core/hle/service/ptm/ptm_play.h (renamed from src/core/hle/service/ptm_play.h)13
-rw-r--r--src/core/hle/service/ptm/ptm_sysm.cpp (renamed from src/core/hle/service/ptm_sysm.cpp)16
-rw-r--r--src/core/hle/service/ptm/ptm_sysm.h (renamed from src/core/hle/service/ptm_sysm.h)13
-rw-r--r--src/core/hle/service/ptm/ptm_u.cpp99
-rw-r--r--src/core/hle/service/ptm/ptm_u.h (renamed from src/core/hle/service/ptm_u.h)15
-rw-r--r--src/core/hle/service/ptm_u.cpp166
9 files changed, 270 insertions, 209 deletions
diff --git a/src/core/hle/service/ptm/ptm.cpp b/src/core/hle/service/ptm/ptm.cpp
new file mode 100644
index 000000000..56c918d4f
--- /dev/null
+++ b/src/core/hle/service/ptm/ptm.cpp
@@ -0,0 +1,76 @@
+// Copyright 2015 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/service/service.h"
+#include "core/hle/service/fs/archive.h"
+#include "core/hle/service/ptm/ptm.h"
+#include "core/hle/service/ptm/ptm_play.h"
+#include "core/hle/service/ptm/ptm_sysm.h"
+#include "core/hle/service/ptm/ptm_u.h"
+
+namespace Service {
+namespace PTM {
+
+/// Values for the default gamecoin.dat file
+static const GameCoin default_game_coin = { 0x4F00, 42, 0, 0, 0, 2014, 12, 29 };
+
+/// Id of the SharedExtData archive used by the PTM process
+static const std::vector<u8> ptm_shared_extdata_id = {0, 0, 0, 0, 0x0B, 0, 0, 0xF0, 0, 0, 0, 0};
+
+static bool shell_open = true;
+
+static bool battery_is_charging = true;
+
+u32 GetAdapterState() {
+ // TODO(purpasmart96): This function is only a stub,
+ // it returns a valid result without implementing full functionality.
+ return battery_is_charging ? 1 : 0;
+}
+
+u32 GetShellState() {
+ return shell_open ? 1 : 0;
+}
+
+ChargeLevels GetBatteryLevel() {
+ // TODO(purpasmart96): This function is only a stub,
+ // it returns a valid result without implementing full functionality.
+ return ChargeLevels::CompletelyFull; // Set to a completely full battery
+}
+
+void PTMInit() {
+ AddService(new PTM_Play_Interface);
+ AddService(new PTM_Sysm_Interface);
+ AddService(new PTM_U_Interface);
+
+ // Open the SharedExtSaveData archive 0xF000000B and create the gamecoin.dat file if it doesn't exist
+ FileSys::Path archive_path(ptm_shared_extdata_id);
+ auto archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::SharedExtSaveData, archive_path);
+ // If the archive didn't exist, create the files inside
+ if (archive_result.Code().description == ErrorDescription::FS_NotFormatted) {
+ // Format the archive to create the directories
+ Service::FS::FormatArchive(Service::FS::ArchiveIdCode::SharedExtSaveData, archive_path);
+ // Open it again to get a valid archive now that the folder exists
+ archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::SharedExtSaveData, archive_path);
+ ASSERT_MSG(archive_result.Succeeded(), "Could not open the PTM SharedExtSaveData archive!");
+
+ FileSys::Path gamecoin_path("gamecoin.dat");
+ FileSys::Mode open_mode = {};
+ open_mode.write_flag = 1;
+ open_mode.create_flag = 1;
+ // Open the file and write the default gamecoin information
+ auto gamecoin_result = Service::FS::OpenFileFromArchive(*archive_result, gamecoin_path, open_mode);
+ if (gamecoin_result.Succeeded()) {
+ auto gamecoin = gamecoin_result.MoveFrom();
+ gamecoin->backend->Write(0, sizeof(GameCoin), 1, reinterpret_cast<const u8*>(&default_game_coin));
+ gamecoin->backend->Close();
+ }
+ }
+}
+
+void PTMShutdown() {
+
+}
+
+} // namespace PTM
+} // namespace Service
diff --git a/src/core/hle/service/ptm/ptm.h b/src/core/hle/service/ptm/ptm.h
new file mode 100644
index 000000000..f697aae4d
--- /dev/null
+++ b/src/core/hle/service/ptm/ptm.h
@@ -0,0 +1,65 @@
+// Copyright 2015 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <array>
+#include "core/hle/result.h"
+
+namespace Service {
+namespace PTM {
+
+/// Charge levels used by PTM functions
+enum class ChargeLevels : u32 {
+ CriticalBattery = 1,
+ LowBattery = 2,
+ HalfFull = 3,
+ MostlyFull = 4,
+ CompletelyFull = 5,
+};
+
+/**
+ * Represents the gamecoin file structure in the SharedExtData archive
+ * More information in 3dbrew (http://www.3dbrew.org/wiki/Extdata#Shared_Extdata_0xf000000b_gamecoin.dat)
+ */
+struct GameCoin {
+ u32 magic; ///< Magic number: 0x4F00
+ u16 total_coins; ///< Total Play Coins
+ u16 total_coins_on_date; ///< Total Play Coins obtained on the date stored below.
+ u32 step_count; ///< Total step count at the time a new Play Coin was obtained.
+ u32 last_step_count; ///< Step count for the day the last Play Coin was obtained
+ u16 year;
+ u8 month;
+ u8 day;
+};
+
+/**
+ * Returns whether the battery is charging or not.
+ * It is unknown if GetAdapterState is the same as GetBatteryChargeState,
+ * it is likely to just be a duplicate function of GetBatteryChargeState
+ * that controls another part of the HW.
+ * @returns 1 if the battery is charging, and 0 otherwise.
+ */
+u32 GetAdapterState();
+
+/**
+ * Returns whether the 3DS's physical shell casing is open or closed
+ * @returns 1 if the shell is open, and 0 if otherwise
+ */
+u32 GetShellState();
+
+/**
+ * Get the current battery's charge level.
+ * @returns The battery's charge level.
+ */
+ChargeLevels GetBatteryLevel();
+
+/// Initialize the PTM service
+void PTMInit();
+
+/// Shutdown the PTM service
+void PTMShutdown();
+
+} // namespace PTM
+} // namespace Service
diff --git a/src/core/hle/service/ptm_play.cpp b/src/core/hle/service/ptm/ptm_play.cpp
index f21d9088e..8e8ae8558 100644
--- a/src/core/hle/service/ptm_play.cpp
+++ b/src/core/hle/service/ptm/ptm_play.cpp
@@ -3,12 +3,10 @@
// Refer to the license.txt file included.
#include "core/hle/hle.h"
-#include "core/hle/service/ptm_play.h"
+#include "core/hle/service/ptm/ptm_play.h"
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// Namespace PTM_PLAY
-
-namespace PTM_PLAY {
+namespace Service {
+namespace PTM {
const Interface::FunctionInfo FunctionTable[] = {
{ 0x08070082, nullptr, "GetPlayHistory" },
@@ -17,11 +15,9 @@ const Interface::FunctionInfo FunctionTable[] = {
{ 0x080B0080, nullptr, "CalcPlayHistoryStart" },
};
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// Interface class
-
-Interface::Interface() {
+PTM_Play_Interface::PTM_Play_Interface() {
Register(FunctionTable);
}
-} // namespace
+} // namespace PTM
+} // namespace Service \ No newline at end of file
diff --git a/src/core/hle/service/ptm_play.h b/src/core/hle/service/ptm/ptm_play.h
index 2f4f0d6fd..e5c3e04df 100644
--- a/src/core/hle/service/ptm_play.h
+++ b/src/core/hle/service/ptm/ptm_play.h
@@ -6,18 +6,17 @@
#include "core/hle/service/service.h"
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// Namespace PTM_PLAY
+namespace Service {
+namespace PTM {
-namespace PTM_PLAY {
-
-class Interface : public Service::Interface {
+class PTM_Play_Interface : public Service::Interface {
public:
- Interface();
+ PTM_Play_Interface();
std::string GetPortName() const override {
return "ptm:play";
}
};
-} // namespace
+} // namespace PTM
+} // namespace Service
diff --git a/src/core/hle/service/ptm_sysm.cpp b/src/core/hle/service/ptm/ptm_sysm.cpp
index dc4a9c569..2d841f69c 100644
--- a/src/core/hle/service/ptm_sysm.cpp
+++ b/src/core/hle/service/ptm/ptm_sysm.cpp
@@ -5,12 +5,10 @@
#include "common/make_unique.h"
#include "core/file_sys/archive_extsavedata.h"
#include "core/hle/hle.h"
-#include "core/hle/service/ptm_sysm.h"
+#include "core/hle/service/ptm/ptm_sysm.h"
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// Namespace PTM_SYSM
-
-namespace PTM_SYSM {
+namespace Service {
+namespace PTM {
/**
* Returns whether the system is powering off (?)
@@ -57,11 +55,9 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x08140000, nullptr, "GetLegacyJumpProhibitedFlag"}
};
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// Interface class
-
-Interface::Interface() {
+PTM_Sysm_Interface::PTM_Sysm_Interface() {
Register(FunctionTable);
}
-} // namespace
+} // namespace PTM
+} // namespace Service
diff --git a/src/core/hle/service/ptm_sysm.h b/src/core/hle/service/ptm/ptm_sysm.h
index 0f267b214..e37f20546 100644
--- a/src/core/hle/service/ptm_sysm.h
+++ b/src/core/hle/service/ptm/ptm_sysm.h
@@ -6,18 +6,17 @@
#include "core/hle/service/service.h"
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// Namespace PTM_SYSM
+namespace Service {
+namespace PTM {
-namespace PTM_SYSM {
-
-class Interface : public Service::Interface {
+class PTM_Sysm_Interface : public Interface {
public:
- Interface();
+ PTM_Sysm_Interface();
std::string GetPortName() const override {
return "ptm:sysm";
}
};
-} // namespace
+} // namespace PTM
+} // namespace Service
diff --git a/src/core/hle/service/ptm/ptm_u.cpp b/src/core/hle/service/ptm/ptm_u.cpp
new file mode 100644
index 000000000..0af7c8bf6
--- /dev/null
+++ b/src/core/hle/service/ptm/ptm_u.cpp
@@ -0,0 +1,99 @@
+// Copyright 2014 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "common/make_unique.h"
+
+#include "core/hle/hle.h"
+#include "core/hle/service/ptm/ptm.h"
+#include "core/hle/service/ptm/ptm_u.h"
+
+namespace Service {
+namespace PTM {
+
+/**
+ * PTM_U::GetAdapterState service function
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : Output of function, 0 = not charging, 1 = charging.
+ */
+static void GetAdapterState(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = GetAdapterState();
+
+ LOG_WARNING(Service_PTM, "(STUBBED) called");
+}
+
+/*
+ * PTM_User::GetShellState service function.
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : Whether the 3DS's physical shell casing is open (1) or closed (0)
+ */
+static void GetShellState(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = GetShellState();
+}
+
+/**
+ * PTM_U::GetBatteryLevel service function
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : Battery level, 5 = completely full battery, 4 = mostly full battery,
+ * 3 = half full battery, 2 = low battery, 1 = critical battery.
+ */
+static void GetBatteryLevel(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = static_cast<u32>(GetBatteryLevel());
+
+ LOG_WARNING(Service_PTM, "(STUBBED) called");
+}
+
+/**
+ * PTM_U::GetBatteryChargeState service function
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : Output of function, 0 = not charging, 1 = charging.
+ */
+static void GetBatteryChargeState(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ // TODO(purpasmart96): This function is only a stub,
+ // it returns a valid result without implementing full functionality.
+
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = GetAdapterState();
+
+ LOG_WARNING(Service_PTM, "(STUBBED) called");
+}
+
+const Interface::FunctionInfo FunctionTable[] = {
+ {0x00010002, nullptr, "RegisterAlarmClient"},
+ {0x00020080, nullptr, "SetRtcAlarm"},
+ {0x00030000, nullptr, "GetRtcAlarm"},
+ {0x00040000, nullptr, "CancelRtcAlarm"},
+ {0x00050000, GetAdapterState, "GetAdapterState"},
+ {0x00060000, GetShellState, "GetShellState"},
+ {0x00070000, GetBatteryLevel, "GetBatteryLevel"},
+ {0x00080000, GetBatteryChargeState, "GetBatteryChargeState"},
+ {0x00090000, nullptr, "GetPedometerState"},
+ {0x000A0042, nullptr, "GetStepHistoryEntry"},
+ {0x000B00C2, nullptr, "GetStepHistory"},
+ {0x000C0000, nullptr, "GetTotalStepCount"},
+ {0x000D0040, nullptr, "SetPedometerRecordingMode"},
+ {0x000E0000, nullptr, "GetPedometerRecordingMode"},
+ {0x000F0084, nullptr, "GetStepHistoryAll"},
+};
+
+PTM_U_Interface::PTM_U_Interface() {
+ Register(FunctionTable);
+}
+
+} // namespace PTM
+} // namespace Service
diff --git a/src/core/hle/service/ptm_u.h b/src/core/hle/service/ptm/ptm_u.h
index a44624fd5..bf132f610 100644
--- a/src/core/hle/service/ptm_u.h
+++ b/src/core/hle/service/ptm/ptm_u.h
@@ -6,20 +6,17 @@
#include "core/hle/service/service.h"
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// Namespace PTM_U
+namespace Service {
+namespace PTM {
-// ptm service
-
-namespace PTM_U {
-
-class Interface : public Service::Interface {
+class PTM_U_Interface : public Interface {
public:
- Interface();
+ PTM_U_Interface();
std::string GetPortName() const override {
return "ptm:u";
}
};
-} // namespace
+} // namespace PTM
+} // namespace Service \ No newline at end of file
diff --git a/src/core/hle/service/ptm_u.cpp b/src/core/hle/service/ptm_u.cpp
deleted file mode 100644
index 7121d837c..000000000
--- a/src/core/hle/service/ptm_u.cpp
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright 2014 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include "common/make_unique.h"
-
-#include "core/hle/hle.h"
-#include "core/hle/service/fs/archive.h"
-#include "core/hle/service/ptm_u.h"
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// Namespace PTM_U
-
-namespace PTM_U {
-
-/**
- * Represents the gamecoin file structure in the SharedExtData archive
- * More information in 3dbrew (http://www.3dbrew.org/wiki/Extdata#Shared_Extdata_0xf000000b_gamecoin.dat)
- */
-struct GameCoin {
- u32 magic; ///< Magic number: 0x4F00
- u16 total_coins; ///< Total Play Coins
- u16 total_coins_on_date; ///< Total Play Coins obtained on the date stored below.
- u32 step_count; ///< Total step count at the time a new Play Coin was obtained.
- u32 last_step_count; ///< Step count for the day the last Play Coin was obtained
- u16 year;
- u8 month;
- u8 day;
-};
-static const GameCoin default_game_coin = { 0x4F00, 42, 0, 0, 0, 2014, 12, 29 };
-static const std::vector<u8> ptm_shared_extdata_id = {0, 0, 0, 0, 0x0B, 0, 0, 0xF0, 0, 0, 0, 0};
-
-/// Charge levels used by PTM functions
-enum class ChargeLevels : u32 {
- CriticalBattery = 1,
- LowBattery = 2,
- HalfFull = 3,
- MostlyFull = 4,
- CompletelyFull = 5,
-};
-
-static bool shell_open = true;
-
-static bool battery_is_charging = true;
-
-/**
- * It is unknown if GetAdapterState is the same as GetBatteryChargeState,
- * it is likely to just be a duplicate function of GetBatteryChargeState
- * that controls another part of the HW.
- * PTM_U::GetAdapterState service function
- * Outputs:
- * 1 : Result of function, 0 on success, otherwise error code
- * 2 : Output of function, 0 = not charging, 1 = charging.
- */
-static void GetAdapterState(Service::Interface* self) {
- u32* cmd_buff = Kernel::GetCommandBuffer();
-
- // TODO(purpasmart96): This function is only a stub,
- // it returns a valid result without implementing full functionality.
-
- cmd_buff[1] = 0; // No error
- cmd_buff[2] = battery_is_charging ? 1 : 0;
-
- LOG_WARNING(Service_PTM, "(STUBBED) called");
-}
-
-/*
- * PTM_User::GetShellState service function.
- * Outputs:
- * 1 : Result of function, 0 on success, otherwise error code
- * 2 : Whether the 3DS's physical shell casing is open (1) or closed (0)
- */
-static void GetShellState(Service::Interface* self) {
- u32* cmd_buff = Kernel::GetCommandBuffer();
-
- cmd_buff[1] = 0;
- cmd_buff[2] = shell_open ? 1 : 0;
-}
-
-/**
- * PTM_U::GetBatteryLevel service function
- * Outputs:
- * 1 : Result of function, 0 on success, otherwise error code
- * 2 : Battery level, 5 = completely full battery, 4 = mostly full battery,
- * 3 = half full battery, 2 = low battery, 1 = critical battery.
- */
-static void GetBatteryLevel(Service::Interface* self) {
- u32* cmd_buff = Kernel::GetCommandBuffer();
-
- // TODO(purpasmart96): This function is only a stub,
- // it returns a valid result without implementing full functionality.
-
- cmd_buff[1] = 0; // No error
- cmd_buff[2] = static_cast<u32>(ChargeLevels::CompletelyFull); // Set to a completely full battery
-
- LOG_WARNING(Service_PTM, "(STUBBED) called");
-}
-
-/**
- * PTM_U::GetBatteryChargeState service function
- * Outputs:
- * 1 : Result of function, 0 on success, otherwise error code
- * 2 : Output of function, 0 = not charging, 1 = charging.
- */
-static void GetBatteryChargeState(Service::Interface* self) {
- u32* cmd_buff = Kernel::GetCommandBuffer();
-
- // TODO(purpasmart96): This function is only a stub,
- // it returns a valid result without implementing full functionality.
-
- cmd_buff[1] = 0; // No error
- cmd_buff[2] = battery_is_charging ? 1 : 0;
-
- LOG_WARNING(Service_PTM, "(STUBBED) called");
-}
-
-const Interface::FunctionInfo FunctionTable[] = {
- {0x00010002, nullptr, "RegisterAlarmClient"},
- {0x00020080, nullptr, "SetRtcAlarm"},
- {0x00030000, nullptr, "GetRtcAlarm"},
- {0x00040000, nullptr, "CancelRtcAlarm"},
- {0x00050000, GetAdapterState, "GetAdapterState"},
- {0x00060000, GetShellState, "GetShellState"},
- {0x00070000, GetBatteryLevel, "GetBatteryLevel"},
- {0x00080000, GetBatteryChargeState, "GetBatteryChargeState"},
- {0x00090000, nullptr, "GetPedometerState"},
- {0x000A0042, nullptr, "GetStepHistoryEntry"},
- {0x000B00C2, nullptr, "GetStepHistory"},
- {0x000C0000, nullptr, "GetTotalStepCount"},
- {0x000D0040, nullptr, "SetPedometerRecordingMode"},
- {0x000E0000, nullptr, "GetPedometerRecordingMode"},
- {0x000F0084, nullptr, "GetStepHistoryAll"},
-};
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// Interface class
-
-Interface::Interface() {
- Register(FunctionTable);
-
- // Open the SharedExtSaveData archive 0xF000000B and the gamecoin.dat file
- FileSys::Path archive_path(ptm_shared_extdata_id);
- auto archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::SharedExtSaveData, archive_path);
- // If the archive didn't exist, create the files inside
- if (archive_result.Code().description == ErrorDescription::FS_NotFormatted) {
- // Format the archive to create the directories
- Service::FS::FormatArchive(Service::FS::ArchiveIdCode::SharedExtSaveData, archive_path);
- // Open it again to get a valid archive now that the folder exists
- archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::SharedExtSaveData, archive_path);
- ASSERT_MSG(archive_result.Succeeded(), "Could not open the PTM SharedExtSaveData archive!");
-
- FileSys::Path gamecoin_path("gamecoin.dat");
- FileSys::Mode open_mode = {};
- open_mode.write_flag = 1;
- open_mode.create_flag = 1;
- // Open the file and write the default gamecoin information
- auto gamecoin_result = Service::FS::OpenFileFromArchive(*archive_result, gamecoin_path, open_mode);
- if (gamecoin_result.Succeeded()) {
- auto gamecoin = gamecoin_result.MoveFrom();
- gamecoin->backend->Write(0, sizeof(GameCoin), 1, reinterpret_cast<const u8*>(&default_game_coin));
- gamecoin->backend->Close();
- }
- }
-}
-
-} // namespace