mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-22 16:15:08 +00:00
Compare commits
98 Commits
1.10.6-alp
...
1.12.1-hot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c136943c3a | ||
|
|
c6495577e7 | ||
|
|
5359604098 | ||
|
|
6715a680cc | ||
|
|
f3fc0f2b26 | ||
|
|
26b968463b | ||
|
|
d33b89f232 | ||
|
|
10d77ac006 | ||
|
|
c19ab76a4c | ||
|
|
040c57b5e1 | ||
|
|
d6864bf214 | ||
|
|
62275890cb | ||
|
|
2a6b845fde | ||
|
|
4fb2d6d755 | ||
|
|
5994704fbd | ||
|
|
ca1cbb6e05 | ||
|
|
f82b7f8f12 | ||
|
|
dbd77f5f9f | ||
|
|
55031d16af | ||
|
|
4938071f70 | ||
|
|
3670bde7cf | ||
|
|
4deb9a0828 | ||
|
|
a524b1607d | ||
|
|
93435b60b5 | ||
|
|
2daf3c0328 | ||
|
|
eaef8ea616 | ||
|
|
b67eb6325b | ||
|
|
38cb86218c | ||
|
|
edddf295fe | ||
|
|
05ec0ebac3 | ||
|
|
c3d07fe4fd | ||
|
|
eae089cdf5 | ||
|
|
b48859d202 | ||
|
|
bda46eb1b9 | ||
|
|
ee735388bb | ||
|
|
77f202b9f4 | ||
|
|
939afb7aae | ||
|
|
4a98b58b60 | ||
|
|
2bf9336712 | ||
|
|
c0c67f6c15 | ||
|
|
eb3922aa43 | ||
|
|
598886dfd4 | ||
|
|
215cf6696e | ||
|
|
c557400f38 | ||
|
|
49a96d2632 | ||
|
|
ccf7acd53d | ||
|
|
f1590aeec8 | ||
|
|
f1d1ce9722 | ||
|
|
edd55d0349 | ||
|
|
384c4c2781 | ||
|
|
9b2611be02 | ||
|
|
26bd49aa85 | ||
|
|
1b9f16ea74 | ||
|
|
88a16b577b | ||
|
|
b4ab0c1c32 | ||
|
|
d01be57f81 | ||
|
|
5ba7abb59b | ||
|
|
f5a352cf08 | ||
|
|
c4a23e0887 | ||
|
|
2622e68afc | ||
|
|
7fe2d04d31 | ||
|
|
358f44cfe5 | ||
|
|
d7cccc0709 | ||
|
|
72086b57b3 | ||
|
|
f04b93d5e9 | ||
|
|
18c52ca199 | ||
|
|
1dcafff8fb | ||
|
|
81b1117310 | ||
|
|
fb689c4484 | ||
|
|
40cb1b0fcf | ||
|
|
4574941288 | ||
|
|
122abc56e5 | ||
|
|
074ee190ad | ||
|
|
68a0157fbe | ||
|
|
0376943dac | ||
|
|
62abbdf5e9 | ||
|
|
12248c6393 | ||
|
|
139ecc3e58 | ||
|
|
afa0a4cac2 | ||
|
|
ed335cc9ae | ||
|
|
5d51570018 | ||
|
|
e5393deea8 | ||
|
|
c446c3a976 | ||
|
|
49e44ec850 | ||
|
|
0ec42f8de2 | ||
|
|
712d38011c | ||
|
|
d849e4185c | ||
|
|
c56caff1cb | ||
|
|
53c9f9e664 | ||
|
|
5b94d89bc3 | ||
|
|
6dbdd0587d | ||
|
|
1a5d4896e1 | ||
|
|
50e9a7935f | ||
|
|
03e4c913ac | ||
|
|
b26e1b97aa | ||
|
|
60b6cea697 | ||
|
|
dfc0915fe0 | ||
|
|
96e3d52b95 |
@@ -53,14 +53,14 @@ namespace PepperDash.Essentials
|
|||||||
// to allow any HD-BaseT DM endpoints to register first.
|
// to allow any HD-BaseT DM endpoints to register first.
|
||||||
if (Global.ControlSystemIsDmpsType)
|
if (Global.ControlSystemIsDmpsType)
|
||||||
{
|
{
|
||||||
Debug.Console(2, "******************* InitializeSystem() Entering **********************");
|
Debug.Console(1, "******************* InitializeSystem() Entering **********************");
|
||||||
|
|
||||||
_initializeEvent = new CEvent();
|
_initializeEvent = new CEvent();
|
||||||
|
|
||||||
DeviceManager.AllDevicesActivated += (o, a) =>
|
DeviceManager.AllDevicesRegistered += (o, a) =>
|
||||||
{
|
{
|
||||||
_initializeEvent.Set();
|
_initializeEvent.Set();
|
||||||
Debug.Console(2, "******************* InitializeSystem() Exiting **********************");
|
Debug.Console(1, "******************* InitializeSystem() Exiting **********************");
|
||||||
};
|
};
|
||||||
|
|
||||||
_initializeEvent.Wait(30000);
|
_initializeEvent.Wait(30000);
|
||||||
|
|||||||
@@ -211,6 +211,9 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
[JsonProperty("fusion")]
|
[JsonProperty("fusion")]
|
||||||
public EssentialsRoomFusionConfig Fusion { get; set; }
|
public EssentialsRoomFusionConfig Fusion { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("essentialsRoomUiBehaviorConfig", NullValueHandling=NullValueHandling.Ignore)]
|
||||||
|
public EssentialsRoomUiBehaviorConfig UiBehavior { get; set; }
|
||||||
|
|
||||||
[JsonProperty("zeroVolumeWhenSwtichingVolumeDevices")]
|
[JsonProperty("zeroVolumeWhenSwtichingVolumeDevices")]
|
||||||
public bool ZeroVolumeWhenSwtichingVolumeDevices { get; set; }
|
public bool ZeroVolumeWhenSwtichingVolumeDevices { get; set; }
|
||||||
|
|
||||||
@@ -227,6 +230,12 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class EssentialsRoomUiBehaviorConfig
|
||||||
|
{
|
||||||
|
[JsonProperty("disableActivityButtonsWhileWarmingCooling")]
|
||||||
|
public bool DisableActivityButtonsWhileWarmingCooling { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public class EssentialsAvRoomPropertiesConfig : EssentialsRoomPropertiesConfig
|
public class EssentialsAvRoomPropertiesConfig : EssentialsRoomPropertiesConfig
|
||||||
{
|
{
|
||||||
[JsonProperty("defaultAudioKey")]
|
[JsonProperty("defaultAudioKey")]
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using PepperDash.Essentials.Room.Config;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
public interface IEssentialsHuddleSpaceRoom : IEssentialsRoom, IHasCurrentSourceInfoChange, IRunRouteAction, IRunDefaultPresentRoute, IHasDefaultDisplay
|
public interface IEssentialsHuddleSpaceRoom : IEssentialsRoom, IHasCurrentSourceInfoChange, IRunRouteAction, IRunDefaultPresentRoute, IHasDefaultDisplay, IHasCurrentVolumeControls
|
||||||
{
|
{
|
||||||
bool ExcludeFromGlobalFunctions { get; }
|
bool ExcludeFromGlobalFunctions { get; }
|
||||||
|
|
||||||
|
|||||||
@@ -11,196 +11,23 @@ using PepperDash.Core;
|
|||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
using PepperDash.Essentials.Core.PageManagers;
|
using PepperDash.Essentials.Core.PageManagers;
|
||||||
|
using PepperDash.Essentials.Core.UI;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
public class EssentialsTouchpanelController : EssentialsDevice, IHasBasicTriListWithSmartObject
|
public class EssentialsTouchpanelController : TouchpanelBase
|
||||||
{
|
{
|
||||||
private CrestronTouchpanelPropertiesConfig _propertiesConfig;
|
|
||||||
|
|
||||||
public BasicTriListWithSmartObject Panel { get; private set; }
|
|
||||||
|
|
||||||
public PanelDriverBase PanelDriver { get; private set; }
|
public PanelDriverBase PanelDriver { get; private set; }
|
||||||
|
|
||||||
CTimer BacklightTransitionedOnTimer;
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Config constructor
|
/// Config constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EssentialsTouchpanelController(string key, string name, string type, CrestronTouchpanelPropertiesConfig props, uint id)
|
public EssentialsTouchpanelController(string key, string name, BasicTriListWithSmartObject panel, CrestronTouchpanelPropertiesConfig config)
|
||||||
: base(key, name)
|
: 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<EventArgs>(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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Determines the room key to use based on the scenario
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="scenario"></param>
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -208,14 +35,14 @@ namespace PepperDash.Essentials
|
|||||||
/// Sets up drivers and links them to the room specified
|
/// Sets up drivers and links them to the room specified
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="roomKey">key of room to link the drivers to</param>
|
/// <param name="roomKey">key of room to link the drivers to</param>
|
||||||
void SetupPanelDrivers(string roomKey)
|
protected override void SetupPanelDrivers(string roomKey)
|
||||||
{
|
{
|
||||||
// Clear out any existing actions
|
// Clear out any existing actions
|
||||||
Panel.ClearAllSigActions();
|
Panel.ClearAllSigActions();
|
||||||
|
|
||||||
Debug.Console(0, this, "Linking TP '{0}' to Room '{1}'", Key, roomKey);
|
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
|
// Then the sub drivers
|
||||||
|
|
||||||
// spin up different room drivers depending on room type
|
// spin up different room drivers depending on room type
|
||||||
@@ -224,15 +51,15 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
// Screen Saver Driver
|
// Screen Saver Driver
|
||||||
|
|
||||||
mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, _propertiesConfig);
|
mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, _config);
|
||||||
|
|
||||||
// Header Driver
|
// Header Driver
|
||||||
Debug.Console(0, this, "Adding header driver");
|
Debug.Console(0, this, "Adding header driver");
|
||||||
mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, _propertiesConfig);
|
mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, _config);
|
||||||
|
|
||||||
// AV Driver
|
// AV Driver
|
||||||
Debug.Console(0, this, "Adding huddle space 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;
|
avDriver.DefaultRoomKey = roomKey;
|
||||||
mainDriver.AvDriver = avDriver;
|
mainDriver.AvDriver = avDriver;
|
||||||
avDriver.CurrentRoom = room as IEssentialsHuddleSpaceRoom;
|
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)
|
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, "Adding environment driver");
|
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);
|
mainDriver.EnvironmentDriver.GetDevicesFromConfig(avDriver.CurrentRoom.PropertiesConfig.Environment);
|
||||||
}
|
}
|
||||||
@@ -270,13 +97,13 @@ namespace PepperDash.Essentials
|
|||||||
Debug.Console(0, this, "Adding huddle space VTC AV driver");
|
Debug.Console(0, this, "Adding huddle space VTC AV driver");
|
||||||
|
|
||||||
// Screen Saver Driver
|
// Screen Saver Driver
|
||||||
mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, _propertiesConfig);
|
mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, _config);
|
||||||
|
|
||||||
// Header Driver
|
// Header Driver
|
||||||
mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, _propertiesConfig);
|
mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, _config);
|
||||||
|
|
||||||
// AV Driver
|
// AV Driver
|
||||||
var avDriver = new EssentialsHuddleVtc1PanelAvFunctionsDriver(mainDriver, _propertiesConfig);
|
var avDriver = new EssentialsHuddleVtc1PanelAvFunctionsDriver(mainDriver, _config);
|
||||||
|
|
||||||
var codecDriver = new PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver(Panel, avDriver,
|
var codecDriver = new PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver(Panel, avDriver,
|
||||||
(room as IEssentialsHuddleVtc1Room).VideoCodec, mainDriver.HeaderDriver);
|
(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)
|
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, "Adding environment driver");
|
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);
|
mainDriver.EnvironmentDriver.GetDevicesFromConfig(avDriver.CurrentRoom.PropertiesConfig.Environment);
|
||||||
}
|
}
|
||||||
@@ -338,13 +165,7 @@ namespace PepperDash.Essentials
|
|||||||
driver.Show();
|
driver.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HomePressed()
|
protected override void ExtenderSystemReservedSigs_DeviceExtenderSigChange(DeviceExtender currentDeviceExtender, SigEventArgs args)
|
||||||
{
|
|
||||||
if (BacklightTransitionedOnTimer == null)
|
|
||||||
PanelDriver.BackButtonPressed();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExtenderSystemReservedSigs_DeviceExtenderSigChange(DeviceExtender currentDeviceExtender, SigEventArgs args)
|
|
||||||
{
|
{
|
||||||
// If the sig is transitioning on, mark it in case it was home button that transitioned it
|
// If the sig is transitioning on, mark it in case it was home button that transitioned it
|
||||||
var blOnSig = (Panel as TswFt5ButtonSystem).ExtenderSystemReservedSigs.BacklightOnFeedback;
|
var blOnSig = (Panel as TswFt5ButtonSystem).ExtenderSystemReservedSigs.BacklightOnFeedback;
|
||||||
@@ -382,26 +203,6 @@ namespace PepperDash.Essentials
|
|||||||
act(value);
|
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<bool>)
|
|
||||||
(uo as Action<bool>)(args.Sig.BoolValue);
|
|
||||||
else if (uo is Action<ushort>)
|
|
||||||
(uo as Action<ushort>)(args.Sig.UShortValue);
|
|
||||||
else if (uo is Action<string>)
|
|
||||||
(uo as Action<string>)(args.Sig.StringValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Tsw_ButtonStateChange(GenericBase device, ButtonEventArgs args)
|
|
||||||
{
|
|
||||||
var uo = args.Button.UserObject;
|
|
||||||
if(uo is Action<bool>)
|
|
||||||
(uo as Action<bool>)(args.Button.State == eButtonState.Pressed);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EssentialsTouchpanelControllerFactory : EssentialsDeviceFactory<EssentialsTouchpanelController>
|
public class EssentialsTouchpanelControllerFactory : EssentialsDeviceFactory<EssentialsTouchpanelController>
|
||||||
@@ -414,13 +215,74 @@ namespace PepperDash.Essentials
|
|||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
{
|
{
|
||||||
var comm = CommFactory.GetControlPropertiesConfig(dc);
|
var comm = CommFactory.GetControlPropertiesConfig(dc);
|
||||||
var props = Newtonsoft.Json.JsonConvert.DeserializeObject<CrestronTouchpanelPropertiesConfig>(dc.Properties.ToString());
|
var props = JsonConvert.DeserializeObject<CrestronTouchpanelPropertiesConfig>(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");
|
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;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -97,10 +97,10 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
TriList.SetSigFalseAction(ButtonPressJoinBase + 1, ShadeDevice.Open);
|
TriList.SetSigFalseAction(ButtonPressJoinBase + 1, ShadeDevice.Open);
|
||||||
|
|
||||||
TriList.SetSigFalseAction(ButtonPressJoinBase + 2, (ShadeDevice as IShadesOpenCloseStop).StopOrPreset);
|
TriList.SetSigFalseAction(ButtonPressJoinBase + 2, (ShadeDevice as IShadesOpenCloseStop).Stop);
|
||||||
|
|
||||||
if(ShadeDevice is RelayControlledShade)
|
if (ShadeDevice is IShadesOpenCloseStop)
|
||||||
TriList.SetString(StringJoinBase + 2, (ShadeDevice as RelayControlledShade).StopOrPresetButtonLabel);
|
TriList.SetString(StringJoinBase + 2, "Stop");
|
||||||
|
|
||||||
TriList.SetSigFalseAction(ButtonPressJoinBase + 3, ShadeDevice.Close);
|
TriList.SetSigFalseAction(ButtonPressJoinBase + 3, ShadeDevice.Close);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,10 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
JoinType = eJoinType.Digital
|
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")]
|
[JoinName("SystemId")]
|
||||||
public JoinDataComplete SystemId = new JoinDataComplete(new JoinData { JoinNumber = 10, JoinSpan = 1 },
|
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 });
|
new JoinMetadata { Description = "DM Chassis SystemId Get/Set/Trigger/", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.DigitalAnalog });
|
||||||
|
|||||||
@@ -17,6 +17,10 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
public JoinDataComplete MixerPresetRecall = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
|
public JoinDataComplete MixerPresetRecall = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
|
||||||
new JoinMetadata { Description = "Mixer Preset Recall Set", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
|
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")]
|
[JoinName("MasterVolumeMuteOn")]
|
||||||
public JoinDataComplete MasterVolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
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 });
|
new JoinMetadata { Description = "Master Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|||||||
@@ -398,6 +398,7 @@ namespace PepperDash.Essentials.Core.Bridges.JoinMaps
|
|||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
[JoinName("DirectoryEntryIsContact")]
|
[JoinName("DirectoryEntryIsContact")]
|
||||||
public JoinDataComplete DirectoryEntryIsContact = new JoinDataComplete(
|
public JoinDataComplete DirectoryEntryIsContact = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
@@ -524,6 +525,21 @@ namespace PepperDash.Essentials.Core.Bridges.JoinMaps
|
|||||||
JoinType = eJoinType.Digital
|
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")]
|
[JoinName("CameraTiltUp")]
|
||||||
public JoinDataComplete CameraTiltUp = new JoinDataComplete(
|
public JoinDataComplete CameraTiltUp = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
@@ -776,44 +792,16 @@ namespace PepperDash.Essentials.Core.Bridges.JoinMaps
|
|||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
[JoinName("DialMeeting1")]
|
[JoinName("DialMeetingStart")]
|
||||||
public JoinDataComplete DialMeeting1 = new JoinDataComplete(
|
public JoinDataComplete DialMeetingStart = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
{
|
{
|
||||||
JoinNumber = 161,
|
JoinNumber = 161,
|
||||||
JoinSpan = 1
|
JoinSpan = 10
|
||||||
},
|
},
|
||||||
new JoinMetadata
|
new JoinMetadata
|
||||||
{
|
{
|
||||||
Description = "Join first meeting",
|
Description = "Join meeting",
|
||||||
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
|
||||||
JoinType = eJoinType.Digital
|
|
||||||
});
|
|
||||||
|
|
||||||
[JoinName("DialMeeting2")]
|
|
||||||
public JoinDataComplete DialMeeting2 = new JoinDataComplete(
|
|
||||||
new JoinData
|
|
||||||
{
|
|
||||||
JoinNumber = 162,
|
|
||||||
JoinSpan = 1
|
|
||||||
},
|
|
||||||
new JoinMetadata
|
|
||||||
{
|
|
||||||
Description = "Join second meeting",
|
|
||||||
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
|
||||||
JoinType = eJoinType.Digital
|
|
||||||
});
|
|
||||||
|
|
||||||
[JoinName("DialMeeting3")]
|
|
||||||
public JoinDataComplete DialMeeting3 = new JoinDataComplete(
|
|
||||||
new JoinData
|
|
||||||
{
|
|
||||||
JoinNumber = 163,
|
|
||||||
JoinSpan = 1
|
|
||||||
},
|
|
||||||
new JoinMetadata
|
|
||||||
{
|
|
||||||
Description = "Join third meeting",
|
|
||||||
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
@@ -1256,11 +1244,12 @@ namespace PepperDash.Essentials.Core.Bridges.JoinMaps
|
|||||||
},
|
},
|
||||||
new JoinMetadata
|
new JoinMetadata
|
||||||
{
|
{
|
||||||
Description = "Directory Select Row",
|
Description = "Directory Select Row and Feedback",
|
||||||
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
JoinType = eJoinType.Analog
|
JoinType = eJoinType.Analog
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
[JoinName("SelectedContactMethodCount")]
|
[JoinName("SelectedContactMethodCount")]
|
||||||
public JoinDataComplete SelectedContactMethodCount = new JoinDataComplete(
|
public JoinDataComplete SelectedContactMethodCount = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
@@ -1289,6 +1278,22 @@ namespace PepperDash.Essentials.Core.Bridges.JoinMaps
|
|||||||
JoinType = eJoinType.Analog
|
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")]
|
[JoinName("CameraPresetSelect")]
|
||||||
public JoinDataComplete CameraPresetSelect = new JoinDataComplete(
|
public JoinDataComplete CameraPresetSelect = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
{
|
{
|
||||||
Debug.Console(1, "Factory Attempting to create new C2N-RTHS Device");
|
Debug.Console(1, "Factory Attempting to create new DIN-CEN-CN2 Device");
|
||||||
|
|
||||||
var control = CommFactory.GetControlPropertiesConfig(dc);
|
var control = CommFactory.GetControlPropertiesConfig(dc);
|
||||||
var ipid = control.IpIdInt;
|
var ipid = control.IpIdInt;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// Wrapper class for CEN-IO-DIGIN-104 digital input module
|
/// Wrapper class for CEN-IO-DIGIN-104 digital input module
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Description("Wrapper class for the CEN-IO-DIGIN-104 diginal input module")]
|
[Description("Wrapper class for the CEN-IO-DIGIN-104 diginal input module")]
|
||||||
public class CenIoDigIn104Controller : EssentialsDevice, IDigitalInputPorts
|
public class CenIoDigIn104Controller : CrestronGenericBaseDevice, IDigitalInputPorts
|
||||||
{
|
{
|
||||||
public CenIoDi104 Di104 { get; private set; }
|
public CenIoDi104 Di104 { get; private set; }
|
||||||
|
|
||||||
@@ -53,9 +53,16 @@ namespace PepperDash.Essentials.Core
|
|||||||
Debug.Console(1, "Factory Attempting to create new CEN-DIGIN-104 Device");
|
Debug.Console(1, "Factory Attempting to create new CEN-DIGIN-104 Device");
|
||||||
|
|
||||||
var control = CommFactory.GetControlPropertiesConfig(dc);
|
var control = CommFactory.GetControlPropertiesConfig(dc);
|
||||||
|
if (control == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Factory failed to create a new CEN-DIGIN-104 Device, control properties not found");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
var ipid = control.IpIdInt;
|
var ipid = control.IpIdInt;
|
||||||
|
if (ipid != 0) return new CenIoDigIn104Controller(dc.Key, dc.Name, new CenIoDi104(ipid, Global.ControlSystem));
|
||||||
|
|
||||||
return new CenIoDigIn104Controller(dc.Key, dc.Name, new Crestron.SimplSharpPro.GeneralIO.CenIoDi104(ipid, Global.ControlSystem));
|
Debug.Console(1, "Factory failed to create a new CEN-IO-IR-104 Device using IP-ID-{0}", ipid);
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
using Crestron.SimplSharpPro;
|
||||||
|
using Crestron.SimplSharpPro.GeneralIO;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
|
|
||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Wrapper class for CEN-IO-IR-104 module
|
||||||
|
/// </summary>
|
||||||
|
[Description("Wrapper class for the CEN-IO-IR-104 module")]
|
||||||
|
public class CenIoIr104Controller : CrestronGenericBaseDevice, IIROutputPorts
|
||||||
|
{
|
||||||
|
private readonly CenIoIr104 _ir104;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <param name="name"></param>
|
||||||
|
/// <param name="ir104"></param>
|
||||||
|
public CenIoIr104Controller(string key, string name, CenIoIr104 ir104)
|
||||||
|
: base(key, name, ir104)
|
||||||
|
{
|
||||||
|
_ir104 = ir104;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region IDigitalInputPorts Members
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// IR port collection
|
||||||
|
/// </summary>
|
||||||
|
public CrestronCollection<IROutputPort> IROutputPorts
|
||||||
|
{
|
||||||
|
get { return _ir104.IROutputPorts; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Number of relay ports property
|
||||||
|
/// </summary>
|
||||||
|
public int NumberOfIROutputPorts
|
||||||
|
{
|
||||||
|
get { return _ir104.NumberOfIROutputPorts; }
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// CEN-IO-IR-104 controller fatory
|
||||||
|
/// </summary>
|
||||||
|
public class CenIoIr104ControllerFactory : EssentialsDeviceFactory<CenIoIr104Controller>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor
|
||||||
|
/// </summary>
|
||||||
|
public CenIoIr104ControllerFactory()
|
||||||
|
{
|
||||||
|
TypeNames = new List<string>() { "cenioir104" };
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Build device CEN-IO-IR-104
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dc"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Factory Attempting to create new CEN-IO-IR-104 Device");
|
||||||
|
|
||||||
|
var control = CommFactory.GetControlPropertiesConfig(dc);
|
||||||
|
if (control == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Factory failed to create a new CEN-IO-IR-104 Device, control properties not found");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var ipid = control.IpIdInt;
|
||||||
|
if(ipid != 0) return new CenIoIr104Controller(dc.Key, dc.Name, new CenIoIr104(ipid, Global.ControlSystem));
|
||||||
|
|
||||||
|
Debug.Console(1, "Factory failed to create a new CEN-IO-IR-104 Device using IP-ID-{0}", ipid);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -10,7 +10,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// Wrapper class for CEN-IO-RY-104 relay module
|
/// Wrapper class for CEN-IO-RY-104 relay module
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Description("Wrapper class for the CEN-IO-RY-104 relay module")]
|
[Description("Wrapper class for the CEN-IO-RY-104 relay module")]
|
||||||
public class CenIoRy104Controller : EssentialsDevice, IRelayPorts
|
public class CenIoRy104Controller : CrestronGenericBaseDevice, IRelayPorts
|
||||||
{
|
{
|
||||||
private readonly CenIoRy104 _ry104;
|
private readonly CenIoRy104 _ry104;
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// <param name="name"></param>
|
/// <param name="name"></param>
|
||||||
/// <param name="ry104"></param>
|
/// <param name="ry104"></param>
|
||||||
public CenIoRy104Controller(string key, string name, CenIoRy104 ry104)
|
public CenIoRy104Controller(string key, string name, CenIoRy104 ry104)
|
||||||
: base(key, name)
|
: base(key, name, ry104)
|
||||||
{
|
{
|
||||||
_ry104 = ry104;
|
_ry104 = ry104;
|
||||||
}
|
}
|
||||||
@@ -63,7 +63,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
var controlPropertiesConfig = CommFactory.GetControlPropertiesConfig(dc);
|
var controlPropertiesConfig = CommFactory.GetControlPropertiesConfig(dc);
|
||||||
if (controlPropertiesConfig == null)
|
if (controlPropertiesConfig == null)
|
||||||
{
|
{
|
||||||
Debug.Console(1, "Factory failed to create a new CEN-IO-RY-104 Device");
|
Debug.Console(1, "Factory failed to create a new CEN-IO-RY-104 Device, control properties not found");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,20 +73,26 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
//Debug.Console(1, this, " Does not require registration. Skipping");
|
//Debug.Console(1, this, " Does not require registration. Skipping");
|
||||||
|
|
||||||
|
if (Hardware.Registerable && !Hardware.Registered)
|
||||||
|
{
|
||||||
var response = Hardware.RegisterWithLogging(Key);
|
var response = Hardware.RegisterWithLogging(Key);
|
||||||
if (response != eDeviceRegistrationUnRegistrationResponse.Success)
|
if (response != eDeviceRegistrationUnRegistrationResponse.Success)
|
||||||
{
|
{
|
||||||
//Debug.Console(0, this, "ERROR: Cannot register Crestron device: {0}", response);
|
//Debug.Console(0, this, "ERROR: Cannot register Crestron device: {0}", response);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
IsRegistered.FireUpdate();
|
IsRegistered.FireUpdate();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
AddPostActivationAction(() =>
|
AddPostActivationAction(() =>
|
||||||
|
{
|
||||||
|
if (Hardware.Registerable && !Hardware.Registered)
|
||||||
{
|
{
|
||||||
var response = Hardware.RegisterWithLogging(Key);
|
var response = Hardware.RegisterWithLogging(Key);
|
||||||
|
}
|
||||||
|
|
||||||
IsRegistered.FireUpdate();
|
IsRegistered.FireUpdate();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
public static class DeviceManager
|
public static class DeviceManager
|
||||||
{
|
{
|
||||||
public static event EventHandler<EventArgs> AllDevicesActivated;
|
public static event EventHandler<EventArgs> AllDevicesActivated;
|
||||||
|
public static event EventHandler<EventArgs> AllDevicesRegistered;
|
||||||
|
|
||||||
private static readonly CCriticalSection DeviceCriticalSection = new CCriticalSection();
|
private static readonly CCriticalSection DeviceCriticalSection = new CCriticalSection();
|
||||||
private static readonly CEvent AllowAddDevicesCEvent = new CEvent(false, true);
|
private static readonly CEvent AllowAddDevicesCEvent = new CEvent(false, true);
|
||||||
@@ -57,6 +58,8 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
OnAllDevicesRegistered();
|
||||||
|
|
||||||
DeviceCriticalSection.Enter();
|
DeviceCriticalSection.Enter();
|
||||||
AddDeviceEnabled = false;
|
AddDeviceEnabled = false;
|
||||||
// PreActivate all devices
|
// 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Calls activate on all Device class items
|
/// Calls activate on all Device class items
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -131,4 +131,15 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string MinimumEssentialsFrameworkVersion { get; protected set; }
|
public string MinimumEssentialsFrameworkVersion { get; protected set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract class EssentialsPluginDevelopmentDeviceFactory<T> : EssentialsDeviceFactory<T>, IPluginDevelopmentDeviceFactory where T : EssentialsDevice
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Specifies the minimum version of Essentials required for a plugin to run. Must use the format Major.Minor.Build (ex. "1.4.33")
|
||||||
|
/// </summary>
|
||||||
|
public string MinimumEssentialsFrameworkVersion { get; protected set; }
|
||||||
|
|
||||||
|
public List<string> DevelopmentEssentialsFrameworkVersions { get; protected set; }
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -32,9 +32,38 @@ namespace PepperDash.Essentials.Core
|
|||||||
bool _IsWarmingUp;
|
bool _IsWarmingUp;
|
||||||
bool _IsCoolingDown;
|
bool _IsCoolingDown;
|
||||||
|
|
||||||
protected override Func<bool> PowerIsOnFeedbackFunc { get { return () => _PowerIsOn; } }
|
protected override Func<bool> PowerIsOnFeedbackFunc
|
||||||
protected override Func<bool> IsCoolingDownFeedbackFunc { get { return () => _IsCoolingDown; } }
|
{
|
||||||
protected override Func<bool> IsWarmingUpFeedbackFunc { get { return () => _IsWarmingUp; } }
|
get
|
||||||
|
{
|
||||||
|
return () =>
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "*************************************************** Display Power is {0}", _PowerIsOn ? "on" : "off");
|
||||||
|
return _PowerIsOn;
|
||||||
|
};
|
||||||
|
} }
|
||||||
|
protected override Func<bool> IsCoolingDownFeedbackFunc
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return () =>
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "*************************************************** {0}", _IsCoolingDown ? "Display is cooling down" : "Display has finished cooling down");
|
||||||
|
return _IsCoolingDown;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected override Func<bool> IsWarmingUpFeedbackFunc
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return () =>
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "*************************************************** {0}", _IsWarmingUp ? "Display is warming up" : "Display has finished warming up");
|
||||||
|
return _IsWarmingUp;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
protected override Func<string> CurrentInputFeedbackFunc { get { return () => "Not Implemented"; } }
|
protected override Func<string> CurrentInputFeedbackFunc { get { return () => "Not Implemented"; } }
|
||||||
|
|
||||||
int VolumeHeldRepeatInterval = 200;
|
int VolumeHeldRepeatInterval = 200;
|
||||||
@@ -61,7 +90,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
MuteFeedback = new BoolFeedback("MuteOn", () => _IsMuted);
|
MuteFeedback = new BoolFeedback("MuteOn", () => _IsMuted);
|
||||||
|
|
||||||
WarmupTime = 10000;
|
WarmupTime = 10000;
|
||||||
CooldownTime = 5000;
|
CooldownTime = 10000;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void PowerOn()
|
public override void PowerOn()
|
||||||
@@ -88,8 +117,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
if (PowerIsOnFeedback.BoolValue && !_IsWarmingUp && !_IsCoolingDown)
|
if (PowerIsOnFeedback.BoolValue && !_IsWarmingUp && !_IsCoolingDown)
|
||||||
{
|
{
|
||||||
_IsCoolingDown = true;
|
_IsCoolingDown = true;
|
||||||
_PowerIsOn = false;
|
|
||||||
PowerIsOnFeedback.InvokeFireUpdate();
|
|
||||||
IsCoolingDownFeedback.InvokeFireUpdate();
|
IsCoolingDownFeedback.InvokeFireUpdate();
|
||||||
// Fake cool-down cycle
|
// Fake cool-down cycle
|
||||||
CooldownTimer = new CTimer(o =>
|
CooldownTimer = new CTimer(o =>
|
||||||
@@ -97,6 +124,8 @@ namespace PepperDash.Essentials.Core
|
|||||||
Debug.Console(2, this, "Cooldown timer ending");
|
Debug.Console(2, this, "Cooldown timer ending");
|
||||||
_IsCoolingDown = false;
|
_IsCoolingDown = false;
|
||||||
IsCoolingDownFeedback.InvokeFireUpdate();
|
IsCoolingDownFeedback.InvokeFireUpdate();
|
||||||
|
_PowerIsOn = false;
|
||||||
|
PowerIsOnFeedback.InvokeFireUpdate();
|
||||||
}, CooldownTime);
|
}, CooldownTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
@@ -6,6 +7,7 @@ using System.Collections.Generic;
|
|||||||
using Crestron.SimplSharp.CrestronIO;
|
using Crestron.SimplSharp.CrestronIO;
|
||||||
using Crestron.SimplSharp.CrestronDataStore;
|
using Crestron.SimplSharp.CrestronDataStore;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
|
using Crestron.SimplSharpPro.DM;
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.License;
|
using PepperDash.Essentials.License;
|
||||||
@@ -39,7 +41,14 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
get
|
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
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// True when the processor type is a DMPS 4K 200/300/250/350 variant
|
||||||
|
/// </summary>
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,6 +161,38 @@ namespace PepperDash.Essentials.Core
|
|||||||
public static void SetAssemblyVersion(string assemblyVersion)
|
public static void SetAssemblyVersion(string assemblyVersion)
|
||||||
{
|
{
|
||||||
AssemblyVersion = assemblyVersion;
|
AssemblyVersion = assemblyVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsRunningDevelopmentVersion(List<string> 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);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -283,9 +283,10 @@ namespace PepperDash.Essentials.Core
|
|||||||
foreach (var join in joins)
|
foreach (var join in joins)
|
||||||
{
|
{
|
||||||
Debug.Console(0,
|
Debug.Console(0,
|
||||||
@"Join Number: {0} | JoinSpan: '{1}' | Description: '{2}' | Type: '{3}' | Capabilities: '{4}'",
|
@"Join Number: {0} | JoinSpan: '{1}' | JoinName: {2} | Description: '{3}' | Type: '{4}' | Capabilities: '{5}'",
|
||||||
join.Value.JoinNumber,
|
join.Value.JoinNumber,
|
||||||
join.Value.JoinSpan,
|
join.Value.JoinSpan,
|
||||||
|
join.Key,
|
||||||
String.IsNullOrEmpty(join.Value.AttributeName) ? join.Value.Metadata.Label : join.Value.AttributeName,
|
String.IsNullOrEmpty(join.Value.AttributeName) ? join.Value.Metadata.Label : join.Value.AttributeName,
|
||||||
join.Value.Metadata.JoinType.ToString(),
|
join.Value.Metadata.JoinType.ToString(),
|
||||||
join.Value.Metadata.JoinCapabilities.ToString());
|
join.Value.Metadata.JoinCapabilities.ToString());
|
||||||
|
|||||||
@@ -184,6 +184,7 @@
|
|||||||
<Compile Include="Crestron IO\Inputs\GenericVersiportInputDevice.cs" />
|
<Compile Include="Crestron IO\Inputs\GenericVersiportInputDevice.cs" />
|
||||||
<Compile Include="Crestron IO\Inputs\IDigitalInput.cs" />
|
<Compile Include="Crestron IO\Inputs\IDigitalInput.cs" />
|
||||||
<Compile Include="Crestron IO\IOPortConfig.cs" />
|
<Compile Include="Crestron IO\IOPortConfig.cs" />
|
||||||
|
<Compile Include="Crestron IO\Ir\CenIoIr104Controller.cs" />
|
||||||
<Compile Include="Crestron IO\Relay\CenIoRy104Controller.cs" />
|
<Compile Include="Crestron IO\Relay\CenIoRy104Controller.cs" />
|
||||||
<Compile Include="Crestron IO\Relay\GenericRelayDevice.cs" />
|
<Compile Include="Crestron IO\Relay\GenericRelayDevice.cs" />
|
||||||
<Compile Include="Crestron IO\Relay\ISwitchedOutput.cs" />
|
<Compile Include="Crestron IO\Relay\ISwitchedOutput.cs" />
|
||||||
@@ -217,6 +218,7 @@
|
|||||||
<Compile Include="DeviceTypeInterfaces\IHasPhoneDialing.cs" />
|
<Compile Include="DeviceTypeInterfaces\IHasPhoneDialing.cs" />
|
||||||
<Compile Include="DeviceTypeInterfaces\IMobileControl.cs" />
|
<Compile Include="DeviceTypeInterfaces\IMobileControl.cs" />
|
||||||
<Compile Include="Extensions\JsonExtensions.cs" />
|
<Compile Include="Extensions\JsonExtensions.cs" />
|
||||||
|
<Compile Include="Extensions\StringExtensions.cs" />
|
||||||
<Compile Include="Factory\DeviceFactory.cs" />
|
<Compile Include="Factory\DeviceFactory.cs" />
|
||||||
<Compile Include="Factory\IDeviceFactory.cs" />
|
<Compile Include="Factory\IDeviceFactory.cs" />
|
||||||
<Compile Include="Factory\ReadyEventArgs.cs" />
|
<Compile Include="Factory\ReadyEventArgs.cs" />
|
||||||
@@ -365,6 +367,7 @@
|
|||||||
<Compile Include="UI PageManagers\SinglePageManager.cs" />
|
<Compile Include="UI PageManagers\SinglePageManager.cs" />
|
||||||
<Compile Include="UI PageManagers\PageManager.cs" />
|
<Compile Include="UI PageManagers\PageManager.cs" />
|
||||||
<Compile Include="UI PageManagers\SetTopBoxTwoPanelPageManager.cs" />
|
<Compile Include="UI PageManagers\SetTopBoxTwoPanelPageManager.cs" />
|
||||||
|
<Compile Include="UI\TouchpanelBase.cs" />
|
||||||
<Compile Include="Utilities\ActionSequence.cs" />
|
<Compile Include="Utilities\ActionSequence.cs" />
|
||||||
<Compile Include="VideoStatus\VideoStatusOutputs.cs" />
|
<Compile Include="VideoStatus\VideoStatusOutputs.cs" />
|
||||||
<Compile Include="Crestron\CrestronGenericBaseDevice.cs" />
|
<Compile Include="Crestron\CrestronGenericBaseDevice.cs" />
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
|
||||||
@@ -15,5 +16,10 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface IPluginDevelopmentDeviceFactory : IPluginDeviceFactory
|
||||||
|
{
|
||||||
|
List<string> DevelopmentEssentialsFrameworkVersions { get; }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -425,7 +425,11 @@ namespace PepperDash.Essentials
|
|||||||
/// <param name="loadedAssembly"></param>
|
/// <param name="loadedAssembly"></param>
|
||||||
static void LoadCustomPlugin(IPluginDeviceFactory plugin, LoadedAssembly loadedAssembly)
|
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)
|
if (!passed)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,12 +11,34 @@ using PepperDash.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
|
public class RouteRequest
|
||||||
|
{
|
||||||
|
public IRoutingSink Destination {get; set;}
|
||||||
|
public IRoutingOutputs Source {get; set;}
|
||||||
|
public eRoutingSignalType SignalType {get; set;}
|
||||||
|
|
||||||
|
public void HandleCooldown(object sender, FeedbackEventArgs args)
|
||||||
|
{
|
||||||
|
var coolingDevice = sender as IWarmingCooling;
|
||||||
|
|
||||||
|
if(args.BoolValue == false)
|
||||||
|
{
|
||||||
|
Destination.ReleaseAndMakeRoute(Source, SignalType);
|
||||||
|
|
||||||
|
if(sender == null) return;
|
||||||
|
|
||||||
|
coolingDevice.IsCoolingDownFeedback.OutputChange -= HandleCooldown;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Extensions added to any IRoutingInputs classes to provide discovery-based routing
|
/// Extensions added to any IRoutingInputs classes to provide discovery-based routing
|
||||||
/// on those destinations.
|
/// on those destinations.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class IRoutingInputsExtensions
|
public static class IRoutingInputsExtensions
|
||||||
{
|
{
|
||||||
|
private static Dictionary<string, RouteRequest> RouteRequests = new Dictionary<string, RouteRequest>();
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets any existing RouteDescriptor for a destination, clears it using ReleaseRoute
|
/// Gets any existing RouteDescriptor for a destination, clears it using ReleaseRoute
|
||||||
/// and then attempts a new Route and if sucessful, stores that RouteDescriptor
|
/// and then attempts a new Route and if sucessful, stores that RouteDescriptor
|
||||||
@@ -24,13 +46,61 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static void ReleaseAndMakeRoute(this IRoutingSink destination, IRoutingOutputs source, eRoutingSignalType signalType)
|
public static void ReleaseAndMakeRoute(this IRoutingSink destination, IRoutingOutputs source, eRoutingSignalType signalType)
|
||||||
{
|
{
|
||||||
|
var routeRequest = new RouteRequest {
|
||||||
|
Destination = destination,
|
||||||
|
Source = source,
|
||||||
|
SignalType = signalType
|
||||||
|
};
|
||||||
|
|
||||||
|
var coolingDevice = destination as IWarmingCooling;
|
||||||
|
|
||||||
|
RouteRequest existingRouteRequest;
|
||||||
|
|
||||||
|
//We already have a route request for this device, and it's a cooling device and is cooling
|
||||||
|
if (RouteRequests.TryGetValue(destination.Key, out existingRouteRequest) && coolingDevice != null && coolingDevice.IsCoolingDownFeedback.BoolValue == true)
|
||||||
|
{
|
||||||
|
coolingDevice.IsCoolingDownFeedback.OutputChange -= existingRouteRequest.HandleCooldown;
|
||||||
|
|
||||||
|
coolingDevice.IsCoolingDownFeedback.OutputChange += routeRequest.HandleCooldown;
|
||||||
|
|
||||||
|
RouteRequests[destination.Key] = routeRequest;
|
||||||
|
|
||||||
|
Debug.Console(2, "******************************************************** Device: {0} is cooling down and already has a routing request stored. Storing new route request to route to source key: {1}", destination.Key, routeRequest.Source.Key);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//New Request
|
||||||
|
if (coolingDevice != null && coolingDevice.IsCoolingDownFeedback.BoolValue == true)
|
||||||
|
{
|
||||||
|
coolingDevice.IsCoolingDownFeedback.OutputChange -= routeRequest.HandleCooldown;
|
||||||
|
|
||||||
|
coolingDevice.IsCoolingDownFeedback.OutputChange += routeRequest.HandleCooldown;
|
||||||
|
|
||||||
|
RouteRequests.Add(destination.Key, routeRequest);
|
||||||
|
|
||||||
|
Debug.Console(2, "******************************************************** Device: {0} is cooling down. Storing route request to route to source key: {1}", destination.Key, routeRequest.Source.Key);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RouteRequests.ContainsKey(destination.Key) && coolingDevice != null && coolingDevice.IsCoolingDownFeedback.BoolValue == false)
|
||||||
|
{
|
||||||
|
RouteRequests.Remove(destination.Key);
|
||||||
|
Debug.Console(2, "******************************************************** Device: {0} is NOT cooling down. Removing stored route request and routing to source key: {1}", destination.Key, routeRequest.Source.Key);
|
||||||
|
}
|
||||||
|
|
||||||
destination.ReleaseRoute();
|
destination.ReleaseRoute();
|
||||||
|
|
||||||
if (source == null) return;
|
RunRouteRequest(routeRequest);
|
||||||
var newRoute = destination.GetRouteToSource(source, signalType);
|
}
|
||||||
|
|
||||||
|
public static void RunRouteRequest(RouteRequest request)
|
||||||
|
{
|
||||||
|
if (request.Source == null) return;
|
||||||
|
var newRoute = request.Destination.GetRouteToSource(request.Source, request.SignalType);
|
||||||
if (newRoute == null) return;
|
if (newRoute == null) return;
|
||||||
RouteDescriptorCollection.DefaultCollection.AddRouteDescriptor(newRoute);
|
RouteDescriptorCollection.DefaultCollection.AddRouteDescriptor(newRoute);
|
||||||
Debug.Console(2, destination, "Executing full route");
|
Debug.Console(2, request.Destination, "Executing full route");
|
||||||
newRoute.ExecuteRoutes();
|
newRoute.ExecuteRoutes();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,6 +111,17 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// <param name="destination"></param>
|
/// <param name="destination"></param>
|
||||||
public static void ReleaseRoute(this IRoutingSink destination)
|
public static void ReleaseRoute(this IRoutingSink destination)
|
||||||
{
|
{
|
||||||
|
RouteRequest existingRequest;
|
||||||
|
|
||||||
|
if (RouteRequests.TryGetValue(destination.Key, out existingRequest) && destination is IWarmingCooling)
|
||||||
|
{
|
||||||
|
var coolingDevice = destination as IWarmingCooling;
|
||||||
|
|
||||||
|
coolingDevice.IsCoolingDownFeedback.OutputChange -= existingRequest.HandleCooldown;
|
||||||
|
}
|
||||||
|
|
||||||
|
RouteRequests.Remove(destination.Key);
|
||||||
|
|
||||||
var current = RouteDescriptorCollection.DefaultCollection.RemoveRouteDescriptor(destination);
|
var current = RouteDescriptorCollection.DefaultCollection.RemoveRouteDescriptor(destination);
|
||||||
if (current != null)
|
if (current != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ namespace PepperDash.Essentials.Core.Shades
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Requirements for a device that implements basic Open/Close shade control
|
/// Requirements for a device that implements basic Open/Close shade control
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Obsolete("Please use IShadesOpenCloseStop instead")]
|
||||||
public interface IShadesOpenClose
|
public interface IShadesOpenClose
|
||||||
{
|
{
|
||||||
void Open();
|
void Open();
|
||||||
@@ -28,15 +29,26 @@ namespace PepperDash.Essentials.Core.Shades
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Requirements for a device that implements basic Open/Close/Stop shade control (Uses 3 relays)
|
/// Requirements for a device that implements basic Open/Close/Stop shade control (Uses 3 relays)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IShadesOpenCloseStop : IShadesOpenClose
|
public interface IShadesOpenCloseStop
|
||||||
{
|
{
|
||||||
void StopOrPreset();
|
void Open();
|
||||||
|
void Close();
|
||||||
|
void Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IShadesOpenClosePreset : IShadesOpenCloseStop
|
||||||
|
{
|
||||||
|
void RecallPreset(uint presetNumber);
|
||||||
|
void SavePreset(uint presetNumber);
|
||||||
string StopOrPresetButtonLabel { get; }
|
string StopOrPresetButtonLabel { get; }
|
||||||
|
|
||||||
|
event EventHandler PresetSaved;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Requirements for a shade that implements press/hold raise/lower functions
|
/// Requirements for a shade that implements press/hold raise/lower functions
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Obsolete("Please use IShadesOpenCloseStop instead")]
|
||||||
public interface IShadesRaiseLower
|
public interface IShadesRaiseLower
|
||||||
{
|
{
|
||||||
void Raise(bool state);
|
void Raise(bool state);
|
||||||
@@ -55,7 +67,7 @@ namespace PepperDash.Essentials.Core.Shades
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Requirements for a shade/scene that is open or closed
|
/// Requirements for a shade/scene that is open or closed
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IShadesOpenClosedFeedback: IShadesOpenClose
|
public interface IShadesOpenClosedFeedback: IShadesOpenCloseStop
|
||||||
{
|
{
|
||||||
BoolFeedback ShadeIsOpenFeedback { get; }
|
BoolFeedback ShadeIsOpenFeedback { get; }
|
||||||
BoolFeedback ShadeIsClosedFeedback { get; }
|
BoolFeedback ShadeIsClosedFeedback { get; }
|
||||||
@@ -64,13 +76,14 @@ namespace PepperDash.Essentials.Core.Shades
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Obsolete("Please use IShadesOpenCloseStop instead")]
|
||||||
public interface IShadesStop
|
public interface IShadesStop
|
||||||
{
|
{
|
||||||
void Stop();
|
void Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// Used to implement raise/stop/lower/stop from single button
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IShadesStopOrMove
|
public interface IShadesStopOrMove
|
||||||
{
|
{
|
||||||
@@ -82,7 +95,7 @@ namespace PepperDash.Essentials.Core.Shades
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Basic feedback for shades/scene stopped
|
/// Basic feedback for shades/scene stopped
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IShadesStopFeedback
|
public interface IShadesStopFeedback : IShadesOpenCloseStop
|
||||||
{
|
{
|
||||||
BoolFeedback IsStoppedFeedback { get; }
|
BoolFeedback IsStoppedFeedback { get; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ namespace PepperDash.Essentials.Core.Shades
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Base class for a shade device
|
/// Base class for a shade device
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class ShadeBase : EssentialsDevice, IShadesOpenClose
|
public abstract class ShadeBase : EssentialsDevice, IShadesOpenCloseStop
|
||||||
{
|
{
|
||||||
public ShadeBase(string key, string name)
|
public ShadeBase(string key, string name)
|
||||||
: base(key, name)
|
: base(key, name)
|
||||||
@@ -23,7 +23,7 @@ namespace PepperDash.Essentials.Core.Shades
|
|||||||
#region iShadesOpenClose Members
|
#region iShadesOpenClose Members
|
||||||
|
|
||||||
public abstract void Open();
|
public abstract void Open();
|
||||||
public abstract void StopOrPreset();
|
public abstract void Stop();
|
||||||
public abstract void Close();
|
public abstract void Close();
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 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.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">Essentials Device Key</param>
|
||||||
|
/// <param name="name">Essentials Device Name</param>
|
||||||
|
/// <param name="type">Touchpanel Type to build</param>
|
||||||
|
/// <param name="config">Touchpanel Configuration</param>
|
||||||
|
/// <param name="id">IP-ID to use for touch panel</param>
|
||||||
|
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<EventArgs>(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);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Setup Panel operation
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="roomKey">Room Key for this panel</param>
|
||||||
|
protected abstract void SetupPanelDrivers(string roomKey);
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Event handler for System Extender Events
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="currentDeviceExtender"></param>
|
||||||
|
/// <param name="args"></param>
|
||||||
|
protected abstract void ExtenderSystemReservedSigs_DeviceExtenderSigChange(DeviceExtender currentDeviceExtender, SigEventArgs args);
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender"></param>
|
||||||
|
/// <param name="e"></param>
|
||||||
|
protected virtual void roomCombiner_RoomCombinationScenarioChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
var roomCombiner = sender as IEssentialsRoomCombiner;
|
||||||
|
|
||||||
|
DetermineRoomKeyFromScenario(roomCombiner.CurrentScenario);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines the room key to use based on the scenario
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="scenario"></param>
|
||||||
|
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<bool>)
|
||||||
|
(uo as Action<bool>)(args.Sig.BoolValue);
|
||||||
|
else if (uo is Action<ushort>)
|
||||||
|
(uo as Action<ushort>)(args.Sig.UShortValue);
|
||||||
|
else if (uo is Action<string>)
|
||||||
|
(uo as Action<string>)(args.Sig.StringValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Tsw_ButtonStateChange(GenericBase device, ButtonEventArgs args)
|
||||||
|
{
|
||||||
|
var uo = args.Button.UserObject;
|
||||||
|
if(uo is Action<bool>)
|
||||||
|
(uo as Action<bool>)(args.Button.State == eButtonState.Pressed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1482,6 +1482,8 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
LinkChassisToApi(trilist, joinMap);
|
LinkChassisToApi(trilist, joinMap);
|
||||||
|
|
||||||
|
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = this.Name;
|
||||||
|
|
||||||
// Link up inputs & outputs
|
// Link up inputs & outputs
|
||||||
for (uint i = 1; i <= Chassis.NumberOfOutputs; i++)
|
for (uint i = 1; i <= Chassis.NumberOfOutputs; i++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -17,52 +17,89 @@ using PepperDash.Essentials.DM.Config;
|
|||||||
namespace PepperDash.Essentials.DM
|
namespace PepperDash.Essentials.DM
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 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
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class DmpsAudioOutputController : EssentialsBridgeableDevice
|
public class DmpsAudioOutputController : EssentialsBridgeableDevice
|
||||||
{
|
{
|
||||||
Card.Dmps3OutputBase OutputCard;
|
|
||||||
|
|
||||||
public DmpsAudioOutput MasterVolumeLevel { get; private set; }
|
public DmpsAudioOutput MasterVolumeLevel { get; private set; }
|
||||||
public DmpsAudioOutput SourceVolumeLevel { get; private set; }
|
public DmpsAudioOutput SourceVolumeLevel { get; private set; }
|
||||||
public DmpsAudioOutput MicsMasterVolumeLevel { get; private set; }
|
public DmpsAudioOutput MicsMasterVolumeLevel { get; private set; }
|
||||||
public DmpsAudioOutput Codec1VolumeLevel { get; private set; }
|
public DmpsAudioOutput Codec1VolumeLevel { get; private set; }
|
||||||
public DmpsAudioOutput Codec2VolumeLevel { 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)
|
public DmpsAudioOutputController(string key, string name, Card.Dmps3OutputBase card)
|
||||||
: base(key, name)
|
: base(key, name)
|
||||||
{
|
{
|
||||||
OutputCard = card;
|
card.BaseDevice.DMOutputChange += new DMOutputEventHandler(BaseDevice_DMOutputChange);
|
||||||
|
|
||||||
OutputCard.BaseDevice.DMOutputChange += new DMOutputEventHandler(BaseDevice_DMOutputChange);
|
|
||||||
|
|
||||||
if (card is Card.Dmps3ProgramOutput)
|
if (card is Card.Dmps3ProgramOutput)
|
||||||
{
|
{
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixer(card, eDmpsLevelType.Master, (card as Card.Dmps3ProgramOutput).OutputMixer);
|
var programOutput = card as Card.Dmps3ProgramOutput;
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
|
var output = new Dmps3AudioOutputWithMixerBase(card, programOutput.OutputMixer);
|
||||||
MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
|
MasterVolumeLevel = new DmpsAudioOutputWithMixerAndEq(output, eDmpsLevelType.Master, programOutput.OutputEqualizer);
|
||||||
Codec1VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec1);
|
SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
|
||||||
Codec2VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec2);
|
MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
|
||||||
|
Codec1VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec1);
|
||||||
|
Codec2VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec2);
|
||||||
}
|
}
|
||||||
else if (card is Card.Dmps3Aux1Output)
|
else if (card is Card.Dmps3Aux1Output)
|
||||||
{
|
{
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixer(card, eDmpsLevelType.Master, (card as Card.Dmps3Aux1Output).OutputMixer);
|
var auxOutput = card as Card.Dmps3Aux1Output;
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
|
var output = new Dmps3AudioOutputWithMixerBase(card, auxOutput.OutputMixer);
|
||||||
MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
|
MasterVolumeLevel = new DmpsAudioOutputWithMixerAndEq(output, eDmpsLevelType.Master, auxOutput.OutputEqualizer);
|
||||||
Codec2VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec2);
|
SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
|
||||||
|
MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
|
||||||
|
Codec2VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec2);
|
||||||
}
|
}
|
||||||
else if (card is Card.Dmps3Aux2Output)
|
else if (card is Card.Dmps3Aux2Output)
|
||||||
{
|
{
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixer(card, eDmpsLevelType.Master, (card as Card.Dmps3Aux2Output).OutputMixer);
|
var auxOutput = card as Card.Dmps3Aux2Output;
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
|
var output = new Dmps3AudioOutputWithMixerBase(card, auxOutput.OutputMixer);
|
||||||
MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
|
MasterVolumeLevel = new DmpsAudioOutputWithMixerAndEq(output, eDmpsLevelType.Master, auxOutput.OutputEqualizer);
|
||||||
Codec1VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec1);
|
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);
|
var mixOutput = card as Card.Dmps3DigitalMixOutput;
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
|
var output = new Dmps3AudioOutputWithMixerBase(card, mixOutput.OutputMixer);
|
||||||
MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
|
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);
|
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)
|
if (SourceVolumeLevel != null)
|
||||||
@@ -234,21 +276,37 @@ namespace PepperDash.Essentials.DM
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DmpsAudioOutputWithMixer : DmpsAudioOutput
|
public class DmpsAudioOutputWithMixerAndEq : DmpsAudioOutputWithMixer
|
||||||
{
|
{
|
||||||
CrestronControlSystem.Dmps3OutputMixerWithMonoAndStereo Mixer;
|
private CrestronControlSystem.Dmps3OutputEqualizer Eq;
|
||||||
|
public DmpsAudioOutputWithMixerAndEq(Dmps3AudioOutputWithMixerBase output, eDmpsLevelType type, CrestronControlSystem.Dmps3OutputEqualizer eq)
|
||||||
public DmpsAudioOutputWithMixer(Card.Dmps3OutputBase output, eDmpsLevelType type, CrestronControlSystem.Dmps3OutputMixerWithMonoAndStereo mixer)
|
|
||||||
: base(output, type)
|
: 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();
|
GetVolumeMax();
|
||||||
GetVolumeMin();
|
GetVolumeMin();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void GetVolumeMin()
|
public void GetVolumeMin()
|
||||||
{
|
{
|
||||||
MinLevel = (short)Mixer.MinVolumeFeedback.UShortValue;
|
MinLevel = (short)Output.MinVolumeFeedback.UShortValue;
|
||||||
if (VolumeLevelScaledFeedback != null)
|
if (VolumeLevelScaledFeedback != null)
|
||||||
{
|
{
|
||||||
VolumeLevelScaledFeedback.FireUpdate();
|
VolumeLevelScaledFeedback.FireUpdate();
|
||||||
@@ -257,7 +315,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
public void GetVolumeMax()
|
public void GetVolumeMax()
|
||||||
{
|
{
|
||||||
MaxLevel = (short)Mixer.MaxVolumeFeedback.UShortValue;
|
MaxLevel = (short)Output.MaxVolumeFeedback.UShortValue;
|
||||||
if (VolumeLevelScaledFeedback != null)
|
if (VolumeLevelScaledFeedback != null)
|
||||||
{
|
{
|
||||||
VolumeLevelScaledFeedback.FireUpdate();
|
VolumeLevelScaledFeedback.FireUpdate();
|
||||||
@@ -266,23 +324,36 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
public void RecallPreset(ushort preset)
|
public void RecallPreset(ushort preset)
|
||||||
{
|
{
|
||||||
Debug.Console(1, "DMPS Recalling Preset {0}", preset);
|
Output.PresetNumber.UShortValue = preset;
|
||||||
Mixer.PresetNumber.UShortValue = preset;
|
Output.RecallPreset();
|
||||||
Mixer.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
|
public class DmpsAudioOutput : IBasicVolumeWithFeedback
|
||||||
{
|
{
|
||||||
Card.Dmps3OutputBase Output;
|
private UShortInputSig Level;
|
||||||
eDmpsLevelType Type;
|
|
||||||
UShortInputSig Level;
|
|
||||||
|
|
||||||
private bool EnableVolumeSend;
|
private bool EnableVolumeSend;
|
||||||
private ushort VolumeLevelInput;
|
private ushort VolumeLevelInput;
|
||||||
protected short MinLevel { get; set; }
|
protected short MinLevel { get; set; }
|
||||||
protected short MaxLevel { get; set; }
|
protected short MaxLevel { get; set; }
|
||||||
|
|
||||||
|
public eDmpsLevelType Type { get; private set; }
|
||||||
public BoolFeedback MuteFeedback { get; private set; }
|
public BoolFeedback MuteFeedback { get; private set; }
|
||||||
public IntFeedback VolumeLevelFeedback { get; private set; }
|
public IntFeedback VolumeLevelFeedback { get; private set; }
|
||||||
public IntFeedback VolumeLevelScaledFeedback { get; private set; }
|
public IntFeedback VolumeLevelScaledFeedback { get; private set; }
|
||||||
@@ -292,9 +363,8 @@ namespace PepperDash.Essentials.DM
|
|||||||
Action<bool> VolumeUpAction;
|
Action<bool> VolumeUpAction;
|
||||||
Action<bool> VolumeDownAction;
|
Action<bool> VolumeDownAction;
|
||||||
|
|
||||||
public DmpsAudioOutput(Card.Dmps3OutputBase output, eDmpsLevelType type)
|
public DmpsAudioOutput(Dmps3AudioOutputBase output, eDmpsLevelType type)
|
||||||
{
|
{
|
||||||
Output = output;
|
|
||||||
VolumeLevelInput = 0;
|
VolumeLevelInput = 0;
|
||||||
EnableVolumeSend = false;
|
EnableVolumeSend = false;
|
||||||
Type = type;
|
Type = type;
|
||||||
@@ -306,47 +376,46 @@ namespace PepperDash.Essentials.DM
|
|||||||
case eDmpsLevelType.Master:
|
case eDmpsLevelType.Master:
|
||||||
{
|
{
|
||||||
Level = output.MasterVolume;
|
Level = output.MasterVolume;
|
||||||
|
MuteFeedback = new BoolFeedback(new Func<bool>(() => output.MasterMuteOnFeedBack.BoolValue));
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => Output.MasterMuteOnFeedBack.BoolValue));
|
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => output.MasterVolumeFeedBack.UShortValue));
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => Output.MasterVolumeFeedBack.UShortValue));
|
MuteOnAction = new Action(output.MasterMuteOn);
|
||||||
MuteOnAction = new Action(Output.MasterMuteOn);
|
MuteOffAction = new Action(output.MasterMuteOff);
|
||||||
MuteOffAction = new Action(Output.MasterMuteOff);
|
VolumeUpAction = new Action<bool>((b) => output.MasterVolumeUp.BoolValue = b);
|
||||||
VolumeUpAction = new Action<bool>((b) => Output.MasterVolumeUp.BoolValue = b);
|
VolumeDownAction = new Action<bool>((b) => output.MasterVolumeDown.BoolValue = b);
|
||||||
VolumeDownAction = new Action<bool>((b) => Output.MasterVolumeDown.BoolValue = b);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eDmpsLevelType.MicsMaster:
|
case eDmpsLevelType.MicsMaster:
|
||||||
{
|
{
|
||||||
Level = output.MicMasterLevel;
|
if (output.Card is Card.Dmps3OutputBase)
|
||||||
|
{
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => Output.MicMasterMuteOnFeedBack.BoolValue));
|
var micOutput = output.Card as Card.Dmps3OutputBase;
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => Output.MicMasterLevelFeedBack.UShortValue));
|
Level = micOutput.MicMasterLevel;
|
||||||
MuteOnAction = new Action(Output.MicMasterMuteOn);
|
MuteFeedback = new BoolFeedback(new Func<bool>(() => micOutput.MicMasterMuteOnFeedBack.BoolValue));
|
||||||
MuteOffAction = new Action(Output.MicMasterMuteOff);
|
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => micOutput.MicMasterLevelFeedBack.UShortValue));
|
||||||
VolumeUpAction = new Action<bool>((b) => Output.MicMasterLevelUp.BoolValue = b);
|
MuteOnAction = new Action(micOutput.MicMasterMuteOn);
|
||||||
VolumeDownAction = new Action<bool>((b) => Output.MicMasterLevelDown.BoolValue = b);
|
MuteOffAction = new Action(micOutput.MicMasterMuteOff);
|
||||||
|
VolumeUpAction = new Action<bool>((b) => micOutput.MicMasterLevelUp.BoolValue = b);
|
||||||
|
VolumeDownAction = new Action<bool>((b) => micOutput.MicMasterLevelDown.BoolValue = b);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eDmpsLevelType.Source:
|
case eDmpsLevelType.Source:
|
||||||
{
|
{
|
||||||
Level = output.SourceLevel;
|
Level = output.SourceLevel;
|
||||||
|
MuteFeedback = new BoolFeedback(new Func<bool>(() => output.SourceMuteOnFeedBack.BoolValue));
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => Output.SourceMuteOnFeedBack.BoolValue));
|
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => output.SourceLevelFeedBack.UShortValue));
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => Output.SourceLevelFeedBack.UShortValue));
|
MuteOnAction = new Action(output.SourceMuteOn);
|
||||||
MuteOnAction = new Action(Output.SourceMuteOn);
|
MuteOffAction = new Action(output.SourceMuteOff);
|
||||||
MuteOffAction = new Action(Output.SourceMuteOff);
|
VolumeUpAction = new Action<bool>((b) => output.SourceLevelUp.BoolValue = b);
|
||||||
VolumeUpAction = new Action<bool>((b) => Output.SourceLevelUp.BoolValue = b);
|
VolumeDownAction = new Action<bool>((b) => output.SourceLevelDown.BoolValue = b);
|
||||||
VolumeDownAction = new Action<bool>((b) => Output.SourceLevelDown.BoolValue = b);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eDmpsLevelType.Codec1:
|
case eDmpsLevelType.Codec1:
|
||||||
{
|
{
|
||||||
var programOutput = output as Card.Dmps3ProgramOutput;
|
if (output.Card is Card.Dmps3ProgramOutput)
|
||||||
|
|
||||||
if (programOutput != null)
|
|
||||||
{
|
{
|
||||||
|
var programOutput = output.Card as Card.Dmps3ProgramOutput;
|
||||||
Level = programOutput.Codec1Level;
|
Level = programOutput.Codec1Level;
|
||||||
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => programOutput.CodecMute1OnFeedback.BoolValue));
|
MuteFeedback = new BoolFeedback(new Func<bool>(() => programOutput.CodecMute1OnFeedback.BoolValue));
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => programOutput.Codec1LevelFeedback.UShortValue));
|
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => programOutput.Codec1LevelFeedback.UShortValue));
|
||||||
MuteOnAction = new Action(programOutput.Codec1MuteOn);
|
MuteOnAction = new Action(programOutput.Codec1MuteOn);
|
||||||
@@ -354,12 +423,10 @@ namespace PepperDash.Essentials.DM
|
|||||||
VolumeUpAction = new Action<bool>((b) => programOutput.Codec1LevelUp.BoolValue = b);
|
VolumeUpAction = new Action<bool>((b) => programOutput.Codec1LevelUp.BoolValue = b);
|
||||||
VolumeDownAction = new Action<bool>((b) => programOutput.Codec1LevelDown.BoolValue = b);
|
VolumeDownAction = new Action<bool>((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;
|
Level = auxOutput.Codec1Level;
|
||||||
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => auxOutput.CodecMute1OnFeedback.BoolValue));
|
MuteFeedback = new BoolFeedback(new Func<bool>(() => auxOutput.CodecMute1OnFeedback.BoolValue));
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => auxOutput.Codec1LevelFeedback.UShortValue));
|
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => auxOutput.Codec1LevelFeedback.UShortValue));
|
||||||
MuteOnAction = new Action(auxOutput.Codec1MuteOn);
|
MuteOnAction = new Action(auxOutput.Codec1MuteOn);
|
||||||
@@ -371,12 +438,10 @@ namespace PepperDash.Essentials.DM
|
|||||||
}
|
}
|
||||||
case eDmpsLevelType.Codec2:
|
case eDmpsLevelType.Codec2:
|
||||||
{
|
{
|
||||||
var programOutput = output as Card.Dmps3ProgramOutput;
|
if (output.Card is Card.Dmps3ProgramOutput)
|
||||||
|
|
||||||
if (programOutput != null)
|
|
||||||
{
|
{
|
||||||
|
var programOutput = output.Card as Card.Dmps3ProgramOutput;
|
||||||
Level = programOutput.Codec2Level;
|
Level = programOutput.Codec2Level;
|
||||||
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => programOutput.CodecMute1OnFeedback.BoolValue));
|
MuteFeedback = new BoolFeedback(new Func<bool>(() => programOutput.CodecMute1OnFeedback.BoolValue));
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => programOutput.Codec2LevelFeedback.UShortValue));
|
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => programOutput.Codec2LevelFeedback.UShortValue));
|
||||||
MuteOnAction = new Action(programOutput.Codec2MuteOn);
|
MuteOnAction = new Action(programOutput.Codec2MuteOn);
|
||||||
@@ -384,12 +449,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
VolumeUpAction = new Action<bool>((b) => programOutput.Codec2LevelUp.BoolValue = b);
|
VolumeUpAction = new Action<bool>((b) => programOutput.Codec2LevelUp.BoolValue = b);
|
||||||
VolumeDownAction = new Action<bool>((b) => programOutput.Codec2LevelDown.BoolValue = b);
|
VolumeDownAction = new Action<bool>((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;
|
Level = auxOutput.Codec2Level;
|
||||||
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => auxOutput.CodecMute2OnFeedback.BoolValue));
|
MuteFeedback = new BoolFeedback(new Func<bool>(() => auxOutput.CodecMute2OnFeedback.BoolValue));
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => auxOutput.Codec2LevelFeedback.UShortValue));
|
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => auxOutput.Codec2LevelFeedback.UShortValue));
|
||||||
MuteOnAction = new Action(auxOutput.Codec2MuteOn);
|
MuteOnAction = new Action(auxOutput.Codec2MuteOn);
|
||||||
@@ -410,20 +474,27 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
public void SetVolumeScaled(ushort level)
|
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());
|
if (ushort.MaxValue + MinLevel != 0)
|
||||||
|
{
|
||||||
VolumeLevelInput = (ushort)(level * (MaxLevel - MinLevel) / ushort.MaxValue + MinLevel);
|
VolumeLevelInput = (ushort)(level * (MaxLevel - MinLevel) / ushort.MaxValue + MinLevel);
|
||||||
if (EnableVolumeSend == true)
|
if (EnableVolumeSend == true)
|
||||||
{
|
{
|
||||||
Level.UShortValue = VolumeLevelInput;
|
Level.UShortValue = VolumeLevelInput;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ushort ScaleVolumeFeedback(ushort level)
|
public ushort ScaleVolumeFeedback(ushort level)
|
||||||
{
|
{
|
||||||
short signedLevel = (short)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());
|
|
||||||
|
if (MaxLevel - MinLevel != 0)
|
||||||
|
{
|
||||||
return (ushort)((signedLevel - MinLevel) * ushort.MaxValue / (MaxLevel - MinLevel));
|
return (ushort)((signedLevel - MinLevel) * ushort.MaxValue / (MaxLevel - MinLevel));
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
return (ushort)MinLevel;
|
||||||
|
}
|
||||||
|
|
||||||
public void SendScaledVolume(bool pressRelease)
|
public void SendScaledVolume(bool pressRelease)
|
||||||
{
|
{
|
||||||
@@ -476,6 +547,150 @@ namespace PepperDash.Essentials.DM
|
|||||||
#endregion
|
#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
|
public enum eDmpsLevelType
|
||||||
{
|
{
|
||||||
Master,
|
Master,
|
||||||
|
|||||||
@@ -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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
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; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a list containing the Outputs that we want to expose.
|
||||||
|
/// </summary>
|
||||||
|
public FeedbackCollection<Feedback> Feedbacks { get; private set; }
|
||||||
|
|
||||||
|
public virtual RoutingPortCollection<RoutingInputPort> InputPorts
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new RoutingPortCollection<RoutingInputPort>
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
DigitalMix1,
|
||||||
|
DigitalMix2,
|
||||||
|
AudioFollowsVideo
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public RoutingPortCollection<RoutingOutputPort> OutputPorts
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new RoutingPortCollection<RoutingOutputPort> { DigitalAudioOut };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public DmpsDigitalOutputController(string key, string name, Card.Dmps3OutputBase outputCard)
|
||||||
|
: base(key, name)
|
||||||
|
{
|
||||||
|
Feedbacks = new FeedbackCollection<Feedback>();
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds feedback(s) to the list
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="newFbs"></param>
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -46,6 +46,8 @@ namespace PepperDash.Essentials.DM
|
|||||||
public eDmps3InputVideoSource ActualVideoInput
|
public eDmps3InputVideoSource ActualVideoInput
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
if (InputCard.VideoSourceFeedback != eDmps3InputVideoSource.Auto)
|
if (InputCard.VideoSourceFeedback != eDmps3InputVideoSource.Auto)
|
||||||
return InputCard.VideoSourceFeedback;
|
return InputCard.VideoSourceFeedback;
|
||||||
@@ -59,6 +61,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
return eDmps3InputVideoSource.Bnc;
|
return eDmps3InputVideoSource.Bnc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return eDmps3InputVideoSource.Bnc;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual RoutingPortCollection<RoutingInputPort> InputPorts
|
public virtual RoutingPortCollection<RoutingInputPort> InputPorts
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
void Dmps_MicrophoneChange(MicrophoneBase mic, GenericEventArgs args)
|
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());
|
Debug.Console(2, "Dmps Microphone Controller Index: {0} EventId: {1}", mic.ID, args.EventId.ToString());
|
||||||
|
|
||||||
if(Mics.ContainsKey(mic.ID))
|
if(Mics.ContainsKey(mic.ID))
|
||||||
|
|||||||
@@ -27,9 +27,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
public ISystemControl SystemControl { get; private set; }
|
public ISystemControl SystemControl { get; private set; }
|
||||||
public bool? EnableRouting { 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
|
//IroutingNumericEvent
|
||||||
public event EventHandler<RoutingNumericEventArgs> NumericSwitchChange;
|
public event EventHandler<RoutingNumericEventArgs> NumericSwitchChange;
|
||||||
|
|
||||||
@@ -62,6 +59,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
public Dictionary<uint, string> InputNames { get; set; }
|
public Dictionary<uint, string> InputNames { get; set; }
|
||||||
public Dictionary<uint, string> OutputNames { get; set; }
|
public Dictionary<uint, string> OutputNames { get; set; }
|
||||||
public Dictionary<uint, DmCardAudioOutputController> VolumeControls { get; private set; }
|
public Dictionary<uint, DmCardAudioOutputController> VolumeControls { get; private set; }
|
||||||
|
public Dictionary<uint, DmpsDigitalOutputController> DigitalAudioOutputs { get; private set; }
|
||||||
public DmpsMicrophoneController Microphones { get; private set; }
|
public DmpsMicrophoneController Microphones { get; private set; }
|
||||||
|
|
||||||
public const int RouteOffTime = 500;
|
public const int RouteOffTime = 500;
|
||||||
@@ -130,7 +128,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
case eSystemControlType.Dmps34K150CSystemControl:
|
case eSystemControlType.Dmps34K150CSystemControl:
|
||||||
SystemControl = systemControl as Dmps34K150CSystemControl;
|
SystemControl = systemControl as Dmps34K150CSystemControl;
|
||||||
Dmps4kType = true;
|
|
||||||
SystemPowerOnFeedback = new BoolFeedback(() => { return true; });
|
SystemPowerOnFeedback = new BoolFeedback(() => { return true; });
|
||||||
SystemPowerOffFeedback = new BoolFeedback(() => { return false; });
|
SystemPowerOffFeedback = new BoolFeedback(() => { return false; });
|
||||||
break;
|
break;
|
||||||
@@ -139,13 +136,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
case eSystemControlType.Dmps34K300CSystemControl:
|
case eSystemControlType.Dmps34K300CSystemControl:
|
||||||
case eSystemControlType.Dmps34K350CSystemControl:
|
case eSystemControlType.Dmps34K350CSystemControl:
|
||||||
SystemControl = systemControl as Dmps34K300CSystemControl;
|
SystemControl = systemControl as Dmps34K300CSystemControl;
|
||||||
Dmps4kType = true;
|
|
||||||
SystemPowerOnFeedback = new BoolFeedback(() => { return true; });
|
SystemPowerOnFeedback = new BoolFeedback(() => { return true; });
|
||||||
SystemPowerOffFeedback = new BoolFeedback(() => { return false; });
|
SystemPowerOffFeedback = new BoolFeedback(() => { return false; });
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
SystemControl = systemControl as Dmps3SystemControl;
|
SystemControl = systemControl as Dmps3SystemControl;
|
||||||
Dmps4kType = false;
|
|
||||||
SystemPowerOnFeedback = new BoolFeedback(() =>
|
SystemPowerOnFeedback = new BoolFeedback(() =>
|
||||||
{
|
{
|
||||||
return ((Dmps3SystemControl)SystemControl).SystemPowerOnFeedBack.BoolValue;
|
return ((Dmps3SystemControl)SystemControl).SystemPowerOnFeedBack.BoolValue;
|
||||||
@@ -156,11 +151,12 @@ namespace PepperDash.Essentials.DM
|
|||||||
});
|
});
|
||||||
break;
|
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<RoutingInputPort>();
|
InputPorts = new RoutingPortCollection<RoutingInputPort>();
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
|
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
|
||||||
VolumeControls = new Dictionary<uint, DmCardAudioOutputController>();
|
VolumeControls = new Dictionary<uint, DmCardAudioOutputController>();
|
||||||
|
DigitalAudioOutputs = new Dictionary<uint, DmpsDigitalOutputController>();
|
||||||
TxDictionary = new Dictionary<uint, string>();
|
TxDictionary = new Dictionary<uint, string>();
|
||||||
RxDictionary = new Dictionary<uint, string>();
|
RxDictionary = new Dictionary<uint, string>();
|
||||||
|
|
||||||
@@ -252,16 +248,18 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var kvp in OutputNames)
|
foreach (var kvp in OutputNames)
|
||||||
{
|
{
|
||||||
var output = (Dmps.SwitcherOutputs[kvp.Key] as DMOutput);
|
var output = (Dmps.SwitcherOutputs[kvp.Key] as DMOutput);
|
||||||
if (output != null && output.Name.Type != eSigType.NA)
|
if (output != null)
|
||||||
|
{
|
||||||
|
if (output.Name.Supported && kvp.Value.Length > 0)
|
||||||
{
|
{
|
||||||
output.Name.StringValue = kvp.Value;
|
output.Name.StringValue = kvp.Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void SetInputNames()
|
private void SetInputNames()
|
||||||
{
|
{
|
||||||
@@ -272,12 +270,15 @@ namespace PepperDash.Essentials.DM
|
|||||||
foreach (var kvp in InputNames)
|
foreach (var kvp in InputNames)
|
||||||
{
|
{
|
||||||
var input = (Dmps.SwitcherInputs[kvp.Key] as DMInput);
|
var input = (Dmps.SwitcherInputs[kvp.Key] as DMInput);
|
||||||
if (input != null && input.Name.Type != eSigType.NA)
|
if (input != null)
|
||||||
|
{
|
||||||
|
if (input.Name.Supported && kvp.Value.Length > 0)
|
||||||
{
|
{
|
||||||
input.Name.StringValue = kvp.Value;
|
input.Name.StringValue = kvp.Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void SetRoutingEnable(bool enable)
|
public void SetRoutingEnable(bool enable)
|
||||||
{
|
{
|
||||||
@@ -382,10 +383,22 @@ namespace PepperDash.Essentials.DM
|
|||||||
}
|
}
|
||||||
if (OutputNameFeedbacks[ioSlot] != null)
|
if (OutputNameFeedbacks[ioSlot] != null)
|
||||||
{
|
{
|
||||||
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames.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.OutputVideoNames.JoinNumber + ioSlotJoin]);
|
||||||
|
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + ioSlotJoin]);
|
||||||
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputAudioNames.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)
|
if (OutputVideoRouteNameFeedbacks[ioSlot] != null)
|
||||||
{
|
{
|
||||||
OutputVideoRouteNameFeedbacks[ioSlot].LinkInputSig(
|
OutputVideoRouteNameFeedbacks[ioSlot].LinkInputSig(
|
||||||
@@ -406,13 +419,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
private void LinkInputsToApi(BasicTriList trilist, DmpsRoutingControllerJoinMap joinMap)
|
private void LinkInputsToApi(BasicTriList trilist, DmpsRoutingControllerJoinMap joinMap)
|
||||||
{
|
{
|
||||||
if (Dmps4kType)
|
if (Global.ControlSystemIsDmps4k3xxType)
|
||||||
{
|
{
|
||||||
//DMPS-4K audio inputs 1-5 are aux inputs
|
//Add DMPS-4K mixer input names to end of inputs
|
||||||
for (uint i = 1; i <= 5; i++)
|
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";
|
||||||
trilist.StringInput[joinMap.InputAudioNames.JoinNumber + i - 1].StringValue = String.Format("Aux Input {0}", i);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
for (uint i = 1; i <= Dmps.SwitcherInputs.Count; i++)
|
for (uint i = 1; i <= Dmps.SwitcherInputs.Count; i++)
|
||||||
{
|
{
|
||||||
@@ -429,16 +440,17 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
if (InputNameFeedbacks.ContainsKey(ioSlot) && InputNameFeedbacks[ioSlot] != null)
|
if (InputNameFeedbacks.ContainsKey(ioSlot) && InputNameFeedbacks[ioSlot] != null)
|
||||||
{
|
{
|
||||||
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputNames.JoinNumber + ioSlotJoin]);
|
if (Dmps.SwitcherInputs[ioSlot] is Card.Dmps3AnalogAudioInput)
|
||||||
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputVideoNames.JoinNumber + ioSlotJoin]);
|
|
||||||
|
|
||||||
if (Dmps4kType)
|
|
||||||
{
|
{
|
||||||
//DMPS-4K Audio Inputs are offset by 5
|
for (uint j = ioSlot; j < ioSlot + 5; j++)
|
||||||
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputAudioNames.JoinNumber + ioSlotJoin + 5]);
|
{
|
||||||
|
InputNameFeedbacks[j].LinkInputSig(trilist.StringInput[joinMap.InputAudioNames.JoinNumber + j - 1]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
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]);
|
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputAudioNames.JoinNumber + ioSlotJoin]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -480,6 +492,8 @@ namespace PepperDash.Essentials.DM
|
|||||||
void SetupOutputCards()
|
void SetupOutputCards()
|
||||||
{
|
{
|
||||||
foreach (var card in Dmps.SwitcherOutputs)
|
foreach (var card in Dmps.SwitcherOutputs)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Output Card Type: {0}", card.CardInputOutputType);
|
Debug.Console(1, this, "Output Card Type: {0}", card.CardInputOutputType);
|
||||||
|
|
||||||
@@ -500,7 +514,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
});
|
});
|
||||||
AudioOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
|
AudioOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
|
||||||
{
|
{
|
||||||
try
|
if (!Global.ControlSystemIsDmps4k3xxType)
|
||||||
{
|
{
|
||||||
if (outputCard.AudioOutFeedback != null)
|
if (outputCard.AudioOutFeedback != null)
|
||||||
{
|
{
|
||||||
@@ -508,15 +522,58 @@ namespace PepperDash.Essentials.DM
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
catch (NotSupportedException)
|
else
|
||||||
{
|
{
|
||||||
return (ushort) outputCard.AudioOutSourceFeedback;
|
|
||||||
|
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(() =>
|
OutputNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
|
||||||
{
|
{
|
||||||
if (outputCard.NameFeedback != null && outputCard.NameFeedback != CrestronControlSystem.NullStringOutputSig && !string.IsNullOrEmpty(outputCard.NameFeedback.StringValue))
|
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);
|
Debug.Console(2, this, "Output Card {0} Name: {1}", outputCard.Number, outputCard.NameFeedback.StringValue);
|
||||||
return outputCard.NameFeedback.StringValue;
|
return outputCard.NameFeedback.StringValue;
|
||||||
@@ -533,11 +590,35 @@ namespace PepperDash.Essentials.DM
|
|||||||
return NoRouteText;
|
return NoRouteText;
|
||||||
});
|
});
|
||||||
OutputAudioRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
|
OutputAudioRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
|
||||||
|
{
|
||||||
|
if (!Global.ControlSystemIsDmps4k3xxType)
|
||||||
{
|
{
|
||||||
if (outputCard.AudioOutFeedback != null && outputCard.AudioOutFeedback.NameFeedback != null)
|
if (outputCard.AudioOutFeedback != null && outputCard.AudioOutFeedback.NameFeedback != null)
|
||||||
{
|
{
|
||||||
return outputCard.AudioOutFeedback.NameFeedback.StringValue;
|
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;
|
return NoRouteText;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -545,6 +626,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
AddOutputCard(outputCard.Number, outputCard);
|
AddOutputCard(outputCard.Number, outputCard);
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Debug.LogError(Debug.ErrorLogLevel.Error, string.Format("DMPS Controller exception creating output card: {0}", ex));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -569,13 +655,15 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
InputNameFeedbacks[inputCard.Number] = new StringFeedback(() =>
|
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);
|
Debug.Console(2, this, "Input Card {0} Name: {1}", inputCard.Number, inputCard.NameFeedback.StringValue);
|
||||||
return inputCard.NameFeedback.StringValue;
|
return inputCard.NameFeedback.StringValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.Console(2, this, "Input Card {0} Name is null", inputCard.Number);
|
|
||||||
return "";
|
return "";
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -609,7 +697,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
else if (inputCard is Card.Dmps3HdmiInput)
|
else if (inputCard is Card.Dmps3HdmiInput)
|
||||||
{
|
{
|
||||||
var hdmiInputCard = inputCard as Card.Dmps3HdmiInput;
|
var hdmiInputCard = inputCard as Card.Dmps3HdmiInput;
|
||||||
|
|
||||||
var cecPort = hdmiInputCard.HdmiInputPort;
|
var cecPort = hdmiInputCard.HdmiInputPort;
|
||||||
|
|
||||||
AddInputPortWithDebug(number, string.Format("HdmiIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, cecPort);
|
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)
|
else if (inputCard is Card.Dmps3DmInput)
|
||||||
{
|
{
|
||||||
var hdmiInputCard = inputCard as Card.Dmps3DmInput;
|
var hdmiInputCard = inputCard as Card.Dmps3DmInput;
|
||||||
|
|
||||||
var cecPort = hdmiInputCard.DmInputPort;
|
var cecPort = hdmiInputCard.DmInputPort;
|
||||||
|
|
||||||
AddInputPortWithDebug(number, string.Format("DmIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.DmCat, cecPort);
|
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)
|
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);
|
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;
|
var cecPort = hdmiOutputCard.HdmiOutputPort;
|
||||||
|
|
||||||
AddHdmiOutputPort(number, cecPort);
|
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)
|
else if (outputCard is Card.Dmps3HdmiOutputBackend)
|
||||||
{
|
{
|
||||||
var hdmiOutputCard = outputCard as Card.Dmps3HdmiOutputBackend;
|
var hdmiOutputCard = outputCard as Card.Dmps3HdmiOutputBackend;
|
||||||
|
|
||||||
var cecPort = hdmiOutputCard.HdmiOutputPort;
|
var cecPort = hdmiOutputCard.HdmiOutputPort;
|
||||||
|
|
||||||
AddHdmiOutputPort(number, cecPort);
|
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)
|
else if (outputCard is Card.Dmps3DmOutput)
|
||||||
{
|
{
|
||||||
AddDmOutputPort(number);
|
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)
|
else if (outputCard is Card.Dmps3DmOutputBackend)
|
||||||
{
|
{
|
||||||
AddDmOutputPort(number);
|
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)
|
else if (outputCard is Card.Dmps3ProgramOutput)
|
||||||
{
|
{
|
||||||
@@ -730,7 +859,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
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);
|
||||||
}
|
}
|
||||||
@@ -739,7 +868,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
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);
|
||||||
}
|
}
|
||||||
@@ -766,6 +895,10 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
AddAudioOnlyOutputPort(number, "Dialer");
|
AddAudioOnlyOutputPort(number, "Dialer");
|
||||||
}
|
}
|
||||||
|
else if (outputCard is Card.Dmps3AecOutput)
|
||||||
|
{
|
||||||
|
AddAudioOnlyOutputPort(number, "Aec");
|
||||||
|
}
|
||||||
else if (outputCard is Card.Dmps3DigitalMixOutput)
|
else if (outputCard is Card.Dmps3DigitalMixOutput)
|
||||||
{
|
{
|
||||||
if (number == (uint)CrestronControlSystem.eDmps34K250COutputs.Mix1
|
if (number == (uint)CrestronControlSystem.eDmps34K250COutputs.Mix1
|
||||||
@@ -776,10 +909,9 @@ namespace PepperDash.Essentials.DM
|
|||||||
|| number == (uint)CrestronControlSystem.eDmps34K300COutputs.Mix2
|
|| number == (uint)CrestronControlSystem.eDmps34K300COutputs.Mix2
|
||||||
|| number == (uint)CrestronControlSystem.eDmps34K350COutputs.Mix2)
|
|| number == (uint)CrestronControlSystem.eDmps34K350COutputs.Mix2)
|
||||||
AddAudioOnlyOutputPort(number, CrestronControlSystem.eDmps34K250COutputs.Mix2.ToString());
|
AddAudioOnlyOutputPort(number, CrestronControlSystem.eDmps34K250COutputs.Mix2.ToString());
|
||||||
}
|
|
||||||
else if (outputCard is Card.Dmps3AecOutput)
|
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);
|
||||||
AddAudioOnlyOutputPort(number, "Aec");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -851,6 +983,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
void Dmps_DMInputChange(Switch device, DMInputEventArgs args)
|
void Dmps_DMInputChange(Switch device, DMInputEventArgs args)
|
||||||
{
|
{
|
||||||
|
Debug.Console(2, this, "DMInputChange Input: {0} EventId: {1}", args.Number, args.EventId.ToString());
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
switch (args.EventId)
|
switch (args.EventId)
|
||||||
@@ -861,6 +994,12 @@ namespace PepperDash.Essentials.DM
|
|||||||
InputEndpointOnlineFeedbacks[args.Number].FireUpdate();
|
InputEndpointOnlineFeedbacks[args.Number].FireUpdate();
|
||||||
break;
|
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):
|
case (DMInputEventIds.VideoDetectedEventId):
|
||||||
{
|
{
|
||||||
Debug.Console(2, this, "DM Input {0} VideoDetectedEventId", args.Number);
|
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)
|
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)
|
if (args.EventId == DMOutputEventIds.OutputVuFeedBackEventId)
|
||||||
{
|
{
|
||||||
//Frequently called event that isn't needed
|
//Frequently called event that isn't needed
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Debug.Console(2, this, "DMOutputChange Output: {0} EventId: {1}", args.Number, args.EventId.ToString());
|
||||||
var output = args.Number;
|
var output = args.Number;
|
||||||
|
|
||||||
DMOutput outputCard = Dmps.SwitcherOutputs[output] as DMOutput;
|
DMOutput outputCard = Dmps.SwitcherOutputs[output] as DMOutput;
|
||||||
@@ -906,6 +1044,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
OutputEndpointOnlineFeedbacks[output].FireUpdate();
|
OutputEndpointOnlineFeedbacks[output].FireUpdate();
|
||||||
}
|
}
|
||||||
|
else if (args.EventId == DMOutputEventIds.EndpointOnlineEventId
|
||||||
|
&& OutputEndpointOnlineFeedbacks.ContainsKey(output))
|
||||||
|
{
|
||||||
|
OutputEndpointOnlineFeedbacks[output].FireUpdate();
|
||||||
|
}
|
||||||
else if (args.EventId == DMOutputEventIds.VideoOutEventId)
|
else if (args.EventId == DMOutputEventIds.VideoOutEventId)
|
||||||
{
|
{
|
||||||
if (outputCard != null && outputCard.VideoOutFeedback != null)
|
if (outputCard != null && outputCard.VideoOutFeedback != null)
|
||||||
@@ -920,41 +1063,68 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
OutputVideoRouteNameFeedbacks[output].FireUpdate();
|
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)
|
else if (args.EventId == DMOutputEventIds.AudioOutEventId)
|
||||||
{
|
{
|
||||||
try
|
if (!Global.ControlSystemIsDmps4k3xxType)
|
||||||
{
|
{
|
||||||
if (outputCard != null && outputCard.AudioOutFeedback != null)
|
if (outputCard != null && outputCard.AudioOutFeedback != null)
|
||||||
{
|
{
|
||||||
Debug.Console(2, this, "DMSwitchAudio:{0} Routed Input:{1} Output:{2}'", this.Name,
|
Debug.Console(2, this, "DMSwitchAudio:{0} Routed Input:{1} Output:{2}'", this.Name,
|
||||||
outputCard.AudioOutFeedback.Number, output);
|
outputCard.AudioOutFeedback.Number, output);
|
||||||
}
|
}
|
||||||
if (AudioOutputFeedbacks.ContainsKey(output))
|
|
||||||
{
|
|
||||||
AudioOutputFeedbacks[output].FireUpdate();
|
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
catch (NotSupportedException)
|
|
||||||
{
|
{
|
||||||
if (outputCard != null)
|
if (outputCard != null)
|
||||||
|
{
|
||||||
|
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,
|
Debug.Console(2, this, "DMSwitchAudio:{0} Routed Input:{1} Output:{2}'", Name,
|
||||||
outputCard.AudioOutSourceFeedback, output);
|
outputCard.AudioOutSourceFeedback, output);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (AudioOutputFeedbacks.ContainsKey(output))
|
if (AudioOutputFeedbacks.ContainsKey(output))
|
||||||
{
|
{
|
||||||
AudioOutputFeedbacks[output].FireUpdate();
|
AudioOutputFeedbacks[output].FireUpdate();
|
||||||
}
|
}
|
||||||
|
if (OutputAudioRouteNameFeedbacks.ContainsKey(output))
|
||||||
|
{
|
||||||
|
OutputAudioRouteNameFeedbacks[output].FireUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (args.EventId == DMOutputEventIds.OutputNameEventId
|
else if (args.EventId == DMOutputEventIds.OutputNameEventId
|
||||||
&& OutputNameFeedbacks.ContainsKey(output))
|
&& OutputNameFeedbacks.ContainsKey(output))
|
||||||
{
|
{
|
||||||
Debug.Console(2, this, "DM Output {0} NameFeedbackEventId", output);
|
|
||||||
OutputNameFeedbacks[output].FireUpdate();
|
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)
|
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);
|
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 input = inputSelector as DMInput;
|
||||||
var output = outputSelector as DMOutput;
|
var output = outputSelector as DMOutput;
|
||||||
|
|
||||||
@@ -1022,7 +1189,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
if (input == null || (input.Number <= Dmps.NumberOfSwitcherInputs && output.Number <= Dmps.NumberOfSwitcherOutputs &&
|
if (input == null || (input.Number <= Dmps.NumberOfSwitcherInputs && output.Number <= Dmps.NumberOfSwitcherOutputs &&
|
||||||
sigTypeIsUsbOrVideo) ||
|
sigTypeIsUsbOrVideo) ||
|
||||||
(input.Number <= Dmps.NumberOfSwitcherInputs + 5 && output.Number <= Dmps.NumberOfSwitcherOutputs &&
|
(input.Number <= (Dmps.NumberOfSwitcherInputs) && output.Number <= Dmps.NumberOfSwitcherOutputs &&
|
||||||
(sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio))
|
(sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio))
|
||||||
{
|
{
|
||||||
// Check to see if there's an off timer waiting on this and if so, cancel
|
// 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
|
// NOTE THAT BITWISE COMPARISONS - TO CATCH ALL ROUTING TYPES
|
||||||
if ((sigType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
|
if ((sigType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
|
||||||
{
|
{
|
||||||
@@ -1054,19 +1216,34 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
if ((sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
|
if ((sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
|
||||||
{
|
{
|
||||||
try
|
if (!Global.ControlSystemIsDmps4k3xxType)
|
||||||
{
|
{
|
||||||
output.AudioOut = input;
|
output.AudioOut = input;
|
||||||
}
|
}
|
||||||
catch (NotSupportedException)
|
else
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Routing input {0} audio to output {1}",
|
if (input == null)
|
||||||
(eDmps34KAudioOutSource) (input == null ? 0 : input.Number),
|
{
|
||||||
(CrestronControlSystem.eDmps34K350COutputs) output.Number);
|
output.AudioOutSource = eDmps34KAudioOutSource.NoRoute;
|
||||||
|
}
|
||||||
output.AudioOutSource = input == null
|
else if (input.CardInputOutputType == eCardInputOutputType.Dmps3AirMediaInput || input.CardInputOutputType == eCardInputOutputType.Dmps3AirMediaNoStreamingInput)
|
||||||
? eDmps34KAudioOutSource.NoRoute
|
{
|
||||||
: (eDmps34KAudioOutSource)input.Number;
|
//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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1099,12 +1276,93 @@ namespace PepperDash.Essentials.DM
|
|||||||
#region IRoutingNumeric Members
|
#region IRoutingNumeric Members
|
||||||
|
|
||||||
public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType sigType)
|
public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType sigType)
|
||||||
|
{
|
||||||
|
if (EnableRouting == false)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 input = inputSelector == 0 ? null : Dmps.SwitcherInputs[inputSelector];
|
||||||
var output = Dmps.SwitcherOutputs[outputSelector];
|
var output = Dmps.SwitcherOutputs[outputSelector];
|
||||||
|
|
||||||
ExecuteSwitch(input, output, sigType);
|
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
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<RoutingNumericEventArgs> NumericSwitchChange;
|
||||||
|
|
||||||
|
public Dictionary<uint, string> InputNames { get; set; }
|
||||||
|
public Dictionary<uint, string> OutputNames { get; set; }
|
||||||
|
|
||||||
|
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
||||||
|
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
||||||
|
|
||||||
|
public FeedbackCollection<BoolFeedback> VideoInputSyncFeedbacks { get; private set; }
|
||||||
|
public FeedbackCollection<IntFeedback> VideoOutputRouteFeedbacks { get; private set; }
|
||||||
|
public FeedbackCollection<IntFeedback> AudioOutputRouteFeedbacks { get; private set; }
|
||||||
|
public FeedbackCollection<StringFeedback> InputNameFeedbacks { get; private set; }
|
||||||
|
public FeedbackCollection<StringFeedback> OutputNameFeedbacks { get; private set; }
|
||||||
|
public FeedbackCollection<StringFeedback> OutputVideoRouteNameFeedbacks { get; private set; }
|
||||||
|
public FeedbackCollection<StringFeedback> 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<uint, string>();
|
||||||
|
if (props.InputNames != null)
|
||||||
|
{
|
||||||
|
InputNames = props.InputNames;
|
||||||
|
}
|
||||||
|
OutputNames = new Dictionary<uint, string>();
|
||||||
|
if (props.OutputNames != null)
|
||||||
|
{
|
||||||
|
OutputNames = props.OutputNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
DeviceNameFeedback = new StringFeedback(()=> Name);
|
||||||
|
|
||||||
|
VideoInputSyncFeedbacks = new FeedbackCollection<BoolFeedback>();
|
||||||
|
VideoOutputRouteFeedbacks = new FeedbackCollection<IntFeedback>();
|
||||||
|
AudioOutputRouteFeedbacks = new FeedbackCollection<IntFeedback>();
|
||||||
|
InputNameFeedbacks = new FeedbackCollection<StringFeedback>();
|
||||||
|
OutputNameFeedbacks = new FeedbackCollection<StringFeedback>();
|
||||||
|
OutputVideoRouteNameFeedbacks = new FeedbackCollection<StringFeedback>();
|
||||||
|
OutputAudioRouteNameFeedbacks = new FeedbackCollection<StringFeedback>();
|
||||||
|
|
||||||
|
InputPorts = new RoutingPortCollection<RoutingInputPort>();
|
||||||
|
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
|
||||||
|
|
||||||
|
//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
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Raise an event when the status of a switch object changes.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="e">Arguments defined as IKeyName sender, output, input, and eRoutingSignalType</param>
|
||||||
|
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<BoolFeedback>[] newFbs)
|
||||||
|
{
|
||||||
|
foreach (FeedbackCollection<BoolFeedback> fbCollection in newFbs)
|
||||||
|
{
|
||||||
|
foreach (var item in newFbs)
|
||||||
|
{
|
||||||
|
AddCollectionToList(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void AddCollectionsToList(params FeedbackCollection<IntFeedback>[] newFbs)
|
||||||
|
{
|
||||||
|
foreach (FeedbackCollection<IntFeedback> fbCollection in newFbs)
|
||||||
|
{
|
||||||
|
foreach (var item in newFbs)
|
||||||
|
{
|
||||||
|
AddCollectionToList(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddCollectionsToList(params FeedbackCollection<StringFeedback>[] newFbs)
|
||||||
|
{
|
||||||
|
foreach (FeedbackCollection<StringFeedback> fbCollection in newFbs)
|
||||||
|
{
|
||||||
|
foreach (var item in newFbs)
|
||||||
|
{
|
||||||
|
AddCollectionToList(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Add Collections
|
||||||
|
public void AddCollectionToList(FeedbackCollection<BoolFeedback> newFbs)
|
||||||
|
{
|
||||||
|
foreach (var f in newFbs)
|
||||||
|
{
|
||||||
|
if (f == null) continue;
|
||||||
|
|
||||||
|
AddFeedbackToList(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddCollectionToList(FeedbackCollection<IntFeedback> newFbs)
|
||||||
|
{
|
||||||
|
foreach (var f in newFbs)
|
||||||
|
{
|
||||||
|
if (f == null) continue;
|
||||||
|
|
||||||
|
AddFeedbackToList(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddCollectionToList(FeedbackCollection<StringFeedback> 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<DmChassisControllerJoinMap>(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<HdMd8xNController>
|
||||||
|
{
|
||||||
|
public HdMd8xNControllerFactory()
|
||||||
|
{
|
||||||
|
TypeNames = new List<string>() { "hdmd8x2", "hdmd8x1" };
|
||||||
|
}
|
||||||
|
|
||||||
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Factory Attempting to create new HD-MD-8xN Device");
|
||||||
|
|
||||||
|
var props = JsonConvert.DeserializeObject<DMChassisPropertiesConfig>(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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
using Crestron.SimplSharp.Ssh;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
||||||
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Core;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
namespace PepperDash.Essentials.DM
|
||||||
{
|
{
|
||||||
@@ -28,6 +30,30 @@ namespace PepperDash.Essentials.DM
|
|||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HDBaseTSink};
|
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {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<DmRmcControllerJoinMap>(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
|
#region IComPorts Members
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return Rmc.ComPorts; } }
|
public CrestronCollection<ComPort> ComPorts { get { return Rmc.ComPorts; } }
|
||||||
public int NumberOfComPorts { get { return Rmc.NumberOfComPorts; } }
|
public int NumberOfComPorts { get { return Rmc.NumberOfComPorts; } }
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.DM;
|
using Crestron.SimplSharpPro.DM;
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
||||||
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Core;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
namespace PepperDash.Essentials.DM
|
||||||
{
|
{
|
||||||
@@ -33,6 +35,30 @@ namespace PepperDash.Essentials.DM
|
|||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HdmiOut};
|
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {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<DmRmcControllerJoinMap>(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
|
#region IIROutputPorts Members
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
||||||
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
: base(key, name, device)
|
: base(key, name, device)
|
||||||
{
|
{
|
||||||
_rmc = device;
|
_rmc = device;
|
||||||
|
|
||||||
// if wired to a chassis, skip registration step in base class
|
// if wired to a chassis, skip registration step in base class
|
||||||
PreventRegistration = _rmc.DMOutput != null;
|
PreventRegistration = _rmc.DMOutput != null;
|
||||||
|
|
||||||
@@ -37,7 +38,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
DeviceInfo = new DeviceInfo();
|
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)
|
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"));
|
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;
|
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = rmc.Name;
|
||||||
if (rmc.VideoOutputResolutionFeedback != null)
|
if (rmc.VideoOutputResolutionFeedback != null)
|
||||||
rmc.VideoOutputResolutionFeedback.LinkInputSig(trilist.StringInput[joinMap.CurrentOutputResolution.JoinNumber]);
|
rmc.VideoOutputResolutionFeedback.LinkInputSig(trilist.StringInput[joinMap.CurrentOutputResolution.JoinNumber]);
|
||||||
@@ -187,7 +188,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract class DmHdBaseTControllerBase : CrestronGenericBaseDevice
|
public abstract class DmHdBaseTControllerBase : CrestronGenericBridgeableBaseDevice
|
||||||
{
|
{
|
||||||
protected HDBaseTBase Rmc;
|
protected HDBaseTBase Rmc;
|
||||||
|
|
||||||
@@ -330,24 +331,40 @@ namespace PepperDash.Essentials.DM
|
|||||||
var parentDev = DeviceManager.GetDeviceForKey(pKey);
|
var parentDev = DeviceManager.GetDeviceForKey(pKey);
|
||||||
if (parentDev is DmpsRoutingController)
|
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);
|
||||||
else
|
|
||||||
{
|
|
||||||
return GetDmRmcControllerForDmps(key, name, typeName, ipid, parentDev as DmpsRoutingController, props.ParentOutputNumber);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!(parentDev is IDmSwitch))
|
|
||||||
{
|
|
||||||
Debug.Console(0, "Cannot create DM device '{0}'. '{1}' is not a DM Chassis.",
|
|
||||||
key, pKey);
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
// Must use different constructor for DMPS4K types. No IPID
|
||||||
var chassis = (parentDev as IDmSwitch).Chassis;
|
if (Global.ControlSystemIsDmps4kType || typeName == "hdbasetrx" || typeName == "dmrmc4k100c1g")
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
else if (parentDev is DmChassisController)
|
||||||
|
{
|
||||||
|
var controller = parentDev as DmChassisController;
|
||||||
|
var chassis = controller.Chassis;
|
||||||
var num = props.ParentOutputNumber;
|
var num = props.ParentOutputNumber;
|
||||||
|
Debug.Console(1, "Creating DM Chassis device '{0}'. Output number '{1}'.", key, num);
|
||||||
|
|
||||||
if (num <= 0 || num > chassis.NumberOfOutputs)
|
if (num <= 0 || num > chassis.NumberOfOutputs)
|
||||||
{
|
{
|
||||||
@@ -355,8 +372,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
key, num);
|
key, num);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var controller = parentDev as IDmSwitch;
|
|
||||||
controller.RxDictionary.Add(num, key);
|
controller.RxDictionary.Add(num, key);
|
||||||
// Catch constructor failures, mainly dues to IPID
|
// Catch constructor failures, mainly dues to IPID
|
||||||
try
|
try
|
||||||
@@ -365,11 +380,22 @@ namespace PepperDash.Essentials.DM
|
|||||||
if (chassis is DmMd8x8Cpu3 || chassis is DmMd16x16Cpu3 ||
|
if (chassis is DmMd8x8Cpu3 || chassis is DmMd16x16Cpu3 ||
|
||||||
chassis is DmMd32x32Cpu3 || chassis is DmMd8x8Cpu3rps ||
|
chassis is DmMd32x32Cpu3 || chassis is DmMd8x8Cpu3rps ||
|
||||||
chassis is DmMd16x16Cpu3rps || chassis is DmMd32x32Cpu3rps ||
|
chassis is DmMd16x16Cpu3rps || chassis is DmMd32x32Cpu3rps ||
|
||||||
chassis is DmMd128x128 || chassis is DmMd64x64)
|
chassis is DmMd128x128 || chassis is DmMd64x64
|
||||||
|
|| typeName == "hdbasetrx" || typeName == "dmrmc4k100c1g")
|
||||||
{
|
{
|
||||||
return GetDmRmcControllerForCpu3Chassis(key, name, typeName, chassis, num, parentDev);
|
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);
|
return GetDmRmcControllerForCpu2Chassis(key, name, typeName, ipid, chassis, num, parentDev);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@@ -378,6 +404,13 @@ namespace PepperDash.Essentials.DM
|
|||||||
return null;
|
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,
|
private static CrestronGenericBaseDevice GetDmRmcControllerForCpu2Chassis(string key, string name, string typeName,
|
||||||
uint ipid, Switch chassis, uint num, IKeyed parentDev)
|
uint ipid, Switch chassis, uint num, IKeyed parentDev)
|
||||||
@@ -490,7 +523,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
var props = JsonConvert.DeserializeObject
|
var props = JsonConvert.DeserializeObject
|
||||||
<DmRmcPropertiesConfig>(dc.Properties.ToString());
|
<DmRmcPropertiesConfig>(dc.Properties.ToString());
|
||||||
return DmRmcHelper.GetDmRmcController(dc.Key, dc.Name, type, props);
|
return DmRmcHelper.GetDmRmcController(dc.Key, dc.Name, type, props);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -97,10 +97,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
/// <param name="key"></param>
|
/// <param name="key"></param>
|
||||||
/// <param name="name"></param>
|
/// <param name="name"></param>
|
||||||
/// <param name="tx"></param>
|
/// <param name="tx"></param>
|
||||||
public DmTx200Controller(string key, string name, DmTx200C2G tx)
|
public DmTx200Controller(string key, string name, DmTx200C2G tx, bool preventRegistration)
|
||||||
: base(key, name, tx)
|
: base(key, name, tx)
|
||||||
{
|
{
|
||||||
Tx = tx;
|
Tx = tx;
|
||||||
|
PreventRegistration = preventRegistration;
|
||||||
|
|
||||||
HdmiInput = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn,
|
HdmiInput = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn,
|
||||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi,
|
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi,
|
||||||
|
|||||||
@@ -100,10 +100,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
/// <param name="key"></param>
|
/// <param name="key"></param>
|
||||||
/// <param name="name"></param>
|
/// <param name="name"></param>
|
||||||
/// <param name="tx"></param>
|
/// <param name="tx"></param>
|
||||||
public DmTx201CController(string key, string name, DmTx201C tx)
|
public DmTx201CController(string key, string name, DmTx201C tx, bool preventRegistration)
|
||||||
: base(key, name, tx)
|
: base(key, name, tx)
|
||||||
{
|
{
|
||||||
Tx = tx;
|
Tx = tx;
|
||||||
|
PreventRegistration = preventRegistration;
|
||||||
|
|
||||||
HdmiInput = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn,
|
HdmiInput = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn,
|
||||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi,
|
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi,
|
||||||
|
|||||||
@@ -102,10 +102,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
/// <param name="key"></param>
|
/// <param name="key"></param>
|
||||||
/// <param name="name"></param>
|
/// <param name="name"></param>
|
||||||
/// <param name="tx"></param>
|
/// <param name="tx"></param>
|
||||||
public DmTx201SController(string key, string name, DmTx201S tx)
|
public DmTx201SController(string key, string name, DmTx201S tx, bool preventRegistration)
|
||||||
: base(key, name, tx)
|
: base(key, name, tx)
|
||||||
{
|
{
|
||||||
Tx = tx;
|
Tx = tx;
|
||||||
|
PreventRegistration = preventRegistration;
|
||||||
|
|
||||||
HdmiInput = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn,
|
HdmiInput = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn,
|
||||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi,
|
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi,
|
||||||
|
|||||||
@@ -111,10 +111,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
/// <param name="key"></param>
|
/// <param name="key"></param>
|
||||||
/// <param name="name"></param>
|
/// <param name="name"></param>
|
||||||
/// <param name="tx"></param>
|
/// <param name="tx"></param>
|
||||||
public DmTx401CController(string key, string name, DmTx401C tx)
|
public DmTx401CController(string key, string name, DmTx401C tx, bool preventRegistration)
|
||||||
: base(key, name, tx)
|
: base(key, name, tx)
|
||||||
{
|
{
|
||||||
Tx = tx;
|
Tx = tx;
|
||||||
|
PreventRegistration = preventRegistration;
|
||||||
|
|
||||||
HdmiIn = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn,
|
HdmiIn = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn,
|
||||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.HDMI, this,
|
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.HDMI, this,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using Crestron.SimplSharpPro.DM.Endpoints.Transmitters;
|
|||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
namespace PepperDash.Essentials.DM
|
||||||
{
|
{
|
||||||
@@ -20,14 +21,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
public RoutingInputPort HdmiIn { get; private set; }
|
public RoutingInputPort HdmiIn { get; private set; }
|
||||||
public RoutingOutputPort DmOut { 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; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Helps get the "real" inputs, including when in Auto
|
/// Helps get the "real" inputs, including when in Auto
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -70,11 +63,34 @@ namespace PepperDash.Essentials.DM
|
|||||||
HdmiIn.Port = Tx;
|
HdmiIn.Port = Tx;
|
||||||
|
|
||||||
PreventRegistration = true;
|
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)
|
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<HDBaseTTxControllerJoinMap>(joinMapSerialized);
|
||||||
|
|
||||||
|
this.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
|
||||||
|
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = this.Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
#region IIROutputPorts Members
|
||||||
|
|||||||
@@ -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)
|
: base(key, name, tx)
|
||||||
{
|
{
|
||||||
Tx = tx;
|
Tx = tx;
|
||||||
|
PreventRegistration = preventRegistration;
|
||||||
|
|
||||||
HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
|
HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
|
||||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
|
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
|
||||||
|
|||||||
@@ -102,10 +102,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
return new RoutingPortCollection<RoutingOutputPort> { DmOut, HdmiLoopOut };
|
return new RoutingPortCollection<RoutingOutputPort> { DmOut, HdmiLoopOut };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public DmTx4k302CController(string key, string name, DmTx4k302C tx)
|
public DmTx4k302CController(string key, string name, DmTx4k302C tx, bool preventRegistration)
|
||||||
: base(key, name, tx)
|
: base(key, name, tx)
|
||||||
{
|
{
|
||||||
Tx = tx;
|
Tx = tx;
|
||||||
|
PreventRegistration = preventRegistration;
|
||||||
|
|
||||||
HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
|
HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
|
||||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
|
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
|
||||||
|
|||||||
@@ -86,10 +86,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
return new RoutingPortCollection<RoutingOutputPort> { DmOut, HdmiLoopOut };
|
return new RoutingPortCollection<RoutingOutputPort> { DmOut, HdmiLoopOut };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public DmTx4kz202CController(string key, string name, DmTx4kz202C tx)
|
public DmTx4kz202CController(string key, string name, DmTx4kz202C tx, bool preventRegistration)
|
||||||
: base(key, name, tx)
|
: base(key, name, tx)
|
||||||
{
|
{
|
||||||
Tx = tx;
|
Tx = tx;
|
||||||
|
PreventRegistration = preventRegistration;
|
||||||
|
|
||||||
HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
|
HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
|
||||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
|
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
|
||||||
|
|||||||
@@ -91,10 +91,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
return new RoutingPortCollection<RoutingOutputPort> { DmOut, HdmiLoopOut };
|
return new RoutingPortCollection<RoutingOutputPort> { DmOut, HdmiLoopOut };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public DmTx4kz302CController(string key, string name, DmTx4kz302C tx)
|
public DmTx4kz302CController(string key, string name, DmTx4kz302C tx, bool preventRegistration)
|
||||||
: base(key, name, tx)
|
: base(key, name, tx)
|
||||||
{
|
{
|
||||||
Tx = tx;
|
Tx = tx;
|
||||||
|
PreventRegistration = preventRegistration;
|
||||||
|
|
||||||
HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
|
HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
|
||||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
|
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, eVst.Hdmi1, this,
|
||||||
|
|||||||
@@ -20,6 +20,63 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
public class DmTxHelper
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A factory method for various DmTxControllers
|
/// A factory method for various DmTxControllers
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -42,23 +99,21 @@ namespace PepperDash.Essentials.DM
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
if(typeName.StartsWith("dmtx200"))
|
if(typeName.StartsWith("dmtx200"))
|
||||||
return new DmTx200Controller(key, name, new DmTx200C2G(ipid, Global.ControlSystem));
|
return new DmTx200Controller(key, name, new DmTx200C2G(ipid, Global.ControlSystem), false);
|
||||||
if (typeName.StartsWith("dmtx4kz100"))
|
|
||||||
return new DmTx4kz100Controller(key, name, new DmTx4kz100C1G(ipid, Global.ControlSystem));
|
|
||||||
if (typeName.StartsWith("dmtx201c"))
|
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"))
|
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"))
|
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"))
|
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"))
|
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"))
|
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"))
|
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);
|
Debug.Console(0, "{1} WARNING: Cannot create DM-TX of type: '{0}'", typeName, key);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@@ -70,12 +125,12 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
var parentDev = DeviceManager.GetDeviceForKey(pKey);
|
var parentDev = DeviceManager.GetDeviceForKey(pKey);
|
||||||
DMInput dmInput;
|
DMInput dmInput;
|
||||||
bool isCpu3 = false;
|
BasicDmTxControllerBase tx;
|
||||||
|
|
||||||
if (parentDev is IDmSwitch)
|
if (parentDev is DmChassisController)
|
||||||
{
|
{
|
||||||
// Get the Crestron chassis and link stuff up
|
// Get the Crestron chassis and link stuff up
|
||||||
var switchDev = (parentDev as IDmSwitch);
|
var switchDev = (parentDev as DmChassisController);
|
||||||
var chassis = switchDev.Chassis;
|
var chassis = switchDev.Chassis;
|
||||||
|
|
||||||
//Check that the input is within range of this chassis' possible inputs
|
//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);
|
switchDev.TxDictionary.Add(num, key);
|
||||||
dmInput = chassis.Inputs[num];
|
dmInput = chassis.Inputs[num];
|
||||||
|
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
//Determine if IpId is needed for this chassis type
|
//Determine if IpId is needed for this chassis type
|
||||||
if (chassis is DmMd8x8Cpu3 || chassis is DmMd16x16Cpu3 ||
|
if (chassis is DmMd8x8Cpu3 || chassis is DmMd16x16Cpu3 ||
|
||||||
chassis is DmMd32x32Cpu3 || chassis is DmMd8x8Cpu3rps ||
|
chassis is DmMd32x32Cpu3 || chassis is DmMd8x8Cpu3rps ||
|
||||||
chassis is DmMd16x16Cpu3rps || chassis is DmMd32x32Cpu3rps ||
|
chassis is DmMd16x16Cpu3rps || chassis is DmMd32x32Cpu3rps ||
|
||||||
chassis is DmMd128x128 || chassis is DmMd64x64)
|
chassis is DmMd128x128 || chassis is DmMd64x64)
|
||||||
{
|
{
|
||||||
isCpu3 = true;
|
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)
|
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);
|
Debug.Console(0, "Cannot create DMPS device '{0}'. Input number '{1}' is not a DM input", key, num);
|
||||||
return null;
|
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
|
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);
|
Debug.Console(0, "Cannot create DM device '{0}'. '{1}' is not a processor, DM Chassis or DMPS.", key, pKey);
|
||||||
return null;
|
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)
|
protected DmTxControllerBase(string key, string name, EndpointTransmitterBase hardware)
|
||||||
: base(key, name, 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);
|
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)
|
protected DmTxControllerBase(string key, string name, DmHDBasedTEndPoint hardware) : base(key, name, hardware)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using Crestron.SimplSharp;
|
|||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Transmitters;
|
using Crestron.SimplSharpPro.DM.Endpoints.Transmitters;
|
||||||
|
using Crestron.SimplSharpPro.DM;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
@@ -26,6 +27,8 @@ namespace PepperDash.Essentials.DM
|
|||||||
public HDBaseTTxController(string key, string name, HDTx3CB tx)
|
public HDBaseTTxController(string key, string name, HDTx3CB tx)
|
||||||
: base(key, name, tx)
|
: base(key, name, tx)
|
||||||
{
|
{
|
||||||
|
PreventRegistration = true;
|
||||||
|
|
||||||
HdmiIn = new RoutingInputPort(DmPortName.HdmiIn1, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
HdmiIn = new RoutingInputPort(DmPortName.HdmiIn1, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
||||||
eRoutingPortConnectionType.Hdmi, null, this) { Port = tx };
|
eRoutingPortConnectionType.Hdmi, null, this) { Port = tx };
|
||||||
|
|
||||||
@@ -34,6 +37,21 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> { HdmiIn };
|
InputPorts = new RoutingPortCollection<RoutingInputPort> { HdmiIn };
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> { DmOut };
|
OutputPorts = new RoutingPortCollection<RoutingOutputPort> { 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
|
#region IRoutingInputs Members
|
||||||
@@ -79,7 +97,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
||||||
|
|
||||||
this.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
|
this.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
|
||||||
|
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = this.Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -101,6 +119,10 @@ namespace PepperDash.Essentials.DM
|
|||||||
JoinType = eJoinType.Digital
|
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 });
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Plugin device BridgeJoinMap constructor
|
/// Plugin device BridgeJoinMap constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -93,6 +93,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="AirMedia\AirMediaPropertiesConfig.cs" />
|
<Compile Include="AirMedia\AirMediaPropertiesConfig.cs" />
|
||||||
<Compile Include="AirMedia\AirMediaController.cs" />
|
<Compile Include="AirMedia\AirMediaController.cs" />
|
||||||
|
<Compile Include="Chassis\DmpsDigitalOutputController.cs" />
|
||||||
<Compile Include="Chassis\DmpsMicrophoneController.cs" />
|
<Compile Include="Chassis\DmpsMicrophoneController.cs" />
|
||||||
<Compile Include="Chassis\DmBladeChassisController.cs" />
|
<Compile Include="Chassis\DmBladeChassisController.cs" />
|
||||||
<Compile Include="Chassis\DmCardAudioOutput.cs" />
|
<Compile Include="Chassis\DmCardAudioOutput.cs" />
|
||||||
@@ -100,6 +101,7 @@
|
|||||||
<Compile Include="Chassis\DmpsAudioOutputController.cs" />
|
<Compile Include="Chassis\DmpsAudioOutputController.cs" />
|
||||||
<Compile Include="Chassis\DmpsInternalVirtualDmTxController.cs" />
|
<Compile Include="Chassis\DmpsInternalVirtualDmTxController.cs" />
|
||||||
<Compile Include="Chassis\DmpsRoutingController.cs" />
|
<Compile Include="Chassis\DmpsRoutingController.cs" />
|
||||||
|
<Compile Include="Chassis\HdMd8xNController.cs" />
|
||||||
<Compile Include="Chassis\HdMdNxM4kEBridgeableController.cs" />
|
<Compile Include="Chassis\HdMdNxM4kEBridgeableController.cs" />
|
||||||
<Compile Include="Chassis\HdMdNxM4kEController.cs" />
|
<Compile Include="Chassis\HdMdNxM4kEController.cs" />
|
||||||
<Compile Include="Config\InputPropertiesConfig.cs" />
|
<Compile Include="Config\InputPropertiesConfig.cs" />
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
Stack<CodecDirectory> DirectoryBrowseHistoryStack { get; }
|
Stack<CodecDirectory> DirectoryBrowseHistoryStack { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
get
|
get
|
||||||
{
|
{
|
||||||
var joinable = StartTime.AddMinutes(-MinutesBeforeMeeting) <= DateTime.Now
|
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);
|
//Debug.Console(2, "Meeting Id: {0} joinable: {1}", Id, joinable);
|
||||||
return joinable;
|
return joinable;
|
||||||
}
|
}
|
||||||
@@ -231,11 +231,23 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public eMeetingEventChangeType NotifiedChangeTypes { get; set; }
|
public eMeetingEventChangeType NotifiedChangeTypes { get; set; }
|
||||||
|
|
||||||
|
[JsonIgnore] private readonly int _joinableCooldownSeconds;
|
||||||
|
|
||||||
|
|
||||||
public Meeting()
|
public Meeting()
|
||||||
{
|
{
|
||||||
Calls = new List<Call>();
|
Calls = new List<Call>();
|
||||||
|
_joinableCooldownSeconds = 300;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Meeting(int joinableCooldownSeconds)
|
||||||
|
{
|
||||||
|
Calls = new List<Call>();
|
||||||
|
_joinableCooldownSeconds = joinableCooldownSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region Overrides of Object
|
#region Overrides of Object
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|||||||
@@ -56,9 +56,9 @@ namespace PepperDash.Essentials.Devices.Common.Environment.Somfy
|
|||||||
PulseOutput(OpenRelay, RelayPulseTime);
|
PulseOutput(OpenRelay, RelayPulseTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void StopOrPreset()
|
public override void Stop()
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Stopping or recalling preset on Shade: '{0}'", this.Name);
|
Debug.Console(1, this, "Stopping Shade: '{0}'", this.Name);
|
||||||
|
|
||||||
PulseOutput(StopOrPresetRelay, RelayPulseTime);
|
PulseOutput(StopOrPresetRelay, RelayPulseTime);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,7 +108,7 @@
|
|||||||
<Compile Include="Codec\eCodecCallStatus.cs" />
|
<Compile Include="Codec\eCodecCallStatus.cs" />
|
||||||
<Compile Include="Codec\eMeetingPrivacy.cs" />
|
<Compile Include="Codec\eMeetingPrivacy.cs" />
|
||||||
<Compile Include="Codec\iCodecAudio.cs" />
|
<Compile Include="Codec\iCodecAudio.cs" />
|
||||||
<Compile Include="VideoCodec\IConvertiblePreset.cs" />
|
<Compile Include="VideoCodec\ConvertiblePreset.cs" />
|
||||||
<Compile Include="Codec\IHasCallHold.cs" />
|
<Compile Include="Codec\IHasCallHold.cs" />
|
||||||
<Compile Include="Codec\IHasDoNotDisturb.cs" />
|
<Compile Include="Codec\IHasDoNotDisturb.cs" />
|
||||||
<Compile Include="Codec\IHasExternalSourceSwitching.cs" />
|
<Compile Include="Codec\IHasExternalSourceSwitching.cs" />
|
||||||
@@ -185,6 +185,7 @@
|
|||||||
<Compile Include="VideoCodec\MockVC\MockVC.cs" />
|
<Compile Include="VideoCodec\MockVC\MockVC.cs" />
|
||||||
<Compile Include="VideoCodec\CiscoCodec\xStatus.cs" />
|
<Compile Include="VideoCodec\CiscoCodec\xStatus.cs" />
|
||||||
<Compile Include="VideoCodec\VideoCodecBase.cs" />
|
<Compile Include="VideoCodec\VideoCodecBase.cs" />
|
||||||
|
<Compile Include="VideoCodec\ZoomRoom\IZoomWirelessShareInstructions.cs" />
|
||||||
<Compile Include="VideoCodec\ZoomRoom\ResponseObjects.cs" />
|
<Compile Include="VideoCodec\ZoomRoom\ResponseObjects.cs" />
|
||||||
<Compile Include="VideoCodec\ZoomRoom\ZoomRoom.cs" />
|
<Compile Include="VideoCodec\ZoomRoom\ZoomRoom.cs" />
|
||||||
<Compile Include="VideoCodec\ZoomRoom\ZoomRoomCamera.cs" />
|
<Compile Include="VideoCodec\ZoomRoom\ZoomRoomCamera.cs" />
|
||||||
|
|||||||
@@ -377,5 +377,70 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
return meetings;
|
return meetings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<Meeting> GetGenericMeetingsFromBookingResult(List<Booking> bookings, int joinableCooldownSeconds)
|
||||||
|
{
|
||||||
|
var meetings = new List<Meeting>();
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1023,7 +1023,7 @@ ConnectorID: {2}"
|
|||||||
if (tempPresets.Count > 0)
|
if (tempPresets.Count > 0)
|
||||||
{
|
{
|
||||||
// Create temporary list to store the existing items from the CiscoCodecStatus.RoomPreset collection
|
// Create temporary list to store the existing items from the CiscoCodecStatus.RoomPreset collection
|
||||||
var existingRoomPresets = new List<IConvertiblePreset>();
|
var existingRoomPresets = new List<CiscoCodecStatus.RoomPreset>();
|
||||||
// Add the existing items to the temporary list
|
// Add the existing items to the temporary list
|
||||||
existingRoomPresets.AddRange(CodecStatus.Status.RoomPreset);
|
existingRoomPresets.AddRange(CodecStatus.Status.RoomPreset);
|
||||||
// Populate the CodecStatus object (this will append new values to the RoomPreset collection
|
// Populate the CodecStatus object (this will append new values to the RoomPreset collection
|
||||||
@@ -1031,8 +1031,6 @@ ConnectorID: {2}"
|
|||||||
|
|
||||||
var jResponse = JObject.Parse(response);
|
var jResponse = JObject.Parse(response);
|
||||||
|
|
||||||
List<CiscoCodecStatus.RoomPreset> convertedRoomPresets =
|
|
||||||
existingRoomPresets.Select(a => (CiscoCodecStatus.RoomPreset) a).ToList();
|
|
||||||
|
|
||||||
IList<JToken> roomPresets = jResponse["Status"]["RoomPreset"].Children().ToList();
|
IList<JToken> 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.
|
// Iterate the new items in this response agains the temporary list. Overwrite any existing items and add new ones.
|
||||||
@@ -1041,7 +1039,7 @@ ConnectorID: {2}"
|
|||||||
var preset = camPreset as CiscoCodecStatus.RoomPreset;
|
var preset = camPreset as CiscoCodecStatus.RoomPreset;
|
||||||
if (preset == null) continue;
|
if (preset == null) continue;
|
||||||
// First fine the existing preset that matches the id
|
// First fine the existing preset that matches the id
|
||||||
var existingPreset = convertedRoomPresets.FirstOrDefault(p => p.id.Equals(preset.id));
|
var existingPreset = existingRoomPresets.FirstOrDefault(p => p.id.Equals(preset.id));
|
||||||
if (existingPreset != null)
|
if (existingPreset != null)
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Existing Room Preset with ID: {0} found. Updating.", existingPreset.id);
|
Debug.Console(1, this, "Existing Room Preset with ID: {0} found. Updating.", existingPreset.id);
|
||||||
@@ -1073,7 +1071,7 @@ ConnectorID: {2}"
|
|||||||
CodecStatus.Status.RoomPreset = existingRoomPresets;
|
CodecStatus.Status.RoomPreset = existingRoomPresets;
|
||||||
|
|
||||||
// Generecise the list
|
// Generecise the list
|
||||||
NearEndPresets = existingRoomPresets.GetGenericPresets<CodecRoomPreset>();
|
NearEndPresets = existingRoomPresets.GetGenericPresets<CiscoCodecStatus.RoomPreset, CodecRoomPreset>();
|
||||||
|
|
||||||
var handler = CodecRoomPresetsListHasChanged;
|
var handler = CodecRoomPresetsListHasChanged;
|
||||||
if (handler != null)
|
if (handler != null)
|
||||||
|
|||||||
@@ -32,12 +32,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="presets"></param>
|
/// <param name="presets"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static List<T> GetGenericPresets<T>(this List<IConvertiblePreset> presets)
|
public static List<TDestination> GetGenericPresets<TSource, TDestination>(this List<TSource> presets) where TSource : ConvertiblePreset where TDestination : PresetBase
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
presets.Select(preset => preset.ConvertCodecPreset())
|
presets.Select(preset => preset.ConvertCodecPreset())
|
||||||
.Where(newPreset => newPreset != null)
|
.Where(newPreset => newPreset != null)
|
||||||
.Cast<T>()
|
.Cast<TDestination>()
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2186,7 +2186,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class RoomPreset : IConvertiblePreset
|
public class RoomPreset : ConvertiblePreset
|
||||||
{
|
{
|
||||||
public string id { get; set; }
|
public string id { get; set; }
|
||||||
public Defined Defined { get; set; }
|
public Defined Defined { get; set; }
|
||||||
@@ -2200,7 +2200,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
Type = new Type5();
|
Type = new Type5();
|
||||||
}
|
}
|
||||||
|
|
||||||
public PresetBase ConvertCodecPreset()
|
public override PresetBase ConvertCodecPreset()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -2240,7 +2240,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
public Proximity Proximity { get; set; }
|
public Proximity Proximity { get; set; }
|
||||||
public RoomAnalytics RoomAnalytics { get; set; }
|
public RoomAnalytics RoomAnalytics { get; set; }
|
||||||
|
|
||||||
public List<IConvertiblePreset> RoomPreset { get; set; }
|
public List<RoomPreset> RoomPreset { get; set; }
|
||||||
|
|
||||||
public SIP SIP { get; set; }
|
public SIP SIP { get; set; }
|
||||||
public Security Security { get; set; }
|
public Security Security { get; set; }
|
||||||
@@ -2257,7 +2257,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
Standby = new Standby();
|
Standby = new Standby();
|
||||||
Cameras = new Cameras();
|
Cameras = new Cameras();
|
||||||
RoomAnalytics = new RoomAnalytics();
|
RoomAnalytics = new RoomAnalytics();
|
||||||
RoomPreset = new List<IConvertiblePreset>();
|
RoomPreset = new List<RoomPreset>();
|
||||||
Conference = new Conference2();
|
Conference = new Conference2();
|
||||||
SystemUnit = new SystemUnit();
|
SystemUnit = new SystemUnit();
|
||||||
Video = new Video();
|
Video = new Video();
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||||
{
|
{
|
||||||
public interface IConvertiblePreset
|
public abstract class ConvertiblePreset
|
||||||
{
|
{
|
||||||
PresetBase ConvertCodecPreset();
|
public abstract PresetBase ConvertCodecPreset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,25 +22,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
void MinMaxLayoutToggle();
|
void MinMaxLayoutToggle();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Defines the required elements for layout control with direct layout selection
|
|
||||||
/// </summary>
|
|
||||||
public interface IHasCodecLayoutsAvailable : IHasCodecLayouts
|
|
||||||
{
|
|
||||||
|
|
||||||
event EventHandler<AvailableLayoutChangedEventArgs> AvailableLayoutsChanged;
|
|
||||||
|
|
||||||
StringFeedback AvailableLocalLayoutsFeedback { get; }
|
|
||||||
List<CodecCommandWithLabel> AvailableLocalLayouts { get; }
|
|
||||||
void LocalLayoutSet(string layout);
|
|
||||||
void LocalLayoutSet(CodecCommandWithLabel layout);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class AvailableLayoutChangedEventArgs : EventArgs
|
|
||||||
{
|
|
||||||
public List<CodecCommandWithLabel> AvailableLayouts { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines the requirements for Zoom Room layout control
|
/// Defines the requirements for Zoom Room layout control
|
||||||
|
|||||||
@@ -44,9 +44,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
|||||||
public Boolean IsLocked { get; private set; }
|
public Boolean IsLocked { get; private set; }
|
||||||
[JsonProperty("isRecording", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("isRecording", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public Boolean IsRecording { get; private set; }
|
public Boolean IsRecording { get; private set; }
|
||||||
|
[JsonProperty("canRecord", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public Boolean CanRecord { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
public MeetingInfo(string id, string name, string host, string password, string shareStatus, bool isHost, bool isSharingMeeting, bool waitingForHost, bool isLocked, bool isRecording)
|
public MeetingInfo(string id, string name, string host, string password, string shareStatus, bool isHost, bool isSharingMeeting, bool waitingForHost, bool isLocked, bool isRecording, bool canRecord)
|
||||||
{
|
{
|
||||||
Id = id;
|
Id = id;
|
||||||
Name = name;
|
Name = name;
|
||||||
@@ -58,6 +60,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
|||||||
WaitingForHost = waitingForHost;
|
WaitingForHost = waitingForHost;
|
||||||
IsLocked = isLocked;
|
IsLocked = isLocked;
|
||||||
IsRecording = isRecording;
|
IsRecording = isRecording;
|
||||||
|
CanRecord = CanRecord;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
public interface IHasPresentationOnlyMeeting
|
public interface IHasPresentationOnlyMeeting
|
||||||
{
|
{
|
||||||
void StartSharingOnlyMeeting();
|
void StartSharingOnlyMeeting();
|
||||||
void StartSharingOnlyMeeting(eSharingMeetingMode mode);
|
void StartSharingOnlyMeeting(eSharingMeetingMode displayMode);
|
||||||
void StartSharingOnlyMeeting(eSharingMeetingMode mode, ushort duration);
|
void StartSharingOnlyMeeting(eSharingMeetingMode displayMode, uint duration);
|
||||||
void StartSharingOnlyMeeting(eSharingMeetingMode mode, ushort duration, string password);
|
void StartSharingOnlyMeeting(eSharingMeetingMode displayMode, uint duration, string password);
|
||||||
void StartNormalMeetingFromSharingOnlyMeeting();
|
void StartNormalMeetingFromSharingOnlyMeeting();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp.CrestronIO;
|
using Crestron.SimplSharp.CrestronIO;
|
||||||
|
using Crestron.SimplSharp.Reflection;
|
||||||
using Crestron.SimplSharp.Ssh;
|
using Crestron.SimplSharp.Ssh;
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
@@ -10,6 +11,7 @@ using PepperDash.Core;
|
|||||||
using PepperDash.Core.Intersystem;
|
using PepperDash.Core.Intersystem;
|
||||||
using PepperDash.Core.Intersystem.Tokens;
|
using PepperDash.Core.Intersystem.Tokens;
|
||||||
using PepperDash.Core.WebApi.Presets;
|
using PepperDash.Core.WebApi.Presets;
|
||||||
|
using Crestron.SimplSharp.Reflection;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
@@ -30,6 +32,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
private const int XSigEncoding = 28591;
|
private const int XSigEncoding = 28591;
|
||||||
protected const int MaxParticipants = 50;
|
protected const int MaxParticipants = 50;
|
||||||
private readonly byte[] _clearBytes = XSigHelpers.ClearOutputs();
|
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)
|
protected VideoCodecBase(DeviceConfig config)
|
||||||
: base(config)
|
: base(config)
|
||||||
{
|
{
|
||||||
@@ -213,6 +224,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
handler(this, new CodecCallStatusItemChangeEventArgs(item));
|
handler(this, new CodecCallStatusItemChangeEventArgs(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PrivacyModeIsOnFeedback.FireUpdate();
|
||||||
|
|
||||||
if (AutoShareContentWhileInCall)
|
if (AutoShareContentWhileInCall)
|
||||||
{
|
{
|
||||||
StartSharing();
|
StartSharing();
|
||||||
@@ -370,10 +383,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
LinkVideoCodecCameraLayoutsToApi(codec as IHasCodecLayouts, trilist, joinMap);
|
LinkVideoCodecCameraLayoutsToApi(codec as IHasCodecLayouts, trilist, joinMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (codec is IHasCodecLayoutsAvailable)
|
|
||||||
{
|
|
||||||
LinkVideoCodecAvailableLayoutsToApi(codec as IHasCodecLayoutsAvailable, trilist, joinMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (codec is IHasSelfviewPosition)
|
if (codec is IHasSelfviewPosition)
|
||||||
{
|
{
|
||||||
@@ -462,10 +471,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
}
|
}
|
||||||
|
|
||||||
SharingContentIsOnFeedback.FireUpdate();
|
SharingContentIsOnFeedback.FireUpdate();
|
||||||
|
|
||||||
trilist.SetBool(joinMap.HookState.JoinNumber, IsInCall);
|
|
||||||
|
|
||||||
trilist.SetString(joinMap.CurrentCallData.JoinNumber, UpdateCallStatusXSig());
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -792,7 +797,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
trilist.SetSigFalseAction(joinMap.SourceShareStart.JoinNumber, StartSharing);
|
trilist.SetSigFalseAction(joinMap.SourceShareStart.JoinNumber, StartSharing);
|
||||||
trilist.SetSigFalseAction(joinMap.SourceShareEnd.JoinNumber, StopSharing);
|
trilist.SetSigFalseAction(joinMap.SourceShareEnd.JoinNumber, StopSharing);
|
||||||
|
|
||||||
trilist.SetBoolSigAction(joinMap.SourceShareAutoStart.JoinNumber, (b) => AutoShareContentWhileInCall = b);
|
trilist.SetBoolSigAction(joinMap.SourceShareAutoStart.JoinNumber, b => AutoShareContentWhileInCall = b);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Meeting> _currentMeetings = new List<Meeting>();
|
private List<Meeting> _currentMeetings = new List<Meeting>();
|
||||||
@@ -806,35 +811,22 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
codec.CodecSchedule.MeetingWarningMinutes = i;
|
codec.CodecSchedule.MeetingWarningMinutes = i;
|
||||||
});
|
});
|
||||||
|
|
||||||
trilist.SetSigFalseAction(joinMap.DialMeeting1.JoinNumber, () =>
|
|
||||||
{
|
|
||||||
var mtg = 1;
|
|
||||||
var index = mtg - 1;
|
|
||||||
Debug.Console(1, this, "Meeting {0} Selected (EISC dig-o{1}) > _currentMeetings[{2}].Id: {3}, Title: {4}",
|
|
||||||
mtg, joinMap.DialMeeting1.JoinNumber, index, _currentMeetings[index].Id, _currentMeetings[index].Title);
|
|
||||||
if (_currentMeetings[index] != null)
|
|
||||||
Dial(_currentMeetings[index]);
|
|
||||||
});
|
|
||||||
|
|
||||||
trilist.SetSigFalseAction(joinMap.DialMeeting2.JoinNumber, () =>
|
for (uint i = 0; i < joinMap.DialMeetingStart.JoinSpan; i++)
|
||||||
{
|
{
|
||||||
var mtg = 2;
|
Debug.Console(1, this, "Setting action to Dial Meeting {0} to digital join {1}", i + 1, joinMap.DialMeetingStart.JoinNumber + i);
|
||||||
var index = mtg - 1;
|
var joinNumber = joinMap.DialMeetingStart.JoinNumber + i;
|
||||||
Debug.Console(1, this, "Meeting {0} Selected (EISC dig-o{1}) > _currentMeetings[{2}].Id: {3}, Title: {4}",
|
var mtg = i + 1;
|
||||||
mtg, joinMap.DialMeeting2.JoinNumber, index, _currentMeetings[index].Id, _currentMeetings[index].Title);
|
var index = (int)i;
|
||||||
if (_currentMeetings[index] != null)
|
|
||||||
Dial(_currentMeetings[index]);
|
|
||||||
});
|
|
||||||
|
|
||||||
trilist.SetSigFalseAction(joinMap.DialMeeting3.JoinNumber, () =>
|
trilist.SetSigFalseAction(joinNumber, () =>
|
||||||
{
|
{
|
||||||
var mtg = 3;
|
|
||||||
var index = mtg - 1;
|
|
||||||
Debug.Console(1, this, "Meeting {0} Selected (EISC dig-o{1}) > _currentMeetings[{2}].Id: {3}, Title: {4}",
|
Debug.Console(1, this, "Meeting {0} Selected (EISC dig-o{1}) > _currentMeetings[{2}].Id: {3}, Title: {4}",
|
||||||
mtg, joinMap.DialMeeting3.JoinNumber, index, _currentMeetings[index].Id, _currentMeetings[index].Title);
|
mtg, joinMap.DialMeetingStart.JoinNumber + i, index, _currentMeetings[index].Id, _currentMeetings[index].Title);
|
||||||
if (_currentMeetings[index] != null)
|
if (_currentMeetings[index] != null)
|
||||||
Dial(_currentMeetings[index]);
|
Dial(_currentMeetings[index]);
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
codec.CodecSchedule.MeetingsListHasChanged += (sender, args) => UpdateMeetingsList(codec, trilist, joinMap);
|
codec.CodecSchedule.MeetingsListHasChanged += (sender, args) => UpdateMeetingsList(codec, trilist, joinMap);
|
||||||
codec.CodecSchedule.MeetingEventChange += (sender, args) =>
|
codec.CodecSchedule.MeetingEventChange += (sender, args) =>
|
||||||
@@ -845,7 +837,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO [ ] hotfix/videocodecbase-max-meeting-xsig-set
|
|
||||||
trilist.SetUShortSigAction(joinMap.MeetingsToDisplay.JoinNumber, m => MeetingsToDisplay = m);
|
trilist.SetUShortSigAction(joinMap.MeetingsToDisplay.JoinNumber, m => MeetingsToDisplay = m);
|
||||||
MeetingsToDisplayFeedback.LinkInputSig(trilist.UShortInput[joinMap.MeetingsToDisplay.JoinNumber]);
|
MeetingsToDisplayFeedback.LinkInputSig(trilist.UShortInput[joinMap.MeetingsToDisplay.JoinNumber]);
|
||||||
|
|
||||||
@@ -954,13 +945,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
//serials
|
//serials
|
||||||
tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, meeting.Organizer);
|
tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, meeting.Organizer);
|
||||||
tokenArray[stringIndex + 1] = new XSigSerialToken(stringIndex + 2, meeting.Title);
|
tokenArray[stringIndex + 1] = new XSigSerialToken(stringIndex + 2, meeting.Title);
|
||||||
tokenArray[stringIndex + 2] = new XSigSerialToken(stringIndex + 3, meeting.StartTime.ToString("t", Global.Culture));
|
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("t", 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("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("t", 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);
|
tokenArray[stringIndex + 6] = new XSigSerialToken(stringIndex + 7, meeting.Id);
|
||||||
|
|
||||||
|
|
||||||
digitalIndex += maxDigitals;
|
digitalIndex += maxDigitals;
|
||||||
meetingIndex += offset;
|
meetingIndex += offset;
|
||||||
stringIndex += maxStrings;
|
stringIndex += maxStrings;
|
||||||
@@ -992,6 +982,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
return GetXSigString(tokenArray);
|
return GetXSigString(tokenArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void LinkVideoCodecDirectoryToApi(IHasDirectory codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
private void LinkVideoCodecDirectoryToApi(IHasDirectory codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
||||||
{
|
{
|
||||||
codec.CurrentDirectoryResultIsNotDirectoryRoot.LinkComplementInputSig(
|
codec.CurrentDirectoryResultIsNotDirectoryRoot.LinkComplementInputSig(
|
||||||
@@ -1001,6 +992,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
trilist.SetUShortSigAction(joinMap.DirectorySelectRow.JoinNumber, (i) => SelectDirectoryEntry(codec, i, trilist, joinMap));
|
trilist.SetUShortSigAction(joinMap.DirectorySelectRow.JoinNumber, (i) => SelectDirectoryEntry(codec, i, trilist, joinMap));
|
||||||
|
|
||||||
|
//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
|
// Report feedback for number of contact methods for selected contact
|
||||||
|
|
||||||
trilist.SetSigFalseAction(joinMap.DirectoryRoot.JoinNumber, codec.SetCurrentDirectoryToRoot);
|
trilist.SetSigFalseAction(joinMap.DirectoryRoot.JoinNumber, codec.SetCurrentDirectoryToRoot);
|
||||||
@@ -1015,7 +1010,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
|
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
|
||||||
Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
|
Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
|
||||||
var directoryXSig = UpdateDirectoryXSig(codec.DirectoryRoot, !codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue);
|
var directoryXSig = UpdateDirectoryXSig(codec.DirectoryRoot,
|
||||||
|
codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
|
||||||
|
|
||||||
Debug.Console(2, this, "Directory XSig Length: {0}", directoryXSig.Length);
|
Debug.Console(2, this, "Directory XSig Length: {0}", directoryXSig.Length);
|
||||||
|
|
||||||
@@ -1030,8 +1026,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
|
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
|
||||||
Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
|
Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
|
||||||
var directoryXSig = UpdateDirectoryXSig(args.Directory, !codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue);
|
var directoryXSig = UpdateDirectoryXSig(args.Directory,
|
||||||
|
codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
|
||||||
Debug.Console(2, this, "Directory XSig Length: {0}", directoryXSig.Length);
|
Debug.Console(2, this, "Directory XSig Length: {0}", directoryXSig.Length);
|
||||||
|
|
||||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber, directoryXSig);
|
trilist.SetString(joinMap.DirectoryEntries.JoinNumber, directoryXSig);
|
||||||
@@ -1041,20 +1037,21 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
{
|
{
|
||||||
if (!args.DeviceOnLine) return;
|
if (!args.DeviceOnLine) return;
|
||||||
|
|
||||||
// TODO [ ] Issue #868
|
var clearBytes = XSigHelpers.ClearOutputs();
|
||||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber, "\xFC");
|
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
|
||||||
UpdateDirectoryXSig(codec.CurrentDirectoryResult,
|
Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
|
||||||
!codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue);
|
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)
|
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)
|
if (_selectedDirectoryItem is DirectoryFolder)
|
||||||
@@ -1066,6 +1063,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
trilist.ClearUShortSigAction(joinMap.SelectContactMethod.JoinNumber);
|
trilist.ClearUShortSigAction(joinMap.SelectContactMethod.JoinNumber);
|
||||||
trilist.ClearBoolSigAction(joinMap.DirectoryDialSelectedLine.JoinNumber);
|
trilist.ClearBoolSigAction(joinMap.DirectoryDialSelectedLine.JoinNumber);
|
||||||
trilist.ClearBoolSigAction(joinMap.DirectoryDialSelectedContactMethod.JoinNumber);
|
trilist.ClearBoolSigAction(joinMap.DirectoryDialSelectedContactMethod.JoinNumber);
|
||||||
|
trilist.SetBool(joinMap.DirectoryEntryIsContact.JoinNumber, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1073,12 +1071,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
trilist.SetString(joinMap.DirectorySelectedFolderName.JoinNumber, string.Empty);
|
trilist.SetString(joinMap.DirectorySelectedFolderName.JoinNumber, string.Empty);
|
||||||
|
|
||||||
var selectedContact = _selectedDirectoryItem as DirectoryContact;
|
var selectedContact = _selectedDirectoryItem as DirectoryContact;
|
||||||
if (selectedContact != null)
|
|
||||||
{
|
|
||||||
trilist.SetString(joinMap.DirectoryEntrySelectedName.JoinNumber, selectedContact.Name);
|
|
||||||
|
|
||||||
|
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
|
// Allow auto dial of selected line. Always dials first contact method
|
||||||
if (!trilist.GetBool(joinMap.DirectoryDisableAutoDialSelectedLine.JoinNumber))
|
if (!trilist.GetBool(joinMap.DirectoryDisableAutoDialSelectedLine.JoinNumber))
|
||||||
{
|
{
|
||||||
@@ -1092,12 +1093,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
var entryToDial = _selectedDirectoryItem as DirectoryContact;
|
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;
|
if (entryToDial == null) return;
|
||||||
|
|
||||||
Dial(entryToDial.ContactMethods[0].Number);
|
Dial(entryToDial.ContactMethods[0].Number);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1185,32 +1186,44 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
private string UpdateDirectoryXSig(CodecDirectory directory, bool isRoot)
|
private string UpdateDirectoryXSig(CodecDirectory directory, bool isRoot)
|
||||||
{
|
{
|
||||||
var contactIndex = 1;
|
var xSigMaxIndex = 1023;
|
||||||
var tokenArray = new XSigToken[directory.CurrentDirectoryResults.Count];
|
var tokenArray = new XSigToken[directory.CurrentDirectoryResults.Count > xSigMaxIndex
|
||||||
|
? xSigMaxIndex
|
||||||
|
: directory.CurrentDirectoryResults.Count];
|
||||||
|
|
||||||
Debug.Console(2, this, "Is root {0} Directory Count: {1}", isRoot, directory.CurrentDirectoryResults.Count);
|
Debug.Console(2, this, "IsRoot: {0}, Directory Count: {1}, TokenArray.Length: {2}", isRoot,
|
||||||
|
directory.CurrentDirectoryResults.Count, tokenArray.Length);
|
||||||
|
|
||||||
foreach (var entry in directory.CurrentDirectoryResults)
|
var contacts = directory.CurrentDirectoryResults.Count > xSigMaxIndex
|
||||||
|
? directory.CurrentDirectoryResults.Take(xSigMaxIndex)
|
||||||
|
: directory.CurrentDirectoryResults;
|
||||||
|
|
||||||
|
var counterIndex = 1;
|
||||||
|
foreach (var entry in contacts)
|
||||||
{
|
{
|
||||||
var arrayIndex = contactIndex - 1;
|
var arrayIndex = counterIndex - 1;
|
||||||
|
var entryIndex = counterIndex;
|
||||||
|
|
||||||
Debug.Console(2, this, "Entry Name: {0}, Folder ID: {1}", entry.Name, entry.FolderId);
|
Debug.Console(2, this, "Entry{2:0000} Name: {0}, Folder ID: {1}", entry.Name, entry.FolderId, entryIndex);
|
||||||
|
|
||||||
if (entry is DirectoryFolder && entry.ParentFolderId == "root")
|
if (entry is DirectoryFolder && entry.ParentFolderId == "root")
|
||||||
{
|
{
|
||||||
tokenArray[arrayIndex] = new XSigSerialToken(contactIndex, String.Format("[+] {0}", entry.Name));
|
tokenArray[arrayIndex] = new XSigSerialToken(entryIndex, String.Format("[+] {0}", entry.Name));
|
||||||
|
|
||||||
contactIndex++;
|
counterIndex++;
|
||||||
|
counterIndex++;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
tokenArray[arrayIndex] = new XSigSerialToken(contactIndex, entry.Name);
|
tokenArray[arrayIndex] = new XSigSerialToken(entryIndex, entry.Name);
|
||||||
|
|
||||||
contactIndex++;
|
counterIndex++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return GetXSigString(tokenArray);
|
return GetXSigString(tokenArray);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LinkVideoCodecCallControlsToApi(BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
private void LinkVideoCodecCallControlsToApi(BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
||||||
@@ -1351,9 +1364,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
{
|
{
|
||||||
if (!args.DeviceOnLine) return;
|
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");
|
trilist.SetString(joinMap.CurrentCallData.JoinNumber, "\xFC");
|
||||||
UpdateCallStatusXSig();
|
trilist.SetString(joinMap.CurrentCallData.JoinNumber, UpdateCallStatusXSig());
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1378,11 +1393,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
tokenArray[digitalIndex + 1] = new XSigDigitalToken(digitalIndex + 2, call.IsOnHold);
|
tokenArray[digitalIndex + 1] = new XSigDigitalToken(digitalIndex + 2, call.IsOnHold);
|
||||||
|
|
||||||
//serials
|
//serials
|
||||||
tokenArray[arrayIndex + 1] = new XSigSerialToken(stringIndex + 1, call.Name ?? String.Empty);
|
tokenArray[arrayIndex] = new XSigSerialToken(stringIndex + 1, call.Name ?? String.Empty);
|
||||||
tokenArray[arrayIndex + 2] = new XSigSerialToken(stringIndex + 2, call.Number ?? String.Empty);
|
tokenArray[arrayIndex + 1] = new XSigSerialToken(stringIndex + 2, call.Number ?? String.Empty);
|
||||||
tokenArray[arrayIndex + 3] = new XSigSerialToken(stringIndex + 3, call.Direction.ToString());
|
tokenArray[arrayIndex + 2] = new XSigSerialToken(stringIndex + 3, call.Direction.ToString());
|
||||||
tokenArray[arrayIndex + 4] = new XSigSerialToken(stringIndex + 4, call.Type.ToString());
|
tokenArray[arrayIndex + 3] = new XSigSerialToken(stringIndex + 4, call.Type.ToString());
|
||||||
tokenArray[arrayIndex + 5] = new XSigSerialToken(stringIndex + 5, call.Status.ToString());
|
tokenArray[arrayIndex + 4] = new XSigSerialToken(stringIndex + 5, call.Status.ToString());
|
||||||
if(call.Duration != null)
|
if(call.Duration != null)
|
||||||
{
|
{
|
||||||
// May need to verify correct string format here
|
// May need to verify correct string format here
|
||||||
@@ -1392,9 +1407,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
arrayIndex += offset;
|
arrayIndex += offset;
|
||||||
stringIndex += maxStrings;
|
stringIndex += maxStrings;
|
||||||
digitalIndex++;
|
digitalIndex += maxDigitals;
|
||||||
}
|
}
|
||||||
while (digitalIndex < maxCalls)
|
while (arrayIndex < maxCalls * offset)
|
||||||
{
|
{
|
||||||
//digitals
|
//digitals
|
||||||
tokenArray[digitalIndex] = new XSigDigitalToken(digitalIndex + 1, false);
|
tokenArray[digitalIndex] = new XSigDigitalToken(digitalIndex + 1, false);
|
||||||
@@ -1402,16 +1417,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
|
|
||||||
//serials
|
//serials
|
||||||
tokenArray[arrayIndex + 1] = new XSigSerialToken(stringIndex + 1, String.Empty);
|
tokenArray[arrayIndex] = new XSigSerialToken(stringIndex + 1, String.Empty);
|
||||||
tokenArray[arrayIndex + 2] = new XSigSerialToken(stringIndex + 2, String.Empty);
|
tokenArray[arrayIndex + 1] = new XSigSerialToken(stringIndex + 2, String.Empty);
|
||||||
tokenArray[arrayIndex + 3] = new XSigSerialToken(stringIndex + 3, String.Empty);
|
tokenArray[arrayIndex + 2] = new XSigSerialToken(stringIndex + 3, String.Empty);
|
||||||
tokenArray[arrayIndex + 4] = new XSigSerialToken(stringIndex + 4, String.Empty);
|
tokenArray[arrayIndex + 3] = new XSigSerialToken(stringIndex + 4, String.Empty);
|
||||||
tokenArray[arrayIndex + 5] = new XSigSerialToken(stringIndex + 5, String.Empty);
|
tokenArray[arrayIndex + 4] = new XSigSerialToken(stringIndex + 5, String.Empty);
|
||||||
tokenArray[arrayIndex + 6] = new XSigSerialToken(stringIndex + 6, String.Empty);
|
tokenArray[arrayIndex + 5] = new XSigSerialToken(stringIndex + 6, String.Empty);
|
||||||
|
|
||||||
arrayIndex += offset;
|
arrayIndex += offset;
|
||||||
stringIndex += maxStrings;
|
stringIndex += maxStrings;
|
||||||
digitalIndex++;
|
digitalIndex += maxDigitals;
|
||||||
}
|
}
|
||||||
|
|
||||||
return GetXSigString(tokenArray);
|
return GetXSigString(tokenArray);
|
||||||
@@ -1476,14 +1491,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
codec.LocalLayoutFeedback.LinkInputSig(trilist.StringInput[joinMap.CurrentLayoutStringFb.JoinNumber]);
|
codec.LocalLayoutFeedback.LinkInputSig(trilist.StringInput[joinMap.CurrentLayoutStringFb.JoinNumber]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LinkVideoCodecAvailableLayoutsToApi(IHasCodecLayoutsAvailable codec, BasicTriList trilist,
|
|
||||||
VideoCodecControllerJoinMap joinMap)
|
|
||||||
{
|
|
||||||
codec.AvailableLocalLayoutsFeedback.LinkInputSig(trilist.StringInput[joinMap.AvailableLayoutsFb.JoinNumber]);
|
|
||||||
|
|
||||||
trilist.SetStringSigAction(joinMap.SelectLayout.JoinNumber, codec.LocalLayoutSet);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void LinkVideoCodecCameraModeToApi(IHasCameraAutoMode codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
private void LinkVideoCodecCameraModeToApi(IHasCameraAutoMode codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
||||||
{
|
{
|
||||||
trilist.SetSigFalseAction(joinMap.CameraModeAuto.JoinNumber, codec.CameraAutoModeOn);
|
trilist.SetSigFalseAction(joinMap.CameraModeAuto.JoinNumber, codec.CameraAutoModeOn);
|
||||||
@@ -2010,4 +2017,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
|
using PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||||
|
{
|
||||||
|
public class ShareInfoEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
public zStatus.Sharing SharingStatus { get; private set; }
|
||||||
|
|
||||||
|
public ShareInfoEventArgs(zStatus.Sharing status)
|
||||||
|
{
|
||||||
|
SharingStatus = status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IZoomWirelessShareInstructions
|
||||||
|
{
|
||||||
|
event EventHandler<ShareInfoEventArgs> ShareInfoChanged;
|
||||||
|
|
||||||
|
zStatus.Sharing SharingState { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -434,13 +434,21 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
public bool supports_Web_Settings_Push { get; set; }
|
public bool supports_Web_Settings_Push { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum eDisplayState
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
Laptop,
|
||||||
|
IOS,
|
||||||
|
}
|
||||||
|
|
||||||
public class Sharing : NotifiableObject
|
public class Sharing : NotifiableObject
|
||||||
{
|
{
|
||||||
private string _dispState;
|
private eDisplayState _dispState;
|
||||||
private string _password;
|
private string _password;
|
||||||
private bool _isAirHostClientConnected;
|
private bool _isAirHostClientConnected;
|
||||||
private bool _isSharingBlackMagic;
|
private bool _isSharingBlackMagic;
|
||||||
private bool _isDirectPresentationConnected;
|
private bool _isDirectPresentationConnected;
|
||||||
|
private bool _isBlackMagicConnected;
|
||||||
|
|
||||||
|
|
||||||
public string directPresentationPairingCode { get; set; }
|
public string directPresentationPairingCode { get; set; }
|
||||||
@@ -448,7 +456,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
/// Laptop client sharing key
|
/// Laptop client sharing key
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string directPresentationSharingKey { get; set; }
|
public string directPresentationSharingKey { get; set; }
|
||||||
public string dispState
|
public eDisplayState dispState
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
@@ -477,7 +485,18 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool isBlackMagicConnected { get; set; }
|
public bool isBlackMagicConnected
|
||||||
|
{
|
||||||
|
get { return _isBlackMagicConnected; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != _isBlackMagicConnected)
|
||||||
|
{
|
||||||
|
_isBlackMagicConnected = value;
|
||||||
|
NotifyPropertyChanged("isBlackMagicConnected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
public bool isBlackMagicDataAvailable { get; set; }
|
public bool isBlackMagicDataAvailable { get; set; }
|
||||||
|
|
||||||
public bool isDirectPresentationConnected
|
public bool isDirectPresentationConnected
|
||||||
@@ -506,8 +525,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// IOS Airplay code
|
/// IOS Airplay code
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -622,6 +639,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
// backer variables
|
// backer variables
|
||||||
private bool _can_Switch_Speaker_View;
|
private bool _can_Switch_Speaker_View;
|
||||||
private bool _can_Switch_Wall_View;
|
private bool _can_Switch_Wall_View;
|
||||||
|
private bool _can_Switch_Strip_View;
|
||||||
private bool _can_Switch_Share_On_All_Screens;
|
private bool _can_Switch_Share_On_All_Screens;
|
||||||
private bool _can_Switch_Floating_Share_Content;
|
private bool _can_Switch_Floating_Share_Content;
|
||||||
private bool _is_In_First_Page;
|
private bool _is_In_First_Page;
|
||||||
@@ -709,6 +727,23 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[JsonProperty("can_Switch_Strip_View")]
|
||||||
|
public bool can_Switch_Strip_View
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _can_Switch_Strip_View;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != _can_Switch_Strip_View)
|
||||||
|
{
|
||||||
|
_can_Switch_Strip_View = value;
|
||||||
|
NotifyPropertyChanged("can_Switch_Strip_View");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[JsonProperty("is_In_First_Page")]
|
[JsonProperty("is_In_First_Page")]
|
||||||
public bool is_In_First_Page
|
public bool is_In_First_Page
|
||||||
{
|
{
|
||||||
@@ -770,11 +805,43 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
public class CallRecordInfo : NotifiableObject
|
public class CallRecordInfo : NotifiableObject
|
||||||
{
|
{
|
||||||
private bool _meetingIsBeingRecorded;
|
private bool _meetingIsBeingRecorded;
|
||||||
|
private bool _canRecord;
|
||||||
|
private bool _emailRequired;
|
||||||
|
|
||||||
public bool canRecord { get; set; }
|
|
||||||
public bool emailRequired { get; set; }
|
|
||||||
public bool amIRecording { get; set; }
|
public bool amIRecording { get; set; }
|
||||||
|
|
||||||
|
public bool canRecord
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _canRecord;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != _canRecord)
|
||||||
|
{
|
||||||
|
_canRecord = value;
|
||||||
|
NotifyPropertyChanged("canRecord");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool emailRequired
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _emailRequired;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != _emailRequired)
|
||||||
|
{
|
||||||
|
_emailRequired = value;
|
||||||
|
NotifyPropertyChanged("emailRequired");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public bool meetingIsBeingRecorded
|
public bool meetingIsBeingRecorded
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -793,6 +860,17 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates if recording is allowed (when meeting capable and and email is not required to be entered by the user)
|
||||||
|
/// </summary>
|
||||||
|
public bool AllowRecord
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return canRecord && !emailRequired;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public CallRecordInfo()
|
public CallRecordInfo()
|
||||||
{
|
{
|
||||||
Debug.Console(2, Debug.ErrorLogLevel.Notice, "********************************************* CallRecordInfo() ******************************************");
|
Debug.Console(2, Debug.ErrorLogLevel.Notice, "********************************************* CallRecordInfo() ******************************************");
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
IHasScheduleAwareness, IHasCodecCameras, IHasParticipants, IHasCameraOff, IHasCameraMuteWithUnmuteReqeust, IHasCameraAutoMode,
|
IHasScheduleAwareness, IHasCodecCameras, IHasParticipants, IHasCameraOff, IHasCameraMuteWithUnmuteReqeust, IHasCameraAutoMode,
|
||||||
IHasFarEndContentStatus, IHasSelfviewPosition, IHasPhoneDialing, IHasZoomRoomLayouts, IHasParticipantPinUnpin,
|
IHasFarEndContentStatus, IHasSelfviewPosition, IHasPhoneDialing, IHasZoomRoomLayouts, IHasParticipantPinUnpin,
|
||||||
IHasParticipantAudioMute, IHasSelfviewSize, IPasswordPrompt, IHasStartMeeting, IHasMeetingInfo, IHasPresentationOnlyMeeting,
|
IHasParticipantAudioMute, IHasSelfviewSize, IPasswordPrompt, IHasStartMeeting, IHasMeetingInfo, IHasPresentationOnlyMeeting,
|
||||||
IHasMeetingLock, IHasMeetingRecordingWithPrompt
|
IHasMeetingLock, IHasMeetingRecordingWithPrompt, IZoomWirelessShareInstructions
|
||||||
{
|
{
|
||||||
public event EventHandler VideoUnmuteRequested;
|
public event EventHandler VideoUnmuteRequested;
|
||||||
|
|
||||||
@@ -47,12 +47,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
private const string JsonDelimiter = "\x0D\x0A\x7D\x0D\x0A";
|
private const string JsonDelimiter = "\x0D\x0A\x7D\x0D\x0A";
|
||||||
|
|
||||||
private string[] Delimiters = new string[] { EchoDelimiter, JsonDelimiter, "OK\x0D\x0A", "end\x0D\x0A" };
|
private string[] Delimiters = new string[] { EchoDelimiter, JsonDelimiter, "OK\x0D\x0A", "end\x0D\x0A" };
|
||||||
//"echo off\x0D\x0A\x0A\x0D\x0A"
|
|
||||||
private readonly GenericQueue _receiveQueue;
|
private readonly GenericQueue _receiveQueue;
|
||||||
//private readonly CrestronQueue<string> _receiveQueue;
|
|
||||||
|
|
||||||
|
|
||||||
//private readonly Thread _receiveThread;
|
|
||||||
|
|
||||||
private readonly ZoomRoomSyncState _syncState;
|
private readonly ZoomRoomSyncState _syncState;
|
||||||
public bool CommDebuggingIsOn;
|
public bool CommDebuggingIsOn;
|
||||||
@@ -64,8 +59,18 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
private CameraBase _selectedCamera;
|
private CameraBase _selectedCamera;
|
||||||
private string _lastDialedMeetingNumber;
|
private string _lastDialedMeetingNumber;
|
||||||
|
|
||||||
|
|
||||||
private readonly ZoomRoomPropertiesConfig _props;
|
private readonly ZoomRoomPropertiesConfig _props;
|
||||||
|
|
||||||
|
private bool _meetingPasswordRequired;
|
||||||
|
|
||||||
|
public void Poll(string pollString)
|
||||||
|
{
|
||||||
|
if(_meetingPasswordRequired) return;
|
||||||
|
|
||||||
|
SendText(string.Format("{0}{1}", pollString, SendDelimiter));
|
||||||
|
}
|
||||||
|
|
||||||
public ZoomRoom(DeviceConfig config, IBasicCommunication comm)
|
public ZoomRoom(DeviceConfig config, IBasicCommunication comm)
|
||||||
: base(config)
|
: base(config)
|
||||||
{
|
{
|
||||||
@@ -79,13 +84,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
|
|
||||||
if (_props.CommunicationMonitorProperties != null)
|
if (_props.CommunicationMonitorProperties != null)
|
||||||
{
|
{
|
||||||
CommunicationMonitor = new GenericCommunicationMonitor(this, Communication,
|
CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, _props.CommunicationMonitorProperties.PollInterval, _props.CommunicationMonitorProperties.TimeToWarning, _props.CommunicationMonitorProperties.TimeToError,
|
||||||
_props.CommunicationMonitorProperties);
|
() => Poll(_props.CommunicationMonitorProperties.PollString));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, 30000, 120000, 300000,
|
CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, 30000, 120000, 300000, () => Poll("zStatus SystemUnit"));
|
||||||
"zStatus SystemUnit" + SendDelimiter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DeviceManager.AddDevice(CommunicationMonitor);
|
DeviceManager.AddDevice(CommunicationMonitor);
|
||||||
@@ -214,7 +218,23 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
|
|
||||||
protected override Func<bool> PrivacyModeIsOnFeedbackFunc
|
protected override Func<bool> PrivacyModeIsOnFeedbackFunc
|
||||||
{
|
{
|
||||||
get { return () => Configuration.Call.Microphone.Mute; }
|
get
|
||||||
|
{
|
||||||
|
return () =>
|
||||||
|
{
|
||||||
|
//Debug.Console(2, this, "PrivacyModeIsOnFeedbackFunc. IsInCall: {0} muteState: {1}", IsInCall, Configuration.Call.Microphone.Mute);
|
||||||
|
if (IsInCall)
|
||||||
|
{
|
||||||
|
//Debug.Console(2, this, "reporting muteState: ", Configuration.Call.Microphone.Mute);
|
||||||
|
return Configuration.Call.Microphone.Mute;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Debug.Console(2, this, "muteState: true", IsInCall);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Func<bool> StandbyIsOnFeedbackFunc
|
protected override Func<bool> StandbyIsOnFeedbackFunc
|
||||||
@@ -224,12 +244,23 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
|
|
||||||
protected override Func<string> SharingSourceFeedbackFunc
|
protected override Func<string> SharingSourceFeedbackFunc
|
||||||
{
|
{
|
||||||
get { return () => Status.Sharing.dispState; }
|
get
|
||||||
|
{
|
||||||
|
return () =>
|
||||||
|
{
|
||||||
|
if (Status.Sharing.isAirHostClientConnected)
|
||||||
|
return "Airplay";
|
||||||
|
else if (Status.Sharing.isDirectPresentationConnected || Status.Sharing.isBlackMagicConnected)
|
||||||
|
return "Laptop";
|
||||||
|
else return "None";
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Func<bool> SharingContentIsOnFeedbackFunc
|
protected override Func<bool> SharingContentIsOnFeedbackFunc
|
||||||
{
|
{
|
||||||
get { return () => Status.Call.Sharing.IsSharing; }
|
get { return () => Status.Sharing.isAirHostClientConnected || Status.Sharing.isDirectPresentationConnected || Status.Sharing.isSharingBlackMagic; }
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Func<bool> FarEndIsSharingContentFeedbackFunc
|
protected Func<bool> FarEndIsSharingContentFeedbackFunc
|
||||||
@@ -506,6 +537,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void SetUpCallFeedbackActions()
|
private void SetUpCallFeedbackActions()
|
||||||
{
|
{
|
||||||
|
Status.Sharing.PropertyChanged -= HandleSharingStateUpdate;
|
||||||
|
Status.Sharing.PropertyChanged += HandleSharingStateUpdate;
|
||||||
|
|
||||||
Status.Call.Sharing.PropertyChanged -= HandleSharingStateUpdate;
|
Status.Call.Sharing.PropertyChanged -= HandleSharingStateUpdate;
|
||||||
Status.Call.Sharing.PropertyChanged += HandleSharingStateUpdate;
|
Status.Call.Sharing.PropertyChanged += HandleSharingStateUpdate;
|
||||||
|
|
||||||
@@ -518,7 +552,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
|
|
||||||
private void HandleCallRecordInfoStateUpdate(object sender, PropertyChangedEventArgs a)
|
private void HandleCallRecordInfoStateUpdate(object sender, PropertyChangedEventArgs a)
|
||||||
{
|
{
|
||||||
if (a.PropertyName == "meetingIsBeingRecorded")
|
if (a.PropertyName == "meetingIsBeingRecorded" || a.PropertyName == "emailRequired" || a.PropertyName == "canRecord")
|
||||||
{
|
{
|
||||||
MeetingIsRecordingFeedback.FireUpdate();
|
MeetingIsRecordingFeedback.FireUpdate();
|
||||||
|
|
||||||
@@ -531,7 +565,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
MeetingInfo.IsSharingMeeting,
|
MeetingInfo.IsSharingMeeting,
|
||||||
MeetingInfo.WaitingForHost,
|
MeetingInfo.WaitingForHost,
|
||||||
MeetingIsLockedFeedback.BoolValue,
|
MeetingIsLockedFeedback.BoolValue,
|
||||||
MeetingIsRecordingFeedback.BoolValue);
|
MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
|
||||||
MeetingInfo = meetingInfo;
|
MeetingInfo = meetingInfo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -557,10 +591,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
|
|
||||||
private void HandleSharingStateUpdate(object sender, PropertyChangedEventArgs a)
|
private void HandleSharingStateUpdate(object sender, PropertyChangedEventArgs a)
|
||||||
{
|
{
|
||||||
if (a.PropertyName != "State")
|
//if (a.PropertyName != "State")
|
||||||
{
|
//{
|
||||||
return;
|
// return;
|
||||||
}
|
//}
|
||||||
|
|
||||||
SharingContentIsOnFeedback.FireUpdate();
|
SharingContentIsOnFeedback.FireUpdate();
|
||||||
ReceivingContent.FireUpdate();
|
ReceivingContent.FireUpdate();
|
||||||
@@ -570,21 +604,19 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
// Update the share status of the meeting info
|
// Update the share status of the meeting info
|
||||||
if (MeetingInfo == null)
|
if (MeetingInfo == null)
|
||||||
{
|
{
|
||||||
var sharingStatus = GetSharingStatus();
|
MeetingInfo = new MeetingInfo("", "", "", "", GetSharingStatus(), GetIsHostMyself(), true, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
|
||||||
|
|
||||||
MeetingInfo = new MeetingInfo("", "", "", "", sharingStatus, GetIsHostMyself(), true, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var meetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, Participants.Host != null ? Participants.Host.Name : "None",
|
var meetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, Participants.Host != null ? Participants.Host.Name : "None",
|
||||||
MeetingInfo.Password, GetSharingStatus(), GetIsHostMyself(), MeetingInfo.IsSharingMeeting, MeetingInfo.WaitingForHost, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue);
|
MeetingInfo.Password, GetSharingStatus(), GetIsHostMyself(), MeetingInfo.IsSharingMeeting, MeetingInfo.WaitingForHost, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
|
||||||
MeetingInfo = meetingInfo;
|
MeetingInfo = meetingInfo;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Error processing state property update. {0}", e.Message);
|
Debug.Console(1, this, "Error processing state property update. {0}", e.Message);
|
||||||
Debug.Console(2, this, e.StackTrace);
|
Debug.Console(2, this, e.StackTrace);
|
||||||
MeetingInfo = new MeetingInfo("", "", "", "", "None", false, false, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue);
|
MeetingInfo = new MeetingInfo("", "", "", "", "None", false, false, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -691,7 +723,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
MeetingInfo.IsSharingMeeting,
|
MeetingInfo.IsSharingMeeting,
|
||||||
MeetingInfo.WaitingForHost,
|
MeetingInfo.WaitingForHost,
|
||||||
MeetingIsLockedFeedback.BoolValue,
|
MeetingIsLockedFeedback.BoolValue,
|
||||||
MeetingIsRecordingFeedback.BoolValue
|
MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -727,15 +759,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
|
|
||||||
Status.Sharing.PropertyChanged += (o, a) =>
|
Status.Sharing.PropertyChanged += (o, a) =>
|
||||||
{
|
{
|
||||||
|
OnShareInfoChanged(Status.Sharing);
|
||||||
|
SharingSourceFeedback.FireUpdate();
|
||||||
switch (a.PropertyName)
|
switch (a.PropertyName)
|
||||||
{
|
{
|
||||||
case "dispState":
|
|
||||||
SharingSourceFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case "password":
|
case "password":
|
||||||
break;
|
break;
|
||||||
case "isAirHostClientConnected":
|
|
||||||
case "isDirectPresentationConnected":
|
|
||||||
case "isSharingBlackMagic":
|
case "isSharingBlackMagic":
|
||||||
{
|
{
|
||||||
Debug.Console(2, this, "Updating sharing status: {0}", a.PropertyName);
|
Debug.Console(2, this, "Updating sharing status: {0}", a.PropertyName);
|
||||||
@@ -756,7 +785,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
MeetingInfo.IsSharingMeeting,
|
MeetingInfo.IsSharingMeeting,
|
||||||
MeetingInfo.WaitingForHost,
|
MeetingInfo.WaitingForHost,
|
||||||
MeetingIsLockedFeedback.BoolValue,
|
MeetingIsLockedFeedback.BoolValue,
|
||||||
MeetingIsRecordingFeedback.BoolValue);
|
MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
|
||||||
MeetingInfo = meetingInfo;
|
MeetingInfo = meetingInfo;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -790,8 +819,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
Debug.Console(1, this, "Status.Layout.PropertyChanged a.PropertyName: {0}", a.PropertyName);
|
Debug.Console(1, this, "Status.Layout.PropertyChanged a.PropertyName: {0}", a.PropertyName);
|
||||||
switch (a.PropertyName.ToLower())
|
switch (a.PropertyName.ToLower())
|
||||||
{
|
{
|
||||||
case "can_switch_speaker_view":
|
case "can_Switch_speaker_view":
|
||||||
case "can_switch_wall_view":
|
case "can_switch_wall_view":
|
||||||
|
case "can_switch_strip_view":
|
||||||
|
case "video_type":
|
||||||
case "can_switch_share_on_all_screens":
|
case "can_switch_share_on_all_screens":
|
||||||
{
|
{
|
||||||
ComputeAvailableLayouts();
|
ComputeAvailableLayouts();
|
||||||
@@ -807,7 +838,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
LayoutViewIsOnLastPageFeedback.FireUpdate();
|
LayoutViewIsOnLastPageFeedback.FireUpdate();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "can_Switch_Floating_Share_Content":
|
case "can_switch_floating_share_content":
|
||||||
{
|
{
|
||||||
CanSwapContentWithThumbnailFeedback.FireUpdate();
|
CanSwapContentWithThumbnailFeedback.FireUpdate();
|
||||||
break;
|
break;
|
||||||
@@ -1449,12 +1480,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
MeetingInfo.Name,
|
MeetingInfo.Name,
|
||||||
Participants.Host.Name,
|
Participants.Host.Name,
|
||||||
MeetingInfo.Password,
|
MeetingInfo.Password,
|
||||||
MeetingInfo.ShareStatus,
|
GetSharingStatus(),
|
||||||
GetIsHostMyself(),
|
GetIsHostMyself(),
|
||||||
MeetingInfo.IsSharingMeeting,
|
MeetingInfo.IsSharingMeeting,
|
||||||
MeetingInfo.WaitingForHost,
|
MeetingInfo.WaitingForHost,
|
||||||
MeetingIsLockedFeedback.BoolValue,
|
MeetingIsLockedFeedback.BoolValue,
|
||||||
MeetingIsRecordingFeedback.BoolValue);
|
MeetingIsRecordingFeedback.BoolValue,
|
||||||
|
Status.Call.CallRecordInfo.AllowRecord
|
||||||
|
);
|
||||||
MeetingInfo = meetingInfo;
|
MeetingInfo = meetingInfo;
|
||||||
|
|
||||||
PrintCurrentCallParticipants();
|
PrintCurrentCallParticipants();
|
||||||
@@ -1539,7 +1572,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
{
|
{
|
||||||
JsonConvert.PopulateObject(responseObj.ToString(), Status.Call.Sharing);
|
JsonConvert.PopulateObject(responseObj.ToString(), Status.Call.Sharing);
|
||||||
|
|
||||||
SetLayout();
|
SetDefaultLayout();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1669,14 +1702,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
if (MeetingInfo == null)
|
if (MeetingInfo == null)
|
||||||
{
|
{
|
||||||
MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "",
|
MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "",
|
||||||
GetSharingStatus(), false, false, true, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue);
|
GetSharingStatus(), false, false, true, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
|
||||||
|
|
||||||
UpdateCallStatus();
|
UpdateCallStatus();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "",
|
MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "",
|
||||||
GetSharingStatus(), false, false, true, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue);
|
GetSharingStatus(), false, false, true, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
|
||||||
|
|
||||||
UpdateCallStatus();
|
UpdateCallStatus();
|
||||||
|
|
||||||
@@ -1686,12 +1719,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
if (MeetingInfo == null)
|
if (MeetingInfo == null)
|
||||||
{
|
{
|
||||||
MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "",
|
MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "",
|
||||||
GetSharingStatus(), false, false, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue);
|
GetSharingStatus(), false, false, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
MeetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, MeetingInfo.Host, MeetingInfo.Password,
|
MeetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, MeetingInfo.Host, MeetingInfo.Password,
|
||||||
GetSharingStatus(), GetIsHostMyself(), false, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue);
|
GetSharingStatus(), GetIsHostMyself(), false, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1781,7 +1814,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
|
|
||||||
if (result.Success)
|
if (result.Success)
|
||||||
{
|
{
|
||||||
MeetingInfo = new MeetingInfo("", "", "", "", "", true, true, MeetingInfo.WaitingForHost, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue);
|
MeetingInfo = new MeetingInfo("", "", "", "", GetSharingStatus(), true, true, MeetingInfo.WaitingForHost, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1915,7 +1948,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetLayout()
|
private void SetDefaultLayout()
|
||||||
{
|
{
|
||||||
if (!_props.AutoDefaultLayouts) return;
|
if (!_props.AutoDefaultLayouts) return;
|
||||||
|
|
||||||
@@ -1928,9 +1961,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (_props.DefaultCallLayout == (_props.DefaultCallLayout & AvailableLayouts))
|
||||||
|
{
|
||||||
SendText(String.Format("zconfiguration call layout style: {0}",
|
SendText(String.Format("zconfiguration call layout style: {0}",
|
||||||
_props.DefaultCallLayout));
|
_props.DefaultCallLayout));
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
Debug.Console(0, this, "Unable to set default Layout. {0} not currently an available layout based on meeting state", _props.DefaultCallLayout);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1962,6 +2000,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void GetBookings()
|
private void GetBookings()
|
||||||
{
|
{
|
||||||
|
if (_meetingPasswordRequired) return;
|
||||||
|
|
||||||
SendText("zCommand Bookings List");
|
SendText("zCommand Bookings List");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2127,10 +2167,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
!String.Equals(Status.Call.Info.meeting_type,"NORMAL"),
|
!String.Equals(Status.Call.Info.meeting_type,"NORMAL"),
|
||||||
false,
|
false,
|
||||||
MeetingIsLockedFeedback.BoolValue,
|
MeetingIsLockedFeedback.BoolValue,
|
||||||
MeetingIsRecordingFeedback.BoolValue
|
MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SetDefaultLayout();
|
||||||
}
|
}
|
||||||
// TODO [ ] Issue #868
|
|
||||||
else if (item.Status == eCodecCallStatus.Disconnected)
|
else if (item.Status == eCodecCallStatus.Disconnected)
|
||||||
{
|
{
|
||||||
MeetingInfo = new MeetingInfo(
|
MeetingInfo = new MeetingInfo(
|
||||||
@@ -2143,19 +2185,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false
|
false, Status.Call.CallRecordInfo.AllowRecord
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_meetingPasswordRequired = false;
|
||||||
base.OnCallStatusChange(item);
|
base.OnCallStatusChange(item);
|
||||||
|
|
||||||
Debug.Console(1, this, "[OnCallStatusChange] Current Call Status: {0}",
|
Debug.Console(1, this, "[OnCallStatusChange] Current Call Status: {0}",
|
||||||
Status.Call != null ? Status.Call.Status.ToString() : "no call");
|
Status.Call != null ? Status.Call.Status.ToString() : "no call");
|
||||||
|
|
||||||
if (_props.AutoDefaultLayouts)
|
|
||||||
{
|
|
||||||
SetLayout();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetSharingStatus()
|
private string GetSharingStatus()
|
||||||
@@ -2223,6 +2261,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Starts sharing HDMI source
|
||||||
|
/// </summary>
|
||||||
public override void StartSharing()
|
public override void StartSharing()
|
||||||
{
|
{
|
||||||
SendText("zCommand Call Sharing HDMI Start");
|
SendText("zCommand Call Sharing HDMI Start");
|
||||||
@@ -2368,6 +2409,20 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
/// <param name="joinMap"></param>
|
/// <param name="joinMap"></param>
|
||||||
public void LinkZoomRoomToApi(BasicTriList trilist, ZoomRoomJoinMap joinMap)
|
public void LinkZoomRoomToApi(BasicTriList trilist, ZoomRoomJoinMap joinMap)
|
||||||
{
|
{
|
||||||
|
var meetingInfoCodec = this as IHasMeetingInfo;
|
||||||
|
if (meetingInfoCodec != null)
|
||||||
|
{
|
||||||
|
if (meetingInfoCodec.MeetingInfo != null)
|
||||||
|
{
|
||||||
|
trilist.SetBool(joinMap.MeetingCanRecord.JoinNumber, meetingInfoCodec.MeetingInfo.CanRecord);
|
||||||
|
}
|
||||||
|
|
||||||
|
meetingInfoCodec.MeetingInfoChanged += (o, a) =>
|
||||||
|
{
|
||||||
|
trilist.SetBool(joinMap.MeetingCanRecord.JoinNumber, a.Info.CanRecord);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
var recordingCodec = this as IHasMeetingRecordingWithPrompt;
|
var recordingCodec = this as IHasMeetingRecordingWithPrompt;
|
||||||
if (recordingCodec != null)
|
if (recordingCodec != null)
|
||||||
{
|
{
|
||||||
@@ -2482,24 +2537,34 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
//trilist.SetString(joinMap.CurrentSource.JoinNumber, args.Info.ShareStatus);
|
//trilist.SetString(joinMap.CurrentSource.JoinNumber, args.Info.ShareStatus);
|
||||||
};
|
};
|
||||||
|
|
||||||
trilist.SetSigTrueAction(joinMap.StartMeetingNow.JoinNumber, () => StartMeeting(0));
|
trilist.SetSigFalseAction(joinMap.StartMeetingNow.JoinNumber, () => StartMeeting(0));
|
||||||
trilist.SetSigTrueAction(joinMap.ShareOnlyMeeting.JoinNumber, StartSharingOnlyMeeting);
|
trilist.SetSigFalseAction(joinMap.ShareOnlyMeeting.JoinNumber, StartSharingOnlyMeeting);
|
||||||
trilist.SetSigTrueAction(joinMap.StartNormalMeetingFromSharingOnlyMeeting.JoinNumber, StartNormalMeetingFromSharingOnlyMeeting);
|
trilist.SetSigFalseAction(joinMap.StartNormalMeetingFromSharingOnlyMeeting.JoinNumber, StartNormalMeetingFromSharingOnlyMeeting);
|
||||||
|
|
||||||
// not sure if this would be needed here, should be handled by VideoCodecBase.cs LinkToApi methods
|
|
||||||
//DirectoryResultReturned += (device, args) =>
|
|
||||||
//{
|
|
||||||
// // add logic here if necessary when event fires
|
|
||||||
|
|
||||||
//};
|
|
||||||
|
|
||||||
|
|
||||||
trilist.SetStringSigAction(joinMap.SubmitPassword.JoinNumber, SubmitPassword);
|
trilist.SetStringSigAction(joinMap.SubmitPassword.JoinNumber, SubmitPassword);
|
||||||
|
|
||||||
|
// Subscribe to call status to clear ShowPasswordPrompt when in meeting
|
||||||
|
this.CallStatusChange += (o, a) =>
|
||||||
|
{
|
||||||
|
if (a.CallItem.Status == eCodecCallStatus.Connected || a.CallItem.Status == eCodecCallStatus.Disconnected)
|
||||||
|
{
|
||||||
|
trilist.SetBool(joinMap.MeetingPasswordRequired.JoinNumber, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
trilist.SetSigFalseAction(joinMap.CancelJoinAttempt.JoinNumber, () => {
|
||||||
|
trilist.SetBool(joinMap.MeetingPasswordRequired.JoinNumber, false);
|
||||||
|
EndAllCalls();
|
||||||
|
});
|
||||||
|
|
||||||
PasswordRequired += (devices, args) =>
|
PasswordRequired += (devices, args) =>
|
||||||
{
|
{
|
||||||
|
Debug.Console(0, this, "***********************************PaswordRequired. Message: {0} Cancelled: {1} Last Incorrect: {2} Failed: {3}", args.Message, args.LoginAttemptCancelled, args.LastAttemptWasIncorrect, args.LoginAttemptFailed);
|
||||||
|
|
||||||
if (args.LoginAttemptCancelled)
|
if (args.LoginAttemptCancelled)
|
||||||
{
|
{
|
||||||
trilist.SetBool(joinMap.ShowPasswordPrompt.JoinNumber, false);
|
trilist.SetBool(joinMap.MeetingPasswordRequired.JoinNumber, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2515,7 +2580,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
}
|
}
|
||||||
|
|
||||||
trilist.SetBool(joinMap.PasswordIncorrect.JoinNumber, args.LastAttemptWasIncorrect);
|
trilist.SetBool(joinMap.PasswordIncorrect.JoinNumber, args.LastAttemptWasIncorrect);
|
||||||
trilist.SetBool(joinMap.ShowPasswordPrompt.JoinNumber, true);
|
trilist.SetBool(joinMap.MeetingPasswordRequired.JoinNumber, true);
|
||||||
};
|
};
|
||||||
|
|
||||||
trilist.OnlineStatusChange += (device, args) =>
|
trilist.OnlineStatusChange += (device, args) =>
|
||||||
@@ -2531,6 +2596,32 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
pinCodec.NumberOfScreensFeedback.FireUpdate();
|
pinCodec.NumberOfScreensFeedback.FireUpdate();
|
||||||
layoutSizeCodec.SelfviewPipSizeFeedback.FireUpdate();
|
layoutSizeCodec.SelfviewPipSizeFeedback.FireUpdate();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var wirelessInfoCodec = this as IZoomWirelessShareInstructions;
|
||||||
|
if (wirelessInfoCodec != null)
|
||||||
|
{
|
||||||
|
if (Status != null && Status.Sharing != null)
|
||||||
|
{
|
||||||
|
SetSharingStateJoins(Status.Sharing, trilist, joinMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
wirelessInfoCodec.ShareInfoChanged += (o, a) =>
|
||||||
|
{
|
||||||
|
SetSharingStateJoins(a.SharingStatus, trilist, joinMap);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetSharingStateJoins(zStatus.Sharing state, BasicTriList trilist, ZoomRoomJoinMap joinMap)
|
||||||
|
{
|
||||||
|
trilist.SetBool(joinMap.IsSharingAirplay.JoinNumber, state.isAirHostClientConnected);
|
||||||
|
trilist.SetBool(joinMap.IsSharingHdmi.JoinNumber, state.isBlackMagicConnected || state.isDirectPresentationConnected);
|
||||||
|
|
||||||
|
trilist.SetString(joinMap.DisplayState.JoinNumber, state.dispState.ToString());
|
||||||
|
trilist.SetString(joinMap.AirplayShareCode.JoinNumber, state.password);
|
||||||
|
trilist.SetString(joinMap.LaptopShareKey.JoinNumber, state.directPresentationSharingKey);
|
||||||
|
trilist.SetString(joinMap.WifiName.JoinNumber, state.wifiName);
|
||||||
|
trilist.SetString(joinMap.ServerName.JoinNumber, state.serverName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ExecuteSwitch(object selector)
|
public override void ExecuteSwitch(object selector)
|
||||||
@@ -2729,7 +2820,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
{
|
{
|
||||||
Debug.Console(2, this, "OnDirectoryResultReturned. Result has {0} contacts", result.Contacts.Count);
|
Debug.Console(2, this, "OnDirectoryResultReturned. Result has {0} contacts", result.Contacts.Count);
|
||||||
|
|
||||||
|
CurrentDirectoryResultIsNotDirectoryRoot.FireUpdate();
|
||||||
|
|
||||||
var directoryResult = result;
|
var directoryResult = result;
|
||||||
|
var directoryIsRoot = CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false;
|
||||||
|
|
||||||
// If result is Root, create a copy and filter out contacts whose parent folder is not root
|
// If result is Root, create a copy and filter out contacts whose parent folder is not root
|
||||||
//if (!CurrentDirectoryResultIsNotDirectoryRoot.BoolValue)
|
//if (!CurrentDirectoryResultIsNotDirectoryRoot.BoolValue)
|
||||||
@@ -2747,7 +2841,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
//}
|
//}
|
||||||
|
|
||||||
Debug.Console(2, this, "Updating directoryResult. IsOnRoot: {0} Contact Count: {1}",
|
Debug.Console(2, this, "Updating directoryResult. IsOnRoot: {0} Contact Count: {1}",
|
||||||
!CurrentDirectoryResultIsNotDirectoryRoot.BoolValue, directoryResult.Contacts.Count);
|
directoryIsRoot, directoryResult.Contacts.Count);
|
||||||
|
|
||||||
// This will return the latest results to all UIs. Multiple indendent UI Directory browsing will require a different methodology
|
// This will return the latest results to all UIs. Multiple indendent UI Directory browsing will require a different methodology
|
||||||
var handler = DirectoryResultReturned;
|
var handler = DirectoryResultReturned;
|
||||||
@@ -2756,11 +2850,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
handler(this, new DirectoryEventArgs
|
handler(this, new DirectoryEventArgs
|
||||||
{
|
{
|
||||||
Directory = directoryResult,
|
Directory = directoryResult,
|
||||||
DirectoryIsOnRoot = !CurrentDirectoryResultIsNotDirectoryRoot.BoolValue
|
DirectoryIsOnRoot = directoryIsRoot
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
CurrentDirectoryResultIsNotDirectoryRoot.FireUpdate();
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -3206,7 +3300,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
|
|
||||||
// There is no property that directly reports if strip mode is valid, but API stipulates
|
// There is no property that directly reports if strip mode is valid, but API stipulates
|
||||||
// that strip mode is available if the number of screens is 1
|
// that strip mode is available if the number of screens is 1
|
||||||
if (Status.NumberOfScreens.NumOfScreens == 1)
|
if (Status.NumberOfScreens.NumOfScreens == 1 || Status.Layout.can_Switch_Strip_View || Status.Layout.video_type.ToLower() == "strip")
|
||||||
{
|
{
|
||||||
availableLayouts |= zConfiguration.eLayoutStyle.Strip;
|
availableLayouts |= zConfiguration.eLayoutStyle.Strip;
|
||||||
}
|
}
|
||||||
@@ -3221,10 +3315,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
var handler = LayoutInfoChanged;
|
var handler = LayoutInfoChanged;
|
||||||
if (handler != null)
|
if (handler != null)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
var currentLayout = zConfiguration.eLayoutStyle.None;
|
||||||
|
|
||||||
|
currentLayout = (zConfiguration.eLayoutStyle)Enum.Parse(typeof(zConfiguration.eLayoutStyle), string.IsNullOrEmpty(LocalLayoutFeedback.StringValue) ? "None" : LocalLayoutFeedback.StringValue, true);
|
||||||
|
|
||||||
handler(this, new LayoutInfoChangedEventArgs()
|
handler(this, new LayoutInfoChangedEventArgs()
|
||||||
{
|
{
|
||||||
AvailableLayouts = AvailableLayouts,
|
AvailableLayouts = AvailableLayouts,
|
||||||
CurrentSelectedLayout = (zConfiguration.eLayoutStyle)Enum.Parse(typeof(zConfiguration.eLayoutStyle),string.IsNullOrEmpty(LocalLayoutFeedback.StringValue) ? "None" : LocalLayoutFeedback.StringValue , true),
|
CurrentSelectedLayout = currentLayout,
|
||||||
LayoutViewIsOnFirstPage = LayoutViewIsOnFirstPageFeedback.BoolValue,
|
LayoutViewIsOnFirstPage = LayoutViewIsOnFirstPageFeedback.BoolValue,
|
||||||
LayoutViewIsOnLastPage = LayoutViewIsOnLastPageFeedback.BoolValue,
|
LayoutViewIsOnLastPage = LayoutViewIsOnLastPageFeedback.BoolValue,
|
||||||
CanSwapContentWithThumbnail = CanSwapContentWithThumbnailFeedback.BoolValue,
|
CanSwapContentWithThumbnail = CanSwapContentWithThumbnailFeedback.BoolValue,
|
||||||
@@ -3354,6 +3453,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
{
|
{
|
||||||
Debug.Console(2, this, "Password Submitted: {0}", password);
|
Debug.Console(2, this, "Password Submitted: {0}", password);
|
||||||
Dial(_lastDialedMeetingNumber, password);
|
Dial(_lastDialedMeetingNumber, password);
|
||||||
|
//OnPasswordRequired(false, false, true, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnPasswordRequired(bool lastAttemptIncorrect, bool loginFailed, bool loginCancelled, string message)
|
void OnPasswordRequired(bool lastAttemptIncorrect, bool loginFailed, bool loginCancelled, string message)
|
||||||
@@ -3361,6 +3461,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
var handler = PasswordRequired;
|
var handler = PasswordRequired;
|
||||||
if (handler != null)
|
if (handler != null)
|
||||||
{
|
{
|
||||||
|
if(!loginFailed || !loginCancelled)
|
||||||
|
_meetingPasswordRequired = true;
|
||||||
|
|
||||||
handler(this, new PasswordPromptEventArgs(lastAttemptIncorrect, loginFailed, loginCancelled, message));
|
handler(this, new PasswordPromptEventArgs(lastAttemptIncorrect, loginFailed, loginCancelled, message));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3400,19 +3503,19 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
StartSharingOnlyMeeting(eSharingMeetingMode.None, 30, String.Empty);
|
StartSharingOnlyMeeting(eSharingMeetingMode.None, 30, String.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StartSharingOnlyMeeting(eSharingMeetingMode mode)
|
public void StartSharingOnlyMeeting(eSharingMeetingMode displayMode)
|
||||||
{
|
{
|
||||||
StartSharingOnlyMeeting(mode, 30, String.Empty);
|
StartSharingOnlyMeeting(displayMode, DefaultMeetingDurationMin, String.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StartSharingOnlyMeeting(eSharingMeetingMode mode, ushort duration)
|
public void StartSharingOnlyMeeting(eSharingMeetingMode displayMode, uint duration)
|
||||||
{
|
{
|
||||||
StartSharingOnlyMeeting(mode, duration, String.Empty);
|
StartSharingOnlyMeeting(displayMode, duration, String.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StartSharingOnlyMeeting(eSharingMeetingMode mode, ushort duration, string password)
|
public void StartSharingOnlyMeeting(eSharingMeetingMode displayMode, uint duration, string password)
|
||||||
{
|
{
|
||||||
SendText(String.Format("zCommand Dial Sharing Duration: {0} DisplayState: {1} Password: {2}", duration, mode, password));
|
SendText(String.Format("zCommand Dial Sharing Duration: {0} DisplayState: {1} Password: {2}", duration, displayMode, password));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StartNormalMeetingFromSharingOnlyMeeting()
|
public void StartNormalMeetingFromSharingOnlyMeeting()
|
||||||
@@ -3489,6 +3592,41 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region IZoomWirelessShareInstructions Members
|
||||||
|
|
||||||
|
public event EventHandler<ShareInfoEventArgs> ShareInfoChanged;
|
||||||
|
|
||||||
|
public zStatus.Sharing SharingState
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Status.Sharing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnShareInfoChanged(zStatus.Sharing status)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this,
|
||||||
|
@"ShareInfoChanged:
|
||||||
|
isSharingHDMI: {0}
|
||||||
|
isSharingAirplay: {1}
|
||||||
|
AirplayPassword: {2}
|
||||||
|
OSD Display State: {3}
|
||||||
|
",
|
||||||
|
status.isSharingBlackMagic,
|
||||||
|
status.isAirHostClientConnected,
|
||||||
|
status.password,
|
||||||
|
status.dispState);
|
||||||
|
|
||||||
|
var handler = ShareInfoChanged;
|
||||||
|
if (handler != null)
|
||||||
|
{
|
||||||
|
handler(this, new ShareInfoEventArgs(status));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -8,9 +8,22 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
{
|
{
|
||||||
#region Digital
|
#region Digital
|
||||||
|
|
||||||
// TODO [ ] Issue #868
|
[JoinName("CancelJoinAttempt")]
|
||||||
[JoinName("ShowPasswordPrompt")]
|
public JoinDataComplete CancelJoinAttempt = new JoinDataComplete(
|
||||||
public JoinDataComplete ShowPasswordPrompt = new JoinDataComplete(
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 5,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Pulse to hide the password prompt",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("MeetingPasswordRequired")]
|
||||||
|
public JoinDataComplete MeetingPasswordRequired = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
{
|
{
|
||||||
JoinNumber = 6,
|
JoinNumber = 6,
|
||||||
@@ -23,7 +36,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO [ ] Issue #868
|
|
||||||
[JoinName("PasswordIncorrect")]
|
[JoinName("PasswordIncorrect")]
|
||||||
public JoinDataComplete PasswordIncorrect = new JoinDataComplete(
|
public JoinDataComplete PasswordIncorrect = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
@@ -38,8 +50,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO [ ] Issue #868
|
[JoinName("PasswordLoginFailed")]
|
||||||
[JoinName("PassowrdLoginFailed")]
|
|
||||||
public JoinDataComplete PasswordLoginFailed = new JoinDataComplete(
|
public JoinDataComplete PasswordLoginFailed = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
{
|
{
|
||||||
@@ -53,7 +64,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO [ ] Issue #868
|
|
||||||
[JoinName("WaitingForHost")]
|
[JoinName("WaitingForHost")]
|
||||||
public JoinDataComplete WaitingForHost = new JoinDataComplete(
|
public JoinDataComplete WaitingForHost = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
@@ -68,7 +78,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO [ ] Issue #868
|
|
||||||
[JoinName("IsHost")]
|
[JoinName("IsHost")]
|
||||||
public JoinDataComplete IsHost = new JoinDataComplete(
|
public JoinDataComplete IsHost = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
@@ -83,7 +92,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO [ ] Issue #868
|
|
||||||
[JoinName("StartMeetingNow")]
|
[JoinName("StartMeetingNow")]
|
||||||
public JoinDataComplete StartMeetingNow = new JoinDataComplete(
|
public JoinDataComplete StartMeetingNow = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
@@ -93,12 +101,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
},
|
},
|
||||||
new JoinMetadata
|
new JoinMetadata
|
||||||
{
|
{
|
||||||
Description = "FB Indicates the password prompt is active",
|
Description = "Pulse to start an ad-hoc meeting with the default duration",
|
||||||
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO [ ] Issue #868
|
|
||||||
[JoinName("ShareOnlyMeeting")]
|
[JoinName("ShareOnlyMeeting")]
|
||||||
public JoinDataComplete ShareOnlyMeeting = new JoinDataComplete(
|
public JoinDataComplete ShareOnlyMeeting = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
@@ -113,7 +120,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO [ ] Issue #868
|
|
||||||
[JoinName("StartNormalMeetingFromSharingOnlyMeeting")]
|
[JoinName("StartNormalMeetingFromSharingOnlyMeeting")]
|
||||||
public JoinDataComplete StartNormalMeetingFromSharingOnlyMeeting = new JoinDataComplete(
|
public JoinDataComplete StartNormalMeetingFromSharingOnlyMeeting = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
@@ -367,6 +373,54 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
|
[JoinName("MeetingCanRecord")]
|
||||||
|
public JoinDataComplete MeetingCanRecord = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 246,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "When high, indicated that the current meeting can be recorded",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
#region Sharing Status
|
||||||
|
|
||||||
|
[JoinName("IsSharingAirplay")]
|
||||||
|
public JoinDataComplete IsSharingAirplay = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 250,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Indicates an Airplay source is sharing",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("IsSharingHdmi")]
|
||||||
|
public JoinDataComplete IsSharingHdmi = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 251,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Indicates an HDMI source is sharing",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
//[JoinName("ParticipantAudioMuteToggleStart")]
|
//[JoinName("ParticipantAudioMuteToggleStart")]
|
||||||
//public JoinDataComplete ParticipantAudioMuteToggleStart = new JoinDataComplete(
|
//public JoinDataComplete ParticipantAudioMuteToggleStart = new JoinDataComplete(
|
||||||
// new JoinData
|
// new JoinData
|
||||||
@@ -551,6 +605,92 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
JoinType = eJoinType.DigitalSerial
|
JoinType = eJoinType.DigitalSerial
|
||||||
});
|
});
|
||||||
|
|
||||||
|
[JoinName("DisplayState")]
|
||||||
|
public JoinDataComplete DisplayState = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 250,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Reports the instructions the ZoomRoom is displaying on the monitor. <None | Laptop | IOS>",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Serial
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("AirplayShareCode")]
|
||||||
|
public JoinDataComplete AirplayShareCode = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 251,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Reports the current code for Airplay Sharing.",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Serial
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("LaptopShareKey")]
|
||||||
|
public JoinDataComplete LaptopShareKey = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 252,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "The alpha-only sharing key that users type into a laptop client to share with the Zoom Room.",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Serial
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("LaptopSharePairingCode")]
|
||||||
|
public JoinDataComplete LaptopSharePairingCode = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 253,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "This is the paring code that is broadcast via an ultrasonic signal from the ZRC. It is different than the user-supplied paring code. The ZRC uses a Zoom-proprietary method of advertizing the ultrasonic pairing code, so it\'s not possible to advertize it using commonly available libraries.",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Serial
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("WifiName")]
|
||||||
|
public JoinDataComplete WifiName = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 254,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Reports the Wifi SSID used by the ZoomRoom.",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Serial
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("ServerName")]
|
||||||
|
public JoinDataComplete ServerName = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 255,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Reports the namne of the the ZoomRoom.",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Serial
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public ZoomRoomJoinMap(uint joinStart)
|
public ZoomRoomJoinMap(uint joinStart)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Converters;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
@@ -29,11 +30,13 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
|
|
||||||
/* This layout will be selected when Sharing starts (either from Far end or locally)*/
|
/* This layout will be selected when Sharing starts (either from Far end or locally)*/
|
||||||
[JsonProperty("defaultSharingLayout")]
|
[JsonProperty("defaultSharingLayout")]
|
||||||
public string DefaultSharingLayout { get; set; }
|
[JsonConverter(typeof(StringEnumConverter))]
|
||||||
|
public zConfiguration.eLayoutStyle DefaultSharingLayout { get; set; }
|
||||||
|
|
||||||
//This layout will be selected when a call is connected and no content is being shared
|
//This layout will be selected when a call is connected and no content is being shared
|
||||||
[JsonProperty("defaultCallLayout")]
|
[JsonProperty("defaultCallLayout")]
|
||||||
public string DefaultCallLayout { get; set; }
|
[JsonConverter(typeof(StringEnumConverter))]
|
||||||
|
public zConfiguration.eLayoutStyle DefaultCallLayout { get; set; }
|
||||||
|
|
||||||
[JsonProperty("minutesBeforeMeetingStart")]
|
[JsonProperty("minutesBeforeMeetingStart")]
|
||||||
public int MinutesBeforeMeetingStart { get; set; }
|
public int MinutesBeforeMeetingStart { get; set; }
|
||||||
|
|||||||
Reference in New Issue
Block a user