diff options
| author | CJ Bok <cjbok@ziggo.nl> | 2020-04-17 01:18:54 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-04-17 09:18:54 +1000 |
| commit | 0a7c6caedffd59011077b49cd6493c7a841a66f5 (patch) | |
| tree | c32ef5e713d0e7e1b1ec65e7a2f17241d9167398 /Ryujinx.HLE/HOS | |
| parent | e4ee61d6c3984d108a9fd9e29c86dd154a04d0c5 (diff) | |
System Time Offset Implementation (#1101)
* System Time Offset Implementation
* Addressed @Thog's comments
* Addressed JD's comments
* Addressed @Thog's and @AcK77's comments
* formatting correction
Diffstat (limited to 'Ryujinx.HLE/HOS')
| -rw-r--r-- | Ryujinx.HLE/HOS/Horizon.cs | 19 | ||||
| -rw-r--r-- | Ryujinx.HLE/HOS/Services/Time/Clock/Types/TimeSpanType.cs | 15 |
2 files changed, 32 insertions, 2 deletions
diff --git a/Ryujinx.HLE/HOS/Horizon.cs b/Ryujinx.HLE/HOS/Horizon.cs index f6021ec7..ccb67edf 100644 --- a/Ryujinx.HLE/HOS/Horizon.cs +++ b/Ryujinx.HLE/HOS/Horizon.cs @@ -9,6 +9,7 @@ using LibHac.Ns; using LibHac.Spl; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; +using Ryujinx.Configuration; using Ryujinx.HLE.FileSystem.Content; using Ryujinx.HLE.HOS.Font; using Ryujinx.HLE.HOS.Kernel.Common; @@ -224,8 +225,24 @@ namespace Ryujinx.HLE.HOS // We assume the rtc is system time. TimeSpanType systemTime = TimeSpanType.FromSeconds((long)rtcValue); + // Configure and setup internal offset + TimeSpanType internalOffset = TimeSpanType.FromSeconds(ConfigurationState.Instance.System.SystemTimeOffset); + + TimeSpanType systemTimeOffset = new TimeSpanType(systemTime.NanoSeconds + internalOffset.NanoSeconds); + + if (systemTime.IsDaylightSavingTime() && !systemTimeOffset.IsDaylightSavingTime()) + { + internalOffset = internalOffset.AddSeconds(3600L); + } + else if (!systemTime.IsDaylightSavingTime() && systemTimeOffset.IsDaylightSavingTime()) + { + internalOffset = internalOffset.AddSeconds(-3600L); + } + + internalOffset = new TimeSpanType(-internalOffset.NanoSeconds); + // First init the standard steady clock - TimeServiceManager.Instance.SetupStandardSteadyClock(null, clockSourceId, systemTime, TimeSpanType.Zero, TimeSpanType.Zero, false); + TimeServiceManager.Instance.SetupStandardSteadyClock(null, clockSourceId, systemTime, internalOffset, TimeSpanType.Zero, false); TimeServiceManager.Instance.SetupStandardLocalSystemClock(null, new SystemClockContext(), systemTime.ToSeconds()); if (NxSettings.Settings.TryGetValue("time!standard_network_clock_sufficient_accuracy_minutes", out object standardNetworkClockSufficientAccuracyMinutes)) diff --git a/Ryujinx.HLE/HOS/Services/Time/Clock/Types/TimeSpanType.cs b/Ryujinx.HLE/HOS/Services/Time/Clock/Types/TimeSpanType.cs index c336ad41..89497d82 100644 --- a/Ryujinx.HLE/HOS/Services/Time/Clock/Types/TimeSpanType.cs +++ b/Ryujinx.HLE/HOS/Services/Time/Clock/Types/TimeSpanType.cs @@ -1,4 +1,5 @@ -using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; namespace Ryujinx.HLE.HOS.Services.Time.Clock { @@ -9,6 +10,8 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock public static readonly TimeSpanType Zero = new TimeSpanType(0); + private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + public long NanoSeconds; public TimeSpanType(long nanoSeconds) @@ -21,6 +24,16 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock return NanoSeconds / NanoSecondsPerSecond; } + public TimeSpanType AddSeconds(long seconds) + { + return new TimeSpanType(NanoSeconds + (seconds * NanoSecondsPerSecond)); + } + + public bool IsDaylightSavingTime() + { + return UnixEpoch.AddSeconds(ToSeconds()).ToLocalTime().IsDaylightSavingTime(); + } + public static TimeSpanType FromSeconds(long seconds) { return new TimeSpanType(seconds * NanoSecondsPerSecond); |
