adds IRoutingSink for readability and adds a protection in ExecuteRoutes if the device happens to be IRoutingSinkWithNoSwitching and IRouting like a codec might potentially be

This commit is contained in:
Nick Genovese
2020-05-28 19:37:45 -04:00
parent 62fdd6a572
commit 8d2d45b5ce
2 changed files with 117 additions and 106 deletions

View File

@@ -22,7 +22,7 @@ namespace PepperDash.Essentials.Core
/// and then attempts a new Route and if sucessful, stores that RouteDescriptor /// and then attempts a new Route and if sucessful, stores that RouteDescriptor
/// in RouteDescriptorCollection.DefaultCollection /// in RouteDescriptorCollection.DefaultCollection
/// </summary> /// </summary>
public static void ReleaseAndMakeRoute(this IRoutingSinkNoSwitching destination, IRoutingOutputs source, eRoutingSignalType signalType) public static void ReleaseAndMakeRoute(this IRoutingSink destination, IRoutingOutputs source, eRoutingSignalType signalType)
{ {
destination.ReleaseRoute(); destination.ReleaseRoute();
@@ -39,7 +39,7 @@ namespace PepperDash.Essentials.Core
/// RouteDescriptorCollection.DefaultCollection /// RouteDescriptorCollection.DefaultCollection
/// </summary> /// </summary>
/// <param name="destination"></param> /// <param name="destination"></param>
public static void ReleaseRoute(this IRoutingInputs destination) public static void ReleaseRoute(this IRoutingSink destination)
{ {
var current = RouteDescriptorCollection.DefaultCollection.RemoveRouteDescriptor(destination); var current = RouteDescriptorCollection.DefaultCollection.RemoveRouteDescriptor(destination);
if (current != null) if (current != null)
@@ -56,7 +56,7 @@ namespace PepperDash.Essentials.Core
/// of an audio/video route are discovered a route descriptor is returned. If no route is /// of an audio/video route are discovered a route descriptor is returned. If no route is
/// discovered, then null is returned /// discovered, then null is returned
/// </summary> /// </summary>
public static RouteDescriptor GetRouteToSource(this IRoutingInputs destination, IRoutingOutputs source, eRoutingSignalType signalType) public static RouteDescriptor GetRouteToSource(this IRoutingSink destination, IRoutingOutputs source, eRoutingSignalType signalType)
{ {
var routeDescr = new RouteDescriptor(source, destination, signalType); var routeDescr = new RouteDescriptor(source, destination, signalType);
// if it's a single signal type, find the route // if it's a single signal type, find the route
@@ -265,14 +265,20 @@ namespace PepperDash.Essentials.Core
foreach (var route in Routes) foreach (var route in Routes)
{ {
Debug.Console(2, "ExecuteRoutes: {0}", route.ToString()); Debug.Console(2, "ExecuteRoutes: {0}", route.ToString());
if (route.SwitchingDevice is IRoutingSinkWithSwitching) if (route.SwitchingDevice is IRoutingSink)
(route.SwitchingDevice as IRoutingSinkWithSwitching).ExecuteSwitch(route.InputPort.Selector); {
else if (route.SwitchingDevice is IRouting) var device = route.SwitchingDevice as IRoutingSinkWithSwitching;
{ if (device == null)
(route.SwitchingDevice as IRouting).ExecuteSwitch(route.InputPort.Selector, route.OutputPort.Selector, SignalType); continue;
route.OutputPort.InUseTracker.AddUser(Destination, "destination-" + SignalType);
Debug.Console(2, "Output port {0} routing. Count={1}", route.OutputPort.Key, route.OutputPort.InUseTracker.InUseCountFeedback.UShortValue); device.ExecuteSwitch(route.InputPort.Selector);
} }
else if (route.SwitchingDevice is IRouting)
{
(route.SwitchingDevice as IRouting).ExecuteSwitch(route.InputPort.Selector, route.OutputPort.Selector, SignalType);
route.OutputPort.InUseTracker.AddUser(Destination, "destination-" + SignalType);
Debug.Console(2, "Output port {0} routing. Count={1}", route.OutputPort.Key, route.OutputPort.InUseTracker.InUseCountFeedback.UShortValue);
}
} }
} }

View File

@@ -1,86 +1,91 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Crestron.SimplSharp; using Crestron.SimplSharp;
using Crestron.SimplSharpPro; using Crestron.SimplSharpPro;
using Crestron.SimplSharpPro.DM; using Crestron.SimplSharpPro.DM;
using PepperDash.Core; using PepperDash.Core;
namespace PepperDash.Essentials.Core namespace PepperDash.Essentials.Core
{ {
/// <summary> /// <summary>
/// The handler type for a Room's SourceInfoChange /// The handler type for a Room's SourceInfoChange
/// </summary> /// </summary>
public delegate void SourceInfoChangeHandler(/*EssentialsRoomBase room,*/ SourceListItem info, ChangeType type); public delegate void SourceInfoChangeHandler(/*EssentialsRoomBase room,*/ SourceListItem info, ChangeType type);
//******************************************************************************************* //*******************************************************************************************
// Interfaces // Interfaces
/// <summary> /// <summary>
/// For rooms with a single presentation source, change event /// For rooms with a single presentation source, change event
/// </summary> /// </summary>
public interface IHasCurrentSourceInfoChange public interface IHasCurrentSourceInfoChange
{ {
string CurrentSourceInfoKey { get; set; } string CurrentSourceInfoKey { get; set; }
SourceListItem CurrentSourceInfo { get; set; } SourceListItem CurrentSourceInfo { get; set; }
event SourceInfoChangeHandler CurrentSourceChange; event SourceInfoChangeHandler CurrentSourceChange;
} }
/// <summary> /// <summary>
/// Defines a class that has a collection of RoutingInputPorts /// Defines a class that has a collection of RoutingInputPorts
/// </summary> /// </summary>
public interface IRoutingInputs : IKeyed public interface IRoutingInputs : IKeyed
{ {
RoutingPortCollection<RoutingInputPort> InputPorts { get; } RoutingPortCollection<RoutingInputPort> InputPorts { get; }
} }
/// <summary> /// <summary>
/// Defines a class that has a collection of RoutingOutputPorts /// Defines a class that has a collection of RoutingOutputPorts
/// </summary> /// </summary>
public interface IRoutingOutputs : IKeyed public interface IRoutingOutputs : IKeyed
{ {
RoutingPortCollection<RoutingOutputPort> OutputPorts { get; } RoutingPortCollection<RoutingOutputPort> OutputPorts { get; }
} }
/// <summary> public interface IRoutingSink : IRoutingInputs, IHasCurrentSourceInfoChange
/// For fixed-source endpoint devices {
/// </summary>
public interface IRoutingSinkNoSwitching : IRoutingInputs, IHasCurrentSourceInfoChange }
{
/// <summary>
} /// For fixed-source endpoint devices
/// </summary>
/// <summary> public interface IRoutingSinkNoSwitching : IRoutingSink
/// Endpoint device like a display, that selects inputs {
/// </summary>
public interface IRoutingSinkWithSwitching : IRoutingSinkNoSwitching, IHasCurrentSourceInfoChange }
{
//void ClearRoute(); /// <summary>
void ExecuteSwitch(object inputSelector); /// Endpoint device like a display, that selects inputs
} /// </summary>
public interface IRoutingSinkWithSwitching : IRoutingSinkNoSwitching
/// <summary> {
/// For devices like RMCs, baluns, other devices with no switching. //void ClearRoute();
/// </summary> void ExecuteSwitch(object inputSelector);
public interface IRoutingInputsOutputs : IRoutingInputs, IRoutingOutputs }
{
} /// <summary>
/// For devices like RMCs, baluns, other devices with no switching.
/// <summary> /// </summary>
/// Defines a midpoint device as have internal routing. Any devices in the middle of the public interface IRoutingInputsOutputs : IRoutingInputs, IRoutingOutputs
/// signal chain, that do switching, must implement this for routing to work otherwise {
/// the routing algorithm will treat the IRoutingInputsOutputs device as a passthrough }
/// device.
/// </summary> /// <summary>
public interface IRouting : IRoutingInputsOutputs /// Defines a midpoint device as have internal routing. Any devices in the middle of the
{ /// signal chain, that do switching, must implement this for routing to work otherwise
void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType); /// the routing algorithm will treat the IRoutingInputsOutputs device as a passthrough
/// device.
/// </summary>
public interface IRouting : IRoutingInputsOutputs
{
void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType);
} }
public interface IRoutingNumeric : IRouting public interface IRoutingNumeric : IRouting
@@ -88,10 +93,10 @@ namespace PepperDash.Essentials.Core
void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type); void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type);
} }
public interface ITxRouting : IRoutingNumeric public interface ITxRouting : IRoutingNumeric
{ {
IntFeedback VideoSourceNumericFeedback { get; } IntFeedback VideoSourceNumericFeedback { get; }
IntFeedback AudioSourceNumericFeedback { get; } IntFeedback AudioSourceNumericFeedback { get; }
} }
/// <summary> /// <summary>
@@ -100,12 +105,12 @@ namespace PepperDash.Essentials.Core
public interface IRmcRouting : IRoutingNumeric public interface IRmcRouting : IRoutingNumeric
{ {
IntFeedback AudioVideoSourceNumericFeedback { get; } IntFeedback AudioVideoSourceNumericFeedback { get; }
} }
/// <summary> /// <summary>
/// Defines an IRoutingOutputs devices as being a source - the start of the chain /// Defines an IRoutingOutputs devices as being a source - the start of the chain
/// </summary> /// </summary>
public interface IRoutingSource : IRoutingOutputs public interface IRoutingSource : IRoutingOutputs
{ {
} }
} }