using System; using System.Collections.Generic; using Crestron.SimplSharp; using Crestron.SimplSharp.CrestronIO; using Crestron.SimplSharpPro; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using PepperDash.Core; using PepperDash.Essentials.Core; using Serilog.Events; namespace PepperDash.Essentials.Core.Config { /// /// Represents the configuration data for a single tie line between two routing ports. /// public class TieLineConfig { /// /// The key of the source device. /// public string SourceKey { get; set; } /// /// The key of the source card (if applicable, e.g., in a modular chassis). /// public string SourceCard { get; set; } /// /// The key of the source output port, used for routing configurations. /// public string SourcePort { get; set; } /// /// Gets or sets the DestinationKey /// public string DestinationKey { get; set; } /// /// Gets or sets the DestinationCard /// public string DestinationCard { get; set; } /// /// Gets or sets the DestinationPort /// public string DestinationPort { get; set; } /// /// Optional override for the signal type of the tie line. If set, this overrides the destination port's type for routing calculations. /// [JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)] [JsonConverter(typeof(StringEnumConverter))] public eRoutingSignalType? OverrideType { get; set; } /// /// Returns the appropriate tie line for either a card-based device or /// regular device with ports on-device. /// /// null if config data does not match ports, cards or devices public TieLine GetTieLine() { Debug.LogInformation("Build TieLine: {config}", ToString()); // Get the source device if (!(DeviceManager.GetDeviceForKey(SourceKey) is IRoutingOutputs sourceDev)) { LogError("Routable source not found"); return null; } // Get the destination device if (!(DeviceManager.GetDeviceForKey(DestinationKey) is IRoutingInputs destDev)) { LogError("Routable destination not found"); return null; } //Get the source port var sourceOutputPort = sourceDev.OutputPorts[SourcePort]; if (sourceOutputPort == null) { LogError("Source does not contain port"); return null; } //Get the Destination port var destinationInputPort = destDev.InputPorts[DestinationPort]; if (destinationInputPort == null) { LogError("Destination does not contain port"); return null; } return new TieLine(sourceOutputPort, destinationInputPort, OverrideType); } /// /// Logs an error message related to creating this tie line configuration. /// /// The specific error message. private void LogError(string msg) { Debug.LogError("Cannot create tie line: {message}", msg); } /// /// Returns a string representation of the tie line configuration. /// /// A string describing the source and destination of the configured tie line. public override string ToString() { return $"{SourceKey}.{SourceCard}.{SourcePort} --> {DestinationKey}.{DestinationCard}.{DestinationPort}"; } } }