From decdaf9f1f5e88b79b3cdd535376edd90dd2078b Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Fri, 2 Oct 2020 16:58:18 -0600 Subject: [PATCH] lots of updates --- .../JoinMaps/VideoCodecControllerJoinMap.cs | 366 ++++++++++-------- .../IHasFarEndContentStatus.cs | 7 + .../PepperDash_Essentials_Core.csproj | 1 + .../Essentials Devices Common.csproj | 1 + .../Interfaces/IHasSelfviewPosition.cs | 14 + .../VideoCodec/VideoCodecBase.cs | 198 ++++++++-- .../VideoCodec/ZoomRoom/ResponseObjects.cs | 50 +-- .../VideoCodec/ZoomRoom/ZoomRoom.cs | 133 ++++++- .../VideoCodec/ZoomRoom/ZoomRoomCamera.cs | 31 +- .../ZoomRoom/ZoomRoomPropertiesConfig.cs | 9 + packages.config | 2 +- 11 files changed, 568 insertions(+), 244 deletions(-) create mode 100644 essentials-framework/Essentials Core/PepperDashEssentialsBase/DeviceTypeInterfaces/IHasFarEndContentStatus.cs create mode 100644 essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasSelfviewPosition.cs diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/VideoCodecControllerJoinMap.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/VideoCodecControllerJoinMap.cs index e28edecf..7e71ec22 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/VideoCodecControllerJoinMap.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/VideoCodecControllerJoinMap.cs @@ -36,6 +36,15 @@ namespace PepperDash_Essentials_Core.Bridges.JoinMaps JoinType = eJoinType.Digital }); + [JoinName("CameraLayoutStringFb")] public JoinDataComplete CameraLayoutStringFb = + new JoinDataComplete(new JoinData {JoinNumber = 141, JoinSpan = 1}, + new JoinMetadata + { + Description = "Current Layout Fb", + JoinCapabilities = eJoinCapabilities.ToSIMPL, + JoinType = eJoinType.Analog + }); + [JoinName("CameraModeAuto")] public JoinDataComplete CameraModeAuto = new JoinDataComplete(new JoinData {JoinNumber = 131, JoinSpan = 1}, new JoinMetadata @@ -90,6 +99,15 @@ namespace PepperDash_Essentials_Core.Bridges.JoinMaps JoinType = eJoinType.Digital }); + [JoinName("CameraPresetNames")] public JoinDataComplete CameraPresetNames = + new JoinDataComplete(new JoinData {JoinNumber = 121, JoinSpan = 1}, + new JoinMetadata + { + Description = "Camera Preset Names - XSIG, max of 15", + JoinCapabilities = eJoinCapabilities.ToSIMPL, + JoinType = eJoinType.Serial + }); + [JoinName("CameraPresetSelect")] public JoinDataComplete CameraPresetSelect = new JoinDataComplete(new JoinData {JoinNumber = 121, JoinSpan = 1}, new JoinMetadata @@ -99,13 +117,13 @@ namespace PepperDash_Essentials_Core.Bridges.JoinMaps JoinType = eJoinType.Analog }); - [JoinName("CameraPresetNames")] public JoinDataComplete CameraPresetNames = + [JoinName("CameraPresetSave")] public JoinDataComplete CameraPresetSave = new JoinDataComplete(new JoinData {JoinNumber = 121, JoinSpan = 1}, new JoinMetadata { - Description = "Camera Preset Names - XSIG, max of 15", - JoinCapabilities = eJoinCapabilities.ToSIMPL, - JoinType = eJoinType.Serial + Description = "Save Selected Preset", + JoinCapabilities = eJoinCapabilities.ToFromSIMPL, + JoinType = eJoinType.Digital }); [JoinName("CameraSelfView")] public JoinDataComplete CameraSelfView = @@ -189,12 +207,30 @@ namespace PepperDash_Essentials_Core.Bridges.JoinMaps JoinType = eJoinType.Serial }); - [JoinName("DirectoryHasChanged")] public JoinDataComplete DirectoryHasChanged = - new JoinDataComplete(new JoinData {JoinNumber = 103, JoinSpan = 1}, + [JoinName("CurrentParticipants")] public JoinDataComplete CurrentParticipants = + new JoinDataComplete(new JoinData {JoinNumber = 151, JoinSpan = 1}, + new JoinMetadata() + { + Description = "Current Participants XSig", + JoinCapabilities = eJoinCapabilities.ToSIMPL, + JoinType = eJoinType.Serial + }); + + [JoinName("CurrentSource")] public JoinDataComplete CurrentSource = + new JoinDataComplete(new JoinData {JoinNumber = 201, JoinSpan = 1}, new JoinMetadata { - Description = "Directory has changed FB", + Description = "Current Source", JoinCapabilities = eJoinCapabilities.ToSIMPL, + JoinType = eJoinType.Serial + }); + + [JoinName("DialMeeting")] public JoinDataComplete DialMeeting = + new JoinDataComplete(new JoinData {JoinNumber = 161, JoinSpan = 1}, + new JoinMetadata + { + Description = "Join first joinable meeting", + JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital }); @@ -252,6 +288,15 @@ namespace PepperDash_Essentials_Core.Bridges.JoinMaps JoinType = eJoinType.Digital }); + [JoinName("DirectoryHasChanged")] public JoinDataComplete DirectoryHasChanged = + new JoinDataComplete(new JoinData {JoinNumber = 103, JoinSpan = 1}, + new JoinMetadata + { + Description = "Directory has changed FB", + JoinCapabilities = eJoinCapabilities.ToSIMPL, + JoinType = eJoinType.Digital + }); + [JoinName("DirectoryIsRoot")] public JoinDataComplete DirectoryIsRoot = new JoinDataComplete(new JoinData {JoinNumber = 102, JoinSpan = 1}, new JoinMetadata @@ -495,37 +540,12 @@ namespace PepperDash_Essentials_Core.Bridges.JoinMaps JoinType = eJoinType.Digital }); - [JoinName("SpeedDialStart")] public JoinDataComplete SpeedDialStart = - new JoinDataComplete(new JoinData {JoinNumber = 41, JoinSpan = 4}, + + [JoinName("ManualDial")] public JoinDataComplete ManualDial = + new JoinDataComplete(new JoinData {JoinNumber = 71, JoinSpan = 1}, new JoinMetadata { - Description = "Speed Dial", - JoinCapabilities = eJoinCapabilities.ToSIMPL, - JoinType = eJoinType.Digital - }); - - [JoinName("Schedule")] public JoinDataComplete Schedule = - new JoinDataComplete(new JoinData {JoinNumber = 102, JoinSpan = 1}, - new JoinMetadata - { - Description = "Schedule Data - XSIG", - JoinCapabilities = eJoinCapabilities.ToSIMPL, - JoinType = eJoinType.Serial - }); - - [JoinName("DialMeeting")] public JoinDataComplete DialMeeting = new JoinDataComplete(new JoinData{JoinNumber=161, JoinSpan = 1}, - new JoinMetadata - { - Description = "Join first joinable meeting", - JoinCapabilities = eJoinCapabilities.FromSIMPL, - JoinType = eJoinType.Digital - }); - - [JoinName("UpdateMeetings")] public JoinDataComplete UpdateMeetings = - new JoinDataComplete(new JoinData {JoinNumber = 162, JoinSpan = 1}, - new JoinMetadata - { - Description = "Update Meetings", + Description = "Dial manual string", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital }); @@ -539,82 +559,15 @@ namespace PepperDash_Essentials_Core.Bridges.JoinMaps JoinType = eJoinType.Analog }); - - [JoinName("CameraLayoutStringFb")] - public JoinDataComplete CameraLayoutStringFb = - new JoinDataComplete(new JoinData { JoinNumber = 141, JoinSpan = 1 }, - new JoinMetadata - { - Description = "Current Layout Fb", - JoinCapabilities = eJoinCapabilities.ToSIMPL, - JoinType = eJoinType.Analog - }); - - - - - [JoinName("ManualDial")] public JoinDataComplete ManualDial = - new JoinDataComplete(new JoinData {JoinNumber = 71, JoinSpan = 1}, + [JoinName("MicMuteOff")] public JoinDataComplete MicMuteOff = + new JoinDataComplete(new JoinData {JoinNumber = 172, JoinSpan = 1}, new JoinMetadata { - Description = "Dial manual string", - JoinCapabilities = eJoinCapabilities.FromSIMPL, - JoinType = eJoinType.Digital - }); - - [JoinName("SourceShareStart")] public JoinDataComplete SourceShareStart = - new JoinDataComplete(new JoinData {JoinNumber = 201, JoinSpan = 1}, - new JoinMetadata - { - Description = "Start Sharing & Feedback", + Description = "Mic Mute Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital }); - [JoinName("SourceShareEnd")] - public JoinDataComplete SourceShareEnd = - new JoinDataComplete(new JoinData { JoinNumber = 202, JoinSpan = 1 }, - new JoinMetadata - { - Description = "Stop Sharing & Feedback", - JoinCapabilities = eJoinCapabilities.ToFromSIMPL, - JoinType = eJoinType.Digital - }); - - [JoinName("AutoShareWhileInCall")] public JoinDataComplete SourceShareAutoStart = - new JoinDataComplete(new JoinData {JoinNumber = 203, JoinSpan = 1}, - new JoinMetadata - { - Description = "When high, will autostart sharing when a call is joined", - JoinCapabilities = eJoinCapabilities.FromSIMPL, - JoinType = eJoinType.Digital - }); - - [JoinName("CurrentSource")] public JoinDataComplete CurrentSource = new JoinDataComplete(new JoinData{JoinNumber = 201, JoinSpan = 1}, - new JoinMetadata - { - Description = "Current Source", - JoinCapabilities = eJoinCapabilities.ToSIMPL, - JoinType = eJoinType.Serial - }); - - [JoinName("CurrentParticipants")] public JoinDataComplete CurrentParticipants = - new JoinDataComplete(new JoinData{JoinNumber = 151, JoinSpan = 1}, - new JoinMetadata() - { - Description = "Current Participants XSig", - JoinCapabilities = eJoinCapabilities.ToSIMPL, - JoinType = eJoinType.Serial - }); - - [JoinName("ParticipantCount")] public JoinDataComplete ParticipantCount = new JoinDataComplete(new JoinData{JoinNumber = 151, JoinSpan = 1}, - new JoinMetadata - { - Description = "Current Participant Count", - JoinCapabilities = eJoinCapabilities.ToSIMPL, - JoinType = eJoinType.Analog - }); - [JoinName("MicMuteOn")] public JoinDataComplete MicMuteOn = new JoinDataComplete(new JoinData {JoinNumber = 171, JoinSpan = 1}, new JoinMetadata @@ -624,15 +577,6 @@ namespace PepperDash_Essentials_Core.Bridges.JoinMaps JoinType = eJoinType.Digital }); - [JoinName("MicMuteOff")] public JoinDataComplete MicMuteOff = - new JoinDataComplete(new JoinData {JoinNumber = 172, JoinSpan = 1}, - new JoinMetadata - { - Description = "Mic Mute Off", - JoinCapabilities = eJoinCapabilities.ToFromSIMPL, - JoinType = eJoinType.Digital - }); - [JoinName("MicMuteToggle")] public JoinDataComplete MicMuteToggle = new JoinDataComplete(new JoinData {JoinNumber = 173, JoinSpan = 1}, new JoinMetadata @@ -642,35 +586,150 @@ namespace PepperDash_Essentials_Core.Bridges.JoinMaps JoinType = eJoinType.Digital }); - [JoinName("VolumeMuteOn")] - public JoinDataComplete VolumeMuteOn = - new JoinDataComplete(new JoinData { JoinNumber = 176, JoinSpan = 1 }, + [JoinName("MinutesBeforeMeetingStart")] public JoinDataComplete MinutesBeforeMeetingStart = + new JoinDataComplete(new JoinData {JoinNumber = 41, JoinSpan = 1}, + new JoinMetadata + { + Description = "Minutes before meeting start that a meeting is joinable", + JoinCapabilities = eJoinCapabilities.FromSIMPL, + JoinType = eJoinType.Analog + }); + + [JoinName("ParticipantCount")] public JoinDataComplete ParticipantCount = + new JoinDataComplete(new JoinData {JoinNumber = 151, JoinSpan = 1}, + new JoinMetadata + { + Description = "Current Participant Count", + JoinCapabilities = eJoinCapabilities.ToSIMPL, + JoinType = eJoinType.Analog + }); + + [JoinName("Schedule")] public JoinDataComplete Schedule = + new JoinDataComplete(new JoinData {JoinNumber = 102, JoinSpan = 1}, + new JoinMetadata + { + Description = "Schedule Data - XSIG", + JoinCapabilities = eJoinCapabilities.ToSIMPL, + JoinType = eJoinType.Serial + }); + + [JoinName("AutoShareWhileInCall")] public JoinDataComplete SourceShareAutoStart = + new JoinDataComplete(new JoinData {JoinNumber = 203, JoinSpan = 1}, + new JoinMetadata + { + Description = "When high, will autostart sharing when a call is joined", + JoinCapabilities = eJoinCapabilities.FromSIMPL, + JoinType = eJoinType.Digital + }); + + [JoinName("SourceShareEnd")] public JoinDataComplete SourceShareEnd = + new JoinDataComplete(new JoinData {JoinNumber = 202, JoinSpan = 1}, + new JoinMetadata + { + Description = "Stop Sharing & Feedback", + JoinCapabilities = eJoinCapabilities.ToFromSIMPL, + JoinType = eJoinType.Digital + }); + + [JoinName("SourceShareStart")] public JoinDataComplete SourceShareStart = + new JoinDataComplete(new JoinData {JoinNumber = 201, JoinSpan = 1}, + new JoinMetadata + { + Description = "Start Sharing & Feedback", + JoinCapabilities = eJoinCapabilities.ToFromSIMPL, + JoinType = eJoinType.Digital + }); + + [JoinName("RecievingContent")] public JoinDataComplete RecievingContent = + new JoinDataComplete(new JoinData {JoinNumber = 204, JoinSpan = 1}, + new JoinMetadata + { + Description = "Recieving content from the far end", + JoinType = eJoinType.Digital, + JoinCapabilities = eJoinCapabilities.ToSIMPL + }); + + [JoinName("SelfviewPosition")] public JoinDataComplete SelfviewPosition = + new JoinDataComplete(new JoinData {JoinNumber = 211, JoinSpan = 1}, + new JoinMetadata + { + Description = "advance selfview position", + JoinCapabilities = eJoinCapabilities.FromSIMPL, + JoinType = eJoinType.Digital + }); + + [JoinName("SelfviewPositionFb")] + public JoinDataComplete SelfviewPositionFb = + new JoinDataComplete(new JoinData { JoinNumber = 211, JoinSpan = 1 }, new JoinMetadata { - Description = "Volume Mute On", - JoinCapabilities = eJoinCapabilities.ToFromSIMPL, - JoinType = eJoinType.Digital + Description = "advance selfview position", + JoinCapabilities = eJoinCapabilities.ToSIMPL, + JoinType = eJoinType.Serial }); - [JoinName("VolumeMuteOff")] - public JoinDataComplete VolumeMuteOff = - new JoinDataComplete(new JoinData { JoinNumber = 177, JoinSpan = 1 }, - new JoinMetadata - { - Description = "Volume Mute Off", - JoinCapabilities = eJoinCapabilities.ToFromSIMPL, - JoinType = eJoinType.Digital - }); + [JoinName("SpeedDialStart")] public JoinDataComplete SpeedDialStart = + new JoinDataComplete(new JoinData {JoinNumber = 41, JoinSpan = 4}, + new JoinMetadata + { + Description = "Speed Dial", + JoinCapabilities = eJoinCapabilities.ToSIMPL, + JoinType = eJoinType.Digital + }); - [JoinName("VolumeMuteToggle")] - public JoinDataComplete VolumeMuteToggle = - new JoinDataComplete(new JoinData { JoinNumber = 178, JoinSpan = 1 }, - new JoinMetadata - { - Description = "Volume Mute Toggle", - JoinCapabilities = eJoinCapabilities.ToFromSIMPL, - JoinType = eJoinType.Digital - }); + [JoinName("UpdateMeetings")] public JoinDataComplete UpdateMeetings = + new JoinDataComplete(new JoinData {JoinNumber = 162, JoinSpan = 1}, + new JoinMetadata + { + Description = "Update Meetings", + JoinCapabilities = eJoinCapabilities.FromSIMPL, + JoinType = eJoinType.Digital + }); + + [JoinName("VolumeDown")] public JoinDataComplete VolumeDown = + new JoinDataComplete(new JoinData {JoinNumber = 175, JoinSpan = 1}, + new JoinMetadata + { + Description = "Volume Down", + JoinCapabilities = eJoinCapabilities.FromSIMPL, + JoinType = eJoinType.Digital + }); + + [JoinName("VolumeLevel")] public JoinDataComplete VolumeLevel = + new JoinDataComplete(new JoinData {JoinNumber = 174, JoinSpan = 1}, + new JoinMetadata + { + Description = "Volume Level", + JoinCapabilities = eJoinCapabilities.ToFromSIMPL, + JoinType = eJoinType.Analog + }); + + [JoinName("VolumeMuteOff")] public JoinDataComplete VolumeMuteOff = + new JoinDataComplete(new JoinData {JoinNumber = 177, JoinSpan = 1}, + new JoinMetadata + { + Description = "Volume Mute Off", + JoinCapabilities = eJoinCapabilities.ToFromSIMPL, + JoinType = eJoinType.Digital + }); + + [JoinName("VolumeMuteOn")] public JoinDataComplete VolumeMuteOn = + new JoinDataComplete(new JoinData {JoinNumber = 176, JoinSpan = 1}, + new JoinMetadata + { + Description = "Volume Mute On", + JoinCapabilities = eJoinCapabilities.ToFromSIMPL, + JoinType = eJoinType.Digital + }); + + [JoinName("VolumeMuteToggle")] public JoinDataComplete VolumeMuteToggle = + new JoinDataComplete(new JoinData {JoinNumber = 178, JoinSpan = 1}, + new JoinMetadata + { + Description = "Volume Mute Toggle", + JoinCapabilities = eJoinCapabilities.ToFromSIMPL, + JoinType = eJoinType.Digital + }); [JoinName("VolumeUp")] public JoinDataComplete VolumeUp = new JoinDataComplete(new JoinData {JoinNumber = 174, JoinSpan = 1}, @@ -681,35 +740,6 @@ namespace PepperDash_Essentials_Core.Bridges.JoinMaps JoinType = eJoinType.Digital }); - [JoinName("VolumeDown")] - public JoinDataComplete VolumeDown = - new JoinDataComplete(new JoinData { JoinNumber = 175, JoinSpan = 1 }, - new JoinMetadata - { - Description = "Volume Down", - JoinCapabilities = eJoinCapabilities.FromSIMPL, - JoinType = eJoinType.Digital - }); - - [JoinName("VolumeLevel")] - public JoinDataComplete VolumeLevel = - new JoinDataComplete(new JoinData { JoinNumber = 174, JoinSpan = 1 }, - new JoinMetadata - { - Description = "Volume Level", - JoinCapabilities = eJoinCapabilities.ToFromSIMPL, - JoinType = eJoinType.Analog - }); - - [JoinName("MinutesBeforeMeetingStart")] public JoinDataComplete MinutesBeforeMeetingStart = - new JoinDataComplete(new JoinData {JoinNumber = 41, JoinSpan = 1}, - new JoinMetadata - { - Description = "Minutes before meeting start that a meeting is joinable", - JoinCapabilities = eJoinCapabilities.FromSIMPL, - JoinType = eJoinType.Analog - }); - public VideoCodecControllerJoinMap(uint joinStart) : base(joinStart, typeof (VideoCodecControllerJoinMap)) { } diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/DeviceTypeInterfaces/IHasFarEndContentStatus.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/DeviceTypeInterfaces/IHasFarEndContentStatus.cs new file mode 100644 index 00000000..21bde91f --- /dev/null +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/DeviceTypeInterfaces/IHasFarEndContentStatus.cs @@ -0,0 +1,7 @@ +namespace PepperDash.Essentials.Core.DeviceTypeInterfaces +{ + public interface IHasFarEndContentStatus + { + BoolFeedback ReceivingContent { get; } + } +} \ No newline at end of file diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj index 3bd74bdc..7524c8d7 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj @@ -196,6 +196,7 @@ + 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 94988b7b..f115f401 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 @@ -121,6 +121,7 @@ + diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasSelfviewPosition.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasSelfviewPosition.cs new file mode 100644 index 00000000..5360b80a --- /dev/null +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/Interfaces/IHasSelfviewPosition.cs @@ -0,0 +1,14 @@ +using PepperDash.Essentials.Core; +using PepperDash.Essentials.Devices.Common.VideoCodec.Cisco; + +namespace PepperDash.Essentials.Core.DeviceTypeInterfaces +{ + public interface IHasSelfviewPosition + { + StringFeedback SelfviewPipPositionFeedback { get; } + + void SelfviewPipPositionSet(CodecCommandWithLabel position); + + void SelfviewPipPositionToggle(); + } +} \ 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 6874e049..1e9e96cd 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 @@ -12,7 +12,8 @@ using PepperDash.Core.WebApi.Presets; using PepperDash.Essentials.Core; using PepperDash.Essentials.Core.Bridges; using PepperDash.Essentials.Core.Config; -using PepperDash.Essentials.Core.Devices; +using PepperDash.Essentials.Core.Devices; +using PepperDash.Essentials.Core.DeviceTypeInterfaces; using PepperDash.Essentials.Core.Routing; using PepperDash.Essentials.Devices.Common.Cameras; using PepperDash.Essentials.Devices.Common.Codec; @@ -198,7 +199,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec /// /// /// - protected void OnCallStatusChange(CodecActiveCallItem item) + protected virtual void OnCallStatusChange(CodecActiveCallItem item) { var handler = CallStatusChange; if (handler != null) @@ -320,6 +321,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec if (codec is IHasCodecLayouts) { LinkVideoCodecCameraLayoutsToApi(codec as IHasCodecLayouts, trilist, joinMap); + } + + if (codec is IHasSelfviewPosition) + { + LinkVideoCodecSelfviewPositionToApi(codec as IHasSelfviewPosition, trilist, joinMap); } if (codec is IHasDirectory) @@ -335,6 +341,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec if (codec is IHasParticipants) { LinkVideoCodecParticipantsToApi(codec as IHasParticipants, trilist, joinMap); + } + + if (codec is IHasFarEndContentStatus) + { + (codec as IHasFarEndContentStatus).ReceivingContent.LinkInputSig(trilist.BooleanInput[joinMap.RecievingContent.JoinNumber]); } trilist.OnlineStatusChange += (device, args) => @@ -360,15 +371,25 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec { trilist.SetBool(joinMap.CameraSupportsAutoMode.JoinNumber, true); - (codec as IHasCameraAutoMode).CameraAutoModeIsOnFeedback.InvokeFireUpdate(); + (codec as IHasCameraAutoMode).CameraAutoModeIsOnFeedback.FireUpdate(); } if (codec is IHasCodecSelfView) { - (codec as IHasCodecSelfView).SelfviewIsOnFeedback.InvokeFireUpdate(); + (codec as IHasCodecSelfView).SelfviewIsOnFeedback.FireUpdate(); + } + + if (codec is IHasCameraAutoMode) + { + (codec as IHasCameraAutoMode).CameraAutoModeIsOnFeedback.FireUpdate(); + } + + if (codec is IHasCameraOff) + { + (codec as IHasCameraOff).CameraIsOffFeedback.FireUpdate(); } - SharingContentIsOnFeedback.InvokeFireUpdate(); + SharingContentIsOnFeedback.FireUpdate(); trilist.SetBool(joinMap.HookState.JoinNumber, IsInCall); @@ -376,11 +397,53 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec }; } + private void LinkVideoCodecSelfviewPositionToApi(IHasSelfviewPosition codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap) + { + trilist.SetSigFalseAction(joinMap.SelfviewPosition.JoinNumber, codec.SelfviewPipPositionToggle); + + codec.SelfviewPipPositionFeedback.LinkInputSig(trilist.StringInput[joinMap.SelfviewPositionFb.JoinNumber]); + } + private void LinkVideoCodecCameraOffToApi(IHasCameraOff codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap) { - codec.CameraIsOffFeedback.LinkInputSig(trilist.BooleanInput[joinMap.CameraModeOff.JoinNumber]); - trilist.SetSigFalseAction(joinMap.CameraModeOff.JoinNumber, codec.CameraOff); + + codec.CameraIsOffFeedback.OutputChange += (o, a) => + { + if (a.BoolValue) + { + trilist.SetBool(joinMap.CameraModeOff.JoinNumber, true); + trilist.SetBool(joinMap.CameraModeManual.JoinNumber, false); + trilist.SetBool(joinMap.CameraModeAuto.JoinNumber, false); + return; + } + + trilist.SetBool(joinMap.CameraModeOff.JoinNumber, false); + + var autoCodec = codec as IHasCameraAutoMode; + + if (autoCodec == null) return; + + trilist.SetBool(joinMap.CameraModeAuto.JoinNumber, autoCodec.CameraAutoModeIsOnFeedback.BoolValue); + trilist.SetBool(joinMap.CameraModeManual.JoinNumber, !autoCodec.CameraAutoModeIsOnFeedback.BoolValue); + }; + + if (codec.CameraIsOffFeedback.BoolValue) + { + trilist.SetBool(joinMap.CameraModeOff.JoinNumber, true); + trilist.SetBool(joinMap.CameraModeManual.JoinNumber, false); + trilist.SetBool(joinMap.CameraModeAuto.JoinNumber, false); + return; + } + + trilist.SetBool(joinMap.CameraModeOff.JoinNumber, false); + + var autoModeCodec = codec as IHasCameraAutoMode; + + if (autoModeCodec == null) return; + + trilist.SetBool(joinMap.CameraModeAuto.JoinNumber, autoModeCodec.CameraAutoModeIsOnFeedback.BoolValue); + trilist.SetBool(joinMap.CameraModeManual.JoinNumber, !autoModeCodec.CameraAutoModeIsOnFeedback.BoolValue); } private void LinkVideoCodecVolumeToApi(BasicTriList trilist, VideoCodecControllerJoinMap joinMap) @@ -779,15 +842,56 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec private void LinkVideoCodecCameraModeToApi(IHasCameraAutoMode codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap) { trilist.SetSigFalseAction(joinMap.CameraModeAuto.JoinNumber, codec.CameraAutoModeOn); - trilist.SetSigFalseAction(joinMap.CameraModeManual.JoinNumber, codec.CameraAutoModeOff); - - codec.CameraAutoModeIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.CameraModeAuto.JoinNumber]); - codec.CameraAutoModeIsOnFeedback.LinkComplementInputSig( - trilist.BooleanInput[joinMap.CameraModeManual.JoinNumber]); + trilist.SetSigFalseAction(joinMap.CameraModeManual.JoinNumber, codec.CameraAutoModeOff); + + codec.CameraAutoModeIsOnFeedback.OutputChange += (o, a) => + { + var offCodec = codec as IHasCameraOff; + + if (offCodec != null) + { + if (offCodec.CameraIsOffFeedback.BoolValue) + { + trilist.SetBool(joinMap.CameraModeAuto.JoinNumber, false); + trilist.SetBool(joinMap.CameraModeManual.JoinNumber, false); + trilist.SetBool(joinMap.CameraModeOff.JoinNumber, true); + return; + } + + trilist.SetBool(joinMap.CameraModeAuto.JoinNumber, a.BoolValue); + trilist.SetBool(joinMap.CameraModeManual.JoinNumber, !a.BoolValue); + trilist.SetBool(joinMap.CameraModeOff.JoinNumber, false); + return; + } + + trilist.SetBool(joinMap.CameraModeAuto.JoinNumber, a.BoolValue); + trilist.SetBool(joinMap.CameraModeManual.JoinNumber, !a.BoolValue); + trilist.SetBool(joinMap.CameraModeOff.JoinNumber, false); + }; + + var offModeCodec = codec as IHasCameraOff; + + if (offModeCodec != null) + { + if (offModeCodec.CameraIsOffFeedback.BoolValue) + { + trilist.SetBool(joinMap.CameraModeAuto.JoinNumber, false); + trilist.SetBool(joinMap.CameraModeManual.JoinNumber, false); + trilist.SetBool(joinMap.CameraModeOff.JoinNumber, true); + return; + } + + trilist.SetBool(joinMap.CameraModeAuto.JoinNumber, codec.CameraAutoModeIsOnFeedback.BoolValue); + trilist.SetBool(joinMap.CameraModeManual.JoinNumber, !codec.CameraAutoModeIsOnFeedback.BoolValue); + trilist.SetBool(joinMap.CameraModeOff.JoinNumber, false); + return; + } + + trilist.SetBool(joinMap.CameraModeAuto.JoinNumber, codec.CameraAutoModeIsOnFeedback.BoolValue); + trilist.SetBool(joinMap.CameraModeManual.JoinNumber, !codec.CameraAutoModeIsOnFeedback.BoolValue); + trilist.SetBool(joinMap.CameraModeOff.JoinNumber, false); } - - private void LinkVideoCodecSelfviewToApi(IHasCodecSelfView codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap) { @@ -875,9 +979,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec { var i = (ushort) codec.Cameras.FindIndex((c) => c.Key == args.SelectedCamera.Key); - trilist.SetUshort(joinMap.CameraPresetSelect.JoinNumber, i); - - if (codec is IHasCodecRoomPresets) + if (codec is IHasCodecRoomPresets) { return; } @@ -890,25 +992,59 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec var cam = args.SelectedCamera as IHasCameraPresets; SetCameraPresetNames(cam.Presets); - (args.SelectedCamera as IHasCameraPresets).PresetsListHasChanged += (o, eventArgs) => SetCameraPresetNames(cam.Presets); - }; + (args.SelectedCamera as IHasCameraPresets).PresetsListHasChanged += (o, eventArgs) => SetCameraPresetNames(cam.Presets); + + trilist.SetUShortSigAction(joinMap.CameraPresetSelect.JoinNumber, + (a) => + { + cam.PresetSelect(a); + trilist.SetUshort(joinMap.CameraPresetSelect.JoinNumber, a); + }); + + trilist.SetSigFalseAction(joinMap.CameraPresetSave.JoinNumber, + () => + { + cam.PresetStore(trilist.UShortOutput[joinMap.CameraPresetSelect.JoinNumber].UShortValue, + String.Empty); + trilist.PulseBool(joinMap.CameraPresetSave.JoinNumber, 3000); + }); + }; + + if (!(codec is IHasCodecRoomPresets)) return; + + var presetCodec = codec as IHasCodecRoomPresets; + + presetCodec.CodecRoomPresetsListHasChanged += + (sender, args) => SetCameraPresetNames(presetCodec.NearEndPresets); //Camera Presets - trilist.SetUShortSigAction(joinMap.CameraPresetSelect.JoinNumber, (i) => - { - if (codec.SelectedCamera == null) return; - - var cam = codec.SelectedCamera as IHasCameraPresets; - - if (cam == null) return; - - cam.PresetSelect(i); + trilist.SetUShortSigAction(joinMap.CameraPresetSelect.JoinNumber, (i) => + { + presetCodec.CodecRoomPresetSelect(i); trilist.SetUshort(joinMap.CameraPresetSelect.JoinNumber, i); - }); + }); + + trilist.SetSigFalseAction(joinMap.CameraPresetSave.JoinNumber, + () => + { + presetCodec.CodecRoomPresetStore( + trilist.UShortOutput[joinMap.CameraPresetSelect.JoinNumber].UShortValue, String.Empty); + trilist.PulseBool(joinMap.CameraPresetSave.JoinNumber, 3000); + }); + } + + private string SetCameraPresetNames(IEnumerable presets) + { + return SetCameraPresetNames(presets.Select(p => p.Description).ToList()); + } + + private string SetCameraPresetNames(IEnumerable presets) + { + return SetCameraPresetNames(presets.Select(p => p.Description).ToList()); } - private string SetCameraPresetNames(List presets) + private string SetCameraPresetNames(ICollection presets) { var i = 1; //start index for xsig; @@ -916,7 +1052,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec foreach (var preset in presets) { - var cameraPreset = new XSigSerialToken(i, preset.Description); + var cameraPreset = new XSigSerialToken(i, preset); tokenArray[i - 1] = cameraPreset; i++; } 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 f49f6281..5f316523 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 @@ -370,7 +370,20 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom public CallRecordInfo CallRecordInfo { get; set; } - public zCommand.InfoResult Info { get; set; } + private zCommand.InfoResult _info; + + public zCommand.InfoResult Info + { + get + { + return _info; + } + set + { + _info = value; + NotifyPropertyChanged("Info"); + } + } public Call() { @@ -702,7 +715,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom public class Camera : NotifiableObject { - private string _muteState; private bool _mute; public bool Mute @@ -710,30 +722,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom get { return _mute; } set { + Debug.Console(1, "Camera Mute response received: {0}", value); + if (value == _mute) return; - + _mute = value; NotifyPropertyChanged("Mute"); } } - - [JsonProperty("mute")] - public string MuteState - { - get - { - return _muteState; - } - set - { - if (value != _muteState) - { - _muteState = value; - - Mute = _muteState == "on"; - } - } - } } public class Microphone : NotifiableObject @@ -787,12 +783,20 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom DownLeft } - public class Layout + public class Layout:NotifiableObject { public bool ShareThumb { get; set; } public eLayoutStyle Style { get; set; } public eLayoutSize Size { get; set; } - public eLayoutPosition Position { get; set; } + + private eLayoutPosition _position; + public eLayoutPosition Position { + get { return _position; } + set + { + _position = value; + NotifyPropertyChanged("Position"); + } } } public class Lock 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 657a27c8..1b7e6ec4 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 @@ -11,16 +11,18 @@ using PepperDash.Core; using PepperDash.Essentials.Core; using PepperDash.Essentials.Core.Bridges; using PepperDash.Essentials.Core.Config; +using PepperDash.Essentials.Core.DeviceTypeInterfaces; using PepperDash.Essentials.Core.Routing; using PepperDash.Essentials.Devices.Common.Cameras; using PepperDash.Essentials.Devices.Common.Codec; +using PepperDash.Essentials.Devices.Common.VideoCodec.Cisco; using PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces; namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom { public class ZoomRoom : VideoCodecBase, IHasCodecSelfView, IHasDirectoryHistoryStack, ICommunicationMonitor, IRouting, - IHasScheduleAwareness, IHasCodecCameras, IHasParticipants, IHasCameraOff, IHasCameraAutoMode + IHasScheduleAwareness, IHasCodecCameras, IHasParticipants, IHasCameraOff, IHasCameraAutoMode, IHasFarEndContentStatus, IHasSelfviewPosition { private const long MeetingRefreshTimer = 60000; private const uint DefaultMeetingDurationMin = 30; @@ -98,6 +100,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom CodecSchedule = new CodecScheduleAwareness(MeetingRefreshTimer); + ReceivingContent = new BoolFeedback(FarEndIsSharingContentFeedbackFunc); + + SelfviewPipPositionFeedback = new StringFeedback(SelfviewPipPositionFeedbackFunc); + SetUpFeedbackActions(); Cameras = new List(); @@ -152,7 +158,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom protected Func FarEndIsSharingContentFeedbackFunc { - get { return () => false; } + get { return () => Status.Call.Sharing.State == zEvent.eSharingState.Receiving; } } protected override Func MuteFeedbackFunc @@ -183,17 +189,17 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom protected Func CameraIsOffFeedbackFunc { - get { return () => Configuration.Camera.Mute; } + get { return () => Configuration.Call.Camera.Mute; } } protected Func CameraAutoModeIsOnFeedbackFunc { - get { return () => !Configuration.Camera.Mute; } + get { return () => false; } } protected Func SelfviewPipPositionFeedbackFunc { - get { return () => ""; } + get { return () => _currentSelfviewPipPosition.Command; } } protected Func LocalLayoutFeedbackFunc @@ -432,11 +438,23 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom } }; - Configuration.Camera.PropertyChanged += (o, a) => + Configuration.Call.Camera.PropertyChanged += (o, a) => { + Debug.Console(1, this, "Configuration.Call.Camera.PropertyChanged: {0}", a.PropertyName); + if (a.PropertyName != "Mute") return; CameraIsOffFeedback.FireUpdate(); + CameraAutoModeIsOnFeedback.FireUpdate(); + }; + + Configuration.Call.Layout.PropertyChanged += (o, a) => + { + if (a.PropertyName != "Position") return; + + ComputeSelfviewPipStatus(); + + SelfviewPipPositionFeedback.FireUpdate(); }; Status.Call.Sharing.PropertyChanged += (o, a) => @@ -444,6 +462,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom if (a.PropertyName == "State") { SharingContentIsOnFeedback.FireUpdate(); + ReceivingContent.FireUpdate(); + } + }; + + Status.Call.PropertyChanged += (o, a) => + { + if (a.PropertyName == "Info") + { + Debug.Console(1, this, "Updating Call Status"); + UpdateCallStatus(); } }; @@ -658,6 +686,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom _syncState.AddQueryToQueue("zCommand Bookings List"); _syncState.AddQueryToQueue("zCommand Call ListParticipants"); + _syncState.AddQueryToQueue("zCommand Call Info"); _syncState.StartSync(); @@ -670,6 +699,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom private void ProcessMessage(string message) { // Counts the curly braces + if (message.Contains("client_loop: send disconnect: Broken pipe")) + { + Debug.Console(0, this, Debug.ErrorLogLevel.Error, + "Zoom Room Controller or App connected. Essentials will NOT control the Zoom Room until it is disconnected."); + + return; + } + if (message.Contains('{')) { _jsonCurlyBraceCounter++; @@ -759,9 +796,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom SendText("zFeedback Register Op: ex Path: /Event/InfoResult/info/callout_country_list"); Thread.Sleep(100); - if (!_props.DisablePhonebookAutoDownload) + if (_props.DisablePhonebookAutoDownload) { - SendText("zFeedback Register "); + SendText("zFeedback Register Op: ex Path: /Event/Phonebook/AddedContact"); } // switch to json format SendText("format json"); @@ -841,6 +878,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom { switch (topKey.ToLower()) { + case "inforesult": + { + JsonConvert.PopulateObject(responseObj.ToString(), Status.Call.Info); + break; + } case "phonebooklistresult": { JsonConvert.PopulateObject(responseObj.ToString(), Status.Phonebook); @@ -1160,6 +1202,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom { JsonConvert.PopulateObject(responseObj.ToString(), Status.Sharing); + SetLayout(); + break; } case "numberofscreens": @@ -1224,6 +1268,24 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom } } + private void SetLayout() + { + if(!_props.AutoDefaultLayouts) return; + + if ( + (Status.Call.Sharing.State == zEvent.eSharingState.Receiving || + Status.Call.Sharing.State == zEvent.eSharingState.Sending)) + { + SendText(String.Format("zconfiguration call layout style: {0}", + _props.DefaultSharingLayout)); + } + else + { + SendText(String.Format("zconfiguration call layout style: {0}", + _props.DefaultCallLayout)); + } + } + public void PrintCurrentCallParticipants() { if (Debug.Level <= 0) @@ -1329,6 +1391,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom Debug.Console(1, this, "**************************************************************************"); } + protected override void OnCallStatusChange(CodecActiveCallItem item) + { + base.OnCallStatusChange(item); + + if (_props.AutoDefaultLayouts) + { + SetLayout(); + } + } public override void StartSharing() { throw new NotImplementedException(); @@ -1631,6 +1702,52 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom public BoolFeedback CameraAutoModeIsOnFeedback { get; private set; } #endregion + + #region Implementation of IHasFarEndContentStatus + + public BoolFeedback ReceivingContent { get; private set; } + + #endregion + + #region Implementation of IHasSelfviewPosition + + private CodecCommandWithLabel _currentSelfviewPipPosition; + + public StringFeedback SelfviewPipPositionFeedback { get; private set; } + + public void SelfviewPipPositionSet(CodecCommandWithLabel position) + { + SendText(String.Format("zConfiguration Call Layout Position: {0}", position.Command)); + } + + public void SelfviewPipPositionToggle() + { + if (_currentSelfviewPipPosition != null) + { + var nextPipPositionIndex = SelfviewPipPositions.IndexOf(_currentSelfviewPipPosition) + 1; + + if (nextPipPositionIndex >= SelfviewPipPositions.Count) // Check if we need to loop back to the first item in the list + nextPipPositionIndex = 0; + + SelfviewPipPositionSet(SelfviewPipPositions[nextPipPositionIndex]); + } + } + + public List SelfviewPipPositions = new List() + { + new CodecCommandWithLabel("UpLeft", "Center Left"), + new CodecCommandWithLabel("UpRight", "Center Right"), + new CodecCommandWithLabel("DownLeft", "Lower Left"), + new CodecCommandWithLabel("DownRight", "Lower Right") + }; + + void ComputeSelfviewPipStatus() + { + _currentSelfviewPipPosition = + SelfviewPipPositions.FirstOrDefault( + p => p.Command.ToLower().Equals(Configuration.Call.Layout.Position.ToString())); + } + #endregion } /// diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomCamera.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomCamera.cs index 464c8b9a..7a3abdaa 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomCamera.cs +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomCamera.cs @@ -68,7 +68,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom /// /// Builds the command and triggers the parent ZoomRoom to send it /// - /// /// /// void SendCommand(eZoomRoomCameraState state, eZoomRoomCameraAction action) @@ -86,16 +85,18 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom void SendContinueAction(eZoomRoomCameraAction action) { SendCommand(eZoomRoomCameraState.Continue, action); - ContinueTimer.Reset(); } void StopContinueTimer() { - if (ContinueTimer != null) + if (ContinueTimer == null) { - ContinueTimer.Stop(); - ContinueTimer.Dispose(); + return; } + + ContinueTimer.Stop(); + ContinueTimer.Dispose(); + ContinueTimer = null; } #region IHasCameraPtzControl Members @@ -111,22 +112,26 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom public void PanLeft() { - if (!isMoving) + if (isMoving) { - SendCommand(eZoomRoomCameraState.Start, eZoomRoomCameraAction.Left); - StartContinueTimer(); - isPanning = true; + return; } + + SendCommand(eZoomRoomCameraState.Start, eZoomRoomCameraAction.Left); + StartContinueTimer(); + isPanning = true; } public void PanRight() { - if (!isMoving) + if (isMoving) { - SendCommand(eZoomRoomCameraState.Start, eZoomRoomCameraAction.Right); - StartContinueTimer(); - isPanning = true; + return; } + + SendCommand(eZoomRoomCameraState.Start, eZoomRoomCameraAction.Right); + StartContinueTimer(); + isPanning = true; } public void PanStop() diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomPropertiesConfig.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomPropertiesConfig.cs index 4e2545ec..38238023 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomPropertiesConfig.cs +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomPropertiesConfig.cs @@ -16,5 +16,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom public bool DisablePhonebookAutoDownload { get; set; } public bool SupportsCameraAutoMode { get; set; } public bool SupportsCameraOff { get; set; } + + //if true, the layouts will be set automatically when sharing starts/ends or a call is joined + public bool AutoDefaultLayouts { get; set; } + + /* This layout will be selected when Sharing starts (either from Far end or locally)*/ + public string DefaultSharingLayout { get; set; } + + //This layout will be selected when a call is connected and no content is being shared + public string DefaultCallLayout { get; set; } } } \ No newline at end of file diff --git a/packages.config b/packages.config index 40078601..296413b6 100644 --- a/packages.config +++ b/packages.config @@ -1,3 +1,3 @@ - + \ No newline at end of file