diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 890b7769..d44e7848 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -91,8 +91,8 @@ we receive and the availability of resources to evaluate contributions, we antic project remains dynamic and relevant. This may affect our responsiveness and ability to accept pull requests quickly. This does not mean we are ignoring them. - Not all innovative ideas need to be accepted as pull requests into this GitHub project to be valuable to the community. - There may be times when we recommend that you just share your code for some enhancement to Ghidra from your own - repository. As we identify and recognize extensions that are of general interest to the reverse engineering community, we + There may be times when we recommend that you just share your code for some enhancement to Essentials from your own + repository. As we identify and recognize extensions that are of general interest to Essentials, we may seek to incorporate them with our baseline. ## Legal diff --git a/PepperDashEssentials/Bridges/EiscBridge.cs b/PepperDashEssentials/Bridges/EiscBridge.cs index 21a220ef..c768924b 100644 --- a/PepperDashEssentials/Bridges/EiscBridge.cs +++ b/PepperDashEssentials/Bridges/EiscBridge.cs @@ -70,7 +70,7 @@ namespace PepperDash.Essentials.Bridges catch (NullReferenceException) { Debug.ConsoleWithLog(0, this, - "Please update the bridge config to use EiscBridgeAdvanced with this device: {0}", device.Key); + "Please update the bridge config to use eiscApiAdvanced with this device: {0}", device.Key); } } Debug.Console(1, this, "Devices Linked."); diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/AirMediaControllerJoinMap.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/AirMediaControllerJoinMap.cs index 126c6112..170da721 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/AirMediaControllerJoinMap.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/AirMediaControllerJoinMap.cs @@ -20,6 +20,18 @@ namespace PepperDash.Essentials.Core.Bridges public JoinDataComplete AutomaticInputRoutingEnabled = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 }, new JoinMetadata { Description = "Air Media Automatic Input Routing Enable(d)", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital }); + [JoinName("HdmiInHdcpSupportOn")] + public JoinDataComplete HdmiInHdcpSupportOn = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 }, + new JoinMetadata { Description = "Turns on HDCP support for HDMI in. Reports state as FB", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital }); + + [JoinName("HdmiInHdcpSupportOff")] + public JoinDataComplete HdmiInHdcpSupportOff = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 }, + new JoinMetadata { Description = "Turns off HDCP support for HDMI in. Reports state as FB", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital }); + + [JoinName("HdmiInDisabledByHdcp")] + public JoinDataComplete HdmiInDisabledByHdcp = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 }, + new JoinMetadata { Description = "Reports if ", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital }); + [JoinName("VideoOut")] public JoinDataComplete VideoOut = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 }, new JoinMetadata { Description = "Air Media Video Route Select / Feedback", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog }); diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmRmcControllerJoinMap.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmRmcControllerJoinMap.cs index c0e7141f..8352bb1d 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmRmcControllerJoinMap.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmRmcControllerJoinMap.cs @@ -68,7 +68,13 @@ namespace PepperDash.Essentials.Core.Bridges public JoinDataComplete HdcpInputPortCount = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 }, new JoinMetadata { Description = "Number of Input Ports that support HDCP", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog }); + [JoinName("ScalerOutWallMode")] + public JoinDataComplete ScalerOutWallMode = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 }, + new JoinMetadata { Description = "Set Wall Mode for Scaler video Wall mode", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog }); + [JoinName("ScalerOutWallModeRaw")] + public JoinDataComplete ScalerOutWallModeRaw = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 }, + new JoinMetadata { Description = "Set Wall Mode for Scaler video Wall mode", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog }); /// /// Constructor to use when instantiating this Join Map without inheriting from it diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron IO/CenIoCom/CenIoComController.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron IO/CenIoCom/CenIoComController.cs new file mode 100644 index 00000000..bbd496b4 --- /dev/null +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron IO/CenIoCom/CenIoComController.cs @@ -0,0 +1,85 @@ +using System.Collections.Generic; +using Crestron.SimplSharpPro; +using Crestron.SimplSharpPro.GeneralIO; +using PepperDash.Core; +using PepperDash.Essentials.Core.Config; + +namespace PepperDash.Essentials.Core.CrestronIO +{ + /// + /// Wrapper class for CEN-IO-COM-Xxx expander module + /// + [Description("Wrapper class for the CEN-IO-COM-102 & CEN-IO-COM-202 expander module")] + public class CenIoComController : CrestronGenericBaseDevice, IComPorts + { + private readonly CenIoCom _cenIoCom; + + public CenIoComController(string key, string name, CenIoCom cenIo) + :base(key, name, cenIo) + { + _cenIoCom = cenIo; + } + + #region Implementation of IComPorts + + public CrestronCollection ComPorts + { + get { return _cenIoCom.ComPorts; } + } + + public int NumberOfComPorts + { + get { return _cenIoCom.NumberOfComPorts; } + } + + #endregion + + } + + public class CenIoCom102ControllerFactory : EssentialsDeviceFactory + { + private const string CenIoCom102Type = "ceniocom102"; + private const string CenIoCom202Type = "ceniocom202"; + + public CenIoCom102ControllerFactory() + { + TypeNames = new List { CenIoCom102Type, CenIoCom202Type }; + } + + public override EssentialsDevice BuildDevice(DeviceConfig dc) + { + Debug.Console(1, "Factory Attempting to create new CEN-IO-COM-Xxx Device"); + + var control = CommFactory.GetControlPropertiesConfig(dc); + if (control == null) + { + Debug.Console(1, "Factory failed to create a new CEN-IO-COM-Xxx Device, control properties not found"); + return null; + } + + var ipid = control.IpIdInt; + if (ipid < 2) + { + Debug.Console(1, "Factory failed to create a new CEN-IO-COM-Xxx Device, invalid IP-ID found"); + return null; + } + + switch (dc.Type) + { + case CenIoCom102Type: + { + return new CenIoComController(dc.Key, dc.Name, new CenIoCom102(ipid, Global.ControlSystem)); + } + case CenIoCom202Type: + { + return new CenIoComController(dc.Key, dc.Name, new CenIoCom202(ipid, Global.ControlSystem)); + } + default: + { + Debug.Console(1, "Factory failed to create a new CEN-IO-COM-Xxx Device, invalid type '{0}'", dc.Type); + return null; + } + } + } + } +} \ No newline at end of file diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj index aa2359bf..6b7a3ad9 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj @@ -185,6 +185,7 @@ + diff --git a/essentials-framework/Essentials DM/Essentials_DM/AirMedia/AirMediaController.cs b/essentials-framework/Essentials DM/Essentials_DM/AirMedia/AirMediaController.cs index b1fa3186..5a1d50ff 100644 --- a/essentials-framework/Essentials DM/Essentials_DM/AirMedia/AirMediaController.cs +++ b/essentials-framework/Essentials DM/Essentials_DM/AirMedia/AirMediaController.cs @@ -43,11 +43,12 @@ namespace PepperDash.Essentials.DM.AirMedia public BoolFeedback HdmiVideoSyncDetectedFeedback { get; private set; } public StringFeedback SerialNumberFeedback { get; private set; } public BoolFeedback AutomaticInputRoutingEnabledFeedback { get; private set; } + public BoolFeedback HdmiInHdcpSupportOnFeedback { get; private set; } + public BoolFeedback HdmiInDisabledByHdcpFeedback { get; private set; } public AirMediaController(string key, string name, Am3x00 device, DeviceConfig dc, AirMediaPropertiesConfig props) : base(key, name, device) { - AirMedia = device; DeviceConfig = dc; @@ -101,6 +102,8 @@ namespace PepperDash.Essentials.DM.AirMedia LoginCodeFeedback = new IntFeedback(() => AirMedia.AirMedia.LoginCodeFeedback.UShortValue); ConnectionAddressFeedback = new StringFeedback(() => AirMedia.AirMedia.ConnectionAddressFeedback.StringValue); HostnameFeedback = new StringFeedback(() => AirMedia.AirMedia.HostNameFeedback.StringValue); + HdmiInHdcpSupportOnFeedback = new BoolFeedback(() => AirMedia.HdmiIn.HdcpSupportOnFeedback.BoolValue); + HdmiInDisabledByHdcpFeedback = new BoolFeedback(() => AirMedia.HdmiIn.DisabledByHdcpFeedback.BoolValue); // TODO: Figure out if we can actually get the TSID/Serial SerialNumberFeedback = new StringFeedback(() => "unknown"); @@ -178,6 +181,13 @@ namespace PepperDash.Essentials.DM.AirMedia ConnectionAddressFeedback.LinkInputSig(trilist.StringInput[joinMap.ConnectionAddressFB.JoinNumber]); HostnameFeedback.LinkInputSig(trilist.StringInput[joinMap.HostnameFB.JoinNumber]); SerialNumberFeedback.LinkInputSig(trilist.StringInput[joinMap.SerialNumberFeedback.JoinNumber]); + + trilist.SetSigFalseAction(joinMap.HdmiInHdcpSupportOn.JoinNumber, () => SetHcdpSupport(true)); + HdmiInHdcpSupportOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.HdmiInHdcpSupportOn.JoinNumber]); + trilist.SetSigFalseAction(joinMap.HdmiInHdcpSupportOff.JoinNumber, () => SetHcdpSupport(false)); + HdmiInHdcpSupportOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.HdmiInHdcpSupportOff.JoinNumber]); + + HdmiInDisabledByHdcpFeedback.LinkInputSig(trilist.BooleanInput[joinMap.HdmiInDisabledByHdcp.JoinNumber]); } /// @@ -248,6 +258,14 @@ namespace PepperDash.Essentials.DM.AirMedia { if (args.EventId == DMInputEventIds.SourceSyncEventId) HdmiVideoSyncDetectedFeedback.FireUpdate(); + else if (args.EventId == DMInputEventIds.HdcpSupportOnEventId) + { + HdmiInHdcpSupportOnFeedback.FireUpdate(); + } + else if (args.EventId == DMInputEventIds.DisabledByHdcpEventId) + { + HdmiInDisabledByHdcpFeedback.FireUpdate(); + } } /// @@ -296,6 +314,14 @@ namespace PepperDash.Essentials.DM.AirMedia AirMedia.DisplayControl.VideoOut = AmX00DisplayControl.eAirMediaX00VideoSource.AirBoard; } + public void SetHcdpSupport(bool on) + { + if (on) + AirMedia.HdmiIn.HdcpSupportOn(); + else + AirMedia.HdmiIn.HdcpSupportOff(); + } + /// /// Reboots the device /// diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/HdPsXxxController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/HdPsXxxController.cs index 6b0f8520..c267acea 100644 --- a/essentials-framework/Essentials DM/Essentials_DM/Chassis/HdPsXxxController.cs +++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/HdPsXxxController.cs @@ -88,7 +88,7 @@ namespace PepperDash_Essentials_DM.Chassis var audioDevice = new HdPsXxxOutputAudioController(Key, item.Number, _chassis); Debug.Console(2, this, "Adding HdPsXxxOutputAudioController '{0}' for output '{1}'", audioDevice.Key, item.Number); DeviceManager.AddDevice(audioDevice); - } + } foreach (var item in _chassis.AnalogAuxiliaryMixer) { var audioDevice = new HdPsXxxAnalogAuxMixerController(Key, item.MixerNumber, _chassis); @@ -111,7 +111,7 @@ namespace PepperDash_Essentials_DM.Chassis Debug.Console(1, this, "Failed to setup inputs, properties are null"); return; } - + // iterate through HDMI inputs foreach (var item in _chassis.HdmiInputs) { @@ -124,7 +124,7 @@ namespace PepperDash_Essentials_DM.Chassis input.Name.StringValue = name; - InputNameFeedbacks.Add(new StringFeedback(index.ToString(CultureInfo.InvariantCulture), + InputNameFeedbacks.Add(new StringFeedback(index.ToString(CultureInfo.InvariantCulture), () => InputNames[index])); var port = new RoutingInputPort(key, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.Hdmi, input, this) @@ -134,11 +134,11 @@ namespace PepperDash_Essentials_DM.Chassis Debug.Console(1, this, "Adding Input port: {0} - {1}", port.Key, name); InputPorts.Add(port); - InputHdcpEnableFeedback.Add(new BoolFeedback(index.ToString(CultureInfo.InvariantCulture), + InputHdcpEnableFeedback.Add(new BoolFeedback(index.ToString(CultureInfo.InvariantCulture), () => input.InputPort.HdcpSupportOnFeedback.BoolValue)); - VideoInputSyncFeedbacks.Add(new BoolFeedback(index.ToString(CultureInfo.InvariantCulture), - () => input.VideoDetectedFeedback.BoolValue)); + VideoInputSyncFeedbacks.Add(new BoolFeedback(index.ToString(CultureInfo.InvariantCulture), + () => input.InputPort.SyncDetectedFeedback.BoolValue)); } // iterate through DM Lite inputs @@ -147,13 +147,13 @@ namespace PepperDash_Essentials_DM.Chassis var input = item; var index = item.Number; var key = string.Format("dmLiteIn{0}", index); - var name = string.IsNullOrEmpty(InputNames[index]) - ? string.Format("DM Input {0}", index) + var name = string.IsNullOrEmpty(InputNames[index]) + ? string.Format("DM Input {0}", index) : InputNames[index]; input.Name.StringValue = name; - InputNameFeedbacks.Add(new StringFeedback(index.ToString(CultureInfo.InvariantCulture), + InputNameFeedbacks.Add(new StringFeedback(index.ToString(CultureInfo.InvariantCulture), () => InputNames[index])); var port = new RoutingInputPort(key, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.Hdmi, input, this) @@ -163,11 +163,11 @@ namespace PepperDash_Essentials_DM.Chassis Debug.Console(0, this, "Adding Input port: {0} - {1}", port.Key, name); InputPorts.Add(port); - InputHdcpEnableFeedback.Add(new BoolFeedback(index.ToString(CultureInfo.InvariantCulture), + InputHdcpEnableFeedback.Add(new BoolFeedback(index.ToString(CultureInfo.InvariantCulture), () => input.InputPort.HdcpSupportOnFeedback.BoolValue)); - VideoInputSyncFeedbacks.Add(new BoolFeedback(index.ToString(CultureInfo.InvariantCulture), - () => input.VideoDetectedFeedback.BoolValue)); + VideoInputSyncFeedbacks.Add(new BoolFeedback(index.ToString(CultureInfo.InvariantCulture), + () => input.InputPort.SyncDetectedFeedback.BoolValue)); } _chassis.DMInputChange += _chassis_InputChange; @@ -186,10 +186,10 @@ namespace PepperDash_Essentials_DM.Chassis { var output = item; var index = item.Number; - var name = string.IsNullOrEmpty(OutputNames[index]) - ? string.Format("Port {0}", index) + var name = string.IsNullOrEmpty(OutputNames[index]) + ? string.Format("Port {0}", index) : OutputNames[index]; - + output.Name.StringValue = name; var hdmiKey = string.Format("hdmiOut{0}", index); @@ -209,11 +209,11 @@ namespace PepperDash_Essentials_DM.Chassis }; Debug.Console(1, this, "Adding Port port: {0} - {1}", dmLitePort.Key, name); OutputPorts.Add(dmLitePort); - - OutputRouteNameFeedback.Add(new StringFeedback(index.ToString(CultureInfo.InvariantCulture), - () => output.VideoOutFeedback.NameFeedback.StringValue)); - VideoOutputRouteFeedbacks.Add(new IntFeedback(index.ToString(CultureInfo.InvariantCulture), + OutputRouteNameFeedback.Add(new StringFeedback(index.ToString(CultureInfo.InvariantCulture), + () => output.VideoOutFeedback.NameFeedback.StringValue)); + + VideoOutputRouteFeedbacks.Add(new IntFeedback(index.ToString(CultureInfo.InvariantCulture), () => output.VideoOutFeedback == null ? 0 : (int)output.VideoOutFeedback.Number)); } /* @@ -352,8 +352,8 @@ Selector: {4} public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType) { var input = inputSelector as HdPsXxxInput; - var output = outputSelector as HdPsXxxOutput; - + var output = outputSelector as HdPsXxxOutput; + Debug.Console(2, this, "ExecuteSwitch: input={0}, output={1}", input, output); if (output == null) @@ -456,24 +456,37 @@ Selector: {4} // _chassis input change event private void _chassis_InputChange(Switch device, DMInputEventArgs args) { - var eventId = args.EventId; - - switch (eventId) + switch (args.EventId) { - case DMInputEventIds.VideoDetectedEventId: + case DMInputEventIds.RemoteTransmitterDetectedEventId: + { + // signal found on HD-PSXxx > Inputs > Inputs DM Lite X + Debug.Console(2, this, "{0} DM Input Event ID {1}-RemoteTransmitterDetected | Number {2}", + device.ToString(), args.EventId, args.Number); + break; + } + case DMInputEventIds.SourceSyncEventId: // id-14 + case DMInputEventIds.VideoDetectedEventId: // id-9 { - Debug.Console(1, this, "Event ID {0}: Updating VideoInputSyncFeedbacks", eventId); - foreach (var item in VideoInputSyncFeedbacks) - { - item.FireUpdate(); - } + // signal found on HD-PSXxx > Inputs > HDMI/DM Lite X + Debug.Console(1, this, "{0} DM Input Event ID {1} | Number {2}: Updating VideoInputSyncFeedbacks", + device.Name, args.EventId, args.Number); + + var input = args.Number; + + var feedback = VideoInputSyncFeedbacks[(int)input]; + if (feedback == null) return; + + feedback.FireUpdate(); + break; } case DMInputEventIds.InputNameFeedbackEventId: case DMInputEventIds.InputNameEventId: case DMInputEventIds.NameFeedbackEventId: { - Debug.Console(1, this, "Event ID {0}: Updating name feedbacks", eventId); + Debug.Console(1, this, "{0} DM Input Event ID {1}-Name | Number {2}: Updating name feedbacks", + device.Name, args.EventId, args.Number); var input = args.Number; var name = _chassis.HdmiInputs[input].NameFeedback.StringValue; @@ -483,7 +496,8 @@ Selector: {4} } default: { - Debug.Console(1, this, "Uhandled DM Input Event ID {0}", eventId); + Debug.Console(1, this, "{0} DM Input Event ID {1} | Number {2}: Uhandled", + device.Name, args.EventId, args.Number); break; } } @@ -491,33 +505,53 @@ Selector: {4} OnDmInputChange(args); } - // _chassis output change event private void _chassis_OutputChange(Switch device, DMOutputEventArgs args) { - if (args.EventId != DMOutputEventIds.VideoOutEventId) return; + switch (args.EventId) + { + case DMOutputEventIds.VideoOutEventId: + { + Debug.Console(2, this, "{0} DM Output Event Id {1} | Number {2} | Index {3}: VideoOutEventId", + device.Name, args.EventId, args.Number, args.Index); - var output = args.Number; + var output = args.Number; - var input = _chassis.HdmiDmLiteOutputs[output].VideoOutFeedback == null - ? 0 - : _chassis.HdmiDmLiteOutputs[output].VideoOutFeedback.Number; + var input = _chassis.HdmiDmLiteOutputs[output].VideoOutFeedback == null + ? 0 + : _chassis.HdmiDmLiteOutputs[output].VideoOutFeedback.Number; - var outputName = OutputNames[output]; + var outputName = OutputNames[output]; - var feedback = VideoOutputRouteFeedbacks[outputName]; - if (feedback == null) return; + var feedback = VideoOutputRouteFeedbacks[outputName]; + if (feedback == null) return; - var inputPort = InputPorts.FirstOrDefault( - p => p.FeedbackMatchObject == _chassis.HdmiDmLiteOutputs[output].VideoOutFeedback); + var inputPort = InputPorts.FirstOrDefault( + p => p.FeedbackMatchObject == _chassis.HdmiDmLiteOutputs[output].VideoOutFeedback); - var outputPort = OutputPorts.FirstOrDefault( - p => p.FeedbackMatchObject == _chassis.HdmiDmLiteOutputs[output]); + var outputPort = OutputPorts.FirstOrDefault( + p => p.FeedbackMatchObject == _chassis.HdmiDmLiteOutputs[output]); - feedback.FireUpdate(); + feedback.FireUpdate(); - OnSwitchChange(new RoutingNumericEventArgs( - output, input, outputPort, inputPort, eRoutingSignalType.AudioVideo)); + OnSwitchChange(new RoutingNumericEventArgs(output, input, outputPort, inputPort, eRoutingSignalType.AudioVideo)); + + break; + } + case DMOutputEventIds.RemoteReceiverDetectedEventId: + { + // signal found on HD-PSXxx > Output[s] > Output [X] > DM Lite [X] + Debug.Console(2, this, "{0} DM Output Event Id {1} | Number {2} | Index {3}: RemoteRecevierDetectedEventId", + device.Name, args.EventId, args.Number, args.Index); + break; + } + default: + { + Debug.Console(2, this, "{0} DM Output Event Id {1} | Number {2} | Index:{3}: Unhandled", + device.Name, args.EventId, args.Number, args.Index); + break; + } + } } @@ -543,9 +577,9 @@ Selector: {4} #region Factory - public class HdSp401ControllerFactory : EssentialsDeviceFactory + public class HdPsXxxControllerFactory : EssentialsDeviceFactory { - public HdSp401ControllerFactory() + public HdPsXxxControllerFactory() { TypeNames = new List { "hdps401", "hdps402", "hdps621", "hdps622" }; } diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/EndpointInterfaces.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/EndpointInterfaces.cs index 085d379b..e7df4547 100644 --- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/EndpointInterfaces.cs +++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/EndpointInterfaces.cs @@ -87,5 +87,11 @@ namespace PepperDash_Essentials_DM public interface IHasDisplayPortInHdcp : IHasDisplayPortInHdcpGet, IHasDisplayPortInHdcpSet { eHdcpCapabilityType DisplayPortInHdcpCapability { get; } + } + + public interface IhasWallMode + { + void SetWallMode(ushort walLMode); } + } \ No newline at end of file diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4kZScalerCController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4kZScalerCController.cs index fd48a904..afd9aff6 100644 --- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4kZScalerCController.cs +++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4kZScalerCController.cs @@ -10,12 +10,13 @@ using PepperDash.Essentials.Core; using PepperDash.Essentials.Core.Bridges; using PepperDash.Core; using PepperDash_Essentials_DM; +using System.Collections.Generic; namespace PepperDash.Essentials.DM { [Description("Wrapper Class for DM-RMC-4K-Z-SCALER-C")] public class DmRmc4kZScalerCController : DmRmcControllerBase, IRmcRoutingWithFeedback, - IIROutputPorts, IComPorts, ICec, IRelayPorts, IHasDmInHdcp, IHasHdmiInHdcp + IIROutputPorts, IComPorts, ICec, IRelayPorts, IHasDmInHdcp, IHasHdmiInHdcp, IhasWallMode { private readonly DmRmc4kzScalerC _rmc; @@ -26,9 +27,10 @@ namespace PepperDash.Essentials.DM public IntFeedback DmInHdcpStateFeedback { get; private set; } public IntFeedback HdmiInHdcpStateFeedback { get; private set; } + public BoolFeedback HdmiVideoSyncFeedback { get; private set; } - + private Dictionary WallModes; /// /// The value of the current video source for the HDMI output on the receiver @@ -87,6 +89,9 @@ namespace PepperDash.Essentials.DM VideoOutputResolutionFeedback = new StringFeedback(() => _rmc.HdmiOutput.GetVideoResolutionString()); + VideoWallModeRawFeedback = new IntFeedback("ScalerVideoWallModeRaw", + () => (int)_rmc.Scaler.WallModeRawFeedback.UShortValue); + InputPorts = new RoutingPortCollection { DmIn, HdmiIn }; OutputPorts = new RoutingPortCollection { HdmiOut }; @@ -94,6 +99,7 @@ namespace PepperDash.Essentials.DM _rmc.HdmiOutput.ConnectedDevice.DeviceInformationChange += ConnectedDevice_DeviceInformationChange; _rmc.HdmiIn.InputStreamChange += InputStreamChangeEvent; _rmc.DmInput.InputStreamChange += InputStreamChangeEvent; + _rmc.Scaler.OutputChange += Scaler_OutputChange; _rmc.OnlineStatusChange += _rmc_OnlineStatusChange; @@ -101,6 +107,15 @@ namespace PepperDash.Essentials.DM HdmiOut.Port = _rmc.HdmiOutput; AudioVideoSourceNumericFeedback = new IntFeedback(() => (ushort)(_rmc.SelectedSourceFeedback)); + + WallModes = new Dictionary() + { + {0, EndpointScalerOutput.eWall.Disabled}, + {2211, EndpointScalerOutput.eWall.Mode11}, + {2212, EndpointScalerOutput.eWall.Mode12}, + {2221, EndpointScalerOutput.eWall.Mode13}, + {2222, EndpointScalerOutput.eWall.Mode14} + }; } void InputStreamChangeEvent(EndpointInputStream inputStream, EndpointInputStreamEventArgs args) @@ -241,5 +256,47 @@ namespace PepperDash.Essentials.DM _rmc.HdmiIn.HdcpCapability = hdcpState; } + + #region IhasWallMode Members + + public void SetWallMode(ushort wallMode) + { + EndpointScalerOutput.eWall wallValue; + + if (WallModes.TryGetValue(wallMode, out wallValue)) + _rmc.Scaler.WallMode = wallValue; + } + + #endregion + + public void SetWallModeRaw(ushort wallMode) + { + _rmc.Scaler.WallModeRaw.UShortValue = wallMode; + } + + void Scaler_OutputChange(EndpointScalerOutput scalerOutput, ScalerOutputEventArgs args) + { + if (scalerOutput == null) + { + Debug.Console(1, this, "Scaler Output object is null"); + return; + } + if (args == null) + { + Debug.Console(1, this, "Scaler Output Args are null"); + return; + } + Debug.Console(2, this, "Scaler Event ID: {0}", args.EventId); + switch (args.EventId) + { + case ScalerOutputEventIds.WallModeFeedbackEventId: + VideoWallModeRawFeedback.FireUpdate(); + break; + default: + Debug.Console(2, this, "Scaler Default Unhandled Event ID: {0}", args.EventId); + break; + } + } + } } \ No newline at end of file diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcHelper.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcHelper.cs index ee423436..52d8a60e 100644 --- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcHelper.cs +++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcHelper.cs @@ -28,6 +28,9 @@ namespace PepperDash.Essentials.DM public StringFeedback EdidPreferredTimingFeedback { get; protected set; } public StringFeedback EdidSerialNumberFeedback { get; protected set; } + public IntFeedback VideoWallModeFeedback { get; protected set; } + public IntFeedback VideoWallModeRawFeedback { get; protected set; } + protected DmRmcControllerBase(string key, string name, EndpointReceiverBase device) : base(key, name, device) { @@ -59,8 +62,8 @@ namespace PepperDash.Essentials.DM else { Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device."); - } - + } + LinkDmRmcToApi(rmc, trilist, joinMap); } @@ -142,18 +145,18 @@ namespace PepperDash.Essentials.DM trilist.UShortInput[joinMap.HdcpSupportCapability.JoinNumber].UShortValue = (ushort)hdcpCapability; - trilist.UShortInput[joinMap.HdcpInputPortCount.JoinNumber].UShortValue = (ushort)routing.InputPorts.Count; - - var dmRmcScalerCBasicVideoMuteWithFeedback = rmc as IBasicVideoMuteWithFeedback; - - if (dmRmcScalerCBasicVideoMuteWithFeedback != null) - { - Debug.Console(1, this, "Device is IBasicVideoMuteWithFeedback, linking video mute"); - trilist.SetSigTrueAction(joinMap.VideoMuteToggle.JoinNumber, () => dmRmcScalerCBasicVideoMuteWithFeedback.VideoMuteToggle()); - trilist.SetSigTrueAction(joinMap.VideoMuteOn.JoinNumber, () => dmRmcScalerCBasicVideoMuteWithFeedback.VideoMuteOn()); - trilist.SetSigTrueAction(joinMap.VideoMuteOff.JoinNumber, () => dmRmcScalerCBasicVideoMuteWithFeedback.VideoMuteOff()); - dmRmcScalerCBasicVideoMuteWithFeedback.VideoMuteIsOn.LinkInputSig(trilist.BooleanInput[joinMap.VideoMuteOn.JoinNumber]); - dmRmcScalerCBasicVideoMuteWithFeedback.VideoMuteIsOn.LinkComplementInputSig(trilist.BooleanInput[joinMap.VideoMuteOff.JoinNumber]); + trilist.UShortInput[joinMap.HdcpInputPortCount.JoinNumber].UShortValue = (ushort)routing.InputPorts.Count; + + var dmRmcScalerCBasicVideoMuteWithFeedback = rmc as IBasicVideoMuteWithFeedback; + + if (dmRmcScalerCBasicVideoMuteWithFeedback != null) + { + Debug.Console(1, this, "Device is IBasicVideoMuteWithFeedback, linking video mute"); + trilist.SetSigTrueAction(joinMap.VideoMuteToggle.JoinNumber, () => dmRmcScalerCBasicVideoMuteWithFeedback.VideoMuteToggle()); + trilist.SetSigTrueAction(joinMap.VideoMuteOn.JoinNumber, () => dmRmcScalerCBasicVideoMuteWithFeedback.VideoMuteOn()); + trilist.SetSigTrueAction(joinMap.VideoMuteOff.JoinNumber, () => dmRmcScalerCBasicVideoMuteWithFeedback.VideoMuteOff()); + dmRmcScalerCBasicVideoMuteWithFeedback.VideoMuteIsOn.LinkInputSig(trilist.BooleanInput[joinMap.VideoMuteOn.JoinNumber]); + dmRmcScalerCBasicVideoMuteWithFeedback.VideoMuteIsOn.LinkComplementInputSig(trilist.BooleanInput[joinMap.VideoMuteOff.JoinNumber]); } var routingWithFeedback = routing as IRmcRouting; @@ -167,8 +170,23 @@ namespace PepperDash.Essentials.DM trilist.SetUShortSigAction(joinMap.AudioVideoSource.JoinNumber, a => routingWithFeedback.ExecuteNumericSwitch(a, 1, eRoutingSignalType.AudioVideo)); + var dmRmcScalerWithVideowall = rmc as DmRmc4kZScalerCController; + + if (dmRmcScalerWithVideowall != null) + { + trilist.SetUShortSigAction(joinMap.ScalerOutWallMode.JoinNumber, a => dmRmcScalerWithVideowall.SetWallMode(a)); + trilist.SetUShortSigAction(joinMap.ScalerOutWallModeRaw.JoinNumber, a => dmRmcScalerWithVideowall.SetWallModeRaw(a)); + + if (rmc.VideoWallModeFeedback != null) + rmc.VideoWallModeFeedback.LinkInputSig(trilist.UShortInput[joinMap.ScalerOutWallMode.JoinNumber]); + if (rmc.VideoWallModeRawFeedback != null) + rmc.VideoWallModeRawFeedback.LinkInputSig(trilist.UShortInput[joinMap.ScalerOutWallModeRaw.JoinNumber]); + + } + } + #region Implementation of IDeviceInfoProvider public DeviceInfo DeviceInfo { get; private set; } diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcScalerCController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcScalerCController.cs index d1f2daa1..169995d8 100644 --- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcScalerCController.cs +++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcScalerCController.cs @@ -51,6 +51,7 @@ namespace PepperDash.Essentials.DM InputPorts = new RoutingPortCollection {DmIn}; OutputPorts = new RoutingPortCollection {HdmiOut}; + // Set Ports for CEC HdmiOut.Port = _rmc.HdmiOutput; } diff --git a/essentials-framework/Essentials DM/Essentials_DM/PepperDash_Essentials_DM.csproj b/essentials-framework/Essentials DM/Essentials_DM/PepperDash_Essentials_DM.csproj index 41136d0d..60bdad85 100644 --- a/essentials-framework/Essentials DM/Essentials_DM/PepperDash_Essentials_DM.csproj +++ b/essentials-framework/Essentials DM/Essentials_DM/PepperDash_Essentials_DM.csproj @@ -59,7 +59,7 @@ ..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll - + False ..\..\..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs index 187cc855..1a842bc5 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs @@ -994,7 +994,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec //Special Change for protected directory clear - trilist.SetBoolSigAction(joinMap.DirectoryClearSelected.JoinNumber, (b) => SelectDirectoryEntry(_directoryCodec, 0, _directoryTrilist, _directoryJoinmap)); + trilist.SetBoolSigAction(joinMap.DirectoryClearSelected.JoinNumber, (b) => SelectDirectoryEntry(codec, 0, trilist, joinMap)); // Report feedback for number of contact methods for selected contact diff --git a/packages.config b/packages.config index 761b11cb..eff6d8ce 100644 --- a/packages.config +++ b/packages.config @@ -1,3 +1,3 @@ - +