mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-16 21:24:54 +00:00
Merge pull request #191 from PepperDash/hotfix/dm-usb-routing
Update DM USB Routing to match SIMPL Windows
This commit is contained in:
@@ -9,6 +9,25 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
{
|
{
|
||||||
public class DmChassisControllerJoinMap : JoinMapBaseAdvanced
|
public class DmChassisControllerJoinMap : JoinMapBaseAdvanced
|
||||||
{
|
{
|
||||||
|
[JoinName("EnableAudioBreakaway")]
|
||||||
|
public JoinDataComplete EnableAudioBreakaway = new JoinDataComplete(
|
||||||
|
new JoinData {JoinNumber = 4, JoinSpan = 1},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Label = "DM Chassis enable audio breakaway routing",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("EnableUsbBreakaway")]
|
||||||
|
public JoinDataComplete EnableUsbBreakaway = new JoinDataComplete(
|
||||||
|
new JoinData { JoinNumber = 5, JoinSpan = 1 },
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Label = "DM Chassis enable USB breakaway routing",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
[JoinName("SystemId")]
|
[JoinName("SystemId")]
|
||||||
public JoinDataComplete SystemId = new JoinDataComplete(new JoinData() { JoinNumber = 10, JoinSpan = 1 },
|
public JoinDataComplete SystemId = new JoinDataComplete(new JoinData() { JoinNumber = 10, JoinSpan = 1 },
|
||||||
|
|||||||
@@ -27,6 +27,11 @@ namespace PepperDash.Essentials.Core
|
|||||||
return joinMap;
|
return joinMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string GetJoinMapForDevice(string joinMapKey)
|
||||||
|
{
|
||||||
|
return GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attempts to find a custom join map by key and returns it deserialized if found
|
/// Attempts to find a custom join map by key and returns it deserialized if found
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
using Crestron.SimplSharpPro.DM;
|
using Crestron.SimplSharpPro.DM;
|
||||||
using Crestron.SimplSharpPro.DM.Cards;
|
using Crestron.SimplSharpPro.DM.Cards;
|
||||||
@@ -42,6 +43,8 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
public IntFeedback SystemIdFeebdack { get; private set; }
|
public IntFeedback SystemIdFeebdack { get; private set; }
|
||||||
public BoolFeedback SystemIdBusyFeedback { get; private set; }
|
public BoolFeedback SystemIdBusyFeedback { get; private set; }
|
||||||
|
public BoolFeedback EnableAudioBreakawayFeedback { get; private set; }
|
||||||
|
public BoolFeedback EnableUsbBreakawayFeedback { get; private set; }
|
||||||
|
|
||||||
public Dictionary<uint, IntFeedback> InputCardHdcpCapabilityFeedbacks { get; private set; }
|
public Dictionary<uint, IntFeedback> InputCardHdcpCapabilityFeedbacks { get; private set; }
|
||||||
|
|
||||||
@@ -210,6 +213,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
SystemIdFeebdack = new IntFeedback(() => { return (Chassis as DmMDMnxn).SystemIdFeedback.UShortValue; });
|
SystemIdFeebdack = new IntFeedback(() => { return (Chassis as DmMDMnxn).SystemIdFeedback.UShortValue; });
|
||||||
SystemIdBusyFeedback = new BoolFeedback(() => { return (Chassis as DmMDMnxn).SystemIdBusy.BoolValue; });
|
SystemIdBusyFeedback = new BoolFeedback(() => { return (Chassis as DmMDMnxn).SystemIdBusy.BoolValue; });
|
||||||
|
EnableAudioBreakawayFeedback =
|
||||||
|
new BoolFeedback(() => (Chassis as DmMDMnxn).EnableAudioBreakawayFeedback.BoolValue);
|
||||||
|
EnableUsbBreakawayFeedback =
|
||||||
|
new BoolFeedback(() => (Chassis as DmMDMnxn).EnableUSBBreakawayFeedback.BoolValue);
|
||||||
|
|
||||||
InputCardHdcpCapabilityFeedbacks = new Dictionary<uint, IntFeedback>();
|
InputCardHdcpCapabilityFeedbacks = new Dictionary<uint, IntFeedback>();
|
||||||
InputCardHdcpCapabilityTypes = new Dictionary<uint, eHdcpCapabilityType>();
|
InputCardHdcpCapabilityTypes = new Dictionary<uint, eHdcpCapabilityType>();
|
||||||
|
|
||||||
@@ -376,6 +384,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ChassisOnBaseEvent(GenericBase device, BaseEventArgs args)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -768,6 +781,20 @@ namespace PepperDash.Essentials.DM
|
|||||||
SystemIdBusyFeedback.FireUpdate();
|
SystemIdBusyFeedback.FireUpdate();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case DMSystemEventIds.AudioBreakawayEventId:
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "AudioBreakaway Event: value: {0}",
|
||||||
|
(Chassis as DmMDMnxn).EnableAudioBreakawayFeedback.BoolValue);
|
||||||
|
EnableAudioBreakawayFeedback.FireUpdate();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DMSystemEventIds.USBBreakawayEventId:
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "USBBreakaway Event: value: {0}",
|
||||||
|
(Chassis as DmMDMnxn).EnableUSBBreakawayFeedback.BoolValue);
|
||||||
|
EnableUsbBreakawayFeedback.FireUpdate();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -927,6 +954,10 @@ namespace PepperDash.Essentials.DM
|
|||||||
(Chassis as DmMDMnxn).EnableAudioBreakaway.BoolValue = true;
|
(Chassis as DmMDMnxn).EnableAudioBreakaway.BoolValue = true;
|
||||||
(Chassis as DmMDMnxn).EnableUSBBreakaway.BoolValue = true;
|
(Chassis as DmMDMnxn).EnableUSBBreakaway.BoolValue = true;
|
||||||
|
|
||||||
|
|
||||||
|
EnableAudioBreakawayFeedback.FireUpdate();
|
||||||
|
EnableUsbBreakawayFeedback.FireUpdate();
|
||||||
|
|
||||||
if (InputNames != null)
|
if (InputNames != null)
|
||||||
foreach (var kvp in InputNames)
|
foreach (var kvp in InputNames)
|
||||||
Chassis.Inputs[kvp.Key].Name.StringValue = kvp.Value;
|
Chassis.Inputs[kvp.Key].Name.StringValue = kvp.Value;
|
||||||
@@ -944,6 +975,10 @@ namespace PepperDash.Essentials.DM
|
|||||||
var input = Convert.ToUInt32(inputSelector); // Cast can sometimes fail
|
var input = Convert.ToUInt32(inputSelector); // Cast can sometimes fail
|
||||||
var output = Convert.ToUInt32(outputSelector);
|
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
|
// 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 == 0)
|
if (input == 0)
|
||||||
@@ -964,30 +999,97 @@ namespace PepperDash.Essentials.DM
|
|||||||
var outCard = input == 0 ? null : Chassis.Outputs[output];
|
var outCard = input == 0 ? null : Chassis.Outputs[output];
|
||||||
|
|
||||||
// NOTE THAT BITWISE COMPARISONS - TO CATCH ALL ROUTING TYPES
|
// NOTE THAT BITWISE COMPARISONS - TO CATCH ALL ROUTING TYPES
|
||||||
if ((sigType | eRoutingSignalType.Video) == eRoutingSignalType.Video)
|
if ((sigType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
|
||||||
{
|
{
|
||||||
Chassis.VideoEnter.BoolValue = true;
|
Chassis.VideoEnter.BoolValue = true;
|
||||||
Chassis.Outputs[output].VideoOut = inCard;
|
Chassis.Outputs[output].VideoOut = inCard;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sigType | eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
|
if ((sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
|
||||||
{
|
{
|
||||||
(Chassis as DmMDMnxn).AudioEnter.BoolValue = true;
|
(Chassis as DmMDMnxn).AudioEnter.BoolValue = true;
|
||||||
Chassis.Outputs[output].AudioOut = inCard;
|
Chassis.Outputs[output].AudioOut = inCard;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sigType | eRoutingSignalType.UsbOutput) == eRoutingSignalType.UsbOutput)
|
if ((sigType & eRoutingSignalType.UsbOutput) == eRoutingSignalType.UsbOutput)
|
||||||
{
|
{
|
||||||
|
//using base here because USB can be routed between 2 output cards or 2 input cards
|
||||||
|
DMInputOutputBase dmCard;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
dmCard = Chassis.Outputs[outputIndex];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dmCard = inCard;
|
||||||
|
}
|
||||||
Chassis.USBEnter.BoolValue = true;
|
Chassis.USBEnter.BoolValue = true;
|
||||||
if (Chassis.Outputs[output] != null)
|
if (Chassis.Outputs[output] != null)
|
||||||
Chassis.Outputs[output].USBRoutedTo = inCard;
|
{
|
||||||
|
Debug.Console(2, this, "Routing USB for input {0} to {1}", Chassis.Outputs[input], dmCard);
|
||||||
|
Chassis.Outputs[output].USBRoutedTo = dmCard;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sigType | eRoutingSignalType.UsbInput) == eRoutingSignalType.UsbInput)
|
if ((sigType & eRoutingSignalType.UsbInput) == eRoutingSignalType.UsbInput)
|
||||||
{
|
{
|
||||||
|
//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;
|
Chassis.USBEnter.BoolValue = true;
|
||||||
if (Chassis.Inputs[input] != null)
|
|
||||||
Chassis.Inputs[input].USBRoutedTo = outCard;
|
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
|
#endregion
|
||||||
@@ -1023,6 +1125,19 @@ namespace PepperDash.Essentials.DM
|
|||||||
SystemIdFeebdack.LinkInputSig(trilist.UShortInput[joinMap.SystemId.JoinNumber]);
|
SystemIdFeebdack.LinkInputSig(trilist.UShortInput[joinMap.SystemId.JoinNumber]);
|
||||||
SystemIdBusyFeedback.LinkInputSig(trilist.BooleanInput[joinMap.SystemId.JoinNumber]);
|
SystemIdBusyFeedback.LinkInputSig(trilist.BooleanInput[joinMap.SystemId.JoinNumber]);
|
||||||
|
|
||||||
|
EnableAudioBreakawayFeedback.LinkInputSig(trilist.BooleanInput[joinMap.EnableAudioBreakaway.JoinNumber]);
|
||||||
|
EnableUsbBreakawayFeedback.LinkInputSig(trilist.BooleanInput[joinMap.EnableUsbBreakaway.JoinNumber]);
|
||||||
|
|
||||||
|
trilist.OnlineStatusChange += (o, a) =>
|
||||||
|
{
|
||||||
|
if (!a.DeviceOnLine) return;
|
||||||
|
|
||||||
|
EnableAudioBreakawayFeedback.FireUpdate();
|
||||||
|
EnableUsbBreakawayFeedback.FireUpdate();
|
||||||
|
SystemIdBusyFeedback.FireUpdate();
|
||||||
|
SystemIdFeebdack.FireUpdate();
|
||||||
|
};
|
||||||
|
|
||||||
// Link up outputs
|
// Link up outputs
|
||||||
for (uint i = 1; i <= Chassis.NumberOfOutputs; i++)
|
for (uint i = 1; i <= Chassis.NumberOfOutputs; i++)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user