Merge pull request #1308 from PepperDash/current-sources

This commit is contained in:
Neil Dorin
2025-08-11 22:53:11 -06:00
committed by GitHub
13 changed files with 327 additions and 146 deletions

View File

@@ -1,6 +1,6 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<Version>2.4.0-local</Version> <Version>2.12.1-local</Version>
<InformationalVersion>$(Version)</InformationalVersion> <InformationalVersion>$(Version)</InformationalVersion>
<Authors>PepperDash Technology</Authors> <Authors>PepperDash Technology</Authors>
<Company>PepperDash Technology</Company> <Company>PepperDash Technology</Company>

View File

@@ -349,13 +349,13 @@ namespace PepperDash.Core
if (levelString.Trim() == "?") if (levelString.Trim() == "?")
{ {
CrestronConsole.ConsoleCommandResponse( CrestronConsole.ConsoleCommandResponse(
$@"Used to set the minimum level of debug messages to be printed to the console: "Used to set the minimum level of debug messages to be printed to the console:\r\n" +
{_logLevels[0]} = 0 $"{_logLevels[0]} = 0\r\n" +
{_logLevels[1]} = 1 $"{_logLevels[1]} = 1\r\n" +
{_logLevels[2]} = 2 $"{_logLevels[2]} = 2\r\n" +
{_logLevels[3]} = 3 $"{_logLevels[3]} = 3\r\n" +
{_logLevels[4]} = 4 $"{_logLevels[4]} = 4\r\n" +
{_logLevels[5]} = 5"); $"{_logLevels[5]} = 5");
return; return;
} }
@@ -376,7 +376,7 @@ namespace PepperDash.Core
return; return;
} }
if (Enum.TryParse<LogEventLevel>(levelString, out var levelEnum)) if (Enum.TryParse<LogEventLevel>(levelString, true, out var levelEnum))
{ {
SetDebugLevel(levelEnum); SetDebugLevel(levelEnum);
return; return;

View File

@@ -1,5 +1,5 @@
using Serilog.Events; using System;
using System; using Serilog.Events;
using Log = PepperDash.Core.Debug; using Log = PepperDash.Core.Debug;
namespace PepperDash.Core.Logging namespace PepperDash.Core.Logging
@@ -11,7 +11,7 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
public static void LogException(this IKeyed device, Exception ex, string message, params object[] args) public static void LogException(this IKeyed device, Exception ex, string message, params object[] args)
{ {
Log.LogMessage(ex, message, device, args); Log.LogMessage(ex, message, device: device, args);
} }
/// <summary> /// <summary>
@@ -19,7 +19,7 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
public static void LogVerbose(this IKeyed device, Exception ex, string message, params object[] args) public static void LogVerbose(this IKeyed device, Exception ex, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Verbose, ex, message, device, args); Log.LogVerbose(ex, device, message, args);
} }
/// <summary> /// <summary>
@@ -27,7 +27,7 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
public static void LogVerbose(this IKeyed device, string message, params object[] args) public static void LogVerbose(this IKeyed device, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Verbose, device, message, args); Log.LogVerbose(device, message, args);
} }
/// <summary> /// <summary>
@@ -35,7 +35,7 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
public static void LogDebug(this IKeyed device, Exception ex, string message, params object[] args) public static void LogDebug(this IKeyed device, Exception ex, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Debug, ex, message, device, args); Log.LogDebug(ex, device, message, args);
} }
/// <summary> /// <summary>
@@ -43,7 +43,7 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
public static void LogDebug(this IKeyed device, string message, params object[] args) public static void LogDebug(this IKeyed device, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Debug, device, message, args); Log.LogDebug(device, message, args);
} }
/// <summary> /// <summary>
@@ -51,7 +51,7 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
public static void LogInformation(this IKeyed device, Exception ex, string message, params object[] args) public static void LogInformation(this IKeyed device, Exception ex, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Information, ex, message, device, args); Log.LogInformation(ex, device, message, args);
} }
/// <summary> /// <summary>
@@ -59,7 +59,7 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
public static void LogInformation(this IKeyed device, string message, params object[] args) public static void LogInformation(this IKeyed device, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Information, device, message, args); Log.LogInformation(device, message, args);
} }
/// <summary> /// <summary>
@@ -67,7 +67,7 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
public static void LogWarning(this IKeyed device, Exception ex, string message, params object[] args) public static void LogWarning(this IKeyed device, Exception ex, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Warning, ex, message, device, args); Log.LogWarning(ex, device, message, args);
} }
/// <summary> /// <summary>
@@ -75,7 +75,7 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
public static void LogWarning(this IKeyed device, string message, params object[] args) public static void LogWarning(this IKeyed device, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Warning, device, message, args); Log.LogWarning(device, message, args);
} }
/// <summary> /// <summary>
@@ -83,7 +83,7 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
public static void LogError(this IKeyed device, Exception ex, string message, params object[] args) public static void LogError(this IKeyed device, Exception ex, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Error, ex, message, device, args); Log.LogError(ex, device, message, args);
} }
/// <summary> /// <summary>
@@ -91,7 +91,7 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
public static void LogError(this IKeyed device, string message, params object[] args) public static void LogError(this IKeyed device, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Error, device, message, args); Log.LogError(device, message, args);
} }
/// <summary> /// <summary>
@@ -99,7 +99,7 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
public static void LogFatal(this IKeyed device, Exception ex, string message, params object[] args) public static void LogFatal(this IKeyed device, Exception ex, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Fatal, ex, message, device, args); Log.LogFatal(ex, device, message, args);
} }
/// <summary> /// <summary>
@@ -107,7 +107,7 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
public static void LogFatal(this IKeyed device, string message, params object[] args) public static void LogFatal(this IKeyed device, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Fatal, device, message, args); Log.LogFatal(device, message, args);
} }
} }
} }

