diff --git a/essentials-framework/Essentials DM/Essentials_DM/Config/DeviceFactory.cs b/essentials-framework/Essentials DM/Essentials_DM/Config/DeviceFactory.cs index f425843f..4bdaf432 100644 --- a/essentials-framework/Essentials DM/Essentials_DM/Config/DeviceFactory.cs +++ b/essentials-framework/Essentials DM/Essentials_DM/Config/DeviceFactory.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using Crestron.SimplSharp; using Crestron.SimplSharp.CrestronIO; using Crestron.SimplSharpPro; +using Crestron.SimplSharpPro.DM; using Crestron.SimplSharpPro.DM.AirMedia; using Crestron.SimplSharpPro.UI; @@ -68,7 +69,24 @@ namespace PepperDash.Essentials.DM return PepperDash.Essentials.DM.Chassis.HdMdNxM4kEController.GetController(key, name, type, props); } - + else if (typeName.Equals("hdmd400ce") || typeName.Equals("hdmd300ce") || typeName.Equals("hdmd200ce")) + { + var props = JsonConvert.DeserializeObject + (properties.ToString()); + + if (typeName.Equals("hdmd400ce")) + return new PepperDash.Essentials.DM.HdMdxxxCEController(key, name, + new HdMd400CE(props.Control.IpIdInt, props.Control.TcpSshProperties.Address, Global.ControlSystem)); + else if (typeName.Equals("hdmd300ce")) + return new PepperDash.Essentials.DM.HdMdxxxCEController(key, name, + new HdMd300CE(props.Control.IpIdInt, props.Control.TcpSshProperties.Address, Global.ControlSystem)); + else if (typeName.Equals("hdmd200ce")) + return new PepperDash.Essentials.DM.HdMdxxxCEController(key, name, + new HdMd200CE(props.Control.IpIdInt, props.Control.TcpSshProperties.Address, Global.ControlSystem)); + else if (typeName.Equals("hdmd200c1ge")) + return new PepperDash.Essentials.DM.HdMdxxxCEController(key, name, + new HdMd200C1GE(props.Control.IpIdInt, props.Control.TcpSshProperties.Address, Global.ControlSystem)); + } return null; } diff --git a/essentials-framework/Essentials DM/Essentials_DM/DmLite/DmMdxxxCEController.cs b/essentials-framework/Essentials DM/Essentials_DM/DmLite/DmMdxxxCEController.cs new file mode 100644 index 00000000..26a181ce --- /dev/null +++ b/essentials-framework/Essentials DM/Essentials_DM/DmLite/DmMdxxxCEController.cs @@ -0,0 +1,201 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Crestron.SimplSharp; +using Crestron.SimplSharpPro; +using Crestron.SimplSharpPro.DM; +using Crestron.SimplSharpPro.DM.Endpoints; +using Crestron.SimplSharpPro.DM.Endpoints.Receivers; + +using PepperDash.Core; +using PepperDash.Essentials.Core; + +namespace PepperDash.Essentials.DM +{ + /// + /// Represent both a transmitter and receiver pair of the HD-MD-400-C-E / HD-MD-300-C-E / HD-MD-200-C-E kits + /// + public class HdMdxxxCEController : CrestronGenericBaseDevice, IRouting //, IComPorts + { + /// + /// DmLite Ports + /// + public RoutingOutputPort ToRx { get; private set; } + public RoutingInputPort FromTx { get; private set; } + + public RoutingOutputPort HdmiOut { get; private set; } + + public HdMdxxxCE TxRxPair { get; private set; } + + public RoutingPortCollection InputPorts { get; private set; } + + public IntFeedback VideoSourceFeedback { get; private set; } + + public BoolFeedback AutoRouteOnFeedback { get; private set; } + + public BoolFeedback PriorityRoutingOnFeedback { get; private set; } + + public BoolFeedback InputOnScreenDisplayEnabledFeedback { get; private set; } + + public Dictionary SyncDetectedFeedbacks { get; private set; } + + public BoolFeedback RemoteEndDetectedFeedback { get; private set; } + + public RoutingPortCollection OutputPorts + { + get { return new RoutingPortCollection { HdmiOut }; } + } + + public HdMdxxxCEController(string key, string name, HdMdxxxCE txRxPair) + :base(key, name, txRxPair) + { + + TxRxPair = txRxPair; + + RemoteEndDetectedFeedback = new BoolFeedback(() => TxRxPair.RemoteEndDetectedOnFeedback.BoolValue); + + AutoRouteOnFeedback = new BoolFeedback(() => TxRxPair.ReceiverAutoModeOnFeedback.BoolValue); + + PriorityRoutingOnFeedback = new BoolFeedback(() => TxRxPair.PriorityRoutingOnFeedback.BoolValue); + + InputOnScreenDisplayEnabledFeedback = new BoolFeedback(() => TxRxPair.OnScreenDisplayEnabledFeedback.BoolValue); + + InputPorts = new RoutingPortCollection(); + + // Add the HDMI input port on the receiver + InputPorts.Add(new RoutingInputPort(DmPortName.Hdmi, eRoutingSignalType.Audio | eRoutingSignalType.Video, + eRoutingPortConnectionType.Hdmi, 1, this)); + + SyncDetectedFeedbacks.Add(1, new BoolFeedback( () => TxRxPair.HdmiInputs[1].VideoDetectedFeedback.BoolValue)); + + if(txRxPair is HdMd400CE) + { + InputPorts.Add(new RoutingInputPort(DmPortName.HdmiIn1, eRoutingSignalType.Audio | eRoutingSignalType.Video, + eRoutingPortConnectionType.Hdmi, 2, this)); + SyncDetectedFeedbacks.Add(2, new BoolFeedback(() => TxRxPair.HdmiInputs[2].VideoDetectedFeedback.BoolValue)); + + InputPorts.Add(new RoutingInputPort(DmPortName.HdmiIn2, eRoutingSignalType.Audio | eRoutingSignalType.Video, + eRoutingPortConnectionType.Hdmi, 3, this)); + SyncDetectedFeedbacks.Add(3, new BoolFeedback(() => TxRxPair.HdmiInputs[3].VideoDetectedFeedback.BoolValue)); + + InputPorts.Add(new RoutingInputPort(DmPortName.VgaIn, eRoutingSignalType.Video | eRoutingSignalType.Audio, + eRoutingPortConnectionType.Vga, 4, this)); + SyncDetectedFeedbacks.Add(4, new BoolFeedback(() => TxRxPair.VgaInputs[1].VideoDetectedFeedback.BoolValue)); + + // Set Ports for CEC + InputPorts[DmPortName.HdmiIn1].Port = TxRxPair.HdmiInputs[1]; + InputPorts[DmPortName.HdmiIn2].Port = TxRxPair.HdmiInputs[2]; + } + else if (txRxPair is HdMd300CE) + { + InputPorts.Add(new RoutingInputPort(DmPortName.HdmiIn, eRoutingSignalType.Audio | eRoutingSignalType.Video, + eRoutingPortConnectionType.Hdmi, 2, this)); + SyncDetectedFeedbacks.Add(2, new BoolFeedback(() => TxRxPair.HdmiInputs[2].VideoDetectedFeedback.BoolValue)); + + InputPorts.Add(new RoutingInputPort(DmPortName.VgaIn, eRoutingSignalType.Video | eRoutingSignalType.Audio, + eRoutingPortConnectionType.Vga, 3, this)); + SyncDetectedFeedbacks.Add(3, new BoolFeedback(() => TxRxPair.VgaInputs[1].VideoDetectedFeedback.BoolValue)); + + // Set Ports for CEC + InputPorts[DmPortName.HdmiIn].Port = TxRxPair.HdmiInputs[1]; + } + else if (txRxPair is HdMd200CE || txRxPair is HdMd200C1GE) + { + InputPorts.Add(new RoutingInputPort(DmPortName.HdmiIn, eRoutingSignalType.Audio | eRoutingSignalType.Video, + eRoutingPortConnectionType.Hdmi, 2, this)); + SyncDetectedFeedbacks.Add(2, new BoolFeedback(() => TxRxPair.HdmiInputs[2].VideoDetectedFeedback.BoolValue)); + + // Set Ports for CEC + InputPorts[DmPortName.HdmiIn].Port = TxRxPair.HdmiInputs[1]; + } + + + ToRx = new RoutingOutputPort(DmPortName.ToTx, eRoutingSignalType.Audio | eRoutingSignalType.Video, + eRoutingPortConnectionType.DmCat, null, this); + + FromTx = new RoutingInputPort(DmPortName.FromTx, eRoutingSignalType.Audio | eRoutingSignalType.Video, + eRoutingPortConnectionType.DmCat, null, this); + + HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.Audio | eRoutingSignalType.Video, + eRoutingPortConnectionType.Hdmi, null, this); + + TxRxPair.DMInputChange += new DMInputEventHandler(TxRxPair_DMInputChange); + TxRxPair.DMOutputChange += new DMOutputEventHandler(TxRxPair_DMOutputChange); + TxRxPair.DMSystemChange += new DMSystemEventHandler(TxRxPair_DMSystemChange); + + VideoSourceFeedback = new IntFeedback(() => (int)TxRxPair.HdmiOutputs[1].VideoOutFeedback.Number); + } + + void TxRxPair_DMSystemChange(Switch device, DMSystemEventArgs args) + { + if (args.EventId == DMSystemEventIds.RemoteEndDetectedEventId) + RemoteEndDetectedFeedback.FireUpdate(); + else if (args.EventId == DMSystemEventIds.ReceiverAutoModeOnEventId) + AutoRouteOnFeedback.FireUpdate(); + else if (args.EventId == DMSystemEventIds.PriorityRoutingOnEventId) + PriorityRoutingOnFeedback.FireUpdate(); + else if (args.EventId == DMSystemEventIds.OnScreenDisplayEnabledEventId) + InputOnScreenDisplayEnabledFeedback.FireUpdate(); + } + + void TxRxPair_DMOutputChange(Switch device, DMOutputEventArgs args) + { + if (args.EventId == DMOutputEventIds.VideoOutEventId) + VideoSourceFeedback.FireUpdate(); + } + + void TxRxPair_DMInputChange(Switch device, DMInputEventArgs args) + { + if (args.EventId == DMInputEventIds.VideoDetectedEventId) + SyncDetectedFeedbacks[args.Number].FireUpdate(); + } + + public void AutoRouteOn() + { + TxRxPair.TransmitterAutoModeOn(); + } + + public void AutoRouteOff() + { + TxRxPair.TransmitterAutoModeOff(); + } + + public void PriorityRouteOn() + { + TxRxPair.PriorityRoutingOn(); + } + + public void PriorityRouteOff() + { + TxRxPair.PriorityRoutingOff(); + } + + public void OnScreenDisplayEnable() + { + TxRxPair.OnScreenDisplayEnabled(); + } + + public void OnScreenDisplayDisable() + { + TxRxPair.OnScreenDisplayDisabled(); + } + + public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType) + { + TxRxPair.HdmiOutputs[1].VideoOut = TxRxPair.Inputs[(uint)inputSelector]; + } + + // This device has a different class for com ports which will make it hard to implement IComPorts.... + + //#region IComPorts Members + //public CrestronCollection ComPorts { get { return TxRxPair.ComPorts as CrestronCollection; } } + //public int NumberOfComPorts { get { return 1; } } + //#endregion + } + + public class HdMdxxxCEPropertiesConfig + { + public ControlPropertiesConfig Control { get; set; } + } +} \ No newline at end of file diff --git a/essentials-framework/Essentials DM/Essentials_DM/DmPortName.cs b/essentials-framework/Essentials DM/Essentials_DM/DmPortName.cs index 2c65b3f8..4ce4d34d 100644 --- a/essentials-framework/Essentials DM/Essentials_DM/DmPortName.cs +++ b/essentials-framework/Essentials DM/Essentials_DM/DmPortName.cs @@ -26,6 +26,8 @@ namespace PepperDash.Essentials.DM public const string DmOut = "DmOut"; public const string DmOut1 = "DmOut1"; public const string DmOut2 = "DmOut2"; + public const string FromTx = "FromTx"; + public const string Hdmi = "Hdmi"; public const string HdmiIn = "HdmiIn"; public const string HdmiIn1 = "HdmiIn1"; public const string HdmiIn2 = "HdmiIn2"; @@ -35,6 +37,7 @@ namespace PepperDash.Essentials.DM public const string HdmiOut = "HdmiOut"; public const string Osd = "Osd"; public const string SpdifIn = "SpdifIn"; + public const string ToTx = "ToTx"; public const string VgaIn = "VgaIn"; } } \ No newline at end of file diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmHdRxX01Controller.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmHdRxX01Controller.cs deleted file mode 100644 index 13512d19..00000000 --- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmHdRxX01Controller.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Crestron.SimplSharp; -using Crestron.SimplSharpPro; -using Crestron.SimplSharpPro.DM; -using Crestron.SimplSharpPro.DM.Endpoints; -using Crestron.SimplSharpPro.DM.Endpoints.Receivers; - -using PepperDash.Essentials.Core; - -namespace PepperDash.Essentials.DM -{ - public class HdRx4kX10Controller : DmHdBaseTControllerBase, IRoutingInputsOutputs, - IComPorts - { - public RoutingInputPort DmIn { get; private set; } - public RoutingOutputPort HDBaseTSink { get; private set; } - - public RoutingPortCollection InputPorts - { - get { return new RoutingPortCollection { DmIn }; } - } - - public RoutingPortCollection OutputPorts - { - get { return new RoutingPortCollection { HDBaseTSink }; } - } - - public HdRx4kX10Controller(string key, string name, HdRx4kX10 rmc) - : base(key, name, rmc) - { - Rmc = rmc; - DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.Audio | eRoutingSignalType.Video, - eRoutingPortConnectionType.DmCat, 0, this); - HDBaseTSink = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.Audio | eRoutingSignalType.Video, - eRoutingPortConnectionType.Hdmi, null, this); - - // Set Ports for CEC - HDBaseTSink.Port = Rmc; // Unique case, this class has no HdmiOutput port and ICec is implemented on the receiver class itself - } - - #region IComPorts Members - public CrestronCollection ComPorts { get { return Rmc.ComPorts; } } - public int NumberOfComPorts { get { return Rmc.NumberOfComPorts; } } - #endregion - } -} \ No newline at end of file diff --git a/essentials-framework/Essentials DM/Essentials_DM/Essentials_DM.csproj b/essentials-framework/Essentials DM/Essentials_DM/Essentials_DM.csproj index 3c62d45d..263a6c63 100644 --- a/essentials-framework/Essentials DM/Essentials_DM/Essentials_DM.csproj +++ b/essentials-framework/Essentials DM/Essentials_DM/Essentials_DM.csproj @@ -113,7 +113,7 @@ - +