From 332faaa9cc99fd7be2bd4c4000396a61f4bc43d6 Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 30 Oct 2024 13:18:36 -0500 Subject: [PATCH] fix: joins in join maps get added correctly to a bridge When Essentials moved to using `System.Reflection` instead of the Crestron classes, there were some leftover `GetType` calls that were no longer necessary. These extra calls were preventing things from getting the correct type. Join Map printing was also fixed to print out in an actual readable fashion. --- .../Bridges/BridgeBase.cs | 93 ++------------ .../Bridges/BridgeHelper.cs | 66 ++++++++++ .../Devices/DeviceJsonApi.cs | 2 +- .../JoinMaps/JoinMapBase.cs | 116 ++++++++++-------- .../Streaming/AppleTV.cs | 2 +- .../VideoCodec/VideoCodecBase.cs | 2 +- 6 files changed, 139 insertions(+), 142 deletions(-) create mode 100644 src/PepperDash.Essentials.Core/Bridges/BridgeHelper.cs diff --git a/src/PepperDash.Essentials.Core/Bridges/BridgeBase.cs b/src/PepperDash.Essentials.Core/Bridges/BridgeBase.cs index c9784647..c1590704 100644 --- a/src/PepperDash.Essentials.Core/Bridges/BridgeBase.cs +++ b/src/PepperDash.Essentials.Core/Bridges/BridgeBase.cs @@ -18,81 +18,6 @@ using Serilog.Events; namespace PepperDash.Essentials.Core.Bridges { - /// - /// Helper methods for bridges - /// - public static class BridgeHelper - { - public static void PrintJoinMap(string command) - { - var targets = command.Split(' '); - - var bridgeKey = targets[0].Trim(); - - var bridge = DeviceManager.GetDeviceForKey(bridgeKey) as EiscApiAdvanced; - - if (bridge == null) - { - Debug.LogMessage(LogEventLevel.Information, "Unable to find advanced bridge with key: '{0}'", bridgeKey); - return; - } - - if (targets.Length > 1) - { - var deviceKey = targets[1].Trim(); - - if (string.IsNullOrEmpty(deviceKey)) return; - bridge.PrintJoinMapForDevice(deviceKey); - } - else - { - bridge.PrintJoinMaps(); - } - } - public static void JoinmapMarkdown(string command) - { - var targets = command.Split(' '); - - var bridgeKey = targets[0].Trim(); - - var bridge = DeviceManager.GetDeviceForKey(bridgeKey) as EiscApiAdvanced; - - if (bridge == null) - { - Debug.LogMessage(LogEventLevel.Information, "Unable to find advanced bridge with key: '{0}'", bridgeKey); - return; - } - - if (targets.Length > 1) - { - var deviceKey = targets[1].Trim(); - - if (string.IsNullOrEmpty(deviceKey)) return; - bridge.MarkdownJoinMapForDevice(deviceKey, bridgeKey); - } - else - { - bridge.MarkdownForBridge(bridgeKey); - - } - } - } - - - /// - /// Base class for all bridge class variants - /// - public class BridgeBase : EssentialsDevice - { - public BridgeApi Api { get; protected set; } - - public BridgeBase(string key) : - base(key) - { - - } - } - /// /// Base class for bridge API variants /// @@ -168,19 +93,15 @@ namespace PepperDash.Essentials.Core.Bridges Debug.LogMessage(LogEventLevel.Debug, this, "Linking Device: '{0}'", device.Key); - if (!typeof(IBridgeAdvanced).IsAssignableFrom(device.GetType().GetType())) + if (device is IBridgeAdvanced bridge) { - Debug.LogMessage(LogEventLevel.Information, this, - "{0} is not compatible with this bridge type. Please use 'eiscapi' instead, or updae the device.", - device.Key); + bridge.LinkToApi(Eisc, d.JoinStart, d.JoinMapKey, this); continue; } - var bridge = device as IBridgeAdvanced; - if (bridge != null) - { - bridge.LinkToApi(Eisc, d.JoinStart, d.JoinMapKey, this); - } + Debug.LogMessage(LogEventLevel.Information, this, + "{0} is not compatible with this bridge type. Please use 'eiscapi' instead, or updae the device.", + device.Key); } } @@ -249,11 +170,11 @@ namespace PepperDash.Essentials.Core.Bridges /// public virtual void PrintJoinMaps() { - Debug.LogMessage(LogEventLevel.Information, this, "Join Maps for EISC IPID: {0}", Eisc.ID.ToString("X")); + CrestronConsole.ConsoleCommandResponse("Join Maps for EISC IPID: {0}\r\n", Eisc.ID.ToString("X")); foreach (var joinMap in JoinMaps) { - Debug.LogMessage(LogEventLevel.Information, "Join map for device '{0}':", joinMap.Key); + CrestronConsole.ConsoleCommandResponse("Join map for device '{0}':", joinMap.Key); joinMap.Value.PrintJoinMapInfo(); } } diff --git a/src/PepperDash.Essentials.Core/Bridges/BridgeHelper.cs b/src/PepperDash.Essentials.Core/Bridges/BridgeHelper.cs new file mode 100644 index 00000000..0254cd0d --- /dev/null +++ b/src/PepperDash.Essentials.Core/Bridges/BridgeHelper.cs @@ -0,0 +1,66 @@ +using PepperDash.Core; +using Serilog.Events; + +//using PepperDash.Essentials.Devices.Common.Cameras; + +namespace PepperDash.Essentials.Core.Bridges +{ + /// + /// Helper methods for bridges + /// + public static class BridgeHelper + { + public static void PrintJoinMap(string command) + { + var targets = command.Split(' '); + + var bridgeKey = targets[0].Trim(); + + if (!(DeviceManager.GetDeviceForKey(bridgeKey) is EiscApiAdvanced bridge)) + { + Debug.LogMessage(LogEventLevel.Information, "Unable to find advanced bridge with key: '{0}'", bridgeKey); + return; + } + + if (targets.Length > 1) + { + var deviceKey = targets[1].Trim(); + + if (string.IsNullOrEmpty(deviceKey)) return; + bridge.PrintJoinMapForDevice(deviceKey); + } + else + { + bridge.PrintJoinMaps(); + } + } + public static void JoinmapMarkdown(string command) + { + var targets = command.Split(' '); + + var bridgeKey = targets[0].Trim(); + + var bridge = DeviceManager.GetDeviceForKey(bridgeKey) as EiscApiAdvanced; + + if (bridge == null) + { + Debug.LogMessage(LogEventLevel.Information, "Unable to find advanced bridge with key: '{0}'", bridgeKey); + return; + } + + if (targets.Length > 1) + { + var deviceKey = targets[1].Trim(); + + if (string.IsNullOrEmpty(deviceKey)) return; + bridge.MarkdownJoinMapForDevice(deviceKey, bridgeKey); + } + else + { + bridge.MarkdownForBridge(bridgeKey); + + } + } + } + +} \ No newline at end of file diff --git a/src/PepperDash.Essentials.Core/Devices/DeviceJsonApi.cs b/src/PepperDash.Essentials.Core/Devices/DeviceJsonApi.cs index 150313e7..4fd97f22 100644 --- a/src/PepperDash.Essentials.Core/Devices/DeviceJsonApi.cs +++ b/src/PepperDash.Essentials.Core/Devices/DeviceJsonApi.cs @@ -206,7 +206,7 @@ namespace PepperDash.Essentials.Core if (dev == null) return "{ \"error\":\"No Device\"}"; - object prop = dev.GetType().GetType().GetProperty(propertyName).GetValue(dev, null); + object prop = dev.GetType().GetProperty(propertyName).GetValue(dev, null); // var prop = t.GetProperty(propertyName); if (prop != null) diff --git a/src/PepperDash.Essentials.Core/JoinMaps/JoinMapBase.cs b/src/PepperDash.Essentials.Core/JoinMaps/JoinMapBase.cs index dda04445..2b78e13a 100644 --- a/src/PepperDash.Essentials.Core/JoinMaps/JoinMapBase.cs +++ b/src/PepperDash.Essentials.Core/JoinMaps/JoinMapBase.cs @@ -108,18 +108,20 @@ namespace PepperDash.Essentials.Core protected void AddJoins(Type type) { + type.GetType(); var fields = - type.GetType() - .GetFields(BindingFlags.Public | BindingFlags.Instance) - .Where(f => f.IsDefined(typeof (JoinNameAttribute), true)); + type.GetFields(BindingFlags.Public | BindingFlags.Instance) + .Where(f => f.IsDefined(typeof (JoinNameAttribute), true)).ToList(); + + Debug.LogMessage(LogEventLevel.Debug, "Got {fields} with JoinNameAttribute", fields.Count); foreach (var field in fields) { var childClass = Convert.ChangeType(this, type, null); - var value = field.GetValue(childClass) as JoinDataComplete; //this here is JoinMapBaseAdvanced, not the child class. JoinMapBaseAdvanced has no fields. + //this here is JoinMapBaseAdvanced, not the child class. JoinMapBaseAdvanced has no fields. - if (value == null) + if (!(field.GetValue(childClass) is JoinDataComplete value)) { Debug.LogMessage(LogEventLevel.Information, "Unable to cast base class to {0}", type.Name); continue; @@ -129,7 +131,7 @@ namespace PepperDash.Essentials.Core var joinName = value.GetNameAttribute(field); - if (String.IsNullOrEmpty(joinName)) continue; + if (string.IsNullOrEmpty(joinName)) continue; Joins.Add(joinName, value); } @@ -155,29 +157,37 @@ namespace PepperDash.Essentials.Core { var sb = new StringBuilder(); - // Get the joins of each type and print them - sb.AppendLine(String.Format("# {0}", GetType().Name)); - sb.AppendLine(); - sb.AppendLine("## Digitals"); - sb.AppendLine(); - // Get the joins of each type and print them - var digitals = - Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Digital) == eJoinType.Digital) - .ToDictionary(j => j.Key, j => j.Value); - var digitalSb = AppendJoinList(GetSortedJoins(digitals)); - digitalSb.AppendLine("## Analogs"); - digitalSb.AppendLine(); + var lineEnding = "\r\n"; - var analogs = - Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Analog) == eJoinType.Analog) + var digitals = + Joins.Where(j => j.Value.Metadata.JoinType.HasFlag(eJoinType.Digital)) + .ToDictionary(j => j.Key, j => j.Value); + + var analogs = Joins.Where(j => j.Value.Metadata.JoinType.HasFlag(eJoinType.Analog)) .ToDictionary(j => j.Key, j => j.Value); - var analogSb = AppendJoinList(GetSortedJoins(analogs)); - analogSb.AppendLine("## Serials"); - analogSb.AppendLine(); var serials = - Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Serial) == eJoinType.Serial) + Joins.Where(j => j.Value.Metadata.JoinType.HasFlag(eJoinType.Serial)) .ToDictionary(j => j.Key, j => j.Value); + + Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Digital join count {digitalCount} Analog join count {analogCount} Serial join count {serialCount}", null, digitals.Count, analogs.Count, serials.Count); + + // Get the joins of each type and print them + sb.Append($"# {GetType().Name}\r\n"); + sb.Append(lineEnding); + sb.Append($"## Digitals{lineEnding}"); + sb.Append(lineEnding); + // Get the joins of each type and print them + + var digitalSb = AppendJoinList(GetSortedJoins(digitals)); + digitalSb.Append($"## Analogs{lineEnding}"); + digitalSb.Append(lineEnding); + + var analogSb = AppendJoinList(GetSortedJoins(analogs)); + analogSb.Append($"## Serials{lineEnding}"); + analogSb.Append(lineEnding); + + var serialSb = AppendJoinList(GetSortedJoins(serials)); sb.EnsureCapacity(sb.Length + digitalSb.Length + analogSb.Length + serialSb.Length); @@ -202,7 +212,7 @@ namespace PepperDash.Essentials.Core private static void WriteJoinmapMarkdown(StringBuilder stringBuilder, string pluginType, string bridgeKey, string deviceKey) { - var fileName = String.Format("{0}{1}{2}__{3}__{4}.md", Global.FilePathPrefix, "joinMaps/", pluginType, bridgeKey, deviceKey); + var fileName = string.Format("{0}{1}{2}__{3}__{4}.md", Global.FilePathPrefix, "joinMaps/", pluginType, bridgeKey, deviceKey); using (var sw = new StreamWriter(fileName)) { @@ -230,7 +240,7 @@ namespace PepperDash.Essentials.Core static StringBuilder AppendJoinList(List> joins) { var sb = new StringBuilder(); - const string stringFormatter = "| {0} | {1} | {2} | {3} | {4} |"; + const string stringFormatter = "| {0} | {1} | {2} | {3} | {4} |\r\n"; const int joinNumberLen = 11; const int joinSpanLen = 9; const int typeLen = 19; @@ -238,25 +248,25 @@ namespace PepperDash.Essentials.Core var descriptionLen = (from @join in joins select @join.Value into j select j.Metadata.Description.Length).Concat(new[] {11}).Max(); //build header - sb.AppendLine(String.Format(stringFormatter, - String.Format("Join Number").PadRight(joinNumberLen, ' '), - String.Format("Join Span").PadRight(joinSpanLen, ' '), - String.Format("Description").PadRight(descriptionLen, ' '), - String.Format("Type").PadRight(typeLen, ' '), - String.Format("Capabilities").PadRight(capabilitiesLen, ' '))); + sb.Append(string.Format(stringFormatter, + string.Format("Join Number").PadRight(joinNumberLen, ' '), + string.Format("Join Span").PadRight(joinSpanLen, ' '), + string.Format("Description").PadRight(descriptionLen, ' '), + string.Format("Type").PadRight(typeLen, ' '), + string.Format("Capabilities").PadRight(capabilitiesLen, ' '))); //build table seperator - sb.AppendLine(String.Format(stringFormatter, - new String('-', joinNumberLen), - new String('-', joinSpanLen), - new String('-', descriptionLen), - new String('-', typeLen), - new String('-', capabilitiesLen))); + sb.Append(string.Format(stringFormatter, + new string('-', joinNumberLen), + new string('-', joinSpanLen), + new string('-', descriptionLen), + new string('-', typeLen), + new string('-', capabilitiesLen))); foreach (var join in joins) { - sb.AppendLine(join.Value.GetMarkdownFormattedData(stringFormatter, descriptionLen)); + sb.Append(join.Value.GetMarkdownFormattedData(stringFormatter, descriptionLen)); } - sb.AppendLine(); + sb.Append("\r\n"); return sb; } @@ -411,10 +421,10 @@ namespace PepperDash.Essentials.Core { //Fixed Width Headers - var joinNumberLen = String.Format("Join Number").Length; - var joinSpanLen = String.Format("Join Span").Length; - var typeLen = String.Format("AnalogDigitalSerial").Length; - var capabilitiesLen = String.Format("ToFromFusion").Length; + var joinNumberLen = string.Format("Join Number").Length; + var joinSpanLen = string.Format("Join Span").Length; + var typeLen = string.Format("AnalogDigitalSerial").Length; + var capabilitiesLen = string.Format("ToFromFusion").Length; //Track which one failed, if it did const string placeholder = "unknown"; @@ -430,13 +440,13 @@ namespace PepperDash.Essentials.Core try { - dataArray["joinNumber"] = String.Format("{0}", JoinNumber.ToString(CultureInfo.InvariantCulture).ReplaceIfNullOrEmpty(placeholder)).PadRight(joinNumberLen, ' '); - dataArray["joinSpan"] = String.Format("{0}", JoinSpan.ToString(CultureInfo.InvariantCulture).ReplaceIfNullOrEmpty(placeholder)).PadRight(joinSpanLen, ' '); - dataArray["description"] = String.Format("{0}", Metadata.Description.ReplaceIfNullOrEmpty(placeholder)).PadRight(descriptionLen, ' '); - dataArray["joinType"] = String.Format("{0}", Metadata.JoinType.ToString().ReplaceIfNullOrEmpty(placeholder)).PadRight(typeLen, ' '); - dataArray["capabilities"] = String.Format("{0}", Metadata.JoinCapabilities.ToString().ReplaceIfNullOrEmpty(placeholder)).PadRight(capabilitiesLen, ' '); + dataArray["joinNumber"] = string.Format("{0}", JoinNumber.ToString(CultureInfo.InvariantCulture).ReplaceIfNullOrEmpty(placeholder)).PadRight(joinNumberLen, ' '); + dataArray["joinSpan"] = string.Format("{0}", JoinSpan.ToString(CultureInfo.InvariantCulture).ReplaceIfNullOrEmpty(placeholder)).PadRight(joinSpanLen, ' '); + dataArray["description"] = string.Format("{0}", Metadata.Description.ReplaceIfNullOrEmpty(placeholder)).PadRight(descriptionLen, ' '); + dataArray["joinType"] = string.Format("{0}", Metadata.JoinType.ToString().ReplaceIfNullOrEmpty(placeholder)).PadRight(typeLen, ' '); + dataArray["capabilities"] = string.Format("{0}", Metadata.JoinCapabilities.ToString().ReplaceIfNullOrEmpty(placeholder)).PadRight(capabilitiesLen, ' '); - return String.Format(stringFormatter, + return string.Format(stringFormatter, dataArray["joinNumber"], dataArray["joinSpan"], dataArray["description"], @@ -454,8 +464,8 @@ namespace PepperDash.Essentials.Core errorKey = item.Key; break; } - Debug.LogMessage(LogEventLevel.Information, "Unable to decode join metadata {1}- {0}", e.Message, !String.IsNullOrEmpty(errorKey) ? (' ' + errorKey) : String.Empty); - return String.Format(stringFormatter, + Debug.LogMessage(LogEventLevel.Information, "Unable to decode join metadata {1}- {0}", e.Message, !string.IsNullOrEmpty(errorKey) ? (' ' + errorKey) : string.Empty); + return string.Format(stringFormatter, dataArray["joinNumber"], dataArray["joinSpan"], dataArray["description"], @@ -520,7 +530,7 @@ namespace PepperDash.Essentials.Core public JoinNameAttribute(string name) { - Debug.LogMessage(LogEventLevel.Verbose, "Setting Attribute Name: {0}", name); + Debug.LogMessage(LogEventLevel.Verbose, "Setting Attribute Name: {0}",null, name); _Name = name; } diff --git a/src/PepperDash.Essentials.Devices.Common/Streaming/AppleTV.cs b/src/PepperDash.Essentials.Devices.Common/Streaming/AppleTV.cs index 7a0b57f1..a00fb5a2 100644 --- a/src/PepperDash.Essentials.Devices.Common/Streaming/AppleTV.cs +++ b/src/PepperDash.Essentials.Devices.Common/Streaming/AppleTV.cs @@ -42,7 +42,7 @@ namespace PepperDash.Essentials.Devices.Common public void PrintExpectedIrCommands() { - var cmds = typeof (AppleTvIrCommands).GetType().GetFields(BindingFlags.Public | BindingFlags.Static); + var cmds = typeof (AppleTvIrCommands).GetFields(BindingFlags.Public | BindingFlags.Static); foreach (var value in cmds.Select(cmd => cmd.GetValue(null)).OfType()) { diff --git a/src/PepperDash.Essentials.Devices.Common/VideoCodec/VideoCodecBase.cs b/src/PepperDash.Essentials.Devices.Common/VideoCodec/VideoCodecBase.cs index 374efedf..0f706b7a 100644 --- a/src/PepperDash.Essentials.Devices.Common/VideoCodec/VideoCodecBase.cs +++ b/src/PepperDash.Essentials.Devices.Common/VideoCodec/VideoCodecBase.cs @@ -1214,7 +1214,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec var entryIndex = counterIndex; Debug.LogMessage(LogEventLevel.Verbose, this, "Entry{2:0000} Name: {0}, Folder ID: {1}, Type: {3}, ParentFolderId: {4}", - entry.Name, entry.FolderId, entryIndex, entry.GetType().GetType().FullName, entry.ParentFolderId); + entry.Name, entry.FolderId, entryIndex, entry.GetType().FullName, entry.ParentFolderId); if (entry is DirectoryFolder) {