View File

@@ -0,0 +1,23 @@
using System;
using Newtonsoft.Json;
namespace PepperDash.Essentials.Core.Config
{
/// <summary>
/// Represents the base properties for a streaming device.
/// </summary>
public class BaseStreamingDeviceProperties
{
/// <summary>
/// The multicast video address for the streaming device.
/// </summary>
[JsonProperty("multicastVideoAddress", NullValueHandling = NullValueHandling.Ignore)]
public string MulticastVideoAddress { get; set; }
/// <summary>
/// The multicast audio address for the streaming device.
/// </summary>
[JsonProperty("multicastAudioAddress", NullValueHandling = NullValueHandling.Ignore)]
public string MulticastAudioAddress { get; set; }
}
}

View File

@@ -475,9 +475,9 @@ namespace PepperDash.Essentials.Core
if (String.IsNullOrEmpty(s) || s.Contains("?")) if (String.IsNullOrEmpty(s) || s.Contains("?"))
{ {
CrestronConsole.ConsoleCommandResponse( CrestronConsole.ConsoleCommandResponse(
@"SETDEVICESTREAMDEBUG [{deviceKey}] [OFF |TX | RX | BOTH] [timeOutInMinutes] "SETDEVICESTREAMDEBUG [{deviceKey}] [OFF |TX | RX | BOTH] [timeOutInMinutes]\r\n" +
{deviceKey} [OFF | TX | RX | BOTH] - Device to set stream debugging on, and which setting to use " {deviceKey} [OFF | TX | RX | BOTH] - Device to set stream debugging on, and which setting to use\r\n" +
timeOutInMinutes - Set timeout for stream debugging. Default is 30 minutes"); " timeOutInMinutes - Set timeout for stream debugging. Default is 30 minutes");
return; return;
} }

View File

@@ -244,6 +244,20 @@ namespace PepperDash.Essentials.Core
/// </summary> /// </summary>
[JsonProperty("type")] [JsonProperty("type")]
public eRoutingSignalType Type { get; set; } public eRoutingSignalType Type { get; set; }
/// <summary>
/// Key for a destination list item. If BOTH SourceListItemKey AND DestinationListItemKey are defined,
/// then the direct route method should be used.
/// </summary>
[JsonProperty("destinationListItemKey", NullValueHandling = NullValueHandling.Ignore)]
public string DestinationListItemKey { get; set; }
/// <summary>
/// Key for a source list item. If BOTH SourceListItemKey AND DestinationListItemKey are defined,
/// then the direct route method should be used.
/// </summary>
[JsonProperty("sourceListItemKey", NullValueHandling = NullValueHandling.Ignore)]
public string SourceListItemKey { get; set; }
} }
/// <summary> /// <summary>

