diff --git a/PepperDashEssentials/ControlSystem.cs b/PepperDashEssentials/ControlSystem.cs
index be78aaf9..dd8f3d5a 100644
--- a/PepperDashEssentials/ControlSystem.cs
+++ b/PepperDashEssentials/ControlSystem.cs
@@ -53,14 +53,14 @@ namespace PepperDash.Essentials
// to allow any HD-BaseT DM endpoints to register first.
if (Global.ControlSystemIsDmpsType)
{
- Debug.Console(2, "******************* InitializeSystem() Entering **********************");
+ Debug.Console(1, "******************* InitializeSystem() Entering **********************");
_initializeEvent = new CEvent();
- DeviceManager.AllDevicesActivated += (o, a) =>
+ DeviceManager.AllDevicesRegistered += (o, a) =>
{
_initializeEvent.Set();
- Debug.Console(2, "******************* InitializeSystem() Exiting **********************");
+ Debug.Console(1, "******************* InitializeSystem() Exiting **********************");
};
_initializeEvent.Wait(30000);
@@ -490,21 +490,17 @@ namespace PepperDash.Essentials
}
}
+ AddRoomAndBuildMC(room);
+
if (room is IEssentialsHuddleSpaceRoom)
{
- DeviceManager.AddDevice(room);
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Room is EssentialsHuddleSpaceRoom, attempting to add to DeviceManager with Fusion with IP-ID {0:X2}", fusionIpId);
DeviceManager.AddDevice(new Core.Fusion.EssentialsHuddleSpaceFusionSystemControllerBase(room, fusionIpId, fusionJoinMapKey));
-
- Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge...");
-
- CreateMobileControlBridge(room);
}
else if (room is IEssentialsHuddleVtc1Room)
{
- DeviceManager.AddDevice(room);
if (!(room is EssentialsCombinedHuddleVtc1Room))
{
@@ -512,28 +508,15 @@ namespace PepperDash.Essentials
DeviceManager.AddDevice(new EssentialsHuddleVtc1FusionController((IEssentialsHuddleVtc1Room)room, fusionIpId, fusionJoinMapKey));
}
- Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge...");
-
- CreateMobileControlBridge(room);
}
else if (room is EssentialsTechRoom)
{
- DeviceManager.AddDevice(room);
Debug.Console(0, Debug.ErrorLogLevel.Notice,
"Room is EssentialsTechRoom, Attempting to add to DeviceManager with Fusion with IP-ID {0:X2}", fusionIpId);
DeviceManager.AddDevice(new EssentialsTechRoomFusionSystemController((EssentialsTechRoom)room, fusionIpId, fusionJoinMapKey));
- Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge");
-
- CreateMobileControlBridge(room);
}
- else
- {
- Debug.Console(0, Debug.ErrorLogLevel.Notice, "Room is NOT EssentialsRoom, attempting to add to DeviceManager w/o Fusion");
- DeviceManager.AddDevice(room);
- }
-
fusionIpId += 1;
}
else
@@ -547,6 +530,15 @@ namespace PepperDash.Essentials
}
+ private static void AddRoomAndBuildMC(IEssentialsRoom room)
+ {
+ DeviceManager.AddDevice(room);
+
+ Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge");
+
+ CreateMobileControlBridge(room);
+ }
+
private static void CreateMobileControlBridge(object room)
{
var mobileControl = GetMobileControlDevice();
diff --git a/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs b/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
index b0ad2ae1..38067528 100644
--- a/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
+++ b/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
@@ -19,32 +19,41 @@ namespace PepperDash.Essentials.Room.Config
/// Returns a room object from this config data
///
///
- public static Device GetRoomObject(DeviceConfig roomConfig)
+ public static IKeyed GetRoomObject(DeviceConfig roomConfig)
{
var typeName = roomConfig.Type.ToLower();
- if (typeName == "huddle")
- {
- return new EssentialsHuddleSpaceRoom(roomConfig);
- }
- if (typeName == "huddlevtc1")
+ switch (typeName)
{
- return new EssentialsHuddleVtc1Room(roomConfig);
+ case "huddle" :
+ {
+ return new EssentialsHuddleSpaceRoom(roomConfig);
+ }
+ case "huddlevtc1" :
+ {
+ return new EssentialsHuddleVtc1Room(roomConfig);
+ }
+ case "ddvc01bridge" :
+ {
+ return new Device(roomConfig.Key, roomConfig.Name); // placeholder device that does nothing.
+ }
+ case "dualdisplay" :
+ {
+ return new EssentialsDualDisplayRoom(roomConfig);
+ }
+ case "combinedhuddlevtc1" :
+ {
+ return new EssentialsCombinedHuddleVtc1Room(roomConfig);
+ }
+ case "techroom" :
+ {
+ return new EssentialsTechRoom(roomConfig);
+ }
+ default :
+ {
+ return Core.DeviceFactory.GetDevice(roomConfig);
+ }
}
- if (typeName == "ddvc01bridge")
- {
- return new Device(roomConfig.Key, roomConfig.Name); // placeholder device that does nothing.
- }
- if (typeName == "dualdisplay")
- {
- return new EssentialsDualDisplayRoom(roomConfig);
- }
- if (typeName == "combinedhuddlevtc1")
- {
- return new EssentialsCombinedHuddleVtc1Room(roomConfig);
- }
-
- return typeName != "techroom" ? null : new EssentialsTechRoom(roomConfig);
}
///
diff --git a/PepperDashEssentials/UI/EssentialsTouchpanelController.cs b/PepperDashEssentials/UI/EssentialsTouchpanelController.cs
index 441381bd..67f25f42 100644
--- a/PepperDashEssentials/UI/EssentialsTouchpanelController.cs
+++ b/PepperDashEssentials/UI/EssentialsTouchpanelController.cs
@@ -11,211 +11,38 @@ using PepperDash.Core;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Config;
using PepperDash.Essentials.Core.PageManagers;
+using PepperDash.Essentials.Core.UI;
+using Newtonsoft.Json;
namespace PepperDash.Essentials
{
- public class EssentialsTouchpanelController : EssentialsDevice, IHasBasicTriListWithSmartObject
- {
- private CrestronTouchpanelPropertiesConfig _propertiesConfig;
-
- public BasicTriListWithSmartObject Panel { get; private set; }
-
+ public class EssentialsTouchpanelController : TouchpanelBase
+ {
public PanelDriverBase PanelDriver { get; private set; }
CTimer BacklightTransitionedOnTimer;
- public EssentialsTouchpanelController(string key, string name, Tswx52ButtonVoiceControl tsw,
- string projectName, string sgdPath)
- : base(key, name)
- {
- Panel = tsw;
-
- if (!string.IsNullOrEmpty(sgdPath))
- Panel.LoadSmartObjects(sgdPath);
- else
- Debug.Console(1, this, "No SGD file path defined");
-
-
-
- tsw.SigChange += Panel_SigChange;
- }
-
- public EssentialsTouchpanelController(string key, string name, Dge100 dge, string projectName, string sgdPath)
- : base(key, name)
- {
- Panel = dge;
-
- if (!string.IsNullOrEmpty(sgdPath))
- Panel.LoadSmartObjects(sgdPath);
- else
- Debug.Console(1, this, "No SGD file path defined");
-
- dge.SigChange += Panel_SigChange;
- }
-
///
/// Config constructor
///
- public EssentialsTouchpanelController(string key, string name, string type, CrestronTouchpanelPropertiesConfig props, uint id)
- : base(key, name)
+ public EssentialsTouchpanelController(string key, string name, BasicTriListWithSmartObject panel, CrestronTouchpanelPropertiesConfig config)
+ : base(key, name, panel, config)
{
- _propertiesConfig = props;
-
- Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Creating touchpanel hardware...");
- type = type.ToLower();
- try
- {
- if (type == "crestronapp")
- {
- var app = new CrestronApp(id, Global.ControlSystem);
- app.ParameterProjectName.Value = props.ProjectName;
- Panel = app;
- }
- else if (type == "xpanel")
- Panel = new XpanelForSmartGraphics(id, Global.ControlSystem);
- else if (type == "tsw550")
- Panel = new Tsw550(id, Global.ControlSystem);
- else if (type == "tsw552")
- Panel = new Tsw552(id, Global.ControlSystem);
- else if (type == "tsw560")
- Panel = new Tsw560(id, Global.ControlSystem);
- else if (type == "tsw750")
- Panel = new Tsw750(id, Global.ControlSystem);
- else if (type == "tsw752")
- Panel = new Tsw752(id, Global.ControlSystem);
- else if (type == "tsw760")
- Panel = new Tsw760(id, Global.ControlSystem);
- else if (type == "tsw1050")
- Panel = new Tsw1050(id, Global.ControlSystem);
- else if (type == "tsw1052")
- Panel = new Tsw1052(id, Global.ControlSystem);
- else if (type == "tsw1060")
- Panel = new Tsw1060(id, Global.ControlSystem);
- else if (type == "tsw570")
- Panel = new Tsw570(id, Global.ControlSystem);
- else if (type == "tsw770")
- Panel = new Tsw770(id, Global.ControlSystem);
- else if (type == "ts770")
- Panel = new Ts770(id, Global.ControlSystem);
- else if (type == "tsw1070")
- Panel = new Tsw1070(id, Global.ControlSystem);
- else if (type == "ts1070")
- Panel = new Ts1070(id, Global.ControlSystem);
- else
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW controller with type '{0}'", type);
- return;
- }
- }
- catch (Exception e)
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW base class. Panel will not function: {0}", e.Message);
- return;
- }
-
- // Reserved sigs
- if (Panel is TswFt5ButtonSystem)
- {
- var tsw = Panel as TswFt5ButtonSystem;
- tsw.ExtenderSystemReservedSigs.Use();
- tsw.ExtenderSystemReservedSigs.DeviceExtenderSigChange
- += ExtenderSystemReservedSigs_DeviceExtenderSigChange;
-
- tsw.ButtonStateChange += new ButtonEventHandler(Tsw_ButtonStateChange);
-
- }
-
- if (Panel.Register() != eDeviceRegistrationUnRegistrationResponse.Success)
- Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Registration failed. Continuing, but panel may not function: {0}", Panel.RegistrationFailureReason);
-
- // Give up cleanly if SGD is not present.
- var sgdName = Global.FilePathPrefix + "sgd" + Global.DirectorySeparator + props.SgdFile;
- if (!File.Exists(sgdName))
- {
- Debug.Console(0, this, "Smart object file '{0}' not present in User folder. Looking for embedded file", sgdName);
-
- sgdName = Global.ApplicationDirectoryPathPrefix + Global.DirectorySeparator + "SGD" + Global.DirectorySeparator + props.SgdFile;
-
- if (!File.Exists(sgdName))
- {
- Debug.Console(0, this, "Unable to find SGD file '{0}' in User sgd or application SGD folder. Exiting touchpanel load.", sgdName);
- return;
- }
- }
-
- Panel.LoadSmartObjects(sgdName);
- Panel.SigChange += Panel_SigChange;
-
- AddPostActivationAction(() =>
- {
- // Check for IEssentialsRoomCombiner in DeviceManager and if found, subscribe to its event
- var roomCombiner = DeviceManager.AllDevices.FirstOrDefault((d) => d is IEssentialsRoomCombiner) as IEssentialsRoomCombiner;
-
- if (roomCombiner != null)
- {
- // Subscribe to the even
- roomCombiner.RoomCombinationScenarioChanged += new EventHandler(roomCombiner_RoomCombinationScenarioChanged);
-
- // Connect to the initial roomKey
- if (roomCombiner.CurrentScenario != null)
- {
- // Use the current scenario
- DetermineRoomKeyFromScenario(roomCombiner.CurrentScenario);
- }
- else
- {
- // Current Scenario not yet set. Use default
- SetupPanelDrivers(_propertiesConfig.DefaultRoomKey);
- }
- }
- else
- {
- // No room combiner, use the default key
- SetupPanelDrivers(_propertiesConfig.DefaultRoomKey);
- }
- });
}
- void roomCombiner_RoomCombinationScenarioChanged(object sender, EventArgs e)
- {
- var roomCombiner = sender as IEssentialsRoomCombiner;
-
- DetermineRoomKeyFromScenario(roomCombiner.CurrentScenario);
- }
-
- ///
- /// Determines the room key to use based on the scenario
- ///
- ///
- void DetermineRoomKeyFromScenario(IRoomCombinationScenario scenario)
- {
- string newRoomKey = null;
-
- if (scenario.UiMap.ContainsKey(Key))
- {
- newRoomKey = scenario.UiMap[Key];
- }
- else if (scenario.UiMap.ContainsKey(_propertiesConfig.DefaultRoomKey))
- {
- newRoomKey = scenario.UiMap[_propertiesConfig.DefaultRoomKey];
- }
-
- SetupPanelDrivers(newRoomKey);
- }
-
///
/// Sets up drivers and links them to the room specified
///
/// key of room to link the drivers to
- void SetupPanelDrivers(string roomKey)
+ protected override void SetupPanelDrivers(string roomKey)
{
// Clear out any existing actions
Panel.ClearAllSigActions();
Debug.Console(0, this, "Linking TP '{0}' to Room '{1}'", Key, roomKey);
- var mainDriver = new EssentialsPanelMainInterfaceDriver(Panel, _propertiesConfig);
+ var mainDriver = new EssentialsPanelMainInterfaceDriver(Panel, _config);
// Then the sub drivers
// spin up different room drivers depending on room type
@@ -224,15 +51,15 @@ namespace PepperDash.Essentials
{
// Screen Saver Driver
- mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, _propertiesConfig);
+ mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, _config);
// Header Driver
Debug.Console(0, this, "Adding header driver");
- mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, _propertiesConfig);
+ mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, _config);
// AV Driver
Debug.Console(0, this, "Adding huddle space AV driver");
- var avDriver = new EssentialsHuddlePanelAvFunctionsDriver(mainDriver, _propertiesConfig);
+ var avDriver = new EssentialsHuddlePanelAvFunctionsDriver(mainDriver, _config);
avDriver.DefaultRoomKey = roomKey;
mainDriver.AvDriver = avDriver;
avDriver.CurrentRoom = room as IEssentialsHuddleSpaceRoom;
@@ -241,7 +68,7 @@ namespace PepperDash.Essentials
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
{
Debug.Console(0, this, "Adding environment driver");
- mainDriver.EnvironmentDriver = new EssentialsEnvironmentDriver(mainDriver, _propertiesConfig);
+ mainDriver.EnvironmentDriver = new EssentialsEnvironmentDriver(mainDriver, _config);
mainDriver.EnvironmentDriver.GetDevicesFromConfig(avDriver.CurrentRoom.PropertiesConfig.Environment);
}
@@ -270,13 +97,13 @@ namespace PepperDash.Essentials
Debug.Console(0, this, "Adding huddle space VTC AV driver");
// Screen Saver Driver
- mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, _propertiesConfig);
+ mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, _config);
// Header Driver
- mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, _propertiesConfig);
+ mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, _config);
// AV Driver
- var avDriver = new EssentialsHuddleVtc1PanelAvFunctionsDriver(mainDriver, _propertiesConfig);
+ var avDriver = new EssentialsHuddleVtc1PanelAvFunctionsDriver(mainDriver, _config);
var codecDriver = new PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver(Panel, avDriver,
(room as IEssentialsHuddleVtc1Room).VideoCodec, mainDriver.HeaderDriver);
@@ -289,7 +116,7 @@ namespace PepperDash.Essentials
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
{
Debug.Console(0, this, "Adding environment driver");
- mainDriver.EnvironmentDriver = new EssentialsEnvironmentDriver(mainDriver, _propertiesConfig);
+ mainDriver.EnvironmentDriver = new EssentialsEnvironmentDriver(mainDriver, _config);
mainDriver.EnvironmentDriver.GetDevicesFromConfig(avDriver.CurrentRoom.PropertiesConfig.Environment);
}
@@ -338,13 +165,7 @@ namespace PepperDash.Essentials
driver.Show();
}
- void HomePressed()
- {
- if (BacklightTransitionedOnTimer == null)
- PanelDriver.BackButtonPressed();
- }
-
- void ExtenderSystemReservedSigs_DeviceExtenderSigChange(DeviceExtender currentDeviceExtender, SigEventArgs args)
+ protected override void ExtenderSystemReservedSigs_DeviceExtenderSigChange(DeviceExtender currentDeviceExtender, SigEventArgs args)
{
// If the sig is transitioning on, mark it in case it was home button that transitioned it
var blOnSig = (Panel as TswFt5ButtonSystem).ExtenderSystemReservedSigs.BacklightOnFeedback;
@@ -382,26 +203,6 @@ namespace PepperDash.Essentials
act(value);
}
}
-
- void Panel_SigChange(object currentDevice, Crestron.SimplSharpPro.SigEventArgs args)
- {
- if (Debug.Level == 2)
- Debug.Console(2, this, "Sig change: {0} {1}={2}", args.Sig.Type, args.Sig.Number, args.Sig.StringValue);
- var uo = args.Sig.UserObject;
- if (uo is Action)
- (uo as Action)(args.Sig.BoolValue);
- else if (uo is Action)
- (uo as Action)(args.Sig.UShortValue);
- else if (uo is Action)
- (uo as Action)(args.Sig.StringValue);
- }
-
- void Tsw_ButtonStateChange(GenericBase device, ButtonEventArgs args)
- {
- var uo = args.Button.UserObject;
- if(uo is Action)
- (uo as Action)(args.Button.State == eButtonState.Pressed);
- }
}
public class EssentialsTouchpanelControllerFactory : EssentialsDeviceFactory
@@ -414,13 +215,74 @@ namespace PepperDash.Essentials
public override EssentialsDevice BuildDevice(DeviceConfig dc)
{
var comm = CommFactory.GetControlPropertiesConfig(dc);
- var props = Newtonsoft.Json.JsonConvert.DeserializeObject(dc.Properties.ToString());
+ var props = JsonConvert.DeserializeObject(dc.Properties.ToString());
+
+ var panel = GetPanelForType(dc.Type, comm.IpIdInt, props.ProjectName);
+
+ if (panel == null)
+ {
+ Debug.Console(0, "Unable to create Touchpanel for type {0}. Touchpanel Controller WILL NOT function correctly", dc.Type);
+ }
Debug.Console(1, "Factory Attempting to create new EssentialsTouchpanelController");
- var panelController = new EssentialsTouchpanelController(dc.Key, dc.Name, dc.Type, props, comm.IpIdInt);
+ var panelController = new EssentialsTouchpanelController(dc.Key, dc.Name, panel, props);
return panelController;
}
+
+ private BasicTriListWithSmartObject GetPanelForType(string type, uint id, string projectName)
+ {
+ type = type.ToLower();
+ try
+ {
+ if (type == "crestronapp")
+ {
+ var app = new CrestronApp(id, Global.ControlSystem);
+ app.ParameterProjectName.Value = projectName;
+ return app;
+ }
+ else if (type == "xpanel")
+ return new XpanelForSmartGraphics(id, Global.ControlSystem);
+ else if (type == "tsw550")
+ return new Tsw550(id, Global.ControlSystem);
+ else if (type == "tsw552")
+ return new Tsw552(id, Global.ControlSystem);
+ else if (type == "tsw560")
+ return new Tsw560(id, Global.ControlSystem);
+ else if (type == "tsw750")
+ return new Tsw750(id, Global.ControlSystem);
+ else if (type == "tsw752")
+ return new Tsw752(id, Global.ControlSystem);
+ else if (type == "tsw760")
+ return new Tsw760(id, Global.ControlSystem);
+ else if (type == "tsw1050")
+ return new Tsw1050(id, Global.ControlSystem);
+ else if (type == "tsw1052")
+ return new Tsw1052(id, Global.ControlSystem);
+ else if (type == "tsw1060")
+ return new Tsw1060(id, Global.ControlSystem);
+ else if (type == "tsw570")
+ return new Tsw570(id, Global.ControlSystem);
+ else if (type == "tsw770")
+ return new Tsw770(id, Global.ControlSystem);
+ else if (type == "ts770")
+ return new Ts770(id, Global.ControlSystem);
+ else if (type == "tsw1070")
+ return new Tsw1070(id, Global.ControlSystem);
+ else if (type == "ts1070")
+ return new Ts1070(id, Global.ControlSystem);
+ else
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW controller with type '{0}'", type);
+ return null;
+ }
+ }
+ catch (Exception e)
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW base class. Panel will not function: {0}", e.Message);
+ return null;
+ }
+ }
}
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmChassisControllerJoinMap.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmChassisControllerJoinMap.cs
index 3582e6cf..114a8a9d 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmChassisControllerJoinMap.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmChassisControllerJoinMap.cs
@@ -24,6 +24,10 @@ namespace PepperDash.Essentials.Core.Bridges
JoinType = eJoinType.Digital
});
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM Chassis Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
[JoinName("SystemId")]
public JoinDataComplete SystemId = new JoinDataComplete(new JoinData { JoinNumber = 10, JoinSpan = 1 },
new JoinMetadata { Description = "DM Chassis SystemId Get/Set/Trigger/", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.DigitalAnalog });
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs
index c7d5c0e5..a6100700 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs
@@ -17,6 +17,10 @@ namespace PepperDash.Essentials.Core.Bridges
public JoinDataComplete MixerPresetRecall = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
new JoinMetadata { Description = "Mixer Preset Recall Set", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("MixerEqPresetRecall")]
+ public JoinDataComplete MixerEqPresetRecall = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mixer Eq Preset Recall Set", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
+
[JoinName("MasterVolumeMuteOn")]
public JoinDataComplete MasterVolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
new JoinMetadata { Description = "Master Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/PduJoinMapBase.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/PduJoinMapBase.cs
new file mode 100644
index 00000000..2ac56ff1
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/PduJoinMapBase.cs
@@ -0,0 +1,60 @@
+using System;
+
+namespace PepperDash.Essentials.Core.Bridges
+{
+ public class PduJoinMapBase : JoinMapBaseAdvanced
+ {
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "PDU Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("Online")]
+ public JoinDataComplete Online = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "PDU Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutletCount")]
+ public JoinDataComplete OutletCount = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Number of COntrolled Outlets", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("OutletName")]
+ public JoinDataComplete OutletName = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "Outlet Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("OutletEnabled")]
+ public JoinDataComplete OutletEnabled = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "Outlet Enabled", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutletPowerCycle")]
+ public JoinDataComplete OutletPowerCycle = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
+ new JoinMetadata { Description = "Outlet Power Cycle", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutletPowerOn")]
+ public JoinDataComplete OutletPowerOn = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
+ new JoinMetadata { Description = "Outlet Power On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutletPowerOff")]
+ public JoinDataComplete OutletPowerOff = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
+ new JoinMetadata { Description = "Outlet Power Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public PduJoinMapBase(uint joinStart)
+ :base(joinStart, typeof(PduJoinMapBase))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ public PduJoinMapBase(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/VideoCodecControllerJoinMap.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/VideoCodecControllerJoinMap.cs
index 7fc0626a..e208e371 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/VideoCodecControllerJoinMap.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/VideoCodecControllerJoinMap.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Core.Bridges.JoinMaps
{
@@ -398,6 +398,7 @@ namespace PepperDash.Essentials.Core.Bridges.JoinMaps
JoinType = eJoinType.Digital
});
+
[JoinName("DirectoryEntryIsContact")]
public JoinDataComplete DirectoryEntryIsContact = new JoinDataComplete(
new JoinData
@@ -524,6 +525,21 @@ namespace PepperDash.Essentials.Core.Bridges.JoinMaps
JoinType = eJoinType.Digital
});
+ [JoinName("DirectoryClearSelected")]
+ public JoinDataComplete DirectoryClearSelected = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 110,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Clear Selected Entry and String from Search",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+
[JoinName("CameraTiltUp")]
public JoinDataComplete CameraTiltUp = new JoinDataComplete(
new JoinData
@@ -1228,11 +1244,12 @@ namespace PepperDash.Essentials.Core.Bridges.JoinMaps
},
new JoinMetadata
{
- Description = "Directory Select Row",
+ Description = "Directory Select Row and Feedback",
JoinCapabilities = eJoinCapabilities.FromSIMPL,
JoinType = eJoinType.Analog
});
+
[JoinName("SelectedContactMethodCount")]
public JoinDataComplete SelectedContactMethodCount = new JoinDataComplete(
new JoinData
@@ -1261,6 +1278,22 @@ namespace PepperDash.Essentials.Core.Bridges.JoinMaps
JoinType = eJoinType.Analog
});
+ [JoinName("DirectorySelectRowFeedback")]
+ public JoinDataComplete DirectorySelectRowFeedback = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 104,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Directory Select Row and Feedback",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Analog
+ });
+
+
+
[JoinName("CameraPresetSelect")]
public JoinDataComplete CameraPresetSelect = new JoinDataComplete(
new JoinData
@@ -1548,6 +1581,36 @@ namespace PepperDash.Essentials.Core.Bridges.JoinMaps
JoinType = eJoinType.Serial
});
+ [JoinName("AvailableLayoutsFb")]
+ public JoinDataComplete AvailableLayoutsFb = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 142,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "xSig of all available layouts",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("SelectLayout")]
+ public JoinDataComplete SelectLayout = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 142,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Select Layout by string",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+
+
[JoinName("CurrentParticipants")]
public JoinDataComplete CurrentParticipants = new JoinDataComplete(
new JoinData
@@ -2986,6 +3049,35 @@ namespace PepperDash_Essentials_Core.Bridges.JoinMaps
JoinType = eJoinType.Serial
});
+ [JoinName("AvailableLayoutsFb")]
+ public JoinDataComplete AvailableLayoutsFb = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 142,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "xSig of all available layouts",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("SelectLayout")]
+ public JoinDataComplete SelectLayout = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 142,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Select Layout by string",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+
[JoinName("CurrentParticipants")]
public JoinDataComplete CurrentParticipants = new JoinDataComplete(
new JoinData
@@ -3083,4 +3175,4 @@ namespace PepperDash_Essentials_Core.Bridges.JoinMaps
{
}
}
-}
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/DeviceConfig.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/DeviceConfig.cs
index 1d9ed1c2..5c1ee54c 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/DeviceConfig.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/DeviceConfig.cs
@@ -1,35 +1,35 @@
-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;
-
-namespace PepperDash.Essentials.Core.Config
-{
- public class DeviceConfig
- {
- [JsonProperty("key")]
- public string Key { get; set; }
-
- [JsonProperty("uid")]
- public int Uid { get; set; }
-
- [JsonProperty("name")]
- public string Name { get; set; }
-
- [JsonProperty("group")]
- public string Group { get; set; }
-
- [JsonProperty("type")]
- public string Type { get; set; }
-
- [JsonProperty("properties")]
- [JsonConverter(typeof(DevicePropertiesConverter))]
+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;
+
+namespace PepperDash.Essentials.Core.Config
+{
+ public class DeviceConfig
+ {
+ [JsonProperty("key")]
+ public string Key { get; set; }
+
+ [JsonProperty("uid")]
+ public int Uid { get; set; }
+
+ [JsonProperty("name")]
+ public string Name { get; set; }
+
+ [JsonProperty("group")]
+ public string Group { get; set; }
+
+ [JsonProperty("type")]
+ public string Type { get; set; }
+
+ [JsonProperty("properties")]
+ [JsonConverter(typeof(DevicePropertiesConverter))]
public JToken Properties { get; set; }
public DeviceConfig(DeviceConfig dc)
@@ -39,39 +39,42 @@ namespace PepperDash.Essentials.Core.Config
Name = dc.Name;
Group = dc.Group;
Type = dc.Type;
- Properties = JToken.FromObject(dc.Properties);
+
+ Properties = JToken.Parse(dc.Properties.ToString());
+
+ //Properties = JToken.FromObject(dc.Properties);
}
public DeviceConfig() {}
- }
-
- ///
- ///
- ///
- public class DevicePropertiesConverter : JsonConverter
- {
-
- public override bool CanConvert(Type objectType)
- {
- return objectType == typeof(JToken);
- }
-
- public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
- {
- return JToken.ReadFrom(reader);
- }
-
- public override bool CanWrite
- {
- get
- {
- return false;
- }
- }
-
- public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
- {
- throw new NotImplementedException("SOD OFF HOSER");
- }
- }
+ }
+
+ ///
+ ///
+ ///
+ public class DevicePropertiesConverter : JsonConverter
+ {
+
+ public override bool CanConvert(Type objectType)
+ {
+ return objectType == typeof(JToken);
+ }
+
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ return JToken.ReadFrom(reader);
+ }
+
+ public override bool CanWrite
+ {
+ get
+ {
+ return false;
+ }
+ }
+
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ throw new NotImplementedException("SOD OFF HOSER");
+ }
+ }
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron/CrestronGenericBaseDevice.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron/CrestronGenericBaseDevice.cs
index b7534087..32407ba3 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron/CrestronGenericBaseDevice.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Crestron/CrestronGenericBaseDevice.cs
@@ -73,11 +73,14 @@ namespace PepperDash.Essentials.Core
{
//Debug.Console(1, this, " Does not require registration. Skipping");
- var response = Hardware.RegisterWithLogging(Key);
- if (response != eDeviceRegistrationUnRegistrationResponse.Success)
+ if (Hardware.Registerable && !Hardware.Registered)
{
- //Debug.Console(0, this, "ERROR: Cannot register Crestron device: {0}", response);
- return false;
+ var response = Hardware.RegisterWithLogging(Key);
+ if (response != eDeviceRegistrationUnRegistrationResponse.Success)
+ {
+ //Debug.Console(0, this, "ERROR: Cannot register Crestron device: {0}", response);
+ return false;
+ }
}
IsRegistered.FireUpdate();
@@ -86,7 +89,10 @@ namespace PepperDash.Essentials.Core
{
AddPostActivationAction(() =>
{
- var response = Hardware.RegisterWithLogging(Key);
+ if (Hardware.Registerable && !Hardware.Registered)
+ {
+ var response = Hardware.RegisterWithLogging(Key);
+ }
IsRegistered.FireUpdate();
});
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/DeviceManager.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/DeviceManager.cs
index df864550..57bf2287 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/DeviceManager.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/DeviceManager.cs
@@ -14,6 +14,7 @@ namespace PepperDash.Essentials.Core
public static class DeviceManager
{
public static event EventHandler AllDevicesActivated;
+ public static event EventHandler AllDevicesRegistered;
private static readonly CCriticalSection DeviceCriticalSection = new CCriticalSection();
private static readonly CEvent AllowAddDevicesCEvent = new CEvent(false, true);
@@ -57,6 +58,8 @@ namespace PepperDash.Essentials.Core
{
try
{
+ OnAllDevicesRegistered();
+
DeviceCriticalSection.Enter();
AddDeviceEnabled = false;
// PreActivate all devices
@@ -129,6 +132,15 @@ namespace PepperDash.Essentials.Core
}
}
+ private static void OnAllDevicesRegistered()
+ {
+ var handler = AllDevicesRegistered;
+ if (handler != null)
+ {
+ handler(null, new EventArgs());
+ }
+ }
+
///
/// Calls activate on all Device class items
///
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/EssentialsDevice.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/EssentialsDevice.cs
index a72bd282..a3ca94f3 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/EssentialsDevice.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/EssentialsDevice.cs
@@ -131,4 +131,15 @@ namespace PepperDash.Essentials.Core
///
public string MinimumEssentialsFrameworkVersion { get; protected set; }
}
+
+ public abstract class EssentialsPluginDevelopmentDeviceFactory : EssentialsDeviceFactory, IPluginDevelopmentDeviceFactory where T : EssentialsDevice
+ {
+ ///
+ /// Specifies the minimum version of Essentials required for a plugin to run. Must use the format Major.Minor.Build (ex. "1.4.33")
+ ///
+ public string MinimumEssentialsFrameworkVersion { get; protected set; }
+
+ public List DevelopmentEssentialsFrameworkVersions { get; protected set; }
+ }
+
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/IVolumeAndAudioInterfaces.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/IVolumeAndAudioInterfaces.cs
index 1cff62fc..c8a5df39 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/IVolumeAndAudioInterfaces.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/IVolumeAndAudioInterfaces.cs
@@ -7,25 +7,61 @@ using Crestron.SimplSharp;
namespace PepperDash.Essentials.Core
{
///
- /// Defines minimal volume control methods
+ /// Defines minimal volume and mute control methods
///
- public interface IBasicVolumeControls
+ public interface IBasicVolumeControls
{
void VolumeUp(bool pressRelease);
void VolumeDown(bool pressRelease);
void MuteToggle();
}
+ ///
+ /// Defines basic volume control methods
+ ///
+ public interface IHasVolumeControl
+ {
+ void VolumeUp(bool pressRelease);
+ void VolumeDown(bool pressRelease);
+ }
+
+ ///
+ /// Defines volume control methods and properties with feedback
+ ///
+ public interface IHasVolumeControlWithFeedback : IHasVolumeControl
+ {
+ void SetVolume(ushort level);
+ IntFeedback VolumeLevelFeedback { get; }
+ }
+
+ ///
+ /// Defines basic mute control methods
+ ///
+ public interface IHasMuteControl
+ {
+ void MuteToggle();
+ }
+
+ ///
+ /// Defines mute control methods and properties with feedback
+ ///
+ public interface IHasMuteControlWithFeedback : IHasMuteControl
+ {
+ BoolFeedback MuteFeedback { get; }
+ void MuteOn();
+ void MuteOff();
+ }
+
///
/// Adds feedback and direct volume level set to IBasicVolumeControls
///
- public interface IBasicVolumeWithFeedback : IBasicVolumeControls
+ public interface IBasicVolumeWithFeedback : IBasicVolumeControls
{
- void SetVolume(ushort level);
- void MuteOn();
- void MuteOff();
- IntFeedback VolumeLevelFeedback { get; }
BoolFeedback MuteFeedback { get; }
+ void MuteOn();
+ void MuteOff();
+ void SetVolume(ushort level);
+ IntFeedback VolumeLevelFeedback { get; }
}
///
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/PduInterfaces.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/PduInterfaces.cs
new file mode 100644
index 00000000..0f3b3fbf
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/PduInterfaces.cs
@@ -0,0 +1,35 @@
+using System.Collections.Generic;
+using Crestron.SimplSharp;
+using PepperDash.Core;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash_Essentials_Core.Devices
+{
+ ///
+ /// Interface for any device that is able to control it'spower and has a configurable reboot time
+ ///
+ public interface IHasPowerCycle : IKeyName, IHasPowerControlWithFeedback
+ {
+ ///
+ /// Delay between power off and power on for reboot
+ ///
+ int PowerCycleTimeMs { get;}
+
+ ///
+ /// Reboot outlet
+ ///
+ void PowerCycle();
+ }
+
+ ///
+ /// Interface for any device that contains a collection of IHasPowerReboot Devices
+ ///
+ public interface IHasControlledPowerOutlets : IKeyName
+ {
+ ///
+ /// Collection of IPduOutlets
+ ///
+ ReadOnlyDictionary PduOutlets { get; }
+
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/ReconfigurableDevice.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/ReconfigurableDevice.cs
index 3239e192..a54f728d 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/ReconfigurableDevice.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/ReconfigurableDevice.cs
@@ -59,7 +59,7 @@ namespace PepperDash.Essentials.Core.Devices
///
/// Used by the extending class to allow for any custom actions to be taken (tell the ConfigWriter to write config, etc)
///
- ///
+ ///
protected virtual void CustomSetConfig(DeviceConfig config)
{
ConfigWriter.UpdateDeviceConfig(config);
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Extensions/StringExtensions.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Extensions/StringExtensions.cs
new file mode 100644
index 00000000..708ed930
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Extensions/StringExtensions.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Essentials.Core
+{
+ public static class StringExtensions
+ {
+ public static string NullIfEmpty(this string s)
+ {
+ return string.IsNullOrEmpty(s) ? null : s;
+ }
+ public static string NullIfWhiteSpace(this string s)
+ {
+ return string.IsNullOrEmpty(s.Trim()) ? null : s;
+ }
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs
new file mode 100644
index 00000000..51d64230
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs
@@ -0,0 +1,278 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using Crestron.SimplSharp.CrestronIO;
+using PepperDash.Core;
+using Crestron.SimplSharpPro.CrestronThread;
+
+namespace PepperDash.Essentials.Core
+{
+ public static class FileIO
+ {
+
+ static CCriticalSection fileLock = new CCriticalSection();
+ public delegate void GotFileEventHandler(object sender, FileEventArgs e);
+ public static event GotFileEventHandler GotFileEvent;
+
+ ///
+ /// Get the full file info from a path/filename, can include wildcards.
+ ///
+ ///
+ ///
+ public static FileInfo[] GetFiles(string fileName)
+ {
+ DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName));
+ var files = dirInfo.GetFiles(Path.GetFileName(fileName));
+ Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fileName);
+ if (files.Count() > 0)
+ {
+ return files;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public static FileInfo GetFile(string fileName)
+ {
+ DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName));
+ var files = dirInfo.GetFiles(Path.GetFileName(fileName));
+ Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fileName);
+ if (files.Count() > 0)
+ {
+ return files.FirstOrDefault();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+
+ ///
+ /// Get the data from string path/filename
+ ///
+ ///
+ ///
+ public static string ReadDataFromFile(string fileName)
+ {
+ try
+ {
+ return ReadDataFromFile(GetFile(fileName));
+ }
+ catch (Exception e)
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e);
+ return "";
+ }
+ }
+
+ ///
+ /// Get the data with fileInfo object
+ ///
+ ///
+ ///
+ public static string ReadDataFromFile(FileInfo file)
+ {
+ try
+ {
+ if (fileLock.TryEnter())
+ {
+ DirectoryInfo dirInfo = new DirectoryInfo(file.Name);
+ Debug.Console(2, "FileIO Getting Data {0}", file.FullName);
+
+ if (File.Exists(file.FullName))
+ {
+ using (StreamReader r = new StreamReader(file.FullName))
+ {
+ return r.ReadToEnd();
+ }
+ }
+ else
+ {
+ Debug.Console(2, "File {0} does not exsist", file.FullName);
+ return "";
+ }
+ }
+ else
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock");
+ return "";
+ }
+
+ }
+ catch (Exception e)
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e);
+ return "";
+ }
+ finally
+ {
+ if (fileLock != null && !fileLock.Disposed)
+ fileLock.Leave();
+
+ }
+ }
+
+
+ public static void ReadDataFromFileASync(string fileName)
+ {
+ try
+ {
+ ReadDataFromFileASync(GetFile(fileName));
+ }
+ catch (Exception e)
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e);
+ }
+ }
+
+ public static void ReadDataFromFileASync(FileInfo file)
+ {
+ try
+ {
+ CrestronInvoke.BeginInvoke(o => _ReadDataFromFileASync(file));
+ }
+ catch (Exception e)
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e);
+ }
+ }
+
+ private static void _ReadDataFromFileASync(FileInfo file)
+ {
+ string data;
+ try
+ {
+ if (fileLock.TryEnter())
+ {
+ DirectoryInfo dirInfo = new DirectoryInfo(file.Name);
+ Debug.Console(2, "FileIO Getting Data {0}", file.FullName);
+
+
+ if (File.Exists(file.FullName))
+ {
+ using (StreamReader r = new StreamReader(file.FullName))
+ {
+ data = r.ReadToEnd();
+ }
+ }
+ else
+ {
+ Debug.Console(2, "File {0} Does not exsist", file.FullName);
+ data = "";
+ }
+ GotFileEvent.Invoke(null, new FileEventArgs(data));
+ }
+ else
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock");
+ }
+
+ }
+ catch (Exception e)
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e);
+ data = "";
+ }
+ finally
+ {
+ if (fileLock != null && !fileLock.Disposed)
+ fileLock.Leave();
+
+ }
+
+
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static void WriteDataToFile(string data, string filePath)
+ {
+ Thread _WriteFileThread;
+ _WriteFileThread = new Thread((O) => _WriteFileMethod(data, filePath), null, Thread.eThreadStartOptions.CreateSuspended);
+ _WriteFileThread.Priority = Thread.eThreadPriority.LowestPriority;
+ _WriteFileThread.Start();
+ Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WriteFile Thread");
+
+ }
+
+ static object _WriteFileMethod(string data, string filePath)
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to write file: '{0}'", filePath);
+
+ try
+ {
+ if (fileLock.TryEnter())
+ {
+ using (StreamWriter sw = new StreamWriter(filePath))
+ {
+ sw.Write(data);
+ sw.Flush();
+ }
+
+ }
+ else
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock");
+ }
+
+ }
+ catch (Exception e)
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO write failed: \r{0}", e);
+ }
+ finally
+ {
+ if (fileLock != null && !fileLock.Disposed)
+ fileLock.Leave();
+
+ }
+ return null;
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public static bool FileIoUnitTest()
+ {
+ var testData = "Testing FileIO";
+ FileIO.WriteDataToFile(testData, "\\user\\FileIOTest.pdt");
+
+ var file = FileIO.GetFile("\\user\\*FileIOTest*");
+
+ var readData = FileIO.ReadDataFromFile(file);
+ Debug.Console(0, "Returned {0}", readData);
+ File.Delete(file.FullName);
+ if (testData == readData)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ }
+ public class FileEventArgs
+ {
+ public FileEventArgs(string data) { Data = data; }
+ public string Data { get; private set; } // readonly
+
+ }
+}
\ 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 9d792437..09529ff8 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Global/Global.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Global/Global.cs
@@ -1,4 +1,5 @@
using System;
+using System.Linq;
using System.Text.RegularExpressions;
using System.Globalization;
using Crestron.SimplSharp;
@@ -6,6 +7,7 @@ using System.Collections.Generic;
using Crestron.SimplSharp.CrestronIO;
using Crestron.SimplSharp.CrestronDataStore;
using Crestron.SimplSharpPro;
+using Crestron.SimplSharpPro.DM;
using PepperDash.Core;
using PepperDash.Essentials.License;
@@ -39,7 +41,14 @@ namespace PepperDash.Essentials.Core
{
get
{
- return ControlSystem.ControllerPrompt.ToLower().IndexOf("dmps") > -1;
+ if(ControlSystem.SystemControl != null)
+ {
+ if(ControlSystem.SystemControl.SystemControlType > 0)
+ {
+ return true;
+ }
+ }
+ return false;
}
}
@@ -50,7 +59,39 @@ namespace PepperDash.Essentials.Core
{
get
{
- return ControlSystemIsDmpsType && ControlSystem.ControllerPrompt.ToLower().IndexOf("4k") > -1;
+ if(ControlSystem.SystemControl != null)
+ {
+ if(ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K150CSystemControl ||
+ ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K200CSystemControl ||
+ ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K250CSystemControl ||
+ ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K300CSystemControl ||
+ ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K350CSystemControl)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+
+ ///
+ /// True when the processor type is a DMPS 4K 200/300/250/350 variant
+ ///
+ public static bool ControlSystemIsDmps4k3xxType
+ {
+ get
+ {
+ if(ControlSystem.SystemControl != null)
+ {
+ if(ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K200CSystemControl ||
+ ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K250CSystemControl ||
+ ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K300CSystemControl ||
+ ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K350CSystemControl)
+ {
+ return true;
+ }
+ }
+ return false;
}
}
@@ -122,6 +163,38 @@ namespace PepperDash.Essentials.Core
AssemblyVersion = assemblyVersion;
}
+ public static bool IsRunningDevelopmentVersion(List developmentVersions, string minimumVersion)
+ {
+ if (Regex.Match(AssemblyVersion, @"^(\d*).(\d*).(\d*).*").Groups[1].Value == "0")
+ {
+ Debug.Console(2, "Running Local Build. Bypassing Dependency Check.");
+ return true;
+ }
+
+ if (developmentVersions == null)
+ {
+ Debug.Console(0,
+ "Development Plugin does not specify a list of versions. Loading plugin may not work as expected. Checking Minumum version");
+ return IsRunningMinimumVersionOrHigher(minimumVersion);
+ }
+
+ Debug.Console(2, "Comparing running version '{0}' to minimum versions '{1}'", AssemblyVersion, developmentVersions);
+
+ var versionMatch = developmentVersions.FirstOrDefault(x => x == AssemblyVersion);
+
+ if (String.IsNullOrEmpty(versionMatch))
+ {
+ Debug.Console(0, "Essentials Build does not match any builds required for plugin load. Bypassing Plugin Load.");
+ return false;
+ }
+
+ Debug.Console(2, "Essentials Build {0} matches list of development builds", AssemblyVersion);
+ return IsRunningMinimumVersionOrHigher(minimumVersion);
+
+
+
+ }
+
///
/// Checks to see if the running version meets or exceed the minimum specified version. For beta versions (0.xx.yy), will always return true.
///
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Lighting/LightingBase.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Lighting/LightingBase.cs
index 604965af..48a4aa76 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Lighting/LightingBase.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Lighting/LightingBase.cs
@@ -92,50 +92,47 @@ namespace PepperDash.Essentials.Core.Lighting
return LinkLightingToApi(lightingDevice, trilist, joinMap);
}
- protected GenericLightingJoinMap LinkLightingToApi(LightingBase lightingDevice, BasicTriList trilist, GenericLightingJoinMap joinMap)
- {
+ protected GenericLightingJoinMap LinkLightingToApi(LightingBase lightingDevice, BasicTriList trilist, GenericLightingJoinMap joinMap)
+ {
+ Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
+ Debug.Console(0, "Linking to Lighting Type {0}", lightingDevice.GetType().Name.ToString());
- Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
+ // GenericLighitng Actions & FeedBack
+ trilist.SetUShortSigAction(joinMap.SelectScene.JoinNumber, u => lightingDevice.SelectScene(lightingDevice.LightingScenes[u]));
- Debug.Console(0, "Linking to Lighting Type {0}", lightingDevice.GetType().Name.ToString());
+ var sceneIndex = 0;
+ foreach (var scene in lightingDevice.LightingScenes)
+ {
+ var index = sceneIndex;
- // GenericLighitng Actions & FeedBack
- trilist.SetUShortSigAction(joinMap.SelectScene.JoinNumber, u => lightingDevice.SelectScene(lightingDevice.LightingScenes[u]));
+ trilist.SetSigTrueAction((uint)(joinMap.SelectSceneDirect.JoinNumber + index), () => lightingDevice.SelectScene(lightingDevice.LightingScenes[index]));
+ scene.IsActiveFeedback.LinkInputSig(trilist.BooleanInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + index)]);
+ trilist.StringInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + index)].StringValue = scene.Name;
+ trilist.BooleanInput[(uint)(joinMap.ButtonVisibility.JoinNumber + index)].BoolValue = true;
- var sceneIndex = 0;
- foreach (var scene in lightingDevice.LightingScenes)
- {
- var index = sceneIndex;
+ sceneIndex++;
+ }
- trilist.SetSigTrueAction((uint)(joinMap.SelectSceneDirect.JoinNumber + index), () => lightingDevice.SelectScene(lightingDevice.LightingScenes[index]));
- scene.IsActiveFeedback.LinkInputSig(trilist.BooleanInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + index)]);
- trilist.StringInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + index)].StringValue = scene.Name;
- trilist.BooleanInput[(uint)(joinMap.ButtonVisibility.JoinNumber + index)].BoolValue = true;
+ trilist.OnlineStatusChange += (sender, args) =>
+ {
+ if (!args.DeviceOnLine) return;
- sceneIndex++;
- }
+ sceneIndex = 0;
+ foreach (var scene in lightingDevice.LightingScenes)
+ {
+ var index = sceneIndex;
- trilist.OnlineStatusChange += (sender, args) =>
- {
- if (!args.DeviceOnLine) return;
+ trilist.StringInput[(uint) (joinMap.SelectSceneDirect.JoinNumber + index)].StringValue = scene.Name;
+ trilist.BooleanInput[(uint) (joinMap.ButtonVisibility.JoinNumber + index)].BoolValue = true;
+ scene.IsActiveFeedback.FireUpdate();
- sceneIndex = 0;
- foreach (var scene in lightingDevice.LightingScenes)
- {
- var index = sceneIndex;
-
- trilist.StringInput[(uint) (joinMap.SelectSceneDirect.JoinNumber + index)].StringValue = scene.Name;
- trilist.BooleanInput[(uint) (joinMap.ButtonVisibility.JoinNumber + index)].BoolValue = true;
- scene.IsActiveFeedback.FireUpdate();
-
- sceneIndex++;
- }
- };
-
- return joinMap;
- }
+ sceneIndex++;
+ }
+ };
+ return joinMap;
+ }
}
public class LightingScene
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj
index df9b8115..dfa59b88 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj
@@ -123,6 +123,7 @@
+
@@ -204,6 +205,7 @@
+
@@ -216,6 +218,7 @@
+
@@ -225,6 +228,7 @@
+
@@ -336,7 +340,9 @@
-
+
+
+
@@ -361,6 +367,7 @@
+
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Plugins/IPluginDeviceFactory.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Plugins/IPluginDeviceFactory.cs
index ff979599..ec823007 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Plugins/IPluginDeviceFactory.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Plugins/IPluginDeviceFactory.cs
@@ -1,3 +1,4 @@
+using System.Collections.Generic;
using PepperDash.Core;
@@ -15,5 +16,10 @@ namespace PepperDash.Essentials.Core
}
+ public interface IPluginDevelopmentDeviceFactory : IPluginDeviceFactory
+ {
+ List DevelopmentEssentialsFrameworkVersions { get; }
+ }
+}
+
-}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Plugins/PluginLoader.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Plugins/PluginLoader.cs
index 136303e3..9da843b8 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Plugins/PluginLoader.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Plugins/PluginLoader.cs
@@ -425,7 +425,11 @@ namespace PepperDash.Essentials
///
static void LoadCustomPlugin(IPluginDeviceFactory plugin, LoadedAssembly loadedAssembly)
{
- var passed = Global.IsRunningMinimumVersionOrHigher(plugin.MinimumEssentialsFrameworkVersion);
+ var developmentPlugin = plugin as IPluginDevelopmentDeviceFactory;
+
+ var passed = developmentPlugin != null ? Global.IsRunningDevelopmentVersion
+ (developmentPlugin.DevelopmentEssentialsFrameworkVersions, developmentPlugin.MinimumEssentialsFrameworkVersion)
+ : Global.IsRunningMinimumVersionOrHigher(plugin.MinimumEssentialsFrameworkVersion);
if (!passed)
{
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronGlobalSecretsProvider.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronGlobalSecretsProvider.cs
new file mode 100644
index 00000000..5adefd9e
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronGlobalSecretsProvider.cs
@@ -0,0 +1,102 @@
+using System;
+using Crestron.SimplSharp;
+using Crestron.SimplSharp.CrestronDataStore;
+using PepperDash.Core;
+
+
+namespace PepperDash.Essentials.Core
+{
+ public class CrestronGlobalSecretsProvider : ISecretProvider
+ {
+ public string Key { get; set; }
+ //Added for reference
+ public string Description { get; private set; }
+
+ public CrestronGlobalSecretsProvider(string key)
+ {
+ Key = key;
+ Description = String.Format("Default secret provider serving all local applications");
+
+ }
+
+ static CrestronGlobalSecretsProvider()
+ {
+ //Added for future encrypted reference
+ var secureSupported = CrestronSecureStorage.Supported;
+
+ CrestronDataStoreStatic.InitCrestronDataStore();
+ if (secureSupported)
+ {
+ //doThingsFuture
+ }
+ }
+
+ ///
+ /// Set secret for item in the CrestronSecretsProvider
+ ///
+ /// Secret Key
+ /// Secret Value
+ public bool SetSecret(string key, object value)
+ {
+ var secret = value as string;
+ CrestronDataStore.CDS_ERROR returnCode;
+
+ if (String.IsNullOrEmpty(secret))
+ {
+ returnCode = CrestronDataStoreStatic.clearGlobal(key);
+ if (returnCode == CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
+ {
+ Debug.Console(0, this, "Successfully removed secret \"{0}\"", secret);
+ return true;
+ }
+ }
+
+ else
+ {
+ returnCode = CrestronDataStoreStatic.SetGlobalStringValue(key, secret);
+ if (returnCode == CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
+ {
+ Debug.Console(0, this, "Successfully set secret \"{0}\"", secret);
+ return true;
+ }
+ }
+
+ Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Unable to set secret for {0}:{1} - {2}", Key, key, returnCode.ToString());
+ return false;
+ }
+
+ ///
+ /// Retrieve secret for item in the CrestronSecretsProvider
+ ///
+ /// Secret Key
+ /// ISecret Object containing key, provider, and value
+ public ISecret GetSecret(string key)
+ {
+ string mySecret;
+ var getErrorCode = CrestronDataStoreStatic.GetGlobalStringValue(key, out mySecret);
+
+ switch (getErrorCode)
+ {
+ case CrestronDataStore.CDS_ERROR.CDS_SUCCESS:
+ Debug.Console(2, this, "Secret Successfully retrieved for {0}:{1}", Key, key);
+ return new CrestronSecret(key, mySecret, this);
+ default:
+ Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Unable to retrieve secret for {0}:{1} - {2}",
+ Key, key, getErrorCode.ToString());
+ return null;
+ }
+ }
+
+ ///
+ /// Determine if a secret is present within the provider without retrieving it
+ ///
+ /// Secret Key
+ /// bool if present
+ public bool TestSecret(string key)
+ {
+ string mySecret;
+ return CrestronDataStoreStatic.GetGlobalStringValue(key, out mySecret) == CrestronDataStore.CDS_ERROR.CDS_SUCCESS;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronSecretsProvider.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronLocalSecretsProvider.cs
similarity index 52%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronSecretsProvider.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronLocalSecretsProvider.cs
index 3e0a5964..955c875c 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronSecretsProvider.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronLocalSecretsProvider.cs
@@ -1,97 +1,103 @@
-using System;
-using Crestron.SimplSharp;
-using Crestron.SimplSharp.CrestronDataStore;
-using PepperDash.Core;
-
-
-namespace PepperDash.Essentials.Core
-{
- public class CrestronSecretsProvider : ISecretProvider
- {
- public string Key { get; set; }
- //Added for reference
- private static readonly bool SecureSupported;
- public CrestronSecretsProvider(string key)
- {
- Key = key;
- }
-
- static CrestronSecretsProvider()
- {
- //Added for future encrypted reference
- SecureSupported = CrestronSecureStorage.Supported;
-
- CrestronDataStoreStatic.InitCrestronDataStore();
- if (SecureSupported)
- {
- //doThingsFuture
- }
- }
-
- ///
- /// Set secret for item in the CrestronSecretsProvider
- ///
- /// Secret Key
- /// Secret Value
- public bool SetSecret(string key, object value)
- {
- var secret = value as string;
- if (String.IsNullOrEmpty(secret))
- {
- Debug.Console(2, this, "Unable to set secret for {0}:{1} - value is empty.", Key, key);
- return false;
- }
- var setErrorCode = CrestronDataStoreStatic.SetLocalStringValue(key, secret);
- switch (setErrorCode)
- {
- case CrestronDataStore.CDS_ERROR.CDS_SUCCESS:
- Debug.Console(1, this,"Secret Successfully Set for {0}:{1}", Key, key);
- return true;
- default:
- Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Unable to set secret for {0}:{1} - {2}", Key, key, setErrorCode.ToString());
- return false;
- }
- }
-
- ///
- /// Retrieve secret for item in the CrestronSecretsProvider
- ///
- /// Secret Key
- /// ISecret Object containing key, provider, and value
- public ISecret GetSecret(string key)
- {
- string mySecret;
- var getErrorCode = CrestronDataStoreStatic.GetLocalStringValue(key, out mySecret);
-
- switch (getErrorCode)
- {
- case CrestronDataStore.CDS_ERROR.CDS_SUCCESS:
- Debug.Console(2, this, "Secret Successfully retrieved for {0}:{1}", Key, key);
- return new CrestronSecret(key, mySecret, this);
- default:
- Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Unable to retrieve secret for {0}:{1} - {2}",
- Key, key, getErrorCode.ToString());
- return null;
- }
- }
- }
-
- ///
- /// Special container class for CrestronSecret provider
- ///
- public class CrestronSecret : ISecret
- {
- public ISecretProvider Provider { get; private set; }
- public string Key { get; private set; }
-
- public object Value { get; private set; }
-
- public CrestronSecret(string key, string value, ISecretProvider provider)
- {
- Key = key;
- Value = value;
- Provider = provider;
- }
-
- }
+using System;
+using Crestron.SimplSharp;
+using Crestron.SimplSharp.CrestronDataStore;
+using PepperDash.Core;
+using Crestron.SimplSharpPro;
+
+
+namespace PepperDash.Essentials.Core
+{
+ public class CrestronLocalSecretsProvider : ISecretProvider
+ {
+ public string Key { get; set; }
+ //Added for reference
+ public string Description { get; private set; }
+
+
+ public CrestronLocalSecretsProvider(string key)
+ {
+ Key = key;
+ Description = String.Format("Default secret provider serving Essentials Application {0}", InitialParametersClass.ApplicationNumber);
+ }
+
+ static CrestronLocalSecretsProvider()
+ {
+ //Added for future encrypted reference
+ var secureSupported = CrestronSecureStorage.Supported;
+
+ CrestronDataStoreStatic.InitCrestronDataStore();
+ if (secureSupported)
+ {
+ //doThingsFuture
+ }
+ }
+
+ ///
+ /// Set secret for item in the CrestronSecretsProvider
+ ///
+ /// Secret Key
+ /// Secret Value
+ public bool SetSecret(string key, object value)
+ {
+ var secret = value as string;
+ CrestronDataStore.CDS_ERROR returnCode;
+
+ if (String.IsNullOrEmpty(secret))
+ {
+ returnCode = CrestronDataStoreStatic.clearLocal(key);
+ if (returnCode == CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
+ {
+ Debug.Console(0, this, "Successfully removed secret \"{0}\"", secret);
+ return true;
+ }
+ }
+
+ else
+ {
+ returnCode = CrestronDataStoreStatic.SetLocalStringValue(key, secret);
+ if (returnCode == CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
+ {
+ Debug.Console(0, this, "Successfully set secret \"{0}\"", secret);
+ return true;
+ }
+ }
+
+ Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Unable to set secret for {0}:{1} - {2}", Key, key, returnCode.ToString());
+ return false;
+ }
+
+ ///
+ /// Retrieve secret for item in the CrestronSecretsProvider
+ ///
+ /// Secret Key
+ /// ISecret Object containing key, provider, and value
+ public ISecret GetSecret(string key)
+ {
+ string mySecret;
+ var getErrorCode = CrestronDataStoreStatic.GetLocalStringValue(key, out mySecret);
+
+ switch (getErrorCode)
+ {
+ case CrestronDataStore.CDS_ERROR.CDS_SUCCESS:
+ Debug.Console(2, this, "Secret Successfully retrieved for {0}:{1}", Key, key);
+ return new CrestronSecret(key, mySecret, this);
+ default:
+ Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Unable to retrieve secret for {0}:{1} - {2}",
+ Key, key, getErrorCode.ToString());
+ return null;
+ }
+ }
+
+ ///
+ /// Determine if a secret is present within the provider without retrieving it
+ ///
+ /// Secret Key
+ /// bool if present
+ public bool TestSecret(string key)
+ {
+ string mySecret;
+ return CrestronDataStoreStatic.GetLocalStringValue(key, out mySecret) == CrestronDataStore.CDS_ERROR.CDS_SUCCESS;
+ }
+ }
+
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronSecret.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronSecret.cs
new file mode 100644
index 00000000..27fbcdad
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/CrestronSecret.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Essentials.Core
+{
+ ///
+ /// Special container class for CrestronSecret provider
+ ///
+ public class CrestronSecret : ISecret
+ {
+ public ISecretProvider Provider { get; private set; }
+ public string Key { get; private set; }
+
+ public object Value { get; private set; }
+
+ public CrestronSecret(string key, string value, ISecretProvider provider)
+ {
+ Key = key;
+ Value = value;
+ Provider = provider;
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/Interfaces.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/Interfaces.cs
index 43c6a230..e61ac208 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/Interfaces.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/Interfaces.cs
@@ -7,9 +7,32 @@ namespace PepperDash.Essentials.Core
///
public interface ISecretProvider : IKeyed
{
+ ///
+ /// Set secret value for provider by key
+ ///
+ /// key of secret to set
+ /// value to set secret to
+ ///
bool SetSecret(string key, object value);
+ ///
+ /// Return object containing secret from provider
+ ///
+ /// key of secret to retrieve
+ ///
ISecret GetSecret(string key);
+
+ ///
+ /// Verifies presence of secret
+ ///
+ /// key of secret to chek
+ ///
+ bool TestSecret(string key);
+
+ ///
+ /// Description of the secrets provider
+ ///
+ string Description { get; }
}
///
@@ -17,8 +40,19 @@ namespace PepperDash.Essentials.Core
///
public interface ISecret
{
+ ///
+ /// Instance of ISecretProvider that the secret belongs to
+ ///
ISecretProvider Provider { get; }
+
+ ///
+ /// Key of the secret in the provider
+ ///
string Key { get; }
+
+ ///
+ /// Value of the secret
+ ///
object Value { get; }
}
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/SecretsManager.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/SecretsManager.cs
index bcb46ff5..95a94a24 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/SecretsManager.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Secrets/SecretsManager.cs
@@ -1,9 +1,9 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using Crestron.SimplSharp;
using PepperDash.Core;
-
namespace PepperDash.Essentials.Core
{
public static class SecretsManager
@@ -16,18 +16,28 @@ namespace PepperDash.Essentials.Core
public static void Initialize()
{
- AddSecretProvider("default", new CrestronSecretsProvider("default"));
+ AddSecretProvider("default", new CrestronLocalSecretsProvider("default"));
+
+ AddSecretProvider("CrestronGlobalSecrets", new CrestronGlobalSecretsProvider("CrestronGlobalSecrets"));
CrestronConsole.AddNewConsoleCommand(SetSecretProcess, "setsecret",
- "Adds secrets to secret provider",
+ "Adds secret to secrets provider",
ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(UpdateSecretProcess, "updatesecret",
- "Updates secrets in secret provider",
+ "Updates secret in secrets provider",
ConsoleAccessLevelEnum.AccessAdministrator);
CrestronConsole.AddNewConsoleCommand(DeleteSecretProcess, "deletesecret",
- "Deletes secrets in secret provider",
+ "Deletes secret from secrest provider",
+ ConsoleAccessLevelEnum.AccessAdministrator);
+
+ CrestronConsole.AddNewConsoleCommand(ListProviders, "secretproviderlist",
+ "Return list of all valid secrets providers",
+ ConsoleAccessLevelEnum.AccessAdministrator);
+
+ CrestronConsole.AddNewConsoleCommand(GetProviderInfo, "secretproviderinfo",
+ "Return data about secrets provider",
ConsoleAccessLevelEnum.AccessAdministrator);
}
@@ -54,6 +64,79 @@ namespace PepperDash.Essentials.Core
return secret;
}
+ public static void GetProviderInfo(string cmd)
+ {
+ string response;
+ var args = cmd.Split(' ');
+
+ if (cmd.Length == 0 || (args.Length == 1 && args[0] == "?"))
+ {
+ response = "Returns data about secrets provider. Format 'secretproviderinfo '";
+ CrestronConsole.ConsoleCommandResponse(response);
+ return;
+
+ }
+
+ if (args.Length == 1)
+ {
+ var provider = GetSecretProviderByKey(args[0]);
+
+ if (provider == null)
+ {
+ response = "Invalid secrets provider key";
+ CrestronConsole.ConsoleCommandResponse(response);
+ return;
+ }
+
+ response = String.Format("{0} : {1}", provider.Key, provider.Description);
+ CrestronConsole.ConsoleCommandResponse(response);
+ return;
+ }
+
+ response = "Improper number of arguments";
+ CrestronConsole.ConsoleCommandResponse(response);
+
+ }
+
+
+ ///
+ /// Console Command that returns all valid secrets in the essentials program.
+ ///
+ ///
+ public static void ListProviders(string cmd)
+ {
+ var response = String.Empty;
+ var args = cmd.Split(' ');
+
+ if (cmd.Length == 0)
+ {
+ if (Secrets != null && Secrets.Count > 0)
+ {
+ response = Secrets.Aggregate(response,
+ (current, secretProvider) => current + (secretProvider.Key + "\n\r"));
+ }
+ else
+ {
+ response = "No Secrets Providers Available";
+ }
+ CrestronConsole.ConsoleCommandResponse(response);
+ return;
+
+ }
+
+ if (args.Length == 1 && args[0] == "?")
+ {
+ response = "Reports all valid and preset Secret providers";
+ CrestronConsole.ConsoleCommandResponse(response);
+ return;
+ }
+
+
+ response = "Improper number of arguments";
+ CrestronConsole.ConsoleCommandResponse(response);
+
+ }
+
///
/// Add secret provider to secrets dictionary
///
@@ -100,14 +183,14 @@ namespace PepperDash.Essentials.Core
if (args.Length == 0)
{
//some Instructional Text
- response = "Adds secrets to secret provider. Format 'setsecret ";
+ response = "Adds secrets to secret provider. Format 'setsecret '";
CrestronConsole.ConsoleCommandResponse(response);
return;
}
if (args.Length == 1 && args[0] == "?")
{
- response = "Adds secrets to secret provider. Format 'setsecret ";
+ response = "Adds secrets to secret provider. Format 'setsecret '";
CrestronConsole.ConsoleCommandResponse(response);
return;
}
@@ -134,23 +217,7 @@ namespace PepperDash.Essentials.Core
var key = args[1];
var secret = args[2];
- if (provider.GetSecret(key) == null)
- {
-
- response = provider.SetSecret(key, secret)
- ? String.Format(
- "Secret successfully set for {0}:{1}",
- provider.Key, key)
- : String.Format(
- "Unable to set secret for {0}:{1}",
- provider.Key, key);
- CrestronConsole.ConsoleCommandResponse(response);
- return;
- }
- response =
- String.Format(
- "Unable to set secret for {0}:{1} - Please use the 'UpdateSecret' command to modify it");
- CrestronConsole.ConsoleCommandResponse(response);
+ CrestronConsole.ConsoleCommandResponse(SetSecret(provider, key, secret));
}
private static void UpdateSecretProcess(string cmd)
@@ -161,7 +228,7 @@ namespace PepperDash.Essentials.Core
if (args.Length == 0)
{
//some Instructional Text
- response = "Updates secrets in secret provider. Format 'updatesecret ";
+ response = "Updates secrets in secret provider. Format 'updatesecret '";
CrestronConsole.ConsoleCommandResponse(response);
return;
@@ -169,7 +236,7 @@ namespace PepperDash.Essentials.Core
if (args.Length == 1 && args[0] == "?")
{
- response = "Updates secrets in secret provider. Format 'updatesecret ";
+ response = "Updates secrets in secret provider. Format 'updatesecret '";
CrestronConsole.ConsoleCommandResponse(response);
return;
}
@@ -198,23 +265,49 @@ namespace PepperDash.Essentials.Core
var key = args[1];
var secret = args[2];
- if (provider.GetSecret(key) != null)
- {
- response = provider.SetSecret(key, secret)
- ? String.Format(
- "Secret successfully set for {0}:{1}",
- provider.Key, key)
- : String.Format(
- "Unable to set secret for {0}:{1}",
- provider.Key, key);
- CrestronConsole.ConsoleCommandResponse(response);
- return;
- }
+ CrestronConsole.ConsoleCommandResponse(UpdateSecret(provider, key, secret));
+
+ }
+
+ private static string UpdateSecret(ISecretProvider provider, string key, string secret)
+ {
+ var secretPresent = provider.TestSecret(key);
+
+ Debug.Console(2, provider, "SecretsProvider {0} {1} contain a secret entry for {2}", provider.Key, secretPresent ? "does" : "does not", key);
+
+ if (!secretPresent)
+ return
+ String.Format(
+ "Unable to update secret for {0}:{1} - Please use the 'SetSecret' command to modify it");
+ var response = provider.SetSecret(key, secret)
+ ? String.Format(
+ "Secret successfully set for {0}:{1}",
+ provider.Key, key)
+ : String.Format(
+ "Unable to set secret for {0}:{1}",
+ provider.Key, key);
+ return response;
+ }
+
+ private static string SetSecret(ISecretProvider provider, string key, string secret)
+ {
+ var secretPresent = provider.TestSecret(key);
+
+ Debug.Console(2, provider, "SecretsProvider {0} {1} contain a secret entry for {2}", provider.Key, secretPresent ? "does" : "does not", key);
+
+ if (secretPresent)
+ return
+ String.Format(
+ "Unable to set secret for {0}:{1} - Please use the 'UpdateSecret' command to modify it");
+ var response = provider.SetSecret(key, secret)
+ ? String.Format(
+ "Secret successfully set for {0}:{1}",
+ provider.Key, key)
+ : String.Format(
+ "Unable to set secret for {0}:{1}",
+ provider.Key, key);
+ return response;
- response =
- String.Format(
- "Unable to update secret for {0}:{1} - Please use the 'SetSecret' command to create a new secret");
- CrestronConsole.ConsoleCommandResponse(response);
}
private static void DeleteSecretProcess(string cmd)
@@ -225,14 +318,14 @@ namespace PepperDash.Essentials.Core
if (args.Length == 0)
{
//some Instructional Text
- response = "Deletes secrets in secret provider. Format 'deletesecret ";
+ response = "Deletes secrets in secret provider. Format 'deletesecret '";
CrestronConsole.ConsoleCommandResponse(response);
return;
}
if (args.Length == 1 && args[0] == "?")
{
- response = "Deletes secrets in secret provider. Format 'deletesecret ";
+ response = "Deletes secrets in secret provider. Format 'deletesecret '";
CrestronConsole.ConsoleCommandResponse(response);
return;
}
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/SubpageReferenceList.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/SubpageReferenceList.cs
index fe69e4ca..711a3cde 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/SubpageReferenceList.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/SubpageReferenceList.cs
@@ -144,7 +144,7 @@ namespace PepperDash.Essentials.Core
public UShortOutputSig GetUShortOutputSig(uint index, uint sigNum)
{
if (sigNum > UShortIncrement) return null;
- return SRL.UShortOutput.FirstOrDefault(s => s.Name.Equals(GetBoolFeedbackSigName(index, sigNum)));
+ return SRL.UShortOutput.FirstOrDefault(s => s.Name.Equals(GetUShortOutputSigName(index, sigNum)));
}
///
@@ -159,7 +159,7 @@ namespace PepperDash.Essentials.Core
public StringOutputSig GetStringOutputSig(uint index, uint sigNum)
{
if (sigNum > StringIncrement) return null;
- return SRL.StringOutput.FirstOrDefault(s => s.Name.Equals(GetBoolFeedbackSigName(index, sigNum)));
+ return SRL.StringOutput.FirstOrDefault(s => s.Name.Equals(GetStringOutputSigName(index, sigNum)));
}
///
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/UI/TouchpanelBase.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/UI/TouchpanelBase.cs
new file mode 100644
index 00000000..36e0342e
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/UI/TouchpanelBase.cs
@@ -0,0 +1,173 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+using Crestron.SimplSharpPro.DeviceSupport;
+using PepperDash.Core;
+using Crestron.SimplSharpPro.UI;
+using Crestron.SimplSharp.CrestronIO;
+using Crestron.SimplSharpPro;
+
+namespace PepperDash.Essentials.Core.UI
+{
+ public abstract class TouchpanelBase: EssentialsDevice, IHasBasicTriListWithSmartObject
+ {
+ protected CrestronTouchpanelPropertiesConfig _config;
+ public BasicTriListWithSmartObject Panel { get; private set; }
+
+ ///
+ /// Constructor for use with device Factory. A touch panel device will be created based on the provided IP-ID and the
+ /// type of the panel. The SGD File path can be specified using the config property, or a default one located in the program directory if none
+ /// is provided.
+ ///
+ /// Essentials Device Key
+ /// Essentials Device Name
+ /// Touchpanel Type to build
+ /// Touchpanel Configuration
+ /// IP-ID to use for touch panel
+ protected TouchpanelBase(string key, string name, BasicTriListWithSmartObject panel, CrestronTouchpanelPropertiesConfig config)
+ :base(key, name)
+ {
+
+ if (Panel == null)
+ {
+ Debug.Console(0, this, "Panel is not valid. Touchpanel class WILL NOT work correctly");
+ return;
+ }
+
+ Panel = panel;
+
+ Panel.SigChange += Panel_SigChange;
+
+ if (Panel is TswFt5ButtonSystem)
+ {
+ var tsw = Panel as TswFt5ButtonSystem;
+ tsw.ExtenderSystemReservedSigs.Use();
+ tsw.ExtenderSystemReservedSigs.DeviceExtenderSigChange
+ += ExtenderSystemReservedSigs_DeviceExtenderSigChange;
+
+ tsw.ButtonStateChange += Tsw_ButtonStateChange;
+ }
+
+ _config = config;
+
+ AddPreActivationAction(() => {
+ if (Panel.Register() != eDeviceRegistrationUnRegistrationResponse.Success)
+ Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Registration failed. Continuing, but panel may not function: {0}", Panel.RegistrationFailureReason);
+
+ // Give up cleanly if SGD is not present.
+ var sgdName = Global.FilePathPrefix + "sgd" + Global.DirectorySeparator + _config.SgdFile;
+ if (!File.Exists(sgdName))
+ {
+ Debug.Console(0, this, "Smart object file '{0}' not present in User folder. Looking for embedded file", sgdName);
+
+ sgdName = Global.ApplicationDirectoryPathPrefix + Global.DirectorySeparator + "SGD" + Global.DirectorySeparator + _config.SgdFile;
+
+ if (!File.Exists(sgdName))
+ {
+ Debug.Console(0, this, "Unable to find SGD file '{0}' in User sgd or application SGD folder. Exiting touchpanel load.", sgdName);
+ return;
+ }
+ }
+ });
+
+ AddPostActivationAction(() =>
+ {
+ // Check for IEssentialsRoomCombiner in DeviceManager and if found, subscribe to its event
+ var roomCombiner = DeviceManager.AllDevices.FirstOrDefault((d) => d is IEssentialsRoomCombiner) as IEssentialsRoomCombiner;
+
+ if (roomCombiner != null)
+ {
+ // Subscribe to the even
+ roomCombiner.RoomCombinationScenarioChanged += new EventHandler(roomCombiner_RoomCombinationScenarioChanged);
+
+ // Connect to the initial roomKey
+ if (roomCombiner.CurrentScenario != null)
+ {
+ // Use the current scenario
+ DetermineRoomKeyFromScenario(roomCombiner.CurrentScenario);
+ }
+ else
+ {
+ // Current Scenario not yet set. Use default
+ SetupPanelDrivers(_config.DefaultRoomKey);
+ }
+ }
+ else
+ {
+ // No room combiner, use the default key
+ SetupPanelDrivers(_config.DefaultRoomKey);
+ }
+ });
+ }
+
+ ///
+ /// Setup Panel operation
+ ///
+ /// Room Key for this panel
+ protected abstract void SetupPanelDrivers(string roomKey);
+
+
+ ///
+ /// Event handler for System Extender Events
+ ///
+ ///
+ ///
+ protected abstract void ExtenderSystemReservedSigs_DeviceExtenderSigChange(DeviceExtender currentDeviceExtender, SigEventArgs args);
+
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ protected virtual void roomCombiner_RoomCombinationScenarioChanged(object sender, EventArgs e)
+ {
+ var roomCombiner = sender as IEssentialsRoomCombiner;
+
+ DetermineRoomKeyFromScenario(roomCombiner.CurrentScenario);
+ }
+
+ ///
+ /// Determines the room key to use based on the scenario
+ ///
+ ///
+ protected virtual void DetermineRoomKeyFromScenario(IRoomCombinationScenario scenario)
+ {
+ string newRoomKey = null;
+
+ if (scenario.UiMap.ContainsKey(Key))
+ {
+ newRoomKey = scenario.UiMap[Key];
+ }
+ else if (scenario.UiMap.ContainsKey(_config.DefaultRoomKey))
+ {
+ newRoomKey = scenario.UiMap[_config.DefaultRoomKey];
+ }
+
+ SetupPanelDrivers(newRoomKey);
+ }
+
+ private void Panel_SigChange(object currentDevice, Crestron.SimplSharpPro.SigEventArgs args)
+ {
+ if (Debug.Level == 2)
+ Debug.Console(2, this, "Sig change: {0} {1}={2}", args.Sig.Type, args.Sig.Number, args.Sig.StringValue);
+ var uo = args.Sig.UserObject;
+ if (uo is Action)
+ (uo as Action)(args.Sig.BoolValue);
+ else if (uo is Action)
+ (uo as Action)(args.Sig.UShortValue);
+ else if (uo is Action)
+ (uo as Action)(args.Sig.StringValue);
+ }
+
+ private void Tsw_ButtonStateChange(GenericBase device, ButtonEventArgs args)
+ {
+ var uo = args.Button.UserObject;
+ if(uo is Action)
+ (uo as Action)(args.Button.State == eButtonState.Pressed);
+ }
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmChassisController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmChassisController.cs
index ef7fc577..60ef9d69 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmChassisController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmChassisController.cs
@@ -1482,6 +1482,8 @@ namespace PepperDash.Essentials.DM
LinkChassisToApi(trilist, joinMap);
+ trilist.StringInput[joinMap.Name.JoinNumber].StringValue = this.Name;
+
// Link up inputs & outputs
for (uint i = 1; i <= Chassis.NumberOfOutputs; i++)
{
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsAudioOutputController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsAudioOutputController.cs
index 751c1a5a..c0f0ca65 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsAudioOutputController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsAudioOutputController.cs
@@ -17,52 +17,89 @@ using PepperDash.Essentials.DM.Config;
namespace PepperDash.Essentials.DM
{
///
- /// Exposes the volume levels for Program, Aux1 or Aux2 outputs on a DMPS3 chassis
+ /// Exposes the volume levels for Program, Aux1, Aux2, Codec1, Codec2, and Digital outputs on a DMPS3 chassis
///
public class DmpsAudioOutputController : EssentialsBridgeableDevice
{
- Card.Dmps3OutputBase OutputCard;
-
public DmpsAudioOutput MasterVolumeLevel { get; private set; }
public DmpsAudioOutput SourceVolumeLevel { get; private set; }
public DmpsAudioOutput MicsMasterVolumeLevel { get; private set; }
public DmpsAudioOutput Codec1VolumeLevel { get; private set; }
public DmpsAudioOutput Codec2VolumeLevel { get; private set; }
+ public DmpsAudioOutputController(string key, string name, DMOutput card, Card.Dmps3DmHdmiAudioOutput.Dmps3AudioOutputStream stream)
+ : base(key, name)
+ {
+ card.BaseDevice.DMOutputChange += new DMOutputEventHandler(BaseDevice_DMOutputChange);
+ var output = new Dmps3AudioOutputWithMixerBase(stream);
+ MasterVolumeLevel = new DmpsAudioOutputWithMixer(output, eDmpsLevelType.Master);
+ SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
+ }
+ public DmpsAudioOutputController(string key, string name, DMOutput card, Card.Dmps3DmHdmiAudioOutput.Dmps3DmHdmiOutputStream stream)
+ : base(key, name)
+ {
+ card.BaseDevice.DMOutputChange += new DMOutputEventHandler(BaseDevice_DMOutputChange);
+ var output = new Dmps3AudioOutputWithMixerBase(stream);
+ MasterVolumeLevel = new DmpsAudioOutputWithMixer(output, eDmpsLevelType.Master);
+ SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
+ }
+
public DmpsAudioOutputController(string key, string name, Card.Dmps3OutputBase card)
: base(key, name)
{
- OutputCard = card;
-
- OutputCard.BaseDevice.DMOutputChange += new DMOutputEventHandler(BaseDevice_DMOutputChange);
+ card.BaseDevice.DMOutputChange += new DMOutputEventHandler(BaseDevice_DMOutputChange);
if (card is Card.Dmps3ProgramOutput)
{
- MasterVolumeLevel = new DmpsAudioOutputWithMixer(card, eDmpsLevelType.Master, (card as Card.Dmps3ProgramOutput).OutputMixer);
- SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
- MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
- Codec1VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec1);
- Codec2VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec2);
+ var programOutput = card as Card.Dmps3ProgramOutput;
+ var output = new Dmps3AudioOutputWithMixerBase(card, programOutput.OutputMixer);
+ MasterVolumeLevel = new DmpsAudioOutputWithMixerAndEq(output, eDmpsLevelType.Master, programOutput.OutputEqualizer);
+ SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
+ MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
+ Codec1VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec1);
+ Codec2VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec2);
}
else if (card is Card.Dmps3Aux1Output)
{
- MasterVolumeLevel = new DmpsAudioOutputWithMixer(card, eDmpsLevelType.Master, (card as Card.Dmps3Aux1Output).OutputMixer);
- SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
- MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
- Codec2VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec2);
+ var auxOutput = card as Card.Dmps3Aux1Output;
+ var output = new Dmps3AudioOutputWithMixerBase(card, auxOutput.OutputMixer);
+ MasterVolumeLevel = new DmpsAudioOutputWithMixerAndEq(output, eDmpsLevelType.Master, auxOutput.OutputEqualizer);
+ SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
+ MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
+ Codec2VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec2);
}
else if (card is Card.Dmps3Aux2Output)
{
- MasterVolumeLevel = new DmpsAudioOutputWithMixer(card, eDmpsLevelType.Master, (card as Card.Dmps3Aux2Output).OutputMixer);
- SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
- MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
- Codec1VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec1);
+ var auxOutput = card as Card.Dmps3Aux2Output;
+ var output = new Dmps3AudioOutputWithMixerBase(card, auxOutput.OutputMixer);
+ MasterVolumeLevel = new DmpsAudioOutputWithMixerAndEq(output, eDmpsLevelType.Master, auxOutput.OutputEqualizer);
+ SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
+ MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
+ Codec1VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec1);
}
- else //Digital Outputs
+ else if (card is Card.Dmps3DigitalMixOutput)
{
- MasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Master);
- SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
- MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
+ var mixOutput = card as Card.Dmps3DigitalMixOutput;
+ var output = new Dmps3AudioOutputWithMixerBase(card, mixOutput.OutputMixer);
+ MasterVolumeLevel = new DmpsAudioOutputWithMixer(output, eDmpsLevelType.Master);
+ SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
+ MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
+ }
+ else if (card is Card.Dmps3HdmiOutput)
+ {
+ var hdmiOutput = card as Card.Dmps3HdmiOutput;
+ var output = new Dmps3AudioOutputWithMixerBase(card, hdmiOutput.OutputMixer);
+ MasterVolumeLevel = new DmpsAudioOutputWithMixer(output, eDmpsLevelType.Master);
+ SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
+ MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
+ }
+ else if (card is Card.Dmps3DmOutput)
+ {
+ var dmOutput = card as Card.Dmps3DmOutput;
+ var output = new Dmps3AudioOutputWithMixerBase(card, dmOutput.OutputMixer);
+ MasterVolumeLevel = new DmpsAudioOutputWithMixer(output, eDmpsLevelType.Master);
+ SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
+ MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
}
}
@@ -185,6 +222,11 @@ namespace PepperDash.Essentials.DM
{
trilist.SetUShortSigAction(joinMap.MixerPresetRecall.JoinNumber, mixer.RecallPreset);
}
+ var eq = MasterVolumeLevel as DmpsAudioOutputWithMixerAndEq;
+ if (eq != null)
+ {
+ trilist.SetUShortSigAction(joinMap.MixerEqPresetRecall.JoinNumber, eq.RecallEqPreset);
+ }
}
if (SourceVolumeLevel != null)
@@ -234,21 +276,37 @@ namespace PepperDash.Essentials.DM
}
}
- public class DmpsAudioOutputWithMixer : DmpsAudioOutput
+ public class DmpsAudioOutputWithMixerAndEq : DmpsAudioOutputWithMixer
{
- CrestronControlSystem.Dmps3OutputMixerWithMonoAndStereo Mixer;
-
- public DmpsAudioOutputWithMixer(Card.Dmps3OutputBase output, eDmpsLevelType type, CrestronControlSystem.Dmps3OutputMixerWithMonoAndStereo mixer)
+ private CrestronControlSystem.Dmps3OutputEqualizer Eq;
+ public DmpsAudioOutputWithMixerAndEq(Dmps3AudioOutputWithMixerBase output, eDmpsLevelType type, CrestronControlSystem.Dmps3OutputEqualizer eq)
: base(output, type)
{
- Mixer = mixer;
+ Eq = eq;
+ }
+
+ public void RecallEqPreset(ushort preset)
+ {
+ Eq.PresetNumber.UShortValue = preset;
+ Eq.RecallPreset();
+ }
+ }
+
+ public class DmpsAudioOutputWithMixer : DmpsAudioOutput
+ {
+ Dmps3AudioOutputWithMixerBase Output;
+
+ public DmpsAudioOutputWithMixer(Dmps3AudioOutputWithMixerBase output, eDmpsLevelType type)
+ : base(output, type)
+ {
+ Output = output;
GetVolumeMax();
GetVolumeMin();
}
public void GetVolumeMin()
{
- MinLevel = (short)Mixer.MinVolumeFeedback.UShortValue;
+ MinLevel = (short)Output.MinVolumeFeedback.UShortValue;
if (VolumeLevelScaledFeedback != null)
{
VolumeLevelScaledFeedback.FireUpdate();
@@ -257,7 +315,7 @@ namespace PepperDash.Essentials.DM
public void GetVolumeMax()
{
- MaxLevel = (short)Mixer.MaxVolumeFeedback.UShortValue;
+ MaxLevel = (short)Output.MaxVolumeFeedback.UShortValue;
if (VolumeLevelScaledFeedback != null)
{
VolumeLevelScaledFeedback.FireUpdate();
@@ -266,23 +324,36 @@ namespace PepperDash.Essentials.DM
public void RecallPreset(ushort preset)
{
- Debug.Console(1, "DMPS Recalling Preset {0}", preset);
- Mixer.PresetNumber.UShortValue = preset;
- Mixer.RecallPreset();
+ Output.PresetNumber.UShortValue = preset;
+ Output.RecallPreset();
+
+ if (!Global.ControlSystemIsDmps4k3xxType)
+ {
+ //Recall startup volume for main volume level as DMPS3(non-4K) presets don't affect the main volume
+ RecallStartupVolume();
+ }
+ }
+
+ public void RecallStartupVolume()
+ {
+ ushort startupVol = Output.StartupVolumeFeedback.UShortValue;
+ //Reset startup vol due to bug on DMPS3 where getting the value from above method clears the startup volume
+ Output.StartupVolume.UShortValue = startupVol;
+ Debug.Console(1, "DMPS Recalling Startup Volume {0}", startupVol);
+ SetVolume(startupVol);
+ MuteOff();
}
}
public class DmpsAudioOutput : IBasicVolumeWithFeedback
{
- Card.Dmps3OutputBase Output;
- eDmpsLevelType Type;
- UShortInputSig Level;
-
+ private UShortInputSig Level;
private bool EnableVolumeSend;
private ushort VolumeLevelInput;
protected short MinLevel { get; set; }
protected short MaxLevel { get; set; }
+ public eDmpsLevelType Type { get; private set; }
public BoolFeedback MuteFeedback { get; private set; }
public IntFeedback VolumeLevelFeedback { get; private set; }
public IntFeedback VolumeLevelScaledFeedback { get; private set; }
@@ -292,9 +363,8 @@ namespace PepperDash.Essentials.DM
Action VolumeUpAction;
Action VolumeDownAction;
- public DmpsAudioOutput(Card.Dmps3OutputBase output, eDmpsLevelType type)
+ public DmpsAudioOutput(Dmps3AudioOutputBase output, eDmpsLevelType type)
{
- Output = output;
VolumeLevelInput = 0;
EnableVolumeSend = false;
Type = type;
@@ -306,47 +376,46 @@ namespace PepperDash.Essentials.DM
case eDmpsLevelType.Master:
{
Level = output.MasterVolume;
-
- MuteFeedback = new BoolFeedback(new Func(() => Output.MasterMuteOnFeedBack.BoolValue));
- VolumeLevelFeedback = new IntFeedback(new Func(() => Output.MasterVolumeFeedBack.UShortValue));
- MuteOnAction = new Action(Output.MasterMuteOn);
- MuteOffAction = new Action(Output.MasterMuteOff);
- VolumeUpAction = new Action((b) => Output.MasterVolumeUp.BoolValue = b);
- VolumeDownAction = new Action((b) => Output.MasterVolumeDown.BoolValue = b);
+ MuteFeedback = new BoolFeedback(new Func(() => output.MasterMuteOnFeedBack.BoolValue));
+ VolumeLevelFeedback = new IntFeedback(new Func(() => output.MasterVolumeFeedBack.UShortValue));
+ MuteOnAction = new Action(output.MasterMuteOn);
+ MuteOffAction = new Action(output.MasterMuteOff);
+ VolumeUpAction = new Action((b) => output.MasterVolumeUp.BoolValue = b);
+ VolumeDownAction = new Action((b) => output.MasterVolumeDown.BoolValue = b);
break;
}
case eDmpsLevelType.MicsMaster:
{
- Level = output.MicMasterLevel;
-
- MuteFeedback = new BoolFeedback(new Func(() => Output.MicMasterMuteOnFeedBack.BoolValue));
- VolumeLevelFeedback = new IntFeedback(new Func(() => Output.MicMasterLevelFeedBack.UShortValue));
- MuteOnAction = new Action(Output.MicMasterMuteOn);
- MuteOffAction = new Action(Output.MicMasterMuteOff);
- VolumeUpAction = new Action((b) => Output.MicMasterLevelUp.BoolValue = b);
- VolumeDownAction = new Action((b) => Output.MicMasterLevelDown.BoolValue = b);
+ if (output.Card is Card.Dmps3OutputBase)
+ {
+ var micOutput = output.Card as Card.Dmps3OutputBase;
+ Level = micOutput.MicMasterLevel;
+ MuteFeedback = new BoolFeedback(new Func(() => micOutput.MicMasterMuteOnFeedBack.BoolValue));
+ VolumeLevelFeedback = new IntFeedback(new Func(() => micOutput.MicMasterLevelFeedBack.UShortValue));
+ MuteOnAction = new Action(micOutput.MicMasterMuteOn);
+ MuteOffAction = new Action(micOutput.MicMasterMuteOff);
+ VolumeUpAction = new Action((b) => micOutput.MicMasterLevelUp.BoolValue = b);
+ VolumeDownAction = new Action((b) => micOutput.MicMasterLevelDown.BoolValue = b);
+ }
break;
}
case eDmpsLevelType.Source:
{
Level = output.SourceLevel;
-
- MuteFeedback = new BoolFeedback(new Func(() => Output.SourceMuteOnFeedBack.BoolValue));
- VolumeLevelFeedback = new IntFeedback(new Func(() => Output.SourceLevelFeedBack.UShortValue));
- MuteOnAction = new Action(Output.SourceMuteOn);
- MuteOffAction = new Action(Output.SourceMuteOff);
- VolumeUpAction = new Action((b) => Output.SourceLevelUp.BoolValue = b);
- VolumeDownAction = new Action((b) => Output.SourceLevelDown.BoolValue = b);
+ MuteFeedback = new BoolFeedback(new Func(() => output.SourceMuteOnFeedBack.BoolValue));
+ VolumeLevelFeedback = new IntFeedback(new Func(() => output.SourceLevelFeedBack.UShortValue));
+ MuteOnAction = new Action(output.SourceMuteOn);
+ MuteOffAction = new Action(output.SourceMuteOff);
+ VolumeUpAction = new Action((b) => output.SourceLevelUp.BoolValue = b);
+ VolumeDownAction = new Action((b) => output.SourceLevelDown.BoolValue = b);
break;
}
case eDmpsLevelType.Codec1:
{
- var programOutput = output as Card.Dmps3ProgramOutput;
-
- if (programOutput != null)
+ if (output.Card is Card.Dmps3ProgramOutput)
{
+ var programOutput = output.Card as Card.Dmps3ProgramOutput;
Level = programOutput.Codec1Level;
-
MuteFeedback = new BoolFeedback(new Func(() => programOutput.CodecMute1OnFeedback.BoolValue));
VolumeLevelFeedback = new IntFeedback(new Func(() => programOutput.Codec1LevelFeedback.UShortValue));
MuteOnAction = new Action(programOutput.Codec1MuteOn);
@@ -354,12 +423,10 @@ namespace PepperDash.Essentials.DM
VolumeUpAction = new Action((b) => programOutput.Codec1LevelUp.BoolValue = b);
VolumeDownAction = new Action((b) => programOutput.Codec1LevelDown.BoolValue = b);
}
- else
+ else if (output.Card is Card.Dmps3Aux2Output)
{
- var auxOutput = output as Card.Dmps3Aux2Output;
-
+ var auxOutput = output.Card as Card.Dmps3Aux2Output;
Level = auxOutput.Codec1Level;
-
MuteFeedback = new BoolFeedback(new Func(() => auxOutput.CodecMute1OnFeedback.BoolValue));
VolumeLevelFeedback = new IntFeedback(new Func(() => auxOutput.Codec1LevelFeedback.UShortValue));
MuteOnAction = new Action(auxOutput.Codec1MuteOn);
@@ -371,12 +438,10 @@ namespace PepperDash.Essentials.DM
}
case eDmpsLevelType.Codec2:
{
- var programOutput = output as Card.Dmps3ProgramOutput;
-
- if (programOutput != null)
+ if (output.Card is Card.Dmps3ProgramOutput)
{
+ var programOutput = output.Card as Card.Dmps3ProgramOutput;
Level = programOutput.Codec2Level;
-
MuteFeedback = new BoolFeedback(new Func(() => programOutput.CodecMute1OnFeedback.BoolValue));
VolumeLevelFeedback = new IntFeedback(new Func(() => programOutput.Codec2LevelFeedback.UShortValue));
MuteOnAction = new Action(programOutput.Codec2MuteOn);
@@ -384,12 +449,11 @@ namespace PepperDash.Essentials.DM
VolumeUpAction = new Action((b) => programOutput.Codec2LevelUp.BoolValue = b);
VolumeDownAction = new Action((b) => programOutput.Codec2LevelDown.BoolValue = b);
}
- else
+ else if (output.Card is Card.Dmps3Aux1Output)
{
- var auxOutput = output as Card.Dmps3Aux1Output;
+ var auxOutput = output.Card as Card.Dmps3Aux1Output;
Level = auxOutput.Codec2Level;
-
MuteFeedback = new BoolFeedback(new Func(() => auxOutput.CodecMute2OnFeedback.BoolValue));
VolumeLevelFeedback = new IntFeedback(new Func(() => auxOutput.Codec2LevelFeedback.UShortValue));
MuteOnAction = new Action(auxOutput.Codec2MuteOn);
@@ -410,19 +474,26 @@ namespace PepperDash.Essentials.DM
public void SetVolumeScaled(ushort level)
{
- Debug.Console(2, Debug.ErrorLogLevel.None, "Scaling DMPS volume:{0} level:{1} min:{2} max:{3}", Output.Name, level.ToString(), MinLevel.ToString(), MaxLevel.ToString());
- VolumeLevelInput = (ushort)(level * (MaxLevel - MinLevel) / ushort.MaxValue + MinLevel);
- if (EnableVolumeSend == true)
+ if (ushort.MaxValue + MinLevel != 0)
{
- Level.UShortValue = VolumeLevelInput;
+ VolumeLevelInput = (ushort)(level * (MaxLevel - MinLevel) / ushort.MaxValue + MinLevel);
+ if (EnableVolumeSend == true)
+ {
+ Level.UShortValue = VolumeLevelInput;
+ }
}
}
public ushort ScaleVolumeFeedback(ushort level)
{
short signedLevel = (short)level;
- Debug.Console(2, Debug.ErrorLogLevel.None, "Scaling DMPS volume:{0} feedback:{1} min:{2} max:{3}", Output.Name, signedLevel.ToString(), MinLevel.ToString(), MaxLevel.ToString());
- return (ushort)((signedLevel - MinLevel) * ushort.MaxValue / (MaxLevel - MinLevel));
+
+ if (MaxLevel - MinLevel != 0)
+ {
+ return (ushort)((signedLevel - MinLevel) * ushort.MaxValue / (MaxLevel - MinLevel));
+ }
+ else
+ return (ushort)MinLevel;
}
public void SendScaledVolume(bool pressRelease)
@@ -476,6 +547,150 @@ namespace PepperDash.Essentials.DM
#endregion
}
+ public class Dmps3AudioOutputWithMixerBase : Dmps3AudioOutputBase
+ {
+ public UShortOutputSig MinVolumeFeedback { get; private set; }
+ public UShortOutputSig MaxVolumeFeedback { get; private set; }
+ public UShortInputSig StartupVolume { get; private set; }
+ public UShortOutputSig StartupVolumeFeedback { get; private set; }
+ public UShortInputSig PresetNumber { get; private set; }
+
+ public Action RecallPreset { get; private set; }
+
+ public Dmps3AudioOutputWithMixerBase(Card.Dmps3OutputBase card, CrestronControlSystem.Dmps3OutputMixer mixer)
+ : base(card)
+ {
+ MinVolumeFeedback = mixer.MinVolumeFeedback;
+ MaxVolumeFeedback = mixer.MaxVolumeFeedback;
+ StartupVolume = mixer.StartupVolume;
+ StartupVolumeFeedback = mixer.StartupVolumeFeedback;
+ PresetNumber = mixer.PresetNumber;
+
+ RecallPreset = new Action(mixer.RecallPreset);
+ }
+
+ public Dmps3AudioOutputWithMixerBase(Card.Dmps3OutputBase card, CrestronControlSystem.Dmps3AttachableOutputMixer mixer)
+ : base(card)
+ {
+ MinVolumeFeedback = mixer.MinVolumeFeedback;
+ MaxVolumeFeedback = mixer.MaxVolumeFeedback;
+ StartupVolume = mixer.StartupVolume;
+ StartupVolumeFeedback = mixer.StartupVolumeFeedback;
+ PresetNumber = mixer.PresetNumber;
+
+ RecallPreset = new Action(mixer.RecallPreset);
+ }
+
+ public Dmps3AudioOutputWithMixerBase(Card.Dmps3DmHdmiAudioOutput.Dmps3AudioOutputStream stream)
+ : base(stream)
+ {
+ var mixer = stream.OutputMixer;
+ MinVolumeFeedback = mixer.MinVolumeFeedback;
+ MaxVolumeFeedback = mixer.MaxVolumeFeedback;
+ StartupVolume = mixer.StartupVolume;
+ StartupVolumeFeedback = mixer.StartupVolumeFeedback;
+ PresetNumber = stream.PresetNumber;
+ RecallPreset = new Action(stream.RecallPreset);
+ }
+
+ public Dmps3AudioOutputWithMixerBase(Card.Dmps3DmHdmiAudioOutput.Dmps3DmHdmiOutputStream stream)
+ : base(stream)
+ {
+ var mixer = stream.OutputMixer;
+ MinVolumeFeedback = mixer.MinVolumeFeedback;
+ MaxVolumeFeedback = mixer.MaxVolumeFeedback;
+ StartupVolume = mixer.StartupVolume;
+ StartupVolumeFeedback = mixer.StartupVolumeFeedback;
+ PresetNumber = stream.PresetNumber;
+ RecallPreset = new Action(stream.RecallPreset);
+ }
+ }
+ public class Dmps3AudioOutputBase
+ {
+ public DMOutput Card { get; private set; }
+ public BoolOutputSig MasterMuteOffFeedBack { get; private set; }
+ public BoolOutputSig MasterMuteOnFeedBack { get; private set; }
+ public UShortInputSig MasterVolume { get; private set; }
+ public UShortOutputSig MasterVolumeFeedBack { get; private set; }
+ public BoolInputSig MasterVolumeUp { get; private set; }
+ public BoolInputSig MasterVolumeDown { get; private set; }
+ public BoolOutputSig SourceMuteOffFeedBack { get; private set; }
+ public BoolOutputSig SourceMuteOnFeedBack { get; private set; }
+ public UShortInputSig SourceLevel { get; private set; }
+ public UShortOutputSig SourceLevelFeedBack { get; private set; }
+ public BoolInputSig SourceLevelUp { get; private set; }
+ public BoolInputSig SourceLevelDown { get; private set; }
+
+ public Action MasterMuteOff { get; private set; }
+ public Action MasterMuteOn { get; private set; }
+ public Action SourceMuteOff { get; private set; }
+ public Action SourceMuteOn { get; private set; }
+
+ public Dmps3AudioOutputBase(Card.Dmps3OutputBase card)
+ {
+ Card = card;
+ MasterMuteOffFeedBack = card.MasterMuteOffFeedBack;
+ MasterMuteOnFeedBack = card.MasterMuteOnFeedBack;
+ MasterVolume = card.MasterVolume;
+ MasterVolumeFeedBack = card.MasterVolumeFeedBack;
+ MasterVolumeUp = card.MasterVolumeUp;
+ MasterVolumeDown = card.MasterVolumeDown;
+ SourceMuteOffFeedBack = card.SourceMuteOffFeedBack;
+ SourceMuteOnFeedBack = card.SourceMuteOnFeedBack;
+ SourceLevel = card.SourceLevel;
+ SourceLevelFeedBack = card.SourceLevelFeedBack;
+ SourceLevelUp = card.SourceLevelUp;
+ SourceLevelDown = card.SourceLevelDown;
+
+ MasterMuteOff = new Action(card.MasterMuteOff);
+ MasterMuteOn = new Action(card.MasterMuteOn);
+ SourceMuteOff = new Action(card.SourceMuteOff);
+ SourceMuteOn = new Action(card.SourceMuteOn);
+ }
+
+ public Dmps3AudioOutputBase(Card.Dmps3DmHdmiAudioOutput.Dmps3AudioOutputStream stream)
+ {
+ MasterMuteOffFeedBack = stream.MasterMuteOffFeedBack;
+ MasterMuteOnFeedBack = stream.MasterMuteOnFeedBack;
+ MasterVolume = stream.MasterVolume;
+ MasterVolumeFeedBack = stream.MasterVolumeFeedBack;
+ MasterVolumeUp = stream.MasterVolumeUp;
+ MasterVolumeDown = stream.MasterVolumeDown;
+ SourceMuteOffFeedBack = stream.SourceMuteOffFeedBack;
+ SourceMuteOnFeedBack = stream.SourceMuteOnFeedBack;
+ SourceLevel = stream.SourceLevel;
+ SourceLevelFeedBack = stream.SourceLevelFeedBack;
+ SourceLevelUp = stream.SourceLevelUp;
+ SourceLevelDown = stream.SourceLevelDown;
+
+ MasterMuteOff = new Action(stream.MasterMuteOff);
+ MasterMuteOn = new Action(stream.MasterMuteOn);
+ SourceMuteOff = new Action(stream.SourceMuteOff);
+ SourceMuteOn = new Action(stream.SourceMuteOn);
+ }
+
+ public Dmps3AudioOutputBase(Card.Dmps3DmHdmiAudioOutput.Dmps3DmHdmiOutputStream stream)
+ {
+ MasterMuteOffFeedBack = stream.MasterMuteOffFeedBack;
+ MasterMuteOnFeedBack = stream.MasterMuteOnFeedBack;
+ MasterVolume = stream.MasterVolume;
+ MasterVolumeFeedBack = stream.MasterVolumeFeedBack;
+ MasterVolumeUp = stream.MasterVolumeUp;
+ MasterVolumeDown = stream.MasterVolumeDown;
+ SourceMuteOffFeedBack = stream.SourceMuteOffFeedBack;
+ SourceMuteOnFeedBack = stream.SourceMuteOnFeedBack;
+ SourceLevel = stream.SourceLevel;
+ SourceLevelFeedBack = stream.SourceLevelFeedBack;
+ SourceLevelUp = stream.SourceLevelUp;
+ SourceLevelDown = stream.SourceLevelDown;
+
+ MasterMuteOff = new Action(stream.MasterMuteOff);
+ MasterMuteOn = new Action(stream.MasterMuteOn);
+ SourceMuteOff = new Action(stream.SourceMuteOff);
+ SourceMuteOn = new Action(stream.SourceMuteOn);
+ }
+ }
+
public enum eDmpsLevelType
{
Master,
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsDigitalOutputController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsDigitalOutputController.cs
new file mode 100644
index 00000000..70465783
--- /dev/null
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsDigitalOutputController.cs
@@ -0,0 +1,165 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using Crestron.SimplSharpPro.DM;
+using Crestron.SimplSharpPro.DM.Cards;
+
+using PepperDash.Core;
+using PepperDash.Essentials.Core;
+
+
+namespace PepperDash.Essentials.DM
+{
+ ///
+ ///
+ ///
+ public class DmpsDigitalOutputController : Device, IRoutingNumeric, IHasFeedback
+ {
+ public Card.Dmps3OutputBase OutputCard { get; protected set; }
+
+ public RoutingInputPort None { get; protected set; }
+ public RoutingInputPort DigitalMix1 { get; protected set; }
+ public RoutingInputPort DigitalMix2 { get; protected set; }
+ public RoutingInputPort AudioFollowsVideo { get; protected set; }
+
+ public RoutingOutputPort DigitalAudioOut { get; protected set; }
+
+ public IntFeedback AudioSourceNumericFeedback { get; protected set; }
+
+ ///
+ /// Returns a list containing the Outputs that we want to expose.
+ ///
+ public FeedbackCollection Feedbacks { get; private set; }
+
+ public virtual RoutingPortCollection InputPorts
+ {
+ get
+ {
+ return new RoutingPortCollection
+ {
+ None,
+ DigitalMix1,
+ DigitalMix2,
+ AudioFollowsVideo
+ };
+ }
+ }
+
+ public RoutingPortCollection OutputPorts
+ {
+ get
+ {
+ return new RoutingPortCollection { DigitalAudioOut };
+ }
+ }
+
+ public DmpsDigitalOutputController(string key, string name, Card.Dmps3OutputBase outputCard)
+ : base(key, name)
+ {
+ Feedbacks = new FeedbackCollection();
+ OutputCard = outputCard;
+
+ if (outputCard is Card.Dmps3DmOutputBackend)
+ {
+ AudioSourceNumericFeedback = new IntFeedback(() =>
+ {
+ return (int)(outputCard as Card.Dmps3DmOutputBackend).AudioOutSourceDeviceFeedback;
+ });
+ DigitalAudioOut = new RoutingOutputPort(DmPortName.DmOut + OutputCard.Number, eRoutingSignalType.Audio, eRoutingPortConnectionType.DmCat, null, this);
+ }
+
+ else if (outputCard is Card.Dmps3HdmiOutputBackend)
+ {
+ AudioSourceNumericFeedback = new IntFeedback(() =>
+ {
+ return (int)(outputCard as Card.Dmps3HdmiOutputBackend).AudioOutSourceDeviceFeedback;
+ });
+ DigitalAudioOut = new RoutingOutputPort(DmPortName.HdmiOut + OutputCard.Number, eRoutingSignalType.Audio, eRoutingPortConnectionType.Hdmi, null, this);
+ }
+ else
+ {
+ return;
+ }
+
+ None = new RoutingInputPort("None", eRoutingSignalType.Audio, eRoutingPortConnectionType.DigitalAudio,
+ eDmps34KAudioOutSourceDevice.NoRoute, this);
+ DigitalMix1 = new RoutingInputPort("DigitalMix1", eRoutingSignalType.Audio, eRoutingPortConnectionType.DigitalAudio,
+ eDmps34KAudioOutSourceDevice.DigitalMixer1, this);
+ DigitalMix2 = new RoutingInputPort("DigitalMix2", eRoutingSignalType.Audio, eRoutingPortConnectionType.DigitalAudio,
+ eDmps34KAudioOutSourceDevice.DigitalMixer2, this);
+ AudioFollowsVideo = new RoutingInputPort("AudioFollowsVideo", eRoutingSignalType.Audio, eRoutingPortConnectionType.DigitalAudio,
+ eDmps34KAudioOutSourceDevice.AudioFollowsVideo, this);
+
+ AddToFeedbackList(AudioSourceNumericFeedback);
+ }
+
+ ///
+ /// Adds feedback(s) to the list
+ ///
+ ///
+ public void AddToFeedbackList(params Feedback[] newFbs)
+ {
+ foreach (var f in newFbs)
+ {
+ if (f != null)
+ {
+ if (!Feedbacks.Contains(f))
+ {
+ Feedbacks.Add(f);
+ }
+ }
+ }
+ }
+
+ public virtual void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type)
+ {
+ Debug.Console(2, this, "Executing Numeric Switch to input {0}.", input);
+
+ switch (input)
+ {
+ case 0:
+ {
+ ExecuteSwitch(None.Selector, null, type);
+ break;
+ }
+ case 1:
+ {
+ ExecuteSwitch(DigitalMix1.Selector, null, type);
+ break;
+ }
+ case 2:
+ {
+ ExecuteSwitch(DigitalMix2.Selector, null, type);
+ break;
+ }
+ case 3:
+ {
+ ExecuteSwitch(AudioFollowsVideo.Selector, null, type);
+ break;
+ }
+ }
+
+ }
+
+ #region IRouting Members
+
+ public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
+ {
+ if ((signalType | eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
+ {
+ if (OutputCard is Card.Dmps3DmOutputBackend)
+ {
+ (OutputCard as Card.Dmps3DmOutputBackend).AudioOutSourceDevice = (eDmps34KAudioOutSourceDevice)inputSelector;
+ }
+ else if (OutputCard is Card.Dmps3HdmiOutputBackend)
+ {
+ (OutputCard as Card.Dmps3HdmiOutputBackend).AudioOutSourceDevice = (eDmps34KAudioOutSourceDevice)inputSelector;
+ }
+ }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsInternalVirtualDmTxController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsInternalVirtualDmTxController.cs
index 75ba7e29..c9c2f261 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsInternalVirtualDmTxController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsInternalVirtualDmTxController.cs
@@ -47,16 +47,23 @@ namespace PepperDash.Essentials.DM
{
get
{
- if (InputCard.VideoSourceFeedback != eDmps3InputVideoSource.Auto)
- return InputCard.VideoSourceFeedback;
- else // auto
+ try
{
- if (InputCard.HdmiInputPort.SyncDetectedFeedback.BoolValue)
- return eDmps3InputVideoSource.Hdmi;
- else if (InputCard.VgaInputPort.SyncDetectedFeedback.BoolValue)
- return eDmps3InputVideoSource.Vga;
- else
- return eDmps3InputVideoSource.Bnc;
+ if (InputCard.VideoSourceFeedback != eDmps3InputVideoSource.Auto)
+ return InputCard.VideoSourceFeedback;
+ else // auto
+ {
+ if (InputCard.HdmiInputPort.SyncDetectedFeedback.BoolValue)
+ return eDmps3InputVideoSource.Hdmi;
+ else if (InputCard.VgaInputPort.SyncDetectedFeedback.BoolValue)
+ return eDmps3InputVideoSource.Vga;
+ else
+ return eDmps3InputVideoSource.Bnc;
+ }
+ }
+ catch
+ {
+ return eDmps3InputVideoSource.Bnc;
}
}
}
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsMicrophoneController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsMicrophoneController.cs
index 30b2cfab..29dc0693 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsMicrophoneController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsMicrophoneController.cs
@@ -38,6 +38,9 @@ namespace PepperDash.Essentials.DM
void Dmps_MicrophoneChange(MicrophoneBase mic, GenericEventArgs args)
{
+ if (args.EventId == MicrophoneEventIds.VuFeedBackEventId)
+ return;
+
Debug.Console(2, "Dmps Microphone Controller Index: {0} EventId: {1}", mic.ID, args.EventId.ToString());
if(Mics.ContainsKey(mic.ID))
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsRoutingController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsRoutingController.cs
index f6592699..a3092f71 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsRoutingController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsRoutingController.cs
@@ -26,13 +26,10 @@ namespace PepperDash.Essentials.DM
public CrestronControlSystem Dmps { get; set; }
public ISystemControl SystemControl { get; private set; }
public bool? EnableRouting { get; private set; }
-
- //Check if DMPS is a DMPS3-4K type for endpoint creation
- public bool Dmps4kType { get; private set; }
//IroutingNumericEvent
public event EventHandler NumericSwitchChange;
-
+
//Feedback for DMPS System Control
public BoolFeedback SystemPowerOnFeedback { get; private set; }
public BoolFeedback SystemPowerOffFeedback { get; private set; }
@@ -62,6 +59,7 @@ namespace PepperDash.Essentials.DM
public Dictionary InputNames { get; set; }
public Dictionary OutputNames { get; set; }
public Dictionary VolumeControls { get; private set; }
+ public Dictionary DigitalAudioOutputs { get; private set; }
public DmpsMicrophoneController Microphones { get; private set; }
public const int RouteOffTime = 500;
@@ -123,14 +121,13 @@ namespace PepperDash.Essentials.DM
///
public DmpsRoutingController(string key, string name, ISystemControl systemControl)
: base(key, name)
- {
+ {
Dmps = Global.ControlSystem;
-
+
switch (systemControl.SystemControlType)
{
case eSystemControlType.Dmps34K150CSystemControl:
SystemControl = systemControl as Dmps34K150CSystemControl;
- Dmps4kType = true;
SystemPowerOnFeedback = new BoolFeedback(() => { return true; });
SystemPowerOffFeedback = new BoolFeedback(() => { return false; });
break;
@@ -139,13 +136,11 @@ namespace PepperDash.Essentials.DM
case eSystemControlType.Dmps34K300CSystemControl:
case eSystemControlType.Dmps34K350CSystemControl:
SystemControl = systemControl as Dmps34K300CSystemControl;
- Dmps4kType = true;
SystemPowerOnFeedback = new BoolFeedback(() => { return true; });
SystemPowerOffFeedback = new BoolFeedback(() => { return false; });
break;
default:
SystemControl = systemControl as Dmps3SystemControl;
- Dmps4kType = false;
SystemPowerOnFeedback = new BoolFeedback(() =>
{
return ((Dmps3SystemControl)SystemControl).SystemPowerOnFeedBack.BoolValue;
@@ -156,11 +151,12 @@ namespace PepperDash.Essentials.DM
});
break;
}
- Debug.Console(1, this, "DMPS Type = {0}, 4K Type = {1}", systemControl.SystemControlType, Dmps4kType);
+ Debug.Console(1, this, "DMPS Type = {0}, 4K Type = {1}", systemControl.SystemControlType, Global.ControlSystemIsDmps4kType);
InputPorts = new RoutingPortCollection();
OutputPorts = new RoutingPortCollection();
VolumeControls = new Dictionary();
+ DigitalAudioOutputs = new Dictionary();
TxDictionary = new Dictionary();
RxDictionary = new Dictionary();
@@ -252,13 +248,15 @@ namespace PepperDash.Essentials.DM
{
return;
}
-
foreach (var kvp in OutputNames)
{
var output = (Dmps.SwitcherOutputs[kvp.Key] as DMOutput);
- if (output != null && output.Name.Type != eSigType.NA)
+ if (output != null)
{
- output.Name.StringValue = kvp.Value;
+ if (output.Name.Supported && kvp.Value.Length > 0)
+ {
+ output.Name.StringValue = kvp.Value;
+ }
}
}
}
@@ -272,9 +270,12 @@ namespace PepperDash.Essentials.DM
foreach (var kvp in InputNames)
{
var input = (Dmps.SwitcherInputs[kvp.Key] as DMInput);
- if (input != null && input.Name.Type != eSigType.NA)
+ if (input != null)
{
- input.Name.StringValue = kvp.Value;
+ if (input.Name.Supported && kvp.Value.Length > 0)
+ {
+ input.Name.StringValue = kvp.Value;
+ }
}
}
}
@@ -382,9 +383,21 @@ namespace PepperDash.Essentials.DM
}
if (OutputNameFeedbacks[ioSlot] != null)
{
- OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + ioSlotJoin]);
- OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputVideoNames.JoinNumber + ioSlotJoin]);
- OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputAudioNames.JoinNumber + ioSlotJoin]);
+ if (Dmps.SwitcherOutputs[ioSlot].CardInputOutputType == eCardInputOutputType.Dmps3DmOutput ||
+ Dmps.SwitcherOutputs[ioSlot].CardInputOutputType == eCardInputOutputType.Dmps3DmOutputBackend ||
+ Dmps.SwitcherOutputs[ioSlot].CardInputOutputType == eCardInputOutputType.Dmps3HdmiOutput ||
+ Dmps.SwitcherOutputs[ioSlot].CardInputOutputType == eCardInputOutputType.Dmps3HdmiOutputBackend ||
+ Dmps.SwitcherOutputs[ioSlot].CardInputOutputType == eCardInputOutputType.Dmps3DmHdmiAudioOutput)
+ {
+ OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputVideoNames.JoinNumber + ioSlotJoin]);
+ OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + ioSlotJoin]);
+ OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputAudioNames.JoinNumber + ioSlotJoin]);
+ }
+ else
+ {
+ OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + ioSlotJoin]);
+ OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputAudioNames.JoinNumber + ioSlotJoin]);
+ }
}
if (OutputVideoRouteNameFeedbacks[ioSlot] != null)
{
@@ -406,13 +419,11 @@ namespace PepperDash.Essentials.DM
private void LinkInputsToApi(BasicTriList trilist, DmpsRoutingControllerJoinMap joinMap)
{
- if (Dmps4kType)
+ if (Global.ControlSystemIsDmps4k3xxType)
{
- //DMPS-4K audio inputs 1-5 are aux inputs
- for (uint i = 1; i <= 5; i++)
- {
- trilist.StringInput[joinMap.InputAudioNames.JoinNumber + i - 1].StringValue = String.Format("Aux Input {0}", i);
- }
+ //Add DMPS-4K mixer input names to end of inputs
+ trilist.StringInput[joinMap.InputAudioNames.JoinNumber + (uint)Dmps.SwitcherInputs.Count + 4].StringValue = "Digital Mixer 1";
+ trilist.StringInput[joinMap.InputAudioNames.JoinNumber + (uint)Dmps.SwitcherInputs.Count + 5].StringValue = "Digital Mixer 2";
}
for (uint i = 1; i <= Dmps.SwitcherInputs.Count; i++)
{
@@ -427,18 +438,19 @@ namespace PepperDash.Essentials.DM
trilist.BooleanInput[joinMap.VideoSyncStatus.JoinNumber + ioSlotJoin]);
}
- if (InputNameFeedbacks.ContainsKey(ioSlot) && InputNameFeedbacks[ioSlot] != null)
+ if (InputNameFeedbacks.ContainsKey(ioSlot) && InputNameFeedbacks[ioSlot] != null)
{
- InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputNames.JoinNumber + ioSlotJoin]);
- InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputVideoNames.JoinNumber + ioSlotJoin]);
-
- if (Dmps4kType)
+ if (Dmps.SwitcherInputs[ioSlot] is Card.Dmps3AnalogAudioInput)
{
- //DMPS-4K Audio Inputs are offset by 5
- InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputAudioNames.JoinNumber + ioSlotJoin + 5]);
+ for (uint j = ioSlot; j < ioSlot + 5; j++)
+ {
+ InputNameFeedbacks[j].LinkInputSig(trilist.StringInput[joinMap.InputAudioNames.JoinNumber + j - 1]);
+ }
}
else
{
+ InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputNames.JoinNumber + ioSlotJoin]);
+ InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputVideoNames.JoinNumber + ioSlotJoin]);
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputAudioNames.JoinNumber + ioSlotJoin]);
}
}
@@ -481,69 +493,143 @@ namespace PepperDash.Essentials.DM
{
foreach (var card in Dmps.SwitcherOutputs)
{
- Debug.Console(1, this, "Output Card Type: {0}", card.CardInputOutputType);
-
- var outputCard = card as DMOutput;
-
- if (outputCard == null)
+ try
{
- Debug.Console(1, this, "Output card {0} is not a DMOutput", card.CardInputOutputType);
- continue;
- }
+ Debug.Console(1, this, "Output Card Type: {0}", card.CardInputOutputType);
- Debug.Console(1, this, "Adding Output Card Number {0} Type: {1}", outputCard.Number, outputCard.CardInputOutputType.ToString());
- VideoOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
- {
- if (outputCard.VideoOutFeedback != null) { return (ushort)outputCard.VideoOutFeedback.Number; }
- return 0;
- ;
- });
- AudioOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
- {
- try
+ var outputCard = card as DMOutput;
+
+ if (outputCard == null)
{
- if (outputCard.AudioOutFeedback != null)
- {
- return (ushort) outputCard.AudioOutFeedback.Number;
- }
+ Debug.Console(1, this, "Output card {0} is not a DMOutput", card.CardInputOutputType);
+ continue;
+ }
+
+ Debug.Console(1, this, "Adding Output Card Number {0} Type: {1}", outputCard.Number, outputCard.CardInputOutputType.ToString());
+ VideoOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
+ {
+ if (outputCard.VideoOutFeedback != null) { return (ushort)outputCard.VideoOutFeedback.Number; }
return 0;
- }
- catch (NotSupportedException)
+ ;
+ });
+ AudioOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
{
- return (ushort) outputCard.AudioOutSourceFeedback;
- }
- });
+ if (!Global.ControlSystemIsDmps4k3xxType)
+ {
+ if (outputCard.AudioOutFeedback != null)
+ {
+ return (ushort)outputCard.AudioOutFeedback.Number;
+ }
+ return 0;
+ }
+ else
+ {
- OutputNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
+ if (outputCard is Card.Dmps3DmOutputBackend || outputCard is Card.Dmps3HdmiOutputBackend)
+ {
+ //Special cases for DMPS-4K digital audio output
+ if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 0)
+ return 0;
+ else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 1)
+ return (ushort)Dmps.SwitcherInputs.Count + 5;
+ else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 2)
+ return (ushort)Dmps.SwitcherInputs.Count + 6;
+ else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 3)
+ return (ushort)outputCard.VideoOutFeedback.Number;
+ else
+ return 0;
+ }
+ else if (outputCard.AudioOutSourceFeedback == eDmps34KAudioOutSource.NoRoute)
+ {
+ //Fixes for weird audio indexing on DMPS3-4K
+ return 0;
+ }
+ else if (outputCard.AudioOutSourceFeedback == eDmps34KAudioOutSource.AirMedia8)
+ {
+ //Fixes for weird audio indexing on DMPS3-4K
+ return 8;
+ }
+ else if (outputCard.AudioOutSourceFeedback == eDmps34KAudioOutSource.AirMedia9)
+ {
+ //Fixes for weird audio indexing on DMPS3-4K
+ return 9;
+ }
+ else if ((ushort)outputCard.AudioOutSourceFeedback <= 5)
+ {
+ //Move analog inputs to after regular dm cards
+ return (ushort)outputCard.AudioOutSourceFeedback + (ushort)Dmps.SwitcherInputs.Count - 1;
+ }
+ else
+ {
+ //Fixes for weird audio indexing on DMPS3-4K
+ return (ushort)outputCard.AudioOutSourceFeedback - 5;
+ }
+ }
+ });
+
+ OutputNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
+ {
+ if(OutputNames.ContainsKey(outputCard.Number))
+ {
+ return OutputNames[outputCard.Number];
+ }
+ else if (outputCard.NameFeedback != null && outputCard.NameFeedback != CrestronControlSystem.NullStringOutputSig && !string.IsNullOrEmpty(outputCard.NameFeedback.StringValue))
+ {
+ Debug.Console(2, this, "Output Card {0} Name: {1}", outputCard.Number, outputCard.NameFeedback.StringValue);
+ return outputCard.NameFeedback.StringValue;
+ }
+ return "";
+ });
+
+ OutputVideoRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
+ {
+ if (outputCard.VideoOutFeedback != null && outputCard.VideoOutFeedback.NameFeedback != null)
+ {
+ return outputCard.VideoOutFeedback.NameFeedback.StringValue;
+ }
+ return NoRouteText;
+ });
+ OutputAudioRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
+ {
+ if (!Global.ControlSystemIsDmps4k3xxType)
+ {
+ if (outputCard.AudioOutFeedback != null && outputCard.AudioOutFeedback.NameFeedback != null)
+ {
+ return outputCard.AudioOutFeedback.NameFeedback.StringValue;
+ }
+ }
+ else
+ {
+ if (outputCard is Card.Dmps3DmOutputBackend || outputCard is Card.Dmps3HdmiOutputBackend)
+ {
+ //Special cases for DMPS-4K digital audio output
+ if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 0)
+ return NoRouteText;
+ else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 1)
+ return "Digital Mix 1";
+ else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 2)
+ return "Digital Mix 2";
+ else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 3)
+ return outputCard.VideoOutFeedback.NameFeedback.StringValue;
+ else
+ return NoRouteText;
+ }
+ else
+ {
+ return outputCard.AudioOutSourceFeedback.ToString();
+ }
+ }
+ return NoRouteText;
+ });
+
+ OutputEndpointOnlineFeedbacks[outputCard.Number] = new BoolFeedback(() => outputCard.EndpointOnlineFeedback);
+
+ AddOutputCard(outputCard.Number, outputCard);
+ }
+ catch (Exception ex)
{
- if (outputCard.NameFeedback != null && outputCard.NameFeedback != CrestronControlSystem.NullStringOutputSig && !string.IsNullOrEmpty(outputCard.NameFeedback.StringValue))
- {
- Debug.Console(2, this, "Output Card {0} Name: {1}", outputCard.Number, outputCard.NameFeedback.StringValue);
- return outputCard.NameFeedback.StringValue;
- }
- return "";
- });
-
- OutputVideoRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
- {
- if (outputCard.VideoOutFeedback != null && outputCard.VideoOutFeedback.NameFeedback != null)
- {
- return outputCard.VideoOutFeedback.NameFeedback.StringValue;
- }
- return NoRouteText;
- });
- OutputAudioRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
- {
- if (outputCard.AudioOutFeedback != null && outputCard.AudioOutFeedback.NameFeedback != null)
- {
- return outputCard.AudioOutFeedback.NameFeedback.StringValue;
- }
- return NoRouteText;
- });
-
- OutputEndpointOnlineFeedbacks[outputCard.Number] = new BoolFeedback(() => outputCard.EndpointOnlineFeedback);
-
- AddOutputCard(outputCard.Number, outputCard);
+ Debug.LogError(Debug.ErrorLogLevel.Error, string.Format("DMPS Controller exception creating output card: {0}", ex));
+ }
}
}
@@ -569,13 +655,15 @@ namespace PepperDash.Essentials.DM
InputNameFeedbacks[inputCard.Number] = new StringFeedback(() =>
{
- if (inputCard.NameFeedback != null && inputCard.NameFeedback != CrestronControlSystem.NullStringOutputSig && !string.IsNullOrEmpty(inputCard.NameFeedback.StringValue))
+ if (InputNames.ContainsKey(inputCard.Number))
+ {
+ return InputNames[inputCard.Number];
+ }
+ else if (inputCard.NameFeedback != null && inputCard.NameFeedback != CrestronControlSystem.NullStringOutputSig && !string.IsNullOrEmpty(inputCard.NameFeedback.StringValue))
{
Debug.Console(2, this, "Input Card {0} Name: {1}", inputCard.Number, inputCard.NameFeedback.StringValue);
return inputCard.NameFeedback.StringValue;
}
-
- Debug.Console(2, this, "Input Card {0} Name is null", inputCard.Number);
return "";
});
@@ -609,7 +697,6 @@ namespace PepperDash.Essentials.DM
else if (inputCard is Card.Dmps3HdmiInput)
{
var hdmiInputCard = inputCard as Card.Dmps3HdmiInput;
-
var cecPort = hdmiInputCard.HdmiInputPort;
AddInputPortWithDebug(number, string.Format("HdmiIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, cecPort);
@@ -641,17 +728,37 @@ namespace PepperDash.Essentials.DM
else if (inputCard is Card.Dmps3DmInput)
{
var hdmiInputCard = inputCard as Card.Dmps3DmInput;
-
var cecPort = hdmiInputCard.DmInputPort;
AddInputPortWithDebug(number, string.Format("DmIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.DmCat, cecPort);
}
+ else if (inputCard is Card.Dmps3VgaInput)
+ {
+ AddInputPortWithDebug(number, string.Format("VgaIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Vga);
+ }
else if (inputCard is Card.Dmps3AirMediaInput)
{
- var airMediaInputCard = inputCard as Card.Dmps3AirMediaInput;
-
AddInputPortWithDebug(number, string.Format("AirMediaIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Streaming);
}
+ else if (inputCard is Card.Dmps3AnalogAudioInput)
+ {
+ for (uint i = 0; i <= 4; i++)
+ {
+ uint j = i + 1;
+ uint input = i + number;
+ InputNameFeedbacks[input] = new StringFeedback(() =>
+ {
+ if (InputNames.ContainsKey(input))
+ {
+ return InputNames[input];
+ }
+ else
+ {
+ return String.Format("Aux Input {0}", j);
+ }
+ });
+ }
+ }
}
@@ -697,22 +804,44 @@ namespace PepperDash.Essentials.DM
var cecPort = hdmiOutputCard.HdmiOutputPort;
AddHdmiOutputPort(number, cecPort);
+
+ var audioOutput = new DmpsAudioOutputController(string.Format("processor-digitalAudioOutput{0}", number), string.Format("Hdmi Audio Output {0}", number), outputCard as Card.Dmps3HdmiOutput);
+ DeviceManager.AddDevice(audioOutput);
}
else if (outputCard is Card.Dmps3HdmiOutputBackend)
{
var hdmiOutputCard = outputCard as Card.Dmps3HdmiOutputBackend;
-
var cecPort = hdmiOutputCard.HdmiOutputPort;
-
AddHdmiOutputPort(number, cecPort);
+ var audioOutput = new DmpsDigitalOutputController(string.Format("processor-avRouting-HdmiAudioOut{0}", number), string.Format("Hdmi Audio Output {0} Router", number), hdmiOutputCard);
+ DigitalAudioOutputs.Add(number, audioOutput);
+ DeviceManager.AddDevice(audioOutput);
}
else if (outputCard is Card.Dmps3DmOutput)
{
AddDmOutputPort(number);
+ var audioOutput = new DmpsAudioOutputController(string.Format("processor-digitalAudioOutput{0}", number), string.Format("Dm Audio Output {0}", number), outputCard as Card.Dmps3DmOutput);
+ DeviceManager.AddDevice(audioOutput);
}
else if (outputCard is Card.Dmps3DmOutputBackend)
{
AddDmOutputPort(number);
+ var audioOutput = new DmpsDigitalOutputController(string.Format("processor-avRouting-DmAudioOut{0}", number), string.Format("Dm Audio Output {0} Router", number), outputCard as Card.Dmps3DmOutputBackend);
+ DigitalAudioOutputs.Add(number, audioOutput);
+ DeviceManager.AddDevice(audioOutput);
+ }
+ else if (outputCard is Card.Dmps3DmHdmiAudioOutput)
+ {
+ var hdmiOutputCard = outputCard as Card.Dmps3DmHdmiAudioOutput;
+ var cecPort = hdmiOutputCard.HdmiOutputPort;
+ AddHdmiOutputPort(number, cecPort);
+ AddDmOutputPort(number);
+ AddAudioOnlyOutputPort(number, "Program");
+
+ var audioOutput = new DmpsAudioOutputController(string.Format("processor-programAudioOutput", number), string.Format("Program Audio Output {0}", number), hdmiOutputCard, hdmiOutputCard.AudioOutputStream);
+ DeviceManager.AddDevice(audioOutput);
+ var digitalAudioOutput = new DmpsAudioOutputController(string.Format("processor-digitalAudioOutput{0}", number), string.Format("Hdmi Audio Output {0}", number), hdmiOutputCard, hdmiOutputCard.DmHdmiOutputStream);
+ DeviceManager.AddDevice(digitalAudioOutput);
}
else if (outputCard is Card.Dmps3ProgramOutput)
{
@@ -727,22 +856,22 @@ namespace PepperDash.Essentials.DM
switch (outputCard.CardInputOutputType)
{
case eCardInputOutputType.Dmps3Aux1Output:
- {
- AddAudioOnlyOutputPort(number, "Aux1");
+ {
+ AddAudioOnlyOutputPort(number, "Aux1");
- var aux1Output = new DmpsAudioOutputController(string.Format("processor-aux1AudioOutput"), "Program Audio Output", outputCard as Card.Dmps3Aux1Output);
+ var aux1Output = new DmpsAudioOutputController(string.Format("processor-aux1AudioOutput"), "Aux1 Audio Output", outputCard as Card.Dmps3Aux1Output);
- DeviceManager.AddDevice(aux1Output);
- }
+ DeviceManager.AddDevice(aux1Output);
+ }
break;
case eCardInputOutputType.Dmps3Aux2Output:
- {
- AddAudioOnlyOutputPort(number, "Aux2");
+ {
+ AddAudioOnlyOutputPort(number, "Aux2");
- var aux2Output = new DmpsAudioOutputController(string.Format("processor-aux2AudioOutput"), "Program Audio Output", outputCard as Card.Dmps3Aux2Output);
+ var aux2Output = new DmpsAudioOutputController(string.Format("processor-aux2AudioOutput"), "Aux2 Audio Output", outputCard as Card.Dmps3Aux2Output);
- DeviceManager.AddDevice(aux2Output);
- }
+ DeviceManager.AddDevice(aux2Output);
+ }
break;
}
}
@@ -766,6 +895,10 @@ namespace PepperDash.Essentials.DM
{
AddAudioOnlyOutputPort(number, "Dialer");
}
+ else if (outputCard is Card.Dmps3AecOutput)
+ {
+ AddAudioOnlyOutputPort(number, "Aec");
+ }
else if (outputCard is Card.Dmps3DigitalMixOutput)
{
if (number == (uint)CrestronControlSystem.eDmps34K250COutputs.Mix1
@@ -776,10 +909,9 @@ namespace PepperDash.Essentials.DM
|| number == (uint)CrestronControlSystem.eDmps34K300COutputs.Mix2
|| number == (uint)CrestronControlSystem.eDmps34K350COutputs.Mix2)
AddAudioOnlyOutputPort(number, CrestronControlSystem.eDmps34K250COutputs.Mix2.ToString());
- }
- else if (outputCard is Card.Dmps3AecOutput)
- {
- AddAudioOnlyOutputPort(number, "Aec");
+
+ var audioOutput = new DmpsAudioOutputController(string.Format("processor-digitalAudioOutput{0}", number % 2 + 1), string.Format("Digital Audio Mix {0}", number % 2 + 1), outputCard as Card.Dmps3DigitalMixOutput);
+ DeviceManager.AddDevice(audioOutput);
}
else
{
@@ -851,6 +983,7 @@ namespace PepperDash.Essentials.DM
void Dmps_DMInputChange(Switch device, DMInputEventArgs args)
{
+ Debug.Console(2, this, "DMInputChange Input: {0} EventId: {1}", args.Number, args.EventId.ToString());
try
{
switch (args.EventId)
@@ -861,6 +994,12 @@ namespace PepperDash.Essentials.DM
InputEndpointOnlineFeedbacks[args.Number].FireUpdate();
break;
}
+ case (DMInputEventIds.EndpointOnlineEventId):
+ {
+ Debug.Console(2, this, "DM Input EndpointOnlineEventId for input: {0}. State: {1}", args.Number, device.Inputs[args.Number].EndpointOnlineFeedback);
+ InputEndpointOnlineFeedbacks[args.Number].FireUpdate();
+ break;
+ }
case (DMInputEventIds.VideoDetectedEventId):
{
Debug.Console(2, this, "DM Input {0} VideoDetectedEventId", args.Number);
@@ -885,14 +1024,13 @@ 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());
-
if (args.EventId == DMOutputEventIds.OutputVuFeedBackEventId)
{
//Frequently called event that isn't needed
return;
}
+ Debug.Console(2, this, "DMOutputChange Output: {0} EventId: {1}", args.Number, args.EventId.ToString());
var output = args.Number;
DMOutput outputCard = Dmps.SwitcherOutputs[output] as DMOutput;
@@ -906,6 +1044,11 @@ namespace PepperDash.Essentials.DM
{
OutputEndpointOnlineFeedbacks[output].FireUpdate();
}
+ else if (args.EventId == DMOutputEventIds.EndpointOnlineEventId
+ && OutputEndpointOnlineFeedbacks.ContainsKey(output))
+ {
+ OutputEndpointOnlineFeedbacks[output].FireUpdate();
+ }
else if (args.EventId == DMOutputEventIds.VideoOutEventId)
{
if (outputCard != null && outputCard.VideoOutFeedback != null)
@@ -920,41 +1063,68 @@ namespace PepperDash.Essentials.DM
{
OutputVideoRouteNameFeedbacks[output].FireUpdate();
}
+ if (outputCard is Card.Dmps3DmOutputBackend || outputCard is Card.Dmps3HdmiOutputBackend)
+ {
+ if (AudioOutputFeedbacks.ContainsKey(output))
+ {
+ AudioOutputFeedbacks[output].FireUpdate();
+ }
+ if (OutputAudioRouteNameFeedbacks.ContainsKey(output))
+ {
+ OutputAudioRouteNameFeedbacks[output].FireUpdate();
+ }
+ }
}
else if (args.EventId == DMOutputEventIds.AudioOutEventId)
{
- try
+ if (!Global.ControlSystemIsDmps4k3xxType)
{
if (outputCard != null && outputCard.AudioOutFeedback != null)
{
Debug.Console(2, this, "DMSwitchAudio:{0} Routed Input:{1} Output:{2}'", this.Name,
outputCard.AudioOutFeedback.Number, output);
}
- if (AudioOutputFeedbacks.ContainsKey(output))
- {
- AudioOutputFeedbacks[output].FireUpdate();
- }
}
- catch (NotSupportedException)
+ else
{
if (outputCard != null)
{
- Debug.Console(2, this, "DMSwitchAudio:{0} Routed Input:{1} Output:{2}'", Name,
- outputCard.AudioOutSourceFeedback, output);
- }
- if (AudioOutputFeedbacks.ContainsKey(output))
- {
- AudioOutputFeedbacks[output].FireUpdate();
+ if (outputCard is Card.Dmps3DmOutputBackend || outputCard is Card.Dmps3HdmiOutputBackend)
+ {
+ DigitalAudioOutputs[output].AudioSourceNumericFeedback.FireUpdate();
+ }
+ else
+ {
+ Debug.Console(2, this, "DMSwitchAudio:{0} Routed Input:{1} Output:{2}'", Name,
+ outputCard.AudioOutSourceFeedback, output);
+ }
}
}
+ if (AudioOutputFeedbacks.ContainsKey(output))
+ {
+ AudioOutputFeedbacks[output].FireUpdate();
+ }
+ if (OutputAudioRouteNameFeedbacks.ContainsKey(output))
+ {
+ OutputAudioRouteNameFeedbacks[output].FireUpdate();
+ }
}
else if (args.EventId == DMOutputEventIds.OutputNameEventId
&& OutputNameFeedbacks.ContainsKey(output))
{
- Debug.Console(2, this, "DM Output {0} NameFeedbackEventId", output);
OutputNameFeedbacks[output].FireUpdate();
}
-
+ else if (args.EventId == DMOutputEventIds.DigitalMixerAudioSourceFeedBackEventId)
+ {
+ if (AudioOutputFeedbacks.ContainsKey(output))
+ {
+ AudioOutputFeedbacks[output].FireUpdate();
+ }
+ if (OutputAudioRouteNameFeedbacks.ContainsKey(output))
+ {
+ OutputAudioRouteNameFeedbacks[output].FireUpdate();
+ }
+ }
}
void Dmps_DMSystemChange(Switch device, DMSystemEventArgs args)
@@ -1002,9 +1172,6 @@ namespace PepperDash.Essentials.DM
Debug.Console(2, this, "Attempting a DM route from input {0} to output {1} {2}", inputSelector, outputSelector, sigType);
- //var input = Convert.ToUInt32(inputSelector); // Cast can sometimes fail
- //var output = Convert.ToUInt32(outputSelector);
-
var input = inputSelector as DMInput;
var output = outputSelector as DMOutput;
@@ -1022,7 +1189,7 @@ namespace PepperDash.Essentials.DM
if (input == null || (input.Number <= Dmps.NumberOfSwitcherInputs && output.Number <= Dmps.NumberOfSwitcherOutputs &&
sigTypeIsUsbOrVideo) ||
- (input.Number <= Dmps.NumberOfSwitcherInputs + 5 && output.Number <= Dmps.NumberOfSwitcherOutputs &&
+ (input.Number <= (Dmps.NumberOfSwitcherInputs) && output.Number <= Dmps.NumberOfSwitcherOutputs &&
(sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio))
{
// Check to see if there's an off timer waiting on this and if so, cancel
@@ -1041,11 +1208,6 @@ namespace PepperDash.Essentials.DM
}
}
-
- //DMOutput dmOutputCard = output == 0 ? null : Dmps.SwitcherOutputs[output] as DMOutput;
-
- //if (inCard != null)
- //{
// NOTE THAT BITWISE COMPARISONS - TO CATCH ALL ROUTING TYPES
if ((sigType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
{
@@ -1054,19 +1216,34 @@ namespace PepperDash.Essentials.DM
if ((sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
{
- try
+ if (!Global.ControlSystemIsDmps4k3xxType)
{
output.AudioOut = input;
}
- catch (NotSupportedException)
+ else
{
- Debug.Console(1, this, "Routing input {0} audio to output {1}",
- (eDmps34KAudioOutSource) (input == null ? 0 : input.Number),
- (CrestronControlSystem.eDmps34K350COutputs) output.Number);
-
- output.AudioOutSource = input == null
- ? eDmps34KAudioOutSource.NoRoute
- : (eDmps34KAudioOutSource)input.Number;
+ if (input == null)
+ {
+ output.AudioOutSource = eDmps34KAudioOutSource.NoRoute;
+ }
+ else if (input.CardInputOutputType == eCardInputOutputType.Dmps3AirMediaInput || input.CardInputOutputType == eCardInputOutputType.Dmps3AirMediaNoStreamingInput)
+ {
+ //Special case for weird AirMedia indexing
+ if (Dmps.SystemControl.SystemControlType == eSystemControlType.Dmps34K250CSystemControl)
+ output.AudioOutSource = eDmps34KAudioOutSource.AirMedia8;
+ else if (Dmps.SystemControl.SystemControlType == eSystemControlType.Dmps34K350CSystemControl)
+ output.AudioOutSource = eDmps34KAudioOutSource.AirMedia9;
+ }
+ else if (input.Number < Dmps.SwitcherInputs.Count)
+ {
+ //Shift video inputs by 5 for weird DMPS3-4K indexing
+ output.AudioOutSource = (eDmps34KAudioOutSource)(input.Number + 5);
+ }
+ else
+ {
+ //Shift analog inputs back to inputs 1-5
+ output.AudioOutSource = (eDmps34KAudioOutSource)(input.Number - Dmps.SwitcherInputs.Count + 1);
+ }
}
}
@@ -1100,10 +1277,91 @@ namespace PepperDash.Essentials.DM
public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType sigType)
{
- var input = inputSelector == 0 ? null : Dmps.SwitcherInputs[inputSelector];
- var output = Dmps.SwitcherOutputs[outputSelector];
+ if (EnableRouting == false)
+ {
+ return;
+ }
- ExecuteSwitch(input, output, sigType);
+ Debug.Console(1, this, "Attempting a numeric switch from input {0} to output {1} {2}", inputSelector, outputSelector, sigType);
+
+ if((sigType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
+ {
+ if (inputSelector <= Dmps.SwitcherInputs.Count && outputSelector <= Dmps.SwitcherOutputs.Count)
+ {
+ var input = inputSelector == 0 ? null : Dmps.SwitcherInputs[inputSelector];
+ var output = Dmps.SwitcherOutputs[outputSelector];
+
+ ExecuteSwitch(input, output, sigType);
+ }
+ }
+ else if ((sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
+ {
+ //Special case for DMPS-4K digital audio output
+ if (Global.ControlSystemIsDmps4k3xxType)
+ {
+ if (DigitalAudioOutputs.ContainsKey(outputSelector))
+ {
+ if (inputSelector == 0) //Clear action
+ {
+ DigitalAudioOutputs[outputSelector].ExecuteNumericSwitch(0, 0, eRoutingSignalType.Audio);
+ }
+ else if (inputSelector < Dmps.SwitcherInputs.Count) //DMPS-4K video inputs, set to audio follows video
+ {
+ DigitalAudioOutputs[outputSelector].ExecuteNumericSwitch(3, 0, eRoutingSignalType.Audio);
+ //Force video route since it is now set so audio follows video
+ ExecuteNumericSwitch(inputSelector, outputSelector, eRoutingSignalType.Video);
+ }
+ else if (inputSelector == Dmps.SwitcherInputs.Count + 5)
+ {
+ //Set to mix 1
+ DigitalAudioOutputs[outputSelector].ExecuteNumericSwitch(1, 0, eRoutingSignalType.Audio);
+ }
+ else if (inputSelector == Dmps.SwitcherInputs.Count + 6)
+ {
+ //Set to mix 2
+ DigitalAudioOutputs[outputSelector].ExecuteNumericSwitch(2, 0, eRoutingSignalType.Audio);
+ }
+ }
+ else if (inputSelector <= (Dmps.SwitcherInputs.Count + 4) && outputSelector <= Dmps.SwitcherOutputs.Count)
+ {
+ var output = Dmps.SwitcherOutputs[outputSelector] as DMOutput;
+ if (inputSelector == 0)
+ {
+ output.AudioOutSource = eDmps34KAudioOutSource.NoRoute;
+ }
+ else if(inputSelector >= (Dmps.SwitcherInputs.Count))
+ {
+ //Shift analog inputs back to inputs 1-5
+ Debug.Console(1, this, "Attempting analog route input {0} to output {1}", inputSelector - Dmps.SwitcherInputs.Count + 1, outputSelector);
+ output.AudioOutSource = (eDmps34KAudioOutSource)(inputSelector - Dmps.SwitcherInputs.Count + 1);
+ }
+ else if (inputSelector < Dmps.SwitcherInputs.Count)
+ {
+ var input = Dmps.SwitcherInputs[inputSelector] as DMInput;
+ if (input.CardInputOutputType == eCardInputOutputType.Dmps3AirMediaInput || input.CardInputOutputType == eCardInputOutputType.Dmps3AirMediaNoStreamingInput)
+ {
+ //Special case for weird AirMedia indexing
+ if (Dmps.SystemControl.SystemControlType == eSystemControlType.Dmps34K250CSystemControl)
+ output.AudioOutSource = eDmps34KAudioOutSource.AirMedia8;
+ else if (Dmps.SystemControl.SystemControlType == eSystemControlType.Dmps34K350CSystemControl)
+ output.AudioOutSource = eDmps34KAudioOutSource.AirMedia9;
+ }
+ else
+ {
+ //Shift video inputs by 5 for weird DMPS3-4K indexing
+ output.AudioOutSource = (eDmps34KAudioOutSource)(inputSelector + 5);
+ }
+ }
+ }
+ }
+
+ else if (inputSelector <= Dmps.SwitcherInputs.Count && outputSelector <= Dmps.SwitcherOutputs.Count)
+ {
+ var output = Dmps.SwitcherOutputs[outputSelector] as DMOutput;
+ var input = inputSelector == 0 ? null : Dmps.SwitcherInputs[inputSelector] as DMInput;
+ output.AudioOut = input;
+ }
+ }
}
#endregion
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/HdMd8xNController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/HdMd8xNController.cs
new file mode 100644
index 00000000..2343f65a
--- /dev/null
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/HdMd8xNController.cs
@@ -0,0 +1,516 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+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 Crestron.SimplSharpPro.DM.Cards;
+using PepperDash.Essentials.Core.Bridges;
+using PepperDash.Essentials.Core.Config;
+
+
+namespace PepperDash.Essentials.DM.Chassis
+{
+ [Description("Wrapper class for all HdMd8xN switchers")]
+ public class HdMd8xNController : CrestronGenericBridgeableBaseDevice, IRoutingNumericWithFeedback, IHasFeedback
+ {
+ private HdMd8xN _Chassis;
+
+ public event EventHandler NumericSwitchChange;
+
+ 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 AudioOutputRouteFeedbacks { get; private set; }
+ public FeedbackCollection InputNameFeedbacks { get; private set; }
+ public FeedbackCollection OutputNameFeedbacks { get; private set; }
+ public FeedbackCollection OutputVideoRouteNameFeedbacks { get; private set; }
+ public FeedbackCollection OutputAudioRouteNameFeedbacks { get; private set; }
+ public StringFeedback DeviceNameFeedback { get; private set; }
+
+ #region Constructor
+
+ public HdMd8xNController(string key, string name, HdMd8xN chassis,
+ DMChassisPropertiesConfig props)
+ : base(key, name, chassis)
+ {
+ _Chassis = chassis;
+ Name = name;
+ _Chassis.EnableAudioBreakaway.BoolValue = true;
+
+ if (props == null)
+ {
+ Debug.Console(1, this, "HdMd8xNController properties are null, failed to build the device");
+ return;
+ }
+
+ InputNames = new Dictionary();
+ if (props.InputNames != null)
+ {
+ InputNames = props.InputNames;
+ }
+ OutputNames = new Dictionary();
+ if (props.OutputNames != null)
+ {
+ OutputNames = props.OutputNames;
+ }
+
+ DeviceNameFeedback = new StringFeedback(()=> Name);
+
+ VideoInputSyncFeedbacks = new FeedbackCollection();
+ VideoOutputRouteFeedbacks = new FeedbackCollection();
+ AudioOutputRouteFeedbacks = new FeedbackCollection();
+ InputNameFeedbacks = new FeedbackCollection();
+ OutputNameFeedbacks = new FeedbackCollection();
+ OutputVideoRouteNameFeedbacks = new FeedbackCollection();
+ OutputAudioRouteNameFeedbacks = new FeedbackCollection();
+
+ InputPorts = new RoutingPortCollection();
+ OutputPorts = new RoutingPortCollection();
+
+ //Inputs - should always be 8 audio/video inputs
+ for (uint i = 1; i <= _Chassis.NumberOfInputs; i++)
+ {
+ try
+ {
+ var index = i;
+ if (!InputNames.ContainsKey(index))
+ {
+ InputNames.Add(index, string.Format("Input{0}", index));
+ }
+ string inputName = InputNames[index];
+ _Chassis.Inputs[index].Name.StringValue = inputName;
+
+
+ InputPorts.Add(new RoutingInputPort(inputName, eRoutingSignalType.AudioVideo,
+ eRoutingPortConnectionType.Hdmi, _Chassis.Inputs[index], this)
+ {
+ FeedbackMatchObject = _Chassis.Inputs[index]
+ });
+
+ VideoInputSyncFeedbacks.Add(new BoolFeedback(inputName, () => _Chassis.Inputs[index].VideoDetectedFeedback.BoolValue));
+ InputNameFeedbacks.Add(new StringFeedback(inputName, () => _Chassis.Inputs[index].NameFeedback.StringValue));
+ }
+ catch (Exception ex)
+ {
+ ErrorLog.Error("Exception creating input {0} on HD-MD8xN Chassis: {1}", i, ex);
+ }
+ }
+
+ //Outputs. Either 2 outputs (1 audio, 1 audio/video) for HD-MD8x1 or 4 outputs (2 audio, 2 audio/video) for HD-MD8x2
+ for (uint i = 1; i <= _Chassis.NumberOfOutputs; i++)
+ {
+ try
+ {
+ var index = i;
+ if (!OutputNames.ContainsKey(index))
+ {
+ OutputNames.Add(index, string.Format("Output{0}", index));
+ }
+ string outputName = OutputNames[index];
+ _Chassis.Outputs[index].Name.StringValue = outputName;
+
+ OutputPorts.Add(new RoutingOutputPort(outputName, eRoutingSignalType.AudioVideo,
+ eRoutingPortConnectionType.Hdmi, _Chassis.Outputs[index], this)
+ {
+ FeedbackMatchObject = _Chassis.Outputs[index]
+ });
+
+ OutputNameFeedbacks.Add(new StringFeedback(outputName, () => _Chassis.Outputs[index].NameFeedback.StringValue));
+ VideoOutputRouteFeedbacks.Add(new IntFeedback(outputName, () => _Chassis.Outputs[index].VideoOutFeedback == null ? 0 : (int)_Chassis.Outputs[index].VideoOutFeedback.Number));
+ AudioOutputRouteFeedbacks.Add(new IntFeedback(outputName, () => _Chassis.Outputs[index].AudioOutFeedback == null ? 0 : (int)_Chassis.Outputs[index].AudioOutFeedback.Number));
+ OutputVideoRouteNameFeedbacks.Add(new StringFeedback(outputName, () => _Chassis.Outputs[index].VideoOutFeedback == null ? "None" : _Chassis.Outputs[index].VideoOutFeedback.NameFeedback.StringValue));
+ OutputAudioRouteNameFeedbacks.Add(new StringFeedback(outputName, () => _Chassis.Outputs[index].AudioOutFeedback == null ? "None" : _Chassis.Outputs[index].VideoOutFeedback.NameFeedback.StringValue));
+ }
+ catch (Exception ex)
+ {
+ ErrorLog.Error("Exception creating output {0} on HD-MD8xN Chassis: {1}", i, ex);
+ }
+ }
+
+ _Chassis.DMInputChange += Chassis_DMInputChange;
+ _Chassis.DMOutputChange += Chassis_DMOutputChange;
+
+ AddPostActivationAction(AddFeedbackCollections);
+ }
+ #endregion
+
+ #region Methods
+
+ ///
+ /// Raise an event when the status of a switch object changes.
+ ///
+ /// Arguments defined as IKeyName sender, output, input, and eRoutingSignalType
+ private void OnSwitchChange(RoutingNumericEventArgs e)
+ {
+ var newEvent = NumericSwitchChange;
+ if (newEvent != null) newEvent(this, e);
+ }
+
+ #region PostActivate
+
+ public void AddFeedbackCollections()
+ {
+ AddFeedbackToList(DeviceNameFeedback);
+ AddCollectionsToList(VideoInputSyncFeedbacks);
+ AddCollectionsToList(VideoOutputRouteFeedbacks, AudioOutputRouteFeedbacks);
+ AddCollectionsToList(InputNameFeedbacks, OutputNameFeedbacks, OutputVideoRouteNameFeedbacks, OutputAudioRouteNameFeedbacks);
+ }
+
+ #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 sigType)
+ {
+ var input = inputSelector as DMInput;
+ var output = outputSelector as DMOutput;
+ Debug.Console(2, this, "ExecuteSwitch: input={0} output={1} sigType={2}", input, output, sigType.ToString());
+
+ if (output == null)
+ {
+ Debug.Console(0, this, "Unable to make switch. Output selector is not DMOutput");
+ return;
+ }
+
+ if ((sigType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
+ {
+ _Chassis.VideoEnter.BoolValue = true;
+ if (output != null)
+ {
+ output.VideoOut = input;
+ }
+ }
+
+ if ((sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
+ {
+ _Chassis.AudioEnter.BoolValue = true;
+ if (output != null)
+ {
+ output.AudioOut = input;
+ }
+ }
+ }
+
+ #endregion
+
+ #region IRoutingNumeric Members
+
+ public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType signalType)
+ {
+
+ var input = inputSelector == 0 ? null : _Chassis.Inputs[inputSelector];
+ var output = _Chassis.Outputs[outputSelector];
+
+ Debug.Console(2, this, "ExecuteNumericSwitch: input={0} output={1}", input, output);
+
+ ExecuteSwitch(input, output, signalType);
+ }
+
+ #endregion
+
+ #endregion
+
+ #region Bridge Linking
+
+ public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
+ {
+ var joinMap = new DmChassisControllerJoinMap(joinStart);
+
+ var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
+
+ if (!string.IsNullOrEmpty(joinMapSerialized))
+ joinMap = JsonConvert.DeserializeObject(joinMapSerialized);
+
+ if (bridge != null)
+ {
+ bridge.AddJoinMap(Key, joinMap);
+ }
+ else
+ {
+ Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
+ }
+
+ IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
+
+ trilist.StringInput[joinMap.Name.JoinNumber].StringValue = this.Name;
+
+ for (uint i = 1; i <= _Chassis.NumberOfInputs; i++)
+ {
+ var joinIndex = i - 1;
+ var input = i;
+ //Digital
+ VideoInputSyncFeedbacks[InputNames[input]].LinkInputSig(trilist.BooleanInput[joinMap.VideoSyncStatus.JoinNumber + joinIndex]);
+
+ //Serial
+ InputNameFeedbacks[InputNames[input]].LinkInputSig(trilist.StringInput[joinMap.InputNames.JoinNumber + joinIndex]);
+ }
+
+ for (uint i = 1; i <= _Chassis.NumberOfOutputs; i++)
+ {
+ var joinIndex = i - 1;
+ var output = i;
+ //Analog
+ VideoOutputRouteFeedbacks[OutputNames[output]].LinkInputSig(trilist.UShortInput[joinMap.OutputVideo.JoinNumber + joinIndex]);
+ trilist.SetUShortSigAction(joinMap.OutputVideo.JoinNumber + joinIndex, (a) => ExecuteNumericSwitch(a, (ushort)output, eRoutingSignalType.Video));
+ AudioOutputRouteFeedbacks[OutputNames[output]].LinkInputSig(trilist.UShortInput[joinMap.OutputAudio.JoinNumber + joinIndex]);
+ trilist.SetUShortSigAction(joinMap.OutputAudio.JoinNumber + joinIndex, (a) => ExecuteNumericSwitch(a, (ushort)output, eRoutingSignalType.Audio));
+
+ //Serial
+ OutputNameFeedbacks[OutputNames[output]].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + joinIndex]);
+ OutputVideoRouteNameFeedbacks[OutputNames[output]].LinkInputSig(trilist.StringInput[joinMap.OutputCurrentVideoInputNames.JoinNumber + joinIndex]);
+ OutputAudioRouteNameFeedbacks[OutputNames[output]].LinkInputSig(trilist.StringInput[joinMap.OutputCurrentAudioInputNames.JoinNumber + joinIndex]);
+ }
+
+ _Chassis.OnlineStatusChange += Chassis_OnlineStatusChange;
+
+ trilist.OnlineStatusChange += (d, args) =>
+ {
+ if (!args.DeviceOnLine) return;
+ };
+ }
+
+
+ #endregion
+
+ #region Events
+
+ void Chassis_OnlineStatusChange(Crestron.SimplSharpPro.GenericBase currentDevice, Crestron.SimplSharpPro.OnlineOfflineEventArgs args)
+ {
+ IsOnline.FireUpdate();
+
+ if (!args.DeviceOnLine) return;
+
+ foreach (var feedback in Feedbacks)
+ {
+ feedback.FireUpdate();
+ }
+ }
+
+ void Chassis_DMOutputChange(Switch device, DMOutputEventArgs args)
+ {
+ switch (args.EventId)
+ {
+ case DMOutputEventIds.VideoOutEventId:
+ {
+ var output = args.Number;
+ var inputNumber = _Chassis.Outputs[output].VideoOutFeedback == null ? 0 : _Chassis.Outputs[output].VideoOutFeedback.Number;
+
+ var outputName = OutputNames[output];
+
+ var feedback = VideoOutputRouteFeedbacks[outputName];
+
+ if (feedback == null)
+ {
+ return;
+ }
+ var inPort = InputPorts.FirstOrDefault(p => p.FeedbackMatchObject == _Chassis.Outputs[output].VideoOutFeedback);
+ var outPort = OutputPorts.FirstOrDefault(p => p.FeedbackMatchObject == _Chassis.Outputs[output]);
+
+ feedback.FireUpdate();
+ OnSwitchChange(new RoutingNumericEventArgs(output, inputNumber, outPort, inPort, eRoutingSignalType.Video));
+ break;
+ }
+ case DMOutputEventIds.AudioOutEventId:
+ {
+ var output = args.Number;
+ var inputNumber = _Chassis.Outputs[output].AudioOutFeedback == null ? 0 : _Chassis.Outputs[output].AudioOutFeedback.Number;
+
+ var outputName = OutputNames[output];
+
+ var feedback = AudioOutputRouteFeedbacks[outputName];
+
+ if (feedback == null)
+ {
+ return;
+ }
+ var inPort = InputPorts.FirstOrDefault(p => p.FeedbackMatchObject == _Chassis.Outputs[output].AudioOutFeedback);
+ var outPort = OutputPorts.FirstOrDefault(p => p.FeedbackMatchObject == _Chassis.Outputs[output]);
+
+ feedback.FireUpdate();
+ OnSwitchChange(new RoutingNumericEventArgs(output, inputNumber, outPort, inPort, eRoutingSignalType.Audio));
+ break;
+ }
+ case DMOutputEventIds.OutputNameEventId:
+ case DMOutputEventIds.NameFeedbackEventId:
+ {
+ Debug.Console(1, this, "Event ID {0}: Updating name feedbacks.", args.EventId);
+ Debug.Console(1, this, "Output {0} Name {1}", args.Number,
+ _Chassis.Outputs[args.Number].NameFeedback.StringValue);
+ foreach (var item in OutputNameFeedbacks)
+ {
+ item.FireUpdate();
+ }
+ break;
+ }
+ default:
+ {
+ Debug.Console(1, this, "Unhandled DM Output Event ID {0}", args.EventId);
+ break;
+ }
+ }
+ }
+
+ void Chassis_DMInputChange(Switch device, DMInputEventArgs args)
+ {
+ switch (args.EventId)
+ {
+ case DMInputEventIds.VideoDetectedEventId:
+ {
+ Debug.Console(1, this, "Event ID {0}: Updating VideoInputSyncFeedbacks", args.EventId);
+ foreach (var item in VideoInputSyncFeedbacks)
+ {
+ item.FireUpdate();
+ }
+ break;
+ }
+ case DMInputEventIds.InputNameFeedbackEventId:
+ case DMInputEventIds.InputNameEventId:
+ case DMInputEventIds.NameFeedbackEventId:
+ {
+ Debug.Console(1, this, "Event ID {0}: Updating name feedbacks.", args.EventId);
+ Debug.Console(1, this, "Input {0} Name {1}", args.Number,
+ _Chassis.Inputs[args.Number].NameFeedback.StringValue);
+ foreach (var item in InputNameFeedbacks)
+ {
+ item.FireUpdate();
+ }
+ break;
+ }
+ default:
+ {
+ Debug.Console(1, this, "Unhandled DM Input Event ID {0}", args.EventId);
+ break;
+ }
+ }
+ }
+
+ #endregion
+
+ #region Factory
+
+ public class HdMd8xNControllerFactory : EssentialsDeviceFactory
+ {
+ public HdMd8xNControllerFactory()
+ {
+ TypeNames = new List() { "hdmd8x2", "hdmd8x1" };
+ }
+
+ public override EssentialsDevice BuildDevice(DeviceConfig dc)
+ {
+ Debug.Console(1, "Factory Attempting to create new HD-MD-8xN Device");
+
+ var props = JsonConvert.DeserializeObject(dc.Properties.ToString());
+
+ var type = dc.Type.ToLower();
+ var control = props.Control;
+ var ipid = control.IpIdInt;
+
+ switch (type)
+ {
+ case ("hdmd8x2"):
+ return new HdMd8xNController(dc.Key, dc.Name, new HdMd8x2(ipid, Global.ControlSystem), props);
+ case ("hdmd8x1"):
+ return new HdMd8xNController(dc.Key, dc.Name, new HdMd8x1(ipid, Global.ControlSystem), props);
+ default:
+ return null;
+ }
+ }
+ }
+
+ #endregion
+
+
+
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmHdBaseTEndpointController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmHdBaseTEndpointController.cs
index 3af4f0fe..ec3553a1 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmHdBaseTEndpointController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmHdBaseTEndpointController.cs
@@ -1,8 +1,10 @@
-using Crestron.SimplSharp.Ssh;
+using Crestron.SimplSharpPro.DeviceSupport;
using Crestron.SimplSharpPro;
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
-
+using PepperDash.Essentials.Core.Bridges;
using PepperDash.Essentials.Core;
+using PepperDash.Core;
+using Newtonsoft.Json;
namespace PepperDash.Essentials.DM
{
@@ -28,6 +30,30 @@ namespace PepperDash.Essentials.DM
OutputPorts = new RoutingPortCollection {HDBaseTSink};
}
+ public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
+ {
+ var joinMap = new DmRmcControllerJoinMap(joinStart);
+
+ var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
+
+ if (!string.IsNullOrEmpty(joinMapSerialized))
+ joinMap = JsonConvert.DeserializeObject(joinMapSerialized);
+
+ if (bridge != null)
+ {
+ bridge.AddJoinMap(Key, joinMap);
+ }
+ else
+ {
+ Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
+ }
+
+ Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
+
+ IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
+ trilist.StringInput[joinMap.Name.JoinNumber].StringValue = this.Name;
+ }
+
#region IComPorts Members
public CrestronCollection ComPorts { get { return Rmc.ComPorts; } }
public int NumberOfComPorts { get { return Rmc.NumberOfComPorts; } }
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 92af7ce1..529f740a 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4k100C1GController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmc4k100C1GController.cs
@@ -1,9 +1,11 @@
using Crestron.SimplSharpPro;
using Crestron.SimplSharpPro.DM;
-using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
-
-using PepperDash.Essentials.Core;
-
+using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
+using Crestron.SimplSharpPro.DeviceSupport;
+using PepperDash.Essentials.Core.Bridges;
+using PepperDash.Essentials.Core;
+using PepperDash.Core;
+using Newtonsoft.Json;
namespace PepperDash.Essentials.DM
{
@@ -31,6 +33,30 @@ namespace PepperDash.Essentials.DM
InputPorts = new RoutingPortCollection {DmIn};
OutputPorts = new RoutingPortCollection {HdmiOut};
+ }
+
+ public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
+ {
+ var joinMap = new DmRmcControllerJoinMap(joinStart);
+
+ var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
+
+ if (!string.IsNullOrEmpty(joinMapSerialized))
+ joinMap = JsonConvert.DeserializeObject(joinMapSerialized);
+
+ if (bridge != null)
+ {
+ bridge.AddJoinMap(Key, joinMap);
+ }
+ else
+ {
+ Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
+ }
+
+ Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
+
+ IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
+ trilist.StringInput[joinMap.Name.JoinNumber].StringValue = this.Name;
}
#region IIROutputPorts Members
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcHelper.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcHelper.cs
index a9282693..5d644a2a 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcHelper.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Receivers/DmRmcHelper.cs
@@ -30,14 +30,15 @@ namespace PepperDash.Essentials.DM
: base(key, name, device)
{
_rmc = device;
+
// if wired to a chassis, skip registration step in base class
PreventRegistration = _rmc.DMOutput != null;
AddToFeedbackList(VideoOutputResolutionFeedback, EdidManufacturerFeedback, EdidSerialNumberFeedback, EdidNameFeedback, EdidPreferredTimingFeedback);
-
+
DeviceInfo = new DeviceInfo();
- _rmc.OnlineStatusChange += (currentDevice, args) => { if (args.DeviceOnLine) UpdateDeviceInfo(); };
+ IsOnline.OutputChange += (currentDevice, args) => { if (args.BoolValue) UpdateDeviceInfo(); };
}
protected void LinkDmRmcToApi(DmRmcControllerBase rmc, BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
@@ -60,7 +61,7 @@ namespace PepperDash.Essentials.DM
Debug.Console(1, rmc, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
- rmc.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
+ IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = rmc.Name;
if (rmc.VideoOutputResolutionFeedback != null)
rmc.VideoOutputResolutionFeedback.LinkInputSig(trilist.StringInput[joinMap.CurrentOutputResolution.JoinNumber]);
@@ -187,7 +188,7 @@ namespace PepperDash.Essentials.DM
#endregion
}
- public abstract class DmHdBaseTControllerBase : CrestronGenericBaseDevice
+ public abstract class DmHdBaseTControllerBase : CrestronGenericBridgeableBaseDevice
{
protected HDBaseTBase Rmc;
@@ -330,53 +331,85 @@ namespace PepperDash.Essentials.DM
var parentDev = DeviceManager.GetDeviceForKey(pKey);
if (parentDev is DmpsRoutingController)
{
- if ((parentDev as DmpsRoutingController).Dmps4kType)
+ var dmps = parentDev as DmpsRoutingController;
+ //Check that the input is within range of this chassis' possible inputs
+ var num = props.ParentOutputNumber;
+ Debug.Console(1, "Creating DMPS device '{0}'. Output number '{1}'.", key, num);
+ if (num <= 0 || num > dmps.Dmps.SwitcherOutputs.Count)
{
- return GetDmRmcControllerForDmps4k(key, name, typeName, parentDev as DmpsRoutingController, props.ParentOutputNumber);
+ Debug.Console(0, "Cannot create DMPS device '{0}'. Output number '{1}' is out of range",
+ key, num);
+ return null;
}
- else
+ // Must use different constructor for DMPS4K types. No IPID
+ if (Global.ControlSystemIsDmps4kType || typeName == "hdbasetrx" || typeName == "dmrmc4k100c1g")
{
- return GetDmRmcControllerForDmps(key, name, typeName, ipid, parentDev as DmpsRoutingController, props.ParentOutputNumber);
+ var rmc = GetDmRmcControllerForDmps4k(key, name, typeName, dmps, props.ParentOutputNumber);
+ Debug.Console(0, "DM endpoint output {0} is for Dmps4k, changing online feedback to chassis", num);
+ rmc.IsOnline.SetValueFunc(() => dmps.OutputEndpointOnlineFeedbacks[num].BoolValue);
+ dmps.OutputEndpointOnlineFeedbacks[num].OutputChange += (o, a) =>
+ {
+ foreach (var feedback in rmc.Feedbacks)
+ {
+ if (feedback != null)
+ feedback.FireUpdate();
+ }
+ };
+ return rmc;
}
+ return GetDmRmcControllerForDmps(key, name, typeName, ipid, dmps, props.ParentOutputNumber);
}
- if (!(parentDev is IDmSwitch))
- {
- Debug.Console(0, "Cannot create DM device '{0}'. '{1}' is not a DM Chassis.",
- key, pKey);
- return null;
- }
+ else if (parentDev is DmChassisController)
+ {
+ var controller = parentDev as DmChassisController;
+ var chassis = controller.Chassis;
+ var num = props.ParentOutputNumber;
+ Debug.Console(1, "Creating DM Chassis device '{0}'. Output number '{1}'.", key, num);
- var chassis = (parentDev as IDmSwitch).Chassis;
- var num = props.ParentOutputNumber;
-
- if (num <= 0 || num > chassis.NumberOfOutputs)
- {
- Debug.Console(0, "Cannot create DM device '{0}'. Output number '{1}' is out of range",
- key, num);
- return null;
- }
-
- var controller = parentDev as IDmSwitch;
- controller.RxDictionary.Add(num, key);
- // Catch constructor failures, mainly dues to IPID
- try
- {
- // Must use different constructor for CPU3 chassis types. No IPID
- if (chassis is DmMd8x8Cpu3 || chassis is DmMd16x16Cpu3 ||
- chassis is DmMd32x32Cpu3 || chassis is DmMd8x8Cpu3rps ||
- chassis is DmMd16x16Cpu3rps || chassis is DmMd32x32Cpu3rps ||
- chassis is DmMd128x128 || chassis is DmMd64x64)
- {
- return GetDmRmcControllerForCpu3Chassis(key, name, typeName, chassis, num, parentDev);
- }
-
- return GetDmRmcControllerForCpu2Chassis(key, name, typeName, ipid, chassis, num, parentDev);
- }
- catch (Exception e)
- {
- Debug.Console(0, "[{0}] WARNING: Cannot create DM-RMC device: {1}", key, e.Message);
- return null;
- }
+ if (num <= 0 || num > chassis.NumberOfOutputs)
+ {
+ Debug.Console(0, "Cannot create DM device '{0}'. Output number '{1}' is out of range",
+ key, num);
+ return null;
+ }
+ controller.RxDictionary.Add(num, key);
+ // Catch constructor failures, mainly dues to IPID
+ try
+ {
+ // Must use different constructor for CPU3 chassis types. No IPID
+ if (chassis is DmMd8x8Cpu3 || chassis is DmMd16x16Cpu3 ||
+ chassis is DmMd32x32Cpu3 || chassis is DmMd8x8Cpu3rps ||
+ chassis is DmMd16x16Cpu3rps || chassis is DmMd32x32Cpu3rps ||
+ chassis is DmMd128x128 || chassis is DmMd64x64
+ || typeName == "hdbasetrx" || typeName == "dmrmc4k100c1g")
+ {
+ var rmc = GetDmRmcControllerForCpu3Chassis(key, name, typeName, chassis, num, parentDev);
+ Debug.Console(0, "DM endpoint output {0} is for Cpu3, changing online feedback to chassis", num);
+ rmc.IsOnline.SetValueFunc(() => controller.OutputEndpointOnlineFeedbacks[num].BoolValue);
+ controller.OutputEndpointOnlineFeedbacks[num].OutputChange += (o, a) =>
+ {
+ foreach (var feedback in rmc.Feedbacks)
+ {
+ if (feedback != null)
+ feedback.FireUpdate();
+ }
+ };
+ return rmc;
+ }
+ return GetDmRmcControllerForCpu2Chassis(key, name, typeName, ipid, chassis, num, parentDev);
+ }
+ catch (Exception e)
+ {
+ Debug.Console(0, "[{0}] WARNING: Cannot create DM-RMC device: {1}", key, e.Message);
+ return null;
+ }
+ }
+ else
+ {
+ Debug.Console(0, "Cannot create DM device '{0}'. '{1}' is not a DM Chassis or DMPS.",
+ key, pKey);
+ return null;
+ }
}
private static CrestronGenericBaseDevice GetDmRmcControllerForCpu2Chassis(string key, string name, string typeName,
@@ -489,8 +522,7 @@ namespace PepperDash.Essentials.DM
var props = JsonConvert.DeserializeObject
(dc.Properties.ToString());
- return DmRmcHelper.GetDmRmcController(dc.Key, dc.Name, type, props);
-
+ return DmRmcHelper.GetDmRmcController(dc.Key, dc.Name, type, props);
}
}
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 c638ecb6..fe4454b9 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx200Controller.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx200Controller.cs
@@ -97,10 +97,11 @@ namespace PepperDash.Essentials.DM
///
///
///
- public DmTx200Controller(string key, string name, DmTx200C2G tx)
+ public DmTx200Controller(string key, string name, DmTx200C2G tx, bool preventRegistration)
: base(key, name, tx)
{
Tx = tx;
+ PreventRegistration = preventRegistration;
HdmiInput = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn,
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi,
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 623391dc..660d2fec 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx201CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx201CController.cs
@@ -99,11 +99,12 @@ namespace PepperDash.Essentials.DM
///
///
///
- ///
- public DmTx201CController(string key, string name, DmTx201C tx)
+ ///
+ public DmTx201CController(string key, string name, DmTx201C tx, bool preventRegistration)
: base(key, name, tx)
{
Tx = tx;
+ PreventRegistration = preventRegistration;
HdmiInput = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn,
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi,
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 7c4b0d34..e42ecb4b 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx201SController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx201SController.cs
@@ -102,10 +102,11 @@ namespace PepperDash.Essentials.DM
///
///
///
- public DmTx201SController(string key, string name, DmTx201S tx)
+ public DmTx201SController(string key, string name, DmTx201S tx, bool preventRegistration)
: base(key, name, tx)
{
Tx = tx;
+ PreventRegistration = preventRegistration;
HdmiInput = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn,
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi,
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 1407b70e..ae4e2c31 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx401CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx401CController.cs
@@ -111,10 +111,11 @@ namespace PepperDash.Essentials.DM
///
///
///
- public DmTx401CController(string key, string name, DmTx401C tx)
+ public DmTx401CController(string key, string name, DmTx401C tx, bool preventRegistration)
: base(key, name, tx)
{
Tx = tx;
+ PreventRegistration = preventRegistration;
HdmiIn = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn,
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.HDMI, this,
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 d2a9f7bc..5bbf5fd5 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k100Controller.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k100Controller.cs
@@ -6,6 +6,7 @@ using Crestron.SimplSharpPro.DM.Endpoints.Transmitters;
using PepperDash.Core;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Bridges;
+using Newtonsoft.Json;
namespace PepperDash.Essentials.DM
{
@@ -20,14 +21,6 @@ namespace PepperDash.Essentials.DM
public RoutingInputPort HdmiIn { get; private set; }
public RoutingOutputPort DmOut { get; private 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 override IntFeedback HdcpSupportAllFeedback { get; protected set; }
- //public override ushort HdcpSupportCapability { get; protected set; }
-
///
/// Helps get the "real" inputs, including when in Auto
///
@@ -70,11 +63,34 @@ namespace PepperDash.Essentials.DM
HdmiIn.Port = Tx;
PreventRegistration = true;
+
+ var parentDev = DeviceManager.GetDeviceForKey(key);
+ var num = tx.DMInputOutput.Number;
+ if (parentDev is DmpsRoutingController)
+ {
+ var dmps = parentDev as DmpsRoutingController;
+ IsOnline.SetValueFunc(() => dmps.InputEndpointOnlineFeedbacks[num].BoolValue);
+ dmps.InputEndpointOnlineFeedbacks[num].OutputChange += (o, a) => IsOnline.FireUpdate();
+ }
+ else if (parentDev is DmChassisController)
+ {
+ var controller = parentDev as DmChassisController;
+ IsOnline.SetValueFunc(() => controller.InputEndpointOnlineFeedbacks[num].BoolValue);
+ controller.InputEndpointOnlineFeedbacks[num].OutputChange += (o, a) => IsOnline.FireUpdate();
+ }
}
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{
- Debug.Console(1, this, "No properties to link. Skipping device {0}", Name);
+ var joinMap = new HDBaseTTxControllerJoinMap(joinStart);
+
+ var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
+
+ if (!string.IsNullOrEmpty(joinMapSerialized))
+ joinMap = JsonConvert.DeserializeObject(joinMapSerialized);
+
+ this.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
+ trilist.StringInput[joinMap.Name.JoinNumber].StringValue = this.Name;
}
#region IIROutputPorts Members
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 729744b9..387562e4 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k202CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k202CController.cs
@@ -96,10 +96,11 @@ namespace PepperDash.Essentials.DM
}
}
- public DmTx4k202CController(string key, string name, DmTx4k202C tx)
+ public DmTx4k202CController(string key, string name, DmTx4k202C tx, bool preventRegistration)
: base(key, name, tx)
{
Tx = tx;
+ PreventRegistration = preventRegistration;
HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
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 3e716f60..87906735 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k302CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4k302CController.cs
@@ -101,11 +101,12 @@ namespace PepperDash.Essentials.DM
{
return new RoutingPortCollection { DmOut, HdmiLoopOut };
}
- }
- public DmTx4k302CController(string key, string name, DmTx4k302C tx)
+ }
+ public DmTx4k302CController(string key, string name, DmTx4k302C tx, bool preventRegistration)
: base(key, name, tx)
{
- Tx = tx;
+ Tx = tx;
+ PreventRegistration = preventRegistration;
HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4kz202CController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4kz202CController.cs
index a241d60d..b9f521c6 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4kz202CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4kz202CController.cs
@@ -86,10 +86,11 @@ namespace PepperDash.Essentials.DM
return new RoutingPortCollection { DmOut, HdmiLoopOut };
}
}
- public DmTx4kz202CController(string key, string name, DmTx4kz202C tx)
+ public DmTx4kz202CController(string key, string name, DmTx4kz202C tx, bool preventRegistration)
: base(key, name, tx)
{
Tx = tx;
+ PreventRegistration = preventRegistration;
HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
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 70df8259..de60d80e 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4kz302CController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTx4kz302CController.cs
@@ -91,10 +91,11 @@ namespace PepperDash.Essentials.DM
return new RoutingPortCollection { DmOut, HdmiLoopOut };
}
}
- public DmTx4kz302CController(string key, string name, DmTx4kz302C tx)
+ public DmTx4kz302CController(string key, string name, DmTx4kz302C tx, bool preventRegistration)
: base(key, name, tx)
{
Tx = tx;
+ PreventRegistration = preventRegistration;
HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
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 5eb2d7b5..d707ebd3 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTxHelpers.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/DmTxHelpers.cs
@@ -20,6 +20,63 @@ namespace PepperDash.Essentials.DM
{
public class DmTxHelper
{
+
+ public static BasicDmTxControllerBase GetDmTxForChassisWithoutIpId(string key, string name, string typeName, DMInput dmInput)
+ {
+ if (typeName.StartsWith("dmtx200"))
+ return new DmTx200Controller(key, name, new DmTx200C2G(dmInput), true);
+ if (typeName.StartsWith("dmtx201c"))
+ return new DmTx201CController(key, name, new DmTx201C(dmInput), true);
+ if (typeName.StartsWith("dmtx201s"))
+ return new DmTx201SController(key, name, new DmTx201S(dmInput), true);
+ if (typeName.StartsWith("dmtx4k100"))
+ return new DmTx4k100Controller(key, name, new DmTx4K100C1G(dmInput));
+ if (typeName.StartsWith("dmtx4kz100"))
+ return new DmTx4kz100Controller(key, name, new DmTx4kz100C1G(dmInput));
+ if (typeName.StartsWith("dmtx4k202"))
+ return new DmTx4k202CController(key, name, new DmTx4k202C(dmInput), true);
+ if (typeName.StartsWith("dmtx4kz202"))
+ return new DmTx4kz202CController(key, name, new DmTx4kz202C(dmInput), true);
+ if (typeName.StartsWith("dmtx4k302"))
+ return new DmTx4k302CController(key, name, new DmTx4k302C(dmInput), true);
+ if (typeName.StartsWith("dmtx4kz302"))
+ return new DmTx4kz302CController(key, name, new DmTx4kz302C(dmInput), true);
+ if (typeName.StartsWith("dmtx401"))
+ return new DmTx401CController(key, name, new DmTx401C(dmInput), true);
+ if (typeName.StartsWith("hdbasettx"))
+ new HDBaseTTxController(key, name, new HDTx3CB(dmInput));
+
+ return null;
+ }
+
+ public static BasicDmTxControllerBase GetDmTxForChassisWithIpId(string key, string name, string typeName, uint ipid, DMInput dmInput)
+ {
+ if (typeName.StartsWith("dmtx200"))
+ return new DmTx200Controller(key, name, new DmTx200C2G(ipid, dmInput), true);
+ if (typeName.StartsWith("dmtx201c"))
+ return new DmTx201CController(key, name, new DmTx201C(ipid, dmInput), true);
+ if (typeName.StartsWith("dmtx201s"))
+ return new DmTx201SController(key, name, new DmTx201S(ipid, dmInput), true);
+ if (typeName.StartsWith("dmtx4k100"))
+ return new DmTx4k100Controller(key, name, new DmTx4K100C1G(ipid, dmInput));
+ if (typeName.StartsWith("dmtx4kz100"))
+ return new DmTx4kz100Controller(key, name, new DmTx4kz100C1G(ipid, dmInput));
+ if (typeName.StartsWith("dmtx4k202"))
+ return new DmTx4k202CController(key, name, new DmTx4k202C(ipid, dmInput), true);
+ if (typeName.StartsWith("dmtx4kz202"))
+ return new DmTx4kz202CController(key, name, new DmTx4kz202C(ipid, dmInput), true);
+ if (typeName.StartsWith("dmtx4k302"))
+ return new DmTx4k302CController(key, name, new DmTx4k302C(ipid, dmInput), true);
+ if (typeName.StartsWith("dmtx4kz302"))
+ return new DmTx4kz302CController(key, name, new DmTx4kz302C(ipid, dmInput), true);
+ if (typeName.StartsWith("dmtx401"))
+ return new DmTx401CController(key, name, new DmTx401C(ipid, dmInput), true);
+ if (typeName.StartsWith("hdbasettx"))
+ return new HDBaseTTxController(key, name, new HDTx3CB(ipid, dmInput));
+
+ return null;
+ }
+
///
/// A factory method for various DmTxControllers
///
@@ -27,7 +84,7 @@ namespace PepperDash.Essentials.DM
///
///
///
- public static BasicDmTxControllerBase GetDmTxController(string key, string name, string typeName, DmTxPropertiesConfig props)
+ public static BasicDmTxControllerBase GetDmTxController(string key, string name, string typeName, DmTxPropertiesConfig props)
{
// switch on type name... later...
@@ -42,23 +99,21 @@ namespace PepperDash.Essentials.DM
try
{
if(typeName.StartsWith("dmtx200"))
- return new DmTx200Controller(key, name, new DmTx200C2G(ipid, Global.ControlSystem));
- if (typeName.StartsWith("dmtx4kz100"))
- return new DmTx4kz100Controller(key, name, new DmTx4kz100C1G(ipid, Global.ControlSystem));
+ return new DmTx200Controller(key, name, new DmTx200C2G(ipid, Global.ControlSystem), false);
if (typeName.StartsWith("dmtx201c"))
- return new DmTx201CController(key, name, new DmTx201C(ipid, Global.ControlSystem));
+ return new DmTx201CController(key, name, new DmTx201C(ipid, Global.ControlSystem), false);
if (typeName.StartsWith("dmtx201s"))
- return new DmTx201SController(key, name, new DmTx201S(ipid, Global.ControlSystem));
+ return new DmTx201SController(key, name, new DmTx201S(ipid, Global.ControlSystem), false);
if (typeName.StartsWith("dmtx4k202"))
- return new DmTx4k202CController(key, name, new DmTx4k202C(ipid, Global.ControlSystem));
+ return new DmTx4k202CController(key, name, new DmTx4k202C(ipid, Global.ControlSystem), false);
if (typeName.StartsWith("dmtx4kz202"))
- return new DmTx4kz202CController(key, name, new DmTx4kz202C(ipid, Global.ControlSystem));
+ return new DmTx4kz202CController(key, name, new DmTx4kz202C(ipid, Global.ControlSystem), false);
if (typeName.StartsWith("dmtx4k302"))
- return new DmTx4k302CController(key, name, new DmTx4k302C(ipid, Global.ControlSystem));
+ return new DmTx4k302CController(key, name, new DmTx4k302C(ipid, Global.ControlSystem), false);
if (typeName.StartsWith("dmtx4kz302"))
- return new DmTx4kz302CController(key, name, new DmTx4kz302C(ipid, Global.ControlSystem));
+ return new DmTx4kz302CController(key, name, new DmTx4kz302C(ipid, Global.ControlSystem), false);
if (typeName.StartsWith("dmtx401"))
- return new DmTx401CController(key, name, new DmTx401C(ipid, Global.ControlSystem));
+ return new DmTx401CController(key, name, new DmTx401C(ipid, Global.ControlSystem), false);
Debug.Console(0, "{1} WARNING: Cannot create DM-TX of type: '{0}'", typeName, key);
}
catch (Exception e)
@@ -70,12 +125,12 @@ namespace PepperDash.Essentials.DM
var parentDev = DeviceManager.GetDeviceForKey(pKey);
DMInput dmInput;
- bool isCpu3 = false;
+ BasicDmTxControllerBase tx;
- if (parentDev is IDmSwitch)
+ if (parentDev is DmChassisController)
{
// Get the Crestron chassis and link stuff up
- var switchDev = (parentDev as IDmSwitch);
+ var switchDev = (parentDev as DmChassisController);
var chassis = switchDev.Chassis;
//Check that the input is within range of this chassis' possible inputs
@@ -90,15 +145,31 @@ namespace PepperDash.Essentials.DM
switchDev.TxDictionary.Add(num, key);
dmInput = chassis.Inputs[num];
- //Determine if IpId is needed for this chassis type
- if (chassis is DmMd8x8Cpu3 || chassis is DmMd16x16Cpu3 ||
- chassis is DmMd32x32Cpu3 || chassis is DmMd8x8Cpu3rps ||
- chassis is DmMd16x16Cpu3rps || chassis is DmMd32x32Cpu3rps ||
- chassis is DmMd128x128 || chassis is DmMd64x64)
- {
- isCpu3 = true;
- }
+ try
+ {
+ //Determine if IpId is needed for this chassis type
+ if (chassis is DmMd8x8Cpu3 || chassis is DmMd16x16Cpu3 ||
+ chassis is DmMd32x32Cpu3 || chassis is DmMd8x8Cpu3rps ||
+ chassis is DmMd16x16Cpu3rps || chassis is DmMd32x32Cpu3rps ||
+ chassis is DmMd128x128 || chassis is DmMd64x64)
+ {
+ tx = GetDmTxForChassisWithoutIpId(key, name, typeName, dmInput);
+ Debug.Console(0, "DM endpoint output {0} is for Cpu3, changing online feedback to chassis", num);
+ tx.IsOnline.SetValueFunc(() => switchDev.InputEndpointOnlineFeedbacks[num].BoolValue);
+ switchDev.InputEndpointOnlineFeedbacks[num].OutputChange += (o, a) => tx.IsOnline.FireUpdate();
+ return tx;
+ }
+ else
+ {
+ return GetDmTxForChassisWithIpId(key, name, typeName, ipid, dmInput);
+ }
+ }
+ catch (Exception e)
+ {
+ Debug.Console(0, "[{0}] WARNING: Cannot create DM-TX device for chassis: {1}", key, e);
+ return null;
+ }
}
else if(parentDev is DmpsRoutingController)
{
@@ -126,6 +197,27 @@ namespace PepperDash.Essentials.DM
Debug.Console(0, "Cannot create DMPS device '{0}'. Input number '{1}' is not a DM input", key, num);
return null;
}
+
+ try
+ {
+ if(Global.ControlSystemIsDmps4kType)
+ {
+ tx = GetDmTxForChassisWithoutIpId(key, name, typeName, dmInput);
+ Debug.Console(0, "DM endpoint output {0} is for DMPS3-4K, changing online feedback to chassis", num);
+ tx.IsOnline.SetValueFunc(() => dmpsDev.InputEndpointOnlineFeedbacks[num].BoolValue);
+ dmpsDev.InputEndpointOnlineFeedbacks[num].OutputChange += (o, a) => tx.IsOnline.FireUpdate();
+ return tx;
+ }
+ else
+ {
+ return GetDmTxForChassisWithIpId(key, name, typeName, ipid, dmInput);
+ }
+ }
+ catch (Exception e)
+ {
+ Debug.Console(0, "[{0}] WARNING: Cannot create DM-TX device for dmps: {1}", key, e);
+ return null;
+ }
}
else
@@ -133,67 +225,6 @@ namespace PepperDash.Essentials.DM
Debug.Console(0, "Cannot create DM device '{0}'. '{1}' is not a processor, DM Chassis or DMPS.", key, pKey);
return null;
}
-
- try
- {
- // Must use different constructor for CPU3 or DMPS3-4K types. No IPID
- if (isCpu3 || Global.ControlSystemIsDmps4kType)
- {
- if (typeName.StartsWith("dmtx200"))
- return new DmTx200Controller(key, name, new DmTx200C2G(dmInput));
- if (typeName.StartsWith("dmtx201c"))
- return new DmTx201CController(key, name, new DmTx201C(dmInput));
- if (typeName.StartsWith("dmtx201s"))
- return new DmTx201SController(key, name, new DmTx201S(dmInput));
- if (typeName.StartsWith("dmtx4k100"))
- return new DmTx4k100Controller(key, name, new DmTx4K100C1G(dmInput));
- if (typeName.StartsWith("dmtx4kz100"))
- return new DmTx4kz100Controller(key, name, new DmTx4kz100C1G(dmInput));
- if (typeName.StartsWith("dmtx4k202"))
- return new DmTx4k202CController(key, name, new DmTx4k202C(dmInput));
- if (typeName.StartsWith("dmtx4kz202"))
- return new DmTx4kz202CController(key, name, new DmTx4kz202C(dmInput));
- if (typeName.StartsWith("dmtx4k302"))
- return new DmTx4k302CController(key, name, new DmTx4k302C(dmInput));
- if (typeName.StartsWith("dmtx4kz302"))
- return new DmTx4kz302CController(key, name, new DmTx4kz302C(dmInput));
- if (typeName.StartsWith("dmtx401"))
- return new DmTx401CController(key, name, new DmTx401C(dmInput));
- if (typeName.StartsWith("hdbasettx"))
- return new HDBaseTTxController(key, name, new HDTx3CB(dmInput));
- }
- else
- {
- if (typeName.StartsWith("dmtx200"))
- return new DmTx200Controller(key, name, new DmTx200C2G(ipid, dmInput));
- if (typeName.StartsWith("dmtx201c"))
- return new DmTx201CController(key, name, new DmTx201C(ipid, dmInput));
- if (typeName.StartsWith("dmtx201s"))
- return new DmTx201SController(key, name, new DmTx201S(ipid, dmInput));
- if (typeName.StartsWith("dmtx4k100"))
- return new DmTx4k100Controller(key, name, new DmTx4K100C1G(ipid, dmInput));
- if (typeName.StartsWith("dmtx4kz100"))
- return new DmTx4kz100Controller(key, name, new DmTx4kz100C1G(ipid, dmInput));
- if (typeName.StartsWith("dmtx4k202"))
- return new DmTx4k202CController(key, name, new DmTx4k202C(ipid, dmInput));
- if (typeName.StartsWith("dmtx4kz202"))
- return new DmTx4kz202CController(key, name, new DmTx4kz202C(ipid, dmInput));
- if (typeName.StartsWith("dmtx4k302"))
- return new DmTx4k302CController(key, name, new DmTx4k302C(ipid, dmInput));
- if (typeName.StartsWith("dmtx4kz302"))
- return new DmTx4kz302CController(key, name, new DmTx4kz302C(ipid, dmInput));
- if (typeName.StartsWith("dmtx401"))
- return new DmTx401CController(key, name, new DmTx401C(ipid, dmInput));
- if (typeName.StartsWith("hdbasettx"))
- return new HDBaseTTxController(key, name, new HDTx3CB(ipid, dmInput));
- }
- }
- catch (Exception e)
- {
- Debug.Console(0, "[{0}] WARNING: Cannot create DM-TX device: {1}", key, e);
- }
-
- return null;
}
}
@@ -221,13 +252,16 @@ namespace PepperDash.Essentials.DM
protected DmTxControllerBase(string key, string name, EndpointTransmitterBase hardware)
: base(key, name, hardware)
{
- // if wired to a chassis or DMPS, skip registration step in base class
- if (hardware.DMInput != null || (Global.ControlSystemIsDmpsType && hardware.DMInput != null))
- {
- this.PreventRegistration = true;
- }
-
AddToFeedbackList(ActiveVideoInputFeedback);
+
+ IsOnline.OutputChange += (currentDevice, args) =>
+ {
+ foreach (var feedback in Feedbacks)
+ {
+ if (feedback != null)
+ feedback.FireUpdate();
+ }
+ };
}
protected DmTxControllerBase(string key, string name, DmHDBasedTEndPoint hardware) : base(key, name, hardware)
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/HDBaseTTxController.cs b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/HDBaseTTxController.cs
index 800da2a9..bedf1aad 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/HDBaseTTxController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Endpoints/Transmitters/HDBaseTTxController.cs
@@ -6,6 +6,7 @@ using Crestron.SimplSharp;
using Crestron.SimplSharpPro;
using Crestron.SimplSharpPro.DeviceSupport;
using Crestron.SimplSharpPro.DM.Endpoints.Transmitters;
+using Crestron.SimplSharpPro.DM;
using Newtonsoft.Json;
using PepperDash.Core;
@@ -18,7 +19,7 @@ namespace PepperDash.Essentials.DM
/// Controller class for suitable for HDBaseT transmitters
///
[Description("Wrapper Class for HDBaseT devices based on HDTx3CB class")]
- public class HDBaseTTxController: BasicDmTxControllerBase, IRoutingInputsOutputs, IComPorts
+ public class HDBaseTTxController : BasicDmTxControllerBase, IRoutingInputsOutputs, IComPorts
{
public RoutingInputPort HdmiIn { get; private set; }
public RoutingOutputPort DmOut { get; private set; }
@@ -26,6 +27,8 @@ namespace PepperDash.Essentials.DM
public HDBaseTTxController(string key, string name, HDTx3CB tx)
: base(key, name, tx)
{
+ PreventRegistration = true;
+
HdmiIn = new RoutingInputPort(DmPortName.HdmiIn1, eRoutingSignalType.Audio | eRoutingSignalType.Video,
eRoutingPortConnectionType.Hdmi, null, this) { Port = tx };
@@ -34,6 +37,21 @@ namespace PepperDash.Essentials.DM
InputPorts = new RoutingPortCollection { HdmiIn };
OutputPorts = new RoutingPortCollection { DmOut };
+
+ var parentDev = DeviceManager.GetDeviceForKey(key);
+ var num = tx.DMInputOutput.Number;
+ if (parentDev is DmpsRoutingController)
+ {
+ var dmps = parentDev as DmpsRoutingController;
+ IsOnline.SetValueFunc(() => dmps.InputEndpointOnlineFeedbacks[num].BoolValue);
+ dmps.InputEndpointOnlineFeedbacks[num].OutputChange += (o, a) => IsOnline.FireUpdate();
+ }
+ else if (parentDev is DmChassisController)
+ {
+ var controller = parentDev as DmChassisController;
+ IsOnline.SetValueFunc(() => controller.InputEndpointOnlineFeedbacks[num].BoolValue);
+ controller.InputEndpointOnlineFeedbacks[num].OutputChange += (o, a) => IsOnline.FireUpdate();
+ }
}
#region IRoutingInputs Members
@@ -79,7 +97,7 @@ namespace PepperDash.Essentials.DM
Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
this.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
-
+ trilist.StringInput[joinMap.Name.JoinNumber].StringValue = this.Name;
}
#endregion
@@ -100,6 +118,10 @@ namespace PepperDash.Essentials.DM
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Digital
});
+
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM Tx Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
///
/// Plugin device BridgeJoinMap constructor
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 cef61b1a..41b07237 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/PepperDash_Essentials_DM.csproj
+++ b/essentials-framework/Essentials DM/Essentials_DM/PepperDash_Essentials_DM.csproj
@@ -93,6 +93,7 @@
+
@@ -100,6 +101,7 @@
+
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Codec/iHasDirectory.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Codec/iHasDirectory.cs
index 57dbbd6b..93eda176 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Codec/iHasDirectory.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Codec/iHasDirectory.cs
@@ -49,6 +49,7 @@ namespace PepperDash.Essentials.Devices.Common.Codec
Stack DirectoryBrowseHistoryStack { get; }
}
+
///
///
///
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Codec/iHasScheduleAwareness.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Codec/iHasScheduleAwareness.cs
index 06edf7bf..9169fd7c 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Codec/iHasScheduleAwareness.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Codec/iHasScheduleAwareness.cs
@@ -211,7 +211,7 @@ namespace PepperDash.Essentials.Devices.Common.Codec
get
{
var joinable = StartTime.AddMinutes(-MinutesBeforeMeeting) <= DateTime.Now
- && DateTime.Now <= EndTime.AddMinutes(-5);
+ && DateTime.Now <= EndTime.AddSeconds(-_joinableCooldownSeconds);
//Debug.Console(2, "Meeting Id: {0} joinable: {1}", Id, joinable);
return joinable;
}
@@ -231,11 +231,23 @@ namespace PepperDash.Essentials.Devices.Common.Codec
[JsonIgnore]
public eMeetingEventChangeType NotifiedChangeTypes { get; set; }
+ [JsonIgnore] private readonly int _joinableCooldownSeconds;
+
+
public Meeting()
{
Calls = new List();
+ _joinableCooldownSeconds = 300;
}
+ public Meeting(int joinableCooldownSeconds)
+ {
+ Calls = new List();
+ _joinableCooldownSeconds = joinableCooldownSeconds;
+ }
+
+
+
#region Overrides of Object
public override string ToString()
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/NECPSXMDisplay.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/NECPSXMDisplay.cs
index 176f28ac..a674b11a 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/NECPSXMDisplay.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/NECPSXMDisplay.cs
@@ -308,7 +308,7 @@ namespace PepperDash.Essentials.Devices.Displays
//Send((string)selector);
}
- void SetVolume(ushort level)
+ public void SetVolume(ushort level)
{
var levelString = string.Format("{0}{1:X4}\x03", VolumeLevelPartialCmd, level);
AppendChecksumAndSend(levelString);
@@ -333,10 +333,13 @@ namespace PepperDash.Essentials.Devices.Displays
Send(MuteOnCmd);
}
- void IBasicVolumeWithFeedback.SetVolume(ushort level)
+
+ /*
+ public void IBasicVolumeWithFeedback.SetVolume(ushort level)
{
SetVolume(level);
}
+ */
#endregion
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/PanasonicThDisplay.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/PanasonicThDisplay.cs
index b8d33bd1..9acc395e 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/PanasonicThDisplay.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/PanasonicThDisplay.cs
@@ -290,7 +290,7 @@ namespace PepperDash.Essentials.Devices.Displays
//Send((string)selector);
}
- void SetVolume(ushort level)
+ public void SetVolume(ushort level)
{
var levelString = string.Format("{0}{1:X3}\x03", VolumeLevelPartialCmd, level);
@@ -315,11 +315,12 @@ namespace PepperDash.Essentials.Devices.Displays
Send(MuteOnCmd);
}
+ /*
void IBasicVolumeWithFeedback.SetVolume(ushort level)
{
SetVolume(level);
}
-
+ */
#endregion
#region IBasicVolumeControls Members
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 c2782532..a1cc37f2 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
@@ -108,6 +108,7 @@
+
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/BookingsDataClasses.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/BookingsDataClasses.cs
index cf4d8530..59823bb9 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/BookingsDataClasses.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/BookingsDataClasses.cs
@@ -377,5 +377,70 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
return meetings;
}
+
+ public static List GetGenericMeetingsFromBookingResult(List bookings, int joinableCooldownSeconds)
+ {
+ var meetings = new List();
+
+ if (Debug.Level > 0)
+ {
+ Debug.Console(1, "Meetings List:\n");
+ }
+
+ foreach (Booking b in bookings)
+ {
+ var meeting = new Meeting(joinableCooldownSeconds);
+
+ if (b.Id != null)
+ meeting.Id = b.Id.Value;
+ if (b.Organizer != null)
+ meeting.Organizer = string.Format("{0}, {1}", b.Organizer.LastName.Value, b.Organizer.FirstName.Value);
+ if (b.Title != null)
+ meeting.Title = b.Title.Value;
+ if (b.Agenda != null)
+ meeting.Agenda = b.Agenda.Value;
+ if (b.Time != null)
+ {
+ meeting.StartTime = b.Time.StartTime.Value;
+ meeting.EndTime = b.Time.EndTime.Value;
+ }
+ if (b.Privacy != null)
+ meeting.Privacy = CodecCallPrivacy.ConvertToDirectionEnum(b.Privacy.Value);
+
+ //#warning Update this ConnectMode conversion after testing onsite. Expected value is "OBTP", but in PD NYC Test scenarios, "Manual" is being returned for OBTP meetings
+ if (b.DialInfo.ConnectMode != null)
+ if (b.DialInfo.ConnectMode.Value.ToLower() == "obtp" || b.DialInfo.ConnectMode.Value.ToLower() == "manual")
+ meeting.IsOneButtonToPushMeeting = true;
+
+ if (b.DialInfo.Calls.Call != null)
+ {
+ foreach (Call c in b.DialInfo.Calls.Call)
+ {
+ meeting.Calls.Add(new PepperDash.Essentials.Devices.Common.Codec.Call()
+ {
+ Number = c.Number.Value,
+ Protocol = c.Protocol.Value,
+ CallRate = c.CallRate.Value,
+ CallType = c.CallType.Value
+ });
+ }
+ }
+
+
+ meetings.Add(meeting);
+
+ if (Debug.Level > 0)
+ {
+ Debug.Console(1, "Title: {0}, ID: {1}, Organizer: {2}, Agenda: {3}", meeting.Title, meeting.Id, meeting.Organizer, meeting.Agenda);
+ Debug.Console(1, " Start Time: {0}, End Time: {1}, Duration: {2}", meeting.StartTime, meeting.EndTime, meeting.Duration);
+ Debug.Console(1, " Joinable: {0}\n", meeting.Joinable);
+ }
+ }
+
+ meetings.OrderBy(m => m.StartTime);
+
+ return meetings;
+ }
+
}
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs
index c9e584d3..7dcf40bb 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs
@@ -24,7 +24,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
{
enum eCommandType { SessionStart, SessionEnd, Command, GetStatus, GetConfiguration };
public enum eExternalSourceType {camera, desktop, document_camera, mediaplayer, PC, whiteboard, other}
- public enum eExternalSourceMode {Ready, NotReady, Hidden, Error}
+ public enum eExternalSourceMode {Ready, NotReady, Hidden, Error}
public class CiscoSparkCodec : VideoCodecBase, IHasCallHistory, IHasCallFavorites, IHasDirectory,
IHasScheduleAwareness, IOccupancyStatusProvider, IHasCodecLayouts, IHasCodecSelfView,
@@ -1023,18 +1023,21 @@ ConnectorID: {2}"
if (tempPresets.Count > 0)
{
// Create temporary list to store the existing items from the CiscoCodecStatus.RoomPreset collection
- List existingRoomPresets = new List();
+ var existingRoomPresets = new List();
// Add the existing items to the temporary list
existingRoomPresets.AddRange(CodecStatus.Status.RoomPreset);
// Populate the CodecStatus object (this will append new values to the RoomPreset collection
JsonConvert.PopulateObject(response, CodecStatus);
- JObject jResponse = JObject.Parse(response);
+ var jResponse = JObject.Parse(response);
+
IList roomPresets = jResponse["Status"]["RoomPreset"].Children().ToList();
// Iterate the new items in this response agains the temporary list. Overwrite any existing items and add new ones.
- foreach (var preset in tempPresets)
+ foreach (var camPreset in tempPresets)
{
+ var preset = camPreset as CiscoCodecStatus.RoomPreset;
+ if (preset == null) continue;
// First fine the existing preset that matches the id
var existingPreset = existingRoomPresets.FirstOrDefault(p => p.id.Equals(preset.id));
if (existingPreset != null)
@@ -1068,7 +1071,7 @@ ConnectorID: {2}"
CodecStatus.Status.RoomPreset = existingRoomPresets;
// Generecise the list
- NearEndPresets = RoomPresets.GetGenericPresets(CodecStatus.Status.RoomPreset);
+ NearEndPresets = existingRoomPresets.GetGenericPresets();
var handler = CodecRoomPresetsListHasChanged;
if (handler != null)
@@ -2465,20 +2468,6 @@ ConnectorID: {2}"
}
- ///
- /// Represents a codec command that might need to have a friendly label applied for UI feedback purposes
- ///
- public class CodecCommandWithLabel
- {
- public string Command { get; set; }
- public string Label { get; set; }
-
- public CodecCommandWithLabel(string command, string label)
- {
- Command = command;
- Label = label;
- }
- }
///
/// Tracks the initial sycnronization state of the codec when making a connection
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/RoomPresets.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/RoomPresets.cs
index b6327d52..8fc8a1d0 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/RoomPresets.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/RoomPresets.cs
@@ -1,14 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-
-using Newtonsoft.Json;
using PepperDash.Core;
using PepperDash.Essentials.Core.Presets;
-using PepperDash.Essentials.Devices.Common.VideoCodec.Cisco;
namespace PepperDash.Essentials.Devices.Common.VideoCodec
{
@@ -33,39 +28,17 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
public static class RoomPresets
{
///
- /// Converts Cisco RoomPresets to generic CameraPresets
+ /// Converts non-generic RoomPresets to generic CameraPresets
///
///
///
- public static List GetGenericPresets(List presets)
+ public static List GetGenericPresets(this List presets) where TSource : ConvertiblePreset where TDestination : PresetBase
{
- var cameraPresets = new List();
-
- if (Debug.Level > 0)
- {
- Debug.Console(1, "Presets List:");
- }
-
- foreach (CiscoCodecStatus.RoomPreset preset in presets)
- {
- try
- {
- var cameraPreset = new CodecRoomPreset(UInt16.Parse(preset.id), preset.Description.Value, preset.Defined.BoolValue, true);
-
- cameraPresets.Add(cameraPreset);
-
- if (Debug.Level > 0)
- {
- Debug.Console(1, "Added Preset ID: {0}, Description: {1}, IsDefined: {2}, isDefinable: {3}", cameraPreset.ID, cameraPreset.Description, cameraPreset.Defined, cameraPreset.IsDefinable);
- }
- }
- catch (Exception e)
- {
- Debug.Console(2, "Unable to convert preset: {0}. Error: {1}", preset.id, e);
- }
- }
-
- return cameraPresets;
+ return
+ presets.Select(preset => preset.ConvertCodecPreset())
+ .Where(newPreset => newPreset != null)
+ .Cast()
+ .ToList();
}
}
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/xStatus.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/xStatus.cs
index 5bde30ff..2d8e903a 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/xStatus.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/xStatus.cs
@@ -9,6 +9,7 @@ using Newtonsoft.Json.Linq;
using PepperDash.Core;
using PepperDash.Essentials.Devices.Common.VideoCodec.CiscoCodec;
+using PepperDash.Essentials.Core.Presets;
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
{
@@ -2185,7 +2186,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
}
}
- public class RoomPreset
+ public class RoomPreset : ConvertiblePreset
{
public string id { get; set; }
public Defined Defined { get; set; }
@@ -2198,7 +2199,24 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
Description = new Description2();
Type = new Type5();
}
- }
+
+ public override PresetBase ConvertCodecPreset()
+ {
+ try
+ {
+ var preset = new CodecRoomPreset(UInt16.Parse(id), Description.Value, Defined.BoolValue, true);
+
+ Debug.Console(2, "Preset ID {0} Converted from Cisco Codec Preset to Essentials Preset");
+
+ return preset;
+ }
+ catch (Exception e)
+ {
+ Debug.Console(2, "Unable to convert preset: {0}. Error: {1}", id, e);
+ return null;
+ }
+ }
+}
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ConvertiblePreset.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ConvertiblePreset.cs
new file mode 100644
index 00000000..4c01d94e
--- /dev/null
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ConvertiblePreset.cs
@@ -0,0 +1,9 @@
+using PepperDash.Essentials.Core.Presets;
+
+namespace PepperDash.Essentials.Devices.Common.VideoCodec
+{
+ public abstract class ConvertiblePreset
+ {
+ public abstract PresetBase ConvertCodecPreset();
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasCodecLayouts.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasCodecLayouts.cs
index ef0bf2bd..44a482e1 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasCodecLayouts.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasCodecLayouts.cs
@@ -22,6 +22,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
void MinMaxLayoutToggle();
}
+
///
/// Defines the requirements for Zoom Room layout control
///
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasSelfviewPosition.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasSelfviewPosition.cs
index 5360b80a..d0ba25fd 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasSelfviewPosition.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasSelfviewPosition.cs
@@ -1,5 +1,5 @@
using PepperDash.Essentials.Core;
-using PepperDash.Essentials.Devices.Common.VideoCodec.Cisco;
+using PepperDash.Essentials.Devices.Common.VideoCodec;
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
{
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasSelfviewSize.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasSelfviewSize.cs
index 91ac3ec8..4103fa0e 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasSelfviewSize.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasSelfviewSize.cs
@@ -1,4 +1,4 @@
-using PepperDash.Essentials.Devices.Common.VideoCodec.Cisco;
+using PepperDash.Essentials.Devices.Common.VideoCodec;
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
{
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs
index 0626044d..9fae1a99 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs
@@ -11,6 +11,7 @@ using PepperDash.Core;
using PepperDash.Core.Intersystem;
using PepperDash.Core.Intersystem.Tokens;
using PepperDash.Core.WebApi.Presets;
+using Crestron.SimplSharp.Reflection;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Bridges;
using PepperDash.Essentials.Core.Config;
@@ -31,6 +32,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
private const int XSigEncoding = 28591;
protected const int MaxParticipants = 50;
private readonly byte[] _clearBytes = XSigHelpers.ClearOutputs();
+
+ private IHasDirectory _directoryCodec;
+ private BasicTriList _directoryTrilist;
+ private VideoCodecControllerJoinMap _directoryJoinmap;
+
+ protected string _timeFormatSpecifier;
+ protected string _dateFormatSpecifier;
+
+
protected VideoCodecBase(DeviceConfig config)
: base(config)
{
@@ -373,6 +383,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
LinkVideoCodecCameraLayoutsToApi(codec as IHasCodecLayouts, trilist, joinMap);
}
+
if (codec is IHasSelfviewPosition)
{
LinkVideoCodecSelfviewPositionToApi(codec as IHasSelfviewPosition, trilist, joinMap);
@@ -460,10 +471,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}
SharingContentIsOnFeedback.FireUpdate();
-
- trilist.SetBool(joinMap.HookState.JoinNumber, IsInCall);
-
- trilist.SetString(joinMap.CurrentCallData.JoinNumber, UpdateCallStatusXSig());
};
}
@@ -693,37 +700,37 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
{
if (meetingIndex >= maxParticipants * offset) break;
-// Debug.Console(2, this,
-//@"Updating Participant on xsig:
-//Name: {0} (s{9})
-//AudioMute: {1} (d{10})
-//VideoMute: {2} (d{11})
-//CanMuteVideo: {3} (d{12})
-//CanUMuteVideo: {4} (d{13})
-//IsHost: {5} (d{14})
-//HandIsRaised: {6} (d{15})
-//IsPinned: {7} (d{16})
-//ScreenIndexIsPinnedTo: {8} (a{17})
-//",
-// participant.Name,
-// participant.AudioMuteFb,
-// participant.VideoMuteFb,
-// participant.CanMuteVideo,
-// participant.CanUnmuteVideo,
-// participant.IsHost,
-// participant.HandIsRaisedFb,
-// participant.IsPinnedFb,
-// participant.ScreenIndexIsPinnedToFb,
-// stringIndex + 1,
-// digitalIndex + 1,
-// digitalIndex + 2,
-// digitalIndex + 3,
-// digitalIndex + 4,
-// digitalIndex + 5,
-// digitalIndex + 6,
-// digitalIndex + 7,
-// analogIndex + 1
-// );
+ // Debug.Console(2, this,
+ //@"Updating Participant on xsig:
+ //Name: {0} (s{9})
+ //AudioMute: {1} (d{10})
+ //VideoMute: {2} (d{11})
+ //CanMuteVideo: {3} (d{12})
+ //CanUMuteVideo: {4} (d{13})
+ //IsHost: {5} (d{14})
+ //HandIsRaised: {6} (d{15})
+ //IsPinned: {7} (d{16})
+ //ScreenIndexIsPinnedTo: {8} (a{17})
+ //",
+ // participant.Name,
+ // participant.AudioMuteFb,
+ // participant.VideoMuteFb,
+ // participant.CanMuteVideo,
+ // participant.CanUnmuteVideo,
+ // participant.IsHost,
+ // participant.HandIsRaisedFb,
+ // participant.IsPinnedFb,
+ // participant.ScreenIndexIsPinnedToFb,
+ // stringIndex + 1,
+ // digitalIndex + 1,
+ // digitalIndex + 2,
+ // digitalIndex + 3,
+ // digitalIndex + 4,
+ // digitalIndex + 5,
+ // digitalIndex + 6,
+ // digitalIndex + 7,
+ // analogIndex + 1
+ // );
//digitals
@@ -790,10 +797,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
trilist.SetSigFalseAction(joinMap.SourceShareStart.JoinNumber, StartSharing);
trilist.SetSigFalseAction(joinMap.SourceShareEnd.JoinNumber, StopSharing);
- trilist.SetBoolSigAction(joinMap.SourceShareAutoStart.JoinNumber, (b) => AutoShareContentWhileInCall = b);
+ trilist.SetBoolSigAction(joinMap.SourceShareAutoStart.JoinNumber, b => AutoShareContentWhileInCall = b);
}
- private List _currentMeetings = new List();
+ private List _currentMeetings = new List();
private void LinkVideoCodecScheduleToApi(IHasScheduleAwareness codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
{
@@ -801,7 +808,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
trilist.SetUShortSigAction(joinMap.MinutesBeforeMeetingStart.JoinNumber, (i) =>
{
- codec.CodecSchedule.MeetingWarningMinutes = i;
+ codec.CodecSchedule.MeetingWarningMinutes = i;
});
@@ -891,90 +898,90 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
// TODO [ ] hotfix/videocodecbase-max-meeting-xsig-set
public IntFeedback MeetingsToDisplayFeedback { get; set; }
- private string UpdateMeetingsListXSig(List meetings)
- {
+ private string UpdateMeetingsListXSig(List meetings)
+ {
// TODO [ ] hotfix/videocodecbase-max-meeting-xsig-set
//const int _meetingsToDisplay = 3;
- const int maxDigitals = 2;
- const int maxStrings = 7;
- const int offset = maxDigitals + maxStrings;
- var digitalIndex = maxStrings * _meetingsToDisplay; //15
- var stringIndex = 0;
- var meetingIndex = 0;
+ const int maxDigitals = 2;
+ const int maxStrings = 7;
+ const int offset = maxDigitals + maxStrings;
+ var digitalIndex = maxStrings * _meetingsToDisplay; //15
+ var stringIndex = 0;
+ var meetingIndex = 0;
- var tokenArray = new XSigToken[_meetingsToDisplay * offset];
- /*
- * Digitals
- * IsJoinable - 1
- * IsDialable - 2
- *
- * Serials
- * Organizer - 1
- * Title - 2
- * Start Date - 3
- * Start Time - 4
- * End Date - 5
- * End Time - 6
- * Id - 7
- */
+ var tokenArray = new XSigToken[_meetingsToDisplay * offset];
+ /*
+ * Digitals
+ * IsJoinable - 1
+ * IsDialable - 2
+ *
+ * Serials
+ * Organizer - 1
+ * Title - 2
+ * Start Date - 3
+ * Start Time - 4
+ * End Date - 5
+ * End Time - 6
+ * Id - 7
+ */
+
+ foreach (var meeting in meetings)
+ {
+ var currentTime = DateTime.Now;
- foreach (var meeting in meetings)
- {
- var currentTime = DateTime.Now;
+ if (meeting.StartTime < currentTime && meeting.EndTime < currentTime) continue;
- if (meeting.StartTime < currentTime && meeting.EndTime < currentTime) continue;
+ if (meetingIndex >= _meetingsToDisplay * offset)
+ {
+ Debug.Console(2, this, "Max Meetings reached");
+ break;
+ }
- if (meetingIndex >= _meetingsToDisplay * offset)
- {
- Debug.Console(2, this, "Max Meetings reached");
- break;
- }
+ //digitals
+ tokenArray[digitalIndex] = new XSigDigitalToken(digitalIndex + 1, meeting.Joinable);
+ tokenArray[digitalIndex + 1] = new XSigDigitalToken(digitalIndex + 2, meeting.Id != "0");
- //digitals
- tokenArray[digitalIndex] = new XSigDigitalToken(digitalIndex + 1, meeting.Joinable);
- tokenArray[digitalIndex + 1] = new XSigDigitalToken(digitalIndex + 2, meeting.Id != "0");
+ //serials
+ tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, meeting.Organizer);
+ tokenArray[stringIndex + 1] = new XSigSerialToken(stringIndex + 2, meeting.Title);
+ tokenArray[stringIndex + 2] = new XSigSerialToken(stringIndex + 3, meeting.StartTime.ToString(_dateFormatSpecifier.NullIfEmpty() ?? "d", Global.Culture));
+ tokenArray[stringIndex + 3] = new XSigSerialToken(stringIndex + 4, meeting.StartTime.ToString(_timeFormatSpecifier.NullIfEmpty() ?? "t", Global.Culture));
+ tokenArray[stringIndex + 4] = new XSigSerialToken(stringIndex + 5, meeting.EndTime.ToString(_dateFormatSpecifier.NullIfEmpty() ?? "d", Global.Culture));
+ tokenArray[stringIndex + 5] = new XSigSerialToken(stringIndex + 6, meeting.EndTime.ToString(_timeFormatSpecifier.NullIfEmpty() ?? "t", Global.Culture));
+ tokenArray[stringIndex + 6] = new XSigSerialToken(stringIndex + 7, meeting.Id);
- //serials
- tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, meeting.Organizer);
- tokenArray[stringIndex + 1] = new XSigSerialToken(stringIndex + 2, meeting.Title);
- tokenArray[stringIndex + 2] = new XSigSerialToken(stringIndex + 3, meeting.StartTime.ToString("t", Global.Culture));
- tokenArray[stringIndex + 3] = new XSigSerialToken(stringIndex + 4, meeting.StartTime.ToString("t", Global.Culture));
- tokenArray[stringIndex + 4] = new XSigSerialToken(stringIndex + 5, meeting.EndTime.ToString("t", Global.Culture));
- tokenArray[stringIndex + 5] = new XSigSerialToken(stringIndex + 6, meeting.EndTime.ToString("t", Global.Culture));
- tokenArray[stringIndex + 6] = new XSigSerialToken(stringIndex + 7, meeting.Id);
+ digitalIndex += maxDigitals;
+ meetingIndex += offset;
+ stringIndex += maxStrings;
+ }
+ while (meetingIndex < _meetingsToDisplay * offset)
+ {
+ Debug.Console(2, this, "Clearing unused data. Meeting Index: {0} MaxMeetings * Offset: {1}",
+ meetingIndex, _meetingsToDisplay * offset);
- digitalIndex += maxDigitals;
- meetingIndex += offset;
- stringIndex += maxStrings;
- }
+ //digitals
+ tokenArray[digitalIndex] = new XSigDigitalToken(digitalIndex + 1, false);
+ tokenArray[digitalIndex + 1] = new XSigDigitalToken(digitalIndex + 2, false);
- while (meetingIndex < _meetingsToDisplay * offset)
- {
- Debug.Console(2, this, "Clearing unused data. Meeting Index: {0} MaxMeetings * Offset: {1}",
- meetingIndex, _meetingsToDisplay * offset);
+ //serials
+ tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, String.Empty);
+ tokenArray[stringIndex + 1] = new XSigSerialToken(stringIndex + 2, String.Empty);
+ tokenArray[stringIndex + 2] = new XSigSerialToken(stringIndex + 3, String.Empty);
+ tokenArray[stringIndex + 3] = new XSigSerialToken(stringIndex + 4, String.Empty);
+ tokenArray[stringIndex + 4] = new XSigSerialToken(stringIndex + 5, String.Empty);
+ tokenArray[stringIndex + 5] = new XSigSerialToken(stringIndex + 6, String.Empty);
+ tokenArray[stringIndex + 6] = new XSigSerialToken(stringIndex + 7, String.Empty);
- //digitals
- tokenArray[digitalIndex] = new XSigDigitalToken(digitalIndex + 1, false);
- tokenArray[digitalIndex + 1] = new XSigDigitalToken(digitalIndex + 2, false);
+ digitalIndex += maxDigitals;
+ meetingIndex += offset;
+ stringIndex += maxStrings;
+ }
- //serials
- tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, String.Empty);
- tokenArray[stringIndex + 1] = new XSigSerialToken(stringIndex + 2, String.Empty);
- tokenArray[stringIndex + 2] = new XSigSerialToken(stringIndex + 3, String.Empty);
- tokenArray[stringIndex + 3] = new XSigSerialToken(stringIndex + 4, String.Empty);
- tokenArray[stringIndex + 4] = new XSigSerialToken(stringIndex + 5, String.Empty);
- tokenArray[stringIndex + 5] = new XSigSerialToken(stringIndex + 6, String.Empty);
- tokenArray[stringIndex + 6] = new XSigSerialToken(stringIndex + 7, String.Empty);
+ return GetXSigString(tokenArray);
+ }
- digitalIndex += maxDigitals;
- meetingIndex += offset;
- stringIndex += maxStrings;
- }
-
- return GetXSigString(tokenArray);
- }
private void LinkVideoCodecDirectoryToApi(IHasDirectory codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
{
@@ -985,7 +992,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
trilist.SetUShortSigAction(joinMap.DirectorySelectRow.JoinNumber, (i) => SelectDirectoryEntry(codec, i, trilist, joinMap));
- // Report feedback for number of contact methods for selected contact
+ //Special Change for protected directory clear
+
+ trilist.SetBoolSigAction(joinMap.DirectoryClearSelected.JoinNumber, (b) => SelectDirectoryEntry(_directoryCodec, 0, _directoryTrilist, _directoryJoinmap));
+
+ // Report feedback for number of contact methods for selected contact
trilist.SetSigFalseAction(joinMap.DirectoryRoot.JoinNumber, codec.SetCurrentDirectoryToRoot);
@@ -999,7 +1010,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
- var directoryXSig = UpdateDirectoryXSig(codec.DirectoryRoot, codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
+ var directoryXSig = UpdateDirectoryXSig(codec.DirectoryRoot,
+ codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
Debug.Console(2, this, "Directory XSig Length: {0}", directoryXSig.Length);
@@ -1014,30 +1026,32 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
- var directoryXSig = UpdateDirectoryXSig(args.Directory, codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
-
+ var directoryXSig = UpdateDirectoryXSig(args.Directory,
+ codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
Debug.Console(2, this, "Directory XSig Length: {0}", directoryXSig.Length);
trilist.SetString(joinMap.DirectoryEntries.JoinNumber, directoryXSig);
};
-
+
trilist.OnlineStatusChange += (device, args) =>
{
if (!args.DeviceOnLine) return;
- trilist.SetString(joinMap.DirectoryEntries.JoinNumber, "\xFC");
- UpdateDirectoryXSig(codec.CurrentDirectoryResult,
- codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
+ var clearBytes = XSigHelpers.ClearOutputs();
+ trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
+ Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
+ var directoryXSig = UpdateDirectoryXSig(codec.DirectoryRoot, codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
+ trilist.SetString(joinMap.DirectoryEntries.JoinNumber, directoryXSig);
};
}
-
-
private void SelectDirectoryEntry(IHasDirectory codec, ushort i, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
{
- if (i < 1 || i > codec.CurrentDirectoryResult.CurrentDirectoryResults.Count) return;
+ if (i > codec.CurrentDirectoryResult.CurrentDirectoryResults.Count) return;
+ _selectedDirectoryItem = i == 0 ? null : codec.CurrentDirectoryResult.CurrentDirectoryResults[i - 1];
+ trilist.SetUshort(joinMap.DirectorySelectRowFeedback.JoinNumber, i);
- _selectedDirectoryItem = codec.CurrentDirectoryResult.CurrentDirectoryResults[i - 1];
+ if (_selectedDirectoryItem == null) trilist.SetBool(joinMap.DirectoryEntryIsContact.JoinNumber, false);
if (_selectedDirectoryItem is DirectoryFolder)
@@ -1049,6 +1063,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
trilist.ClearUShortSigAction(joinMap.SelectContactMethod.JoinNumber);
trilist.ClearBoolSigAction(joinMap.DirectoryDialSelectedLine.JoinNumber);
trilist.ClearBoolSigAction(joinMap.DirectoryDialSelectedContactMethod.JoinNumber);
+ trilist.SetBool(joinMap.DirectoryEntryIsContact.JoinNumber, false);
return;
}
@@ -1056,13 +1071,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
trilist.SetString(joinMap.DirectorySelectedFolderName.JoinNumber, string.Empty);
var selectedContact = _selectedDirectoryItem as DirectoryContact;
- if (selectedContact != null)
- {
- trilist.SetString(joinMap.DirectoryEntrySelectedName.JoinNumber, selectedContact.Name);
-
- }
- // Allow auto dial of selected line. Always dials first contact method
+ if (selectedContact != null && selectedContact.ContactMethods.Count >= 1)
+ {
+ trilist.SetBool(joinMap.DirectoryEntryIsContact.JoinNumber, true);
+ }
+
+ trilist.SetString(joinMap.DirectoryEntrySelectedName.JoinNumber,
+ selectedContact != null ? selectedContact.Name : string.Empty);
+
+ // Allow auto dial of selected line. Always dials first contact method
if (!trilist.GetBool(joinMap.DirectoryDisableAutoDialSelectedLine.JoinNumber))
{
var invitableEntry = _selectedDirectoryItem as IInvitableContact;
@@ -1075,12 +1093,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
var entryToDial = _selectedDirectoryItem as DirectoryContact;
- trilist.SetString(joinMap.DirectoryEntrySelectedNumber.JoinNumber, selectedContact.ContactMethods[0].Number);
+ trilist.SetString(joinMap.DirectoryEntrySelectedNumber.JoinNumber,
+ selectedContact != null ? selectedContact.ContactMethods[0].Number : string.Empty);
if (entryToDial == null) return;
Dial(entryToDial.ContactMethods[0].Number);
- return;
}
else
{
@@ -1166,50 +1184,49 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
return GetXSigString(tokenArray);
}
- private string UpdateDirectoryXSig(CodecDirectory directory, bool isRoot)
- {
- var xSigMaxIndex = 1023;
- var tokenArray = new XSigToken[directory.CurrentDirectoryResults.Count > xSigMaxIndex
- ? xSigMaxIndex
- : directory.CurrentDirectoryResults.Count];
+ private string UpdateDirectoryXSig(CodecDirectory directory, bool isRoot)
+ {
+ var xSigMaxIndex = 1023;
+ var tokenArray = new XSigToken[directory.CurrentDirectoryResults.Count > xSigMaxIndex
+ ? xSigMaxIndex
+ : directory.CurrentDirectoryResults.Count];
- Debug.Console(2, this, "IsRoot: {0}, Directory Count: {1}, TokenArray.Length: {2}", isRoot, directory.CurrentDirectoryResults.Count, tokenArray.Length);
+ Debug.Console(2, this, "IsRoot: {0}, Directory Count: {1}, TokenArray.Length: {2}", isRoot,
+ directory.CurrentDirectoryResults.Count, tokenArray.Length);
- var contacts = directory.CurrentDirectoryResults.Count > xSigMaxIndex
- ? directory.CurrentDirectoryResults.Take(xSigMaxIndex)
- : directory.CurrentDirectoryResults;
-
- var contactsToDisplay = isRoot
- ? contacts.Where(c => c.ParentFolderId == "root")
- : contacts.Where(c => c.ParentFolderId != "root");
+ var contacts = directory.CurrentDirectoryResults.Count > xSigMaxIndex
+ ? directory.CurrentDirectoryResults.Take(xSigMaxIndex)
+ : directory.CurrentDirectoryResults;
- var counterIndex = 1;
- foreach (var entry in contactsToDisplay)
- {
- var arrayIndex = counterIndex - 1;
- var entryIndex = counterIndex;
+ var counterIndex = 1;
+ foreach (var entry in contacts)
+ {
+ var arrayIndex = counterIndex - 1;
+ var entryIndex = counterIndex;
- Debug.Console(2, this, "Entry{2:0000} Name: {0}, Folder ID: {1}, Type: {3}, ParentFolderId: {4}",
- entry.Name, entry.FolderId, entryIndex, entry.GetType().GetCType().FullName, entry.ParentFolderId);
+ Debug.Console(2, this, "Entry{2:0000} Name: {0}, Folder ID: {1}", entry.Name, entry.FolderId, entryIndex);
- if (entry is DirectoryFolder)
- {
- tokenArray[arrayIndex] = new XSigSerialToken(entryIndex, String.Format("[+] {0}", entry.Name));
+ if (entry is DirectoryFolder && entry.ParentFolderId == "root")
+ {
+ tokenArray[arrayIndex] = new XSigSerialToken(entryIndex, String.Format("[+] {0}", entry.Name));
- counterIndex++;
+ counterIndex++;
+ counterIndex++;
- continue;
- }
+ continue;
+ }
+
+ tokenArray[arrayIndex] = new XSigSerialToken(entryIndex, entry.Name);
+
+ counterIndex++;
+ }
+
+ return GetXSigString(tokenArray);
- tokenArray[arrayIndex] = new XSigSerialToken(entryIndex, entry.Name);
- counterIndex++;
- }
-
- return GetXSigString(tokenArray);
}
- private void LinkVideoCodecCallControlsToApi(BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
+ private void LinkVideoCodecCallControlsToApi(BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
{
trilist.SetSigFalseAction(joinMap.ManualDial.JoinNumber,
() => Dial(trilist.StringOutput[joinMap.CurrentDialString.JoinNumber].StringValue));
@@ -1347,9 +1364,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
{
if (!args.DeviceOnLine) return;
- // TODO [ ] Issue #868
+ // TODO [ ] #983
+ Debug.Console(0, this, "LinkVideoCodecCallControlsToApi: device is {0}, IsInCall {1}", args.DeviceOnLine ? "online" : "offline", IsInCall);
+ trilist.SetBool(joinMap.HookState.JoinNumber, IsInCall);
trilist.SetString(joinMap.CurrentCallData.JoinNumber, "\xFC");
- UpdateCallStatusXSig();
+ trilist.SetString(joinMap.CurrentCallData.JoinNumber, UpdateCallStatusXSig());
};
}
@@ -1983,4 +2002,21 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}
}
}
+ ///
+ /// Represents a codec command that might need to have a friendly label applied for UI feedback purposes
+ ///
+ public class CodecCommandWithLabel
+ {
+ public string Command { get; private set; }
+ public string Label { get; private set; }
+
+ public CodecCommandWithLabel(string command, string label)
+ {
+ Command = command;
+ Label = label;
+ }
+ }
+
+
+
}
\ No newline at end of file