mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-14 12:15:01 +00:00
feature: enhance 4K DM Endpoint HDCP functionality
feature: add bridge join to report number of HDCP inputs feature: Resolve #1088 feature: Resolve #1089
This commit is contained in:
@@ -18,8 +18,8 @@ using PepperDash.Essentials.Core.Config;
|
||||
|
||||
namespace PepperDash.Essentials.DM
|
||||
{
|
||||
public class DmTxHelper
|
||||
{
|
||||
public class DmTxHelper
|
||||
{
|
||||
|
||||
public static BasicDmTxControllerBase GetDmTxForChassisWithoutIpId(string key, string name, string typeName, DMInput dmInput)
|
||||
{
|
||||
@@ -77,31 +77,31 @@ namespace PepperDash.Essentials.DM
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A factory method for various DmTxControllers
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="name"></param>
|
||||
/// <param name="props"></param>
|
||||
/// <returns></returns>
|
||||
/// <summary>
|
||||
/// A factory method for various DmTxControllers
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="name"></param>
|
||||
/// <param name="props"></param>
|
||||
/// <returns></returns>
|
||||
public static BasicDmTxControllerBase GetDmTxController(string key, string name, string typeName, DmTxPropertiesConfig props)
|
||||
{
|
||||
// switch on type name... later...
|
||||
{
|
||||
// switch on type name... later...
|
||||
|
||||
typeName = typeName.ToLower();
|
||||
//uint ipid = Convert.ToUInt16(props.Id, 16);
|
||||
var ipid = props.Control.IpIdInt;
|
||||
var pKey = props.ParentDeviceKey.ToLower();
|
||||
typeName = typeName.ToLower();
|
||||
//uint ipid = Convert.ToUInt16(props.Id, 16);
|
||||
var ipid = props.Control.IpIdInt;
|
||||
var pKey = props.ParentDeviceKey.ToLower();
|
||||
|
||||
if (pKey == "processor")
|
||||
{
|
||||
// Catch constructor failures, mainly dues to IPID
|
||||
try
|
||||
{
|
||||
if(typeName.StartsWith("dmtx200"))
|
||||
{
|
||||
// Catch constructor failures, mainly dues to IPID
|
||||
try
|
||||
{
|
||||
if (typeName.StartsWith("dmtx200"))
|
||||
return new DmTx200Controller(key, name, new DmTx200C2G(ipid, Global.ControlSystem), false);
|
||||
if (typeName.StartsWith("dmtx201c"))
|
||||
return new DmTx201CController(key, name, new DmTx201C(ipid, Global.ControlSystem), false);
|
||||
if (typeName.StartsWith("dmtx201c"))
|
||||
return new DmTx201CController(key, name, new DmTx201C(ipid, Global.ControlSystem), false);
|
||||
if (typeName.StartsWith("dmtx201s"))
|
||||
return new DmTx201SController(key, name, new DmTx201S(ipid, Global.ControlSystem), false);
|
||||
if (typeName.StartsWith("dmtx4k202"))
|
||||
@@ -112,36 +112,36 @@ namespace PepperDash.Essentials.DM
|
||||
return new DmTx4k302CController(key, name, new DmTx4k302C(ipid, Global.ControlSystem), false);
|
||||
if (typeName.StartsWith("dmtx4kz302"))
|
||||
return new DmTx4kz302CController(key, name, new DmTx4kz302C(ipid, Global.ControlSystem), false);
|
||||
if (typeName.StartsWith("dmtx401"))
|
||||
if (typeName.StartsWith("dmtx401"))
|
||||
return new DmTx401CController(key, name, new DmTx401C(ipid, Global.ControlSystem), false);
|
||||
Debug.Console(0, "{1} WARNING: Cannot create DM-TX of type: '{0}'", typeName, key);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.Console(0, "[{0}] WARNING: Cannot create DM-TX device: {1}", key, e);
|
||||
}
|
||||
Debug.Console(0, "{1} WARNING: Cannot create DM-TX of type: '{0}'", typeName, key);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.Console(0, "[{0}] WARNING: Cannot create DM-TX device: {1}", key, e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
var parentDev = DeviceManager.GetDeviceForKey(pKey);
|
||||
DMInput dmInput;
|
||||
BasicDmTxControllerBase tx;
|
||||
bool useChassisForOfflineFeedback = false;
|
||||
|
||||
if (parentDev is DmChassisController)
|
||||
if (parentDev is DmChassisController)
|
||||
{
|
||||
// Get the Crestron chassis and link stuff up
|
||||
var switchDev = (parentDev as DmChassisController);
|
||||
var chassis = switchDev.Chassis;
|
||||
var switchDev = (parentDev as DmChassisController);
|
||||
var chassis = switchDev.Chassis;
|
||||
|
||||
//Check that the input is within range of this chassis' possible inputs
|
||||
var num = props.ParentInputNumber;
|
||||
if (num <= 0 || num > chassis.NumberOfInputs)
|
||||
{
|
||||
Debug.Console(0, "Cannot create DM device '{0}'. Input number '{1}' is out of range",
|
||||
key, num);
|
||||
return null;
|
||||
}
|
||||
var num = props.ParentInputNumber;
|
||||
if (num <= 0 || num > chassis.NumberOfInputs)
|
||||
{
|
||||
Debug.Console(0, "Cannot create DM device '{0}'. Input number '{1}' is out of range",
|
||||
key, num);
|
||||
return null;
|
||||
}
|
||||
|
||||
switchDev.TxDictionary.Add(num, key);
|
||||
dmInput = chassis.Inputs[num];
|
||||
@@ -164,7 +164,7 @@ namespace PepperDash.Essentials.DM
|
||||
if (typeName == "hdbasettx" || typeName == "dmtx4k100c1g")
|
||||
{
|
||||
useChassisForOfflineFeedback = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (useChassisForOfflineFeedback)
|
||||
{
|
||||
@@ -180,7 +180,7 @@ namespace PepperDash.Essentials.DM
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else if(parentDev is DmpsRoutingController)
|
||||
else if (parentDev is DmpsRoutingController)
|
||||
{
|
||||
// Get the DMPS chassis and link stuff up
|
||||
var dmpsDev = (parentDev as DmpsRoutingController);
|
||||
@@ -209,7 +209,7 @@ namespace PepperDash.Essentials.DM
|
||||
|
||||
try
|
||||
{
|
||||
if(Global.ControlSystemIsDmps4kType)
|
||||
if (Global.ControlSystemIsDmps4kType)
|
||||
{
|
||||
tx = GetDmTxForChassisWithoutIpId(key, name, typeName, dmInput);
|
||||
useChassisForOfflineFeedback = true;
|
||||
@@ -220,7 +220,7 @@ namespace PepperDash.Essentials.DM
|
||||
if (typeName == "hdbasettx" || typeName == "dmtx4k100c1g")
|
||||
{
|
||||
useChassisForOfflineFeedback = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (useChassisForOfflineFeedback)
|
||||
{
|
||||
@@ -234,16 +234,16 @@ namespace PepperDash.Essentials.DM
|
||||
{
|
||||
Debug.Console(0, "[{0}] WARNING: Cannot create DM-TX device for dmps: {1}", key, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
Debug.Console(0, "Cannot create DM device '{0}'. '{1}' is not a processor, DM Chassis or DMPS.", key, pKey);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
Debug.Console(0, "Cannot create DM device '{0}'. '{1}' is not a processor, DM Chassis or DMPS.", key, pKey);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class BasicDmTxControllerBase : CrestronGenericBridgeableBaseDevice
|
||||
{
|
||||
@@ -254,21 +254,21 @@ namespace PepperDash.Essentials.DM
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
[Description("Wrapper class for all DM-TX variants")]
|
||||
public abstract class DmTxControllerBase : BasicDmTxControllerBase
|
||||
{
|
||||
public abstract class DmTxControllerBase : BasicDmTxControllerBase
|
||||
{
|
||||
public virtual void SetPortHdcpCapability(eHdcpCapabilityType hdcpMode, uint port) { }
|
||||
public virtual eHdcpCapabilityType HdcpSupportCapability { get; protected set; }
|
||||
public abstract StringFeedback ActiveVideoInputFeedback { get; protected set; }
|
||||
public RoutingInputPortWithVideoStatuses AnyVideoInput { get; protected set; }
|
||||
public IntFeedback HdcpStateFeedback { get; protected set; }
|
||||
|
||||
protected DmTxControllerBase(string key, string name, EndpointTransmitterBase hardware)
|
||||
: base(key, name, hardware)
|
||||
{
|
||||
protected DmTxControllerBase(string key, string name, EndpointTransmitterBase hardware)
|
||||
: base(key, name, hardware)
|
||||
{
|
||||
AddToFeedbackList(ActiveVideoInputFeedback);
|
||||
|
||||
IsOnline.OutputChange += (currentDevice, args) =>
|
||||
@@ -279,11 +279,12 @@ namespace PepperDash.Essentials.DM
|
||||
feedback.FireUpdate();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
protected DmTxControllerBase(string key, string name, DmHDBasedTEndPoint hardware) : base(key, name, hardware)
|
||||
{
|
||||
}
|
||||
protected DmTxControllerBase(string key, string name, DmHDBasedTEndPoint hardware)
|
||||
: base(key, name, hardware)
|
||||
{
|
||||
}
|
||||
|
||||
protected DmTxControllerJoinMap GetDmTxJoinMap(uint joinStart, string joinMapKey)
|
||||
{
|
||||
@@ -297,8 +298,8 @@ namespace PepperDash.Essentials.DM
|
||||
return joinMap;
|
||||
}
|
||||
|
||||
protected void LinkDmTxToApi(DmTxControllerBase tx, BasicTriList trilist, DmTxControllerJoinMap joinMap, EiscApiAdvanced bridge)
|
||||
{
|
||||
protected void LinkDmTxToApi(DmTxControllerBase tx, BasicTriList trilist, DmTxControllerJoinMap joinMap, EiscApiAdvanced bridge)
|
||||
{
|
||||
if (bridge != null)
|
||||
{
|
||||
bridge.AddJoinMap(Key, joinMap);
|
||||
@@ -308,7 +309,7 @@ namespace PepperDash.Essentials.DM
|
||||
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
||||
}
|
||||
|
||||
Debug.Console(1, tx, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
||||
Debug.Console(1, tx, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
||||
|
||||
tx.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
|
||||
tx.AnyVideoInput.VideoStatus.VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.VideoSyncStatus.JoinNumber]);
|
||||
@@ -411,9 +412,22 @@ namespace PepperDash.Essentials.DM
|
||||
|
||||
SetHdcpCapabilityAction(hdcpTypeSimple, port, joinMap.Port3HdcpState.JoinNumber, trilist);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
var hdcpInputPortCount =
|
||||
(ushort)
|
||||
txR.InputPorts.Where(
|
||||
x => (x.Type == eRoutingSignalType.Video) || (x.Type == eRoutingSignalType.AudioVideo))
|
||||
.Where(
|
||||
x =>
|
||||
(x.ConnectionType == eRoutingPortConnectionType.DmCat) ||
|
||||
(x.ConnectionType == eRoutingPortConnectionType.Hdmi) ||
|
||||
(x.ConnectionType == eRoutingPortConnectionType.DisplayPort))
|
||||
.ToList().Count();
|
||||
|
||||
trilist.SetUshort(joinMap.HdcpInputPortCount.JoinNumber, hdcpInputPortCount);
|
||||
|
||||
}
|
||||
|
||||
var txFreeRun = tx as IHasFreeRun;
|
||||
@@ -462,20 +476,20 @@ namespace PepperDash.Essentials.DM
|
||||
}
|
||||
}
|
||||
|
||||
private void SetHdcpCapabilityAction(bool hdcpTypeSimple, EndpointDisplayPortInput port, uint join,
|
||||
BasicTriList trilist)
|
||||
{
|
||||
private void SetHdcpCapabilityAction(bool hdcpTypeSimple, EndpointDisplayPortInput port, uint join,
|
||||
BasicTriList trilist)
|
||||
{
|
||||
|
||||
|
||||
trilist.SetUShortSigAction(join,
|
||||
s =>
|
||||
{
|
||||
port.HdcpCapability = (eHdcpCapabilityType) s;
|
||||
});
|
||||
trilist.SetUShortSigAction(join,
|
||||
s =>
|
||||
{
|
||||
port.HdcpCapability = (eHdcpCapabilityType)s;
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public class DmTxControllerFactory : EssentialsDeviceFactory<DmTxControllerBase>
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user