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.Transmitters; using PepperDash.Core; using PepperDash.Essentials.Core; using PepperDash.Essentials.DM.Config; namespace PepperDash.Essentials.DM { public class DmTx201SBasicController : DmTxControllerBase, IRoutingInputsOutputs, IHasFeedback { public DmTx201S Tx { get; private set; } public RoutingInputPortWithVideoStatuses AnyVideoInput { get; private set; } public RoutingInputPortWithVideoStatuses HdmiInput { get; private set; } public RoutingInputPortWithVideoStatuses VgaInput { get; private set; } public RoutingOutputPort DmOutput { get; private set; } public StringFeedback ActiveVideoInputFeedback { get; private set; } /// /// Helps get the "real" inputs, including when in Auto /// public DmTx200Base.eSourceSelection ActualVideoInput { get { if (Tx.VideoSourceFeedback == DmTx200Base.eSourceSelection.Digital || Tx.VideoSourceFeedback == DmTx200Base.eSourceSelection.Analog || Tx.VideoSourceFeedback == DmTx200Base.eSourceSelection.Disable) return Tx.VideoSourceFeedback; else // auto { if (Tx.HdmiInput.SyncDetectedFeedback.BoolValue) return DmTx200Base.eSourceSelection.Digital; else if (Tx.VgaInput.SyncDetectedFeedback.BoolValue) return DmTx200Base.eSourceSelection.Analog; else return DmTx200Base.eSourceSelection.Disable; } } } public RoutingPortCollection InputPorts { get { return new RoutingPortCollection { HdmiInput, VgaInput, AnyVideoInput }; } } public RoutingPortCollection OutputPorts { get { return new RoutingPortCollection { DmOutput }; } } /// /// /// /// /// /// public DmTx201SBasicController(string key, string name, DmTx201S tx) : base(key, name, tx) { Tx = tx; //Can this be combined into helper somehow?? var combinedFuncs = new VideoStatusFuncsWrapper { HdcpActiveFeedbackFunc = () => ActualVideoInput == DmTx200Base.eSourceSelection.Digital && tx.HdmiInput.VideoAttributes.HdcpActiveFeedback.BoolValue, HdcpStateFeedbackFunc = () => ActualVideoInput == DmTx200Base.eSourceSelection.Digital ? tx.HdmiInput.VideoAttributes.HdcpStateFeedback.ToString() : "", VideoResolutionFeedbackFunc = () => ActualVideoInput == DmTx200Base.eSourceSelection.Digital ? Tx.HdmiInput.VideoAttributes.GetVideoResolutionString() : Tx.VgaInput.VideoAttributes.GetVideoResolutionString(), VideoSyncFeedbackFunc = () => ActualVideoInput == DmTx200Base.eSourceSelection.Digital ? HdmiInput.VideoStatus.VideoSyncFeedback.BoolValue : VgaInput.VideoStatus.VideoSyncFeedback.BoolValue }; HdmiInput = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.Hdmi, 1, this, VideoStatusHelper.GetHdmiInputStatusFuncs(tx.HdmiInput)); VgaInput = new RoutingInputPortWithVideoStatuses(DmPortName.VgaIn, eRoutingSignalType.Video, eRoutingPortConnectionType.Vga, 2, this, VideoStatusHelper.GetVgaInputStatusFuncs(tx.VgaInput)); AnyVideoInput = new RoutingInputPortWithVideoStatuses(DmPortName.AnyVideoIn, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.None, 0, this, combinedFuncs); DmOutput = new RoutingOutputPort(DmPortName.DmOut, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.DmCat, null, this); ActiveVideoInputFeedback = new StringFeedback(new Cue("ActiveVideoInput", 0, eCueType.String), () => ActualVideoInput.ToString()); } public override bool CustomActivate() { Tx.HdmiInput.InputStreamChange += (o, a) => FireInputStreamChange(HdmiInput, a.EventId); Tx.HdmiInput.VideoAttributes.AttributeChange += (o, a) => FireVideoAttributeChange(HdmiInput, a.EventId); Tx.VgaInput.InputStreamChange += (o, a) => FireInputStreamChange(VgaInput, a.EventId); Tx.VgaInput.VideoAttributes.AttributeChange += (o, a) => FireVideoAttributeChange(VgaInput, a.EventId); // Base does register and sets up comm monitoring. return base.CustomActivate(); } void Tx_BaseEvent(GenericBase device, BaseEventArgs args) { var id = args.EventId; if (id == DmTx201S.VideoSourceFeedbackEventID) { Debug.Console(2, this, " Video Source: {0}", Tx.VideoSourceFeedback); } // ------------------------------ incomplete ----------------------------------------- else if (id == DmTx201S.AudioSourceFeedbackEventID) { Debug.Console(2, this, " Audio Source: {0}", Tx.AudioSourceFeedback); } } /// /// Relays the input stream change to the appropriate RoutingInputPort. /// void FireInputStreamChange(RoutingInputPortWithVideoStatuses inputPort, int eventId) { if (eventId == EndpointInputStreamEventIds.SyncDetectedFeedbackEventId) { inputPort.VideoStatus.VideoSyncFeedback.FireUpdate(); AnyVideoInput.VideoStatus.VideoSyncFeedback.FireUpdate(); } } /// /// Relays the VideoAttributes change to a RoutingInputPort /// void FireVideoAttributeChange(RoutingInputPortWithVideoStatuses inputPort, int eventId) { //// LOCATION: Crestron.SimplSharpPro.DM.VideoAttributeEventIds //Debug.Console(2, this, "VideoAttributes_AttributeChange event id={0} from {1}", // args.EventId, (sender as VideoAttributesEnhanced).Owner.GetType()); switch (eventId) { case VideoAttributeEventIds.HdcpActiveFeedbackEventId: inputPort.VideoStatus.HdcpActiveFeedback.FireUpdate(); AnyVideoInput.VideoStatus.HdcpActiveFeedback.FireUpdate(); break; case VideoAttributeEventIds.HdcpStateFeedbackEventId: inputPort.VideoStatus.HdcpStateFeedback.FireUpdate(); AnyVideoInput.VideoStatus.HdcpStateFeedback.FireUpdate(); break; case VideoAttributeEventIds.HorizontalResolutionFeedbackEventId: case VideoAttributeEventIds.VerticalResolutionFeedbackEventId: inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate(); AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate(); break; } } public override List Feedbacks { get { List list = AnyVideoInput.VideoStatus.ToList(); list.AddRange(base.Feedbacks); list.Add(ActiveVideoInputFeedback); return list; } } } }