Fix issues with large dm frame instantiation
This commit is contained in:
Trevor Payne
2021-08-02 10:34:41 -05:00
parent 82af1366df
commit 864e0675ea

View File

@@ -16,7 +16,8 @@ using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Bridges; using PepperDash.Essentials.Core.Bridges;
using PepperDash.Essentials.DM.Config; using PepperDash.Essentials.DM.Config;
namespace PepperDash.Essentials.DM { namespace PepperDash.Essentials.DM
{
/// <summary> /// <summary>
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions /// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
/// ///
@@ -75,8 +76,10 @@ namespace PepperDash.Essentials.DM {
/// Factory method to create a new chassis controller from config data. Limited to 8x8 right now /// Factory method to create a new chassis controller from config data. Limited to 8x8 right now
/// </summary> /// </summary>
public static DmBladeChassisController GetDmChassisController(string key, string name, public static DmBladeChassisController GetDmChassisController(string key, string name,
string type, DMChassisPropertiesConfig properties) { string type, DMChassisPropertiesConfig properties)
try { {
try
{
type = type.ToLower(); type = type.ToLower();
uint ipid = properties.Control.IpIdInt; uint ipid = properties.Control.IpIdInt;
@@ -85,7 +88,8 @@ namespace PepperDash.Essentials.DM {
else if (type == "dmmd128x128") { chassis = new DmMd128x128(ipid, Global.ControlSystem); } else if (type == "dmmd128x128") { chassis = new DmMd128x128(ipid, Global.ControlSystem); }
if (chassis == null) { if (chassis == null)
{
return null; return null;
} }
@@ -93,11 +97,13 @@ namespace PepperDash.Essentials.DM {
// add the cards and port names // add the cards and port names
foreach (var kvp in properties.InputSlots) foreach (var kvp in properties.InputSlots)
controller.AddInputBlade(kvp.Value, kvp.Key); controller.AddInputBlade(kvp.Value, kvp.Key);
foreach (var kvp in properties.OutputSlots) { foreach (var kvp in properties.OutputSlots)
{
controller.AddOutputBlade(kvp.Value, kvp.Key); controller.AddOutputBlade(kvp.Value, kvp.Key);
} }
foreach (var kvp in properties.VolumeControls) { foreach (var kvp in properties.VolumeControls)
{
// get the card // get the card
// check it for an audio-compatible type // check it for an audio-compatible type
// make a something-something that will make it work // make a something-something that will make it work
@@ -123,7 +129,8 @@ namespace PepperDash.Essentials.DM {
controller.PropertiesConfig = properties; controller.PropertiesConfig = properties;
return controller; return controller;
} }
catch (System.Exception e) { catch (System.Exception e)
{
Debug.Console(0, "Error creating DM chassis:\r{0}", e); Debug.Console(0, "Error creating DM chassis:\r{0}", e);
} }
return null; return null;
@@ -137,7 +144,8 @@ namespace PepperDash.Essentials.DM {
/// <param name="name"></param> /// <param name="name"></param>
/// <param name="chassis"></param> /// <param name="chassis"></param>
public DmBladeChassisController(string key, string name, BladeSwitch chassis) public DmBladeChassisController(string key, string name, BladeSwitch chassis)
: base(key, name, chassis) { : base(key, name, chassis)
{
Chassis = chassis; Chassis = chassis;
InputPorts = new RoutingPortCollection<RoutingInputPort>(); InputPorts = new RoutingPortCollection<RoutingInputPort>();
OutputPorts = new RoutingPortCollection<RoutingOutputPort>(); OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
@@ -161,68 +169,87 @@ namespace PepperDash.Essentials.DM {
InputCardHdcpCapabilityFeedbacks = new Dictionary<uint, IntFeedback>(); InputCardHdcpCapabilityFeedbacks = new Dictionary<uint, IntFeedback>();
InputCardHdcpCapabilityTypes = new Dictionary<uint, eHdcpCapabilityType>(); InputCardHdcpCapabilityTypes = new Dictionary<uint, eHdcpCapabilityType>();
for (uint x = 1; x <= Chassis.NumberOfOutputs; x++) { for (uint x = 1; x <= Chassis.NumberOfOutputs; x++)
{
var tempX = x; var tempX = x;
if (Chassis.Outputs[tempX] != null) { if (Chassis.Outputs[tempX] != null)
VideoOutputFeedbacks[tempX] = new IntFeedback(() => { {
VideoOutputFeedbacks[tempX] = new IntFeedback(() =>
{
if (Chassis.Outputs[tempX].VideoOutFeedback != null) { return (ushort)Chassis.Outputs[tempX].VideoOutFeedback.Number; } if (Chassis.Outputs[tempX].VideoOutFeedback != null) { return (ushort)Chassis.Outputs[tempX].VideoOutFeedback.Number; }
else { return 0; }; else { return 0; };
}); });
OutputNameFeedbacks[tempX] = new StringFeedback(() => { OutputNameFeedbacks[tempX] = new StringFeedback(() =>
if (Chassis.Outputs[tempX].NameFeedback != null) { {
if (Chassis.Outputs[tempX].NameFeedback != null)
{
return Chassis.Outputs[tempX].NameFeedback.StringValue; return Chassis.Outputs[tempX].NameFeedback.StringValue;
} }
else { else
{
return ""; return "";
} }
}); });
OutputVideoRouteNameFeedbacks[tempX] = new StringFeedback(() => { OutputVideoRouteNameFeedbacks[tempX] = new StringFeedback(() =>
if (Chassis.Outputs[tempX].VideoOutFeedback != null) { {
if (Chassis.Outputs[tempX].VideoOutFeedback != null)
{
return Chassis.Outputs[tempX].VideoOutFeedback.NameFeedback.StringValue; return Chassis.Outputs[tempX].VideoOutFeedback.NameFeedback.StringValue;
} }
else { else
{
return ""; return "";
} }
}); });
OutputEndpointOnlineFeedbacks[tempX] = new BoolFeedback(() => { OutputEndpointOnlineFeedbacks[tempX] = new BoolFeedback(() =>
{
//if (Chassis.Outputs[tempX].Endpoint != null) //if (Chassis.Outputs[tempX].Endpoint != null)
// return Chassis.Outputs[tempX].Endpoint.IsOnline; // return Chassis.Outputs[tempX].Endpoint.IsOnline;
//else //else
return Chassis.Outputs[tempX].EndpointOnlineFeedback; return Chassis.Outputs[tempX].EndpointOnlineFeedback;
}); });
} }
if (Chassis.Inputs[tempX] != null) { if (Chassis.Inputs[tempX] != null)
UsbInputRoutedToFeebacks[tempX] = new IntFeedback(() => { {
UsbInputRoutedToFeebacks[tempX] = new IntFeedback(() =>
{
if (Chassis.Inputs[tempX].USBRoutedToFeedback != null) { return (ushort)Chassis.Inputs[tempX].USBRoutedToFeedback.Number; } if (Chassis.Inputs[tempX].USBRoutedToFeedback != null) { return (ushort)Chassis.Inputs[tempX].USBRoutedToFeedback.Number; }
else { return 0; }; else { return 0; };
}); });
VideoInputSyncFeedbacks[tempX] = new BoolFeedback(() => { VideoInputSyncFeedbacks[tempX] = new BoolFeedback(() =>
{
if (Chassis.Inputs[tempX].VideoDetectedFeedback != null) if (Chassis.Inputs[tempX].VideoDetectedFeedback != null)
return Chassis.Inputs[tempX].VideoDetectedFeedback.BoolValue; return Chassis.Inputs[tempX].VideoDetectedFeedback.BoolValue;
else else
return false; return false;
}); });
InputNameFeedbacks[tempX] = new StringFeedback(() => { InputNameFeedbacks[tempX] = new StringFeedback(() =>
if (Chassis.Inputs[tempX].NameFeedback != null) { {
if (Chassis.Inputs[tempX].NameFeedback != null)
{
return Chassis.Inputs[tempX].NameFeedback.StringValue; return Chassis.Inputs[tempX].NameFeedback.StringValue;
} }
else { else
{
return ""; return "";
} }
}); });
InputEndpointOnlineFeedbacks[tempX] = new BoolFeedback(() => { InputEndpointOnlineFeedbacks[tempX] = new BoolFeedback(() =>
{
return Chassis.Inputs[tempX].EndpointOnlineFeedback; return Chassis.Inputs[tempX].EndpointOnlineFeedback;
}); });
InputCardHdcpCapabilityFeedbacks[tempX] = new IntFeedback(() => { InputCardHdcpCapabilityFeedbacks[tempX] = new IntFeedback(() =>
{
var inputCard = Chassis.Inputs[tempX]; var inputCard = Chassis.Inputs[tempX];
if (inputCard.Card is DmHdmi4kInputBladeCard) { if (inputCard.Card is DmHdmi4kInputBladeCard)
{
InputCardHdcpCapabilityTypes[tempX] = eHdcpCapabilityType.Hdcp2_2Support; InputCardHdcpCapabilityTypes[tempX] = eHdcpCapabilityType.Hdcp2_2Support;
if ((inputCard.Card as DmHdmi4kInputBladeCard).Hdmi4kInput.HdcpSupportOnFeedback.BoolValue) if ((inputCard.Card as DmHdmi4kInputBladeCard).Hdmi4kInput.HdcpSupportOnFeedback.BoolValue)
@@ -231,7 +258,8 @@ namespace PepperDash.Essentials.DM {
return 0; return 0;
} }
if (inputCard.Card is DmC4kInputBladeCard) { if (inputCard.Card is DmC4kInputBladeCard)
{
InputCardHdcpCapabilityTypes[tempX] = eHdcpCapabilityType.Hdcp2_2Support; InputCardHdcpCapabilityTypes[tempX] = eHdcpCapabilityType.Hdcp2_2Support;
if ((inputCard.Card as DmC4kInputBladeCard).DmInput.HdcpCapabilityFeedback.Equals(eHdcpCapabilityType.HdcpSupportOff)) if ((inputCard.Card as DmC4kInputBladeCard).DmInput.HdcpCapabilityFeedback.Equals(eHdcpCapabilityType.HdcpSupportOff))
@@ -252,45 +280,56 @@ namespace PepperDash.Essentials.DM {
/// </summary> /// </summary>
/// <param name="type"></param> /// <param name="type"></param>
/// <param name="number"></param> /// <param name="number"></param>
public void AddInputBlade(string type, uint number) { public void AddInputBlade(string type, uint number)
{
Debug.Console(2, this, "Adding input blade '{0}', slot {1}", type, number); Debug.Console(2, this, "Adding input blade '{0}', slot {1}", type, number);
type = type.ToLower(); type = type.ToLower();
if (type == "dmb4kihd") { if (type == "dmb4kihd")
{
var inputBlade = new Dmb4kIHd(number, this.Chassis); var inputBlade = new Dmb4kIHd(number, this.Chassis);
foreach (var item in inputBlade.Inputs) { foreach (var item in inputBlade.Inputs)
{
var card = (item.Card as DmHdmi4kInputBladeCard).Hdmi4kInput; var card = (item.Card as DmHdmi4kInputBladeCard).Hdmi4kInput;
var cecPort = card as ICec; var cecPort = card as ICec;
AddHdmiInBladePorts(item.Number, cecPort); AddHdmiInBladePorts(item.Number, cecPort);
} }
} }
else if (type == "dmb4kihddnt") { else if (type == "dmb4kihddnt")
{
var inputBlade = new Dmb4kIHd(number, this.Chassis); var inputBlade = new Dmb4kIHd(number, this.Chassis);
foreach (var item in inputBlade.Inputs) { foreach (var item in inputBlade.Inputs)
{
var card = (item.Card as DmHdmi4kInputBladeCard).Hdmi4kInput; var card = (item.Card as DmHdmi4kInputBladeCard).Hdmi4kInput;
var cecPort = card as ICec; var cecPort = card as ICec;
AddHdmiInBladePorts(item.Number, cecPort); AddHdmiInBladePorts(item.Number, cecPort);
} }
} }
else if (type == "dmb4kic") { else if (type == "dmb4kic")
{
var inputBlade = new Dmb4kIC(number, this.Chassis); var inputBlade = new Dmb4kIC(number, this.Chassis);
foreach (var item in inputBlade.Inputs) { foreach (var item in inputBlade.Inputs)
{
AddDmInBladePorts(item.Number); AddDmInBladePorts(item.Number);
} }
} }
else if (type == "dmbis") { else if (type == "dmbis")
{
var inputBlade = new DmbIS(number, this.Chassis); var inputBlade = new DmbIS(number, this.Chassis);
foreach (var item in inputBlade.Inputs) { foreach (var item in inputBlade.Inputs)
{
AddDmInMmFiberPorts(item.Number); AddDmInMmFiberPorts(item.Number);
} }
} }
else if (type == "dmbis2") { else if (type == "dmbis2")
{
var inputBlade = new DmbIS2(number, this.Chassis); var inputBlade = new DmbIS2(number, this.Chassis);
foreach (var item in inputBlade.Inputs) { foreach (var item in inputBlade.Inputs)
{
AddDmInSmFiberPorts(item.Number); AddDmInSmFiberPorts(item.Number);
} }
} }
@@ -304,22 +343,26 @@ namespace PepperDash.Essentials.DM {
{ {
var newEvent = NumericSwitchChange; var newEvent = NumericSwitchChange;
if (newEvent != null) newEvent(this, e); if (newEvent != null) newEvent(this, e);
} }
void AddHdmiInBladePorts(uint number, ICec cecPort) { void AddHdmiInBladePorts(uint number, ICec cecPort)
{
AddInputPortWithDebug(number, "hdmiIn", eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.DmCat, cecPort); AddInputPortWithDebug(number, "hdmiIn", eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.DmCat, cecPort);
} }
void AddDmInBladePorts(uint number) { void AddDmInBladePorts(uint number)
{
AddInputPortWithDebug(number, "dmCIn", eRoutingSignalType.Video, eRoutingPortConnectionType.DmCat); AddInputPortWithDebug(number, "dmCIn", eRoutingSignalType.Video, eRoutingPortConnectionType.DmCat);
} }
void AddDmInMmFiberPorts(uint number) { void AddDmInMmFiberPorts(uint number)
{
AddInputPortWithDebug(number, "dmMmIn", eRoutingSignalType.Video, eRoutingPortConnectionType.DmMmFiber); AddInputPortWithDebug(number, "dmMmIn", eRoutingSignalType.Video, eRoutingPortConnectionType.DmMmFiber);
} }
void AddDmInSmFiberPorts(uint number) { void AddDmInSmFiberPorts(uint number)
{
AddInputPortWithDebug(number, "dmSmIn", eRoutingSignalType.Video, eRoutingPortConnectionType.DmSmFiber); AddInputPortWithDebug(number, "dmSmIn", eRoutingSignalType.Video, eRoutingPortConnectionType.DmSmFiber);
} }
@@ -328,64 +371,81 @@ namespace PepperDash.Essentials.DM {
/// </summary> /// </summary>
/// <param name="type"></param> /// <param name="type"></param>
/// <param name="number"></param> /// <param name="number"></param>
public void AddOutputBlade(string type, uint number) { public void AddOutputBlade(string type, uint number)
{
type = type.ToLower(); type = type.ToLower();
Debug.Console(2, this, "Adding output blade '{0}', slot {1}", type, number); Debug.Console(2, this, "Adding output blade '{0}', slot {1}", type, number);
if (type == "dmb4kohd") { if (type == "dmb4kohd")
{
var outputBlade = new Dmb4KOHD(number, Chassis); var outputBlade = new Dmb4KOHD(number, Chassis);
foreach (var item in outputBlade.Outputs) { foreach (var item in outputBlade.Outputs)
{
AddHdmiOutBladePorts(item.Number); AddHdmiOutBladePorts(item.Number);
} }
} }
else if (type == "dmb4kohddnt") { else if (type == "dmb4kohddnt")
{
var outputBlade = new Dmb4KOHD(number, Chassis); var outputBlade = new Dmb4KOHD(number, Chassis);
foreach (var item in outputBlade.Outputs) { foreach (var item in outputBlade.Outputs)
{
AddHdmiOutBladePorts(item.Number); AddHdmiOutBladePorts(item.Number);
} }
} }
else if (type == "dmb4koc") { else if (type == "dmb4koc")
{
var outputBlade = new Dmb4KOC(number, Chassis); var outputBlade = new Dmb4KOC(number, Chassis);
foreach (var item in outputBlade.Outputs) { foreach (var item in outputBlade.Outputs)
{
AddDmOutBladePorts(item.Number); AddDmOutBladePorts(item.Number);
} }
} }
else if (type == "dmb4koc") { else if (type == "dmb4koc")
{
var outputBlade = new Dmb4KOC(number, Chassis); var outputBlade = new Dmb4KOC(number, Chassis);
foreach (var item in outputBlade.Outputs) { foreach (var item in outputBlade.Outputs)
{
AddDmOutBladePorts(item.Number); AddDmOutBladePorts(item.Number);
} }
} }
else if (type == "dmbos") { else if (type == "dmbos")
{
var outputBlade = new DmbOS(number, Chassis); var outputBlade = new DmbOS(number, Chassis);
foreach (var item in outputBlade.Outputs) { foreach (var item in outputBlade.Outputs)
{
AddDmOutMmFiberBladePorts(item.Number); AddDmOutMmFiberBladePorts(item.Number);
} }
} }
else if (type == "dmbos2") { else if (type == "dmbos2")
{
var outputBlade = new DmbOS2(number, Chassis); var outputBlade = new DmbOS2(number, Chassis);
foreach (var item in outputBlade.Outputs) { foreach (var item in outputBlade.Outputs)
{
AddDmOutSmFiberBladePorts(item.Number); AddDmOutSmFiberBladePorts(item.Number);
} }
} }
} }
void AddHdmiOutBladePorts(uint number) { void AddHdmiOutBladePorts(uint number)
AddOutputPortWithDebug(String.Format("outputBlade{0}", (number / 8 > 0 ? 1 : number / 8)), String.Format("hdmiOut{0}", number) , eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, Chassis.Outputs[number]); {
AddOutputPortWithDebug(number, "hdmiOut", eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, Chassis.Outputs[number]);
} }
void AddDmOutBladePorts(uint number) { void AddDmOutBladePorts(uint number)
AddOutputPortWithDebug(String.Format("outputBlade{0}", (number / 8 > 0 ? 1 : number / 8)), String.Format("dmOut{0}", number), eRoutingSignalType.Video, eRoutingPortConnectionType.DmCat, Chassis.Outputs[number]); {
AddOutputPortWithDebug(number, "dmOut", eRoutingSignalType.Video, eRoutingPortConnectionType.DmCat, Chassis.Outputs[number]);
} }
void AddDmOutMmFiberBladePorts(uint number) { void AddDmOutMmFiberBladePorts(uint number)
AddOutputPortWithDebug(String.Format("outputBlade{0}", (number / 8 > 0 ? 1 : number / 8)), String.Format("dmOut{0}", number), eRoutingSignalType.Video, eRoutingPortConnectionType.DmMmFiber, Chassis.Outputs[number]); {
AddOutputPortWithDebug(number, "dmMmOut", eRoutingSignalType.Video, eRoutingPortConnectionType.DmMmFiber, Chassis.Outputs[number]);
} }
void AddDmOutSmFiberBladePorts(uint number) { void AddDmOutSmFiberBladePorts(uint number)
AddOutputPortWithDebug(String.Format("outputBlade{0}", (number / 8 > 0 ? 1 : number / 8)), String.Format("dmOut{0}", number), eRoutingSignalType.Video, eRoutingPortConnectionType.DmSmFiber, Chassis.Outputs[number]); {
AddOutputPortWithDebug(number, "dmSmOut", eRoutingSignalType.Video, eRoutingPortConnectionType.DmSmFiber, Chassis.Outputs[number]);
} }
@@ -417,23 +477,44 @@ namespace PepperDash.Essentials.DM {
} }
/// <summary>
/// Adds OutputPort /*void AddOutputPortWithDebug(string cardName, string portName, eRoutingSignalType sigType, eRoutingPortConnectionType portType, object selector) {
/// </summary>
void AddOutputPortWithDebug(string cardName, string portName, eRoutingSignalType sigType, eRoutingPortConnectionType portType, object selector) {
var portKey = string.Format("{0}--{1}", cardName, portName); var portKey = string.Format("{0}--{1}", cardName, portName);
Debug.Console(2, this, "Adding output port '{0}'", portKey); Debug.Console(2, this, "Adding output port '{0}'", portKey);
OutputPorts.Add(new RoutingOutputPort(portKey, sigType, portType, selector, this) OutputPorts.Add(new RoutingOutputPort(portKey, sigType, portType, selector, this)
{ {
FeedbackMatchObject = Chassis.Outputs[(uint)selector] FeedbackMatchObject = Chassis.Outputs[(uint)selector]
}); });
}*/
/// <summary>
/// Adds OutputPort
/// </summary>
void AddOutputPortWithDebug(uint cardNum, string portName, eRoutingSignalType sigType, eRoutingPortConnectionType portType, object selector)
{
try
{
var portKey = string.Format("outputCard{0}--{1}", cardNum, portName);
Debug.Console(2, this, "Adding output port '{0}'", portKey);
var outputPort = new RoutingOutputPort(portKey, sigType, portType, selector, this)
{
FeedbackMatchObject = Chassis.Outputs[cardNum]
};
OutputPorts.Add(outputPort);
}
catch (Exception ex)
{
Debug.Console(0, this, "Exception : {0}", ex);
}
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
void AddVolumeControl(uint number, Audio.Output audio) { void AddVolumeControl(uint number, Audio.Output audio)
{
VolumeControls.Add(number, new DmCardAudioOutputController(audio)); VolumeControls.Add(number, new DmCardAudioOutputController(audio));
} }
@@ -443,35 +524,43 @@ namespace PepperDash.Essentials.DM {
//} //}
void Chassis_DMInputChange(Switch device, DMInputEventArgs args) { void Chassis_DMInputChange(Switch device, DMInputEventArgs args)
{
switch (args.EventId) { switch (args.EventId)
case DMInputEventIds.EndpointOnlineEventId: { {
case DMInputEventIds.EndpointOnlineEventId:
{
Debug.Console(2, this, "DM Input EndpointOnlineEventId for input: {0}. State: {1}", args.Number, device.Inputs[args.Number].EndpointOnlineFeedback); Debug.Console(2, this, "DM Input EndpointOnlineEventId for input: {0}. State: {1}", args.Number, device.Inputs[args.Number].EndpointOnlineFeedback);
InputEndpointOnlineFeedbacks[args.Number].FireUpdate(); InputEndpointOnlineFeedbacks[args.Number].FireUpdate();
break; break;
} }
case DMInputEventIds.OnlineFeedbackEventId: { case DMInputEventIds.OnlineFeedbackEventId:
{
Debug.Console(2, this, "DM Input OnlineFeedbackEventId for input: {0}. State: {1}", args.Number, device.Inputs[args.Number].EndpointOnlineFeedback); Debug.Console(2, this, "DM Input OnlineFeedbackEventId for input: {0}. State: {1}", args.Number, device.Inputs[args.Number].EndpointOnlineFeedback);
InputEndpointOnlineFeedbacks[args.Number].FireUpdate(); InputEndpointOnlineFeedbacks[args.Number].FireUpdate();
break; break;
} }
case DMInputEventIds.VideoDetectedEventId: { case DMInputEventIds.VideoDetectedEventId:
{
Debug.Console(2, this, "DM Input {0} VideoDetectedEventId", args.Number); Debug.Console(2, this, "DM Input {0} VideoDetectedEventId", args.Number);
VideoInputSyncFeedbacks[args.Number].FireUpdate(); VideoInputSyncFeedbacks[args.Number].FireUpdate();
break; break;
} }
case DMInputEventIds.InputNameEventId: { case DMInputEventIds.InputNameEventId:
{
Debug.Console(2, this, "DM Input {0} NameFeedbackEventId", args.Number); Debug.Console(2, this, "DM Input {0} NameFeedbackEventId", args.Number);
InputNameFeedbacks[args.Number].FireUpdate(); InputNameFeedbacks[args.Number].FireUpdate();
break; break;
} }
case DMInputEventIds.HdcpCapabilityFeedbackEventId: { case DMInputEventIds.HdcpCapabilityFeedbackEventId:
{
Debug.Console(2, this, "DM Input {0} HdcpCapabilityFeedbackEventId", args.Number); Debug.Console(2, this, "DM Input {0} HdcpCapabilityFeedbackEventId", args.Number);
InputCardHdcpCapabilityFeedbacks[args.Number].FireUpdate(); InputCardHdcpCapabilityFeedbacks[args.Number].FireUpdate();
break; break;
} }
default: { default:
{
Debug.Console(2, this, "DMInputChange fired for Input {0} with Unhandled EventId: {1}", args.Number, args.EventId); Debug.Console(2, this, "DMInputChange fired for Input {0} with Unhandled EventId: {1}", args.Number, args.EventId);
break; break;
} }
@@ -487,74 +576,74 @@ namespace PepperDash.Essentials.DM {
switch (args.EventId) switch (args.EventId)
{ {
case DMOutputEventIds.VolumeEventId: case DMOutputEventIds.VolumeEventId:
{
if (VolumeControls.ContainsKey(output))
{ {
VolumeControls[args.Number].VolumeEventFromChassis(); if (VolumeControls.ContainsKey(output))
{
VolumeControls[args.Number].VolumeEventFromChassis();
}
break;
} }
break;
}
case DMOutputEventIds.EndpointOnlineEventId: case DMOutputEventIds.EndpointOnlineEventId:
{ {
Debug.Console(2, this,
"Output {0} DMOutputEventIds.EndpointOnlineEventId fired. EndpointOnlineFeedback State: {1}",
args.Number, Chassis.Outputs[output].EndpointOnlineFeedback);
if (Chassis.Outputs[output].Endpoint != null)
Debug.Console(2, this, Debug.Console(2, this,
"Output {0} DMOutputEventIds.EndpointOnlineEventId fired. Endpoint.IsOnline State: {1}", "Output {0} DMOutputEventIds.EndpointOnlineEventId fired. EndpointOnlineFeedback State: {1}",
args.Number, Chassis.Outputs[output].Endpoint.IsOnline); args.Number, Chassis.Outputs[output].EndpointOnlineFeedback);
if (Chassis.Outputs[output].Endpoint != null)
Debug.Console(2, this,
"Output {0} DMOutputEventIds.EndpointOnlineEventId fired. Endpoint.IsOnline State: {1}",
args.Number, Chassis.Outputs[output].Endpoint.IsOnline);
OutputEndpointOnlineFeedbacks[output].FireUpdate(); OutputEndpointOnlineFeedbacks[output].FireUpdate();
break; break;
} }
case DMOutputEventIds.OnlineFeedbackEventId: case DMOutputEventIds.OnlineFeedbackEventId:
{ {
Debug.Console(2, this, "Output {0} DMInputEventIds.OnlineFeedbackEventId fired. State: {1}", Debug.Console(2, this, "Output {0} DMInputEventIds.OnlineFeedbackEventId fired. State: {1}",
args.Number, Chassis.Outputs[output].EndpointOnlineFeedback); args.Number, Chassis.Outputs[output].EndpointOnlineFeedback);
OutputEndpointOnlineFeedbacks[output].FireUpdate(); OutputEndpointOnlineFeedbacks[output].FireUpdate();
break; break;
} }
case DMOutputEventIds.VideoOutEventId: case DMOutputEventIds.VideoOutEventId:
{
var inputNumber = Chassis.Outputs[output].VideoOutFeedback == null ? 0 : Chassis.Outputs[output].VideoOutFeedback.Number;
Debug.Console(2, this, "DMSwitchAudioVideo:{0} Routed Input:{1} Output:{2}'", this.Name,
inputNumber, output);
if (VideoOutputFeedbacks.ContainsKey(output))
{ {
var localInputPort = InputPorts.FirstOrDefault(p => (DMInput)p.FeedbackMatchObject == Chassis.Outputs[output].VideoOutFeedback);
var localOutputPort = var inputNumber = Chassis.Outputs[output].VideoOutFeedback == null ? 0 : Chassis.Outputs[output].VideoOutFeedback.Number;
OutputPorts.FirstOrDefault(p => (DMOutput) p.FeedbackMatchObject == Chassis.Outputs[output]);
Debug.Console(2, this, "DMSwitchAudioVideo:{0} Routed Input:{1} Output:{2}'", this.Name,
inputNumber, output);
if (VideoOutputFeedbacks.ContainsKey(output))
{
var localInputPort = InputPorts.FirstOrDefault(p => (DMInput)p.FeedbackMatchObject == Chassis.Outputs[output].VideoOutFeedback);
var localOutputPort =
OutputPorts.FirstOrDefault(p => (DMOutput)p.FeedbackMatchObject == Chassis.Outputs[output]);
VideoOutputFeedbacks[output].FireUpdate(); VideoOutputFeedbacks[output].FireUpdate();
OnSwitchChange(new RoutingNumericEventArgs(output, OnSwitchChange(new RoutingNumericEventArgs(output,
inputNumber, inputNumber,
localOutputPort, localOutputPort,
localInputPort, localInputPort,
eRoutingSignalType.AudioVideo)); eRoutingSignalType.AudioVideo));
}
if (OutputVideoRouteNameFeedbacks.ContainsKey(output))
{
OutputVideoRouteNameFeedbacks[output].FireUpdate();
}
break;
} }
if (OutputVideoRouteNameFeedbacks.ContainsKey(output))
{
OutputVideoRouteNameFeedbacks[output].FireUpdate();
}
break;
}
case DMOutputEventIds.OutputNameEventId: case DMOutputEventIds.OutputNameEventId:
{ {
Debug.Console(2, this, "DM Output {0} NameFeedbackEventId", output); Debug.Console(2, this, "DM Output {0} NameFeedbackEventId", output);
OutputNameFeedbacks[output].FireUpdate(); OutputNameFeedbacks[output].FireUpdate();
break; break;
} }
default: default:
{ {
Debug.Console(2, this, "DMOutputChange fired for Output {0} with Unhandled EventId: {1}", Debug.Console(2, this, "DMOutputChange fired for Output {0} with Unhandled EventId: {1}",
args.Number, args.EventId); args.Number, args.EventId);
break; break;
} }
} }
} }
@@ -564,7 +653,8 @@ namespace PepperDash.Essentials.DM {
/// ///
/// </summary> /// </summary>
/// <param name="pnt"></param> /// <param name="pnt"></param>
void StartOffTimer(PortNumberType pnt) { void StartOffTimer(PortNumberType pnt)
{
if (RouteOffTimers.ContainsKey(pnt)) if (RouteOffTimers.ContainsKey(pnt))
return; return;
RouteOffTimers[pnt] = new CTimer(o => ExecuteSwitch(null, pnt.Selector, pnt.Type), RouteOffTime); RouteOffTimers[pnt] = new CTimer(o => ExecuteSwitch(null, pnt.Selector, pnt.Type), RouteOffTime);
@@ -572,8 +662,10 @@ namespace PepperDash.Essentials.DM {
// Send out sigs when coming online // Send out sigs when coming online
void IsOnline_OutputChange(object sender, EventArgs e) { void IsOnline_OutputChange(object sender, EventArgs e)
if (IsOnline.BoolValue) { {
if (IsOnline.BoolValue)
{
Chassis.EnableUSBBreakaway.BoolValue = true; Chassis.EnableUSBBreakaway.BoolValue = true;
if (InputNames != null) if (InputNames != null)
@@ -587,12 +679,13 @@ namespace PepperDash.Essentials.DM {
#region IRouting Members #region IRouting Members
public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType sigType) { public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType sigType)
{
Debug.Console(2, this, "Making an awesome DM route from {0} to {1} {2}", inputSelector, outputSelector, sigType); Debug.Console(2, this, "Making an awesome DM route from {0} to {1} {2}", inputSelector, outputSelector, sigType);
var input = inputSelector as DMInput; // Cast can sometimes fail var input = inputSelector as DMInput; // Cast can sometimes fail
var output = outputSelector as DMOutput; var output = outputSelector as DMOutput;
if (output == null) if (output == null)
{ {
@@ -605,11 +698,14 @@ namespace PepperDash.Essentials.DM {
// Check to see if there's an off timer waiting on this and if so, cancel // Check to see if there's an off timer waiting on this and if so, cancel
var key = new PortNumberType(output, sigType); var key = new PortNumberType(output, sigType);
if (input == null) { if (input == null)
{
StartOffTimer(key); StartOffTimer(key);
} }
else { else
if (RouteOffTimers.ContainsKey(key)) { {
if (RouteOffTimers.ContainsKey(key))
{
Debug.Console(2, this, "{0} cancelling route off due to new source", output); Debug.Console(2, this, "{0} cancelling route off due to new source", output);
RouteOffTimers[key].Stop(); RouteOffTimers[key].Stop();
RouteOffTimers.Remove(key); RouteOffTimers.Remove(key);
@@ -671,7 +767,7 @@ namespace PepperDash.Essentials.DM {
var ioSlotJoin = ioSlot - 1; var ioSlotJoin = ioSlot - 1;
// Control // Control
trilist.SetUShortSigAction(joinMap.OutputVideo.JoinNumber + ioSlotJoin, o => ExecuteNumericSwitch(o, (ushort) ioSlot, eRoutingSignalType.Video)); trilist.SetUShortSigAction(joinMap.OutputVideo.JoinNumber + ioSlotJoin, o => ExecuteNumericSwitch(o, (ushort)ioSlot, eRoutingSignalType.Video));
if (TxDictionary.ContainsKey(ioSlot)) if (TxDictionary.ContainsKey(ioSlot))
{ {