diff options
Diffstat (limited to '')
-rw-r--r-- | src/core/hle/service/ptm/ptm.cpp | 76 | ||||
-rw-r--r-- | src/core/hle/service/ptm/ptm.h | 65 | ||||
-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.cpp | 99 | ||||
-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.cpp | 166 |
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 |