diff --git a/PepperDashEssentials/ControlSystem.cs b/PepperDashEssentials/ControlSystem.cs
index dd8f3d5a..aba3b50a 100644
--- a/PepperDashEssentials/ControlSystem.cs
+++ b/PepperDashEssentials/ControlSystem.cs
@@ -83,10 +83,10 @@ namespace PepperDash.Essentials
CrestronConsole.AddNewConsoleCommand(BridgeHelper.PrintJoinMap, "getjoinmap", "map(s) for bridge or device on bridge [brKey [devKey]]", ConsoleAccessLevelEnum.AccessOperator);
- CrestronConsole.AddNewConsoleCommand(s =>
- {
- Debug.Console(0, Debug.ErrorLogLevel.Notice, "CONSOLE MESSAGE: {0}", s);
- }, "appdebugmessage", "Writes message to log", ConsoleAccessLevelEnum.AccessOperator);
+ CrestronConsole.AddNewConsoleCommand(BridgeHelper.JoinmapMarkdown, "getjoinmapmarkdown"
+ , "generate markdown of map(s) for bridge or device on bridge [brKey [devKey]]", ConsoleAccessLevelEnum.AccessOperator);
+
+ CrestronConsole.AddNewConsoleCommand(s => Debug.Console(0, Debug.ErrorLogLevel.Notice, "CONSOLE MESSAGE: {0}", s), "appdebugmessage", "Writes message to log", ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(s =>
{
@@ -103,12 +103,16 @@ namespace PepperDash.Essentials
(ConfigReader.ConfigObject, Newtonsoft.Json.Formatting.Indented));
}, "showconfig", "Shows the current running merged config", ConsoleAccessLevelEnum.AccessOperator);
- CrestronConsole.AddNewConsoleCommand(s =>
- {
- CrestronConsole.ConsoleCommandResponse("This system can be found at the following URLs:\r\n" +
- "System URL: {0}\r\n" +
- "Template URL: {1}", ConfigReader.ConfigObject.SystemUrl, ConfigReader.ConfigObject.TemplateUrl);
- }, "portalinfo", "Shows portal URLS from configuration", ConsoleAccessLevelEnum.AccessOperator);
+ CrestronConsole.AddNewConsoleCommand(s =>
+ CrestronConsole.ConsoleCommandResponse(
+ "This system can be found at the following URLs:\r\n" +
+ "System URL: {0}\r\n" +
+ "Template URL: {1}",
+ ConfigReader.ConfigObject.SystemUrl,
+ ConfigReader.ConfigObject.TemplateUrl),
+ "portalinfo",
+ "Shows portal URLS from configuration",
+ ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(DeviceManager.GetRoutingPorts,
@@ -296,6 +300,10 @@ namespace PepperDash.Essentials
if (!Directory.Exists(pluginDir))
Directory.Create(pluginDir);
+ var joinmapDir = Global.FilePathPrefix + "joinmaps";
+ if(!Directory.Exists(joinmapDir))
+ Directory.Create(joinmapDir);
+
return configExists;
}
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/BridgeBase.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/BridgeBase.cs
index a1326770..65a1c35d 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/BridgeBase.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/BridgeBase.cs
@@ -46,6 +46,33 @@ namespace PepperDash.Essentials.Core.Bridges
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.Console(0, "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);
+
+ }
+ }
}
@@ -227,6 +254,19 @@ namespace PepperDash.Essentials.Core.Bridges
joinMap.Value.PrintJoinMapInfo();
}
}
+ ///
+ /// Generates markdown for all join maps on this bridge
+ ///
+ public virtual void MarkdownForBridge(string bridgeKey)
+ {
+ Debug.Console(0, this, "Writing Joinmaps to files for EISC IPID: {0}", Eisc.ID.ToString("X"));
+
+ foreach (var joinMap in JoinMaps)
+ {
+ Debug.Console(0, "Generating markdown for device '{0}':", joinMap.Key);
+ joinMap.Value.MarkdownJoinMapInfo(joinMap.Key, bridgeKey);
+ }
+ }
///
/// Prints the join map for a device by key
@@ -242,9 +282,26 @@ namespace PepperDash.Essentials.Core.Bridges
return;
}
- Debug.Console(0, "Join map for device '{0}' on EISC '{1}':", deviceKey, Key);
+ Debug.Console(0, "Join map for device '{0}' on EISC '{1}':", deviceKey, Key);
joinMap.PrintJoinMapInfo();
}
+ ///
+ /// Prints the join map for a device by key
+ ///
+ ///
+ public void MarkdownJoinMapForDevice(string deviceKey, string bridgeKey)
+ {
+ var joinMap = JoinMaps[deviceKey];
+
+ if (joinMap == null)
+ {
+ Debug.Console(0, this, "Unable to find joinMap for device with key: '{0}'", deviceKey);
+ return;
+ }
+
+ Debug.Console(0, "Join map for device '{0}' on EISC '{1}':", deviceKey, Key);
+ joinMap.MarkdownJoinMapInfo(deviceKey, bridgeKey);
+ }
///
/// Used for debugging to trigger an action based on a join number and type
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/JoinMaps/JoinMapBase.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/JoinMaps/JoinMapBase.cs
index 04abc7f8..d41e0432 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/JoinMaps/JoinMapBase.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/JoinMaps/JoinMapBase.cs
@@ -2,7 +2,10 @@
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
+using System.Text;
using Crestron.SimplSharp.Reflection;
+using Crestron.SimplSharp.CrestronIO;
+using Crestron.SimplSharp;
using PepperDash.Core;
using PepperDash.Essentials.Core.Config;
@@ -256,12 +259,64 @@ namespace PepperDash.Essentials.Core
var analogs = Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Analog) == eJoinType.Analog).ToDictionary(j => j.Key, j => j.Value);
Debug.Console(2, "Found {0} Analog Joins", analogs.Count);
PrintJoinList(GetSortedJoins(analogs));
-
+
Debug.Console(0, "Serials:");
var serials = Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Serial) == eJoinType.Serial).ToDictionary(j => j.Key, j => j.Value);
Debug.Console(2, "Found {0} Serial Joins", serials.Count);
PrintJoinList(GetSortedJoins(serials));
+ }
+ ///
+ /// Prints the join information to console
+ ///
+ public void MarkdownJoinMapInfo(string deviceKey, string bridgeKey)
+ {
+ var pluginType = GetType().Name;
+
+ Debug.Console(0, "{0}:\n", pluginType);
+
+ var sb = new StringBuilder();
+
+ sb.AppendLine(String.Format("# {0}", GetType().Name));
+ sb.AppendLine(String.Format("Generated from '{0}' on bridge '{1}'", deviceKey, bridgeKey));
+ sb.AppendLine();
+ sb.AppendLine("## Digitals");
+ // 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);
+ Debug.Console(2, "Found {0} Digital Joins", digitals.Count);
+ var digitalSb = AppendJoinList(GetSortedJoins(digitals));
+ digitalSb.AppendLine("## Analogs");
+ digitalSb.AppendLine();
+
+ Debug.Console(0, "Analogs:");
+ var analogs = Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Analog) == eJoinType.Analog).ToDictionary(j => j.Key, j => j.Value);
+ Debug.Console(2, "Found {0} Analog Joins", analogs.Count);
+ var analogSb = AppendJoinList(GetSortedJoins(analogs));
+ analogSb.AppendLine("## Serials");
+ analogSb.AppendLine();
+
+ Debug.Console(0, "Serials:");
+ var serials = Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Serial) == eJoinType.Serial).ToDictionary(j => j.Key, j => j.Value);
+ Debug.Console(2, "Found {0} Serial Joins", serials.Count);
+ var serialSb = AppendJoinList(GetSortedJoins(serials));
+
+ sb.EnsureCapacity(sb.Length + digitalSb.Length + analogSb.Length + serialSb.Length);
+ sb.Append(digitalSb).Append(analogSb).Append(serialSb);
+
+ WriteJoinmapMarkdown(sb, pluginType, bridgeKey, deviceKey);
+
+ }
+
+ 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);
+
+ using (var sw = new StreamWriter(fileName))
+ {
+ sw.WriteLine(stringBuilder.ToString());
+ Debug.Console(0, "Joinmap Readme generated and written to {0}", fileName);
+ }
+
}
///
@@ -293,6 +348,63 @@ namespace PepperDash.Essentials.Core
}
}
+ static StringBuilder AppendJoinList(List> joins)
+ {
+ var sb = new StringBuilder();
+ const string stringFormatter = "| {0} | {1} | {2} | {3} | {4} |";
+ const int joinNumberLen = 11;
+ const int joinSpanLen = 9;
+ const int typeLen = 19;
+ const int capabilitiesLen = 12;
+ var descriptionLen = (from @join in joins
+ select String.IsNullOrEmpty(@join.Value.AttributeName)
+ ? @join.Value.Metadata.Description
+ : @join.Value.AttributeName into description
+ select description.Length)
+ .Concat(new[] { 11 }).Max();
+
+ var joinNumberHeader = String.Format("Join Number").PadRight(joinNumberLen, ' ');
+ var joinSpanHeader = String.Format("Join Span").PadRight(joinSpanLen, ' ');
+ var descriptionHeader = String.Format("Description").PadRight(descriptionLen, ' ');
+ var typeHeader = String.Format("Type").PadRight(typeLen, ' ');
+ var capabilitiesHeader = String.Format("Capabilities").PadRight(capabilitiesLen, ' ');
+ //build header
+ sb.AppendLine(String.Format(stringFormatter,
+ joinNumberHeader,
+ joinSpanHeader,
+ descriptionHeader,
+ typeHeader,
+ capabilitiesHeader));
+ //build table seperator
+ sb.AppendLine(String.Format(stringFormatter,
+ new String('-', joinNumberLen),
+ new String('-', joinSpanLen),
+ new String('-', descriptionLen),
+ new String('-', typeLen),
+ new String('-', capabilitiesLen)));
+
+ foreach (var join in joins)
+ {
+ var joinNumber = String.Format("{0}", join.Value.JoinNumber).PadRight(joinNumberLen, ' ');
+ var joinSpan = String.Format("{0}", join.Value.JoinSpan).PadRight(joinSpanLen);
+ var joinDescription = String.Format(String.IsNullOrEmpty(join.Value.AttributeName)
+ ? join.Value.Metadata.Description
+ : join.Value.AttributeName).PadRight(descriptionLen, ' ');
+ var joinType = String.Format("{0}", join.Value.Metadata.JoinType.ToString()).PadRight(typeLen, ' ');
+ var joinCapabilities =
+ String.Format("{0}", join.Value.Metadata.JoinCapabilities.ToString()).PadRight(capabilitiesLen, ' ');
+
+ sb.AppendLine(String.Format("| {0} | {1} | {2} | {3} | {4} |",
+ joinNumber,
+ joinSpan,
+ joinDescription,
+ joinType,
+ joinCapabilities));
+ }
+ sb.AppendLine();
+ return sb;
+ }
+
///
/// Attempts to find the matching key for the custom join and if found overwrites the default JoinData with the custom
///