diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Routing/RoutingInterfaces.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Routing/RoutingInterfaces.cs
index 3b288290..2c7d5b17 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Routing/RoutingInterfaces.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Routing/RoutingInterfaces.cs
@@ -80,24 +80,26 @@ namespace PepperDash.Essentials.Core
///
public interface IRouting : IRoutingInputsOutputs
{
- //void ClearRoute(object outputSelector);
void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType);
- }
-
- public interface ITxRouting : IRouting
+ }
+
+ public interface IRoutingNumeric : IRouting
+ {
+ void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type);
+ }
+
+ public interface ITxRouting : IRoutingNumeric
{
IntFeedback VideoSourceNumericFeedback { get; }
IntFeedback AudioSourceNumericFeedback { get; }
- void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type);
}
///
/// Defines a receiver that has internal routing (DM-RMC-4K-Z-SCALER-C)
///
- public interface IRmcRouting : IRouting
+ public interface IRmcRouting : IRoutingNumeric
{
IntFeedback AudioVideoSourceNumericFeedback { get; }
- void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type);
}
///
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmBladeChassisController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmBladeChassisController.cs
index 5e9c3151..3f3eae6c 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmBladeChassisController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmBladeChassisController.cs
@@ -21,7 +21,8 @@ namespace PepperDash.Essentials.DM {
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
///
///
- public class DmBladeChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitch, IRoutingInputsOutputs, IRouting, IHasFeedback {
+ public class DmBladeChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitch, IRoutingNumeric
+ {
public DMChassisPropertiesConfig PropertiesConfig { get; set; }
public Switch Chassis { get; private set; }
@@ -563,14 +564,51 @@ namespace PepperDash.Essentials.DM {
var outCard = input == 0 ? null : Chassis.Outputs[output];
// NOTE THAT BITWISE COMPARISONS - TO CATCH ALL ROUTING TYPES
- if ((sigType | eRoutingSignalType.Video) == eRoutingSignalType.Video) {
- Chassis.VideoEnter.BoolValue = true;
- Chassis.Outputs[output].VideoOut = inCard;
- }
+ if ((sigType | eRoutingSignalType.Video) != eRoutingSignalType.Video) return;
+ Chassis.VideoEnter.BoolValue = true;
+ Chassis.Outputs[output].VideoOut = inCard;
}
#endregion
+ #region IRoutingNumeric Members
+
+ public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType sigType)
+ {
+ Debug.Console(2, this, "Making an awesome DM route from {0} to {1} {2}", inputSelector, outputSelector, sigType);
+
+ var input = Convert.ToUInt32(inputSelector); // Cast can sometimes fail
+ var output = Convert.ToUInt32(outputSelector);
+ // Check to see if there's an off timer waiting on this and if so, cancel
+ var key = new PortNumberType(output, sigType);
+ if (input == 0)
+ {
+ StartOffTimer(key);
+ }
+ else
+ {
+ if (RouteOffTimers.ContainsKey(key))
+ {
+ Debug.Console(2, this, "{0} cancelling route off due to new source", output);
+ RouteOffTimers[key].Stop();
+ RouteOffTimers.Remove(key);
+ }
+ }
+
+
+
+ var inCard = input == 0 ? null : Chassis.Inputs[input];
+ var outCard = input == 0 ? null : Chassis.Outputs[output];
+
+ // NOTE THAT BITWISE COMPARISONS - TO CATCH ALL ROUTING TYPES
+ if ((sigType | eRoutingSignalType.Video) != eRoutingSignalType.Video) return;
+ Chassis.VideoEnter.BoolValue = true;
+ Chassis.Outputs[output].VideoOut = inCard;
+ }
+
+ #endregion
+
+
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{
var joinMap = new DmBladeChassisControllerJoinMap(joinStart);
@@ -808,6 +846,7 @@ namespace PepperDash.Essentials.DM {
});
}
}
+
}
/*
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmChassisController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmChassisController.cs
index b0d4682d..536905d9 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmChassisController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmChassisController.cs
@@ -21,7 +21,7 @@ namespace PepperDash.Essentials.DM
///
///
[Description("Wrapper class for all DM-MD chassis variants from 8x8 to 32x32")]
- public class DmChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitch, IRoutingInputsOutputs, IRouting, IHasFeedback
+ public class DmChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitch, IRoutingNumeric
{
public DMChassisPropertiesConfig PropertiesConfig { get; set; }
@@ -1094,6 +1094,133 @@ namespace PepperDash.Essentials.DM
}
#endregion
+ #region IRoutingNumeric Members
+
+ public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType sigType)
+ {
+ Debug.Console(2, this, "Making an awesome DM route from {0} to {1} {2}", inputSelector, outputSelector, sigType);
+
+ var input = Convert.ToUInt32(inputSelector); // Cast can sometimes fail
+ var output = Convert.ToUInt32(outputSelector);
+
+ var chassisSize = (uint)Chassis.NumberOfInputs; //need this to determine USB routing values 8x8 -> 1-8 is inputs 1-8, 17-24 is outputs 1-8
+ //16x16 1-16 is inputs 1-16, 17-32 is outputs 1-16
+ //32x32 1-32 is inputs 1-32, 33-64 is outputs 1-32
+
+ // Check to see if there's an off timer waiting on this and if so, cancel
+ var key = new PortNumberType(output, sigType);
+ if (input == 0)
+ {
+ StartOffTimer(key);
+ }
+ else
+ {
+ if (RouteOffTimers.ContainsKey(key))
+ {
+ Debug.Console(2, this, "{0} cancelling route off due to new source", output);
+ RouteOffTimers[key].Stop();
+ RouteOffTimers.Remove(key);
+ }
+ }
+
+ var inCard = input == 0 ? null : Chassis.Inputs[input];
+ var outCard = input == 0 ? null : Chassis.Outputs[output];
+
+ // NOTE THAT BITWISE COMPARISONS - TO CATCH ALL ROUTING TYPES
+ if ((sigType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
+ {
+ Chassis.VideoEnter.BoolValue = true;
+ Chassis.Outputs[output].VideoOut = inCard;
+ }
+
+ if ((sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
+ {
+ (Chassis as DmMDMnxn).AudioEnter.BoolValue = true;
+ Chassis.Outputs[output].AudioOut = inCard;
+ }
+
+ if ((sigType & eRoutingSignalType.UsbOutput) == eRoutingSignalType.UsbOutput)
+ {
+ //using base here because USB can be routed between 2 output cards or 2 input cards
+ DMInputOutputBase localdmCard;
+
+ Debug.Console(2, this, "Executing USB Output switch.\r\n in:{0} output: {1}", input, output);
+
+ if (input > chassisSize)
+ {
+ //wanting to route an output to an output. Subtract chassis size and get output, unless it's 8x8
+ //need this to determine USB routing values
+ //8x8 -> 1-8 is inputs 1-8, 17-24 is outputs 1-8
+ //16x16 1-16 is inputs 1-16, 17-32 is outputs 1-16
+ //32x32 1-32 is inputs 1-32, 33-64 is outputs 1-32
+ uint outputIndex;
+
+ if (chassisSize == 8)
+ {
+ outputIndex = input - 16;
+ }
+ else
+ {
+ outputIndex = input - chassisSize;
+ }
+ localdmCard = Chassis.Outputs[outputIndex];
+ }
+ else
+ {
+ localdmCard = inCard;
+ }
+ Chassis.USBEnter.BoolValue = true;
+ if (Chassis.Outputs[output] != null)
+ {
+ Debug.Console(2, this, "Routing USB for input {0} to {1}", Chassis.Outputs[input], localdmCard);
+ Chassis.Outputs[output].USBRoutedTo = localdmCard;
+ }
+ }
+
+ if ((sigType & eRoutingSignalType.UsbInput) != eRoutingSignalType.UsbInput) return;
+ //using base here because USB can be routed between 2 output cards or 2 input cards
+ DMInputOutputBase dmCard;
+
+ Debug.Console(2, this, "Executing USB Input switch.\r\n in:{0} output: {1}", input, output);
+
+ if (output > chassisSize)
+ {
+ //wanting to route an input to an output. Subtract chassis size and get output, unless it's 8x8
+ //need this to determine USB routing values
+ //8x8 -> 1-8 is inputs 1-8, 17-24 is outputs 1-8
+ //16x16 1-16 is inputs 1-16, 17-32 is outputs 1-16
+ //32x32 1-32 is inputs 1-32, 33-64 is outputs 1-32
+ uint outputIndex;
+
+ if (chassisSize == 8)
+ {
+ outputIndex = input - 16;
+ }
+ else
+ {
+ outputIndex = input - chassisSize;
+ }
+ dmCard = Chassis.Outputs[outputIndex];
+ }
+ else
+ {
+ dmCard = Chassis.Inputs[input];
+ }
+
+
+
+ Chassis.USBEnter.BoolValue = true;
+
+ if (Chassis.Inputs[output] == null)
+ {
+ return;
+ }
+ Debug.Console(2, this, "Routing USB for input {0} to {1}", Chassis.Inputs[output], dmCard);
+ Chassis.Inputs[output].USBRoutedTo = dmCard;
+ }
+
+ #endregion
+
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{
var joinMap = new DmChassisControllerJoinMap(joinStart);