Merge pull request #876 from PepperDash/feature/zoom-bridge-updates

Feature/zoom bridge updates
This commit is contained in:
Neil Dorin
2022-01-04 15:43:56 -07:00
committed by GitHub
20 changed files with 1223 additions and 482 deletions

View File

@@ -147,6 +147,24 @@ namespace PepperDash.Essentials.Room.Config
[JsonProperty("helpMessage")] [JsonProperty("helpMessage")]
public string HelpMessage { get; set; } public string HelpMessage { get; set; }
/// <summary>
/// Read this value to get the help message. It checks for the old and new config format.
/// </summary>
public string HelpMessageForDisplay
{
get
{
if(Help != null && !string.IsNullOrEmpty(Help.Message))
{
return Help.Message;
}
else
{
return HelpMessage;
}
}
}
[JsonProperty("environment")] [JsonProperty("environment")]
public EssentialsEnvironmentPropertiesConfig Environment { get; set; } public EssentialsEnvironmentPropertiesConfig Environment { get; set; }

View File

@@ -202,11 +202,28 @@ namespace PepperDash.Essentials
}; };
} }
SetupEnvironmentalControlDevices();
SetSourceListKey(); SetSourceListKey();
EnablePowerOnToLastSource = true; 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() private void SetSourceListKey()
{ {
if (!string.IsNullOrEmpty(PropertiesConfig.SourceListKey)) if (!string.IsNullOrEmpty(PropertiesConfig.SourceListKey))

View File

@@ -334,6 +334,8 @@ namespace PepperDash.Essentials
CallTypeFeedback = new IntFeedback(() => 0); CallTypeFeedback = new IntFeedback(() => 0);
SetupEnvironmentalControlDevices();
SetSourceListKey(); SetSourceListKey();
EnablePowerOnToLastSource = true; 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() private void SetSourceListKey()
{ {

View File

@@ -375,7 +375,7 @@ Params: {2}"
{ {
bridge.AddJoinMap(Key, joinMap); bridge.AddJoinMap(Key, joinMap);
} }
uint i;
if (_config.IsPrimary) if (_config.IsPrimary)
{ {
Debug.Console(1, this, "Linking Primary system Tuner Preset Mirroring"); Debug.Console(1, this, "Linking Primary system Tuner Preset Mirroring");

View File

@@ -1,83 +1,83 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Crestron.SimplSharp; using Crestron.SimplSharp;
using Crestron.SimplSharpPro; using Crestron.SimplSharpPro;
using Crestron.SimplSharpPro.DeviceSupport; using Crestron.SimplSharpPro.DeviceSupport;
using Newtonsoft.Json; using Newtonsoft.Json;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Essentials.Core.Bridges; using PepperDash.Essentials.Core.Bridges;
namespace PepperDash.Essentials.Core.Lighting namespace PepperDash.Essentials.Core.Lighting
{ {
public abstract class LightingBase : EssentialsBridgeableDevice, ILightingScenes public abstract class LightingBase : EssentialsBridgeableDevice, ILightingScenes
{ {
#region ILightingScenes Members #region ILightingScenes Members
public event EventHandler<LightingSceneChangeEventArgs> LightingSceneChange; public event EventHandler<LightingSceneChangeEventArgs> LightingSceneChange;
public List<LightingScene> LightingScenes { get; protected set; } public List<LightingScene> LightingScenes { get; protected set; }
public LightingScene CurrentLightingScene { get; protected set; } public LightingScene CurrentLightingScene { get; protected set; }
public IntFeedback CurrentLightingSceneFeedback { get; protected set; } public IntFeedback CurrentLightingSceneFeedback { get; protected set; }
#endregion #endregion
protected LightingBase(string key, string name) protected LightingBase(string key, string name)
: base(key, name) : base(key, name)
{
LightingScenes = new List<LightingScene>();
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();
}
}
/// <summary>
/// Sets the IsActive property on each scene and fires the LightingSceneChange event
/// </summary>
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); LightingScenes = new List<LightingScene>();
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey); CurrentLightingScene = new LightingScene();
//CurrentLightingSceneFeedback = new IntFeedback(() => { return int.Parse(this.CurrentLightingScene.ID); });
if (!string.IsNullOrEmpty(joinMapSerialized)) }
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();
}
}
/// <summary>
/// Sets the IsActive property on each scene and fires the LightingSceneChange event
/// </summary>
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<GenericLightingJoinMap>(joinMapSerialized); joinMap = JsonConvert.DeserializeObject<GenericLightingJoinMap>(joinMapSerialized);
if (bridge != null) if (bridge != null)
@@ -87,52 +87,52 @@ namespace PepperDash.Essentials.Core.Lighting
else else
{ {
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device."); 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(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
Debug.Console(0, "Linking to Lighting Type {0}", lightingDevice.GetType().Name.ToString()); Debug.Console(0, "Linking to Lighting Type {0}", lightingDevice.GetType().Name.ToString());
// GenericLighitng Actions & FeedBack // GenericLighitng Actions & FeedBack
trilist.SetUShortSigAction(joinMap.SelectScene.JoinNumber, u => lightingDevice.SelectScene(lightingDevice.LightingScenes[u])); trilist.SetUShortSigAction(joinMap.SelectScene.JoinNumber, u => lightingDevice.SelectScene(lightingDevice.LightingScenes[u]));
var sceneIndex = 0; var sceneIndex = 0;
foreach (var scene in lightingDevice.LightingScenes) 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)]); scene.IsActiveFeedback.LinkInputSig(trilist.BooleanInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex)]);
trilist.StringInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex)].StringValue = scene.Name; trilist.StringInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex)].StringValue = scene.Name;
trilist.BooleanInput[(uint)(joinMap.ButtonVisibility.JoinNumber + sceneIndex)].BoolValue = true; trilist.BooleanInput[(uint)(joinMap.ButtonVisibility.JoinNumber + sceneIndex)].BoolValue = true;
sceneIndex++; sceneIndex++;
} }
return joinMap; return joinMap;
} }
} }
public class LightingScene public class LightingScene
{ {
public string Name { get; set; } public string Name { get; set; }
public string ID { get; set; } public string ID { get; set; }
bool _IsActive; bool _IsActive;
public bool IsActive public bool IsActive
{ {
get get
{ {
return _IsActive; return _IsActive;
} }
set set
{ {
_IsActive = value; _IsActive = value;
IsActiveFeedback.FireUpdate(); IsActiveFeedback.FireUpdate();
} }
} }
public BoolFeedback IsActiveFeedback { get; set; } public BoolFeedback IsActiveFeedback { get; set; }
public LightingScene() public LightingScene()
{ {
IsActiveFeedback = new BoolFeedback(new Func<bool>(() => IsActive)); IsActiveFeedback = new BoolFeedback(new Func<bool>(() => IsActive));
} }
} }
} }

