From 47a469804bf000e47c845da655a169b5a04d7f00 Mon Sep 17 00:00:00 2001 From: german77 Date: Tue, 10 Oct 2023 08:31:38 -0600 Subject: [PATCH] kj --- src/core/core.cpp | 18 ---- .../system_archive/time_zone_binary.cpp | 2 +- src/core/hle/service/set/set_sys.h | 6 +- .../time/clock_interfaces/steady_clock.h | 2 + .../time/clock_interfaces/system_clock.h | 2 + .../time/clock_types/local_system_clock.cpp | 1 - .../time/clock_types/network_system_clock.cpp | 1 - .../time/clock_types/user_system_clock.cpp | 1 - src/core/hle/service/time/time_manager.cpp | 96 ++++++++++++++++++- src/core/hle/service/time/time_manager.h | 10 +- .../time/time_zone/time_zone_service.h | 2 + 11 files changed, 108 insertions(+), 33 deletions(-) diff --git a/src/core/core.cpp b/src/core/core.cpp index 1b5c892e4..e3574de48 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -147,8 +147,6 @@ struct System::Impl { core_timing.SetMulticore(is_multicore); core_timing.Initialize([&system]() { system.RegisterHostThread(); }); - RefreshTime(); - // Create a default fs if one doesn't already exist. if (virtual_filesystem == nullptr) { virtual_filesystem = std::make_shared(); @@ -186,16 +184,6 @@ struct System::Impl { Initialize(system); } - void RefreshTime() { - const auto posix_time = std::chrono::system_clock::now().time_since_epoch(); - const auto current_time = - std::chrono::duration_cast(posix_time).count(); - Settings::values.custom_rtc_differential = - (Settings::values.custom_rtc_enabled ? Settings::values.custom_rtc.GetValue() - : current_time) - - current_time; - } - void Run() { std::unique_lock lk(suspend_guard); @@ -1061,13 +1049,7 @@ void System::Exit() { } void System::ApplySettings() { - impl->RefreshTime(); - if (IsPoweredOn()) { - if (Settings::values.custom_rtc_enabled) { - const s64 posix_time{Settings::values.custom_rtc.GetValue()}; - GetTimeManager().UpdateLocalSystemClockTime(posix_time); - } Renderer().RefreshBaseSettings(); } } diff --git a/src/core/file_sys/system_archive/time_zone_binary.cpp b/src/core/file_sys/system_archive/time_zone_binary.cpp index 7c17bbefa..f1c54c3de 100644 --- a/src/core/file_sys/system_archive/time_zone_binary.cpp +++ b/src/core/file_sys/system_archive/time_zone_binary.cpp @@ -6,7 +6,7 @@ #include "common/swap.h" #include "core/file_sys/system_archive/time_zone_binary.h" #include "core/file_sys/vfs_vector.h" -#include "core/hle/service/time/time_zone_types.h" +#include "core/hle/service/time/time_zone/time_zone_types.h" #include "nx_tzdb.h" diff --git a/src/core/hle/service/set/set_sys.h b/src/core/hle/service/set/set_sys.h index c7dba2a9e..6094f0f11 100644 --- a/src/core/hle/service/set/set_sys.h +++ b/src/core/hle/service/set/set_sys.h @@ -5,7 +5,7 @@ #include "common/uuid.h" #include "core/hle/service/service.h" -#include "core/hle/service/time/clock_types.h" +#include "core/hle/service/time/time_types.h" namespace Core { class System; @@ -254,7 +254,7 @@ private: struct InitialLaunchSettings { InitialLaunchFlag flags; INSERT_PADDING_BYTES(0x4); - Time::Clock::SteadyClockTimePoint timestamp; + Time::SteadyClockTimePoint timestamp; }; static_assert(sizeof(InitialLaunchSettings) == 0x20, "InitialLaunchSettings is incorrect size"); @@ -265,7 +265,7 @@ private: EulaVersionClockType clock_type; INSERT_PADDING_BYTES(0x4); s64 posix_time; - Time::Clock::SteadyClockTimePoint timestamp; + Time::SteadyClockTimePoint timestamp; }; static_assert(sizeof(EulaVersion) == 0x30, "EulaVersion is incorrect size"); diff --git a/src/core/hle/service/time/clock_interfaces/steady_clock.h b/src/core/hle/service/time/clock_interfaces/steady_clock.h index 9ddafc5b9..efd85606b 100644 --- a/src/core/hle/service/time/clock_interfaces/steady_clock.h +++ b/src/core/hle/service/time/clock_interfaces/steady_clock.h @@ -20,6 +20,8 @@ public: bool IsInitialized(); + void UpdateTime(); + private: void GetCurrentTimePoint(HLERequestContext& ctx); diff --git a/src/core/hle/service/time/clock_interfaces/system_clock.h b/src/core/hle/service/time/clock_interfaces/system_clock.h index 95c4d5262..2b406e6a3 100644 --- a/src/core/hle/service/time/clock_interfaces/system_clock.h +++ b/src/core/hle/service/time/clock_interfaces/system_clock.h @@ -21,6 +21,8 @@ public: Result GetClockContext(SystemClockContext& out_context); bool IsStandardNetworkSystemClockAccuracySufficient(); + void UpdateTime(); + private: void GetCurrentTime(HLERequestContext& ctx); void GetSystemClockContext(HLERequestContext& ctx); diff --git a/src/core/hle/service/time/clock_types/local_system_clock.cpp b/src/core/hle/service/time/clock_types/local_system_clock.cpp index e90b98998..4b411a669 100644 --- a/src/core/hle/service/time/clock_types/local_system_clock.cpp +++ b/src/core/hle/service/time/clock_types/local_system_clock.cpp @@ -4,6 +4,5 @@ #include "common/logging/log.h" #include "core/core.h" #include "core/hle/service/time/clock_types/steady_clock.h" -#include "core/hle/service/time/clock_types/system_clock.h" namespace Service::Time {} // namespace Service::Time diff --git a/src/core/hle/service/time/clock_types/network_system_clock.cpp b/src/core/hle/service/time/clock_types/network_system_clock.cpp index e90b98998..4b411a669 100644 --- a/src/core/hle/service/time/clock_types/network_system_clock.cpp +++ b/src/core/hle/service/time/clock_types/network_system_clock.cpp @@ -4,6 +4,5 @@ #include "common/logging/log.h" #include "core/core.h" #include "core/hle/service/time/clock_types/steady_clock.h" -#include "core/hle/service/time/clock_types/system_clock.h" namespace Service::Time {} // namespace Service::Time diff --git a/src/core/hle/service/time/clock_types/user_system_clock.cpp b/src/core/hle/service/time/clock_types/user_system_clock.cpp index e90b98998..4b411a669 100644 --- a/src/core/hle/service/time/clock_types/user_system_clock.cpp +++ b/src/core/hle/service/time/clock_types/user_system_clock.cpp @@ -4,6 +4,5 @@ #include "common/logging/log.h" #include "core/core.h" #include "core/hle/service/time/clock_types/steady_clock.h" -#include "core/hle/service/time/clock_types/system_clock.h" namespace Service::Time {} // namespace Service::Time diff --git a/src/core/hle/service/time/time_manager.cpp b/src/core/hle/service/time/time_manager.cpp index e90b98998..9bdaa6ce5 100644 --- a/src/core/hle/service/time/time_manager.cpp +++ b/src/core/hle/service/time/time_manager.cpp @@ -3,7 +3,97 @@ #include "common/logging/log.h" #include "core/core.h" -#include "core/hle/service/time/clock_types/steady_clock.h" -#include "core/hle/service/time/clock_types/system_clock.h" +#include "core/hle/service/time/time_manager.h" +#include "core/core_timing.h" -namespace Service::Time {} // namespace Service::Time +namespace Service::Time { +constexpr auto time_update_ns = + std::chrono::nanoseconds{5ull * 60 * 1000 * 1000 * 1000}; // (5 minutes) + +TimeManager::TimeManager(Core::System& system_) : time_zone_service{system_}, system{system_} { + + // Register update callbacks + time_update_event = Core::Timing::CreateEvent( + "HID::UpdatePadCallback", + [this](std::uintptr_t user_data, s64 time, + std::chrono::nanoseconds ns_late) -> std::optional { + UpdateTime(); + return std::nullopt; + }); + + system.CoreTiming().ScheduleLoopingEvent(time_update_ns, time_update_ns, time_update_event); +} + +TimeManager::~TimeManager() { + system.CoreTiming().UnscheduleEvent(time_update_event, 0); +}; + +void TimeManager::UpdateTime() { + steady_clock.UpdateTime(); + local_system_clock.UpdateTime(); + network_system_clock.UpdateTime(); + user_system_clock.UpdateTime(); + time_zone_service.UpdateTime(); +} + +bool TimeManager::IsAutomaticCorrectionEnabled() const { + return false; +} + +Result TimeManager::GetCurrentTimePoint(SteadyClockTimePoint& out_steady_time_point) const { + + return ResultSuccess; +} + +Result TimeManager::GetLocationName(TimeZone::LocationName& out_name) const { + + return ResultSuccess; +} + +Result TimeManager::GetCalendarTime(TimeZone::CalendarTime& out_calendar_time, + TimeZone::CalendarAdditionalInfo& out_calendar_aditional_info, + s64 time) const { + return ResultSuccess; +} + +SteadyClock& TimeManager::GetStandardSteadyClock() { + return steady_clock; +} + +const SteadyClock& TimeManager::GetStandardSteadyClock() const { + return steady_clock; +} + +LocalSystemClock& TimeManager::GetStandardLocalSystemClock() { + return local_system_clock; +} + +const LocalSystemClock& TimeManager::GetStandardLocalSystemClock() const { + return local_system_clock; +} + +NetworkSystemClock& TimeManager::GetStandardNetworkSystemClock() { + return network_system_clock; +} + +const NetworkSystemClock& TimeManager::GetStandardNetworkSystemClock() const { + return network_system_clock; +} + +UserSystemClock& TimeManager::GetStandardUserSystemClock() { + return user_system_clock; +} + +const UserSystemClock& TimeManager::GetStandardUserSystemClock() const { + return user_system_clock; +} + +ITimeZoneService& TimeManager::GetTimeZoneService() { + return time_zone_service; +} + +const ITimeZoneService& TimeManager::GetTimeZoneService() const { + return time_zone_service; +} + +} // namespace Service::Time diff --git a/src/core/hle/service/time/time_manager.h b/src/core/hle/service/time/time_manager.h index cc14a5ba1..bda93a36b 100644 --- a/src/core/hle/service/time/time_manager.h +++ b/src/core/hle/service/time/time_manager.h @@ -30,31 +30,31 @@ public: s64 time) const; SteadyClock& GetStandardSteadyClock(); - const SteadyClock& GetStandardSteadyClock() const; LocalSystemClock& GetStandardLocalSystemClock(); - const LocalSystemClock& GetStandardLocalSystemClock() const; NetworkSystemClock& GetStandardNetworkSystemClock(); - const NetworkSystemClock& GetStandardNetworkSystemClock() const; UserSystemClock& GetStandardUserSystemClock(); - const UserSystemClock& GetStandardUserSystemClock() const; ITimeZoneService& GetTimeZoneService(); - const ITimeZoneService& GetTimeZoneService() const; private: + void UpdateTime(); + + std::shared_ptr time_update_event; + SteadyClock steady_clock; LocalSystemClock local_system_clock; NetworkSystemClock network_system_clock; UserSystemClock user_system_clock; ITimeZoneService time_zone_service; + Core::System& system; }; } // namespace Service::Time diff --git a/src/core/hle/service/time/time_zone/time_zone_service.h b/src/core/hle/service/time/time_zone/time_zone_service.h index 03aae6f81..7bf6e141d 100644 --- a/src/core/hle/service/time/time_zone/time_zone_service.h +++ b/src/core/hle/service/time/time_zone/time_zone_service.h @@ -16,6 +16,8 @@ public: explicit ITimeZoneService(Core::System& system_); ~ITimeZoneService(); + void UpdateTime(); + private: void GetDeviceLocationName(HLERequestContext& ctx); void GetTotalLocationNameCount(HLERequestContext& ctx);