diff --git a/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs b/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
index 5ec0565d..9824ec67 100644
--- a/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
+++ b/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
@@ -147,6 +147,24 @@ namespace PepperDash.Essentials.Room.Config
[JsonProperty("helpMessage")]
public string HelpMessage { get; set; }
+ ///
+ /// Read this value to get the help message. It checks for the old and new config format.
+ ///
+ public string HelpMessageForDisplay
+ {
+ get
+ {
+ if(Help != null && !string.IsNullOrEmpty(Help.Message))
+ {
+ return Help.Message;
+ }
+ else
+ {
+ return HelpMessage;
+ }
+ }
+ }
+
[JsonProperty("environment")]
public EssentialsEnvironmentPropertiesConfig Environment { get; set; }
diff --git a/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs b/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs
index 3123f20f..5dbe7600 100644
--- a/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs
+++ b/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs
@@ -202,11 +202,28 @@ namespace PepperDash.Essentials
};
}
+ SetupEnvironmentalControlDevices();
+
SetSourceListKey();
EnablePowerOnToLastSource = true;
}
+ private void SetupEnvironmentalControlDevices()
+ {
+ if (PropertiesConfig.Environment != null)
+ {
+ if (PropertiesConfig.Environment.Enabled)
+ {
+ foreach (var d in PropertiesConfig.Environment.DeviceKeys)
+ {
+ var envDevice = DeviceManager.GetDeviceForKey(d) as EssentialsDevice;
+ EnvironmentalControlDevices.Add(envDevice);
+ }
+ }
+ }
+ }
+
private void SetSourceListKey()
{
if (!string.IsNullOrEmpty(PropertiesConfig.SourceListKey))
diff --git a/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs b/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs
index 42a4a353..a6563491 100644
--- a/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs
+++ b/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs
@@ -334,6 +334,8 @@ namespace PepperDash.Essentials
CallTypeFeedback = new IntFeedback(() => 0);
+ SetupEnvironmentalControlDevices();
+
SetSourceListKey();
EnablePowerOnToLastSource = true;
@@ -344,6 +346,21 @@ namespace PepperDash.Essentials
}
}
+ private void SetupEnvironmentalControlDevices()
+ {
+ if (PropertiesConfig.Environment != null)
+ {
+ if (PropertiesConfig.Environment.Enabled)
+ {
+ foreach (var d in PropertiesConfig.Environment.DeviceKeys)
+ {
+ var envDevice = DeviceManager.GetDeviceForKey(d) as EssentialsDevice;
+ EnvironmentalControlDevices.Add(envDevice);
+ }
+ }
+ }
+ }
+
private void SetSourceListKey()
{
@@ -427,6 +444,14 @@ namespace PepperDash.Essentials
///
public bool RunDefaultCallRoute()
{
+ Debug.Console(2, this, "RunDefaultCallRoute() Currently Sharing Content: {0}", VideoCodec.SharingContentIsOnFeedback.BoolValue);
+
+ if (VideoCodec.SharingContentIsOnFeedback.BoolValue)
+ {
+ Debug.Console(2, this, "Currently sharing content. Ignoring request to run default call route.");
+ return false;
+ }
+
RunRouteAction(DefaultCodecRouteString);
return true;
}
diff --git a/PepperDashEssentials/Room/Types/EssentialsTechRoom.cs b/PepperDashEssentials/Room/Types/EssentialsTechRoom.cs
index d33c3707..c2b08f89 100644
--- a/PepperDashEssentials/Room/Types/EssentialsTechRoom.cs
+++ b/PepperDashEssentials/Room/Types/EssentialsTechRoom.cs
@@ -375,7 +375,7 @@ Params: {2}"
{
bridge.AddJoinMap(Key, joinMap);
}
- uint i;
+
if (_config.IsPrimary)
{
Debug.Console(1, this, "Linking Primary system Tuner Preset Mirroring");
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Lighting/LightingBase.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Lighting/LightingBase.cs
index 1bf8aee8..eeb25531 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Lighting/LightingBase.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Lighting/LightingBase.cs
@@ -1,83 +1,83 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-using Crestron.SimplSharpPro;
-using Crestron.SimplSharpPro.DeviceSupport;
-using Newtonsoft.Json;
-using PepperDash.Core;
-using PepperDash.Essentials.Core.Bridges;
-
-namespace PepperDash.Essentials.Core.Lighting
-{
- public abstract class LightingBase : EssentialsBridgeableDevice, ILightingScenes
- {
- #region ILightingScenes Members
-
- public event EventHandler LightingSceneChange;
-
- public List LightingScenes { get; protected set; }
-
- public LightingScene CurrentLightingScene { get; protected set; }
-
- public IntFeedback CurrentLightingSceneFeedback { get; protected set; }
-
- #endregion
-
- protected LightingBase(string key, string name)
- : base(key, name)
- {
- LightingScenes = new List();
-
- CurrentLightingScene = new LightingScene();
- //CurrentLightingSceneFeedback = new IntFeedback(() => { return int.Parse(this.CurrentLightingScene.ID); });
- }
-
- public abstract void SelectScene(LightingScene scene);
-
- public void SimulateSceneSelect(string sceneName)
- {
- Debug.Console(1, this, "Simulating selection of scene '{0}'", sceneName);
-
- var scene = LightingScenes.FirstOrDefault(s => s.Name.Equals(sceneName));
-
- if (scene != null)
- {
- CurrentLightingScene = scene;
- OnLightingSceneChange();
- }
- }
-
- ///
- /// Sets the IsActive property on each scene and fires the LightingSceneChange event
- ///
- protected void OnLightingSceneChange()
- {
- foreach (var scene in LightingScenes)
- {
- if (scene == CurrentLightingScene)
- scene.IsActive = true;
-
- else
- scene.IsActive = false;
- }
-
- var handler = LightingSceneChange;
- if (handler != null)
- {
- handler(this, new LightingSceneChangeEventArgs(CurrentLightingScene));
- }
- }
-
- protected GenericLightingJoinMap LinkLightingToApi(LightingBase lightingDevice, BasicTriList trilist, uint joinStart,
- string joinMapKey, EiscApiAdvanced bridge)
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using Crestron.SimplSharpPro;
+using Crestron.SimplSharpPro.DeviceSupport;
+using Newtonsoft.Json;
+using PepperDash.Core;
+using PepperDash.Essentials.Core.Bridges;
+
+namespace PepperDash.Essentials.Core.Lighting
+{
+ public abstract class LightingBase : EssentialsBridgeableDevice, ILightingScenes
+ {
+ #region ILightingScenes Members
+
+ public event EventHandler LightingSceneChange;
+
+ public List LightingScenes { get; protected set; }
+
+ public LightingScene CurrentLightingScene { get; protected set; }
+
+ public IntFeedback CurrentLightingSceneFeedback { get; protected set; }
+
+ #endregion
+
+ protected LightingBase(string key, string name)
+ : base(key, name)
{
- var joinMap = new GenericLightingJoinMap(joinStart);
-
- var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
-
- if (!string.IsNullOrEmpty(joinMapSerialized))
+ LightingScenes = new List();
+
+ CurrentLightingScene = new LightingScene();
+ //CurrentLightingSceneFeedback = new IntFeedback(() => { return int.Parse(this.CurrentLightingScene.ID); });
+ }
+
+ public abstract void SelectScene(LightingScene scene);
+
+ public void SimulateSceneSelect(string sceneName)
+ {
+ Debug.Console(1, this, "Simulating selection of scene '{0}'", sceneName);
+
+ var scene = LightingScenes.FirstOrDefault(s => s.Name.Equals(sceneName));
+
+ if (scene != null)
+ {
+ CurrentLightingScene = scene;
+ OnLightingSceneChange();
+ }
+ }
+
+ ///
+ /// Sets the IsActive property on each scene and fires the LightingSceneChange event
+ ///
+ protected void OnLightingSceneChange()
+ {
+ foreach (var scene in LightingScenes)
+ {
+ if (scene == CurrentLightingScene)
+ scene.IsActive = true;
+
+ else
+ scene.IsActive = false;
+ }
+
+ var handler = LightingSceneChange;
+ if (handler != null)
+ {
+ handler(this, new LightingSceneChangeEventArgs(CurrentLightingScene));
+ }
+ }
+
+ protected GenericLightingJoinMap LinkLightingToApi(LightingBase lightingDevice, BasicTriList trilist, uint joinStart,
+ string joinMapKey, EiscApiAdvanced bridge)
+ {
+ var joinMap = new GenericLightingJoinMap(joinStart);
+
+ var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
+
+ if (!string.IsNullOrEmpty(joinMapSerialized))
joinMap = JsonConvert.DeserializeObject(joinMapSerialized);
if (bridge != null)
@@ -87,52 +87,52 @@ namespace PepperDash.Essentials.Core.Lighting
else
{
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
- }
-
- Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
-
- Debug.Console(0, "Linking to Lighting Type {0}", lightingDevice.GetType().Name.ToString());
-
+ }
+
+ Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
+
+ Debug.Console(0, "Linking to Lighting Type {0}", lightingDevice.GetType().Name.ToString());
+
// GenericLighitng Actions & FeedBack
- trilist.SetUShortSigAction(joinMap.SelectScene.JoinNumber, u => lightingDevice.SelectScene(lightingDevice.LightingScenes[u]));
-
- var sceneIndex = 0;
- foreach (var scene in lightingDevice.LightingScenes)
+ trilist.SetUShortSigAction(joinMap.SelectScene.JoinNumber, u => lightingDevice.SelectScene(lightingDevice.LightingScenes[u]));
+
+ var sceneIndex = 0;
+ foreach (var scene in lightingDevice.LightingScenes)
{
- trilist.SetSigTrueAction((uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex), () => lightingDevice.SelectScene(lightingDevice.LightingScenes[sceneIndex]));
+ trilist.SetSigTrueAction((uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex), () => lightingDevice.SelectScene(lightingDevice.LightingScenes[sceneIndex]));
scene.IsActiveFeedback.LinkInputSig(trilist.BooleanInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex)]);
- trilist.StringInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex)].StringValue = scene.Name;
- trilist.BooleanInput[(uint)(joinMap.ButtonVisibility.JoinNumber + sceneIndex)].BoolValue = true;
- sceneIndex++;
- }
-
- return joinMap;
- }
-
- }
-
- public class LightingScene
- {
- public string Name { get; set; }
- public string ID { get; set; }
- bool _IsActive;
- public bool IsActive
- {
- get
- {
- return _IsActive;
- }
- set
- {
- _IsActive = value;
- IsActiveFeedback.FireUpdate();
- }
- }
- public BoolFeedback IsActiveFeedback { get; set; }
-
- public LightingScene()
- {
- IsActiveFeedback = new BoolFeedback(new Func(() => IsActive));
- }
- }
+ trilist.StringInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex)].StringValue = scene.Name;
+ trilist.BooleanInput[(uint)(joinMap.ButtonVisibility.JoinNumber + sceneIndex)].BoolValue = true;
+ sceneIndex++;
+ }
+
+ return joinMap;
+ }
+
+ }
+
+ public class LightingScene
+ {
+ public string Name { get; set; }
+ public string ID { get; set; }
+ bool _IsActive;
+ public bool IsActive
+ {
+ get
+ {
+ return _IsActive;
+ }
+ set
+ {
+ _IsActive = value;
+ IsActiveFeedback.FireUpdate();
+ }
+ }
+ public BoolFeedback IsActiveFeedback { get; set; }
+
+ public LightingScene()
+ {
+ IsActiveFeedback = new BoolFeedback(new Func(() => IsActive));
+ }
+ }
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/EssentialsRoomBase.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/EssentialsRoomBase.cs
index 0d8e9803..352cbfcd 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/EssentialsRoomBase.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/EssentialsRoomBase.cs
@@ -11,6 +11,8 @@ using PepperDash.Essentials.Core.Config;
using PepperDash.Essentials.Core.Devices;
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
+using Newtonsoft.Json;
+
namespace PepperDash.Essentials.Core
{
///
@@ -18,6 +20,8 @@ namespace PepperDash.Essentials.Core
///
public abstract class EssentialsRoomBase : ReconfigurableDevice, IEssentialsRoom
{
+
+
///
///
///
@@ -35,6 +39,16 @@ namespace PepperDash.Essentials.Core
public bool OccupancyStatusProviderIsRemote { get; private set; }
+ public List EnvironmentalControlDevices { get; protected set; }
+
+ public bool HasEnvironmentalControlDevices
+ {
+ get
+ {
+ return EnvironmentalControlDevices != null && EnvironmentalControlDevices.Count > 0;
+ }
+ }
+
protected abstract Func IsWarmingFeedbackFunc { get; }
protected abstract Func IsCoolingFeedbackFunc { get; }
@@ -119,6 +133,8 @@ namespace PepperDash.Essentials.Core
public EssentialsRoomBase(DeviceConfig config)
: base(config)
{
+ EnvironmentalControlDevices = new List();
+
// Setup the ShutdownPromptTimer
ShutdownPromptTimer = new SecondsCountdownTimer(Key + "-offTimer");
ShutdownPromptTimer.IsRunningFeedback.OutputChange += (o, a) =>
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/IEssentialsRoom.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/IEssentialsRoom.cs
index 5f94a5cd..2273690f 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/IEssentialsRoom.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/IEssentialsRoom.cs
@@ -15,7 +15,7 @@ namespace PepperDash.Essentials.Core
///
/// Describes the basic functionality of an EssentialsRoom
///
- public interface IEssentialsRoom : IKeyName, IReconfigurableDevice, IRunDefaultPresentRoute
+ public interface IEssentialsRoom : IKeyName, IReconfigurableDevice, IRunDefaultPresentRoute, IEnvironmentalControls
{
BoolFeedback OnFeedback { get; }
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Interfaces.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Interfaces.cs
index 592b0bd9..b5121e9c 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Interfaces.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Interfaces.cs
@@ -4,6 +4,8 @@ using System.Linq;
using System.Text;
using Crestron.SimplSharp;
+using PepperDash.Core;
+
namespace PepperDash.Essentials.Core
{
@@ -66,6 +68,14 @@ namespace PepperDash.Essentials.Core
bool RunDefaultCallRoute();
}
+ ///
+ /// Describes environmental controls available on a room such as lighting, shades, temperature, etc.
+ ///
+ public interface IEnvironmentalControls
+ {
+ List EnvironmentalControlDevices { get; }
+ bool HasEnvironmentalControlDevices { get; }
+ }
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Shades/Shade Interfaces.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Shades/Shade Interfaces.cs
index b4d7c88d..35492162 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Shades/Shade Interfaces.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Shades/Shade Interfaces.cs
@@ -31,6 +31,7 @@ namespace PepperDash.Essentials.Core.Shades
public interface IShadesOpenCloseStop : IShadesOpenClose
{
void StopOrPreset();
+ string StopOrPresetButtonLabel { get; }
}
///
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj
index 1fcffff2..c1873d26 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj
@@ -123,6 +123,8 @@
+
+
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs
index 2d3645f0..cf48ba1d 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs
@@ -28,9 +28,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
public class CiscoSparkCodec : VideoCodecBase, IHasCallHistory, IHasCallFavorites, IHasDirectory,
IHasScheduleAwareness, IOccupancyStatusProvider, IHasCodecLayouts, IHasCodecSelfView,
- ICommunicationMonitor, IRouting, IHasCodecCameras, IHasCameraAutoMode, IHasCodecRoomPresets,
- IHasExternalSourceSwitching, IHasBranding, IHasCameraOff, IHasCameraMute, IHasDoNotDisturbMode,
- IHasHalfWakeMode
+ ICommunicationMonitor, IRouting, IHasCodecCameras, IHasCameraAutoMode, IHasCodecRoomPresets, IHasExternalSourceSwitching, IHasBranding, IHasCameraOff, IHasCameraMute
{
private bool _externalSourceChangeRequested;
@@ -318,10 +316,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
CameraIsMutedFeedback = CameraIsOffFeedback;
SupportsCameraOff = true;
- DoNotDisturbModeIsOnFeedback = new BoolFeedback(() => CodecStatus.Status.Conference.DoNotDisturb.BoolValue);
- HalfWakeModeIsOnFeedback = new BoolFeedback(() => CodecStatus.Status.Standby.State.Value.ToLower() == "halfwake");
- EnteringStandbyModeFeedback = new BoolFeedback(() => CodecStatus.Status.Standby.State.Value.ToLower() == "enteringstandby");
-
PresentationViewMaximizedFeedback = new BoolFeedback(() => CurrentPresentationView == "Maximized");
Communication = comm;
@@ -419,12 +413,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
CodecStatus.Status.Audio.Volume.ValueChangedAction = VolumeLevelFeedback.FireUpdate;
CodecStatus.Status.Audio.VolumeMute.ValueChangedAction = MuteFeedback.FireUpdate;
CodecStatus.Status.Audio.Microphones.Mute.ValueChangedAction = PrivacyModeIsOnFeedback.FireUpdate;
- CodecStatus.Status.Standby.State.ValueChangedAction = new Action(() =>
- {
- StandbyIsOnFeedback.FireUpdate();
- HalfWakeModeIsOnFeedback.FireUpdate();
- EnteringStandbyModeFeedback.FireUpdate();
- });
+ CodecStatus.Status.Standby.State.ValueChangedAction = StandbyIsOnFeedback.FireUpdate;
CodecStatus.Status.RoomAnalytics.PeoplePresence.ValueChangedAction = RoomIsOccupiedFeedback.FireUpdate;
CodecStatus.Status.RoomAnalytics.PeopleCount.Current.ValueChangedAction = PeopleCountFeedback.FireUpdate;
CodecStatus.Status.Cameras.SpeakerTrack.Status.ValueChangedAction = CameraAutoModeIsOnFeedback.FireUpdate;
@@ -432,9 +421,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
CodecStatus.Status.Video.Selfview.Mode.ValueChangedAction = SelfviewIsOnFeedback.FireUpdate;
CodecStatus.Status.Video.Selfview.PIPPosition.ValueChangedAction = ComputeSelfviewPipStatus;
CodecStatus.Status.Video.Layout.LayoutFamily.Local.ValueChangedAction = ComputeLocalLayout;
- CodecStatus.Status.Conference.Presentation.Mode.ValueChangedAction = SharingContentIsOnFeedback.FireUpdate;
- CodecStatus.Status.Conference.Presentation.Mode.ValueChangedAction = FarEndIsSharingContentFeedback.FireUpdate;
- CodecStatus.Status.Conference.DoNotDisturb.ValueChangedAction = DoNotDisturbModeIsOnFeedback.FireUpdate;
+ CodecStatus.Status.Conference.Presentation.Mode.ValueChangedAction = () =>
+ {
+ SharingContentIsOnFeedback.FireUpdate();
+ FarEndIsSharingContentFeedback.FireUpdate();
+ };
try
{
@@ -588,7 +579,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
prefix + "/Status/Audio" + Delimiter +
prefix + "/Status/Call" + Delimiter +
prefix + "/Status/Conference/Presentation" + Delimiter +
- prefix + "/Status/Conference/DoNotDisturb" + Delimiter +
prefix + "/Status/Cameras/SpeakerTrack" + Delimiter +
prefix + "/Status/RoomAnalytics" + Delimiter +
prefix + "/Status/RoomPreset" + Delimiter +
@@ -597,11 +587,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
prefix + "/Status/Video/Layout" + Delimiter +
prefix + "/Status/Video/Input/MainVideoMute" + Delimiter +
prefix + "/Bookings" + Delimiter +
+ prefix + "/Event/CallDisconnect" + Delimiter +
prefix + "/Event/Bookings" + Delimiter +
prefix + "/Event/CameraPresetListUpdated" + Delimiter +
- prefix + "/Event/UserInterface/Presentation/ExternalSource/Selected/SourceIdentifier" + Delimiter +
- prefix + "/Event/CallDisconnect" + Delimiter; // Keep CallDisconnect last to detect when feedback registration completes correctly
-
+ prefix + "/Event/UserInterface/Presentation/ExternalSource/Selected/SourceIdentifier" + Delimiter;
}
#endregion
@@ -1510,50 +1499,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{
- var joinMap = new CiscoCodecJoinMap(joinStart);
-
- var customJoins = JoinMapHelper.TryGetJoinMapAdvancedForDevice(joinMapKey);
-
- if (customJoins != null)
- {
- joinMap.SetCustomJoinData(customJoins);
- }
-
- if (bridge != null)
- {
- bridge.AddJoinMap(Key, joinMap);
- }
-
LinkVideoCodecToApi(this, trilist, joinStart, joinMapKey, bridge);
-
- LinkCiscoCodecToApi(trilist, joinMap);
- }
-
- public void LinkCiscoCodecToApi(BasicTriList trilist, CiscoCodecJoinMap joinMap)
- {
- var dndCodec = this as IHasDoNotDisturbMode;
- if (dndCodec != null)
- {
- dndCodec.DoNotDisturbModeIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.ActivateDoNotDisturbMode.JoinNumber]);
- dndCodec.DoNotDisturbModeIsOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.DeactivateDoNotDisturbMode.JoinNumber]);
-
- trilist.SetSigFalseAction(joinMap.ActivateDoNotDisturbMode.JoinNumber, () => dndCodec.ActivateDoNotDisturbMode());
- trilist.SetSigFalseAction(joinMap.DeactivateDoNotDisturbMode.JoinNumber, () => dndCodec.DeactivateDoNotDisturbMode());
- trilist.SetSigFalseAction(joinMap.ToggleDoNotDisturbMode.JoinNumber, () => dndCodec.ToggleDoNotDisturbMode());
- }
-
- var halfwakeCodec = this as IHasHalfWakeMode;
- if (halfwakeCodec != null)
- {
- halfwakeCodec.StandbyIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.ActivateStandby.JoinNumber]);
- halfwakeCodec.StandbyIsOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.DeactivateStandby.JoinNumber]);
- halfwakeCodec.HalfWakeModeIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.ActivateHalfWakeMode.JoinNumber]);
- halfwakeCodec.EnteringStandbyModeFeedback.LinkInputSig(trilist.BooleanInput[joinMap.EnteringStandbyMode.JoinNumber]);
-
- trilist.SetSigFalseAction(joinMap.ActivateStandby.JoinNumber, () => halfwakeCodec.StandbyActivate());
- trilist.SetSigFalseAction(joinMap.DeactivateStandby.JoinNumber, () => halfwakeCodec.StandbyDeactivate());
- trilist.SetSigFalseAction(joinMap.ActivateHalfWakeMode.JoinNumber, () => halfwakeCodec.HalfwakeActivate());
- }
}
///
@@ -2127,47 +2073,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
else
CameraMuteOn();
}
-
- #region IHasDoNotDisturbMode Members
-
- public BoolFeedback DoNotDisturbModeIsOnFeedback { get; private set; }
-
- public void ActivateDoNotDisturbMode()
- {
- SendText("xCommand Conference DoNotDisturb Activate");
- }
-
- public void DeactivateDoNotDisturbMode()
- {
- SendText("xCommand Conference DoNotDisturb Deactivate");
- }
-
- public void ToggleDoNotDisturbMode()
- {
- if (DoNotDisturbModeIsOnFeedback.BoolValue)
- {
- DeactivateDoNotDisturbMode();
- }
- else
- {
- ActivateDoNotDisturbMode();
- }
- }
-
- #endregion
-
- #region IHasHalfWakeMode Members
-
- public BoolFeedback HalfWakeModeIsOnFeedback { get; private set; }
-
- public BoolFeedback EnteringStandbyModeFeedback { get; private set; }
-
- public void HalfwakeActivate()
- {
- SendText("xCommand Standby Halfwake");
- }
-
- #endregion
}
@@ -2290,5 +2195,4 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
return new VideoCodec.Cisco.CiscoSparkCodec(dc, comm);
}
}
-
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasCodecLayouts.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasCodecLayouts.cs
index a8805a21..ef0bf2bd 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasCodecLayouts.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasCodecLayouts.cs
@@ -6,6 +6,8 @@ using Crestron.SimplSharp;
using PepperDash.Essentials.Core;
+using Newtonsoft.Json;
+
namespace PepperDash.Essentials.Devices.Common.VideoCodec
{
///
@@ -25,7 +27,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
///
public interface IHasZoomRoomLayouts : IHasCodecLayouts
{
- event EventHandler AvailableLayoutsChanged;
+ event EventHandler LayoutInfoChanged;
BoolFeedback LayoutViewIsOnFirstPageFeedback { get; } // TODO: #697 [*] Consider modifying to report button visibility in func
BoolFeedback LayoutViewIsOnLastPageFeedback { get; } // TODO: #697 [*] Consider modifying to report button visibility in func
@@ -45,6 +47,17 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
public class LayoutInfoChangedEventArgs : EventArgs
{
+ [JsonProperty("availableLayouts", NullValueHandling = NullValueHandling.Ignore)]
public ZoomRoom.zConfiguration.eLayoutStyle AvailableLayouts { get; set; }
+ [JsonProperty("currentSelectedLayout", NullValueHandling = NullValueHandling.Ignore)]
+ public ZoomRoom.zConfiguration.eLayoutStyle CurrentSelectedLayout { get; set; }
+ [JsonProperty("canSwapContentWithThumbnail", NullValueHandling = NullValueHandling.Ignore)]
+ public bool CanSwapContentWithThumbnail { get; set; }
+ [JsonProperty("contentSwappedWithThumbnail", NullValueHandling = NullValueHandling.Ignore)]
+ public bool ContentSwappedWithThumbnail { get; set; }
+ [JsonProperty("layoutViewIsOnFirstPage", NullValueHandling = NullValueHandling.Ignore)]
+ public bool LayoutViewIsOnFirstPage { get; set; }
+ [JsonProperty("layoutViewIsOnLastPage", NullValueHandling = NullValueHandling.Ignore)]
+ public bool LayoutViewIsOnLastPage { get; set; }
}
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasMeetingInfo.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasMeetingInfo.cs
index 0720b319..0d304028 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasMeetingInfo.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasMeetingInfo.cs
@@ -24,24 +24,27 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
///
public class MeetingInfo
{
- [JsonProperty("id")]
+ [JsonProperty("id", NullValueHandling = NullValueHandling.Ignore)]
public string Id { get; private set; }
- [JsonProperty("name")]
+ [JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
public string Name { get; private set; }
- [JsonProperty("host")]
+ [JsonProperty("host", NullValueHandling = NullValueHandling.Ignore)]
public string Host { get; private set; }
- [JsonProperty("password")]
+ [JsonProperty("password", NullValueHandling = NullValueHandling.Ignore)]
public string Password { get; private set; }
- [JsonProperty("shareStatus")]
+ [JsonProperty("shareStatus", NullValueHandling = NullValueHandling.Ignore)]
public string ShareStatus { get; private set; }
- [JsonProperty("isHost")]
+ [JsonProperty("isHost", NullValueHandling = NullValueHandling.Ignore)]
public Boolean IsHost { get; private set; }
- [JsonProperty("isSharingMeeting")]
+ [JsonProperty("isSharingMeeting", NullValueHandling = NullValueHandling.Ignore)]
public Boolean IsSharingMeeting { get; private set; }
- [JsonProperty("waitingForHost")]
+ [JsonProperty("waitingForHost", NullValueHandling = NullValueHandling.Ignore)]
public Boolean WaitingForHost { get; private set; }
+ [JsonProperty("isLocked", NullValueHandling = NullValueHandling.Ignore)]
+ public Boolean IsLocked { get; private set; }
- public MeetingInfo(string id, string name, string host, string password, string shareStatus, bool isHost, bool isSharingMeeting, bool waitingForHost)
+
+ public MeetingInfo(string id, string name, string host, string password, string shareStatus, bool isHost, bool isSharingMeeting, bool waitingForHost, bool isLocked)
{
Id = id;
Name = name;
@@ -51,6 +54,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
IsHost = isHost;
IsSharingMeeting = isSharingMeeting;
WaitingForHost = waitingForHost;
+ IsLocked = isLocked;
}
}
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasMeetingLock.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasMeetingLock.cs
new file mode 100644
index 00000000..97fcb725
--- /dev/null
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasMeetingLock.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
+{
+ public interface IHasMeetingLock
+ {
+ BoolFeedback MeetingIsLockedFeedback { get; }
+
+ void LockMeeting();
+ void UnLockMeeting();
+ void ToggleMeetingLock();
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasMeetingRecording.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasMeetingRecording.cs
new file mode 100644
index 00000000..771a0865
--- /dev/null
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasMeetingRecording.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
+{
+ public interface IHasMeetingRecording
+ {
+ BoolFeedback MeetingIsRecordingFeedback { get; }
+
+ void StartRecording();
+ void StopRecording();
+ void ToggleRecording();
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasParticipants.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasParticipants.cs
index 409ccd89..11c5f147 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasParticipants.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasParticipants.cs
@@ -12,6 +12,18 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
public interface IHasParticipants
{
CodecParticipants Participants { get; }
+
+ ///
+ /// Removes the participant from the meeting
+ ///
+ ///
+ void RemoveParticipant(int userId);
+
+ ///
+ /// Sets the participant as the new host
+ ///
+ ///
+ void SetParticipantAsHost(int userId);
}
///
@@ -29,6 +41,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
///
public interface IHasParticipantAudioMute : IHasParticipantVideoMute
{
+ ///
+ /// Mute audio of all participants
+ ///
+ void MuteAudioForAllParticipants();
+
void MuteAudioForParticipant(int userId);
void UnmuteAudioForParticipant(int userId);
void ToggleAudioForParticipant(int userId);
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/iVideoCodecInfo.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/iVideoCodecInfo.cs
index 902dd68f..6eee454f 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/iVideoCodecInfo.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/iVideoCodecInfo.cs
@@ -4,6 +4,8 @@ using System.Linq;
using System.Text;
using Crestron.SimplSharp;
+using Newtonsoft.Json;
+
namespace PepperDash.Essentials.Devices.Common.Codec
{
///
@@ -19,12 +21,19 @@ namespace PepperDash.Essentials.Devices.Common.Codec
///
public abstract class VideoCodecInfo
{
+ [JsonProperty("multiSiteOptionIsEnabled", NullValueHandling = NullValueHandling.Ignore)]
public abstract bool MultiSiteOptionIsEnabled { get; }
+ [JsonProperty("ipAddress", NullValueHandling = NullValueHandling.Ignore)]
public abstract string IpAddress { get; }
+ [JsonProperty("sipPhoneNumber", NullValueHandling = NullValueHandling.Ignore)]
public abstract string SipPhoneNumber { get; }
+ [JsonProperty("e164Alias", NullValueHandling = NullValueHandling.Ignore)]
public abstract string E164Alias { get; }
+ [JsonProperty("h323Id", NullValueHandling = NullValueHandling.Ignore)]
public abstract string H323Id { get; }
+ [JsonProperty("sipUri", NullValueHandling = NullValueHandling.Ignore)]
public abstract string SipUri { get; }
+ [JsonProperty("autoAnswerEnabled", NullValueHandling = NullValueHandling.Ignore)]
public abstract bool AutoAnswerEnabled { get; }
}
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs
index 2549bea0..81101bde 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs
@@ -302,8 +302,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
trilist.OnlineStatusChange += (device, args) =>
{
if (!args.DeviceOnLine) return;
-
- trilist.SetString(joinMap.Schedule.JoinNumber, "\xFC");
};
}
@@ -553,6 +551,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
UpdateParticipantsXSig(codec, trilist, joinMap);
};
+
+ trilist.OnlineStatusChange += (device, args) =>
+ {
+ if (!args.DeviceOnLine) return;
+
+ // TODO [ ] Issue #868
+ trilist.SetString(joinMap.CurrentParticipants.JoinNumber, "\xFC");
+ UpdateParticipantsXSig(codec, trilist, joinMap);
+ };
}
private void UpdateParticipantsXSig(IHasParticipants codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
@@ -784,7 +791,16 @@ ScreenIndexIsPinnedTo: {8} (a{17})
UpdateMeetingsList(codec, trilist, joinMap);
}
};
- }
+
+ trilist.OnlineStatusChange += (device, args) =>
+ {
+ if (!args.DeviceOnLine) return;
+
+ // TODO [ ] Issue #868
+ trilist.SetString(joinMap.Schedule.JoinNumber, "\xFC");
+ UpdateMeetingsList(codec, trilist, joinMap);
+ };
+ }
private void UpdateMeetingsList(IHasScheduleAwareness codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
{
@@ -805,6 +821,15 @@ ScreenIndexIsPinnedTo: {8} (a{17})
var meetingsData = UpdateMeetingsListXSig(_currentMeetings);
trilist.SetString(joinMap.Schedule.JoinNumber, meetingsData);
trilist.SetUshort(joinMap.MeetingCount.JoinNumber, (ushort)_currentMeetings.Count);
+
+ trilist.OnlineStatusChange += (device, args) =>
+ {
+ if (!args.DeviceOnLine) return;
+
+ // TODO [ ] Issue #868
+ trilist.SetString(joinMap.Schedule.JoinNumber, "\xFC");
+ UpdateMeetingsListXSig(_currentMeetings);
+ };
}
private string UpdateMeetingsListXSig(List meetings)
@@ -918,6 +943,16 @@ ScreenIndexIsPinnedTo: {8} (a{17})
trilist.SetString(joinMap.DirectoryEntries.JoinNumber, directoryXSig);
};
+
+ trilist.OnlineStatusChange += (device, args) =>
+ {
+ if (!args.DeviceOnLine) return;
+
+ // TODO [ ] Issue #868
+ trilist.SetString(joinMap.DirectoryEntries.JoinNumber, "\xFC");
+ UpdateDirectoryXSig(codec.CurrentDirectoryResult,
+ !codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue);
+ };
}
private void SelectDirectoryEntry(IHasDirectory codec, ushort i)
@@ -999,6 +1034,15 @@ ScreenIndexIsPinnedTo: {8} (a{17})
trilist.SetString(joinMap.CurrentCallData.JoinNumber, UpdateCallStatusXSig());
};
+
+ trilist.OnlineStatusChange += (device, args) =>
+ {
+ if (!args.DeviceOnLine) return;
+
+ // TODO [ ] Issue #868
+ trilist.SetString(joinMap.CurrentCallData.JoinNumber, "\xFC");
+ UpdateCallStatusXSig();
+ };
}
private string UpdateCallStatusXSig()
@@ -1266,6 +1310,15 @@ ScreenIndexIsPinnedTo: {8} (a{17})
trilist.UShortOutput[joinMap.CameraPresetSelect.JoinNumber].UShortValue, String.Empty);
trilist.PulseBool(joinMap.CameraPresetSave.JoinNumber, 3000);
});
+
+ trilist.OnlineStatusChange += (device, args) =>
+ {
+ if (!args.DeviceOnLine) return;
+
+ // TODO [ ] Issue #868
+ trilist.SetString(joinMap.CameraPresetNames.JoinNumber, "\xFC");
+ SetCameraPresetNames(presetCodec.NearEndPresets);
+ };
}
private string SetCameraPresetNames(IEnumerable presets)
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ResponseObjects.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ResponseObjects.cs
index e6efd063..f6355d63 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ResponseObjects.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ResponseObjects.cs
@@ -618,13 +618,31 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
private bool _can_Switch_Speaker_View;
private bool _can_Switch_Wall_View;
private bool _can_Switch_Share_On_All_Screens;
+ private bool _can_Switch_Floating_Share_Content;
private bool _is_In_First_Page;
private bool _is_In_Last_Page;
private string _video_type;
public bool can_Adjust_Floating_Video { get; set; }
- public bool can_Switch_Floating_Share_Content { get; set; }
+
+
+ public bool can_Switch_Floating_Share_Content
+ {
+ get
+ {
+ return _can_Switch_Floating_Share_Content;
+ }
+ set
+ {
+ if (value != _can_Switch_Floating_Share_Content)
+ {
+ _can_Switch_Floating_Share_Content = value;
+ NotifyPropertyChanged("can_Switch_Floating_Share_Content");
+ }
+ }
+ }
+
///
/// [on/off] // Set to On if it is possible to invoke zConfiguration Call Layout Style: ShareAll, to switch to the ShareAll mode, where the content sharing is shown full screen on all monitors.
@@ -744,12 +762,29 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
}
}
- public class CallRecordInfo
+ public class CallRecordInfo : NotifiableObject
{
+ private bool _meetingIsBeingRecorded;
+
public bool canRecord { get; set; }
public bool emailRequired { get; set; }
public bool amIRecording { get; set; }
- public bool meetingIsBeingRecorded { get; set; }
+
+ public bool meetingIsBeingRecorded
+ {
+ get
+ {
+ return _meetingIsBeingRecorded;
+ }
+ set
+ {
+ if (value != _meetingIsBeingRecorded)
+ {
+ _meetingIsBeingRecorded = value;
+ NotifyPropertyChanged("meetingIsBeingRecorded");
+ }
+ }
+ }
}
}
@@ -1123,9 +1158,25 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
}
}
- public class Lock
+ public class Lock : NotifiableObject
{
- public bool Enable { get; set; }
+ private bool _enable;
+
+ public bool Enable
+ {
+ get
+ {
+ return _enable;
+ }
+ set
+ {
+ if (value != _enable)
+ {
+ _enable = value;
+ NotifyPropertyChanged("Enable");
+ }
+ }
+ }
}
public class ClosedCaption
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs
index a43ea79c..8fc40f29 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs
@@ -26,7 +26,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
IRouting,
IHasScheduleAwareness, IHasCodecCameras, IHasParticipants, IHasCameraOff, IHasCameraMute, IHasCameraAutoMode,
IHasFarEndContentStatus, IHasSelfviewPosition, IHasPhoneDialing, IHasZoomRoomLayouts, IHasParticipantPinUnpin,
- IHasParticipantAudioMute, IHasSelfviewSize, IPasswordPrompt, IHasStartMeeting, IHasMeetingInfo, IHasPresentationOnlyMeeting
+ IHasParticipantAudioMute, IHasSelfviewSize, IPasswordPrompt, IHasStartMeeting, IHasMeetingInfo, IHasPresentationOnlyMeeting,
+ IHasMeetingLock, IHasMeetingRecording
{
private const long MeetingRefreshTimer = 60000;
public uint DefaultMeetingDurationMin { get; private set; }
@@ -147,6 +148,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
ContentSwappedWithThumbnailFeedback = new BoolFeedback(ContentSwappedWithThumbnailFeedbackFunc);
NumberOfScreensFeedback = new IntFeedback(NumberOfScreensFeedbackFunc);
+
+ MeetingIsLockedFeedback = new BoolFeedback(() => Configuration.Call.Lock.Enable );
+
+ MeetingIsRecordingFeedback = new BoolFeedback(() => Status.Call.CallRecordInfo.meetingIsBeingRecorded );
}
public CommunicationGather PortGather { get; private set; }
@@ -499,19 +504,19 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{
var sharingStatus = GetSharingStatus();
- MeetingInfo = new MeetingInfo("", "", "", "", sharingStatus, GetIsHostMyself(), true, false);
+ MeetingInfo = new MeetingInfo("", "", "", "", sharingStatus, GetIsHostMyself(), true, false, MeetingIsLockedFeedback.BoolValue);
return;
}
var meetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, Participants.Host != null ? Participants.Host.Name : "None",
- MeetingInfo.Password, GetSharingStatus(), GetIsHostMyself(), MeetingInfo.IsSharingMeeting, MeetingInfo.WaitingForHost);
+ MeetingInfo.Password, GetSharingStatus(), GetIsHostMyself(), MeetingInfo.IsSharingMeeting, MeetingInfo.WaitingForHost, MeetingIsLockedFeedback.BoolValue);
MeetingInfo = meetingInfo;
}
catch (Exception e)
{
Debug.Console(1, this, "Error processing state property update. {0}", e.Message);
Debug.Console(2, this, e.StackTrace);
- MeetingInfo = new MeetingInfo("", "", "", "", "None", false, false, false);
+ MeetingInfo = new MeetingInfo("", "", "", "", "None", false, false, false, MeetingIsLockedFeedback.BoolValue);
}
}
@@ -578,11 +583,13 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
case "ShareThumb":
{
ContentSwappedWithThumbnailFeedback.FireUpdate();
+ OnLayoutInfoChanged();
break;
}
case "Style":
{
LocalLayoutFeedback.FireUpdate();
+ OnLayoutInfoChanged();
break;
}
case "Size":
@@ -597,6 +604,26 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
}
};
+ Configuration.Call.Lock.PropertyChanged += (o, a) =>
+ {
+ if (a.PropertyName == "Enable")
+ {
+ MeetingIsLockedFeedback.FireUpdate();
+ MeetingInfo = new MeetingInfo
+ (
+ MeetingInfo.Id,
+ MeetingInfo.Name,
+ MeetingInfo.Host,
+ MeetingInfo.Password,
+ GetSharingStatus(),
+ MeetingInfo.IsHost,
+ MeetingInfo.IsSharingMeeting,
+ MeetingInfo.WaitingForHost,
+ MeetingIsLockedFeedback.BoolValue
+ );
+ }
+ };
+
// This is to deal with incorrect object structure coming back from the Zoom Room on v 5.6.3
Configuration.Client.Call.Layout.PropertyChanged += (o, a) =>
{
@@ -613,11 +640,13 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
case "ShareThumb":
{
ContentSwappedWithThumbnailFeedback.FireUpdate();
+ OnLayoutInfoChanged();
break;
}
case "Style":
{
LocalLayoutFeedback.FireUpdate();
+ OnLayoutInfoChanged();
break;
}
}
@@ -634,13 +663,31 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
Status.Call.PropertyChanged += (o, a) =>
{
- if (a.PropertyName == "Info")
+ switch(a.PropertyName)
+ {
+ case "Info":
{
Debug.Console(1, this, "Updating Call Status");
UpdateCallStatus();
+ break;
}
+
+ case "Status":
+ {
+ UpdateCallStatus();
+ break;
+ }
+ }
};
+ Status.Call.CallRecordInfo.PropertyChanged += (o, a) =>
+ {
+ if (a.PropertyName == "meetingIsBeingRecorded")
+ {
+ MeetingIsRecordingFeedback.FireUpdate();
+ }
+ };
+
Status.Sharing.PropertyChanged += (o, a) =>
{
switch (a.PropertyName)
@@ -663,7 +710,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
return;
}
// Update the share status of the meeting info
- var meetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, MeetingInfo.Host, MeetingInfo.Password, GetSharingStatus(), GetIsHostMyself(), MeetingInfo.IsSharingMeeting, MeetingInfo.WaitingForHost);
+ var meetingInfo = new MeetingInfo(MeetingInfo.Id,
+ MeetingInfo.Name,
+ MeetingInfo.Host,
+ MeetingInfo.Password,
+ GetSharingStatus(),
+ GetIsHostMyself(),
+ MeetingInfo.IsSharingMeeting,
+ MeetingInfo.WaitingForHost,
+ MeetingIsLockedFeedback.BoolValue);
MeetingInfo = meetingInfo;
break;
}
@@ -714,13 +769,13 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
LayoutViewIsOnLastPageFeedback.FireUpdate();
break;
}
- //case "video_type":
- // {
- // It appears as though the actual value we want to watch is Configuration.Call.Layout.Style
- // LocalLayoutFeedback.FireUpdate();
- // break;
- // }
+ case "can_Switch_Floating_Share_Content":
+ {
+ CanSwapContentWithThumbnailFeedback.FireUpdate();
+ break;
+ }
}
+ OnLayoutInfoChanged();
};
Status.NumberOfScreens.PropertyChanged += (o, a) =>
@@ -1244,7 +1299,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
Participants.CurrentParticipants = participants;
// Update the share status of the meeting info
- var meetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, Participants.Host.Name, MeetingInfo.Password, MeetingInfo.ShareStatus, GetIsHostMyself(), MeetingInfo.IsSharingMeeting, MeetingInfo.WaitingForHost);
+ var meetingInfo = new MeetingInfo(
+ MeetingInfo.Id,
+ MeetingInfo.Name,
+ Participants.Host.Name,
+ MeetingInfo.Password,
+ MeetingInfo.ShareStatus,
+ GetIsHostMyself(),
+ MeetingInfo.IsSharingMeeting,
+ MeetingInfo.WaitingForHost,
+ MeetingIsLockedFeedback.BoolValue);
MeetingInfo = meetingInfo;
PrintCurrentCallParticipants();
@@ -1446,21 +1510,21 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{
Status.NeedWaitForHost = JsonConvert.DeserializeObject(responseObj.ToString());
- Debug.Console(1, this, "NeedWaitForHost: {0}", Status.NeedWaitForHost.Wait);
+ Debug.Console(1, this, "WaitingForHost: {0}", Status.NeedWaitForHost.Wait);
if (Status.NeedWaitForHost.Wait)
{
if (MeetingInfo == null)
{
MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "",
- GetSharingStatus(), false, false, true);
+ GetSharingStatus(), false, false, true, MeetingIsLockedFeedback.BoolValue);
UpdateCallStatus();
break;
}
MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "",
- GetSharingStatus(), false, false, true);
+ GetSharingStatus(), false, false, true, MeetingIsLockedFeedback.BoolValue);
UpdateCallStatus();
@@ -1470,12 +1534,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
if (MeetingInfo == null)
{
MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "",
- GetSharingStatus(), false, false, false);
+ GetSharingStatus(), false, false, false, MeetingIsLockedFeedback.BoolValue);
break;
}
MeetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, MeetingInfo.Host, MeetingInfo.Password,
- GetSharingStatus(), GetIsHostMyself(), false, false);
+ GetSharingStatus(), GetIsHostMyself(), false, false, MeetingIsLockedFeedback.BoolValue);
break;
}
@@ -1559,7 +1623,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
if (result.Success)
{
- MeetingInfo = new MeetingInfo("", "", "", "", "", true, true, MeetingInfo.WaitingForHost);
+ MeetingInfo = new MeetingInfo("", "", "", "", "", true, true, MeetingInfo.WaitingForHost, MeetingIsLockedFeedback.BoolValue);
break;
}
@@ -1904,6 +1968,22 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
GetSharingStatus(),
GetIsHostMyself(),
!String.Equals(Status.Call.Info.meeting_type,"NORMAL"),
+ false,
+ MeetingIsLockedFeedback.BoolValue
+ );
+ }
+ // TODO [ ] Issue #868
+ else if (item.Status == eCodecCallStatus.Disconnected)
+ {
+ MeetingInfo = new MeetingInfo(
+ string.Empty,
+ string.Empty,
+ string.Empty,
+ string.Empty,
+ string.Empty,
+ false,
+ false,
+ false,
false
);
}
@@ -2132,16 +2212,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
var layoutsCodec = this as IHasZoomRoomLayouts;
if (layoutsCodec != null)
{
- layoutsCodec.AvailableLayoutsChanged += (o, a) =>
+ layoutsCodec.LayoutInfoChanged += (o, a) =>
{
- trilist.SetBool(joinMap.LayoutGalleryIsAvailable.JoinNumber, zConfiguration.eLayoutStyle.Gallery
- ==
- (a.AvailableLayouts &
- zConfiguration.eLayoutStyle.Gallery));
- trilist.SetBool(joinMap.LayoutSpeakerIsAvailable.JoinNumber, zConfiguration.eLayoutStyle.Speaker
- ==
- (a.AvailableLayouts &
- zConfiguration.eLayoutStyle.Speaker));
+ trilist.SetBool(joinMap.LayoutGalleryIsAvailable.JoinNumber,
+ zConfiguration.eLayoutStyle.Gallery == (a.AvailableLayouts & zConfiguration.eLayoutStyle.Gallery));
+
+ trilist.SetBool(joinMap.LayoutSpeakerIsAvailable.JoinNumber,
+ zConfiguration.eLayoutStyle.Speaker == (a.AvailableLayouts & zConfiguration.eLayoutStyle.Speaker));
+
+
+
trilist.SetBool(joinMap.LayoutStripIsAvailable.JoinNumber, zConfiguration.eLayoutStyle.Strip
==
(a.AvailableLayouts & zConfiguration.eLayoutStyle.Strip));
@@ -2196,7 +2276,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
trilist.SetUShortSigAction(joinMap.ScreenIndexToPinUserTo.JoinNumber, (u) => ScreenIndexToPinUserTo = u);
}
- // TODO: #714 [ ] LinkZoomRoomToApi >> layoutSizeCoodec
var layoutSizeCodec = this as IHasSelfviewSize;
if (layoutSizeCodec != null)
{
@@ -2218,6 +2297,75 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
layoutSizeCodec.SelfviewPipSizeFeedback.LinkInputSig(trilist.StringInput[joinMap.GetSetSelfviewPipSize.JoinNumber]);
}
+ PasswordRequired += (device, args) =>
+ {
+ if (args.LoginAttemptCancelled)
+ {
+ trilist.SetBool(joinMap.ShowPasswordPrompt.JoinNumber, false);
+ return;
+ }
+
+ if (!string.IsNullOrEmpty(args.Message))
+ {
+ trilist.SetString(joinMap.PasswordPromptMessage.JoinNumber, args.Message);
+ }
+
+ if (args.LoginAttemptFailed)
+ {
+ trilist.SetBool(joinMap.PasswordLoginFailed.JoinNumber, true);
+ return;
+ }
+
+ trilist.SetBool(joinMap.ShowPasswordPrompt.JoinNumber, true);
+ };
+
+ MeetingInfoChanged += (device, args) =>
+ {
+ trilist.SetString(joinMap.MeetingInfoId.JoinNumber, args.Info.Id);
+ trilist.SetString(joinMap.MeetingInfoHost.JoinNumber, args.Info.Host);
+ trilist.SetString(joinMap.MeetingInfoPassword.JoinNumber, args.Info.Password);
+ trilist.SetBool(joinMap.IsHost.JoinNumber, args.Info.IsHost);
+ trilist.SetBool(joinMap.ShareOnlyMeeting.JoinNumber, args.Info.IsSharingMeeting);
+ trilist.SetBool(joinMap.WaitingForHost.JoinNumber, args.Info.WaitingForHost);
+ //trilist.SetString(joinMap.CurrentSource.JoinNumber, args.Info.ShareStatus);
+ };
+
+ trilist.SetSigTrueAction(joinMap.StartMeetingNow.JoinNumber, () => StartMeeting(0));
+ trilist.SetSigTrueAction(joinMap.ShareOnlyMeeting.JoinNumber, StartSharingOnlyMeeting);
+ trilist.SetSigTrueAction(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);
+ PasswordRequired += (devices, args) =>
+ {
+ if (args.LoginAttemptCancelled)
+ {
+ trilist.SetBool(joinMap.ShowPasswordPrompt.JoinNumber, false);
+ return;
+ }
+
+ if (!string.IsNullOrEmpty(args.Message))
+ {
+ trilist.SetString(joinMap.PasswordPromptMessage.JoinNumber, args.Message);
+ }
+
+ if (args.LoginAttemptFailed)
+ {
+ // login attempt failed
+ return;
+ }
+
+ trilist.SetBool(joinMap.PasswordIncorrect.JoinNumber, args.LastAttemptWasIncorrect);
+ trilist.SetBool(joinMap.ShowPasswordPrompt.JoinNumber, true);
+ };
+
trilist.OnlineStatusChange += (device, args) =>
{
if (!args.DeviceOnLine) return;
@@ -2334,6 +2482,56 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
}
}
+ ///
+ /// Invites contacts to a new meeting for a specified duration
+ ///
+ ///
+ ///
+ public void InviteContactsToNewMeeting(List contacts, uint duration)
+ {
+ if(duration == 0)
+ {
+ duration = DefaultMeetingDurationMin;
+ }
+
+ StringBuilder message = new StringBuilder();
+
+ // Add the prefix
+ message.Append(string.Format("zCommand Invite Duration: {0}", duration));
+
+ // Add each invitee
+ foreach (var contact in contacts)
+ {
+ var invitee = string.Format(" user: {0}", contact.ContactId);
+
+ message.Append(invitee);
+ }
+
+ SendText(message.ToString());
+ }
+
+ ///
+ /// Invites contacts to an existing meeting
+ ///
+ ///
+ public void InviteContactsToExistingMeeting(List contacts)
+ {
+ StringBuilder message = new StringBuilder();
+
+ // Add the prefix
+ message.Append(string.Format("zCommand Call Invite"));
+
+ // Add each invitee
+ foreach (var contact in contacts)
+ {
+ var invitee = string.Format(" user: {0}", contact.ContactId);
+
+ message.Append(invitee);
+ }
+
+ SendText(message.ToString());
+ }
+
///
/// Starts a PMI Meeting for the specified duration (or default meeting duration if 0 is specified)
@@ -2469,10 +2667,25 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
public CodecParticipants Participants { get; private set; }
+ public void RemoveParticipant(int userId)
+ {
+ SendText(string.Format("zCommand Call Expel Id: {0}", userId));
+ }
+
+ public void SetParticipantAsHost(int userId)
+ {
+ SendText(string.Format("zCommand Call HostChange Id: {0}", userId));
+ }
+
#endregion
#region IHasParticipantAudioMute Members
+ public void MuteAudioForAllParticipants()
+ {
+ SendText(string.Format("zCommand Call MuteAll Mute: on"));
+ }
+
public void MuteAudioForParticipant(int userId)
{
SendText(string.Format("zCommand Call MuteParticipant Mute: on Id: {0}", userId));
@@ -2770,7 +2983,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
#region IHasZoomRoomLayouts Members
- public event EventHandler AvailableLayoutsChanged;
+ public event EventHandler LayoutInfoChanged;
private Func LayoutViewIsOnFirstPageFeedbackFunc
{
@@ -2836,15 +3049,26 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
Debug.Console(1, this, "availablelayouts: {0}", availableLayouts);
- var handler = AvailableLayoutsChanged;
- if (handler != null)
- {
- handler(this, new LayoutInfoChangedEventArgs() {AvailableLayouts = availableLayouts});
- }
-
AvailableLayouts = availableLayouts;
}
+ private void OnLayoutInfoChanged()
+ {
+ var handler = LayoutInfoChanged;
+ if (handler != null)
+ {
+ handler(this, new LayoutInfoChangedEventArgs()
+ {
+ AvailableLayouts = AvailableLayouts,
+ CurrentSelectedLayout = (zConfiguration.eLayoutStyle)Enum.Parse(typeof(zConfiguration.eLayoutStyle),LocalLayoutFeedback.StringValue, true),
+ LayoutViewIsOnFirstPage = LayoutViewIsOnFirstPageFeedback.BoolValue,
+ LayoutViewIsOnLastPage = LayoutViewIsOnLastPageFeedback.BoolValue,
+ CanSwapContentWithThumbnail = CanSwapContentWithThumbnailFeedback.BoolValue,
+ ContentSwappedWithThumbnail = ContentSwappedWithThumbnailFeedback.BoolValue,
+ });
+ }
+ }
+
public void GetAvailableLayouts()
{
SendText("zStatus Call Layout");
@@ -3034,7 +3258,63 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
}
#endregion
- }
+
+ #region IHasMeetingLock Members
+
+ public BoolFeedback MeetingIsLockedFeedback { get; private set; }
+
+ public void LockMeeting()
+ {
+ SendText(string.Format("zConfiguration Call Lock Enable: on"));
+ }
+
+ public void UnLockMeeting()
+ {
+ SendText(string.Format("zConfiguration Call Lock Enable: off"));
+ }
+
+ public void ToggleMeetingLock()
+ {
+ if (MeetingIsLockedFeedback.BoolValue)
+ {
+ UnLockMeeting();
+ }
+ else
+ {
+ LockMeeting();
+ }
+ }
+
+ #endregion
+
+ #region IHasMeetingRecording Members
+
+ public BoolFeedback MeetingIsRecordingFeedback { get; private set; }
+
+ public void StartRecording()
+ {
+ SendText(string.Format("Command Call Record Enable: on"));
+ }
+
+ public void StopRecording()
+ {
+ SendText(string.Format("Command Call Record Enable: off"));
+ }
+
+ public void ToggleRecording()
+ {
+ if (MeetingIsRecordingFeedback.BoolValue)
+ {
+ StopRecording();
+ }
+ else
+ {
+ StartRecording();
+ }
+ }
+
+ #endregion
+ }
///
/// Zoom Room specific info object
@@ -3047,8 +3327,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
Configuration = configuration;
}
+ [JsonIgnore]
public ZoomRoomStatus Status { get; private set; }
- public ZoomRoomConfiguration Configuration { get; private set; }
+ [JsonIgnore]
+ public ZoomRoomConfiguration Configuration { get; private set; }
public override bool AutoAnswerEnabled
{
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomJoinMap.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomJoinMap.cs
index f70c48bf..b977cfe3 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomJoinMap.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomJoinMap.cs
@@ -1,301 +1,496 @@
-using System;
-using PepperDash.Essentials.Core;
-using PepperDash.Essentials.Core.Bridges.JoinMaps;
-
-namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
-{
- public class ZoomRoomJoinMap : VideoCodecControllerJoinMap
- {
- #region Digital
-
- [JoinName("CanSwapContentWithThumbnail")]
- public JoinDataComplete CanSwapContentWithThumbnail = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 206,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "FB Indicates if content can be swapped with thumbnail",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("SwapContentWithThumbnail")]
- public JoinDataComplete SwapContentWithThumbnail = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 206,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Pulse to swap content with thumbnail. FB reports current state",
- JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("GetAvailableLayouts")]
- public JoinDataComplete GetAvailableLayouts = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 215,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Gets the available layouts. Will update the LayoutXXXXXIsAvailbale signals.",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("LayoutIsOnFirstPage")]
- public JoinDataComplete LayoutIsOnFirstPage = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 216,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Indicates if layout is on first page",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("LayoutIsOnLastPage")]
- public JoinDataComplete LayoutIsOnLastPage = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 217,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Indicates if layout is on first page",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("LayoutTurnToNextPage")]
- public JoinDataComplete LayoutTurnToNextPage = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 216,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Turns layout view to next page",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("LayoutTurnToPreviousPage")]
- public JoinDataComplete LayoutTurnToPreviousPage = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 217,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Turns layout view to previous page",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("LayoutGalleryIsAvailable")]
- public JoinDataComplete LayoutGalleryIsAvailable = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 221,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "FB Indicates if layout 'Gallery' is available",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.DigitalSerial
- });
-
- [JoinName("LayoutSpeakerIsAvailable")]
- public JoinDataComplete LayoutSpeakerIsAvailable = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 222,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "FB Indicates if layout 'Speaker' is available",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.DigitalSerial
- });
-
- [JoinName("LayoutStripIsAvailable")]
- public JoinDataComplete LayoutStripIsAvailable = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 223,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "FB Indicates if layout 'Strip' is available",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.DigitalSerial
- });
-
- [JoinName("LayoutShareAllIsAvailable")]
- public JoinDataComplete LayoutShareAllIsAvailable = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 224,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "FB Indicates if layout 'ShareAll' is available",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.DigitalSerial
- });
-
- // TODO: #714 [ ] JoinMap >> SelfivewPipSizeToggle
- [JoinName("SelfviewPipSizeToggle")]
- public JoinDataComplete SelfviewPipSizeToggle = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 231,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Toggles the selfview pip size, (aka layout size)",
- JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- //[JoinName("ParticipantAudioMuteToggleStart")]
- //public JoinDataComplete ParticipantAudioMuteToggleStart = new JoinDataComplete(
- // new JoinData
- // {
- // JoinNumber = 500,
- // JoinSpan = 100
- // },
- // new JoinMetadata
- // {
- // Description = "Toggles the participant's audio mute status",
- // JoinCapabilities = eJoinCapabilities.ToSIMPL,
- // JoinType = eJoinType.Digital
- // });
-
- //[JoinName("ParticipantVideoMuteToggleStart")]
- //public JoinDataComplete ParticipantVideoMuteToggleStart = new JoinDataComplete(
- // new JoinData
- // {
- // JoinNumber = 800,
- // JoinSpan = 100
- // },
- // new JoinMetadata
- // {
- // Description = "Toggles the participant's video mute status",
- // JoinCapabilities = eJoinCapabilities.ToSIMPL,
- // JoinType = eJoinType.Digital
- // });
-
- //[JoinName("ParticipantPinToggleStart")]
- //public JoinDataComplete ParticipantPinToggleStart = new JoinDataComplete(
- // new JoinData
- // {
- // JoinNumber = 1100,
- // JoinSpan = 100
- // },
- // new JoinMetadata
- // {
- // Description = "Toggles the participant's pin status",
- // JoinCapabilities = eJoinCapabilities.ToSIMPL,
- // JoinType = eJoinType.Digital
- // });
-
- #endregion
-
-
- #region Analog
-
- [JoinName("NumberOfScreens")]
- public JoinDataComplete NumberOfScreens = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 11,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Reports the number of screens connected",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Analog
- });
-
- [JoinName("ScreenIndexToPinUserTo")]
- public JoinDataComplete ScreenIndexToPinUserTo = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 11,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Specifies the screen index a participant should be pinned to",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Analog
- });
-
- #endregion
-
-
- #region Serials
-
- [JoinName("GetSetCurrentLayout")]
- public JoinDataComplete GetSetCurrentLayout = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 215,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Sets and reports the current layout. Use the LayoutXXXXIsAvailable signals to determine valid layouts",
- JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
- JoinType = eJoinType.Serial
- });
-
- // TODO: #714 [ ] JoinMap >> GetSetSelfviewPipSize
- [JoinName("GetSetSelfviewPipSize")]
- public JoinDataComplete GetSetSelfviewPipSize = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 230,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Sets and reports the selfview pip size, (aka layout size).",
- JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
- JoinType = eJoinType.DigitalSerial
- });
-
- #endregion
-
- public ZoomRoomJoinMap(uint joinStart)
- : base(joinStart, typeof(ZoomRoomJoinMap))
- {
- }
-
- public ZoomRoomJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
- }
+using System;
+using PepperDash.Essentials.Core;
+using PepperDash.Essentials.Core.Bridges.JoinMaps;
+
+namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
+{
+ public class ZoomRoomJoinMap : VideoCodecControllerJoinMap
+ {
+ #region Digital
+
+ // TODO [ ] Issue #868
+ [JoinName("ShowPasswordPrompt")]
+ public JoinDataComplete ShowPasswordPrompt = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 6,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "FB Indicates to show the password prompt",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ // TODO [ ] Issue #868
+ [JoinName("PasswordIncorrect")]
+ public JoinDataComplete PasswordIncorrect = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 7,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "FB Indicates the password entered is incorrect",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ // TODO [ ] Issue #868
+ [JoinName("PassowrdLoginFailed")]
+ public JoinDataComplete PasswordLoginFailed = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 8,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "FB Indicates the password entered is incorrect",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ // TODO [ ] Issue #868
+ [JoinName("WaitingForHost")]
+ public JoinDataComplete WaitingForHost = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 9,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "FB Indicates system is waiting for host",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ // TODO [ ] Issue #868
+ [JoinName("IsHost")]
+ public JoinDataComplete IsHost = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 10,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "FB Indicates system is the host",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ // TODO [ ] Issue #868
+ [JoinName("StartMeetingNow")]
+ public JoinDataComplete StartMeetingNow = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 25,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "FB Indicates the password prompt is active",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ // TODO [ ] Issue #868
+ [JoinName("ShareOnlyMeeting")]
+ public JoinDataComplete ShareOnlyMeeting = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 26,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Triggers a share only meeting, feedback indicates the current meeting is share only",
+ JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ // TODO [ ] Issue #868
+ [JoinName("StartNormalMeetingFromSharingOnlyMeeting")]
+ public JoinDataComplete StartNormalMeetingFromSharingOnlyMeeting = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 27,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Starts a normal meeting from a share only meeting",
+ JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("CanSwapContentWithThumbnail")]
+ public JoinDataComplete CanSwapContentWithThumbnail = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 206,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "FB Indicates if content can be swapped with thumbnail",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("SwapContentWithThumbnail")]
+ public JoinDataComplete SwapContentWithThumbnail = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 206,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Pulse to swap content with thumbnail. FB reports current state",
+ JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("GetAvailableLayouts")]
+ public JoinDataComplete GetAvailableLayouts = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 215,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Gets the available layouts. Will update the LayoutXXXXXIsAvailbale signals.",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("LayoutIsOnFirstPage")]
+ public JoinDataComplete LayoutIsOnFirstPage = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 216,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Indicates if layout is on first page",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("LayoutIsOnLastPage")]
+ public JoinDataComplete LayoutIsOnLastPage = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 217,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Indicates if layout is on first page",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("LayoutTurnToNextPage")]
+ public JoinDataComplete LayoutTurnToNextPage = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 216,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Turns layout view to next page",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("LayoutTurnToPreviousPage")]
+ public JoinDataComplete LayoutTurnToPreviousPage = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 217,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Turns layout view to previous page",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("LayoutGalleryIsAvailable")]
+ public JoinDataComplete LayoutGalleryIsAvailable = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 221,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "FB Indicates if layout 'Gallery' is available",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.DigitalSerial
+ });
+
+ [JoinName("LayoutSpeakerIsAvailable")]
+ public JoinDataComplete LayoutSpeakerIsAvailable = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 222,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "FB Indicates if layout 'Speaker' is available",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.DigitalSerial
+ });
+
+ [JoinName("LayoutStripIsAvailable")]
+ public JoinDataComplete LayoutStripIsAvailable = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 223,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "FB Indicates if layout 'Strip' is available",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.DigitalSerial
+ });
+
+ [JoinName("LayoutShareAllIsAvailable")]
+ public JoinDataComplete LayoutShareAllIsAvailable = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 224,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "FB Indicates if layout 'ShareAll' is available",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.DigitalSerial
+ });
+
+ // TODO: #714 [ ] JoinMap >> SelfivewPipSizeToggle
+ [JoinName("SelfviewPipSizeToggle")]
+ public JoinDataComplete SelfviewPipSizeToggle = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 231,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Toggles the selfview pip size, (aka layout size)",
+ JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ //[JoinName("ParticipantAudioMuteToggleStart")]
+ //public JoinDataComplete ParticipantAudioMuteToggleStart = new JoinDataComplete(
+ // new JoinData
+ // {
+ // JoinNumber = 500,
+ // JoinSpan = 100
+ // },
+ // new JoinMetadata
+ // {
+ // Description = "Toggles the participant's audio mute status",
+ // JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ // JoinType = eJoinType.Digital
+ // });
+
+ //[JoinName("ParticipantVideoMuteToggleStart")]
+ //public JoinDataComplete ParticipantVideoMuteToggleStart = new JoinDataComplete(
+ // new JoinData
+ // {
+ // JoinNumber = 800,
+ // JoinSpan = 100
+ // },
+ // new JoinMetadata
+ // {
+ // Description = "Toggles the participant's video mute status",
+ // JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ // JoinType = eJoinType.Digital
+ // });
+
+ //[JoinName("ParticipantPinToggleStart")]
+ //public JoinDataComplete ParticipantPinToggleStart = new JoinDataComplete(
+ // new JoinData
+ // {
+ // JoinNumber = 1100,
+ // JoinSpan = 100
+ // },
+ // new JoinMetadata
+ // {
+ // Description = "Toggles the participant's pin status",
+ // JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ // JoinType = eJoinType.Digital
+ // });
+
+ #endregion
+
+
+ #region Analog
+
+ [JoinName("NumberOfScreens")]
+ public JoinDataComplete NumberOfScreens = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 11,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Reports the number of screens connected",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Analog
+ });
+
+ [JoinName("ScreenIndexToPinUserTo")]
+ public JoinDataComplete ScreenIndexToPinUserTo = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 11,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Specifies the screen index a participant should be pinned to",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Analog
+ });
+
+ #endregion
+
+
+ #region Serials
+
+ // TODO [ ] Issue #868
+ [JoinName("SubmitPassword")]
+ public JoinDataComplete SubmitPassword = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 6,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Submit password text",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ // TODO [ ] Issue #868
+ [JoinName("PasswordPromptMessage")]
+ public JoinDataComplete PasswordPromptMessage = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 6,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Password prompt message",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ // TODO [ ] Issue #868
+ [JoinName("MeetingInfoId")]
+ public JoinDataComplete MeetingInfoId = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 11,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Meeting info ID text feedback",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ // TODO [ ] Issue #868
+ [JoinName("MeetingInfoHostt")]
+ public JoinDataComplete MeetingInfoHost = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 12,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Meeting info Host text feedback",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ // TODO [ ] Issue #868
+ [JoinName("MeetingInfoPassword")]
+ public JoinDataComplete MeetingInfoPassword = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 13,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Meeting info Password text feedback",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("GetSetCurrentLayout")]
+ public JoinDataComplete GetSetCurrentLayout = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 215,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Sets and reports the current layout. Use the LayoutXXXXIsAvailable signals to determine valid layouts",
+ JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ // TODO: #714 [ ] JoinMap >> GetSetSelfviewPipSize
+ [JoinName("GetSetSelfviewPipSize")]
+ public JoinDataComplete GetSetSelfviewPipSize = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 230,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Sets and reports the selfview pip size, (aka layout size).",
+ JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
+ JoinType = eJoinType.DigitalSerial
+ });
+
+ #endregion
+
+ public ZoomRoomJoinMap(uint joinStart)
+ : base(joinStart, typeof(ZoomRoomJoinMap))
+ {
+ }
+
+ public ZoomRoomJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
+ }
+ }
}
\ No newline at end of file