View File

@@ -135,7 +135,7 @@ namespace PepperDash.Essentials.Core
{ {
if (FactoryMethods.ContainsKey(typeName)) if (FactoryMethods.ContainsKey(typeName))
{ {
Debug.LogInformation("Unable to add type: '{typeName}'. Already exists in DeviceFactory", typeName); Debug.LogInformation("Unable to add type: '{typeName}'. Already exists in DeviceFactory", typeName);
return; return;
} }
@@ -217,7 +217,8 @@ namespace PepperDash.Essentials.Core
} }
catch (Exception ex) catch (Exception ex)
{ {
Debug.LogError(ex, "Exception occurred while creating device {0}: {1}", null, dc.Key, ex.Message); Debug.LogError(ex, "Exception occurred while creating device {key}: {message}", dc.Key, ex.Message);
Debug.LogDebug(ex, "Exception details: {stackTrace}", ex.StackTrace);
return null; return null;
} }
} }
@@ -249,9 +250,9 @@ namespace PepperDash.Essentials.Core
} }
CrestronConsole.ConsoleCommandResponse( CrestronConsole.ConsoleCommandResponse(
@"Type: '{0}' "Type: '{0}'\r\n" +
Type: '{1}' " Type: '{1}'\r\n" +
Description: {2}{3}", type.Key, Type, description, CrestronEnvironment.NewLine); " Description: {2}{3}", type.Key, Type, description, CrestronEnvironment.NewLine);
} }
} }

View File

@@ -1,5 +1,5 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Core.Routing namespace PepperDash.Essentials.Core.Routing
{ {
@@ -25,5 +25,19 @@ namespace PepperDash.Essentials.Core.Routing
/// </summary> /// </summary>
Dictionary<eRoutingSignalType, string> CurrentSourceKeys { get; } Dictionary<eRoutingSignalType, string> CurrentSourceKeys { get; }
/// <summary>
/// Event raised when the current sources change.
/// </summary>
event EventHandler CurrentSourcesChanged;
/// <summary>
/// Sets the current source for a specific signal type.
/// This method updates the current source for the specified signal type and notifies any subscribers of the change.
/// </summary>
/// <param name="signalType">The signal type to update.</param>
/// <param name="sourceListKey">The key for the source list.</param>
/// <param name="sourceListItem">The source list item to set as the current source.</param>
void SetCurrentSource(eRoutingSignalType signalType, string sourceListKey, SourceListItem sourceListItem);
} }
} }

View File

