diff --git a/src/PepperDash.Essentials.Core/Routing/Extensions.cs b/src/PepperDash.Essentials.Core/Routing/Extensions.cs
index 66c0dac3..6d3a98fd 100644
--- a/src/PepperDash.Essentials.Core/Routing/Extensions.cs
+++ b/src/PepperDash.Essentials.Core/Routing/Extensions.cs
@@ -97,7 +97,7 @@ namespace PepperDash.Essentials.Core
Debug.LogMessage(LogEventLevel.Information, "Device: {destination} is NOT cooling down. Removing stored route request and routing to source key: {sourceKey}", null, destination.Key, routeRequest.Source.Key);
}
- destination.ReleaseRoute();
+ destination.ReleaseRoute(destinationPort?.Key ?? string.Empty);
RunRouteRequest(routeRequest);
}
@@ -125,14 +125,21 @@ namespace PepperDash.Essentials.Core
videoRoute?.ExecuteRoutes();
}
+ public static void ReleaseRoute(this IRoutingInputs destination)
+ {
+ ReleaseRoute(destination, string.Empty);
+ }
+
///
/// Will release the existing route on the destination, if it is found in
/// RouteDescriptorCollection.DefaultCollection
///
- ///
- public static void ReleaseRoute(this IRoutingInputs destination)
+ ///
+ public static void ReleaseRoute(this IRoutingInputs destination, string inputPortKey)
{
+ Debug.LogMessage(LogEventLevel.Information, "Release route for {inputPortKey}", destination, string.IsNullOrEmpty(inputPortKey) ? "auto" : inputPortKey);
+
if (RouteRequests.TryGetValue(destination.Key, out RouteRequest existingRequest) && destination is IWarmingCooling)
{
var coolingDevice = destination as IWarmingCooling;
@@ -142,7 +149,7 @@ namespace PepperDash.Essentials.Core
RouteRequests.Remove(destination.Key);
- var current = RouteDescriptorCollection.DefaultCollection.RemoveRouteDescriptor(destination);
+ var current = RouteDescriptorCollection.DefaultCollection.RemoveRouteDescriptor(destination, inputPortKey);
if (current != null)
{
Debug.LogMessage(LogEventLevel.Debug, "Releasing current route: {0}", destination, current.Source.Key);
@@ -162,7 +169,7 @@ namespace PepperDash.Essentials.Core
// if it's a single signal type, find the route
if (!signalType.HasFlag(eRoutingSignalType.AudioVideo))
{
- var singleTypeRouteDescriptor = new RouteDescriptor(source, destination, signalType);
+ var singleTypeRouteDescriptor = new RouteDescriptor(source, destination, destinationPort, signalType);
Debug.LogMessage(LogEventLevel.Debug, "Attempting to build source route from {sourceKey} of type {type}", destination, source.Key, signalType);
if (!destination.GetRouteToSource(source, null, null, signalType, 0, singleTypeRouteDescriptor, destinationPort, sourcePort))
@@ -179,14 +186,14 @@ namespace PepperDash.Essentials.Core
Debug.LogMessage(LogEventLevel.Debug, "Attempting to build source route from {sourceKey} of type {type}", destination, source.Key);
- var audioRouteDescriptor = new RouteDescriptor(source, destination, eRoutingSignalType.Audio);
+ var audioRouteDescriptor = new RouteDescriptor(source, destination, destinationPort, eRoutingSignalType.Audio);
var audioSuccess = destination.GetRouteToSource(source, null, null, eRoutingSignalType.Audio, 0, audioRouteDescriptor, destinationPort, sourcePort);
if (!audioSuccess)
Debug.LogMessage(LogEventLevel.Debug, "Cannot find audio route to {0}", destination, source.Key);
- var videoRouteDescriptor = new RouteDescriptor(source, destination, eRoutingSignalType.Video);
+ var videoRouteDescriptor = new RouteDescriptor(source, destination, destinationPort, eRoutingSignalType.Video);
var videoSuccess = destination.GetRouteToSource(source, null, null, eRoutingSignalType.Video, 0, videoRouteDescriptor, destinationPort, sourcePort);
diff --git a/src/PepperDash.Essentials.Core/Routing/RouteDescriptor.cs b/src/PepperDash.Essentials.Core/Routing/RouteDescriptor.cs
index 3abafae4..fa486c07 100644
--- a/src/PepperDash.Essentials.Core/Routing/RouteDescriptor.cs
+++ b/src/PepperDash.Essentials.Core/Routing/RouteDescriptor.cs
@@ -14,19 +14,27 @@ namespace PepperDash.Essentials.Core
public class RouteDescriptor
{
public IRoutingInputs Destination { get; private set; }
+
+ public RoutingInputPort InputPort { get; private set; }
+
public IRoutingOutputs Source { get; private set; }
public eRoutingSignalType SignalType { get; private set; }
public List Routes { get; private set; }
- public RouteDescriptor(IRoutingOutputs source, IRoutingInputs destination, eRoutingSignalType signalType)
+ public RouteDescriptor(IRoutingOutputs source, IRoutingInputs destination, eRoutingSignalType signalType):this(source,destination, null, signalType)
{
- Destination = destination;
- Source = source;
- SignalType = signalType;
- Routes = new List();
}
+ public RouteDescriptor(IRoutingOutputs source, IRoutingInputs destination, RoutingInputPort inputPort, eRoutingSignalType signalType)
+ {
+ Destination = destination;
+ Source = source;
+ SignalType = signalType;
+ InputPort = inputPort;
+ Routes = new List();
+ }
+
///
/// Executes all routes described in this collection. Typically called via
/// extension method IRoutingInputs.ReleaseAndMakeRoute()
diff --git a/src/PepperDash.Essentials.Core/Routing/RouteDescriptorCollection.cs b/src/PepperDash.Essentials.Core/Routing/RouteDescriptorCollection.cs
index 8792a123..6c4a5df5 100644
--- a/src/PepperDash.Essentials.Core/Routing/RouteDescriptorCollection.cs
+++ b/src/PepperDash.Essentials.Core/Routing/RouteDescriptorCollection.cs
@@ -37,7 +37,8 @@ namespace PepperDash.Essentials.Core
return;
}
- if (RouteDescriptors.Any(t => t.Destination == descriptor.Destination))
+ if (RouteDescriptors.Any(t => t.Destination == descriptor.Destination)
+ && RouteDescriptors.Any(t => t.Destination == descriptor.Destination && t.InputPort != null && descriptor.InputPort != null && t.InputPort.Key == descriptor.InputPort.Key))
{
Debug.LogMessage(LogEventLevel.Debug, descriptor.Destination,
"Route to [{0}] already exists in global routes table", descriptor.Source.Key);
@@ -52,18 +53,33 @@ namespace PepperDash.Essentials.Core
/// null if no RouteDescriptor for a destination exists
public RouteDescriptor GetRouteDescriptorForDestination(IRoutingInputs destination)
{
+ Debug.LogMessage(LogEventLevel.Debug, "Getting route descriptor", destination);
+
return RouteDescriptors.FirstOrDefault(rd => rd.Destination == destination);
}
+ public RouteDescriptor GetRouteDescriptorForDestinationAndInputPort(IRoutingInputs destination, string inputPortKey)
+ {
+ Debug.LogMessage(LogEventLevel.Debug, "Getting route descriptor for {inputPortKey}", destination, string.IsNullOrEmpty(inputPortKey) ? "auto" : inputPortKey);
+ return RouteDescriptors.FirstOrDefault(rd => rd.Destination == destination && rd.InputPort != null && rd.InputPort.Key == inputPortKey);
+ }
+
///
/// Returns the RouteDescriptor for a given destination AND removes it from collection.
/// Returns null if no route with the provided destination exists.
///
- public RouteDescriptor RemoveRouteDescriptor(IRoutingInputs destination)
+ public RouteDescriptor RemoveRouteDescriptor(IRoutingInputs destination, string inputPortKey = "")
{
- var descr = GetRouteDescriptorForDestination(destination);
+ Debug.LogMessage(LogEventLevel.Debug, "Removing route descriptor for {inputPortKey}", destination, string.IsNullOrEmpty(inputPortKey) ? "auto" : inputPortKey);
+
+ var descr = string.IsNullOrEmpty(inputPortKey)
+ ? GetRouteDescriptorForDestination(destination)
+ : GetRouteDescriptorForDestinationAndInputPort(destination, inputPortKey);
if (descr != null)
RouteDescriptors.Remove(descr);
+
+ Debug.LogMessage(LogEventLevel.Debug, "Found route descriptor {routeDescriptor}", destination, descr);
+
return descr;
}
}