View File

@@ -11,6 +11,8 @@ using PepperDash.Essentials.Core.Config;
using PepperDash.Essentials.Core.Devices; using PepperDash.Essentials.Core.Devices;
using PepperDash.Essentials.Core.DeviceTypeInterfaces; using PepperDash.Essentials.Core.DeviceTypeInterfaces;
using Newtonsoft.Json;
namespace PepperDash.Essentials.Core namespace PepperDash.Essentials.Core
{ {
/// <summary> /// <summary>
@@ -18,6 +20,8 @@ namespace PepperDash.Essentials.Core
/// </summary> /// </summary>
public abstract class EssentialsRoomBase : ReconfigurableDevice, IEssentialsRoom public abstract class EssentialsRoomBase : ReconfigurableDevice, IEssentialsRoom
{ {
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@@ -35,6 +39,16 @@ namespace PepperDash.Essentials.Core
public bool OccupancyStatusProviderIsRemote { get; private set; } public bool OccupancyStatusProviderIsRemote { get; private set; }
public List<EssentialsDevice> EnvironmentalControlDevices { get; protected set; }
public bool HasEnvironmentalControlDevices
{
get
{
return EnvironmentalControlDevices != null && EnvironmentalControlDevices.Count > 0;
}
}
protected abstract Func<bool> IsWarmingFeedbackFunc { get; } protected abstract Func<bool> IsWarmingFeedbackFunc { get; }
protected abstract Func<bool> IsCoolingFeedbackFunc { get; } protected abstract Func<bool> IsCoolingFeedbackFunc { get; }
@@ -119,6 +133,8 @@ namespace PepperDash.Essentials.Core
public EssentialsRoomBase(DeviceConfig config) public EssentialsRoomBase(DeviceConfig config)
: base(config) : base(config)
{ {
EnvironmentalControlDevices = new List<EssentialsDevice>();
// Setup the ShutdownPromptTimer // Setup the ShutdownPromptTimer
ShutdownPromptTimer = new SecondsCountdownTimer(Key + "-offTimer"); ShutdownPromptTimer = new SecondsCountdownTimer(Key + "-offTimer");
ShutdownPromptTimer.IsRunningFeedback.OutputChange += (o, a) => ShutdownPromptTimer.IsRunningFeedback.OutputChange += (o, a) =>

View File

@@ -15,7 +15,7 @@ namespace PepperDash.Essentials.Core
/// <summary> /// <summary>
/// Describes the basic functionality of an EssentialsRoom /// Describes the basic functionality of an EssentialsRoom
/// </summary> /// </summary>
public interface IEssentialsRoom : IKeyName, IReconfigurableDevice, IRunDefaultPresentRoute public interface IEssentialsRoom : IKeyName, IReconfigurableDevice, IRunDefaultPresentRoute, IEnvironmentalControls
{ {
BoolFeedback OnFeedback { get; } BoolFeedback OnFeedback { get; }

View File

@@ -4,6 +4,8 @@ using System.Linq;
using System.Text; using System.Text;
using Crestron.SimplSharp; using Crestron.SimplSharp;
using PepperDash.Core;
namespace PepperDash.Essentials.Core namespace PepperDash.Essentials.Core
{ {
@@ -66,6 +68,14 @@ namespace PepperDash.Essentials.Core
bool RunDefaultCallRoute(); bool RunDefaultCallRoute();
} }
/// <summary>
/// Describes environmental controls available on a room such as lighting, shades, temperature, etc.
/// </summary>
public interface IEnvironmentalControls
{
List<EssentialsDevice> EnvironmentalControlDevices { get; }
bool HasEnvironmentalControlDevices { get; }
}
} }

View File

@@ -31,6 +31,7 @@ namespace PepperDash.Essentials.Core.Shades
public interface IShadesOpenCloseStop : IShadesOpenClose public interface IShadesOpenCloseStop : IShadesOpenClose
{ {
void StopOrPreset(); void StopOrPreset();
string StopOrPresetButtonLabel { get; }
} }
/// <summary> /// <summary>

View File

@@ -121,6 +121,8 @@
<Compile Include="Cameras\CameraControl.cs" /> <Compile Include="Cameras\CameraControl.cs" />
<Compile Include="Display\PanasonicThDisplay.cs" /> <Compile Include="Display\PanasonicThDisplay.cs" />
<Compile Include="VideoCodec\Interfaces\IHasMeetingInfo.cs" /> <Compile Include="VideoCodec\Interfaces\IHasMeetingInfo.cs" />
<Compile Include="VideoCodec\Interfaces\IHasMeetingLock.cs" />
<Compile Include="VideoCodec\Interfaces\IHasMeetingRecording.cs" />
<Compile Include="VideoCodec\Interfaces\IHasParticipants.cs" /> <Compile Include="VideoCodec\Interfaces\IHasParticipants.cs" />
<Compile Include="VideoCodec\Interfaces\IHasPresentationOnlyMeeting.cs" /> <Compile Include="VideoCodec\Interfaces\IHasPresentationOnlyMeeting.cs" />
<Compile Include="VideoCodec\Interfaces\IHasSelfviewPosition.cs" /> <Compile Include="VideoCodec\Interfaces\IHasSelfviewPosition.cs" />

View File

@@ -6,6 +6,8 @@ using Crestron.SimplSharp;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using Newtonsoft.Json;
namespace PepperDash.Essentials.Devices.Common.VideoCodec namespace PepperDash.Essentials.Devices.Common.VideoCodec
{ {
/// <summary> /// <summary>
@@ -25,7 +27,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// </summary> /// </summary>
public interface IHasZoomRoomLayouts : IHasCodecLayouts public interface IHasZoomRoomLayouts : IHasCodecLayouts
{ {
event EventHandler<LayoutInfoChangedEventArgs> AvailableLayoutsChanged; event EventHandler<LayoutInfoChangedEventArgs> LayoutInfoChanged;
BoolFeedback LayoutViewIsOnFirstPageFeedback { get; } // TODO: #697 [*] Consider modifying to report button visibility in func 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 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 public class LayoutInfoChangedEventArgs : EventArgs
{ {
[JsonProperty("availableLayouts", NullValueHandling = NullValueHandling.Ignore)]
public ZoomRoom.zConfiguration.eLayoutStyle AvailableLayouts { get; set; } 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; }
} }
} }

View File

@@ -24,24 +24,27 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
/// </summary> /// </summary>
public class MeetingInfo public class MeetingInfo
{ {
[JsonProperty("id")] [JsonProperty("id", NullValueHandling = NullValueHandling.Ignore)]
public string Id { get; private set; } public string Id { get; private set; }
[JsonProperty("name")] [JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
public string Name { get; private set; } public string Name { get; private set; }
[JsonProperty("host")] [JsonProperty("host", NullValueHandling = NullValueHandling.Ignore)]
public string Host { get; private set; } public string Host { get; private set; }
[JsonProperty("password")] [JsonProperty("password", NullValueHandling = NullValueHandling.Ignore)]
public string Password { get; private set; } public string Password { get; private set; }
[JsonProperty("shareStatus")] [JsonProperty("shareStatus", NullValueHandling = NullValueHandling.Ignore)]
public string ShareStatus { get; private set; } public string ShareStatus { get; private set; }
[JsonProperty("isHost")] [JsonProperty("isHost", NullValueHandling = NullValueHandling.Ignore)]
public Boolean IsHost { get; private set; } public Boolean IsHost { get; private set; }
[JsonProperty("isSharingMeeting")] [JsonProperty("isSharingMeeting", NullValueHandling = NullValueHandling.Ignore)]
public Boolean IsSharingMeeting { get; private set; } public Boolean IsSharingMeeting { get; private set; }
[JsonProperty("waitingForHost")] [JsonProperty("waitingForHost", NullValueHandling = NullValueHandling.Ignore)]
public Boolean WaitingForHost { get; private set; } 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; Id = id;
Name = name; Name = name;
@@ -51,6 +54,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
IsHost = isHost; IsHost = isHost;
IsSharingMeeting = isSharingMeeting; IsSharingMeeting = isSharingMeeting;
WaitingForHost = waitingForHost; WaitingForHost = waitingForHost;
IsLocked = isLocked;
} }
} }

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -12,6 +12,18 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
public interface IHasParticipants public interface IHasParticipants
{ {
CodecParticipants Participants { get; } CodecParticipants Participants { get; }
/// <summary>
/// Removes the participant from the meeting
/// </summary>
/// <param name="participant"></param>
void RemoveParticipant(int userId);
/// <summary>
/// Sets the participant as the new host
/// </summary>
/// <param name="participant"></param>
void SetParticipantAsHost(int userId);
} }
/// <summary> /// <summary>
@@ -29,6 +41,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
/// </summary> /// </summary>
public interface IHasParticipantAudioMute : IHasParticipantVideoMute public interface IHasParticipantAudioMute : IHasParticipantVideoMute
{ {
/// <summary>
/// Mute audio of all participants
/// </summary>
void MuteAudioForAllParticipants();
void MuteAudioForParticipant(int userId); void MuteAudioForParticipant(int userId);
void UnmuteAudioForParticipant(int userId); void UnmuteAudioForParticipant(int userId);
void ToggleAudioForParticipant(int userId); void ToggleAudioForParticipant(int userId);

View File

@@ -4,6 +4,8 @@ using System.Linq;
using System.Text; using System.Text;
using Crestron.SimplSharp; using Crestron.SimplSharp;
using Newtonsoft.Json;
namespace PepperDash.Essentials.Devices.Common.Codec namespace PepperDash.Essentials.Devices.Common.Codec
{ {
/// <summary> /// <summary>
@@ -19,12 +21,19 @@ namespace PepperDash.Essentials.Devices.Common.Codec
/// </summary> /// </summary>
public abstract class VideoCodecInfo public abstract class VideoCodecInfo
{ {
[JsonProperty("multiSiteOptionIsEnabled", NullValueHandling = NullValueHandling.Ignore)]
public abstract bool MultiSiteOptionIsEnabled { get; } public abstract bool MultiSiteOptionIsEnabled { get; }
[JsonProperty("ipAddress", NullValueHandling = NullValueHandling.Ignore)]
public abstract string IpAddress { get; } public abstract string IpAddress { get; }
[JsonProperty("sipPhoneNumber", NullValueHandling = NullValueHandling.Ignore)]
public abstract string SipPhoneNumber { get; } public abstract string SipPhoneNumber { get; }
[JsonProperty("e164Alias", NullValueHandling = NullValueHandling.Ignore)]
public abstract string E164Alias { get; } public abstract string E164Alias { get; }
[JsonProperty("h323Id", NullValueHandling = NullValueHandling.Ignore)]
public abstract string H323Id { get; } public abstract string H323Id { get; }
[JsonProperty("sipUri", NullValueHandling = NullValueHandling.Ignore)]
public abstract string SipUri { get; } public abstract string SipUri { get; }
[JsonProperty("autoAnswerEnabled", NullValueHandling = NullValueHandling.Ignore)]
public abstract bool AutoAnswerEnabled { get; } public abstract bool AutoAnswerEnabled { get; }
} }
} }

View File

@@ -302,8 +302,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
trilist.OnlineStatusChange += (device, args) => trilist.OnlineStatusChange += (device, args) =>
{ {
if (!args.DeviceOnLine) return; if (!args.DeviceOnLine) return;
trilist.SetString(joinMap.Schedule.JoinNumber, "\xFC");
}; };
} }
@@ -553,6 +551,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
UpdateParticipantsXSig(codec, trilist, joinMap); 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) private void UpdateParticipantsXSig(IHasParticipants codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
@@ -784,7 +791,16 @@ ScreenIndexIsPinnedTo: {8} (a{17})
UpdateMeetingsList(codec, trilist, joinMap); 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) private void UpdateMeetingsList(IHasScheduleAwareness codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
{ {
@@ -805,6 +821,15 @@ ScreenIndexIsPinnedTo: {8} (a{17})
var meetingsData = UpdateMeetingsListXSig(_currentMeetings); var meetingsData = UpdateMeetingsListXSig(_currentMeetings);
trilist.SetString(joinMap.Schedule.JoinNumber, meetingsData); trilist.SetString(joinMap.Schedule.JoinNumber, meetingsData);
trilist.SetUshort(joinMap.MeetingCount.JoinNumber, (ushort)_currentMeetings.Count); 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<Meeting> meetings) private string UpdateMeetingsListXSig(List<Meeting> meetings)
@@ -918,6 +943,16 @@ ScreenIndexIsPinnedTo: {8} (a{17})
trilist.SetString(joinMap.DirectoryEntries.JoinNumber, directoryXSig); 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) private void SelectDirectoryEntry(IHasDirectory codec, ushort i)
@@ -999,6 +1034,15 @@ ScreenIndexIsPinnedTo: {8} (a{17})
trilist.SetString(joinMap.CurrentCallData.JoinNumber, UpdateCallStatusXSig()); 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() private string UpdateCallStatusXSig()
@@ -1266,6 +1310,15 @@ ScreenIndexIsPinnedTo: {8} (a{17})
trilist.UShortOutput[joinMap.CameraPresetSelect.JoinNumber].UShortValue, String.Empty); trilist.UShortOutput[joinMap.CameraPresetSelect.JoinNumber].UShortValue, String.Empty);
trilist.PulseBool(joinMap.CameraPresetSave.JoinNumber, 3000); 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<CodecRoomPreset> presets) private string SetCameraPresetNames(IEnumerable<CodecRoomPreset> presets)

View File

@@ -618,13 +618,31 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
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_Share_On_All_Screens; 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_First_Page;
private bool _is_In_Last_Page; private bool _is_In_Last_Page;
private string _video_type; private string _video_type;
public bool can_Adjust_Floating_Video { get; set; } 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");
}
}
}
/// <summary> /// <summary>
/// [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. /// [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 canRecord { get; set; }
public bool emailRequired { get; set; } public bool emailRequired { get; set; }
public bool amIRecording { 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 public class ClosedCaption

View File

@@ -26,7 +26,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
IRouting, IRouting,
IHasScheduleAwareness, IHasCodecCameras, IHasParticipants, IHasCameraOff, IHasCameraMute, IHasCameraAutoMode, IHasScheduleAwareness, IHasCodecCameras, IHasParticipants, IHasCameraOff, IHasCameraMute, IHasCameraAutoMode,
IHasFarEndContentStatus, IHasSelfviewPosition, IHasPhoneDialing, IHasZoomRoomLayouts, IHasParticipantPinUnpin, IHasFarEndContentStatus, IHasSelfviewPosition, IHasPhoneDialing, IHasZoomRoomLayouts, IHasParticipantPinUnpin,
IHasParticipantAudioMute, IHasSelfviewSize, IPasswordPrompt, IHasStartMeeting, IHasMeetingInfo, IHasPresentationOnlyMeeting IHasParticipantAudioMute, IHasSelfviewSize, IPasswordPrompt, IHasStartMeeting, IHasMeetingInfo, IHasPresentationOnlyMeeting,
IHasMeetingLock, IHasMeetingRecording
{ {
private const long MeetingRefreshTimer = 60000; private const long MeetingRefreshTimer = 60000;
public uint DefaultMeetingDurationMin { get; private set; } public uint DefaultMeetingDurationMin { get; private set; }
@@ -147,6 +148,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
ContentSwappedWithThumbnailFeedback = new BoolFeedback(ContentSwappedWithThumbnailFeedbackFunc); ContentSwappedWithThumbnailFeedback = new BoolFeedback(ContentSwappedWithThumbnailFeedbackFunc);
NumberOfScreensFeedback = new IntFeedback(NumberOfScreensFeedbackFunc); NumberOfScreensFeedback = new IntFeedback(NumberOfScreensFeedbackFunc);
MeetingIsLockedFeedback = new BoolFeedback(() => Configuration.Call.Lock.Enable );
MeetingIsRecordingFeedback = new BoolFeedback(() => Status.Call.CallRecordInfo.meetingIsBeingRecorded );
} }
public CommunicationGather PortGather { get; private set; } public CommunicationGather PortGather { get; private set; }
@@ -499,19 +504,19 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{ {
var sharingStatus = GetSharingStatus(); var sharingStatus = GetSharingStatus();
MeetingInfo = new MeetingInfo("", "", "", "", sharingStatus, GetIsHostMyself(), true, false); MeetingInfo = new MeetingInfo("", "", "", "", sharingStatus, GetIsHostMyself(), true, false, MeetingIsLockedFeedback.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); MeetingInfo.Password, GetSharingStatus(), GetIsHostMyself(), MeetingInfo.IsSharingMeeting, MeetingInfo.WaitingForHost, MeetingIsLockedFeedback.BoolValue);
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); MeetingInfo = new MeetingInfo("", "", "", "", "None", false, false, false, MeetingIsLockedFeedback.BoolValue);
} }
} }
@@ -578,11 +583,13 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
case "ShareThumb": case "ShareThumb":
{ {
ContentSwappedWithThumbnailFeedback.FireUpdate(); ContentSwappedWithThumbnailFeedback.FireUpdate();
OnLayoutInfoChanged();
break; break;
} }
case "Style": case "Style":
{ {
LocalLayoutFeedback.FireUpdate(); LocalLayoutFeedback.FireUpdate();
OnLayoutInfoChanged();
break; break;
} }
case "Size": 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 // 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) => Configuration.Client.Call.Layout.PropertyChanged += (o, a) =>
{ {
@@ -613,11 +640,13 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
case "ShareThumb": case "ShareThumb":
{ {
ContentSwappedWithThumbnailFeedback.FireUpdate(); ContentSwappedWithThumbnailFeedback.FireUpdate();
OnLayoutInfoChanged();
break; break;
} }
case "Style": case "Style":
{ {
LocalLayoutFeedback.FireUpdate(); LocalLayoutFeedback.FireUpdate();
OnLayoutInfoChanged();
break; break;
} }
} }
@@ -634,13 +663,31 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
Status.Call.PropertyChanged += (o, a) => Status.Call.PropertyChanged += (o, a) =>
{ {
if (a.PropertyName == "Info") switch(a.PropertyName)
{
case "Info":
{ {
Debug.Console(1, this, "Updating Call Status"); Debug.Console(1, this, "Updating Call Status");
UpdateCallStatus(); UpdateCallStatus();
break;
} }
case "Status":
{
UpdateCallStatus();
break;
}
}
}; };
Status.Call.CallRecordInfo.PropertyChanged += (o, a) =>
{
if (a.PropertyName == "meetingIsBeingRecorded")
{
MeetingIsRecordingFeedback.FireUpdate();
}
};
Status.Sharing.PropertyChanged += (o, a) => Status.Sharing.PropertyChanged += (o, a) =>
{ {
switch (a.PropertyName) switch (a.PropertyName)
@@ -663,7 +710,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
return; return;
} }
// Update the share status of the meeting info // 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; MeetingInfo = meetingInfo;
break; break;
} }
@@ -714,13 +769,13 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
LayoutViewIsOnLastPageFeedback.FireUpdate(); LayoutViewIsOnLastPageFeedback.FireUpdate();
break; break;
} }
//case "video_type": case "can_Switch_Floating_Share_Content":
// { {
// It appears as though the actual value we want to watch is Configuration.Call.Layout.Style CanSwapContentWithThumbnailFeedback.FireUpdate();
// LocalLayoutFeedback.FireUpdate(); break;
// break; }
// }
} }
OnLayoutInfoChanged();
}; };
Status.NumberOfScreens.PropertyChanged += (o, a) => Status.NumberOfScreens.PropertyChanged += (o, a) =>
@@ -1244,7 +1299,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
Participants.CurrentParticipants = participants; Participants.CurrentParticipants = participants;
// Update the share status of the meeting info // 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; MeetingInfo = meetingInfo;
PrintCurrentCallParticipants(); PrintCurrentCallParticipants();
@@ -1446,21 +1510,21 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{ {
Status.NeedWaitForHost = JsonConvert.DeserializeObject<zEvent.NeedWaitForHost>(responseObj.ToString()); Status.NeedWaitForHost = JsonConvert.DeserializeObject<zEvent.NeedWaitForHost>(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 (Status.NeedWaitForHost.Wait)
{ {
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); GetSharingStatus(), false, false, true, MeetingIsLockedFeedback.BoolValue);
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); GetSharingStatus(), false, false, true, MeetingIsLockedFeedback.BoolValue);
UpdateCallStatus(); UpdateCallStatus();
@@ -1470,12 +1534,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); GetSharingStatus(), false, false, false, MeetingIsLockedFeedback.BoolValue);
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); GetSharingStatus(), GetIsHostMyself(), false, false, MeetingIsLockedFeedback.BoolValue);
break; break;
} }
@@ -1559,7 +1623,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
if (result.Success) if (result.Success)
{ {
MeetingInfo = new MeetingInfo("", "", "", "", "", true, true, MeetingInfo.WaitingForHost); MeetingInfo = new MeetingInfo("", "", "", "", "", true, true, MeetingInfo.WaitingForHost, MeetingIsLockedFeedback.BoolValue);
break; break;
} }
@@ -1904,6 +1968,22 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
GetSharingStatus(), GetSharingStatus(),
GetIsHostMyself(), GetIsHostMyself(),
!String.Equals(Status.Call.Info.meeting_type,"NORMAL"), !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 false
); );
} }
@@ -2132,16 +2212,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
var layoutsCodec = this as IHasZoomRoomLayouts; var layoutsCodec = this as IHasZoomRoomLayouts;
if (layoutsCodec != null) if (layoutsCodec != null)
{ {
layoutsCodec.AvailableLayoutsChanged += (o, a) => layoutsCodec.LayoutInfoChanged += (o, a) =>
{ {
trilist.SetBool(joinMap.LayoutGalleryIsAvailable.JoinNumber, zConfiguration.eLayoutStyle.Gallery trilist.SetBool(joinMap.LayoutGalleryIsAvailable.JoinNumber,
== zConfiguration.eLayoutStyle.Gallery == (a.AvailableLayouts & zConfiguration.eLayoutStyle.Gallery));
(a.AvailableLayouts &
zConfiguration.eLayoutStyle.Gallery)); trilist.SetBool(joinMap.LayoutSpeakerIsAvailable.JoinNumber,
trilist.SetBool(joinMap.LayoutSpeakerIsAvailable.JoinNumber, zConfiguration.eLayoutStyle.Speaker zConfiguration.eLayoutStyle.Speaker == (a.AvailableLayouts & zConfiguration.eLayoutStyle.Speaker));
==
(a.AvailableLayouts &
zConfiguration.eLayoutStyle.Speaker));
trilist.SetBool(joinMap.LayoutStripIsAvailable.JoinNumber, zConfiguration.eLayoutStyle.Strip trilist.SetBool(joinMap.LayoutStripIsAvailable.JoinNumber, zConfiguration.eLayoutStyle.Strip
== ==
(a.AvailableLayouts & 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); trilist.SetUShortSigAction(joinMap.ScreenIndexToPinUserTo.JoinNumber, (u) => ScreenIndexToPinUserTo = u);
} }
// TODO: #714 [ ] LinkZoomRoomToApi >> layoutSizeCoodec
var layoutSizeCodec = this as IHasSelfviewSize; var layoutSizeCodec = this as IHasSelfviewSize;
if (layoutSizeCodec != null) if (layoutSizeCodec != null)
{ {
@@ -2218,6 +2297,75 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
layoutSizeCodec.SelfviewPipSizeFeedback.LinkInputSig(trilist.StringInput[joinMap.GetSetSelfviewPipSize.JoinNumber]); 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) => trilist.OnlineStatusChange += (device, args) =>
{ {
if (!args.DeviceOnLine) return; if (!args.DeviceOnLine) return;
@@ -2334,6 +2482,56 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
} }
} }
/// <summary>
/// Invites contacts to a new meeting for a specified duration
/// </summary>
/// <param name="contacts"></param>
/// <param name="duration"></param>
public void InviteContactsToNewMeeting(List<InvitableDirectoryContact> 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());
}
/// <summary>
/// Invites contacts to an existing meeting
/// </summary>
/// <param name="contacts"></param>
public void InviteContactsToExistingMeeting(List<InvitableDirectoryContact> 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());
}
/// <summary> /// <summary>
/// Starts a PMI Meeting for the specified duration (or default meeting duration if 0 is specified) /// 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 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 #endregion
#region IHasParticipantAudioMute Members #region IHasParticipantAudioMute Members
public void MuteAudioForAllParticipants()
{
SendText(string.Format("zCommand Call MuteAll Mute: on"));
}
public void MuteAudioForParticipant(int userId) public void MuteAudioForParticipant(int userId)
{ {
SendText(string.Format("zCommand Call MuteParticipant Mute: on Id: {0}", 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 #region IHasZoomRoomLayouts Members
public event EventHandler<LayoutInfoChangedEventArgs> AvailableLayoutsChanged; public event EventHandler<LayoutInfoChangedEventArgs> LayoutInfoChanged;
private Func<bool> LayoutViewIsOnFirstPageFeedbackFunc private Func<bool> LayoutViewIsOnFirstPageFeedbackFunc
{ {
@@ -2836,15 +3049,26 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
Debug.Console(1, this, "availablelayouts: {0}", availableLayouts); Debug.Console(1, this, "availablelayouts: {0}", availableLayouts);
var handler = AvailableLayoutsChanged;
if (handler != null)
{
handler(this, new LayoutInfoChangedEventArgs() {AvailableLayouts = availableLayouts});
}
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() public void GetAvailableLayouts()
{ {
SendText("zStatus Call Layout"); SendText("zStatus Call Layout");
@@ -3034,7 +3258,63 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
} }
#endregion #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
}
/// <summary> /// <summary>
/// Zoom Room specific info object /// Zoom Room specific info object
@@ -3047,8 +3327,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
Configuration = configuration; Configuration = configuration;
} }
[JsonIgnore]
public ZoomRoomStatus Status { get; private set; } public ZoomRoomStatus Status { get; private set; }
public ZoomRoomConfiguration Configuration { get; private set; } [JsonIgnore]
public ZoomRoomConfiguration Configuration { get; private set; }
public override bool AutoAnswerEnabled public override bool AutoAnswerEnabled
{ {

View File

@@ -1,301 +1,496 @@
using System; using System;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Bridges.JoinMaps; using PepperDash.Essentials.Core.Bridges.JoinMaps;
namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{ {
public class ZoomRoomJoinMap : VideoCodecControllerJoinMap public class ZoomRoomJoinMap : VideoCodecControllerJoinMap
{ {
#region Digital #region Digital
[JoinName("CanSwapContentWithThumbnail")] // TODO [ ] Issue #868
public JoinDataComplete CanSwapContentWithThumbnail = new JoinDataComplete( [JoinName("ShowPasswordPrompt")]
new JoinData public JoinDataComplete ShowPasswordPrompt = new JoinDataComplete(
{ new JoinData
JoinNumber = 206, {
JoinSpan = 1 JoinNumber = 6,
}, JoinSpan = 1
new JoinMetadata },
{ new JoinMetadata
Description = "FB Indicates if content can be swapped with thumbnail", {
JoinCapabilities = eJoinCapabilities.ToSIMPL, Description = "FB Indicates to show the password prompt",
JoinType = eJoinType.Digital JoinCapabilities = eJoinCapabilities.ToSIMPL,
}); JoinType = eJoinType.Digital
});
[JoinName("SwapContentWithThumbnail")]
public JoinDataComplete SwapContentWithThumbnail = new JoinDataComplete( // TODO [ ] Issue #868
new JoinData [JoinName("PasswordIncorrect")]
{ public JoinDataComplete PasswordIncorrect = new JoinDataComplete(
JoinNumber = 206, new JoinData
JoinSpan = 1 {
}, JoinNumber = 7,
new JoinMetadata JoinSpan = 1
{ },
Description = "Pulse to swap content with thumbnail. FB reports current state", new JoinMetadata
JoinCapabilities = eJoinCapabilities.ToFromSIMPL, {
JoinType = eJoinType.Digital Description = "FB Indicates the password entered is incorrect",
}); JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Digital
[JoinName("GetAvailableLayouts")] });
public JoinDataComplete GetAvailableLayouts = new JoinDataComplete(
new JoinData // TODO [ ] Issue #868
{ [JoinName("PassowrdLoginFailed")]
JoinNumber = 215, public JoinDataComplete PasswordLoginFailed = new JoinDataComplete(
JoinSpan = 1 new JoinData
}, {
new JoinMetadata JoinNumber = 8,
{ JoinSpan = 1
Description = "Gets the available layouts. Will update the LayoutXXXXXIsAvailbale signals.", },
JoinCapabilities = eJoinCapabilities.FromSIMPL, new JoinMetadata
JoinType = eJoinType.Digital {
}); Description = "FB Indicates the password entered is incorrect",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
[JoinName("LayoutIsOnFirstPage")] JoinType = eJoinType.Digital
public JoinDataComplete LayoutIsOnFirstPage = new JoinDataComplete( });
new JoinData
{ // TODO [ ] Issue #868
JoinNumber = 216, [JoinName("WaitingForHost")]
JoinSpan = 1 public JoinDataComplete WaitingForHost = new JoinDataComplete(
}, new JoinData
new JoinMetadata {
{ JoinNumber = 9,
Description = "Indicates if layout is on first page", JoinSpan = 1
JoinCapabilities = eJoinCapabilities.ToSIMPL, },
JoinType = eJoinType.Digital new JoinMetadata
}); {
Description = "FB Indicates system is waiting for host",
[JoinName("LayoutIsOnLastPage")] JoinCapabilities = eJoinCapabilities.ToSIMPL,
public JoinDataComplete LayoutIsOnLastPage = new JoinDataComplete( JoinType = eJoinType.Digital
new JoinData });
{
JoinNumber = 217, // TODO [ ] Issue #868
JoinSpan = 1 [JoinName("IsHost")]
}, public JoinDataComplete IsHost = new JoinDataComplete(
new JoinMetadata new JoinData
{ {
Description = "Indicates if layout is on first page", JoinNumber = 10,
JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinSpan = 1
JoinType = eJoinType.Digital },
}); new JoinMetadata
{
[JoinName("LayoutTurnToNextPage")] Description = "FB Indicates system is the host",
public JoinDataComplete LayoutTurnToNextPage = new JoinDataComplete( JoinCapabilities = eJoinCapabilities.ToSIMPL,
new JoinData JoinType = eJoinType.Digital
{ });
JoinNumber = 216,
JoinSpan = 1 // TODO [ ] Issue #868
}, [JoinName("StartMeetingNow")]
new JoinMetadata public JoinDataComplete StartMeetingNow = new JoinDataComplete(
{ new JoinData
Description = "Turns layout view to next page", {
JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinNumber = 25,
JoinType = eJoinType.Digital JoinSpan = 1
}); },
new JoinMetadata
[JoinName("LayoutTurnToPreviousPage")] {
public JoinDataComplete LayoutTurnToPreviousPage = new JoinDataComplete( Description = "FB Indicates the password prompt is active",
new JoinData JoinCapabilities = eJoinCapabilities.FromSIMPL,
{ JoinType = eJoinType.Digital
JoinNumber = 217, });
JoinSpan = 1
}, // TODO [ ] Issue #868
new JoinMetadata [JoinName("ShareOnlyMeeting")]
{ public JoinDataComplete ShareOnlyMeeting = new JoinDataComplete(
Description = "Turns layout view to previous page", new JoinData
JoinCapabilities = eJoinCapabilities.FromSIMPL, {
JoinType = eJoinType.Digital JoinNumber = 26,
}); JoinSpan = 1
},
[JoinName("LayoutGalleryIsAvailable")] new JoinMetadata
public JoinDataComplete LayoutGalleryIsAvailable = new JoinDataComplete( {
new JoinData Description = "Triggers a share only meeting, feedback indicates the current meeting is share only",
{ JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
JoinNumber = 221, JoinType = eJoinType.Digital
JoinSpan = 1 });
},
new JoinMetadata // TODO [ ] Issue #868
{ [JoinName("StartNormalMeetingFromSharingOnlyMeeting")]
Description = "FB Indicates if layout 'Gallery' is available", public JoinDataComplete StartNormalMeetingFromSharingOnlyMeeting = new JoinDataComplete(
JoinCapabilities = eJoinCapabilities.ToSIMPL, new JoinData
JoinType = eJoinType.DigitalSerial {
}); JoinNumber = 27,
JoinSpan = 1
[JoinName("LayoutSpeakerIsAvailable")] },
public JoinDataComplete LayoutSpeakerIsAvailable = new JoinDataComplete( new JoinMetadata
new JoinData {
{ Description = "Starts a normal meeting from a share only meeting",
JoinNumber = 222, JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
JoinSpan = 1 JoinType = eJoinType.Digital
}, });
new JoinMetadata
{ [JoinName("CanSwapContentWithThumbnail")]
Description = "FB Indicates if layout 'Speaker' is available", public JoinDataComplete CanSwapContentWithThumbnail = new JoinDataComplete(
JoinCapabilities = eJoinCapabilities.ToSIMPL, new JoinData
JoinType = eJoinType.DigitalSerial {
}); JoinNumber = 206,
JoinSpan = 1
[JoinName("LayoutStripIsAvailable")] },
public JoinDataComplete LayoutStripIsAvailable = new JoinDataComplete( new JoinMetadata
new JoinData {
{ Description = "FB Indicates if content can be swapped with thumbnail",
JoinNumber = 223, JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinSpan = 1 JoinType = eJoinType.Digital
}, });
new JoinMetadata
{ [JoinName("SwapContentWithThumbnail")]
Description = "FB Indicates if layout 'Strip' is available", public JoinDataComplete SwapContentWithThumbnail = new JoinDataComplete(
JoinCapabilities = eJoinCapabilities.ToSIMPL, new JoinData
JoinType = eJoinType.DigitalSerial {
}); JoinNumber = 206,
JoinSpan = 1
[JoinName("LayoutShareAllIsAvailable")] },
public JoinDataComplete LayoutShareAllIsAvailable = new JoinDataComplete( new JoinMetadata
new JoinData {
{ Description = "Pulse to swap content with thumbnail. FB reports current state",
JoinNumber = 224, JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
JoinSpan = 1 JoinType = eJoinType.Digital
}, });
new JoinMetadata
{ [JoinName("GetAvailableLayouts")]
Description = "FB Indicates if layout 'ShareAll' is available", public JoinDataComplete GetAvailableLayouts = new JoinDataComplete(
JoinCapabilities = eJoinCapabilities.ToSIMPL, new JoinData
JoinType = eJoinType.DigitalSerial {
}); JoinNumber = 215,
JoinSpan = 1
// TODO: #714 [ ] JoinMap >> SelfivewPipSizeToggle },
[JoinName("SelfviewPipSizeToggle")] new JoinMetadata
public JoinDataComplete SelfviewPipSizeToggle = new JoinDataComplete( {
new JoinData Description = "Gets the available layouts. Will update the LayoutXXXXXIsAvailbale signals.",
{ JoinCapabilities = eJoinCapabilities.FromSIMPL,
JoinNumber = 231, JoinType = eJoinType.Digital
JoinSpan = 1 });
},
new JoinMetadata [JoinName("LayoutIsOnFirstPage")]
{ public JoinDataComplete LayoutIsOnFirstPage = new JoinDataComplete(
Description = "Toggles the selfview pip size, (aka layout size)", new JoinData
JoinCapabilities = eJoinCapabilities.ToFromSIMPL, {
JoinType = eJoinType.Digital JoinNumber = 216,
}); JoinSpan = 1
},
//[JoinName("ParticipantAudioMuteToggleStart")] new JoinMetadata
//public JoinDataComplete ParticipantAudioMuteToggleStart = new JoinDataComplete( {
// new JoinData Description = "Indicates if layout is on first page",
// { JoinCapabilities = eJoinCapabilities.ToSIMPL,
// JoinNumber = 500, JoinType = eJoinType.Digital
// JoinSpan = 100 });
// },
// new JoinMetadata [JoinName("LayoutIsOnLastPage")]
// { public JoinDataComplete LayoutIsOnLastPage = new JoinDataComplete(
// Description = "Toggles the participant's audio mute status", new JoinData
// JoinCapabilities = eJoinCapabilities.ToSIMPL, {
// JoinType = eJoinType.Digital JoinNumber = 217,
// }); JoinSpan = 1
},
//[JoinName("ParticipantVideoMuteToggleStart")] new JoinMetadata
//public JoinDataComplete ParticipantVideoMuteToggleStart = new JoinDataComplete( {
// new JoinData Description = "Indicates if layout is on first page",
// { JoinCapabilities = eJoinCapabilities.ToSIMPL,
// JoinNumber = 800, JoinType = eJoinType.Digital
// JoinSpan = 100 });
// },
// new JoinMetadata [JoinName("LayoutTurnToNextPage")]
// { public JoinDataComplete LayoutTurnToNextPage = new JoinDataComplete(
// Description = "Toggles the participant's video mute status", new JoinData
// JoinCapabilities = eJoinCapabilities.ToSIMPL, {
// JoinType = eJoinType.Digital JoinNumber = 216,
// }); JoinSpan = 1
},
//[JoinName("ParticipantPinToggleStart")] new JoinMetadata
//public JoinDataComplete ParticipantPinToggleStart = new JoinDataComplete( {
// new JoinData Description = "Turns layout view to next page",
// { JoinCapabilities = eJoinCapabilities.FromSIMPL,
// JoinNumber = 1100, JoinType = eJoinType.Digital
// JoinSpan = 100 });
// },
// new JoinMetadata [JoinName("LayoutTurnToPreviousPage")]
// { public JoinDataComplete LayoutTurnToPreviousPage = new JoinDataComplete(
// Description = "Toggles the participant's pin status", new JoinData
// JoinCapabilities = eJoinCapabilities.ToSIMPL, {
// JoinType = eJoinType.Digital JoinNumber = 217,
// }); JoinSpan = 1
},
#endregion new JoinMetadata
{
Description = "Turns layout view to previous page",
#region Analog JoinCapabilities = eJoinCapabilities.FromSIMPL,
JoinType = eJoinType.Digital
[JoinName("NumberOfScreens")] });
public JoinDataComplete NumberOfScreens = new JoinDataComplete(
new JoinData [JoinName("LayoutGalleryIsAvailable")]
{ public JoinDataComplete LayoutGalleryIsAvailable = new JoinDataComplete(
JoinNumber = 11, new JoinData
JoinSpan = 1 {
}, JoinNumber = 221,
new JoinMetadata JoinSpan = 1
{ },
Description = "Reports the number of screens connected", new JoinMetadata
JoinCapabilities = eJoinCapabilities.ToSIMPL, {
JoinType = eJoinType.Analog Description = "FB Indicates if layout 'Gallery' is available",
}); JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.DigitalSerial
[JoinName("ScreenIndexToPinUserTo")] });
public JoinDataComplete ScreenIndexToPinUserTo = new JoinDataComplete(
new JoinData [JoinName("LayoutSpeakerIsAvailable")]
{ public JoinDataComplete LayoutSpeakerIsAvailable = new JoinDataComplete(
JoinNumber = 11, new JoinData
JoinSpan = 1 {
}, JoinNumber = 222,
new JoinMetadata JoinSpan = 1
{ },
Description = "Specifies the screen index a participant should be pinned to", new JoinMetadata
JoinCapabilities = eJoinCapabilities.FromSIMPL, {
JoinType = eJoinType.Analog Description = "FB Indicates if layout 'Speaker' is available",
}); JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.DigitalSerial
#endregion });
[JoinName("LayoutStripIsAvailable")]
#region Serials public JoinDataComplete LayoutStripIsAvailable = new JoinDataComplete(
new JoinData
[JoinName("GetSetCurrentLayout")] {
public JoinDataComplete GetSetCurrentLayout = new JoinDataComplete( JoinNumber = 223,
new JoinData JoinSpan = 1
{ },
JoinNumber = 215, new JoinMetadata
JoinSpan = 1 {
}, Description = "FB Indicates if layout 'Strip' is available",
new JoinMetadata JoinCapabilities = eJoinCapabilities.ToSIMPL,
{ JoinType = eJoinType.DigitalSerial
Description = "Sets and reports the current layout. Use the LayoutXXXXIsAvailable signals to determine valid layouts", });
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
JoinType = eJoinType.Serial [JoinName("LayoutShareAllIsAvailable")]
}); public JoinDataComplete LayoutShareAllIsAvailable = new JoinDataComplete(
new JoinData
// TODO: #714 [ ] JoinMap >> GetSetSelfviewPipSize {
[JoinName("GetSetSelfviewPipSize")] JoinNumber = 224,
public JoinDataComplete GetSetSelfviewPipSize = new JoinDataComplete( JoinSpan = 1
new JoinData },
{ new JoinMetadata
JoinNumber = 230, {
JoinSpan = 1 Description = "FB Indicates if layout 'ShareAll' is available",
}, JoinCapabilities = eJoinCapabilities.ToSIMPL,
new JoinMetadata JoinType = eJoinType.DigitalSerial
{ });
Description = "Sets and reports the selfview pip size, (aka layout size).",
JoinCapabilities = eJoinCapabilities.ToFromSIMPL, // TODO: #714 [ ] JoinMap >> SelfivewPipSizeToggle
JoinType = eJoinType.DigitalSerial [JoinName("SelfviewPipSizeToggle")]
}); public JoinDataComplete SelfviewPipSizeToggle = new JoinDataComplete(
new JoinData
#endregion {
JoinNumber = 231,
public ZoomRoomJoinMap(uint joinStart) JoinSpan = 1
: base(joinStart, typeof(ZoomRoomJoinMap)) },
{ new JoinMetadata
} {
Description = "Toggles the selfview pip size, (aka layout size)",
public ZoomRoomJoinMap(uint joinStart, Type type) JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
: base(joinStart, type) 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)
{
}
}
} }