@@ -22,38 +22,38 @@ namespace PepperDash.Essentials.Core.Config
/// The key of the source device. /// The key of the source device.
/// </summary> /// </summary>
public string SourceKey { get; set; } public string SourceKey { get; set; }
/// <summary> /// <summary>
/// The key of the source card (if applicable, e.g., in a modular chassis). /// The key of the source card (if applicable, e.g., in a modular chassis).
/// </summary> /// </summary>
public string SourceCard { get; set; } public string SourceCard { get; set; }
/// <summary> /// <summary>
/// The key of the source output port, used for routing configurations. /// The key of the source output port, used for routing configurations.
/// </summary> /// </summary>
public string SourcePort { get; set; } public string SourcePort { get; set; }
/// <summary> /// <summary>
/// Gets or sets the DestinationKey /// Gets or sets the DestinationKey
/// </summary> /// </summary>
public string DestinationKey { get; set; } public string DestinationKey { get; set; }
/// <summary> /// <summary>
/// Gets or sets the DestinationCard /// Gets or sets the DestinationCard
/// </summary> /// </summary>
public string DestinationCard { get; set; } public string DestinationCard { get; set; }
/// <summary> /// <summary>
/// Gets or sets the DestinationPort /// Gets or sets the DestinationPort
/// </summary> /// </summary>
public string DestinationPort { get; set; } public string DestinationPort { get; set; }
/// <summary> /// <summary>
/// Optional override for the signal type of the tie line. If set, this overrides the destination port's type for routing calculations. /// Optional override for the signal type of the tie line. If set, this overrides the destination port's type for routing calculations.
/// </summary> /// </summary>
[JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)] [JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(StringEnumConverter))] [JsonConverter(typeof(StringEnumConverter))]
public eRoutingSignalType? OverrideType { get; set; } public eRoutingSignalType? OverrideType { get; set; }
/// <summary> /// <summary>
/// Returns the appropriate tie line for either a card-based device or /// Returns the appropriate tie line for either a card-based device or
@@ -62,40 +62,39 @@ namespace PepperDash.Essentials.Core.Config
/// <returns>null if config data does not match ports, cards or devices</returns> /// <returns>null if config data does not match ports, cards or devices</returns>
public TieLine GetTieLine() public TieLine GetTieLine()
{ {
Debug.LogMessage(LogEventLevel.Information, "Build TieLine: {0}",null, this); Debug.LogInformation("Build TieLine: {config}", ToString());
// Get the source device // Get the source device
var sourceDev = DeviceManager.GetDeviceForKey(SourceKey) as IRoutingOutputs; if (!(DeviceManager.GetDeviceForKey(SourceKey) is IRoutingOutputs sourceDev))
if (sourceDev == null)
{ {
LogError("Routable source not found"); LogError("Routable source not found");
return null; return null;
} }
// Get the destination device // Get the destination device
var destDev = DeviceManager.GetDeviceForKey(DestinationKey) as IRoutingInputs; if (!(DeviceManager.GetDeviceForKey(DestinationKey) is IRoutingInputs destDev))
if (destDev == null)
{ {
LogError("Routable destination not found"); LogError("Routable destination not found");
return null; return null;
} }
//Get the source port //Get the source port
var sourceOutputPort = sourceDev.OutputPorts[SourcePort]; var sourceOutputPort = sourceDev.OutputPorts[SourcePort];
if (sourceOutputPort == null) if (sourceOutputPort == null)
{ {
LogError("Source does not contain port"); LogError("Source does not contain port");
return null; return null;
} }
//Get the Destination port //Get the Destination port
var destinationInputPort = destDev.InputPorts[DestinationPort]; var destinationInputPort = destDev.InputPorts[DestinationPort];
if (destinationInputPort == null) if (destinationInputPort == null)
{ {
LogError("Destination does not contain port"); LogError("Destination does not contain port");
return null; return null;
} }
return new TieLine(sourceOutputPort, destinationInputPort, OverrideType); return new TieLine(sourceOutputPort, destinationInputPort, OverrideType);
} }
@@ -104,9 +103,9 @@ namespace PepperDash.Essentials.Core.Config
/// Logs an error message related to creating this tie line configuration. /// Logs an error message related to creating this tie line configuration.
/// </summary> /// </summary>
/// <param name="msg">The specific error message.</param> /// <param name="msg">The specific error message.</param>
void LogError(string msg) private void LogError(string msg)
{ {
Debug.LogMessage(LogEventLevel.Error, "WARNING: Cannot create tie line: {message}:\r {tieLineConfig}",null, msg, this); Debug.LogError("Cannot create tie line: {message}", msg);
} }
/// <summary> /// <summary>
@@ -115,8 +114,7 @@ namespace PepperDash.Essentials.Core.Config
/// <returns>A string describing the source and destination of the configured tie line.</returns> /// <returns>A string describing the source and destination of the configured tie line.</returns>
public override string ToString() public override string ToString()
{ {
return string.Format("{0}.{1}.{2} --> {3}.{4}.{5}", SourceKey, SourceCard, SourcePort, return $"{SourceKey}.{SourceCard}.{SourcePort} --> {DestinationKey}.{DestinationCard}.{DestinationPort}";
DestinationKey, DestinationCard, DestinationPort);
} }
} }
} }

View File

