diff --git a/PepperDashEssentials/Room/Types/EssentialsDualDisplayRoom.cs b/PepperDashEssentials/Room/Types/EssentialsDualDisplayRoom.cs
index 27539ebd..8113174a 100644
--- a/PepperDashEssentials/Room/Types/EssentialsDualDisplayRoom.cs
+++ b/PepperDashEssentials/Room/Types/EssentialsDualDisplayRoom.cs
@@ -555,7 +555,7 @@ namespace PepperDash.Essentials
///
bool DoRoute(SourceRouteListItem route, SourceListItem sourceItem, string sourceItemKey)
{
- IRoutingSinkNoSwitching dest = null;
+ IRoutingSink dest = null;
if (route.DestinationKey.Equals("$defaultaudio", StringComparison.OrdinalIgnoreCase))
dest = DefaultAudioDevice as IRoutingSinkNoSwitching;
diff --git a/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs b/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs
index b14e563d..cce91635 100644
--- a/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs
+++ b/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs
@@ -71,7 +71,7 @@ namespace PepperDash.Essentials
public EssentialsHuddleRoomPropertiesConfig PropertiesConfig { get; private set; }
public IRoutingSinkWithSwitching DefaultDisplay { get; private set; }
- public IRoutingSinkNoSwitching DefaultAudioDevice { get; private set; }
+ public IRoutingSink DefaultAudioDevice { get; private set; }
public IBasicVolumeControls DefaultVolumeControls { get; private set; }
public bool ExcludeFromGlobalFunctions { get; set; }
@@ -471,14 +471,14 @@ namespace PepperDash.Essentials
///
bool DoRoute(SourceRouteListItem route)
{
- IRoutingSinkNoSwitching dest = null;
+ IRoutingSink dest = null;
if (route.DestinationKey.Equals("$defaultaudio", StringComparison.OrdinalIgnoreCase))
dest = DefaultAudioDevice;
else if (route.DestinationKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase))
dest = DefaultDisplay;
else
- dest = DeviceManager.GetDeviceForKey(route.DestinationKey) as IRoutingSinkNoSwitching;
+ dest = DeviceManager.GetDeviceForKey(route.DestinationKey) as IRoutingSink;
if (dest == null)
{
diff --git a/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs b/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs
index c5021526..3909316b 100644
--- a/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs
+++ b/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs
@@ -590,7 +590,7 @@ namespace PepperDash.Essentials
///
bool DoRoute(SourceRouteListItem route)
{
- IRoutingSinkNoSwitching dest = null;
+ IRoutingSink dest = null;
if (route.DestinationKey.Equals("$defaultaudio", StringComparison.OrdinalIgnoreCase))
dest = DefaultAudioDevice as IRoutingSinkNoSwitching;
diff --git a/PepperDashEssentials/UI/EssentialsTouchpanelController.cs b/PepperDashEssentials/UI/EssentialsTouchpanelController.cs
index d008eee0..eade64bd 100644
--- a/PepperDashEssentials/UI/EssentialsTouchpanelController.cs
+++ b/PepperDashEssentials/UI/EssentialsTouchpanelController.cs
@@ -211,7 +211,7 @@ namespace PepperDash.Essentials
var comm = CommFactory.GetControlPropertiesConfig(dc);
var props = Newtonsoft.Json.JsonConvert.DeserializeObject(dc.Properties.ToString());
- Debug.Console(1, "Factory Attempting to create new Generic Comm Device");
+ Debug.Console(1, "Factory Attempting to create new EssentialsTouchpanelController");
var panelController = new EssentialsTouchpanelController(dc.Key, dc.Name, dc.Type, props, comm.IpIdInt);
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/HdMdNxM4kEControllerJoinMap.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/HdMdNxM4kEControllerJoinMap.cs
new file mode 100644
index 00000000..a8a6497b
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/HdMdNxM4kEControllerJoinMap.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Core.Bridges
+{
+ public class HdMdNxM4kEControllerJoinMap : JoinMapBaseAdvanced
+ {
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData() { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Device Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("EnableAutoRoute")]
+ public JoinDataComplete EnableAutoRoute = new JoinDataComplete(new JoinData() { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Enable Automatic Routing on 4x1 Switchers", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DisableAutoRoute")]
+ public JoinDataComplete DisableAutoRoute = new JoinDataComplete(new JoinData() { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Disable Automatic Routing on 4x1 Switchers", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("InputName")]
+ public JoinDataComplete InputName = new JoinDataComplete(new JoinData() { JoinNumber = 2, JoinSpan = 8 },
+ new JoinMetadata() { Label = "Device Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("InputSync")]
+ public JoinDataComplete InputSync = new JoinDataComplete(new JoinData() { JoinNumber = 2, JoinSpan = 8 },
+ new JoinMetadata() { Label = "Device Input Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutputName")]
+ public JoinDataComplete OutputName = new JoinDataComplete(new JoinData() { JoinNumber = 11, JoinSpan = 2 },
+ new JoinMetadata() { Label = "Device Output Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("OutputRoute")]
+ public JoinDataComplete OutputRoute = new JoinDataComplete(new JoinData() { JoinNumber = 11, JoinSpan = 2 },
+ new JoinMetadata() { Label = "Device Output Route Set/Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("OutputRoutedName")]
+ public JoinDataComplete OutputRoutedName = new JoinDataComplete(new JoinData() { JoinNumber = 16, JoinSpan = 2 },
+ new JoinMetadata() { Label = "Device Output Route Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("EnableInputHdcp")]
+ public JoinDataComplete EnableInputHdcp = new JoinDataComplete(new JoinData() { JoinNumber = 11, JoinSpan = 8 },
+ new JoinMetadata() { Label = "Device Enable Input Hdcp", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DisableInputHdcp")]
+ public JoinDataComplete DisableInputHdcp = new JoinDataComplete(new JoinData() { JoinNumber = 21, JoinSpan = 8 },
+ new JoinMetadata() { Label = "Device Disnable Input Hdcp", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData() { JoinNumber = 30, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Device Onlne", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ public HdMdNxM4kEControllerJoinMap(uint joinStart)
+ : base(joinStart, typeof(HdMdNxM4kEControllerJoinMap))
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/Hrxxx0WirelessRemoteControllerJoinMap.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/Hrxxx0WirelessRemoteControllerJoinMap.cs
new file mode 100644
index 00000000..f9037aa0
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/Hrxxx0WirelessRemoteControllerJoinMap.cs
@@ -0,0 +1,238 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Essentials.Core.Bridges
+{
+ public class Hrxxx0WirelessRemoteControllerJoinMap : JoinMapBaseAdvanced
+ {
+ [JoinName("Power")]
+ public JoinDataComplete Power = new JoinDataComplete(new JoinData() { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Power", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Menu")]
+ public JoinDataComplete Menu = new JoinDataComplete(new JoinData() { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Menu", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Guide")]
+ public JoinDataComplete Guide = new JoinDataComplete(new JoinData() { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Guide", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Info")]
+ public JoinDataComplete Info = new JoinDataComplete(new JoinData() { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Info", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VolumeUp")]
+ public JoinDataComplete VolumeUp = new JoinDataComplete(new JoinData() { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata() { Label = "VolumeUp", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VolumeDown")]
+ public JoinDataComplete VolumeDown = new JoinDataComplete(new JoinData() { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata() { Label = "VolumeDown", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DialPadUp")]
+ public JoinDataComplete DialPadUp = new JoinDataComplete(new JoinData() { JoinNumber = 7, JoinSpan = 1 },
+ new JoinMetadata() { Label = "DialPadUp", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DialPadDown")]
+ public JoinDataComplete DialPadDown = new JoinDataComplete(new JoinData() { JoinNumber = 8, JoinSpan = 1 },
+ new JoinMetadata() { Label = "DialPadDown", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DialPadLeft")]
+ public JoinDataComplete DialPadLeft = new JoinDataComplete(new JoinData() { JoinNumber = 9, JoinSpan = 1 },
+ new JoinMetadata() { Label = "DialPadLeft", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DialPadRight")]
+ public JoinDataComplete DialPadRight = new JoinDataComplete(new JoinData() { JoinNumber = 10, JoinSpan = 1 },
+ new JoinMetadata() { Label = "DialPadRight", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DialPadSelect")]
+ public JoinDataComplete DialPadSelect = new JoinDataComplete(new JoinData() { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata() { Label = "DialPadSelect", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("ChannelUp")]
+ public JoinDataComplete ChannelUp = new JoinDataComplete(new JoinData() { JoinNumber = 12, JoinSpan = 1 },
+ new JoinMetadata() { Label = "ChannelUp", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("ChannelDown")]
+ public JoinDataComplete ChannelDown = new JoinDataComplete(new JoinData() { JoinNumber = 13, JoinSpan = 1 },
+ new JoinMetadata() { Label = "ChannelDown", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Mute")]
+ public JoinDataComplete Mute = new JoinDataComplete(new JoinData() { JoinNumber = 14, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Mute", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Exit")]
+ public JoinDataComplete Exit = new JoinDataComplete(new JoinData() { JoinNumber = 15, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Exit", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Last")]
+ public JoinDataComplete Last = new JoinDataComplete(new JoinData() { JoinNumber = 16, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Last", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Play")]
+ public JoinDataComplete Play = new JoinDataComplete(new JoinData() { JoinNumber = 17, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Play", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Pause")]
+ public JoinDataComplete Pause = new JoinDataComplete(new JoinData() { JoinNumber = 18, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Pause", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Rewind")]
+ public JoinDataComplete Rewind = new JoinDataComplete(new JoinData() { JoinNumber = 19, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Rewind", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("FastForward")]
+ public JoinDataComplete FastForward = new JoinDataComplete(new JoinData() { JoinNumber = 20, JoinSpan = 1 },
+ new JoinMetadata() { Label = "FastForward", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("PreviousTrack")]
+ public JoinDataComplete PreviousTrack = new JoinDataComplete(new JoinData() { JoinNumber = 21, JoinSpan = 1 },
+ new JoinMetadata() { Label = "PreviousTrack", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("NextTrack")]
+ public JoinDataComplete NextTrack = new JoinDataComplete(new JoinData() { JoinNumber = 22, JoinSpan = 1 },
+ new JoinMetadata() { Label = "NextTrack", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Stop")]
+ public JoinDataComplete Stop = new JoinDataComplete(new JoinData() { JoinNumber = 23, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Stop", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Record")]
+ public JoinDataComplete Record = new JoinDataComplete(new JoinData() { JoinNumber = 24, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Record", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Dvr")]
+ public JoinDataComplete Dvr = new JoinDataComplete(new JoinData() { JoinNumber = 25, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Dvr", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Keypad1")]
+ public JoinDataComplete Keypad1 = new JoinDataComplete(new JoinData() { JoinNumber = 26, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Keypad1", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Keypad2Abc")]
+ public JoinDataComplete Keypad2 = new JoinDataComplete(new JoinData() { JoinNumber = 27, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Keypad2Abc", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Keypad3Def")]
+ public JoinDataComplete Keypad3Def = new JoinDataComplete(new JoinData() { JoinNumber = 28, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Keypad3Def", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Keypad4Ghi")]
+ public JoinDataComplete Keypad4Ghi = new JoinDataComplete(new JoinData() { JoinNumber = 29, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Keypad4Ghi", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Keypad5Jkl")]
+ public JoinDataComplete Keypad5Jkl = new JoinDataComplete(new JoinData() { JoinNumber = 30, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Keypad5Jkl", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Keypad6Mno")]
+ public JoinDataComplete Keypad6Mno = new JoinDataComplete(new JoinData() { JoinNumber = 31, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Keypad6Mno", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Keypad7Pqrs")]
+ public JoinDataComplete Keypad7Pqrs = new JoinDataComplete(new JoinData() { JoinNumber = 32, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Keypad7Pqrs", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Keypad8Tuv")]
+ public JoinDataComplete Keypad8Tuv = new JoinDataComplete(new JoinData() { JoinNumber = 33, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Keypad8Tuv", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Keypad9Wxyz")]
+ public JoinDataComplete Keypad9Wxyz = new JoinDataComplete(new JoinData() { JoinNumber = 34, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Keypad9Wxyz", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Keypad0")]
+ public JoinDataComplete Keypad0 = new JoinDataComplete(new JoinData() { JoinNumber = 35, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Keypad0", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Clear")]
+ public JoinDataComplete Clear = new JoinDataComplete(new JoinData() { JoinNumber = 36, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Clear", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Enter")]
+ public JoinDataComplete Enter = new JoinDataComplete(new JoinData() { JoinNumber = 37, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Enter", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Red")]
+ public JoinDataComplete Red = new JoinDataComplete(new JoinData() { JoinNumber = 38, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Red", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Green")]
+ public JoinDataComplete Green = new JoinDataComplete(new JoinData() { JoinNumber = 39, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Green", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Yellow")]
+ public JoinDataComplete Yellow = new JoinDataComplete(new JoinData() { JoinNumber = 40, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Yellow", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Blue")]
+ public JoinDataComplete Blue = new JoinDataComplete(new JoinData() { JoinNumber = 41, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Blue", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Custom1")]
+ public JoinDataComplete Custom1 = new JoinDataComplete(new JoinData() { JoinNumber = 42, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Custom1", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Custom2")]
+ public JoinDataComplete Custom2 = new JoinDataComplete(new JoinData() { JoinNumber = 43, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Custom2", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Custom3")]
+ public JoinDataComplete Custom3 = new JoinDataComplete(new JoinData() { JoinNumber = 44, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Custom3", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Custom4")]
+ public JoinDataComplete Custom4 = new JoinDataComplete(new JoinData() { JoinNumber = 45, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Custom4", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Custom5")]
+ public JoinDataComplete Custom5 = new JoinDataComplete(new JoinData() { JoinNumber = 46, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Custom5", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Custom6")]
+ public JoinDataComplete Custom6 = new JoinDataComplete(new JoinData() { JoinNumber = 47, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Custom6", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Custom7")]
+ public JoinDataComplete Custom7 = new JoinDataComplete(new JoinData() { JoinNumber = 48, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Custom7", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Custom8")]
+ public JoinDataComplete Custom8 = new JoinDataComplete(new JoinData() { JoinNumber = 49, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Custom8", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Custom9")]
+ public JoinDataComplete Custom9 = new JoinDataComplete(new JoinData() { JoinNumber = 50, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Custom9", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Fav")]
+ public JoinDataComplete Fav = new JoinDataComplete(new JoinData() { JoinNumber = 51, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Fav", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Home")]
+ public JoinDataComplete Home = new JoinDataComplete(new JoinData() { JoinNumber = 52, JoinSpan = 1 },
+ new JoinMetadata() { Label = "Home", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("BatteryLow")]
+ public JoinDataComplete BatteryLow = new JoinDataComplete(new JoinData() { JoinNumber = 53, JoinSpan = 1 },
+ new JoinMetadata() { Label = "BatteryLow", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("BatteryCritical")]
+ public JoinDataComplete BatteryCritical = new JoinDataComplete(new JoinData() { JoinNumber = 54, JoinSpan = 1 },
+ new JoinMetadata() { Label = "BatteryCritical", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("BatteryVoltage")]
+ public JoinDataComplete BatteryVoltage = new JoinDataComplete(new JoinData() { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata() { Label = "BatteryVoltage", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ public Hrxxx0WirelessRemoteControllerJoinMap(uint joinStart)
+ : base(joinStart, typeof(Hrxxx0WirelessRemoteControllerJoinMap))
+ {
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/CecPortController.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/CecPortController.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/CecPortController.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/CecPortController.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/ComPortController.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/ComPortController.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/ComPortController.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/ComPortController.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/ComSpecJsonConverter.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/ComSpecJsonConverter.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/ComSpecJsonConverter.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/ComSpecJsonConverter.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/CommFactory.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/CommFactory.cs
similarity index 92%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/CommFactory.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/CommFactory.cs
index 94110fd7..eaf109ef 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/CommFactory.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/CommFactory.cs
@@ -184,6 +184,26 @@ namespace PepperDash.Essentials.Core
throw new FormatException(string.Format("ERROR:Unable to convert Cresnet ID: {0} to hex. Error:\n{1}", CresnetId));
}
}
+ }
+
+ public string InfinetId { get; set; }
+
+ ///
+ /// Attepmts to provide uiont conversion of string InifinetId
+ ///
+ public uint InfinetIdInt
+ {
+ get
+ {
+ try
+ {
+ return Convert.ToUInt32(InfinetId, 16);
+ }
+ catch (Exception)
+ {
+ throw new FormatException(string.Format("ERROR:Unable to conver Infinet ID: {0} to hex. Error:\n{1}", InfinetId));
+ }
+ }
}
}
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/CommunicationExtras.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/CommunicationExtras.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/CommunicationExtras.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/CommunicationExtras.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/ConsoleCommMockDevice.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/ConsoleCommMockDevice.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/ConsoleCommMockDevice.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/ConsoleCommMockDevice.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/GenericComm.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/GenericComm.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/GenericComm.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/GenericComm.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/GenericHttpClient.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/GenericHttpClient.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/GenericHttpClient.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/GenericHttpClient.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/IRPortHelper.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/IRPortHelper.cs
new file mode 100644
index 00000000..28a7eb9f
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Comm and IR/IRPortHelper.cs
@@ -0,0 +1,235 @@
+using System;
+using System.Collections.Generic;
+using Crestron.SimplSharp;
+using Crestron.SimplSharp.CrestronIO;
+using Crestron.SimplSharpPro;
+
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using PepperDash.Core;
+using PepperDash.Essentials.Core.Config;
+
+namespace PepperDash.Essentials.Core
+{
+ ///
+ ///
+ ///
+ public static class IRPortHelper
+ {
+ public static string IrDriverPathPrefix
+ {
+ get
+ {
+ return Global.FilePathPrefix + "IR" + Global.DirectorySeparator;
+ }
+ }
+
+ ///
+ /// Finds either the ControlSystem or a device controller that contains IR ports and
+ /// returns a port from the hardware device
+ ///
+ ///
+ /// IrPortConfig object. The port and or filename will be empty/null
+ /// if valid values don't exist on config
+ public static IrOutPortConfig GetIrPort(JToken propsToken)
+ {
+ var control = propsToken["control"];
+ if (control == null)
+ return null;
+ if (control["method"].Value() != "ir")
+ {
+ Debug.Console(0, "IRPortHelper called with non-IR properties");
+ return null;
+ }
+
+ var port = new IrOutPortConfig();
+
+ var portDevKey = control.Value("controlPortDevKey");
+ var portNum = control.Value("controlPortNumber");
+ if (portDevKey == null || portNum == 0)
+ {
+ Debug.Console(1, "WARNING: Properties is missing port device or port number");
+ return port;
+ }
+
+ IIROutputPorts irDev = null;
+ if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
+ || portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
+ irDev = Global.ControlSystem;
+ else
+ irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
+
+ if (irDev == null)
+ {
+ Debug.Console(1, "[Config] Error, device with IR ports '{0}' not found", portDevKey);
+ return port;
+ }
+
+ if (portNum <= irDev.NumberOfIROutputPorts) // success!
+ {
+ var file = IrDriverPathPrefix + control["irFile"].Value();
+ port.Port = irDev.IROutputPorts[portNum];
+ port.FileName = file;
+ return port; // new IrOutPortConfig { Port = irDev.IROutputPorts[portNum], FileName = file };
+ }
+ else
+ {
+ Debug.Console(1, "[Config] Error, device '{0}' IR port {1} out of range",
+ portDevKey, portNum);
+ return port;
+ }
+ }
+
+ public static IROutputPort GetIrOutputPort(DeviceConfig dc)
+ {
+ var irControllerKey = dc.Key + "-ir";
+ if (dc.Properties == null)
+ {
+ Debug.Console(0, "[{0}] WARNING: Device config does not include properties. IR will not function.", dc.Key);
+ return null;
+ }
+
+ var control = dc.Properties["control"];
+ if (control == null)
+ {
+ Debug.Console(0,
+ "WARNING: Device config does not include control properties. IR will not function for {0}", dc.Key);
+ return null;
+ }
+
+ var portDevKey = control.Value("controlPortDevKey");
+ var portNum = control.Value("controlPortNumber");
+ IIROutputPorts irDev = null;
+
+ if (portDevKey == null)
+ {
+ Debug.Console(0, "WARNING: control properties is missing ir device for {0}", dc.Key);
+ return null;
+ }
+
+ if (portNum == 0)
+ {
+ Debug.Console(0, "WARNING: control properties is missing ir port number for {0}", dc.Key);
+ return null;
+ }
+
+ if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
+ || portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
+ irDev = Global.ControlSystem;
+ else
+ irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
+
+ if (irDev == null)
+ {
+ Debug.Console(0, "WARNING: device with IR ports '{0}' not found", portDevKey);
+ return null;
+ }
+ if (portNum >= irDev.NumberOfIROutputPorts)
+ {
+ Debug.Console(0, "WARNING: device '{0}' IR port {1} out of range",
+ portDevKey, portNum);
+ return null;
+ }
+
+
+ var port = irDev.IROutputPorts[portNum];
+
+ port.LoadIRDriver(Global.FilePathPrefix + "IR" + Global.DirectorySeparator + control["irFile"].Value());
+
+ return port;
+
+ }
+
+ public static IrOutputPortController GetIrOutputPortController(DeviceConfig config)
+ {
+ Debug.Console(1, "Attempting to create new Ir Port Controller");
+
+ if (config == null)
+ {
+ return null;
+ }
+
+ var irDevice = new IrOutputPortController(config.Key, GetIrOutputPort, config);
+
+ return irDevice;
+ }
+
+ /*
+ ///
+ /// Returns a ready-to-go IrOutputPortController from a DeviceConfig object.
+ ///
+ public static IrOutputPortController GetIrOutputPortController(DeviceConfig devConf)
+ {
+ var irControllerKey = devConf.Key + "-ir";
+ if (devConf.Properties == null)
+ {
+ Debug.Console(0, "[{0}] WARNING: Device config does not include properties. IR will not function.", devConf.Key);
+ return new IrOutputPortController(irControllerKey, null, "");
+ }
+
+ var control = devConf.Properties["control"];
+ if (control == null)
+ {
+ var c = new IrOutputPortController(irControllerKey, null, "");
+ Debug.Console(0, c, "WARNING: Device config does not include control properties. IR will not function");
+ return c;
+ }
+
+ var portDevKey = control.Value("controlPortDevKey");
+ var portNum = control.Value("controlPortNumber");
+ IIROutputPorts irDev = null;
+
+ if (portDevKey == null)
+ {
+ var c = new IrOutputPortController(irControllerKey, null, "");
+ Debug.Console(0, c, "WARNING: control properties is missing ir device");
+ return c;
+ }
+
+ if (portNum == 0)
+ {
+ var c = new IrOutputPortController(irControllerKey, null, "");
+ Debug.Console(0, c, "WARNING: control properties is missing ir port number");
+ return c;
+ }
+
+ if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
+ || portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
+ irDev = Global.ControlSystem;
+ else
+ irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
+
+ if (irDev == null)
+ {
+ var c = new IrOutputPortController(irControllerKey, null, "");
+ Debug.Console(0, c, "WARNING: device with IR ports '{0}' not found", portDevKey);
+ return c;
+ }
+
+ if (portNum <= irDev.NumberOfIROutputPorts) // success!
+ return new IrOutputPortController(irControllerKey, irDev.IROutputPorts[portNum],
+ IrDriverPathPrefix + control["irFile"].Value());
+ else
+ {
+ var c = new IrOutputPortController(irControllerKey, null, "");
+ Debug.Console(0, c, "WARNING: device '{0}' IR port {1} out of range",
+ portDevKey, portNum);
+ return c;
+ }
+ }*/
+ }
+
+ ///
+ /// Wrapper to help in IR port creation
+ ///
+ public class IrOutPortConfig
+ {
+ public IROutputPort Port { get; set; }
+ public string FileName { get; set; }
+
+ public IrOutPortConfig()
+ {
+ FileName = "";
+ }
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/DELETE ComPortController.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/DELETE ComPortController.cs
deleted file mode 100644
index ece72b20..00000000
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/DELETE ComPortController.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-using Crestron.SimplSharpPro;
-
-using Newtonsoft.Json;
-
-namespace PepperDash.Essentials.Core
-{
- public class ComPortController : Device, IBasicCommunication
- {
- public event EventHandler BytesReceived;
- public event EventHandler TextReceived;
-
- ComPort Port;
- ComPort.ComPortSpec Spec;
-
- public ComPortController(string key, IComPorts ComDevice, uint comPortNum, ComPort.ComPortSpec spec)
- : base(key)
- {
- Port = ComDevice.ComPorts[comPortNum];
- Spec = spec;
-
- Debug.Console(2, "Creating com port '{0}'", key);
- Debug.Console(2, "Com port spec:\r{0}", JsonConvert.SerializeObject(spec));
- }
-
- ///
- /// Creates a ComPort if the parameters are correct. Returns and logs errors if not
- ///
- public static ComPortController GetComPortController(string key,
- IComPorts comDevice, uint comPortNum, ComPort.ComPortSpec spec)
- {
- Debug.Console(1, "Creating com port '{0}'", key);
- if (comDevice == null)
- throw new ArgumentNullException("comDevice");
- if (string.IsNullOrEmpty(key))
- throw new ArgumentNullException("key");
- if (comPortNum > comDevice.NumberOfComPorts)
- {
- Debug.Console(0, "[{0}] Com port {1} out of range on {2}",
- key, comPortNum, comDevice.GetType().Name);
- return null;
- }
- var port = new ComPortController(key, comDevice, comPortNum, spec);
- return port;
- }
-
- ///
- /// Registers port and sends ComSpec
- ///
- /// false if either register or comspec fails
- public override bool CustomActivate()
- {
- var result = Port.Register();
- if (result != eDeviceRegistrationUnRegistrationResponse.Success)
- {
- Debug.Console(0, this, "Cannot register Com port: {0}", result);
- return false;
- }
- var specResult = Port.SetComPortSpec(Spec);
- if (specResult != 0)
- {
- Debug.Console(0, this, "Cannot set comspec");
- return false;
- }
- Port.SerialDataReceived += new ComPortDataReceivedEvent(Port_SerialDataReceived);
- return true;
- }
-
- void Port_SerialDataReceived(ComPort ReceivingComPort, ComPortSerialDataEventArgs args)
- {
- if (BytesReceived != null)
- {
- var bytes = Encoding.GetEncoding(28591).GetBytes(args.SerialData);
- BytesReceived(this, new GenericCommMethodReceiveBytesArgs(bytes));
- }
- if(TextReceived != null)
- TextReceived(this, new GenericCommMethodReceiveTextArgs(args.SerialData));
- }
-
- public override bool Deactivate()
- {
- return Port.UnRegister() == eDeviceRegistrationUnRegistrationResponse.Success;
- }
-
- #region IBasicCommunication Members
-
- public void SendText(string text)
- {
- Port.Send(text);
- }
-
- public void SendBytes(byte[] bytes)
- {
-
- var text = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
- Port.Send(text);
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/IRPortHelper.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/IRPortHelper.cs
deleted file mode 100644
index 015b03ea..00000000
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/IRPortHelper.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-using System;
-using System.Collections.Generic;
-using Crestron.SimplSharp;
-using Crestron.SimplSharp.CrestronIO;
-using Crestron.SimplSharpPro;
-
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-using PepperDash.Core;
-using PepperDash.Essentials.Core.Config;
-
-namespace PepperDash.Essentials.Core
-{
- ///
- ///
- ///
- public static class IRPortHelper
- {
- public static string IrDriverPathPrefix
- {
- get
- {
- return Global.FilePathPrefix + "IR" + Global.DirectorySeparator;
- }
- }
-
- ///
- /// Finds either the ControlSystem or a device controller that contains IR ports and
- /// returns a port from the hardware device
- ///
- ///
- /// IrPortConfig object. The port and or filename will be empty/null
- /// if valid values don't exist on config
- public static IrOutPortConfig GetIrPort(JToken propsToken)
- {
- var control = propsToken["control"];
- if (control == null)
- return null;
- if (control["method"].Value() != "ir")
- {
- Debug.Console(0, "IRPortHelper called with non-IR properties");
- return null;
- }
-
- var port = new IrOutPortConfig();
-
- var portDevKey = control.Value("controlPortDevKey");
- var portNum = control.Value("controlPortNumber");
- if (portDevKey == null || portNum == 0)
- {
- Debug.Console(1, "WARNING: Properties is missing port device or port number");
- return port;
- }
-
- IIROutputPorts irDev = null;
- if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
- || portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
- irDev = Global.ControlSystem;
- else
- irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
-
- if (irDev == null)
- {
- Debug.Console(1, "[Config] Error, device with IR ports '{0}' not found", portDevKey);
- return port;
- }
-
- if (portNum <= irDev.NumberOfIROutputPorts) // success!
- {
- var file = IrDriverPathPrefix + control["irFile"].Value();
- port.Port = irDev.IROutputPorts[portNum];
- port.FileName = file;
- return port; // new IrOutPortConfig { Port = irDev.IROutputPorts[portNum], FileName = file };
- }
- else
- {
- Debug.Console(1, "[Config] Error, device '{0}' IR port {1} out of range",
- portDevKey, portNum);
- return port;
- }
- }
-
- ///
- /// Returns a ready-to-go IrOutputPortController from a DeviceConfig object.
- ///
- public static IrOutputPortController GetIrOutputPortController(DeviceConfig devConf)
- {
- var irControllerKey = devConf.Key + "-ir";
- if (devConf.Properties == null)
- {
- Debug.Console(0, "[{0}] WARNING: Device config does not include properties. IR will not function.", devConf.Key);
- return new IrOutputPortController(irControllerKey, null, "");
- }
-
- var control = devConf.Properties["control"];
- if (control == null)
- {
- var c = new IrOutputPortController(irControllerKey, null, "");
- Debug.Console(0, c, "WARNING: Device config does not include control properties. IR will not function");
- return c;
- }
-
- var portDevKey = control.Value("controlPortDevKey");
- var portNum = control.Value("controlPortNumber");
- IIROutputPorts irDev = null;
-
- if (portDevKey == null)
- {
- var c = new IrOutputPortController(irControllerKey, null, "");
- Debug.Console(0, c, "WARNING: control properties is missing ir device");
- return c;
- }
-
- if (portNum == 0)
- {
- var c = new IrOutputPortController(irControllerKey, null, "");
- Debug.Console(0, c, "WARNING: control properties is missing ir port number");
- return c;
- }
-
- if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
- || portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
- irDev = Global.ControlSystem;
- else
- irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
-
- if (irDev == null)
- {
- var c = new IrOutputPortController(irControllerKey, null, "");
- Debug.Console(0, c, "WARNING: device with IR ports '{0}' not found", portDevKey);
- return c;
- }
-
- if (portNum <= irDev.NumberOfIROutputPorts) // success!
- return new IrOutputPortController(irControllerKey, irDev.IROutputPorts[portNum],
- IrDriverPathPrefix + control["irFile"].Value());
- else
- {
- var c = new IrOutputPortController(irControllerKey, null, "");
- Debug.Console(0, c, "WARNING: device '{0}' IR port {1} out of range",
- portDevKey, portNum);
- return c;
- }
- }
- }
-
- ///
- /// Wrapper to help in IR port creation
- ///
- public class IrOutPortConfig
- {
- public IROutputPort Port { get; set; }
- public string FileName { get; set; }
-
- public IrOutPortConfig()
- {
- FileName = "";
- }
- }
-}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron IO/Inputs/GenericDigitalInputDevice.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron IO/Inputs/GenericDigitalInputDevice.cs
index 774c7490..801127c9 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron IO/Inputs/GenericDigitalInputDevice.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron IO/Inputs/GenericDigitalInputDevice.cs
@@ -12,7 +12,8 @@ using PepperDash.Essentials.Core.Config;
namespace PepperDash.Essentials.Core.CrestronIO
-{
+{
+ [Description("Wrapper class for Digital Input")]
public class GenericDigitalInputDevice : EssentialsBridgeableDevice, IDigitalInput
{
public DigitalInput InputPort { get; private set; }
@@ -26,23 +27,78 @@ namespace PepperDash.Essentials.Core.CrestronIO
return () => InputPort.State;
}
}
-
- public GenericDigitalInputDevice(string key, DigitalInput inputPort):
- base(key)
- {
- InputStateFeedback = new BoolFeedback(InputStateFeedbackFunc);
-
- InputPort = inputPort;
-
- InputPort.StateChange += InputPort_StateChange;
-
- }
-
+
+
+ public GenericDigitalInputDevice(string key, string name, Func postActivationFunc,
+ IOPortConfig config)
+ : base(key, name)
+ {
+
+ AddPostActivationAction(() =>
+ {
+ InputPort = postActivationFunc(config);
+
+ InputPort.Register();
+
+ InputPort.StateChange += InputPort_StateChange;
+
+ });
+ }
+
+ #region Events
+
void InputPort_StateChange(DigitalInput digitalInput, DigitalInputEventArgs args)
{
- InputStateFeedback.FireUpdate();
- }
-
+ InputStateFeedback.FireUpdate();
+ }
+
+ #endregion
+
+ #region PreActivate
+
+ private static DigitalInput GetDigitalInput(IOPortConfig dc)
+ {
+ IDigitalInputPorts ioPortDevice;
+
+ if (dc.PortDeviceKey.Equals("processor"))
+ {
+ if (!Global.ControlSystem.SupportsDigitalInput)
+ {
+ Debug.Console(0, "GetDigitalInput: Processor does not support Digital Inputs");
+ return null;
+ }
+ ioPortDevice = Global.ControlSystem;
+ }
+ else
+ {
+ var ioPortDev = DeviceManager.GetDeviceForKey(dc.PortDeviceKey) as IDigitalInputPorts;
+ if (ioPortDev == null)
+ {
+ Debug.Console(0, "GetDigitalInput: Device {0} is not a valid device", dc.PortDeviceKey);
+ return null;
+ }
+ ioPortDevice = ioPortDev;
+ }
+ if (ioPortDevice == null)
+ {
+ Debug.Console(0, "GetDigitalInput: Device '0' is not a valid IRelayPorts Device", dc.PortDeviceKey);
+ return null;
+ }
+
+ if (dc.PortNumber > ioPortDevice.NumberOfDigitalInputPorts)
+ {
+ Debug.Console(0, "GetDigitalInput: Device {0} does not contain a port {1}", dc.PortDeviceKey, dc.PortNumber);
+ }
+
+ return ioPortDevice.DigitalInputPorts[dc.PortNumber];
+
+
+ }
+
+ #endregion
+
+ #region Bridge Linking
+
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{
var joinMap = new IDigitalInputJoinMap(joinStart);
@@ -65,98 +121,37 @@ namespace PepperDash.Essentials.Core.CrestronIO
{
Debug.Console(1, this, "Unable to link device '{0}'. Input is null", Key);
Debug.Console(1, this, "Error: {0}", e);
- }
- }
+ }
+ }
+
+ #endregion
+
+ #region Factory
+
+ public class GenericDigitalInputDeviceFactory : EssentialsDeviceFactory
+ {
+ public GenericDigitalInputDeviceFactory()
+ {
+ TypeNames = new List() { "digitalinput" };
+ }
+
+ public override EssentialsDevice BuildDevice(DeviceConfig dc)
+ {
+ Debug.Console(1, "Factory Attempting to create new Generic Relay Device");
+
+ var props = JsonConvert.DeserializeObject(dc.Properties.ToString());
+
+ if (props == null) return null;
+
+ var portDevice = new GenericDigitalInputDevice(dc.Key, dc.Name, GetDigitalInput, props);
+
+ return portDevice;
+ }
+ }
+
+ #endregion
+
}
- public class GenericDigitalInputDeviceFactory : EssentialsDeviceFactory
- {
- public GenericDigitalInputDeviceFactory()
- {
- TypeNames = new List() { "digitalinput" };
- }
-
- public override EssentialsDevice BuildDevice(DeviceConfig dc)
- {
- Debug.Console(1, "Factory Attempting to create new Digtal Input Device");
-
- var props = JsonConvert.DeserializeObject(dc.Properties.ToString());
-
- IDigitalInputPorts portDevice;
-
- if (props.PortDeviceKey == "processor")
- portDevice = Global.ControlSystem as IDigitalInputPorts;
- else
- portDevice = DeviceManager.GetDeviceForKey(props.PortDeviceKey) as IDigitalInputPorts;
-
- if (portDevice == null)
- Debug.Console(0, "ERROR: Unable to add digital input device with key '{0}'. Port Device does not support digital inputs", dc.Key);
- else
- {
- var cs = (portDevice as CrestronControlSystem);
- if (cs == null)
- {
- Debug.Console(0, "ERROR: Port device for [{0}] is not control system", props.PortDeviceKey);
- return null;
- }
-
- if (cs.SupportsVersiport)
- {
- Debug.Console(1, "Attempting to add Digital Input device to Versiport port '{0}'", props.PortNumber);
-
- if (props.PortNumber > cs.NumberOfVersiPorts)
- {
- Debug.Console(0, "WARNING: Cannot add Vesiport {0} on {1}. Out of range",
- props.PortNumber, props.PortDeviceKey);
- return null;
- }
-
- Versiport vp = cs.VersiPorts[props.PortNumber];
-
- if (!vp.Registered)
- {
- var regSuccess = vp.Register();
- if (regSuccess == eDeviceRegistrationUnRegistrationResponse.Success)
- {
- Debug.Console(1, "Successfully Created Digital Input Device on Versiport");
- return new GenericVersiportDigitalInputDevice(dc.Key, vp, props);
- }
- else
- {
- Debug.Console(0, "WARNING: Attempt to register versiport {0} on device with key '{1}' failed: {2}",
- props.PortNumber, props.PortDeviceKey, regSuccess);
- return null;
- }
- }
- }
- else if (cs.SupportsDigitalInput)
- {
- Debug.Console(1, "Attempting to add Digital Input device to Digital Input port '{0}'", props.PortNumber);
-
- if (props.PortNumber > cs.NumberOfDigitalInputPorts)
- {
- Debug.Console(0, "WARNING: Cannot register DIO port {0} on {1}. Out of range",
- props.PortNumber, props.PortDeviceKey);
- return null;
- }
-
- DigitalInput digitalInput = cs.DigitalInputPorts[props.PortNumber];
-
- if (!digitalInput.Registered)
- {
- if (digitalInput.Register() == eDeviceRegistrationUnRegistrationResponse.Success)
- {
- Debug.Console(1, "Successfully Created Digital Input Device on Digital Input");
- return new GenericDigitalInputDevice(dc.Key, digitalInput);
- }
- else
- Debug.Console(0, "WARNING: Attempt to register digital input {0} on device with key '{1}' failed.",
- props.PortNumber, props.PortDeviceKey);
- }
- }
- }
- return null;
- }
- }
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron IO/Relay/GenericRelayDevice.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron IO/Relay/GenericRelayDevice.cs
index b79a8253..f3466683 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron IO/Relay/GenericRelayDevice.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron IO/Relay/GenericRelayDevice.cs
@@ -14,46 +14,114 @@ namespace PepperDash.Essentials.Core.CrestronIO
{
///
/// Represents a generic device controlled by relays
- ///
+ ///
+ [Description("Wrapper class for a Relay")]
public class GenericRelayDevice : EssentialsBridgeableDevice, ISwitchedOutput
{
public Relay RelayOutput { get; private set; }
- public BoolFeedback OutputIsOnFeedback { get; private set; }
-
- public GenericRelayDevice(string key, Relay relay):
- base(key)
- {
- OutputIsOnFeedback = new BoolFeedback(new Func(() => RelayOutput.State));
-
- RelayOutput = relay;
- RelayOutput.Register();
-
- RelayOutput.StateChange += new RelayEventHandler(RelayOutput_StateChange);
- }
-
+ public BoolFeedback OutputIsOnFeedback { get; private set; }
+
+ //Maintained for compatibility with PepperDash.Essentials.Core.Devices.CrestronProcessor
+ public GenericRelayDevice(string key, Relay relay) :
+ base(key)
+ {
+ OutputIsOnFeedback = new BoolFeedback(new Func(() => RelayOutput.State));
+
+ RelayOutput = relay;
+ RelayOutput.Register();
+
+ RelayOutput.StateChange += new RelayEventHandler(RelayOutput_StateChange);
+ }
+
+ public GenericRelayDevice(string key, string name, Func postActivationFunc,
+ IOPortConfig config)
+ : base(key, name)
+ {
+
+ AddPostActivationAction(() =>
+ {
+ RelayOutput = postActivationFunc(config);
+
+ RelayOutput.Register();
+
+ RelayOutput.StateChange += RelayOutput_StateChange;
+
+ });
+ }
+
+ #region PreActivate
+
+ private static Relay GetRelay(IOPortConfig dc)
+ {
+
+ IRelayPorts relayDevice;
+
+ if(dc.PortDeviceKey.Equals("processor"))
+ {
+ if (!Global.ControlSystem.SupportsRelay)
+ {
+ Debug.Console(0, "GetRelayDevice: Processor does not support relays");
+ return null;
+ }
+ relayDevice = Global.ControlSystem;
+ }
+ else
+ {
+ var relayDev = DeviceManager.GetDeviceForKey(dc.PortDeviceKey) as IRelayPorts;
+ if (relayDev == null)
+ {
+ Debug.Console(0, "GetRelayDevice: Device {0} is not a valid device", dc.PortDeviceKey);
+ return null;
+ }
+ relayDevice = relayDev;
+ }
+ if (relayDevice == null)
+ {
+ Debug.Console(0, "GetRelayDevice: Device '0' is not a valid IRelayPorts Device", dc.PortDeviceKey);
+ return null;
+ }
+
+ if (dc.PortNumber > relayDevice.NumberOfRelayPorts)
+ {
+ Debug.Console(0, "GetRelayDevice: Device {0} does not contain a port {1}", dc.PortDeviceKey, dc.PortNumber);
+ }
+
+ return relayDevice.RelayPorts[dc.PortNumber];
+ }
+
+ #endregion
+
+ #region Events
+
void RelayOutput_StateChange(Relay relay, RelayEventArgs args)
{
- OutputIsOnFeedback.FireUpdate();
+ OutputIsOnFeedback.FireUpdate();
}
- public void OpenRelay()
- {
- RelayOutput.State = false;
- }
-
- public void CloseRelay()
- {
- RelayOutput.State = true;
- }
-
- public void ToggleRelayState()
- {
- if (RelayOutput.State == true)
- OpenRelay();
- else
- CloseRelay();
+ #endregion
+
+ #region Methods
+
+ public void OpenRelay()
+ {
+ RelayOutput.State = false;
+ }
+
+ public void CloseRelay()
+ {
+ RelayOutput.State = true;
+ }
+
+ public void ToggleRelayState()
+ {
+ if (RelayOutput.State == true)
+ OpenRelay();
+ else
+ CloseRelay();
}
+
+ #endregion
#region ISwitchedOutput Members
@@ -67,8 +135,10 @@ namespace PepperDash.Essentials.Core.CrestronIO
OpenRelay();
}
- #endregion
-
+ #endregion
+
+ #region Bridge Linking
+
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{
var joinMap = new GenericRelayControllerJoinMap(joinStart);
@@ -98,77 +168,90 @@ namespace PepperDash.Essentials.Core.CrestronIO
// feedback for relay state
- OutputIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Relay.JoinNumber]);
- }
- }
+ OutputIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Relay.JoinNumber]);
+ }
+
+ #endregion
+
+ #region Factory
+
+ public class GenericRelayDeviceFactory : EssentialsDeviceFactory
+ {
+ public GenericRelayDeviceFactory()
+ {
+ TypeNames = new List() { "relayoutput" };
+ }
+
+ public override EssentialsDevice BuildDevice(DeviceConfig dc)
+ {
+ Debug.Console(1, "Factory Attempting to create new Generic Relay Device");
+
+ var props = JsonConvert.DeserializeObject(dc.Properties.ToString());
+
+ if (props == null) return null;
+
+ var portDevice = new GenericRelayDevice(dc.Key, dc.Name, GetRelay, props);
+
+ return portDevice;
+
+
+ /*
+ if (props.PortDeviceKey == "processor")
+ portDevice = Global.ControlSystem as IRelayPorts;
+ else
+ portDevice = DeviceManager.GetDeviceForKey(props.PortDeviceKey) as IRelayPorts;
- public class GenericRelayDeviceFactory : EssentialsDeviceFactory
- {
- public GenericRelayDeviceFactory()
- {
- TypeNames = new List() { "relayoutput" };
- }
-
- public override EssentialsDevice BuildDevice(DeviceConfig dc)
- {
- Debug.Console(1, "Factory Attempting to create new Generic Relay Device");
-
- var props = JsonConvert.DeserializeObject(dc.Properties.ToString());
- var key = dc.Key;
-
- IRelayPorts portDevice;
-
- if (props.PortDeviceKey == "processor")
- portDevice = Global.ControlSystem as IRelayPorts;
- else
- portDevice = DeviceManager.GetDeviceForKey(props.PortDeviceKey) as IRelayPorts;
-
- if (portDevice == null)
- Debug.Console(0, "Unable to add relay device with key '{0}'. Port Device does not support relays", key);
- else
- {
- var cs = (portDevice as CrestronControlSystem);
-
- if (cs != null)
- {
- // The relay is on a control system processor
- if (!cs.SupportsRelay || props.PortNumber > cs.NumberOfRelayPorts)
- {
- Debug.Console(0, "Port Device: {0} does not support relays or does not have enough relays");
- return null;
- }
- }
+ if (portDevice == null)
+ Debug.Console(0, "Unable to add relay device with key '{0}'. Port Device does not support relays", key);
else
{
- // The relay is on another device type
+ var cs = (portDevice as CrestronControlSystem);
- if (props.PortNumber > portDevice.NumberOfRelayPorts)
+ if (cs != null)
{
- Debug.Console(0, "Port Device: {0} does not have enough relays");
- return null;
+ // The relay is on a control system processor
+ if (!cs.SupportsRelay || props.PortNumber > cs.NumberOfRelayPorts)
+ {
+ Debug.Console(0, "Port Device: {0} does not support relays or does not have enough relays");
+ return null;
+ }
}
- }
-
- Relay relay = portDevice.RelayPorts[props.PortNumber];
-
- if (!relay.Registered)
- {
- if (relay.Register() == eDeviceRegistrationUnRegistrationResponse.Success)
- return new GenericRelayDevice(key, relay);
else
- Debug.Console(0, "Attempt to register relay {0} on device with key '{1}' failed.", props.PortNumber, props.PortDeviceKey);
+ {
+ // The relay is on another device type
+
+ if (props.PortNumber > portDevice.NumberOfRelayPorts)
+ {
+ Debug.Console(0, "Port Device: {0} does not have enough relays");
+ return null;
+ }
+ }
+
+ Relay relay = portDevice.RelayPorts[props.PortNumber];
+
+ if (!relay.Registered)
+ {
+ if (relay.Register() == eDeviceRegistrationUnRegistrationResponse.Success)
+ return new GenericRelayDevice(key, relay);
+ else
+ Debug.Console(0, "Attempt to register relay {0} on device with key '{1}' failed.", props.PortNumber, props.PortDeviceKey);
+ }
+ else
+ {
+ return new GenericRelayDevice(key, relay);
+ }
+
+ // Future: Check if portDevice is 3-series card or other non control system that supports versiports
}
- else
- {
- return new GenericRelayDevice(key, relay);
- }
-
- // Future: Check if portDevice is 3-series card or other non control system that supports versiports
- }
-
- return null;
-
- }
+ */
+
+ }
+ }
+
+ #endregion
+
+
}
+
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/DeviceTypeInterfaces/IDPad.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/DeviceTypeInterfaces/IDPad.cs
index 2e0f3ae7..d222b47c 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/DeviceTypeInterfaces/IDPad.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/DeviceTypeInterfaces/IDPad.cs
@@ -33,7 +33,7 @@ namespace PepperDash.Essentials.Core
triList.SetBoolSigAction(141, dev.Right);
triList.SetBoolSigAction(142, dev.Select);
triList.SetBoolSigAction(130, dev.Menu);
- triList.SetBoolSigAction(134, dev.Exit);
+ triList.SetBoolSigAction(134, dev.Exit);
}
public static void UnlinkButtons(this IDPad dev, BasicTriList triList)
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/EssentialsDevice.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/EssentialsDevice.cs
index 410c7a48..8d7f2c8d 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/EssentialsDevice.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/EssentialsDevice.cs
@@ -53,7 +53,7 @@ namespace PepperDash.Essentials.Core
public ConfigSnippetAttribute(string configSnippet)
{
- Debug.Console(2, "Setting Description {0}", configSnippet);
+ Debug.Console(2, "Setting Config Snippet {0}", configSnippet);
_ConfigSnippet = configSnippet;
}
@@ -83,8 +83,9 @@ namespace PepperDash.Essentials.Core
foreach (var typeName in TypeNames)
{
Debug.Console(2, "Getting Description Attribute from class: '{0}'", typeof(T).FullName);
- var attributes = typeof(T).GetCustomAttributes(typeof(DescriptionAttribute), true) as DescriptionAttribute[];
- string description = attributes[0].Description;
+ var descriptionAttribute = typeof(T).GetCustomAttributes(typeof(DescriptionAttribute), true) as DescriptionAttribute[];
+ string description = descriptionAttribute[0].Description;
+ var snippetAttribute = typeof(T).GetCustomAttributes(typeof(ConfigSnippetAttribute), true) as ConfigSnippetAttribute[];
DeviceFactory.AddFactoryForType(typeName.ToLower(), description, typeof(T), BuildDevice);
}
}
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/IProjectorInterfaces.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/IProjectorInterfaces.cs
new file mode 100644
index 00000000..6efb7776
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/IProjectorInterfaces.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Essentials.Core
+{
+ public interface IBasicVideoMute
+ {
+ void VideoMuteToggle();
+ }
+
+ public interface IBasicVideoMuteWithFeedback : IBasicVideoMute
+ {
+ BoolFeedback VideoMuteIsOn { get; }
+
+ void VideoMuteOn();
+ void VideoMuteOff();
+
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/IrOutputPortController.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/IrOutputPortController.cs
index 67a74ed7..ecfca4f8 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/IrOutputPortController.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/IrOutputPortController.cs
@@ -3,7 +3,10 @@ using System.Collections.Generic;
using System.Linq;
using Crestron.SimplSharp;
using Crestron.SimplSharpPro;
-using Crestron.SimplSharpPro.DeviceSupport;
+using Crestron.SimplSharpPro.DeviceSupport;
+using Newtonsoft.Json.Linq;
+using PepperDash.Essentials.Core.Config;
+
using PepperDash.Core;
@@ -37,9 +40,21 @@ namespace PepperDash.Essentials.Core
return;
}
LoadDriver(irDriverFilepath);
- }
-
- ///
+ }
+
+ public IrOutputPortController(string key, Func postActivationFunc,
+ DeviceConfig config)
+ : base(key)
+ {
+ AddPostActivationAction(() =>
+ {
+ IrPort = postActivationFunc(config);
+ });
+ }
+
+
+
+ ///
/// Loads the IR driver at path
///
///
@@ -118,7 +133,6 @@ namespace PepperDash.Essentials.Core
{
Debug.Console(2, this, "Device {0}: IR Driver {1} does not contain command {2}",
Key, IrPort.IRDriverFileNameByIRDriverId(IrPortUid), command);
- }
-
+ }
}
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Display/BasicIrDisplay.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Display/BasicIrDisplay.cs
index fd83f2a2..707a8fb8 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Display/BasicIrDisplay.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Display/BasicIrDisplay.cs
@@ -13,8 +13,9 @@ using PepperDash.Essentials.Core.Bridges;
using PepperDash.Essentials.Core.Routing;
namespace PepperDash.Essentials.Core
-{
- public class BasicIrDisplay : DisplayBase, IBasicVolumeControls, IBridgeAdvanced
+{
+ [Description("Wrapper class for a Basic IR Display")]
+ public class BasicIrDisplay : DisplayBase, IBasicVolumeControls, IBridgeAdvanced
{
public IrOutputPortController IrPort { get; private set; }
public ushort IrPulseTime { get; set; }
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Gateways/CenRfgwController.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Gateways/CenRfgwController.cs
new file mode 100644
index 00000000..1fd7da6d
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Gateways/CenRfgwController.cs
@@ -0,0 +1,139 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using Crestron.SimplSharpPro;
+using Crestron.SimplSharpPro.Gateways;
+using Newtonsoft.Json;
+
+
+using PepperDash.Core;
+using PepperDash.Essentials.Core;
+using PepperDash.Essentials.Core.Config;
+
+
+namespace PepperDash.Essentials.Core
+{
+ [Description("Wrapper class for Crestron Infinet-EX Gateways")]
+ public class CenRfgwController : CrestronGenericBaseDevice
+ {
+ private GatewayBase _Gateway;
+ public GatewayBase GateWay { get { return _Gateway; } }
+
+ ///
+ /// Constructor for the on-board gateway
+ ///
+ ///
+ ///
+ public CenRfgwController(string key, string name, GatewayBase gateway) :
+ base(key, name, gateway)
+ {
+ _Gateway = gateway;
+ }
+
+ public static CenRfgwController GetNewExGatewayController(string key, string name, ushort ipId, ushort cresnetId, string gatewayType)
+ {
+ eExGatewayType type = (eExGatewayType)Enum.Parse(typeof(eExGatewayType), gatewayType, true);
+ try
+ {
+ var cs = Global.ControlSystem;
+
+ GatewayBase gw = null;
+ switch (type)
+ {
+ case eExGatewayType.Ethernet:
+ gw = new CenRfgwEx(ipId, cs);
+ break;
+ case eExGatewayType.EthernetShared:
+ gw = new CenRfgwExEthernetSharable(ipId, cs);
+ break;
+ case eExGatewayType.Cresnet:
+ gw = new CenRfgwExCresnet(cresnetId, cs);
+ break;
+ }
+ return new CenRfgwController(key, name, gw);
+ }
+ catch (Exception)
+ {
+ Debug.Console(0, "ERROR: Cannot create EX Gateway, id {0}, type {1}", type == eExGatewayType.Cresnet ? cresnetId : ipId, gatewayType);
+ return null;
+ }
+ }
+ public static CenRfgwController GetNewErGatewayController(string key, string name, ushort ipId, ushort cresnetId, string gatewayType)
+ {
+ eExGatewayType type = (eExGatewayType)Enum.Parse(typeof(eExGatewayType), gatewayType, true);
+ try
+ {
+ var cs = Global.ControlSystem;
+
+ GatewayBase gw = null;
+ switch (type)
+ {
+ case eExGatewayType.Ethernet:
+ gw = new CenErfgwPoe(ipId, cs);
+ break;
+ case eExGatewayType.EthernetShared:
+ gw = new CenErfgwPoeEthernetSharable(ipId, cs);
+ break;
+ case eExGatewayType.Cresnet:
+ gw = new CenErfgwPoeCresnet(cresnetId, cs);
+ break;
+ }
+ return new CenRfgwController(key, name, gw);
+ }
+ catch (Exception)
+ {
+ Debug.Console(0, "ERROR: Cannot create ER Gateway, id {0}, type {1}", type== eExGatewayType.Cresnet ? cresnetId : ipId, gatewayType);
+ return null;
+ }
+ }
+
+ }
+
+
+
+ public enum eExGatewayType
+ {
+ Ethernet, EthernetShared, Cresnet
+ }
+
+
+ #region Factory
+ public class CenRfgwControllerFactory : EssentialsDeviceFactory
+ {
+ public CenRfgwControllerFactory()
+ {
+ TypeNames = new List() { "cenrfgwex", "cenerfgwpoe" };
+ }
+
+ public override EssentialsDevice BuildDevice(DeviceConfig dc)
+ {
+
+ Debug.Console(1, "Factory Attempting to create new CEN-GWEXER Device");
+
+ var props = JsonConvert.DeserializeObject(dc.Properties.ToString());
+
+ var type = dc.Type.ToLower();
+ var control = props.Control;
+ var ipid = control.IpIdInt;
+ var cresnetId = control.CresnetIdInt;
+ var gatewayType = props.GatewayType;
+
+ switch (type)
+ {
+ case ("cenrfgwex"):
+ return CenRfgwController.GetNewExGatewayController(dc.Key, dc.Name,
+ (ushort)ipid, (ushort)cresnetId, gatewayType);
+ case ("cenerfgwpoe"):
+ return CenRfgwController.GetNewErGatewayController(dc.Key, dc.Name,
+ (ushort)ipid, (ushort)cresnetId, gatewayType);
+ default:
+ return null;
+ }
+ }
+ }
+ #endregion
+
+
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Gateways/EssentialsRfGatewayConfig.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Gateways/EssentialsRfGatewayConfig.cs
new file mode 100644
index 00000000..e1ae8c11
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Gateways/EssentialsRfGatewayConfig.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using PepperDash.Core;
+using PepperDash.Essentials.Core.Config;
+
+
+namespace PepperDash.Essentials.Core
+{
+ public class EssentialsRfGatewayConfig
+ {
+ [JsonProperty("control")]
+ public EssentialsControlPropertiesConfig Control { get; set; }
+
+ [JsonProperty("gatewayType")]
+ public string GatewayType { get; set; }
+
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Global/Global.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Global/Global.cs
index 2f3e1823..b540b3d6 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Global/Global.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Global/Global.cs
@@ -17,8 +17,8 @@ namespace PepperDash.Essentials.Core
{
public static class Global
{
- public static CrestronControlSystem ControlSystem { get; set; }
-
+ public static CrestronControlSystem ControlSystem { get; set; }
+
public static LicenseManager LicenseManager { get; set; }
///
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/JoinMaps/JoinMapBase.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/JoinMaps/JoinMapBase.cs
index 31616a6d..676299e5 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/JoinMaps/JoinMapBase.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/JoinMaps/JoinMapBase.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
-using System.Linq;
+using System.Linq;
+using System.Runtime.InteropServices;
using Crestron.SimplSharp.Reflection;
using PepperDash.Core;
@@ -345,8 +346,10 @@ namespace PepperDash.Essentials.Core
///
/// Metadata describing the join
///
- public class JoinMetadata
- {
+ public class JoinMetadata
+ {
+ private string _description;
+
///
/// Join number (based on join offset value)
///
@@ -361,10 +364,17 @@ namespace PepperDash.Essentials.Core
public uint JoinSpan { get; set; }
///
- /// A label for the join to better describe it's usage
+ /// A label for the join to better describe its usage
///
- [JsonProperty("label")]
- public string Label { get; set; }
+ [Obsolete("Use Description instead")]
+ [JsonProperty("label")]
+ public string Label { get { return _description; } set { _description = value; } }
+
+ ///
+ /// A description for the join to better describe its usage
+ ///
+ [JsonProperty("description")]
+ public string Description { get { return _description; } set { _description = value; } }
///
/// Signal type(s)
///
@@ -454,11 +464,13 @@ namespace PepperDash.Essentials.Core
name = attribute.Name;
Debug.Console(2, "JoinName Attribute value: {0}", name);
return name;
- }
- }
+ }
+ }
+
+
[AttributeUsage(AttributeTargets.All)]
- public class JoinNameAttribute : Attribute
+ public class JoinNameAttribute : CAttribute
{
private string _Name;
@@ -472,5 +484,5 @@ namespace PepperDash.Essentials.Core
{
get { return _Name; }
}
- }
+ }
}
\ 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 4e3e1b41..55a11a7a 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj
@@ -62,6 +62,10 @@
False
..\..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.Fusion.dll
+
+ False
+ ..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.Gateways.dll
+
False
..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.GeneralIO.dll
@@ -129,15 +133,23 @@
+
+
-
-
-
+
+
+
+
+
+
+
+
+
@@ -158,6 +170,7 @@
+
@@ -175,6 +188,8 @@
+
+
@@ -187,11 +202,6 @@
-
-
-
-
-
@@ -220,6 +230,9 @@
+
+
+
@@ -275,7 +288,6 @@
-
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Remotes/ButtonExtensions.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Remotes/ButtonExtensions.cs
new file mode 100644
index 00000000..43941260
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Remotes/ButtonExtensions.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Crestron.SimplSharp;
+using Crestron.SimplSharpPro;
+using Crestron.SimplSharpPro.DeviceSupport;
+
+using PepperDash.Core;
+
+namespace PepperDash.Essentials.Core
+{
+ public static class ButtonExtensions
+ {
+ public static Button SetButtonAction(this Button button, Action a)
+ {
+ button.UserObject = a;
+ return button;
+ }
+
+ public static Button SetButtonAction(this CrestronCollection
- public static void ReleaseAndMakeRoute(this IRoutingInputs destination, IRoutingOutputs source, eRoutingSignalType signalType)
+ public static void ReleaseAndMakeRoute(this IRoutingSink destination, IRoutingOutputs source, eRoutingSignalType signalType)
{
destination.ReleaseRoute();
@@ -39,7 +39,7 @@ namespace PepperDash.Essentials.Core
/// RouteDescriptorCollection.DefaultCollection
///
///
- public static void ReleaseRoute(this IRoutingInputs destination)
+ public static void ReleaseRoute(this IRoutingSink destination)
{
var current = RouteDescriptorCollection.DefaultCollection.RemoveRouteDescriptor(destination);
if (current != null)
@@ -56,7 +56,7 @@ namespace PepperDash.Essentials.Core
/// of an audio/video route are discovered a route descriptor is returned. If no route is
/// discovered, then null is returned
///
- public static RouteDescriptor GetRouteToSource(this IRoutingInputs destination, IRoutingOutputs source, eRoutingSignalType signalType)
+ public static RouteDescriptor GetRouteToSource(this IRoutingSink destination, IRoutingOutputs source, eRoutingSignalType signalType)
{
var routeDescr = new RouteDescriptor(source, destination, signalType);
// if it's a single signal type, find the route
@@ -152,7 +152,7 @@ namespace PepperDash.Essentials.Core
if (outputPortToUse == null)
{
// it's a sink device
- routeTable.Routes.Add(new RouteSwitchDescriptor(goodInputPort));
+ routeTable.Routes.Add(new RouteSwitchDescriptor(goodInputPort));
}
else if (destination is IRouting)
{
@@ -265,14 +265,20 @@ namespace PepperDash.Essentials.Core
foreach (var route in Routes)
{
Debug.Console(2, "ExecuteRoutes: {0}", route.ToString());
- if (route.SwitchingDevice is IRoutingSinkWithSwitching)
- (route.SwitchingDevice as IRoutingSinkWithSwitching).ExecuteSwitch(route.InputPort.Selector);
- else if (route.SwitchingDevice is IRouting)
- {
- (route.SwitchingDevice as IRouting).ExecuteSwitch(route.InputPort.Selector, route.OutputPort.Selector, SignalType);
- route.OutputPort.InUseTracker.AddUser(Destination, "destination-" + SignalType);
- Debug.Console(2, "Output port {0} routing. Count={1}", route.OutputPort.Key, route.OutputPort.InUseTracker.InUseCountFeedback.UShortValue);
- }
+ if (route.SwitchingDevice is IRoutingSink)
+ {
+ var device = route.SwitchingDevice as IRoutingSinkWithSwitching;
+ if (device == null)
+ continue;
+
+ device.ExecuteSwitch(route.InputPort.Selector);
+ }
+ else if (route.SwitchingDevice is IRouting)
+ {
+ (route.SwitchingDevice as IRouting).ExecuteSwitch(route.InputPort.Selector, route.OutputPort.Selector, SignalType);
+ route.OutputPort.InUseTracker.AddUser(Destination, "destination-" + SignalType);
+ Debug.Console(2, "Output port {0} routing. Count={1}", route.OutputPort.Key, route.OutputPort.InUseTracker.InUseCountFeedback.UShortValue);
+ }
}
}
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Routing/RoutingInterfaces.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Routing/RoutingInterfaces.cs
index 3b288290..6c8d520b 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Routing/RoutingInterfaces.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Routing/RoutingInterfaces.cs
@@ -1,109 +1,120 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-using Crestron.SimplSharpPro;
-using Crestron.SimplSharpPro.DM;
-
-using PepperDash.Core;
-
-
-namespace PepperDash.Essentials.Core
-{
-
- ///
- /// The handler type for a Room's SourceInfoChange
- ///
- public delegate void SourceInfoChangeHandler(/*EssentialsRoomBase room,*/ SourceListItem info, ChangeType type);
-
-
- //*******************************************************************************************
- // Interfaces
-
- ///
- /// For rooms with a single presentation source, change event
- ///
- public interface IHasCurrentSourceInfoChange
- {
- string CurrentSourceInfoKey { get; set; }
- SourceListItem CurrentSourceInfo { get; set; }
- event SourceInfoChangeHandler CurrentSourceChange;
- }
-
- ///
- /// Defines a class that has a collection of RoutingInputPorts
- ///
- public interface IRoutingInputs : IKeyed
- {
- RoutingPortCollection InputPorts { get; }
- }
-
- ///
- /// Defines a class that has a collection of RoutingOutputPorts
- ///
-
- public interface IRoutingOutputs : IKeyed
- {
- RoutingPortCollection OutputPorts { get; }
- }
-
- ///
- /// For fixed-source endpoint devices
- ///
- public interface IRoutingSinkNoSwitching : IRoutingInputs, IHasCurrentSourceInfoChange
- {
-
- }
-
- ///
- /// Endpoint device like a display, that selects inputs
- ///
- public interface IRoutingSinkWithSwitching : IRoutingSinkNoSwitching, IHasCurrentSourceInfoChange
- {
- //void ClearRoute();
- void ExecuteSwitch(object inputSelector);
- }
-
- ///
- /// For devices like RMCs, baluns, other devices with no switching.
- ///
- public interface IRoutingInputsOutputs : IRoutingInputs, IRoutingOutputs
- {
- }
-
- ///
- /// Defines a midpoint device as have internal routing. Any devices in the middle of the
- /// signal chain, that do switching, must implement this for routing to work otherwise
- /// the routing algorithm will treat the IRoutingInputsOutputs device as a passthrough
- /// device.
- ///
- public interface IRouting : IRoutingInputsOutputs
- {
- //void ClearRoute(object outputSelector);
- void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType);
- }
-
- public interface ITxRouting : IRouting
- {
- IntFeedback VideoSourceNumericFeedback { get; }
- IntFeedback AudioSourceNumericFeedback { get; }
- void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type);
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using Crestron.SimplSharpPro;
+using Crestron.SimplSharpPro.DM;
+
+using PepperDash.Core;
+
+
+namespace PepperDash.Essentials.Core
+{
+
+ ///
+ /// The handler type for a Room's SourceInfoChange
+ ///
+ public delegate void SourceInfoChangeHandler(/*EssentialsRoomBase room,*/ SourceListItem info, ChangeType type);
+
+
+ //*******************************************************************************************
+ // Interfaces
+
+ ///
+ /// For rooms with a single presentation source, change event
+ ///
+ public interface IHasCurrentSourceInfoChange
+ {
+ string CurrentSourceInfoKey { get; set; }
+ SourceListItem CurrentSourceInfo { get; set; }
+ event SourceInfoChangeHandler CurrentSourceChange;
+ }
+
+ ///
+ /// Defines a class that has a collection of RoutingInputPorts
+ ///
+ public interface IRoutingInputs : IKeyed
+ {
+ RoutingPortCollection InputPorts { get; }
+ }
+
+ ///
+ /// Defines a class that has a collection of RoutingOutputPorts
+ ///
+
+ public interface IRoutingOutputs : IKeyed
+ {
+ RoutingPortCollection OutputPorts { get; }
+ }
+
+ ///
+ /// For fixed-source endpoint devices
+ ///
+ public interface IRoutingSink : IRoutingInputs, IHasCurrentSourceInfoChange
+ {
+
+ }
+
+ ///
+ /// For fixed-source endpoint devices
+ ///
+ [Obsolete]
+ public interface IRoutingSinkNoSwitching : IRoutingSink
+ {
+
+ }
+
+ ///
+ /// Endpoint device like a display, that selects inputs
+ ///
+ public interface IRoutingSinkWithSwitching : IRoutingSink
+ {
+ //void ClearRoute();
+ void ExecuteSwitch(object inputSelector);
+ }
+
+ ///
+ /// For devices like RMCs, baluns, other devices with no switching.
+ ///
+ public interface IRoutingInputsOutputs : IRoutingInputs, IRoutingOutputs
+ {
+ }
+
+ ///
+ /// Defines a midpoint device as have internal routing. Any devices in the middle of the
+ /// signal chain, that do switching, must implement this for routing to work otherwise
+ /// the routing algorithm will treat the IRoutingInputsOutputs device as a passthrough
+ /// device.
+ ///
+ public interface IRouting : IRoutingInputsOutputs
+ {
+ void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType);
+ }
+
+ public interface IRoutingNumeric : IRouting
+ {
+ void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type);
+ }
+
+ public interface ITxRouting : IRoutingNumeric
+ {
+ IntFeedback VideoSourceNumericFeedback { get; }
+ IntFeedback AudioSourceNumericFeedback { get; }
}
///
/// Defines a receiver that has internal routing (DM-RMC-4K-Z-SCALER-C)
///
- public interface IRmcRouting : IRouting
+ public interface IRmcRouting : IRoutingNumeric
{
IntFeedback AudioVideoSourceNumericFeedback { get; }
- void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type);
- }
-
- ///
- /// Defines an IRoutingOutputs devices as being a source - the start of the chain
- ///
- public interface IRoutingSource : IRoutingOutputs
- {
- }
+ }
+
+ ///
+ /// Defines an IRoutingOutputs devices as being a source - the start of the chain
+ ///
+ public interface IRoutingSource : IRoutingOutputs
+ {
+ }
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials DM/Essentials_DM/AirMedia/AirMediaController.cs b/essentials-framework/Essentials DM/Essentials_DM/AirMedia/AirMediaController.cs
index 72b4bc4c..c4cb58bd 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/AirMedia/AirMediaController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/AirMedia/AirMediaController.cs
@@ -16,6 +16,7 @@ using PepperDash.Essentials.Core.Config;
namespace PepperDash.Essentials.DM.AirMedia
{
+ [Description("Wrapper class for an AM-200 or AM-300")]
public class AirMediaController : CrestronGenericBridgeableBaseDevice, IRoutingInputsOutputs, IIROutputPorts, IComPorts
{
public AmX00 AirMedia { get; private set; }
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmBladeChassisController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmBladeChassisController.cs
index 5e9c3151..3094c7fd 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmBladeChassisController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmBladeChassisController.cs
@@ -21,7 +21,8 @@ namespace PepperDash.Essentials.DM {
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
///
///
- public class DmBladeChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitch, IRoutingInputsOutputs, IRouting, IHasFeedback {
+ public class DmBladeChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitch, IRoutingNumeric
+ {
public DMChassisPropertiesConfig PropertiesConfig { get; set; }
public Switch Chassis { get; private set; }
@@ -563,14 +564,23 @@ namespace PepperDash.Essentials.DM {
var outCard = input == 0 ? null : Chassis.Outputs[output];
// NOTE THAT BITWISE COMPARISONS - TO CATCH ALL ROUTING TYPES
- if ((sigType | eRoutingSignalType.Video) == eRoutingSignalType.Video) {
- Chassis.VideoEnter.BoolValue = true;
- Chassis.Outputs[output].VideoOut = inCard;
- }
+ if ((sigType | eRoutingSignalType.Video) != eRoutingSignalType.Video) return;
+ Chassis.VideoEnter.BoolValue = true;
+ Chassis.Outputs[output].VideoOut = inCard;
}
#endregion
+ #region IRoutingNumeric Members
+
+ public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType sigType)
+ {
+ ExecuteSwitch(inputSelector, outputSelector, sigType);
+ }
+
+ #endregion
+
+
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{
var joinMap = new DmBladeChassisControllerJoinMap(joinStart);
@@ -808,6 +818,7 @@ namespace PepperDash.Essentials.DM {
});
}
}
+
}
/*
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmChassisController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmChassisController.cs
index b0d4682d..2d9a847f 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmChassisController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmChassisController.cs
@@ -21,7 +21,7 @@ namespace PepperDash.Essentials.DM
///
///
[Description("Wrapper class for all DM-MD chassis variants from 8x8 to 32x32")]
- public class DmChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitch, IRoutingInputsOutputs, IRouting, IHasFeedback
+ public class DmChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitch, IRoutingNumeric
{
public DMChassisPropertiesConfig PropertiesConfig { get; set; }
@@ -1094,6 +1094,15 @@ namespace PepperDash.Essentials.DM
}
#endregion
+ #region IRoutingNumeric Members
+
+ public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType sigType)
+ {
+ ExecuteSwitch(inputSelector, outputSelector, sigType);
+ }
+
+ #endregion
+
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{
var joinMap = new DmChassisControllerJoinMap(joinStart);
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsRoutingController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsRoutingController.cs
index 7d8ba747..32352b49 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsRoutingController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsRoutingController.cs
@@ -18,8 +18,8 @@ using PepperDash.Essentials.DM.Config;
using Feedback = PepperDash.Essentials.Core.Feedback;
namespace PepperDash.Essentials.DM
-{
- public class DmpsRoutingController : EssentialsBridgeableDevice, IRouting, IHasFeedback
+{
+ public class DmpsRoutingController : EssentialsBridgeableDevice, IRoutingNumeric, IHasFeedback
{
public CrestronControlSystem Dmps { get; set; }
public ISystemControl SystemControl { get; private set; }
@@ -661,8 +661,6 @@ namespace PepperDash.Essentials.DM
}
}
}
- ///
- ///
void Dmps_DMOutputChange(Switch device, DMOutputEventArgs args)
{
Debug.Console(2, this, "DMOutputChange Output: {0} EventId: {1}", args.Number, args.EventId.ToString());
@@ -724,10 +722,7 @@ namespace PepperDash.Essentials.DM
{
if (RouteOffTimers.ContainsKey(pnt))
return;
- RouteOffTimers[pnt] = new CTimer(o =>
- {
- ExecuteSwitch(0, pnt.Number, pnt.Type);
- }, RouteOffTime);
+ RouteOffTimers[pnt] = new CTimer(o => ExecuteSwitch(0, pnt.Number, pnt.Type), RouteOffTime);
}
#region IRouting Members
@@ -809,6 +804,15 @@ namespace PepperDash.Essentials.DM
}
}
- #endregion
+ #endregion
+
+ #region IRoutingNumeric Members
+
+ public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType sigType)
+ {
+ ExecuteSwitch(inputSelector, outputSelector, sigType);
+ }
+
+ #endregion
}
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/HdMdNxM4kEBridgeableController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/HdMdNxM4kEBridgeableController.cs
new file mode 100644
index 00000000..47f4c572
--- /dev/null
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/HdMdNxM4kEBridgeableController.cs
@@ -0,0 +1,405 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Newtonsoft.Json;
+using Crestron.SimplSharp;
+using Crestron.SimplSharpPro.DeviceSupport;
+using Crestron.SimplSharpPro.DM;
+
+using PepperDash.Core;
+using PepperDash.Essentials.Core;
+using PepperDash.Essentials.DM.Config;
+using PepperDash.Essentials.Core.Bridges;
+using PepperDash.Essentials.Core.Config;
+
+namespace PepperDash.Essentials.DM.Chassis
+{
+ [Description("Wrapper class for all HdMdNxM4E switchers")]
+ public class HdMdNxM4kEBridgeableController : CrestronGenericBridgeableBaseDevice, IRoutingInputsOutputs, IRoutingNumeric, IHasFeedback
+ {
+ private HdMdNxM _Chassis;
+ private HdMd4x14kE _Chassis4x1;
+
+ public Dictionary InputNames { get; set; }
+ public Dictionary OutputNames { get; set; }
+
+ public RoutingPortCollection InputPorts { get; private set; }
+ public RoutingPortCollection OutputPorts { get; private set; }
+
+ public FeedbackCollection VideoInputSyncFeedbacks { get; private set; }
+ public FeedbackCollection VideoOutputRouteFeedbacks { get; private set; }
+ public FeedbackCollection InputNameFeedbacks { get; private set; }
+ public FeedbackCollection OutputNameFeedbacks { get; private set; }
+ public FeedbackCollection OutputRouteNameFeedbacks { get; private set; }
+ public FeedbackCollection InputHdcpEnableFeedback { get; private set; }
+ public FeedbackCollection DeviceNameFeedback { get; private set; }
+ public FeedbackCollection AutoRouteFeedback { get; private set; }
+
+ #region Constructor
+
+ public HdMdNxM4kEBridgeableController(string key, string name, HdMdNxM chassis,
+ HdMdNxM4kEBridgeablePropertiesConfig props)
+ : base(key, name, chassis)
+ {
+ _Chassis = chassis;
+ var _props = props;
+
+ InputNames = props.Inputs;
+ OutputNames = props.Outputs;
+
+ VideoInputSyncFeedbacks = new FeedbackCollection();
+ VideoOutputRouteFeedbacks = new FeedbackCollection();
+ InputNameFeedbacks = new FeedbackCollection();
+ OutputNameFeedbacks = new FeedbackCollection();
+ OutputRouteNameFeedbacks = new FeedbackCollection();
+ InputHdcpEnableFeedback = new FeedbackCollection();
+ DeviceNameFeedback = new FeedbackCollection();
+ AutoRouteFeedback = new FeedbackCollection();
+
+ InputPorts = new RoutingPortCollection();
+ OutputPorts = new RoutingPortCollection();
+
+ DeviceNameFeedback.Add(new StringFeedback(this.Name, () => this.Name));
+
+ if (_Chassis.NumberOfInputs == 1)
+ {
+ _Chassis4x1 = _Chassis as HdMd4x14kE;
+ AutoRouteFeedback.Add(new BoolFeedback(this.Name + "-" + InputNames[1], () => _Chassis4x1.AutoModeOnFeedback.BoolValue));
+ }
+
+ for (uint i = 1; i <= _Chassis.NumberOfInputs; i++)
+ {
+ var inputName = InputNames[i];
+ _Chassis.Inputs[i].Name.StringValue = inputName;
+
+ InputPorts.Add(new RoutingInputPort(inputName, eRoutingSignalType.AudioVideo,
+ eRoutingPortConnectionType.Hdmi, i, this));
+ VideoInputSyncFeedbacks.Add(new BoolFeedback(inputName, () => _Chassis.Inputs[i].VideoDetectedFeedback.BoolValue));
+ InputNameFeedbacks.Add(new StringFeedback(inputName, () => _Chassis.Inputs[i].Name.StringValue));
+ InputHdcpEnableFeedback.Add(new BoolFeedback(inputName, () => _Chassis.HdmiInputs[i].HdmiInputPort.HdcpSupportOnFeedback.BoolValue));
+ }
+
+ for (uint i = 1; i <= _Chassis.NumberOfOutputs; i++)
+ {
+ var outputName = OutputNames[i];
+ _Chassis.Outputs[i].Name.StringValue = outputName;
+
+ OutputPorts.Add(new RoutingOutputPort(outputName, eRoutingSignalType.AudioVideo,
+ eRoutingPortConnectionType.Hdmi, i, this));
+ VideoOutputRouteFeedbacks.Add(new IntFeedback(outputName, () => (int)_Chassis.Outputs[i].VideoOutFeedback.Number));
+ OutputNameFeedbacks.Add(new StringFeedback(outputName, () => _Chassis.Outputs[i].Name.StringValue));
+ OutputRouteNameFeedbacks.Add(new StringFeedback(outputName, () => _Chassis.Outputs[i].VideoOutFeedback.NameFeedback.StringValue));
+ }
+
+ _Chassis.DMInputChange += new DMInputEventHandler(Chassis_DMInputChange);
+ _Chassis.DMOutputChange += new DMOutputEventHandler(Chassis_DMOutputChange);
+
+ AddPostActivationAction(AddFeedbackCollections);
+ }
+
+ #endregion
+
+ #region Methods
+
+ public void EnableHdcp(uint port)
+ {
+ if (port > _Chassis.NumberOfInputs) return;
+ if (port <= 0) return;
+
+ _Chassis.HdmiInputs[port].HdmiInputPort.HdcpSupportOn();
+ InputHdcpEnableFeedback[InputNames[port]].FireUpdate();
+ }
+
+ public void DisableHdcp(uint port)
+ {
+ if (port > _Chassis.NumberOfInputs) return;
+ if (port <= 0) return;
+
+ _Chassis.HdmiInputs[port].HdmiInputPort.HdcpSupportOff();
+ InputHdcpEnableFeedback[InputNames[port]].FireUpdate();
+ }
+
+ public void EnableAutoRoute()
+ {
+ if (_Chassis.NumberOfInputs != 1) return;
+
+ if (_Chassis4x1 == null) return;
+
+ _Chassis4x1.AutoModeOn();
+ }
+
+ public void DisableAutoRoute()
+ {
+ if (_Chassis.NumberOfInputs != 1) return;
+
+ if (_Chassis4x1 == null) return;
+
+ _Chassis4x1.AutoModeOff();
+ }
+
+ #region PostActivate
+
+ public void AddFeedbackCollections()
+ {
+ AddCollectionsToList(VideoInputSyncFeedbacks, InputHdcpEnableFeedback);
+ AddCollectionsToList(VideoOutputRouteFeedbacks);
+ AddCollectionsToList(InputNameFeedbacks, OutputNameFeedbacks, OutputRouteNameFeedbacks, DeviceNameFeedback);
+ }
+
+ #endregion
+
+ #region FeedbackCollection Methods
+
+ //Add arrays of collections
+ public void AddCollectionsToList(params FeedbackCollection[] newFbs)
+ {
+ foreach (FeedbackCollection fbCollection in newFbs)
+ {
+ foreach (var item in newFbs)
+ {
+ AddCollectionToList(item);
+ }
+ }
+ }
+ public void AddCollectionsToList(params FeedbackCollection[] newFbs)
+ {
+ foreach (FeedbackCollection fbCollection in newFbs)
+ {
+ foreach (var item in newFbs)
+ {
+ AddCollectionToList(item);
+ }
+ }
+ }
+
+ public void AddCollectionsToList(params FeedbackCollection[] newFbs)
+ {
+ foreach (FeedbackCollection fbCollection in newFbs)
+ {
+ foreach (var item in newFbs)
+ {
+ AddCollectionToList(item);
+ }
+ }
+ }
+
+ //Add Collections
+ public void AddCollectionToList(FeedbackCollection newFbs)
+ {
+ foreach (var f in newFbs)
+ {
+ if (f == null) continue;
+
+ AddFeedbackToList(f);
+ }
+ }
+
+ public void AddCollectionToList(FeedbackCollection newFbs)
+ {
+ foreach (var f in newFbs)
+ {
+ if (f == null) continue;
+
+ AddFeedbackToList(f);
+ }
+ }
+
+ public void AddCollectionToList(FeedbackCollection newFbs)
+ {
+ foreach (var f in newFbs)
+ {
+ if (f == null) continue;
+
+ AddFeedbackToList(f);
+ }
+ }
+
+ //Add Individual Feedbacks
+ public void AddFeedbackToList(PepperDash.Essentials.Core.Feedback newFb)
+ {
+ if (newFb == null) return;
+
+ if (!Feedbacks.Contains(newFb))
+ {
+ Feedbacks.Add(newFb);
+ }
+ }
+
+ #endregion
+
+ #region IRouting Members
+
+ public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
+ {
+ // Try to make switch only when necessary. The unit appears to toggle when already selected.
+ var current = _Chassis.HdmiOutputs[(uint)outputSelector].VideoOut;
+ if (current != _Chassis.HdmiInputs[(uint)inputSelector])
+ _Chassis.HdmiOutputs[(uint)outputSelector].VideoOut = _Chassis.HdmiInputs[(uint)inputSelector];
+ }
+
+ #endregion
+
+ #region IRoutingNumeric Members
+
+ public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType signalType)
+ {
+ ExecuteSwitch(inputSelector, outputSelector, signalType);
+ }
+
+ #endregion
+
+ #endregion
+
+ #region Bridge Linking
+
+ public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
+ {
+ var joinMap = new HdMdNxM4kEControllerJoinMap(joinStart);
+
+ var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
+
+ if (!string.IsNullOrEmpty(joinMapSerialized))
+ joinMap = JsonConvert.DeserializeObject(joinMapSerialized);
+
+ bridge.AddJoinMap(Key, joinMap);
+
+ IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
+ DeviceNameFeedback[this.Name].LinkInputSig(trilist.StringInput[joinMap.Name.JoinNumber]);
+
+ if (_Chassis4x1 != null)
+ {
+ AutoRouteFeedback[this.Name + "-" + InputNames[1]].LinkInputSig(trilist.BooleanInput[joinMap.EnableAutoRoute.JoinNumber]);
+ AutoRouteFeedback[this.Name + "-" + InputNames[1]].LinkComplementInputSig(trilist.BooleanInput[joinMap.DisableAutoRoute.JoinNumber]);
+ }
+
+ for (uint i = 1; i <= _Chassis.NumberOfInputs; i++)
+ {
+ var joinIndex = i - 1;
+ //Digital
+ VideoInputSyncFeedbacks[InputNames[i]].LinkInputSig(trilist.BooleanInput[joinMap.InputSync.JoinNumber + joinIndex]);
+ InputHdcpEnableFeedback[InputNames[i]].LinkInputSig(trilist.BooleanInput[joinMap.EnableInputHdcp.JoinNumber + joinIndex]);
+ InputHdcpEnableFeedback[InputNames[i]].LinkComplementInputSig(trilist.BooleanInput[joinMap.DisableInputHdcp.JoinNumber + joinIndex]);
+ trilist.SetSigTrueAction(joinMap.EnableInputHdcp.JoinNumber + joinIndex, () => EnableHdcp(i));
+ trilist.SetSigTrueAction(joinMap.DisableInputHdcp.JoinNumber + joinIndex, () => DisableHdcp(i));
+
+ //Serial
+ InputNameFeedbacks[InputNames[i]].LinkInputSig(trilist.StringInput[joinMap.InputName.JoinNumber + joinIndex]);
+ }
+
+ for (uint i = 1; i <= _Chassis.NumberOfOutputs; i++)
+ {
+ var joinIndex = i - 1;
+ //Analog
+ VideoOutputRouteFeedbacks[OutputNames[i]].LinkInputSig(trilist.UShortInput[joinMap.OutputRoute.JoinNumber + joinIndex]);
+ trilist.SetUShortSigAction(joinMap.OutputRoute.JoinNumber + joinIndex, (a) => ExecuteSwitch(a, i, eRoutingSignalType.AudioVideo));
+
+ //Serial
+ OutputNameFeedbacks[OutputNames[i]].LinkInputSig(trilist.StringInput[joinMap.OutputName.JoinNumber + joinIndex]);
+ OutputRouteNameFeedbacks[OutputNames[i]].LinkInputSig(trilist.StringInput[joinMap.OutputRoutedName.JoinNumber + joinIndex]);
+ }
+
+ _Chassis.OnlineStatusChange += new Crestron.SimplSharpPro.OnlineStatusChangeEventHandler(Chassis_OnlineStatusChange);
+
+ trilist.OnlineStatusChange += new Crestron.SimplSharpPro.OnlineStatusChangeEventHandler((d, args) =>
+ {
+ if (args.DeviceOnLine)
+ {
+ foreach (var feedback in Feedbacks)
+ {
+ feedback.FireUpdate();
+ }
+ }
+ });
+ }
+
+
+ #endregion
+
+ #region Events
+
+ void Chassis_OnlineStatusChange(Crestron.SimplSharpPro.GenericBase currentDevice, Crestron.SimplSharpPro.OnlineOfflineEventArgs args)
+ {
+ if (args.DeviceOnLine)
+ {
+ for (uint i = 1; i <= _Chassis.NumberOfInputs; i++)
+ {
+ _Chassis.Inputs[i].Name.StringValue = InputNames[i];
+ }
+ for (uint i = 1; i <= _Chassis.NumberOfOutputs; i++)
+ {
+ _Chassis.Outputs[i].Name.StringValue = OutputNames[i];
+ }
+
+ foreach (var feedback in Feedbacks)
+ {
+ feedback.FireUpdate();
+ }
+ }
+
+ }
+
+ void Chassis_DMOutputChange(Switch device, DMOutputEventArgs args)
+ {
+ if (args.EventId == DMOutputEventIds.VideoOutEventId)
+ {
+ foreach (var item in VideoOutputRouteFeedbacks)
+ {
+ item.FireUpdate();
+ }
+ }
+ }
+
+ void Chassis_DMInputChange(Switch device, DMInputEventArgs args)
+ {
+ if (args.EventId == DMInputEventIds.VideoDetectedEventId)
+ {
+ foreach (var item in VideoInputSyncFeedbacks)
+ {
+ item.FireUpdate();
+ }
+ }
+ }
+
+ #endregion
+
+ #region Factory
+
+ public class HdMdNxM4kEControllerFactory : EssentialsDeviceFactory
+ {
+ public HdMdNxM4kEControllerFactory()
+ {
+ TypeNames = new List() { "hdmd4x14ke-bridgeable", "hdmd4x24ke", "hdmd6x24ke" };
+ }
+
+ public override EssentialsDevice BuildDevice(DeviceConfig dc)
+ {
+ Debug.Console(1, "Factory Attempting to create new HD-MD-NxM-4K-E Device");
+
+ var props = JsonConvert.DeserializeObject(dc.Properties.ToString());
+
+ var type = dc.Type.ToLower();
+ var control = props.Control;
+ var ipid = control.IpIdInt;
+ var address = control.TcpSshProperties.Address;
+
+ switch (type)
+ {
+ case ("hdmd4x14ke-bridgeable"):
+ return new HdMdNxM4kEBridgeableController(dc.Key, dc.Name, new HdMd4x14kE(ipid, address, Global.ControlSystem), props);
+ case ("hdmd4x24ke"):
+ return new HdMdNxM4kEBridgeableController(dc.Key, dc.Name, new HdMd4x24kE(ipid, address, Global.ControlSystem), props);
+ case ("hdmd6x24ke"):
+ return new HdMdNxM4kEBridgeableController(dc.Key, dc.Name, new HdMd6x24kE(ipid, address, Global.ControlSystem), props);
+ default:
+ return null;
+ }
+ }
+ }
+
+ #endregion
+
+
+
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/HdMdNxM4kEController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/HdMdNxM4kEController.cs
index 4ee4ecc8..fff3b112 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Chassis/HdMdNxM4kEController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/HdMdNxM4kEController.cs
@@ -1,125 +1,128 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-using Crestron.SimplSharpPro.DM;
-
-using PepperDash.Core;
-using PepperDash.Essentials.Core;
-using PepperDash.Essentials.DM.Config;
-
-namespace PepperDash.Essentials.DM.Chassis
-{
- public class HdMdNxM4kEController : Device, IRoutingInputsOutputs, IRouting
- {
- public HdMdNxM Chassis { get; private set; }
-
- public RoutingPortCollection InputPorts { get; private set; }
- public RoutingPortCollection OutputPorts { get; private set; }
-
-
- ///
- ///
- ///
- ///
- ///
- ///
- public HdMdNxM4kEController(string key, string name, HdMdNxM chassis,
- HdMdNxM4kEPropertiesConfig props)
- : base(key, name)
- {
- Chassis = chassis;
-
- // logical ports
- InputPorts = new RoutingPortCollection();
- for (uint i = 1; i <= 4; i++)
- {
- InputPorts.Add(new RoutingInputPort("hdmiIn" + i, eRoutingSignalType.Audio | eRoutingSignalType.Video,
- eRoutingPortConnectionType.Hdmi, i, this));
- }
- OutputPorts = new RoutingPortCollection();
- OutputPorts.Add(new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
- eRoutingPortConnectionType.Hdmi, null, this));
-
- // physical settings
- if (props != null && props.Inputs != null)
- {
- foreach (var kvp in props.Inputs)
- {
- // strip "hdmiIn"
- var inputNum = Convert.ToUInt32(kvp.Key.Substring(6));
-
- var port = chassis.HdmiInputs[inputNum].HdmiInputPort;
- // set hdcp disables
- if (kvp.Value.DisableHdcp)
- {
- Debug.Console(0, this, "Configuration disables HDCP support on {0}", kvp.Key);
- port.HdcpSupportOff();
- }
- else
- port.HdcpSupportOn();
- }
- }
- }
-
- public override bool CustomActivate()
- {
- var result = Chassis.Register();
- if (result != Crestron.SimplSharpPro.eDeviceRegistrationUnRegistrationResponse.Success)
- {
- Debug.Console(0, this, "Device registration failed: {0}", result);
- return false;
- }
-
- return base.CustomActivate();
- }
-
-
-
- #region IRouting Members
-
- public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
- {
- // Try to make switch only when necessary. The unit appears to toggle when already selected.
- var current = Chassis.HdmiOutputs[1].VideoOut;
- if(current != Chassis.HdmiInputs[(uint)inputSelector])
- Chassis.HdmiOutputs[1].VideoOut = Chassis.HdmiInputs[(uint)inputSelector];
- }
-
- #endregion
-
- /////////////////////////////////////////////////////
-
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public static HdMdNxM4kEController GetController(string key, string name,
- string type, HdMdNxM4kEPropertiesConfig properties)
- {
- try
- {
- var ipid = properties.Control.IpIdInt;
- var address = properties.Control.TcpSshProperties.Address;
-
- type = type.ToLower();
- if (type == "hdmd4x14ke")
- {
- var chassis = new HdMd4x14kE(ipid, address, Global.ControlSystem);
- return new HdMdNxM4kEController(key, name, chassis, properties);
- }
- return null;
- }
- catch (Exception e)
- {
- Debug.Console(0, "ERROR Creating device key {0}: \r{1}", key, e);
- return null;
- }
- }
- }
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using Crestron.SimplSharpPro.DM;
+
+using PepperDash.Core;
+using PepperDash.Essentials.Core;
+using PepperDash.Essentials.DM.Config;
+
+namespace PepperDash.Essentials.DM.Chassis
+{
+ public class HdMdNxM4kEController : Device, IRoutingInputsOutputs, IRouting
+ {
+ public HdMdNxM Chassis { get; private set; }
+
+ public RoutingPortCollection InputPorts { get; private set; }
+ public RoutingPortCollection OutputPorts { get; private set; }
+
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public HdMdNxM4kEController(string key, string name, HdMdNxM chassis,
+ HdMdNxM4kEPropertiesConfig props)
+ : base(key, name)
+ {
+ Chassis = chassis;
+
+ // logical ports
+ InputPorts = new RoutingPortCollection();
+ for (uint i = 1; i <= 4; i++)
+ {
+ InputPorts.Add(new RoutingInputPort("hdmiIn" + i, eRoutingSignalType.Audio | eRoutingSignalType.Video,
+ eRoutingPortConnectionType.Hdmi, i, this));
+ }
+ OutputPorts = new RoutingPortCollection();
+ OutputPorts.Add(new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
+ eRoutingPortConnectionType.Hdmi, null, this));
+
+ // physical settings
+ if (props != null && props.Inputs != null)
+ {
+ foreach (var kvp in props.Inputs)
+ {
+ // strip "hdmiIn"
+ var inputNum = Convert.ToUInt32(kvp.Key.Substring(6));
+
+ var port = chassis.HdmiInputs[inputNum].HdmiInputPort;
+ // set hdcp disables
+ if (kvp.Value.DisableHdcp)
+ {
+ Debug.Console(0, this, "Configuration disables HDCP support on {0}", kvp.Key);
+ port.HdcpSupportOff();
+ }
+ else
+ port.HdcpSupportOn();
+ }
+ }
+ }
+
+ public override bool CustomActivate()
+ {
+ var result = Chassis.Register();
+ if (result != Crestron.SimplSharpPro.eDeviceRegistrationUnRegistrationResponse.Success)
+ {
+ Debug.Console(0, this, "Device registration failed: {0}", result);
+ return false;
+ }
+
+ return base.CustomActivate();
+ }
+
+
+
+ #region IRouting Members
+
+ public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
+ {
+ // Try to make switch only when necessary. The unit appears to toggle when already selected.
+ var current = Chassis.HdmiOutputs[1].VideoOut;
+ if (current != Chassis.HdmiInputs[(uint)inputSelector])
+ Chassis.HdmiOutputs[1].VideoOut = Chassis.HdmiInputs[(uint)inputSelector];
+ }
+
+ #endregion
+
+ /////////////////////////////////////////////////////
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static HdMdNxM4kEController GetController(string key, string name,
+ string type, HdMdNxM4kEPropertiesConfig properties)
+ {
+ try
+ {
+ var ipid = properties.Control.IpIdInt;
+ var address = properties.Control.TcpSshProperties.Address;
+
+ type = type.ToLower();
+ if (type == "hdmd4x14ke")
+ {
+ Debug.Console(0, @"The 'hdmd4x14ke' device is not an Essentials Bridgeable device.
+ If an essentials Bridgeable Device is required, use the 'hdmd4x14ke-bridgeable' type");
+
+ var chassis = new HdMd4x14kE(ipid, address, Global.ControlSystem);
+ return new HdMdNxM4kEController(key, name, chassis, properties);
+ }
+ return null;
+ }
+ catch (Exception e)
+ {
+ Debug.Console(0, "ERROR Creating device key {0}: \r{1}", key, e);
+ return null;
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Config/HdMdNxM4kEPropertiesConfig.cs b/essentials-framework/Essentials DM/Essentials_DM/Config/HdMdNxM4kEPropertiesConfig.cs
index 06411e39..f222694a 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Config/HdMdNxM4kEPropertiesConfig.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Config/HdMdNxM4kEPropertiesConfig.cs
@@ -8,16 +8,28 @@ using Newtonsoft.Json;
using PepperDash.Core;
namespace PepperDash.Essentials.DM.Config
-{
- ///
- /// Defines the properties section of HdMdNxM boxes
- ///
- public class HdMdNxM4kEPropertiesConfig
- {
- [JsonProperty("control")]
- public ControlPropertiesConfig Control { get; set; }
-
- [JsonProperty("inputs")]
- public Dictionary Inputs { get; set; }
- }
+{
+ ///
+ /// Defines the properties section of HdMdNxM boxes
+ ///
+ public class HdMdNxM4kEPropertiesConfig
+ {
+ [JsonProperty("control")]
+ public ControlPropertiesConfig Control { get; set; }
+
+ [JsonProperty("inputs")]
+ public Dictionary Inputs { get; set; }
+ }
+
+ public class HdMdNxM4kEBridgeablePropertiesConfig
+ {
+ [JsonProperty("control")]
+ public ControlPropertiesConfig Control { get; set; }
+
+ [JsonProperty("inputs")]
+ public Dictionary Inputs { get; set; }
+
+ [JsonProperty("outputs")]
+ public Dictionary Outputs { get; set; }
+ }
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Config/InputPropertiesConfig.cs b/essentials-framework/Essentials DM/Essentials_DM/Config/InputPropertiesConfig.cs
index 40f958ec..c95c359f 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Config/InputPropertiesConfig.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Config/InputPropertiesConfig.cs
@@ -1,15 +1,16 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-
-namespace PepperDash.Essentials.DM.Config
-{
- public class InputPropertiesConfig
- {
- public string Name { get; set; }
-
- public bool DisableHdcp { get; set; }
- }
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Essentials.DM.Config
+{
+ public class InputPropertiesConfig
+ {
+ public string Name { get; set; }
+
+ public bool DisableHdcp { get; set; }
+ }
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/DGEs/Dge100Controller.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/DGEs/Dge100Controller.cs
index 4a335c39..dd07f696 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/DGEs/Dge100Controller.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/DGEs/Dge100Controller.cs
@@ -18,9 +18,7 @@ using Crestron.SimplSharpPro.DeviceSupport;
namespace PepperDash.Essentials.DM.Endpoints.DGEs
{
- ///
- /// Wrapper class for DGE-100 and DM-DGE-200-C
- ///
+ [Description("Wrapper class for DGE-100")]
public class Dge100Controller : CrestronGenericBaseDevice, IComPorts, IIROutputPorts, IHasBasicTriListWithSmartObject, ICec
{
private readonly Dge100 _dge;
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/DGEs/DmDge200CController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/DGEs/DmDge200CController.cs
index d4539e53..31da45b2 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/DGEs/DmDge200CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/DGEs/DmDge200CController.cs
@@ -20,6 +20,7 @@ namespace PepperDash.Essentials.DM.Endpoints.DGEs
///
/// Wrapper class for DGE-100 and DM-DGE-200-C
///
+ [Description("Wrapper class for DM-DGE-200-C")]
public class DmDge200CController : Dge100Controller, IRoutingInputsOutputs
{
private readonly DmDge200C _dge;
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc100SController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc100SController.cs
index 876880d1..b67b6584 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc100SController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc100SController.cs
@@ -11,7 +11,8 @@ namespace PepperDash.Essentials.DM
///
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
///
- ///
+ ///
+ [Description("Wrapper Class for DM-RMC-100-S")]
public class DmRmc100SController : DmRmcControllerBase, IRoutingInputsOutputs,
IIROutputPorts, IComPorts, ICec
{
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc150SController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc150SController.cs
index 9803b5b8..f33dd5be 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc150SController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc150SController.cs
@@ -11,7 +11,8 @@ namespace PepperDash.Essentials.DM
///
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
///
- ///
+ ///
+ [Description("Wrapper Class for DM-RMC-150-S")]
public class DmRmc150SController : DmRmcControllerBase, IRoutingInputsOutputs,
IIROutputPorts, IComPorts, ICec
{
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc200CController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc200CController.cs
index 27187bcd..ed5bd378 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc200CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc200CController.cs
@@ -12,8 +12,9 @@ namespace PepperDash.Essentials.DM
///
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
///
- ///
- public class DmRmc200CController : DmRmcControllerBase, IRoutingInputsOutputs,
+ ///
+ [Description("Wrapper Class for DM-RMC-200-C")]
+ public class DmRmc200CController : DmRmcControllerBase, IRoutingInputsOutputs,
IIROutputPorts, IComPorts, ICec
{
private readonly DmRmc200C _rmc;
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc200S2Controller.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc200S2Controller.cs
index c909098f..6633af15 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc200S2Controller.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc200S2Controller.cs
@@ -12,7 +12,8 @@ namespace PepperDash.Essentials.DM
///
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
///
- ///
+ ///
+ [Description("Wrapper Class for DM-RMC-200-S2")]
public class DmRmc200S2Controller : DmRmcControllerBase, IRoutingInputsOutputs,
IIROutputPorts, IComPorts, ICec
{
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc200SController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc200SController.cs
index 8d53964b..4ccae3e9 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc200SController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc200SController.cs
@@ -12,8 +12,9 @@ namespace PepperDash.Essentials.DM
///
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
///
- ///
- public class DmRmc200SController : DmRmcControllerBase, IRoutingInputsOutputs,
+ ///
+ [Description("Wrapper Class for DM-RMC-200-S")]
+ public class DmRmc200SController : DmRmcControllerBase, IRoutingInputsOutputs,
IIROutputPorts, IComPorts, ICec
{
private readonly DmRmc200S _rmc;
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4KScalerCController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4KScalerCController.cs
index 850f7458..052f0726 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4KScalerCController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4KScalerCController.cs
@@ -12,8 +12,9 @@ namespace PepperDash.Essentials.DM
///
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
///
- ///
- public class DmRmc4kScalerCController : DmRmcControllerBase, IRoutingInputsOutputs, IBasicVolumeWithFeedback,
+ ///
+ [Description("Wrapper Class for DM-RMC-4K-SCALER-C")]
+ public class DmRmc4kScalerCController : DmRmcControllerBase, IRoutingInputsOutputs, IBasicVolumeWithFeedback,
IIROutputPorts, IComPorts, ICec, IRelayPorts
{
private readonly DmRmc4kScalerC _rmc;
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4k100C1GController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4k100C1GController.cs
index b2762c97..92af7ce1 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4k100C1GController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4k100C1GController.cs
@@ -6,7 +6,9 @@ using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.DM
-{
+{
+
+ [Description("Wrapper Class for DM-RMC-4K-100-C-1G")]
public class DmRmc4k100C1GController : DmHdBaseTControllerBase, IRoutingInputsOutputs,
IIROutputPorts, IComPorts, ICec
{
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4kScalerCDspController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4kScalerCDspController.cs
index e63ad5de..a7c83e35 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4kScalerCDspController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4kScalerCDspController.cs
@@ -12,7 +12,8 @@ namespace PepperDash.Essentials.DM
///
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
///
- ///
+ ///
+ [Description("Wrapper Class for DM-RMC-4K-SCALER-C-DSP")]
public class DmRmc4kScalerCDspController : DmRmcControllerBase, IRoutingInputsOutputs, IBasicVolumeWithFeedback,
IIROutputPorts, IComPorts, ICec, IRelayPorts
{
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4kZ100CController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4kZ100CController.cs
index 3d7ef855..febcc9dc 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4kZ100CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4kZ100CController.cs
@@ -7,7 +7,8 @@ using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Bridges;
namespace PepperDash.Essentials.DM
-{
+{
+ [Description("Wrapper Class for DM-RMC-4K-Z-100-C")]
public class DmRmc4kZ100CController : DmRmcX100CController
{
private readonly DmRmc4kz100C _rmc;
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 81fcf69b..70afc5eb 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4kZScalerCController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4kZScalerCController.cs
@@ -11,6 +11,7 @@ using PepperDash.Core;
namespace PepperDash.Essentials.DM
{
+ [Description("Wrapper Class for DM-RMC-4K-Z-SCALER-C")]
public class DmRmc4kZScalerCController : DmRmcControllerBase, IRmcRouting,
IIROutputPorts, IComPorts, ICec
{
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 8b2c1e98..d1f2daa1 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcScalerCController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcScalerCController.cs
@@ -12,8 +12,9 @@ namespace PepperDash.Essentials.DM
///
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
///
- ///
- public class DmRmcScalerCController : DmRmcControllerBase, IRoutingInputsOutputs,
+ ///
+ [Description("Wrapper Class for DM-RMC-SCALER-C")]
+ public class DmRmcScalerCController : DmRmcControllerBase, IRoutingInputsOutputs,
IIROutputPorts, IComPorts, ICec
{
private readonly DmRmcScalerC _rmc;
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcScalerS2Controller.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcScalerS2Controller.cs
index 1e014063..249a891b 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcScalerS2Controller.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcScalerS2Controller.cs
@@ -12,7 +12,8 @@ namespace PepperDash.Essentials.DM
///
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
///
- ///
+ ///
+ [Description("Wrapper Class for DM-RMC-SCALER-S2")]
public class DmRmcScalerS2Controller : DmRmcControllerBase, IRoutingInputsOutputs,
IIROutputPorts, IComPorts, ICec
{
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcScalerSController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcScalerSController.cs
index ba0f1ad7..bbf64796 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcScalerSController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcScalerSController.cs
@@ -12,7 +12,8 @@ namespace PepperDash.Essentials.DM
///
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
///
- ///
+ ///
+ [Description("Wrapper Class for DM-RMC-SCALER-S")]
public class DmRmcScalerSController : DmRmcControllerBase, IRoutingInputsOutputs,
IIROutputPorts, IComPorts, ICec
{
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcX100CController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcX100CController.cs
index 6fa713ad..920c056f 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcX100CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcX100CController.cs
@@ -11,8 +11,9 @@ namespace PepperDash.Essentials.DM
///
/// Builds a controller for basic DM-RMCs (both 4K and non-4K) with Com and IR ports and no control functions
///
- ///
- public class DmRmcX100CController : DmRmcControllerBase, IRoutingInputsOutputs,
+ ///
+ [Description("Wrapper Class for DM-RMC-4K-100-C & DM-RMC-100-C")]
+ public class DmRmcX100CController : DmRmcControllerBase, IRoutingInputsOutputs,
IIROutputPorts, IComPorts, ICec
{
private readonly DmRmc100C _rmc;
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx200Controller.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx200Controller.cs
index cbe3ebcc..4a83454b 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx200Controller.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx200Controller.cs
@@ -16,7 +16,7 @@ namespace PepperDash.Essentials.DM
///
/// Controller class for all DM-TX-201C/S/F transmitters
///
- [Description("Wrapper class for DM-TX-200-C Endpoint")]
+ [Description("Wrapper class for DM-TX-200-C")]
public class DmTx200Controller : DmTxControllerBase, ITxRouting, IHasFreeRun, IVgaBrightnessContrastControls
{
public DmTx200C2G Tx { get; private set; }
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx201CController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx201CController.cs
index dcf5c068..c0336fc5 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx201CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx201CController.cs
@@ -14,7 +14,7 @@ namespace PepperDash.Essentials.DM
///
/// Controller class for all DM-TX-201C/S/F transmitters
///
- [Description("Wrapper class for DM-TX-201-C Endpoint")]
+ [Description("Wrapper class for DM-TX-201-C")]
public class DmTx201CController : DmTxControllerBase, ITxRouting, IHasFreeRun, IVgaBrightnessContrastControls
{
public DmTx201C Tx { get; private set; }
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx201SController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx201SController.cs
index 27e78256..9780edb9 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx201SController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx201SController.cs
@@ -14,7 +14,7 @@ namespace PepperDash.Essentials.DM
///
/// Controller class for all DM-TX-201S/F transmitters
///
- [Description("Wrapper class for DM-TX-201-S/F Endpoint")]
+ [Description("Wrapper class for DM-TX-201-S/F")]
public class DmTx201SController : DmTxControllerBase, ITxRouting, IHasFreeRun, IVgaBrightnessContrastControls
{
public DmTx201S Tx { get; private set; }
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx401CController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx401CController.cs
index c47dc4ac..b74cb13e 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx401CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx401CController.cs
@@ -17,8 +17,9 @@ using PepperDash.Essentials.DM.Config;
namespace PepperDash.Essentials.DM
{
- using eVst = DmTx401C.eSourceSelection;
-
+ using eVst = DmTx401C.eSourceSelection;
+
+ [Description("Wrapper class for DM-TX-401-C")]
public class DmTx401CController : DmTxControllerBase, ITxRouting, IIROutputPorts, IComPorts, IHasFreeRun, IVgaBrightnessContrastControls
{
public DmTx401C Tx { get; private set; }
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k100Controller.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k100Controller.cs
index 12889528..28e55a4a 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k100Controller.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k100Controller.cs
@@ -9,8 +9,9 @@ using PepperDash.Essentials.Core.Bridges;
namespace PepperDash.Essentials.DM
{
using eVst = eX02VideoSourceType;
- using eAst = eX02AudioSourceType;
-
+ using eAst = eX02AudioSourceType;
+
+ [Description("Wrapper class for DM-TX-4K-100-C-1G")]
public class DmTx4k100Controller : DmTxControllerBase, IRoutingInputsOutputs,
IIROutputPorts, IComPorts, ICec
{
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k202CController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k202CController.cs
index 0486e2c7..9e1084b4 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k202CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k202CController.cs
@@ -1,367 +1,369 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-using Crestron.SimplSharpPro;
-//using Crestron.SimplSharpPro.DeviceSupport;
-using Crestron.SimplSharpPro.DeviceSupport;
-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.Core.Bridges;
-using PepperDash.Essentials.DM.Config;
-
-namespace PepperDash.Essentials.DM
-{
- using eVst = Crestron.SimplSharpPro.DeviceSupport.eX02VideoSourceType;
- using eAst = Crestron.SimplSharpPro.DeviceSupport.eX02AudioSourceType;
-
- public class DmTx4k202CController : DmTxControllerBase, ITxRouting, IHasFeedback,
- IIROutputPorts, IComPorts
- {
- public DmTx4k202C Tx { get; private set; }
-
- public RoutingInputPortWithVideoStatuses HdmiIn1 { get; private set; }
- public RoutingInputPortWithVideoStatuses HdmiIn2 { get; private set; }
- public RoutingOutputPort DmOut { get; private set; }
- public RoutingOutputPort HdmiLoopOut { get; private set; }
-
- public override StringFeedback ActiveVideoInputFeedback { get; protected set; }
- public IntFeedback VideoSourceNumericFeedback { get; protected set; }
- public IntFeedback AudioSourceNumericFeedback { get; protected set; }
- public IntFeedback HdmiIn1HdcpCapabilityFeedback { get; protected set; }
- public IntFeedback HdmiIn2HdcpCapabilityFeedback { get; protected set; }
- public BoolFeedback Hdmi1VideoSyncFeedback { get; protected set; }
- public BoolFeedback Hdmi2VideoSyncFeedback { get; protected set; }
-
- //public override IntFeedback HdcpSupportAllFeedback { get; protected set; }
- //public override ushort HdcpSupportCapability { get; protected set; }
-
- ///
- /// Helps get the "real" inputs, including when in Auto
- ///
- public Crestron.SimplSharpPro.DeviceSupport.eX02VideoSourceType ActualActiveVideoInput
- {
- get
- {
- if (Tx.VideoSourceFeedback != eVst.Auto)
- return Tx.VideoSourceFeedback;
- else // auto
- {
- if (Tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue)
- return eVst.Hdmi1;
- else if (Tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue)
- return eVst.Hdmi2;
- else
- return eVst.AllDisabled;
- }
- }
- }
- public RoutingPortCollection InputPorts
- {
- get
- {
- return new RoutingPortCollection
- {
- HdmiIn1,
- HdmiIn2,
- AnyVideoInput
- };
- }
- }
- public RoutingPortCollection OutputPorts
- {
- get
- {
- return new RoutingPortCollection { DmOut, HdmiLoopOut };
- }
- }
- public DmTx4k202CController(string key, string name, DmTx4k202C tx)
- : base(key, name, tx)
- {
- Tx = tx;
-
- HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
- eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
- VideoStatusHelper.GetHdmiInputStatusFuncs(tx.HdmiInputs[1]));
- HdmiIn2 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn2,
- eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi2, this,
- VideoStatusHelper.GetHdmiInputStatusFuncs(tx.HdmiInputs[2]));
- ActiveVideoInputFeedback = new StringFeedback("ActiveVideoInput",
- () => ActualActiveVideoInput.ToString());
-
-
-
- Tx.HdmiInputs[1].InputStreamChange += InputStreamChangeEvent;
- Tx.HdmiInputs[2].InputStreamChange += InputStreamChangeEvent;
- Tx.BaseEvent += Tx_BaseEvent;
-
- VideoSourceNumericFeedback = new IntFeedback(() => (int)Tx.VideoSourceFeedback);
-
- AudioSourceNumericFeedback = new IntFeedback(() => (int)Tx.AudioSourceFeedback);
-
- HdmiIn1HdcpCapabilityFeedback = new IntFeedback("HdmiIn1HdcpCapability", () => (int)tx.HdmiInputs[1].HdcpCapabilityFeedback);
-
- HdmiIn2HdcpCapabilityFeedback = new IntFeedback("HdmiIn2HdcpCapability", () => (int)tx.HdmiInputs[2].HdcpCapabilityFeedback);
-
- HdcpSupportCapability = eHdcpCapabilityType.Hdcp2_2Support;
-
- Hdmi1VideoSyncFeedback = new BoolFeedback(() => (bool)tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue);
-
- Hdmi2VideoSyncFeedback = new BoolFeedback(() => (bool)tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue);
-
- var combinedFuncs = new VideoStatusFuncsWrapper
- {
- HdcpActiveFeedbackFunc = () =>
- (ActualActiveVideoInput == eVst.Hdmi1
- && tx.HdmiInputs[1].VideoAttributes.HdcpActiveFeedback.BoolValue)
- || (ActualActiveVideoInput == eVst.Hdmi2
- && tx.HdmiInputs[2].VideoAttributes.HdcpActiveFeedback.BoolValue),
-
- HdcpStateFeedbackFunc = () =>
- {
- if (ActualActiveVideoInput == eVst.Hdmi1)
- return tx.HdmiInputs[1].VideoAttributes.HdcpStateFeedback.ToString();
- if (ActualActiveVideoInput == eVst.Hdmi2)
- return tx.HdmiInputs[2].VideoAttributes.HdcpStateFeedback.ToString();
- return "";
- },
-
- VideoResolutionFeedbackFunc = () =>
- {
- if (ActualActiveVideoInput == eVst.Hdmi1)
- return tx.HdmiInputs[1].VideoAttributes.GetVideoResolutionString();
- if (ActualActiveVideoInput == eVst.Hdmi2)
- return tx.HdmiInputs[2].VideoAttributes.GetVideoResolutionString();
- return "";
- },
- VideoSyncFeedbackFunc = () =>
- (ActualActiveVideoInput == eVst.Hdmi1
- && tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue)
- || (ActualActiveVideoInput == eVst.Hdmi2
- && tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue)
-
- };
-
- AnyVideoInput = new RoutingInputPortWithVideoStatuses(DmPortName.AnyVideoIn,
- eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.None, 0, this, combinedFuncs);
-
- DmOut = new RoutingOutputPort(DmPortName.DmOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
- eRoutingPortConnectionType.DmCat, null, this);
- HdmiLoopOut = new RoutingOutputPort(DmPortName.HdmiLoopOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
- eRoutingPortConnectionType.Hdmi, null, this);
-
-
- AddToFeedbackList(ActiveVideoInputFeedback, VideoSourceNumericFeedback, AudioSourceNumericFeedback,
- AnyVideoInput.VideoStatus.HasVideoStatusFeedback, AnyVideoInput.VideoStatus.HdcpActiveFeedback,
- AnyVideoInput.VideoStatus.HdcpStateFeedback, AnyVideoInput.VideoStatus.VideoResolutionFeedback,
- AnyVideoInput.VideoStatus.VideoSyncFeedback, HdmiIn1HdcpCapabilityFeedback, HdmiIn2HdcpCapabilityFeedback,
- Hdmi1VideoSyncFeedback, Hdmi2VideoSyncFeedback);
-
- // Set Ports for CEC
- HdmiIn1.Port = Tx.HdmiInputs[1];
- HdmiIn2.Port = Tx.HdmiInputs[2];
- HdmiLoopOut.Port = Tx.HdmiOutput;
- DmOut.Port = Tx.DmOutput;
- }
-
-
-
- public override bool CustomActivate()
- {
- // Link up all of these damned events to the various RoutingPorts via a helper handler
- Tx.HdmiInputs[1].InputStreamChange += (o, a) => FowardInputStreamChange(HdmiIn1, a.EventId);
- Tx.HdmiInputs[1].VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn1, a.EventId);
-
- Tx.HdmiInputs[2].InputStreamChange += (o, a) => FowardInputStreamChange(HdmiIn2, a.EventId);
- Tx.HdmiInputs[2].VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn2, a.EventId);
-
- // Base does register and sets up comm monitoring.
- return base.CustomActivate();
- }
-
- public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
- {
- var joinMap = GetDmTxJoinMap(joinStart, joinMapKey);
-
- if (Hdmi1VideoSyncFeedback != null)
- {
- Hdmi1VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input1VideoSyncStatus.JoinNumber]);
- }
- if (Hdmi2VideoSyncFeedback != null)
- {
- Hdmi2VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input2VideoSyncStatus.JoinNumber]);
- }
-
- LinkDmTxToApi(this, trilist, joinMap, bridge);
- }
-
- public void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type)
- {
- Debug.Console(2, this, "Executing Numeric Switch to input {0}.", input);
-
- switch (type)
- {
- case eRoutingSignalType.Video:
- switch (input)
- {
- case 0:
- {
- ExecuteSwitch(eVst.Auto, null, type);
- break;
- }
- case 1:
- {
- ExecuteSwitch(HdmiIn1.Selector, null, type);
- break;
- }
- case 2:
- {
- ExecuteSwitch(HdmiIn2.Selector, null, type);
- break;
- }
- case 3:
- {
- ExecuteSwitch(eVst.AllDisabled, null, type);
- break;
- }
- }
- break;
- case eRoutingSignalType.Audio:
- switch (input)
- {
- case 0:
- {
- ExecuteSwitch(eAst.Auto, null, type);
- break;
- }
- case 1:
- {
- ExecuteSwitch(eAst.Hdmi1, null, type);
- break;
- }
- case 2:
- {
- ExecuteSwitch(eAst.Hdmi2, null, type);
- break;
- }
- case 3:
- {
- ExecuteSwitch(eAst.AllDisabled, null, type);
- break;
- }
- }
- break;
- }
- }
-
- public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
- {
- if ((signalType | eRoutingSignalType.Video) == eRoutingSignalType.Video)
- Tx.VideoSource = (eVst)inputSelector;
- if ((signalType | eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
- Tx.AudioSource = (eAst)inputSelector;
- }
-
- void InputStreamChangeEvent(EndpointInputStream inputStream, EndpointInputStreamEventArgs args)
- {
- Debug.Console(2, "{0} event {1} stream {2}", this.Tx.ToString(), inputStream.ToString(), args.EventId.ToString());
-
- switch (args.EventId)
- {
- case EndpointInputStreamEventIds.HdcpSupportOffFeedbackEventId:
- if (inputStream == Tx.HdmiInputs[1]) HdmiIn1HdcpCapabilityFeedback.FireUpdate();
- if (inputStream == Tx.HdmiInputs[2]) HdmiIn2HdcpCapabilityFeedback.FireUpdate();
- break;
- case EndpointInputStreamEventIds.HdcpSupportOnFeedbackEventId:
- if (inputStream == Tx.HdmiInputs[1]) HdmiIn1HdcpCapabilityFeedback.FireUpdate();
- if (inputStream == Tx.HdmiInputs[2]) HdmiIn2HdcpCapabilityFeedback.FireUpdate();
- break;
- case EndpointInputStreamEventIds.SyncDetectedFeedbackEventId:
- if (inputStream == Tx.HdmiInputs[1]) Hdmi1VideoSyncFeedback.FireUpdate();
- if (inputStream == Tx.HdmiInputs[2]) Hdmi2VideoSyncFeedback.FireUpdate();
- break;
- }
- }
-
- void Tx_BaseEvent(GenericBase device, BaseEventArgs args)
- {
- var id = args.EventId;
- Debug.Console(2, this, "EventId {0}", args.EventId);
-
- switch (id)
- {
- case EndpointTransmitterBase.VideoSourceFeedbackEventId:
- Debug.Console(2, this, " Video Source: {0}", Tx.VideoSourceFeedback);
- ActiveVideoInputFeedback.FireUpdate();
- VideoSourceNumericFeedback.FireUpdate();
- ActiveVideoInputFeedback.FireUpdate();
- break;
- case EndpointTransmitterBase.AudioSourceFeedbackEventId:
- Debug.Console(2, this, " Audio Source : {0}", Tx.AudioSourceFeedback);
- AudioSourceNumericFeedback.FireUpdate();
- break;
- }
- }
-
- ///
- /// Relays the input stream change to the appropriate RoutingInputPort.
- ///
- void FowardInputStreamChange(RoutingInputPortWithVideoStatuses inputPort, int eventId)
- {
- if (eventId != EndpointInputStreamEventIds.SyncDetectedFeedbackEventId)
- {
- return;
- }
- inputPort.VideoStatus.VideoSyncFeedback.FireUpdate();
- AnyVideoInput.VideoStatus.VideoSyncFeedback.FireUpdate();
- }
-
- ///
- /// Relays the VideoAttributes change to a RoutingInputPort
- ///
- void ForwardVideoAttributeChange(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;
- case VideoAttributeEventIds.FramesPerSecondFeedbackEventId:
- inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate();
- AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate();
- break;
- }
- }
-
-
-
-
- #region IIROutputPorts Members
- public CrestronCollection IROutputPorts { get { return Tx.IROutputPorts; } }
- public int NumberOfIROutputPorts { get { return Tx.NumberOfIROutputPorts; } }
- #endregion
-
- #region IComPorts Members
- public CrestronCollection ComPorts { get { return Tx.ComPorts; } }
- public int NumberOfComPorts { get { return Tx.NumberOfComPorts; } }
- #endregion
- }
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using Crestron.SimplSharpPro;
+//using Crestron.SimplSharpPro.DeviceSupport;
+using Crestron.SimplSharpPro.DeviceSupport;
+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.Core.Bridges;
+using PepperDash.Essentials.DM.Config;
+
+namespace PepperDash.Essentials.DM
+{
+ using eVst = Crestron.SimplSharpPro.DeviceSupport.eX02VideoSourceType;
+ using eAst = Crestron.SimplSharpPro.DeviceSupport.eX02AudioSourceType;
+
+ [Description("Wrapper class for DM-TX-4K-202-C")]
+ public class DmTx4k202CController : DmTxControllerBase, ITxRouting, IHasFeedback,
+ IIROutputPorts, IComPorts
+ {
+ public DmTx4k202C Tx { get; private set; }
+
+ public RoutingInputPortWithVideoStatuses HdmiIn1 { get; private set; }
+ public RoutingInputPortWithVideoStatuses HdmiIn2 { get; private set; }
+ public RoutingOutputPort DmOut { get; private set; }
+ public RoutingOutputPort HdmiLoopOut { get; private set; }
+
+ public override StringFeedback ActiveVideoInputFeedback { get; protected set; }
+ public IntFeedback VideoSourceNumericFeedback { get; protected set; }
+ public IntFeedback AudioSourceNumericFeedback { get; protected set; }
+ public IntFeedback HdmiIn1HdcpCapabilityFeedback { get; protected set; }
+ public IntFeedback HdmiIn2HdcpCapabilityFeedback { get; protected set; }
+ public BoolFeedback Hdmi1VideoSyncFeedback { get; protected set; }
+ public BoolFeedback Hdmi2VideoSyncFeedback { get; protected set; }
+
+ //public override IntFeedback HdcpSupportAllFeedback { get; protected set; }
+ //public override ushort HdcpSupportCapability { get; protected set; }
+
+ ///
+ /// Helps get the "real" inputs, including when in Auto
+ ///
+ public Crestron.SimplSharpPro.DeviceSupport.eX02VideoSourceType ActualActiveVideoInput
+ {
+ get
+ {
+ if (Tx.VideoSourceFeedback != eVst.Auto)
+ return Tx.VideoSourceFeedback;
+ else // auto
+ {
+ if (Tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue)
+ return eVst.Hdmi1;
+ else if (Tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue)
+ return eVst.Hdmi2;
+ else
+ return eVst.AllDisabled;
+ }
+ }
+ }
+ public RoutingPortCollection InputPorts
+ {
+ get
+ {
+ return new RoutingPortCollection
+ {
+ HdmiIn1,
+ HdmiIn2,
+ AnyVideoInput
+ };
+ }
+ }
+ public RoutingPortCollection OutputPorts
+ {
+ get
+ {
+ return new RoutingPortCollection { DmOut, HdmiLoopOut };
+ }
+ }
+ public DmTx4k202CController(string key, string name, DmTx4k202C tx)
+ : base(key, name, tx)
+ {
+ Tx = tx;
+
+ HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
+ eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
+ VideoStatusHelper.GetHdmiInputStatusFuncs(tx.HdmiInputs[1]));
+ HdmiIn2 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn2,
+ eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi2, this,
+ VideoStatusHelper.GetHdmiInputStatusFuncs(tx.HdmiInputs[2]));
+ ActiveVideoInputFeedback = new StringFeedback("ActiveVideoInput",
+ () => ActualActiveVideoInput.ToString());
+
+
+
+ Tx.HdmiInputs[1].InputStreamChange += InputStreamChangeEvent;
+ Tx.HdmiInputs[2].InputStreamChange += InputStreamChangeEvent;
+
+ Tx.BaseEvent += Tx_BaseEvent;
+
+ VideoSourceNumericFeedback = new IntFeedback(() => (int)Tx.VideoSourceFeedback);
+
+ AudioSourceNumericFeedback = new IntFeedback(() => (int)Tx.AudioSourceFeedback);
+
+ HdmiIn1HdcpCapabilityFeedback = new IntFeedback("HdmiIn1HdcpCapability", () => (int)tx.HdmiInputs[1].HdcpCapabilityFeedback);
+
+ HdmiIn2HdcpCapabilityFeedback = new IntFeedback("HdmiIn2HdcpCapability", () => (int)tx.HdmiInputs[2].HdcpCapabilityFeedback);
+
+ HdcpSupportCapability = eHdcpCapabilityType.Hdcp2_2Support;
+
+ Hdmi1VideoSyncFeedback = new BoolFeedback(() => (bool)tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue);
+
+ Hdmi2VideoSyncFeedback = new BoolFeedback(() => (bool)tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue);
+
+ var combinedFuncs = new VideoStatusFuncsWrapper
+ {
+ HdcpActiveFeedbackFunc = () =>
+ (ActualActiveVideoInput == eVst.Hdmi1
+ && tx.HdmiInputs[1].VideoAttributes.HdcpActiveFeedback.BoolValue)
+ || (ActualActiveVideoInput == eVst.Hdmi2
+ && tx.HdmiInputs[2].VideoAttributes.HdcpActiveFeedback.BoolValue),
+
+ HdcpStateFeedbackFunc = () =>
+ {
+ if (ActualActiveVideoInput == eVst.Hdmi1)
+ return tx.HdmiInputs[1].VideoAttributes.HdcpStateFeedback.ToString();
+ if (ActualActiveVideoInput == eVst.Hdmi2)
+ return tx.HdmiInputs[2].VideoAttributes.HdcpStateFeedback.ToString();
+ return "";
+ },
+
+ VideoResolutionFeedbackFunc = () =>
+ {
+ if (ActualActiveVideoInput == eVst.Hdmi1)
+ return tx.HdmiInputs[1].VideoAttributes.GetVideoResolutionString();
+ if (ActualActiveVideoInput == eVst.Hdmi2)
+ return tx.HdmiInputs[2].VideoAttributes.GetVideoResolutionString();
+ return "";
+ },
+ VideoSyncFeedbackFunc = () =>
+ (ActualActiveVideoInput == eVst.Hdmi1
+ && tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue)
+ || (ActualActiveVideoInput == eVst.Hdmi2
+ && tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue)
+
+ };
+
+ AnyVideoInput = new RoutingInputPortWithVideoStatuses(DmPortName.AnyVideoIn,
+ eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.None, 0, this, combinedFuncs);
+
+ DmOut = new RoutingOutputPort(DmPortName.DmOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
+ eRoutingPortConnectionType.DmCat, null, this);
+ HdmiLoopOut = new RoutingOutputPort(DmPortName.HdmiLoopOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
+ eRoutingPortConnectionType.Hdmi, null, this);
+
+
+ AddToFeedbackList(ActiveVideoInputFeedback, VideoSourceNumericFeedback, AudioSourceNumericFeedback,
+ AnyVideoInput.VideoStatus.HasVideoStatusFeedback, AnyVideoInput.VideoStatus.HdcpActiveFeedback,
+ AnyVideoInput.VideoStatus.HdcpStateFeedback, AnyVideoInput.VideoStatus.VideoResolutionFeedback,
+ AnyVideoInput.VideoStatus.VideoSyncFeedback, HdmiIn1HdcpCapabilityFeedback, HdmiIn2HdcpCapabilityFeedback,
+ Hdmi1VideoSyncFeedback, Hdmi2VideoSyncFeedback);
+
+ // Set Ports for CEC
+ HdmiIn1.Port = Tx.HdmiInputs[1];
+ HdmiIn2.Port = Tx.HdmiInputs[2];
+ HdmiLoopOut.Port = Tx.HdmiOutput;
+ DmOut.Port = Tx.DmOutput;
+ }
+
+
+
+ public override bool CustomActivate()
+ {
+ // Link up all of these damned events to the various RoutingPorts via a helper handler
+ Tx.HdmiInputs[1].InputStreamChange += (o, a) => FowardInputStreamChange(HdmiIn1, a.EventId);
+ Tx.HdmiInputs[1].VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn1, a.EventId);
+
+ Tx.HdmiInputs[2].InputStreamChange += (o, a) => FowardInputStreamChange(HdmiIn2, a.EventId);
+ Tx.HdmiInputs[2].VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn2, a.EventId);
+
+ // Base does register and sets up comm monitoring.
+ return base.CustomActivate();
+ }
+
+ public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
+ {
+ var joinMap = GetDmTxJoinMap(joinStart, joinMapKey);
+
+ if (Hdmi1VideoSyncFeedback != null)
+ {
+ Hdmi1VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input1VideoSyncStatus.JoinNumber]);
+ }
+ if (Hdmi2VideoSyncFeedback != null)
+ {
+ Hdmi2VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input2VideoSyncStatus.JoinNumber]);
+ }
+
+ LinkDmTxToApi(this, trilist, joinMap, bridge);
+ }
+
+ public void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type)
+ {
+ Debug.Console(2, this, "Executing Numeric Switch to input {0}.", input);
+
+ switch (type)
+ {
+ case eRoutingSignalType.Video:
+ switch (input)
+ {
+ case 0:
+ {
+ ExecuteSwitch(eVst.Auto, null, type);
+ break;
+ }
+ case 1:
+ {
+ ExecuteSwitch(HdmiIn1.Selector, null, type);
+ break;
+ }
+ case 2:
+ {
+ ExecuteSwitch(HdmiIn2.Selector, null, type);
+ break;
+ }
+ case 3:
+ {
+ ExecuteSwitch(eVst.AllDisabled, null, type);
+ break;
+ }
+ }
+ break;
+ case eRoutingSignalType.Audio:
+ switch (input)
+ {
+ case 0:
+ {
+ ExecuteSwitch(eAst.Auto, null, type);
+ break;
+ }
+ case 1:
+ {
+ ExecuteSwitch(eAst.Hdmi1, null, type);
+ break;
+ }
+ case 2:
+ {
+ ExecuteSwitch(eAst.Hdmi2, null, type);
+ break;
+ }
+ case 3:
+ {
+ ExecuteSwitch(eAst.AllDisabled, null, type);
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
+ {
+ if ((signalType | eRoutingSignalType.Video) == eRoutingSignalType.Video)
+ Tx.VideoSource = (eVst)inputSelector;
+ if ((signalType | eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
+ Tx.AudioSource = (eAst)inputSelector;
+ }
+
+ void InputStreamChangeEvent(EndpointInputStream inputStream, EndpointInputStreamEventArgs args)
+ {
+ Debug.Console(2, "{0} event {1} stream {2}", this.Tx.ToString(), inputStream.ToString(), args.EventId.ToString());
+
+ switch (args.EventId)
+ {
+ case EndpointInputStreamEventIds.HdcpSupportOffFeedbackEventId:
+ if (inputStream == Tx.HdmiInputs[1]) HdmiIn1HdcpCapabilityFeedback.FireUpdate();
+ if (inputStream == Tx.HdmiInputs[2]) HdmiIn2HdcpCapabilityFeedback.FireUpdate();
+ break;
+ case EndpointInputStreamEventIds.HdcpSupportOnFeedbackEventId:
+ if (inputStream == Tx.HdmiInputs[1]) HdmiIn1HdcpCapabilityFeedback.FireUpdate();
+ if (inputStream == Tx.HdmiInputs[2]) HdmiIn2HdcpCapabilityFeedback.FireUpdate();
+ break;
+ case EndpointInputStreamEventIds.SyncDetectedFeedbackEventId:
+ if (inputStream == Tx.HdmiInputs[1]) Hdmi1VideoSyncFeedback.FireUpdate();
+ if (inputStream == Tx.HdmiInputs[2]) Hdmi2VideoSyncFeedback.FireUpdate();
+ break;
+ }
+ }
+
+ void Tx_BaseEvent(GenericBase device, BaseEventArgs args)
+ {
+ var id = args.EventId;
+ Debug.Console(2, this, "EventId {0}", args.EventId);
+
+ switch (id)
+ {
+ case EndpointTransmitterBase.VideoSourceFeedbackEventId:
+ Debug.Console(2, this, " Video Source: {0}", Tx.VideoSourceFeedback);
+ ActiveVideoInputFeedback.FireUpdate();
+ VideoSourceNumericFeedback.FireUpdate();
+ ActiveVideoInputFeedback.FireUpdate();
+ break;
+ case EndpointTransmitterBase.AudioSourceFeedbackEventId:
+ Debug.Console(2, this, " Audio Source : {0}", Tx.AudioSourceFeedback);
+ AudioSourceNumericFeedback.FireUpdate();
+ break;
+ }
+ }
+
+ ///
+ /// Relays the input stream change to the appropriate RoutingInputPort.
+ ///
+ void FowardInputStreamChange(RoutingInputPortWithVideoStatuses inputPort, int eventId)
+ {
+ if (eventId != EndpointInputStreamEventIds.SyncDetectedFeedbackEventId)
+ {
+ return;
+ }
+ inputPort.VideoStatus.VideoSyncFeedback.FireUpdate();
+ AnyVideoInput.VideoStatus.VideoSyncFeedback.FireUpdate();
+ }
+
+ ///
+ /// Relays the VideoAttributes change to a RoutingInputPort
+ ///
+ void ForwardVideoAttributeChange(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;
+ case VideoAttributeEventIds.FramesPerSecondFeedbackEventId:
+ inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate();
+ AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate();
+ break;
+ }
+ }
+
+
+
+
+ #region IIROutputPorts Members
+ public CrestronCollection IROutputPorts { get { return Tx.IROutputPorts; } }
+ public int NumberOfIROutputPorts { get { return Tx.NumberOfIROutputPorts; } }
+ #endregion
+
+ #region IComPorts Members
+ public CrestronCollection ComPorts { get { return Tx.ComPorts; } }
+ public int NumberOfComPorts { get { return Tx.NumberOfComPorts; } }
+ #endregion
+ }
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k302CController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k302CController.cs
index e2bc74de..9ddaabcc 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k302CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k302CController.cs
@@ -18,8 +18,9 @@ using PepperDash.Essentials.DM.Config;
namespace PepperDash.Essentials.DM
{
using eVst = Crestron.SimplSharpPro.DeviceSupport.eX02VideoSourceType;
- using eAst = Crestron.SimplSharpPro.DeviceSupport.eX02AudioSourceType;
-
+ using eAst = Crestron.SimplSharpPro.DeviceSupport.eX02AudioSourceType;
+
+ [Description("Wrapper class for DM-TX-4K-302-C")]
public class DmTx4k302CController : DmTxControllerBase, ITxRouting, IHasFeedback,
IIROutputPorts, IComPorts, IHasFreeRun, IVgaBrightnessContrastControls
{
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4kz100Controller.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4kz100Controller.cs
index dbe1c103..15084479 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4kz100Controller.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4kz100Controller.cs
@@ -21,6 +21,7 @@ namespace PepperDash.Essentials.DM
///
/// Controller class for all DM-TX-201C/S/F transmitters
///
+ [Description("Wrapper class for DM-TX-4K-Z-100-C")]
public class DmTx4kz100Controller : DmTxControllerBase, IRoutingInputsOutputs, IHasFeedback,
IIROutputPorts, IComPorts, ICec
{
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4kz302CController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4kz302CController.cs
index 9b4bd0aa..67534ea5 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4kz302CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4kz302CController.cs
@@ -1,358 +1,360 @@
-using Crestron.SimplSharpPro;
-//using Crestron.SimplSharpPro.DeviceSupport;
-using Crestron.SimplSharpPro.DeviceSupport;
-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.Core.Bridges;
-
-namespace PepperDash.Essentials.DM
-{
- using eVst = eX02VideoSourceType;
- using eAst = eX02AudioSourceType;
-
- public class DmTx4kz302CController : DmTxControllerBase, ITxRouting,
- IIROutputPorts, IComPorts
- {
- public DmTx4kz302C Tx { get; private set; }
-
- public RoutingInputPortWithVideoStatuses HdmiIn1 { get; private set; }
- public RoutingInputPortWithVideoStatuses HdmiIn2 { get; private set; }
- public RoutingInputPortWithVideoStatuses DisplayPortIn { get; private set; }
- public RoutingOutputPort DmOut { get; private set; }
- public RoutingOutputPort HdmiLoopOut { get; private set; }
-
- public override StringFeedback ActiveVideoInputFeedback { get; protected set; }
- public IntFeedback VideoSourceNumericFeedback { get; protected set; }
- public IntFeedback AudioSourceNumericFeedback { get; protected set; }
- public IntFeedback HdmiIn1HdcpCapabilityFeedback { get; protected set; }
- public IntFeedback HdmiIn2HdcpCapabilityFeedback { get; protected set; }
- public BoolFeedback Hdmi1VideoSyncFeedback { get; protected set; }
- public BoolFeedback Hdmi2VideoSyncFeedback { get; protected set; }
- public BoolFeedback DisplayPortVideoSyncFeedback { get; protected set; }
-
- //public override IntFeedback HdcpSupportAllFeedback { get; protected set; }
- //public override ushort HdcpSupportCapability { get; protected set; }
-
- ///
- /// Helps get the "real" inputs, including when in Auto
- ///
- public eX02VideoSourceType ActualActiveVideoInput
- {
- get
- {
- if (Tx.VideoSourceFeedback != eVst.Auto)
- return Tx.VideoSourceFeedback;
- if (Tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue)
- return eVst.Hdmi1;
- if (Tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue)
- return eVst.Hdmi2;
-
- return Tx.DisplayPortInput.SyncDetectedFeedback.BoolValue ? eVst.Vga : eVst.AllDisabled;
- }
- }
- public RoutingPortCollection InputPorts
- {
- get
- {
- return new RoutingPortCollection
- {
- HdmiIn1,
- HdmiIn2,
- DisplayPortIn,
- AnyVideoInput
- };
- }
- }
- public RoutingPortCollection OutputPorts
- {
- get
- {
- return new RoutingPortCollection { DmOut, HdmiLoopOut };
- }
- }
- public DmTx4kz302CController(string key, string name, DmTx4kz302C tx)
- : base(key, name, tx)
- {
- Tx = tx;
-
- HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
- eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
- VideoStatusHelper.GetHdmiInputStatusFuncs(tx.HdmiInputs[1]));
- HdmiIn2 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn2,
- eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi2, this,
- VideoStatusHelper.GetHdmiInputStatusFuncs(tx.HdmiInputs[2]));
- DisplayPortIn = new RoutingInputPortWithVideoStatuses(DmPortName.VgaIn,
- eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.DisplayPort, eVst.DisplayPort, this,
- VideoStatusHelper.GetDisplayPortInputStatusFuncs(tx.DisplayPortInput));
- ActiveVideoInputFeedback = new StringFeedback("ActiveVideoInput",
- () => ActualActiveVideoInput.ToString());
-
- Tx.HdmiInputs[1].InputStreamChange += InputStreamChangeEvent;
- Tx.HdmiInputs[2].InputStreamChange += InputStreamChangeEvent;
- Tx.DisplayPortInput.InputStreamChange += DisplayPortInputStreamChange;
- Tx.BaseEvent += Tx_BaseEvent;
-
- VideoSourceNumericFeedback = new IntFeedback(() => (int)Tx.VideoSourceFeedback);
- AudioSourceNumericFeedback = new IntFeedback(() => (int)Tx.VideoSourceFeedback);
-
- HdmiIn1HdcpCapabilityFeedback = new IntFeedback("HdmiIn1HdcpCapability", () => (int)tx.HdmiInputs[1].HdcpCapabilityFeedback);
-
- HdmiIn2HdcpCapabilityFeedback = new IntFeedback("HdmiIn2HdcpCapability", () => (int)tx.HdmiInputs[2].HdcpCapabilityFeedback);
-
- HdcpSupportCapability = eHdcpCapabilityType.Hdcp2_2Support;
-
- Hdmi1VideoSyncFeedback = new BoolFeedback(() => (bool)tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue);
-
- Hdmi2VideoSyncFeedback = new BoolFeedback(() => (bool)tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue);
-
- DisplayPortVideoSyncFeedback = new BoolFeedback(() => (bool)tx.DisplayPortInput.SyncDetectedFeedback.BoolValue);
-
-
- var combinedFuncs = new VideoStatusFuncsWrapper
- {
- HdcpActiveFeedbackFunc = () =>
- (ActualActiveVideoInput == eVst.Hdmi1
- && tx.HdmiInputs[1].VideoAttributes.HdcpActiveFeedback.BoolValue)
- || (ActualActiveVideoInput == eVst.Hdmi2
- && tx.HdmiInputs[2].VideoAttributes.HdcpActiveFeedback.BoolValue),
-
- HdcpStateFeedbackFunc = () =>
- {
- if (ActualActiveVideoInput == eVst.Hdmi1)
- return tx.HdmiInputs[1].VideoAttributes.HdcpStateFeedback.ToString();
- return ActualActiveVideoInput == eVst.Hdmi2 ? tx.HdmiInputs[2].VideoAttributes.HdcpStateFeedback.ToString() : "";
- },
-
- VideoResolutionFeedbackFunc = () =>
- {
- if (ActualActiveVideoInput == eVst.Hdmi1)
- return tx.HdmiInputs[1].VideoAttributes.GetVideoResolutionString();
- if (ActualActiveVideoInput == eVst.Hdmi2)
- return tx.HdmiInputs[2].VideoAttributes.GetVideoResolutionString();
- return ActualActiveVideoInput == eVst.Vga ? tx.DisplayPortInput.VideoAttributes.GetVideoResolutionString() : "";
- },
- VideoSyncFeedbackFunc = () =>
- (ActualActiveVideoInput == eVst.Hdmi1
- && tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue)
- || (ActualActiveVideoInput == eVst.Hdmi2
- && tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue)
- || (ActualActiveVideoInput == eVst.Vga
- && tx.DisplayPortInput.SyncDetectedFeedback.BoolValue)
-
- };
-
- AnyVideoInput = new RoutingInputPortWithVideoStatuses(DmPortName.AnyVideoIn,
- eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.None, 0, this, combinedFuncs);
-
- DmOut = new RoutingOutputPort(DmPortName.DmOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
- eRoutingPortConnectionType.DmCat, null, this);
- HdmiLoopOut = new RoutingOutputPort(DmPortName.HdmiLoopOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
- eRoutingPortConnectionType.Hdmi, null, this);
-
-
- AddToFeedbackList(ActiveVideoInputFeedback, VideoSourceNumericFeedback, AudioSourceNumericFeedback,
- AnyVideoInput.VideoStatus.HasVideoStatusFeedback, AnyVideoInput.VideoStatus.HdcpActiveFeedback,
- AnyVideoInput.VideoStatus.HdcpStateFeedback, AnyVideoInput.VideoStatus.VideoResolutionFeedback,
- AnyVideoInput.VideoStatus.VideoSyncFeedback, HdmiIn1HdcpCapabilityFeedback, HdmiIn2HdcpCapabilityFeedback,
- Hdmi1VideoSyncFeedback, Hdmi2VideoSyncFeedback, DisplayPortVideoSyncFeedback);
-
- // Set Ports for CEC
- HdmiIn1.Port = Tx.HdmiInputs[1];
- HdmiIn2.Port = Tx.HdmiInputs[2];
- HdmiLoopOut.Port = Tx.HdmiOutput;
- DmOut.Port = Tx.DmOutput;
- }
-
- void DisplayPortInputStreamChange(EndpointInputStream inputStream, EndpointInputStreamEventArgs args)
- {
- Debug.Console(2, "{0} event {1} stream {2}", Tx.ToString(), inputStream.ToString(), args.EventId.ToString());
-
- switch (args.EventId)
- {
- case EndpointInputStreamEventIds.SyncDetectedFeedbackEventId:
- DisplayPortVideoSyncFeedback.FireUpdate();
- break;
- }
- }
-
-
-
- public override bool CustomActivate()
- {
- // Link up all of these damned events to the various RoutingPorts via a helper handler
- Tx.HdmiInputs[1].InputStreamChange += (o, a) => FowardInputStreamChange(HdmiIn1, a.EventId);
- Tx.HdmiInputs[1].VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn1, a.EventId);
-
- Tx.HdmiInputs[2].InputStreamChange += (o, a) => FowardInputStreamChange(HdmiIn2, a.EventId);
- Tx.HdmiInputs[2].VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn2, a.EventId);
-
- Tx.DisplayPortInput.InputStreamChange += (o, a) => FowardInputStreamChange(DisplayPortIn, a.EventId);
- Tx.DisplayPortInput.VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(DisplayPortIn, a.EventId);
-
- // Base does register and sets up comm monitoring.
- return base.CustomActivate();
- }
-
- public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
- {
- var joinMap = GetDmTxJoinMap(joinStart, joinMapKey);
-
- if (Hdmi1VideoSyncFeedback != null)
- {
- Hdmi1VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input1VideoSyncStatus.JoinNumber]);
- }
- if (Hdmi2VideoSyncFeedback != null)
- {
- Hdmi2VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input2VideoSyncStatus.JoinNumber]);
- }
- if (DisplayPortVideoSyncFeedback != null)
- {
- DisplayPortVideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input3VideoSyncStatus.JoinNumber]);
- }
-
- LinkDmTxToApi(this, trilist, joinMap, bridge);
- }
-
- public void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type)
- {
- Debug.Console(2, this, "Executing Numeric Switch to input {0}.", input);
-
- switch (input)
- {
- case 0:
- {
- ExecuteSwitch(eVst.Auto, null, eRoutingSignalType.Audio | eRoutingSignalType.Video);
- break;
- }
- case 1:
- {
- ExecuteSwitch(HdmiIn1.Selector, null, eRoutingSignalType.Audio | eRoutingSignalType.Video);
- break;
- }
- case 2:
- {
- ExecuteSwitch(HdmiIn2.Selector, null, eRoutingSignalType.Audio | eRoutingSignalType.Video);
- break;
- }
- case 3:
- {
- ExecuteSwitch(DisplayPortIn.Selector, null, eRoutingSignalType.Audio | eRoutingSignalType.Video);
- break;
- }
- case 4:
- {
- ExecuteSwitch(eVst.AllDisabled, null, eRoutingSignalType.Audio | eRoutingSignalType.Video);
- break;
- }
- }
-
-
- }
-
- public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
- {
- if ((signalType | eRoutingSignalType.Video) == eRoutingSignalType.Video)
- Tx.VideoSource = (eVst)inputSelector;
-
- // NOTE: It's possible that this particular TX model may not like the AudioSource property being set.
- // The SIMPL definition only shows a single analog for AudioVideo Source
- if ((signalType | eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
- //it doesn't
- Debug.Console(2, this, "Unable to execute audio-only switch for tx {0}", Key);
- //Tx.AudioSource = (eAst)inputSelector;
- }
-
- void InputStreamChangeEvent(EndpointInputStream inputStream, EndpointInputStreamEventArgs args)
- {
- Debug.Console(2, "{0} event {1} stream {2}", Tx.ToString(), inputStream.ToString(), args.EventId.ToString());
-
- switch (args.EventId)
- {
- case EndpointInputStreamEventIds.HdcpSupportOffFeedbackEventId:
- if (inputStream == Tx.HdmiInputs[1]) HdmiIn1HdcpCapabilityFeedback.FireUpdate();
- if (inputStream == Tx.HdmiInputs[2]) HdmiIn2HdcpCapabilityFeedback.FireUpdate();
- break;
- case EndpointInputStreamEventIds.HdcpSupportOnFeedbackEventId:
- if (inputStream == Tx.HdmiInputs[1]) HdmiIn1HdcpCapabilityFeedback.FireUpdate();
- if (inputStream == Tx.HdmiInputs[2]) HdmiIn2HdcpCapabilityFeedback.FireUpdate();
- break;
- case EndpointInputStreamEventIds.SyncDetectedFeedbackEventId:
- if (inputStream == Tx.HdmiInputs[1]) Hdmi1VideoSyncFeedback.FireUpdate();
- if (inputStream == Tx.HdmiInputs[2]) Hdmi2VideoSyncFeedback.FireUpdate();
- break;
- }
- }
-
- void Tx_BaseEvent(GenericBase device, BaseEventArgs args)
- {
- var id = args.EventId;
- switch (id)
- {
- case EndpointTransmitterBase.VideoSourceFeedbackEventId:
- Debug.Console(2, this, " Video Source: {0}", Tx.VideoSourceFeedback);
- VideoSourceNumericFeedback.FireUpdate();
- ActiveVideoInputFeedback.FireUpdate();
- break;
- case EndpointTransmitterBase.AudioSourceFeedbackEventId:
- Debug.Console(2, this, " Audio Source: {0}", Tx.AudioSourceFeedback);
- AudioSourceNumericFeedback.FireUpdate();
- break;
- }
- }
-
- ///
- /// Relays the input stream change to the appropriate RoutingInputPort.
- ///
- void FowardInputStreamChange(RoutingInputPortWithVideoStatuses inputPort, int eventId)
- {
- if (eventId != EndpointInputStreamEventIds.SyncDetectedFeedbackEventId) return;
- inputPort.VideoStatus.VideoSyncFeedback.FireUpdate();
- AnyVideoInput.VideoStatus.VideoSyncFeedback.FireUpdate();
- }
-
- ///
- /// Relays the VideoAttributes change to a RoutingInputPort
- ///
- void ForwardVideoAttributeChange(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;
- case VideoAttributeEventIds.FramesPerSecondFeedbackEventId:
- inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate();
- AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate();
- break;
- }
- }
-
-
- #region IIROutputPorts Members
- public CrestronCollection IROutputPorts { get { return Tx.IROutputPorts; } }
- public int NumberOfIROutputPorts { get { return Tx.NumberOfIROutputPorts; } }
- #endregion
-
- #region IComPorts Members
- public CrestronCollection ComPorts { get { return Tx.ComPorts; } }
- public int NumberOfComPorts { get { return Tx.NumberOfComPorts; } }
- #endregion
- }
+using Crestron.SimplSharpPro;
+//using Crestron.SimplSharpPro.DeviceSupport;
+using Crestron.SimplSharpPro.DeviceSupport;
+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.Core.Bridges;
+
+namespace PepperDash.Essentials.DM
+{
+ using eVst = eX02VideoSourceType;
+ using eAst = eX02AudioSourceType;
+
+
+ [Description("Wrapper class for DM-TX-4K-Z-302-C")]
+ public class DmTx4kz302CController : DmTxControllerBase, ITxRouting, IHasFeedback,
+ IIROutputPorts, IComPorts
+ {
+ public DmTx4kz302C Tx { get; private set; }
+
+ public RoutingInputPortWithVideoStatuses HdmiIn1 { get; private set; }
+ public RoutingInputPortWithVideoStatuses HdmiIn2 { get; private set; }
+ public RoutingInputPortWithVideoStatuses DisplayPortIn { get; private set; }
+ public RoutingOutputPort DmOut { get; private set; }
+ public RoutingOutputPort HdmiLoopOut { get; private set; }
+
+ public override StringFeedback ActiveVideoInputFeedback { get; protected set; }
+ public IntFeedback VideoSourceNumericFeedback { get; protected set; }
+ public IntFeedback AudioSourceNumericFeedback { get; protected set; }
+ public IntFeedback HdmiIn1HdcpCapabilityFeedback { get; protected set; }
+ public IntFeedback HdmiIn2HdcpCapabilityFeedback { get; protected set; }
+ public BoolFeedback Hdmi1VideoSyncFeedback { get; protected set; }
+ public BoolFeedback Hdmi2VideoSyncFeedback { get; protected set; }
+ public BoolFeedback DisplayPortVideoSyncFeedback { get; protected set; }
+
+ //public override IntFeedback HdcpSupportAllFeedback { get; protected set; }
+ //public override ushort HdcpSupportCapability { get; protected set; }
+
+ ///
+ /// Helps get the "real" inputs, including when in Auto
+ ///
+ public eX02VideoSourceType ActualActiveVideoInput
+ {
+ get
+ {
+ if (Tx.VideoSourceFeedback != eVst.Auto)
+ return Tx.VideoSourceFeedback;
+ if (Tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue)
+ return eVst.Hdmi1;
+ if (Tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue)
+ return eVst.Hdmi2;
+
+ return Tx.DisplayPortInput.SyncDetectedFeedback.BoolValue ? eVst.Vga : eVst.AllDisabled;
+ }
+ }
+ public RoutingPortCollection InputPorts
+ {
+ get
+ {
+ return new RoutingPortCollection
+ {
+ HdmiIn1,
+ HdmiIn2,
+ DisplayPortIn,
+ AnyVideoInput
+ };
+ }
+ }
+ public RoutingPortCollection OutputPorts
+ {
+ get
+ {
+ return new RoutingPortCollection { DmOut, HdmiLoopOut };
+ }
+ }
+ public DmTx4kz302CController(string key, string name, DmTx4kz302C tx)
+ : base(key, name, tx)
+ {
+ Tx = tx;
+
+ HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
+ eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
+ VideoStatusHelper.GetHdmiInputStatusFuncs(tx.HdmiInputs[1]));
+ HdmiIn2 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn2,
+ eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi2, this,
+ VideoStatusHelper.GetHdmiInputStatusFuncs(tx.HdmiInputs[2]));
+ DisplayPortIn = new RoutingInputPortWithVideoStatuses(DmPortName.VgaIn,
+ eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.DisplayPort, eVst.DisplayPort, this,
+ VideoStatusHelper.GetDisplayPortInputStatusFuncs(tx.DisplayPortInput));
+ ActiveVideoInputFeedback = new StringFeedback("ActiveVideoInput",
+ () => ActualActiveVideoInput.ToString());
+
+ Tx.HdmiInputs[1].InputStreamChange += InputStreamChangeEvent;
+ Tx.HdmiInputs[2].InputStreamChange += InputStreamChangeEvent;
+ Tx.DisplayPortInput.InputStreamChange += DisplayPortInputStreamChange;
+ Tx.BaseEvent += Tx_BaseEvent;
+
+ VideoSourceNumericFeedback = new IntFeedback(() => (int)Tx.VideoSourceFeedback);
+ AudioSourceNumericFeedback = new IntFeedback(() => (int)Tx.VideoSourceFeedback);
+
+ HdmiIn1HdcpCapabilityFeedback = new IntFeedback("HdmiIn1HdcpCapability", () => (int)tx.HdmiInputs[1].HdcpCapabilityFeedback);
+
+ HdmiIn2HdcpCapabilityFeedback = new IntFeedback("HdmiIn2HdcpCapability", () => (int)tx.HdmiInputs[2].HdcpCapabilityFeedback);
+
+ HdcpSupportCapability = eHdcpCapabilityType.Hdcp2_2Support;
+
+ Hdmi1VideoSyncFeedback = new BoolFeedback(() => (bool)tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue);
+
+ Hdmi2VideoSyncFeedback = new BoolFeedback(() => (bool)tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue);
+
+ DisplayPortVideoSyncFeedback = new BoolFeedback(() => (bool)tx.DisplayPortInput.SyncDetectedFeedback.BoolValue);
+
+
+ var combinedFuncs = new VideoStatusFuncsWrapper
+ {
+ HdcpActiveFeedbackFunc = () =>
+ (ActualActiveVideoInput == eVst.Hdmi1
+ && tx.HdmiInputs[1].VideoAttributes.HdcpActiveFeedback.BoolValue)
+ || (ActualActiveVideoInput == eVst.Hdmi2
+ && tx.HdmiInputs[2].VideoAttributes.HdcpActiveFeedback.BoolValue),
+
+ HdcpStateFeedbackFunc = () =>
+ {
+ if (ActualActiveVideoInput == eVst.Hdmi1)
+ return tx.HdmiInputs[1].VideoAttributes.HdcpStateFeedback.ToString();
+ return ActualActiveVideoInput == eVst.Hdmi2 ? tx.HdmiInputs[2].VideoAttributes.HdcpStateFeedback.ToString() : "";
+ },
+
+ VideoResolutionFeedbackFunc = () =>
+ {
+ if (ActualActiveVideoInput == eVst.Hdmi1)
+ return tx.HdmiInputs[1].VideoAttributes.GetVideoResolutionString();
+ if (ActualActiveVideoInput == eVst.Hdmi2)
+ return tx.HdmiInputs[2].VideoAttributes.GetVideoResolutionString();
+ return ActualActiveVideoInput == eVst.Vga ? tx.DisplayPortInput.VideoAttributes.GetVideoResolutionString() : "";
+ },
+ VideoSyncFeedbackFunc = () =>
+ (ActualActiveVideoInput == eVst.Hdmi1
+ && tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue)
+ || (ActualActiveVideoInput == eVst.Hdmi2
+ && tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue)
+ || (ActualActiveVideoInput == eVst.Vga
+ && tx.DisplayPortInput.SyncDetectedFeedback.BoolValue)
+
+ };
+
+ AnyVideoInput = new RoutingInputPortWithVideoStatuses(DmPortName.AnyVideoIn,
+ eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.None, 0, this, combinedFuncs);
+
+ DmOut = new RoutingOutputPort(DmPortName.DmOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
+ eRoutingPortConnectionType.DmCat, null, this);
+ HdmiLoopOut = new RoutingOutputPort(DmPortName.HdmiLoopOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
+ eRoutingPortConnectionType.Hdmi, null, this);
+
+
+ AddToFeedbackList(ActiveVideoInputFeedback, VideoSourceNumericFeedback, AudioSourceNumericFeedback,
+ AnyVideoInput.VideoStatus.HasVideoStatusFeedback, AnyVideoInput.VideoStatus.HdcpActiveFeedback,
+ AnyVideoInput.VideoStatus.HdcpStateFeedback, AnyVideoInput.VideoStatus.VideoResolutionFeedback,
+ AnyVideoInput.VideoStatus.VideoSyncFeedback, HdmiIn1HdcpCapabilityFeedback, HdmiIn2HdcpCapabilityFeedback,
+ Hdmi1VideoSyncFeedback, Hdmi2VideoSyncFeedback, DisplayPortVideoSyncFeedback);
+
+ // Set Ports for CEC
+ HdmiIn1.Port = Tx.HdmiInputs[1];
+ HdmiIn2.Port = Tx.HdmiInputs[2];
+ HdmiLoopOut.Port = Tx.HdmiOutput;
+ DmOut.Port = Tx.DmOutput;
+ }
+
+ void DisplayPortInputStreamChange(EndpointInputStream inputStream, EndpointInputStreamEventArgs args)
+ {
+ Debug.Console(2, "{0} event {1} stream {2}", Tx.ToString(), inputStream.ToString(), args.EventId.ToString());
+
+ switch (args.EventId)
+ {
+ case EndpointInputStreamEventIds.SyncDetectedFeedbackEventId:
+ DisplayPortVideoSyncFeedback.FireUpdate();
+ break;
+ }
+ }
+
+
+
+ public override bool CustomActivate()
+ {
+ // Link up all of these damned events to the various RoutingPorts via a helper handler
+ Tx.HdmiInputs[1].InputStreamChange += (o, a) => FowardInputStreamChange(HdmiIn1, a.EventId);
+ Tx.HdmiInputs[1].VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn1, a.EventId);
+
+ Tx.HdmiInputs[2].InputStreamChange += (o, a) => FowardInputStreamChange(HdmiIn2, a.EventId);
+ Tx.HdmiInputs[2].VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn2, a.EventId);
+
+ Tx.DisplayPortInput.InputStreamChange += (o, a) => FowardInputStreamChange(DisplayPortIn, a.EventId);
+ Tx.DisplayPortInput.VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(DisplayPortIn, a.EventId);
+
+ // Base does register and sets up comm monitoring.
+ return base.CustomActivate();
+ }
+
+ public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
+ {
+ var joinMap = GetDmTxJoinMap(joinStart, joinMapKey);
+
+ if (Hdmi1VideoSyncFeedback != null)
+ {
+ Hdmi1VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input1VideoSyncStatus.JoinNumber]);
+ }
+ if (Hdmi2VideoSyncFeedback != null)
+ {
+ Hdmi2VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input2VideoSyncStatus.JoinNumber]);
+ }
+ if (DisplayPortVideoSyncFeedback != null)
+ {
+ DisplayPortVideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input3VideoSyncStatus.JoinNumber]);
+ }
+
+ LinkDmTxToApi(this, trilist, joinMap, bridge);
+ }
+
+ public void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type)
+ {
+ Debug.Console(2, this, "Executing Numeric Switch to input {0}.", input);
+
+ switch (input)
+ {
+ case 0:
+ {
+ ExecuteSwitch(eVst.Auto, null, eRoutingSignalType.Audio | eRoutingSignalType.Video);
+ break;
+ }
+ case 1:
+ {
+ ExecuteSwitch(HdmiIn1.Selector, null, eRoutingSignalType.Audio | eRoutingSignalType.Video);
+ break;
+ }
+ case 2:
+ {
+ ExecuteSwitch(HdmiIn2.Selector, null, eRoutingSignalType.Audio | eRoutingSignalType.Video);
+ break;
+ }
+ case 3:
+ {
+ ExecuteSwitch(DisplayPortIn.Selector, null, eRoutingSignalType.Audio | eRoutingSignalType.Video);
+ break;
+ }
+ case 4:
+ {
+ ExecuteSwitch(eVst.AllDisabled, null, eRoutingSignalType.Audio | eRoutingSignalType.Video);
+ break;
+ }
+ }
+
+
+ }
+
+ public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
+ {
+ if ((signalType | eRoutingSignalType.Video) == eRoutingSignalType.Video)
+ Tx.VideoSource = (eVst)inputSelector;
+
+ // NOTE: It's possible that this particular TX model may not like the AudioSource property being set.
+ // The SIMPL definition only shows a single analog for AudioVideo Source
+ if ((signalType | eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
+ //it doesn't
+ Debug.Console(2, this, "Unable to execute audio-only switch for tx {0}", Key);
+ //Tx.AudioSource = (eAst)inputSelector;
+ }
+
+ void InputStreamChangeEvent(EndpointInputStream inputStream, EndpointInputStreamEventArgs args)
+ {
+ Debug.Console(2, "{0} event {1} stream {2}", Tx.ToString(), inputStream.ToString(), args.EventId.ToString());
+
+ switch (args.EventId)
+ {
+ case EndpointInputStreamEventIds.HdcpSupportOffFeedbackEventId:
+ if (inputStream == Tx.HdmiInputs[1]) HdmiIn1HdcpCapabilityFeedback.FireUpdate();
+ if (inputStream == Tx.HdmiInputs[2]) HdmiIn2HdcpCapabilityFeedback.FireUpdate();
+ break;
+ case EndpointInputStreamEventIds.HdcpSupportOnFeedbackEventId:
+ if (inputStream == Tx.HdmiInputs[1]) HdmiIn1HdcpCapabilityFeedback.FireUpdate();
+ if (inputStream == Tx.HdmiInputs[2]) HdmiIn2HdcpCapabilityFeedback.FireUpdate();
+ break;
+ case EndpointInputStreamEventIds.SyncDetectedFeedbackEventId:
+ if (inputStream == Tx.HdmiInputs[1]) Hdmi1VideoSyncFeedback.FireUpdate();
+ if (inputStream == Tx.HdmiInputs[2]) Hdmi2VideoSyncFeedback.FireUpdate();
+ break;
+ }
+ }
+
+ void Tx_BaseEvent(GenericBase device, BaseEventArgs args)
+ {
+ var id = args.EventId;
+ switch (id)
+ {
+ case EndpointTransmitterBase.VideoSourceFeedbackEventId:
+ Debug.Console(2, this, " Video Source: {0}", Tx.VideoSourceFeedback);
+ VideoSourceNumericFeedback.FireUpdate();
+ ActiveVideoInputFeedback.FireUpdate();
+ break;
+ case EndpointTransmitterBase.AudioSourceFeedbackEventId:
+ Debug.Console(2, this, " Audio Source: {0}", Tx.AudioSourceFeedback);
+ AudioSourceNumericFeedback.FireUpdate();
+ break;
+ }
+ }
+
+ ///
+ /// Relays the input stream change to the appropriate RoutingInputPort.
+ ///
+ void FowardInputStreamChange(RoutingInputPortWithVideoStatuses inputPort, int eventId)
+ {
+ if (eventId != EndpointInputStreamEventIds.SyncDetectedFeedbackEventId) return;
+ inputPort.VideoStatus.VideoSyncFeedback.FireUpdate();
+ AnyVideoInput.VideoStatus.VideoSyncFeedback.FireUpdate();
+ }
+
+ ///
+ /// Relays the VideoAttributes change to a RoutingInputPort
+ ///
+ void ForwardVideoAttributeChange(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;
+ case VideoAttributeEventIds.FramesPerSecondFeedbackEventId:
+ inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate();
+ AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate();
+ break;
+ }
+ }
+
+
+ #region IIROutputPorts Members
+ public CrestronCollection IROutputPorts { get { return Tx.IROutputPorts; } }
+ public int NumberOfIROutputPorts { get { return Tx.NumberOfIROutputPorts; } }
+ #endregion
+
+ #region IComPorts Members
+ public CrestronCollection ComPorts { get { return Tx.ComPorts; } }
+ public int NumberOfComPorts { get { return Tx.NumberOfComPorts; } }
+ #endregion
+ }
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTxHelpers.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTxHelpers.cs
index bb72306b..c19b1f1b 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTxHelpers.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTxHelpers.cs
@@ -28,16 +28,16 @@ namespace PepperDash.Essentials.DM
///
///
public static DmTxControllerBase 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")
- {
+ if (pKey == "processor")
+ {
// Catch constructor failures, mainly dues to IPID
try
{
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 e766390f..76aae649 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/PepperDash_Essentials_DM.csproj
+++ b/essentials-framework/Essentials DM/Essentials_DM/PepperDash_Essentials_DM.csproj
@@ -99,7 +99,9 @@
+
+
@@ -113,7 +115,6 @@
-
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Crestron/Gateways/CenRfgwController.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Crestron/Gateways/CenRfgwController.cs
deleted file mode 100644
index 04f6eb17..00000000
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Crestron/Gateways/CenRfgwController.cs
+++ /dev/null
@@ -1,133 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-using Crestron.SimplSharpPro;
-using Crestron.SimplSharpPro.Gateways;
-
-using PepperDash.Core;
-using PepperDash.Essentials.Core;
-using PepperDash.Essentials.Core.Config;
-
-
-namespace PepperDash.Essentials.Devices.Common
-{
- public class CenRfgwController : CrestronGenericBaseDevice
- {
- public GatewayBase Gateway { get { return Hardware as GatewayBase; } }
-
- ///
- /// Constructor for the on-board gateway
- ///
- ///
- ///
- public CenRfgwController(string key, string name, GatewayBase gateway) :
- base(key, name, gateway)
- {
- }
-
- public static CenRfgwController GetNewExGatewayController(string key, string name, string id, string gatewayType)
- {
- uint uid;
- eExGatewayType type;
- try
- {
- uid = Convert.ToUInt32(id, 16);
- type = (eExGatewayType)Enum.Parse(typeof(eExGatewayType), gatewayType, true);
- var cs = Global.ControlSystem;
-
- GatewayBase gw = null;
- switch (type)
- {
- case eExGatewayType.Ethernet:
- gw = new CenRfgwEx(uid, cs);
- break;
- case eExGatewayType.EthernetShared:
- gw = new CenRfgwExEthernetSharable(uid, cs);
- break;
- case eExGatewayType.Cresnet:
- gw = new CenRfgwExCresnet(uid, cs);
- break;
- }
- return new CenRfgwController(key, name, gw);
- }
- catch (Exception)
- {
- Debug.Console(0, "ERROR: Cannot create EX Gateway, id {0}, type {1}", id, gatewayType);
- return null;
- }
- }
- public static CenRfgwController GetNewErGatewayController(string key, string name, string id, string gatewayType)
- {
- uint uid;
- eExGatewayType type;
- try
- {
- uid = Convert.ToUInt32(id, 16);
- type = (eExGatewayType)Enum.Parse(typeof(eExGatewayType), gatewayType, true);
- var cs = Global.ControlSystem;
-
- GatewayBase gw = null;
- switch (type)
- {
- case eExGatewayType.Ethernet:
- gw = new CenErfgwPoe(uid, cs);
- break;
- case eExGatewayType.EthernetShared:
- gw = new CenErfgwPoeEthernetSharable(uid, cs);
- break;
- case eExGatewayType.Cresnet:
- gw = new CenErfgwPoeCresnet(uid, cs);
- break;
- }
- return new CenRfgwController(key, name, gw);
- }
- catch (Exception)
- {
- Debug.Console(0, "ERROR: Cannot create EX Gateway, id {0}, type {1}", id, gatewayType);
- return null;
- }
- }
-
-
- ///
- /// Gets the actual Crestron EX gateway for a given key. "processor" or the key of
- /// a CenRfgwExController in DeviceManager
- ///
- ///
- /// Either processor GW or Gateway property of CenRfgwExController
- public static GatewayBase GetExGatewayBaseForKey(string key)
- {
- key = key.ToLower();
- if (key == "processor" && Global.ControlSystem.SupportsInternalRFGateway)
- return Global.ControlSystem.ControllerRFGatewayDevice;
- var gwCont = DeviceManager.GetDeviceForKey(key) as CenRfgwController;
- if (gwCont != null)
- return gwCont.Gateway;
-
- return null;
- }
- }
-
- public enum eExGatewayType
- {
- Ethernet, EthernetShared, Cresnet
- }
-
- public class CenRfgwControllerFactory : EssentialsDeviceFactory
- {
- public CenRfgwControllerFactory()
- {
- TypeNames = new List() { "cenrfgwex", "cenerfgwpoe" };
- }
-
- public override EssentialsDevice BuildDevice(DeviceConfig dc)
- {
- Debug.Console(1, "Factory Attempting to create new CEN-GWEXER Device");
- return CenRfgwController.GetNewExGatewayController(dc.Key, dc.Name,
- dc.Properties.Value("id"), dc.Properties.Value("gatewayType"));
- }
- }
-
-}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/InputInterfaces.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/InputInterfaces.cs
index ce7113e1..d984f523 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/InputInterfaces.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/InputInterfaces.cs
@@ -12,6 +12,6 @@ namespace PepperDash.Essentials.Devices.Displays
public interface IInputHdmi4 { void InputHdmi4(); }
public interface IInputDisplayPort1 { void InputDisplayPort1(); }
public interface IInputDisplayPort2 { void InputDisplayPort2(); }
- public interface IInputVga1 { void InputVga1(); }
-
+ public interface IInputVga1 { void InputVga1(); }
+
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj
index 83065b05..ba12a129 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj
@@ -132,7 +132,6 @@
-
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Occupancy/CenOdtOccupancySensorBaseController.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Occupancy/CenOdtOccupancySensorBaseController.cs
index eb3172d9..16c0a2f0 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Occupancy/CenOdtOccupancySensorBaseController.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Occupancy/CenOdtOccupancySensorBaseController.cs
@@ -13,6 +13,7 @@ using PepperDash.Essentials.Core.Bridges;
namespace PepperDash.Essentials.Devices.Common.Occupancy
{
+ [Description("Wrapper class for CEN-ODT-C-POE")]
public class CenOdtOccupancySensorBaseController : CrestronGenericBridgeableBaseDevice, IOccupancyStatusProvider
{
public CenOdtCPoe OccSensor { get; private set; }
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Occupancy/GlsOccupancySensorBaseController.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Occupancy/GlsOccupancySensorBaseController.cs
index 907e8461..6dd61721 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Occupancy/GlsOccupancySensorBaseController.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Occupancy/GlsOccupancySensorBaseController.cs
@@ -13,6 +13,7 @@ using PepperDash.Essentials.Core.Bridges;
namespace PepperDash.Essentials.Devices.Common.Occupancy
{
+ [Description("Wrapper class for Single Technology GLS Occupancy Sensors")]
public class GlsOccupancySensorBaseController : CrestronGenericBridgeableBaseDevice, IOccupancyStatusProvider
{
public GlsOccupancySensorBase OccSensor { get; private set; }
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Occupancy/GlsOdtOccupancySensorController.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Occupancy/GlsOdtOccupancySensorController.cs
index f7d9943a..26fec016 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Occupancy/GlsOdtOccupancySensorController.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Occupancy/GlsOdtOccupancySensorController.cs
@@ -13,6 +13,7 @@ using PepperDash.Essentials.Core.Bridges;
namespace PepperDash.Essentials.Devices.Common.Occupancy
{
+ [Description("Wrapper class for Dual Technology GLS Occupancy Sensors")]
public class GlsOdtOccupancySensorController : GlsOccupancySensorBaseController
{
public new GlsOdtCCn OccSensor { get; private set; }
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/SetTopBox/IRSetTopBoxBase.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/SetTopBox/IRSetTopBoxBase.cs
index 8bf690a6..ec3f11e8 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/SetTopBox/IRSetTopBoxBase.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/SetTopBox/IRSetTopBoxBase.cs
@@ -15,7 +15,8 @@ using PepperDash.Essentials.Core.Routing;
namespace PepperDash.Essentials.Devices.Common
{
- public class IRSetTopBoxBase : EssentialsBridgeableDevice, ISetTopBoxControls, IRoutingOutputs, IUsageTracking, IPower
+ [Description("Wrapper class for an IR Set Top Box")]
+ public class IRSetTopBoxBase : EssentialsBridgeableDevice, ISetTopBoxControls, IRoutingOutputs, IUsageTracking, IPower
{
public IrOutputPortController IrPort { get; private set; }
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Streaming/AppleTV.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Streaming/AppleTV.cs
index 5d01ccc7..13e89040 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Streaming/AppleTV.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Streaming/AppleTV.cs
@@ -14,9 +14,9 @@ using PepperDash.Essentials.Core.Routing;
namespace PepperDash.Essentials.Devices.Common
{
+ [Description("Wrapper class for an IR-Controlled AppleTV")]
public class AppleTV : EssentialsBridgeableDevice, IDPad, ITransport, IUiDisplayInfo, IRoutingOutputs
{
-
public IrOutputPortController IrPort { get; private set; }
public const string StandardDriverName = "Apple AppleTV-v2.ir";
public uint DisplayUiType { get { return DisplayUiConstants.TypeAppleTv; } }
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Streaming/Roku.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Streaming/Roku.cs
index 49f96c31..de848406 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Streaming/Roku.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Streaming/Roku.cs
@@ -12,7 +12,8 @@ using PepperDash.Essentials.Core.Config;
using PepperDash.Essentials.Core.Routing;
namespace PepperDash.Essentials.Devices.Common
-{
+{
+ [Description("Wrapper class for an IR-Controlled Roku")]
public class Roku2 : EssentialsDevice, IDPad, ITransport, IUiDisplayInfo, IRoutingOutputs
{
[Api]