diff --git a/CHANGELOG.md b/CHANGELOG.md
index e99f693..194332d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,7 +6,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
## [Unreleased]
-
### Added
- Added Shim to read a list from xml with no root element
- Added a URI query builder
@@ -15,7 +14,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- Fixed JSON DateTime parsing in .Net Standard
- Fixed threading exception in TypeExtensions
-
## [9.4.0] - 2019-05-10
### Added
- Added extension method for peeking queues
@@ -69,6 +67,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- Better VC-4 support for IcdConsole
- JSON refactoring for simpler deserialization
+## [8.4.1] - 2019-06-05
+### Changed
+ - Caching the program/processor start time and calculating the uptime from those values instead of polling the crestron processor
+
## [8.4.0] - 2019-05-15
### Added
- Added GUID utils for generating seeded GUIDs
diff --git a/ICD.Common.Utils/ProcessorUtils.SimplSharp.cs b/ICD.Common.Utils/ProcessorUtils.SimplSharp.cs
index f2ac4f7..8a09ee7 100644
--- a/ICD.Common.Utils/ProcessorUtils.SimplSharp.cs
+++ b/ICD.Common.Utils/ProcessorUtils.SimplSharp.cs
@@ -14,13 +14,16 @@ namespace ICD.Common.Utils
private const string UPTIME_COMMAND = "uptime";
private const string PROGUPTIME_COMMAND_ROOT = "proguptime:{0}";
- private const string UPTIME_REGEX = @".*(?'uptime'\d+ days \d{2}:\d{2}:\d{2}\.\d+)";
+ private const string UPTIME_REGEX = @".*(?'uptime'(?'days'\d+) days (?'hours'\d{2}):(?'minutes'\d{2}):(?'seconds'\d{2})\.(?'milliseconds'\d+))";
private const string RAMFREE_COMMAND = "ramfree";
private const string RAMFREE_DIGITS_REGEX = @"^(\d*)";
private static string s_VersionResult;
+ private static DateTime? s_SystemUptimeStartTime;
+ private static DateTime? s_ProgramUptimeStartTime;
+
#region Properties
///
@@ -232,24 +235,53 @@ namespace ICD.Common.Utils
///
///
[PublicAPI]
- public static string GetSystemUptime()
+ public static TimeSpan GetSystemUptime()
{
- string uptime = GetUptime();
- Match match = Regex.Match(uptime, UPTIME_REGEX);
- return match.Groups["uptime"].Value;
+ if (s_SystemUptimeStartTime == null)
+ {
+ string uptime = GetSystemUptimeFeedback();
+ Match match = Regex.Match(uptime, UPTIME_REGEX);
+ if (!match.Success)
+ return default(TimeSpan);
+
+ int days = int.Parse(match.Groups["days"].Value);
+ int hours = int.Parse(match.Groups["hours"].Value);
+ int minutes = int.Parse(match.Groups["minutes"].Value);
+ int seconds = int.Parse(match.Groups["seconds"].Value);
+ int milliseconds = int.Parse(match.Groups["milliseconds"].Value);
+
+ TimeSpan span = new TimeSpan(days, hours, minutes, seconds, milliseconds);
+ s_SystemUptimeStartTime = IcdEnvironment.GetLocalTime() - span;
+ }
+
+ return IcdEnvironment.GetLocalTime() - s_SystemUptimeStartTime.Value;
}
///
- /// Gets the uptime
+ /// Gets the uptime of the current program.
///
- ///
///
[PublicAPI]
- public static string GetProgramUptime(int progslot)
+ public static TimeSpan GetProgramUptime()
{
- string uptime = GetUptime(progslot);
- Match match = Regex.Match(uptime, UPTIME_REGEX);
- return match.Groups["uptime"].Value;
+ if (s_ProgramUptimeStartTime == null)
+ {
+ string uptime = GetProgramUptimeFeedback((int)ProgramUtils.ProgramNumber);
+ Match match = Regex.Match(uptime, UPTIME_REGEX);
+ if (!match.Success)
+ return default(TimeSpan);
+
+ int days = int.Parse(match.Groups["days"].Value);
+ int hours = int.Parse(match.Groups["hours"].Value);
+ int minutes = int.Parse(match.Groups["minutes"].Value);
+ int seconds = int.Parse(match.Groups["seconds"].Value);
+ int milliseconds = int.Parse(match.Groups["milliseconds"].Value);
+
+ TimeSpan span = new TimeSpan(days, hours, minutes, seconds, milliseconds);
+ s_ProgramUptimeStartTime = IcdEnvironment.GetLocalTime() - span;
+ }
+
+ return IcdEnvironment.GetLocalTime() - s_ProgramUptimeStartTime.Value;
}
#endregion
@@ -270,7 +302,7 @@ namespace ICD.Common.Utils
return ramfree;
}
- private static string GetUptime()
+ private static string GetSystemUptimeFeedback()
{
string uptime = null;
if (!IcdConsole.SendControlSystemCommand(UPTIME_COMMAND, ref uptime))
@@ -282,7 +314,7 @@ namespace ICD.Common.Utils
return uptime;
}
- private static string GetUptime(int programSlot)
+ private static string GetProgramUptimeFeedback(int programSlot)
{
string uptime = null;
if (!IcdConsole.SendControlSystemCommand(string.Format(PROGUPTIME_COMMAND_ROOT, programSlot), ref uptime))
diff --git a/ICD.Common.Utils/ProcessorUtils.Standard.cs b/ICD.Common.Utils/ProcessorUtils.Standard.cs
index 619dc75..5755431 100644
--- a/ICD.Common.Utils/ProcessorUtils.Standard.cs
+++ b/ICD.Common.Utils/ProcessorUtils.Standard.cs
@@ -140,22 +140,21 @@ namespace ICD.Common.Utils
///
///
[PublicAPI]
- public static string GetSystemUptime()
+ public static TimeSpan GetSystemUptime()
{
// TODO
- return null;
+ return default(TimeSpan);
}
///
/// Gets the uptime
///
- ///
///
[PublicAPI]
- public static string GetProgramUptime(int progslot)
+ public static TimeSpan GetProgramUptime()
{
// TODO
- return null;
+ return default(TimeSpan);
}
#endregion