@@ -5,6 +5,7 @@ using Crestron.SimplSharp;
using Crestron.SimplSharpPro.DeviceSupport; using Crestron.SimplSharpPro.DeviceSupport;
using Newtonsoft.Json; using Newtonsoft.Json;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Core.Logging;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Bridges; using PepperDash.Essentials.Core.Bridges;
using PepperDash.Essentials.Core.DeviceTypeInterfaces; using PepperDash.Essentials.Core.DeviceTypeInterfaces;
@@ -52,9 +53,9 @@ namespace PepperDash.Essentials.Devices.Common.Displays
/// </summary> /// </summary>
public event SourceInfoChangeHandler CurrentSourceChange; public event SourceInfoChangeHandler CurrentSourceChange;
/// <summary> /// <summary>
/// Gets or sets the CurrentSourceInfoKey /// Gets or sets the CurrentSourceInfoKey
/// </summary> /// </summary>
public string CurrentSourceInfoKey { get; set; } public string CurrentSourceInfoKey { get; set; }
/// <summary> /// <summary>
@@ -89,29 +90,32 @@ namespace PepperDash.Essentials.Devices.Common.Displays
/// <inheritdoc/> /// <inheritdoc/>
public Dictionary<eRoutingSignalType, string> CurrentSourceKeys { get; private set; } public Dictionary<eRoutingSignalType, string> CurrentSourceKeys { get; private set; }
/// <inheritdoc />
public event EventHandler CurrentSourcesChanged;
/// <summary> /// <summary>
/// Gets feedback indicating whether the display is currently cooling down after being powered off. /// Gets feedback indicating whether the display is currently cooling down after being powered off.
/// </summary> /// </summary>
public BoolFeedback IsCoolingDownFeedback { get; protected set; } public BoolFeedback IsCoolingDownFeedback { get; protected set; }
/// <summary> /// <summary>
/// Gets or sets the IsWarmingUpFeedback /// Gets or sets the IsWarmingUpFeedback
/// </summary> /// </summary>
public BoolFeedback IsWarmingUpFeedback { get; private set; } public BoolFeedback IsWarmingUpFeedback { get; private set; }
/// <summary> /// <summary>
/// Gets or sets the UsageTracker /// Gets or sets the UsageTracker
/// </summary> /// </summary>
public UsageTracking UsageTracker { get; set; } public UsageTracking UsageTracker { get; set; }
/// <summary> /// <summary>
/// Gets or sets the WarmupTime /// Gets or sets the WarmupTime
/// </summary> /// </summary>
public uint WarmupTime { get; set; } public uint WarmupTime { get; set; }
/// <summary> /// <summary>
/// Gets or sets the CooldownTime /// Gets or sets the CooldownTime
/// </summary> /// </summary>
public uint CooldownTime { get; set; } public uint CooldownTime { get; set; }
/// <summary> /// <summary>
@@ -189,7 +193,7 @@ namespace PepperDash.Essentials.Devices.Common.Displays
/// <summary> /// <summary>
/// Gets the collection of feedback objects for this display device. /// Gets the collection of feedback objects for this display device.
/// </summary> /// </summary>
/// <inheritdoc /> /// <inheritdoc />
public virtual FeedbackCollection<Feedback> Feedbacks public virtual FeedbackCollection<Feedback> Feedbacks
{ {
get get
@@ -378,6 +382,53 @@ namespace PepperDash.Essentials.Devices.Common.Displays
volumeDisplayWithFeedback.MuteFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.VolumeMuteOff.JoinNumber]); volumeDisplayWithFeedback.MuteFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.VolumeMuteOff.JoinNumber]);
} }
/// <inheritdoc />
public virtual void SetCurrentSource(eRoutingSignalType signalType, string sourceListKey, SourceListItem sourceListItem)
{
foreach (eRoutingSignalType type in Enum.GetValues(typeof(eRoutingSignalType)))
{
var flagValue = Convert.ToInt32(type);
// Skip if flagValue is 0 or not a power of two (i.e., not a single-bit flag).
// (flagValue & (flagValue - 1)) != 0 checks if more than one bit is set.
if (flagValue == 0 || (flagValue & (flagValue - 1)) != 0)
{
this.LogDebug("Skipping {type}", type);
continue;
}
this.LogDebug("setting {type}", type);
if (signalType.HasFlag(type))
{
UpdateCurrentSources(type, sourceListKey, sourceListItem);
}
}
// Raise the CurrentSourcesChanged event
CurrentSourcesChanged?.Invoke(this, EventArgs.Empty);
}
private void UpdateCurrentSources(eRoutingSignalType signalType, string sourceListKey, SourceListItem sourceListItem)
{
if (CurrentSources.ContainsKey(signalType))
{
CurrentSources[signalType] = sourceListItem;
}
else
{
CurrentSources.Add(signalType, sourceListItem);
}
// Update the current source key for the specified signal type
if (CurrentSourceKeys.ContainsKey(signalType))
{
CurrentSourceKeys[signalType] = sourceListKey;
}
else
{
CurrentSourceKeys.Add(signalType, sourceListKey);
}
}
} }
/// <summary> /// <summary>

View File

@@ -0,0 +1,77 @@
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using PepperDash.Core;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Routing;
namespace PepperDash.Essentials.AppServer.Messengers
{
/// <summary>
/// Represents a IHasCurrentSourceInfoMessenger
/// </summary>
public class CurrentSourcesMessenger : MessengerBase
{
private readonly ICurrentSources sourceDevice;
/// <summary>
/// Initializes a new instance of the <see cref="CurrentSourcesMessenger"/> class.
/// </summary>
/// <param name="key">The key.</param>
/// <param name="messagePath">The message path.</param>
/// <param name="device">The device.</param>
public CurrentSourcesMessenger(string key, string messagePath, ICurrentSources device) : base(key, messagePath, device as IKeyName)
{
sourceDevice = device;
}
/// <summary>
/// Registers the actions for the messenger.
/// </summary>
protected override void RegisterActions()
{
base.RegisterActions();
AddAction("/fullStatus", (id, content) =>
{
var message = new CurrentSourcesStateMessage
{
CurrentSourceKeys = sourceDevice.CurrentSourceKeys,
CurrentSources = sourceDevice.CurrentSources
};
PostStatusMessage(message);
});
sourceDevice.CurrentSourcesChanged += (sender, e) =>
{
PostStatusMessage(JToken.FromObject(new
{
currentSourceKeys = sourceDevice.CurrentSourceKeys,
currentSources = sourceDevice.CurrentSources
}));
};
}
}
/// <summary>
/// Represents a CurrentSourcesStateMessage
/// </summary>
public class CurrentSourcesStateMessage : DeviceStateMessageBase
{
/// <summary>
/// Gets or sets the CurrentSourceKey
/// </summary>
[JsonProperty("currentSourceKeys", NullValueHandling = NullValueHandling.Ignore)]
public Dictionary<eRoutingSignalType, string> CurrentSourceKeys { get; set; }
/// <summary>
/// Gets or sets the CurrentSource
/// </summary>
[JsonProperty("currentSources")]
public Dictionary<eRoutingSignalType, SourceListItem> CurrentSources { get; set; }
}
}

View File

@@ -54,16 +54,18 @@ namespace PepperDash.Essentials.AppServer.Messengers
/// </summary> /// </summary>
public class CurrentSourceStateMessage : DeviceStateMessageBase public class CurrentSourceStateMessage : DeviceStateMessageBase
{ {
[JsonProperty("currentSourceKey", NullValueHandling = NullValueHandling.Ignore)]
/// <summary> /// <summary>
/// Gets or sets the CurrentSourceKey /// Gets or sets the CurrentSourceKey
/// </summary> /// </summary>
[JsonProperty("currentSourceKey", NullValueHandling = NullValueHandling.Ignore)]
public string CurrentSourceKey { get; set; } public string CurrentSourceKey { get; set; }
[JsonProperty("currentSource")]
/// <summary> /// <summary>
/// Gets or sets the CurrentSource /// Gets or sets the CurrentSource
/// </summary> /// </summary>
[JsonProperty("currentSource")]
public SourceListItem CurrentSource { get; set; } public SourceListItem CurrentSource { get; set; }
} }
} }

View File

@@ -1,4 +1,10 @@
using Crestron.SimplSharp; using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Crestron.SimplSharp;
using Crestron.SimplSharp.CrestronIO; using Crestron.SimplSharp.CrestronIO;
using Crestron.SimplSharp.Net.Http; using Crestron.SimplSharp.Net.Http;
using Crestron.SimplSharp.WebScripting; using Crestron.SimplSharp.WebScripting;
@@ -30,12 +36,6 @@ using PepperDash.Essentials.RoomBridges;
using PepperDash.Essentials.Services; using PepperDash.Essentials.Services;
using PepperDash.Essentials.WebApiHandlers; using PepperDash.Essentials.WebApiHandlers;
using PepperDash.Essentials.WebSocketServer; using PepperDash.Essentials.WebSocketServer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using WebSocketSharp; using WebSocketSharp;
namespace PepperDash.Essentials namespace PepperDash.Essentials
@@ -582,7 +582,7 @@ namespace PepperDash.Essentials
{ {
this.LogVerbose( this.LogVerbose(
"Adding ISetTopBoxControlMessenger for {deviceKey}" "Adding ISetTopBoxControlMessenger for {deviceKey}"
); );
var messenger = new ISetTopBoxControlsMessenger( var messenger = new ISetTopBoxControlsMessenger(
$"{device.Key}-stb-{Key}", $"{device.Key}-stb-{Key}",
@@ -599,7 +599,7 @@ namespace PepperDash.Essentials
{ {
this.LogVerbose( this.LogVerbose(
"Adding IChannelMessenger for {deviceKey}", device.Key "Adding IChannelMessenger for {deviceKey}", device.Key
); );
var messenger = new IChannelMessenger( var messenger = new IChannelMessenger(
$"{device.Key}-channel-{Key}", $"{device.Key}-channel-{Key}",
@@ -614,7 +614,7 @@ namespace PepperDash.Essentials
if (device is IColor colorDevice) if (device is IColor colorDevice)
{ {
this.LogVerbose("Adding IColorMessenger for {deviceKey}", device.Key); this.LogVerbose("Adding IColorMessenger for {deviceKey}", device.Key);
var messenger = new IColorMessenger( var messenger = new IColorMessenger(
$"{device.Key}-color-{Key}", $"{device.Key}-color-{Key}",
@@ -629,7 +629,7 @@ namespace PepperDash.Essentials
if (device is IDPad dPadDevice) if (device is IDPad dPadDevice)
{ {
this.LogVerbose("Adding IDPadMessenger for {deviceKey}", device.Key); this.LogVerbose("Adding IDPadMessenger for {deviceKey}", device.Key);
var messenger = new IDPadMessenger( var messenger = new IDPadMessenger(
$"{device.Key}-dPad-{Key}", $"{device.Key}-dPad-{Key}",
@@ -644,7 +644,7 @@ namespace PepperDash.Essentials
if (device is INumericKeypad nkDevice) if (device is INumericKeypad nkDevice)
{ {
this.LogVerbose("Adding INumericKeyapdMessenger for {deviceKey}", device.Key); this.LogVerbose("Adding INumericKeyapdMessenger for {deviceKey}", device.Key);
var messenger = new INumericKeypadMessenger( var messenger = new INumericKeypadMessenger(
$"{device.Key}-numericKeypad-{Key}", $"{device.Key}-numericKeypad-{Key}",
@@ -659,7 +659,7 @@ namespace PepperDash.Essentials
if (device is IHasPowerControl pcDevice) if (device is IHasPowerControl pcDevice)
{ {
this.LogVerbose("Adding IHasPowerControlMessenger for {deviceKey}", device.Key); this.LogVerbose("Adding IHasPowerControlMessenger for {deviceKey}", device.Key);
var messenger = new IHasPowerMessenger( var messenger = new IHasPowerMessenger(
$"{device.Key}-powerControl-{Key}", $"{device.Key}-powerControl-{Key}",
@@ -693,7 +693,7 @@ namespace PepperDash.Essentials
{ {
this.LogVerbose( this.LogVerbose(
"Adding ITransportMessenger for {deviceKey}", device.Key "Adding ITransportMessenger for {deviceKey}", device.Key
); );
var messenger = new ITransportMessenger( var messenger = new ITransportMessenger(
$"{device.Key}-transport-{Key}", $"{device.Key}-transport-{Key}",
@@ -721,6 +721,17 @@ namespace PepperDash.Essentials
messengerAdded = true; messengerAdded = true;
} }
if (device is ICurrentSources currentSources)
{
this.LogVerbose("Adding CurrentSourcesMessenger for {deviceKey}", device.Key);
var messenger = new CurrentSourcesMessenger($"{device.Key}-currentSources-{Key}", $"/device/{device.Key}", currentSources);
AddDefaultDeviceMessenger(messenger);
messengerAdded = true;
}
if (device is ISwitchedOutput switchedDevice) if (device is ISwitchedOutput switchedDevice)
{ {
this.LogVerbose( this.LogVerbose(
@@ -1625,15 +1636,14 @@ namespace PepperDash.Essentials
if (Config.EnableApiServer) if (Config.EnableApiServer)
{ {
CrestronConsole.ConsoleCommandResponse( CrestronConsole.ConsoleCommandResponse(
@"Mobile Control Edge Server API Information: "Mobile Control Edge Server API Information:\r\n\r\n" +
"\tServer address: {0}\r\n" +
Server address: {0} "\tSystem Name: {1}\r\n" +
System Name: {1} "\tSystem URL: {2}\r\n" +
System URL: {2} "\tSystem UUID: {3}\r\n" +
System UUID: {3} "\tSystem User code: {4}\r\n" +
System User code: {4} "\tConnected?: {5}\r\n" +
Connected?: {5} "\tSeconds Since Last Ack: {6}\r\n",
Seconds Since Last Ack: {6}",
url, url,
name, name,
ConfigReader.ConfigObject.SystemUrl, ConfigReader.ConfigObject.SystemUrl,
@@ -1646,10 +1656,8 @@ namespace PepperDash.Essentials
else else
{ {
CrestronConsole.ConsoleCommandResponse( CrestronConsole.ConsoleCommandResponse(
@" "\r\nMobile Control Edge Server API Information:\r\n" +
Mobile Control Edge Server API Information: " Not Enabled in Config.\r\n"
Not Enabled in Config.
"
); );
} }
@@ -1660,21 +1668,17 @@ Mobile Control Edge Server API Information:
) )
{ {
CrestronConsole.ConsoleCommandResponse( CrestronConsole.ConsoleCommandResponse(
@" "\r\nMobile Control Direct Server Information:\r\n" +
Mobile Control Direct Server Information: " User App URL: {0}\r\n" +
User App URL: {0} " Server port: {1}\r\n",
Server port: {1}
",
string.Format("{0}[insert_client_token]", _directServer.UserAppUrlPrefix), string.Format("{0}[insert_client_token]", _directServer.UserAppUrlPrefix),
_directServer.Port _directServer.Port
); );
CrestronConsole.ConsoleCommandResponse( CrestronConsole.ConsoleCommandResponse(
@" "\r\n UI Client Info:\r\n" +
UI Client Info: " Tokens Defined: {0}\r\n" +
Tokens Defined: {0} " Clients Connected: {1}\r\n",
Clients Connected: {1}
",
_directServer.UiClients.Count, _directServer.UiClients.Count,
_directServer.ConnectedUiClientsCount _directServer.ConnectedUiClientsCount
); );
@@ -1692,15 +1696,13 @@ Mobile Control Direct Server Information:
} }
CrestronConsole.ConsoleCommandResponse( CrestronConsole.ConsoleCommandResponse(
@" "\r\nClient {0}:\r\n" +
Client {0}: "Room Key: {1}\r\n" +
Room Key: {1} "Touchpanel Key: {6}\r\n" +
Touchpanel Key: {6} "Token: {2}\r\n" +
Token: {2} "Client URL: {3}\r\n" +
Client URL: {3} "Connected: {4}\r\n" +
Connected: {4} "Duration: {5}\r\n",
Duration: {5}
",
clientNo, clientNo,
clientContext.Value.Token.RoomKey, clientContext.Value.Token.RoomKey,
clientContext.Key, clientContext.Key,
@@ -1715,9 +1717,8 @@ Duration: {5}
else else
{ {
CrestronConsole.ConsoleCommandResponse( CrestronConsole.ConsoleCommandResponse(
@" "\r\nMobile Control Direct Server Information:\r\n" +
Mobile Control Direct Server Infromation: " Not Enabled in Config.\r\n"
Not Enabled in Config."
); );
} }
} }
@@ -2309,7 +2310,7 @@ Mobile Control Direct Server Infromation:
{ {
this.LogInformation("-- Warning: Incoming message has no registered handler {type}", message.Type); this.LogInformation("-- Warning: Incoming message has no registered handler {type}", message.Type);
break; break;
} }
foreach (var handler in handlers) foreach (var handler in handlers)
{ {