Mostly coded. Needs join numbers for ZoomRoomJoinMap values

This commit is contained in:
Neil Dorin
2021-05-06 16:54:41 -06:00
parent d6445861f5
commit e4a3933743
6 changed files with 592 additions and 219 deletions

View File

@@ -176,6 +176,7 @@
<Compile Include="VideoCodec\ZoomRoom\ResponseObjects.cs" />
<Compile Include="VideoCodec\ZoomRoom\ZoomRoom.cs" />
<Compile Include="VideoCodec\ZoomRoom\ZoomRoomCamera.cs" />
<Compile Include="VideoCodec\ZoomRoom\ZoomRoomJoinMap.cs" />
<Compile Include="VideoCodec\ZoomRoom\ZoomRoomPropertiesConfig.cs" />
<None Include="Properties\ControlSystem.cfg" />
</ItemGroup>

View File

@@ -25,20 +25,26 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// </summary>
public interface IHasZoomRoomLayouts : IHasCodecLayouts
{
BoolFeedback LayoutViewIsOnFirstPage { get; }
BoolFeedback LayoutViewIsOnLastPage { get; }
BoolFeedback CanSwitchWallView { get; }
BoolFeedback CanSwitchSpeakerView { get; }
BoolFeedback CanSwitchShareOnAllScreens { get; }
BoolFeedback CanSwapContentWithThumbnail { get; }
event EventHandler<LayoutInfoChangedEventArgs> AvailableLayoutsChanged;
List<ZoomRoom.eZoomRoomLayoutStyle> AvailableLayouts { get; }
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 CanSwapContentWithThumbnailFeedback { get; }
BoolFeedback ContentSwappedWithThumbnailFeedback { get; }
void GetLayouts(); // Mot sure this is necessary if we're already subscribed to zStatus Call Layout
void SetLayout(ZoomRoom.eZoomRoomLayoutStyle layoutStyle);
ZoomRoom.zConfiguration.eLayoutStyle LastSelectedLayout { get; }
ZoomRoom.zConfiguration.eLayoutStyle AvailableLayouts { get; }
void GetAvailableLayouts(); // Mot sure this is necessary if we're already subscribed to zStatus Call Layout
void SetLayout(ZoomRoom.zConfiguration.eLayoutStyle layoutStyle);
void SwapContentWithThumbnail();
void LayoutTurnNextPage();
void LayoutTurnPreviousPage();
}
public class LayoutInfoChangedEventArgs : EventArgs
{
public ZoomRoom.zConfiguration.eLayoutStyle AvailableLayouts { get; set; }
}
}

View File

@@ -271,6 +271,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
public abstract void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge);
/// <summary>
/// Use this method when using a plain VideoCodecControllerJoinMap
/// </summary>
/// <param name="codec"></param>
/// <param name="trilist"></param>
/// <param name="joinStart"></param>
/// <param name="joinMapKey"></param>
/// <param name="bridge"></param>
protected void LinkVideoCodecToApi(VideoCodecBase codec, BasicTriList trilist, uint joinStart, string joinMapKey,
EiscApiAdvanced bridge)
{
@@ -288,136 +296,145 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
bridge.AddJoinMap(Key, joinMap);
}
Debug.Console(1, this, "Linking to Trilist {0}", trilist.ID.ToString("X"));
LinkVideoCodecDtmfToApi(trilist, joinMap);
LinkVideoCodecCallControlsToApi(trilist, joinMap);
LinkVideoCodecContentSharingToApi(trilist, joinMap);
LinkVideoCodecPrivacyToApi(trilist, joinMap);
LinkVideoCodecVolumeToApi(trilist, joinMap);
if (codec is ICommunicationMonitor)
{
LinkVideoCodecCommMonitorToApi(codec as ICommunicationMonitor, trilist, joinMap);
}
if (codec is IHasCodecCameras)
{
LinkVideoCodecCameraToApi(codec as IHasCodecCameras, trilist, joinMap);
}
if (codec is IHasCodecSelfView)
{
LinkVideoCodecSelfviewToApi(codec as IHasCodecSelfView, trilist, joinMap);
}
if (codec is IHasCameraAutoMode)
{
trilist.SetBool(joinMap.CameraSupportsAutoMode.JoinNumber, SupportsCameraAutoMode);
LinkVideoCodecCameraModeToApi(codec as IHasCameraAutoMode, trilist, joinMap);
}
if (codec is IHasCameraOff)
{
trilist.SetBool(joinMap.CameraSupportsOffMode.JoinNumber, SupportsCameraOff);
LinkVideoCodecCameraOffToApi(codec as IHasCameraOff, trilist, joinMap);
}
if (codec is IHasCodecLayouts)
{
LinkVideoCodecCameraLayoutsToApi(codec as IHasCodecLayouts, trilist, joinMap);
}
if (codec is IHasSelfviewPosition)
{
LinkVideoCodecSelfviewPositionToApi(codec as IHasSelfviewPosition, trilist, joinMap);
}
if (codec is IHasDirectory)
{
LinkVideoCodecDirectoryToApi(codec as IHasDirectory, trilist, joinMap);
}
if (codec is IHasScheduleAwareness)
{
LinkVideoCodecScheduleToApi(codec as IHasScheduleAwareness, trilist, joinMap);
}
if (codec is IHasParticipants)
{
LinkVideoCodecParticipantsToApi(codec as IHasParticipants, trilist, joinMap);
}
if (codec is IHasFarEndContentStatus)
{
(codec as IHasFarEndContentStatus).ReceivingContent.LinkInputSig(trilist.BooleanInput[joinMap.RecievingContent.JoinNumber]);
}
if (codec is IHasPhoneDialing)
{
LinkVideoCodecPhoneToApi(codec as IHasPhoneDialing, trilist, joinMap);
}
trilist.OnlineStatusChange += (device, args) =>
{
if (!args.DeviceOnLine) return;
if (codec is IHasDirectory)
{
(codec as IHasDirectory).SetCurrentDirectoryToRoot();
}
if (codec is IHasScheduleAwareness)
{
(codec as IHasScheduleAwareness).GetSchedule();
}
if (codec is IHasParticipants)
{
UpdateParticipantsXSig((codec as IHasParticipants).Participants.CurrentParticipants);
}
if (codec is IHasCameraAutoMode)
{
trilist.SetBool(joinMap.CameraSupportsAutoMode.JoinNumber, true);
(codec as IHasCameraAutoMode).CameraAutoModeIsOnFeedback.FireUpdate();
}
if (codec is IHasCodecSelfView)
{
(codec as IHasCodecSelfView).SelfviewIsOnFeedback.FireUpdate();
}
if (codec is IHasCameraAutoMode)
{
(codec as IHasCameraAutoMode).CameraAutoModeIsOnFeedback.FireUpdate();
}
if (codec is IHasCameraOff)
{
(codec as IHasCameraOff).CameraIsOffFeedback.FireUpdate();
}
if (codec is IHasPhoneDialing)
{
(codec as IHasPhoneDialing).PhoneOffHookFeedback.FireUpdate();
}
SharingContentIsOnFeedback.FireUpdate();
trilist.SetBool(joinMap.HookState.JoinNumber, IsInCall);
trilist.SetString(joinMap.CurrentCallData.JoinNumber, UpdateCallStatusXSig());
};
LinkVideoCodecToApi(codec, trilist, joinMap);
}
/// <summary>
/// Use this method when you need to pass in a join map that extends VideoCodecControllerJoinMap
/// </summary>
/// <param name="codec"></param>
/// <param name="trilist"></param>
/// <param name="joinMap"></param>
protected void LinkVideoCodecToApi(VideoCodecBase codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
{
Debug.Console(1, this, "Linking to Trilist {0}", trilist.ID.ToString("X"));
LinkVideoCodecDtmfToApi(trilist, joinMap);
LinkVideoCodecCallControlsToApi(trilist, joinMap);
LinkVideoCodecContentSharingToApi(trilist, joinMap);
LinkVideoCodecPrivacyToApi(trilist, joinMap);
LinkVideoCodecVolumeToApi(trilist, joinMap);
if (codec is ICommunicationMonitor)
{
LinkVideoCodecCommMonitorToApi(codec as ICommunicationMonitor, trilist, joinMap);
}
if (codec is IHasCodecCameras)
{
LinkVideoCodecCameraToApi(codec as IHasCodecCameras, trilist, joinMap);
}
if (codec is IHasCodecSelfView)
{
LinkVideoCodecSelfviewToApi(codec as IHasCodecSelfView, trilist, joinMap);
}
if (codec is IHasCameraAutoMode)
{
trilist.SetBool(joinMap.CameraSupportsAutoMode.JoinNumber, SupportsCameraAutoMode);
LinkVideoCodecCameraModeToApi(codec as IHasCameraAutoMode, trilist, joinMap);
}
if (codec is IHasCameraOff)
{
trilist.SetBool(joinMap.CameraSupportsOffMode.JoinNumber, SupportsCameraOff);
LinkVideoCodecCameraOffToApi(codec as IHasCameraOff, trilist, joinMap);
}
if (codec is IHasCodecLayouts)
{
LinkVideoCodecCameraLayoutsToApi(codec as IHasCodecLayouts, trilist, joinMap);
}
if (codec is IHasSelfviewPosition)
{
LinkVideoCodecSelfviewPositionToApi(codec as IHasSelfviewPosition, trilist, joinMap);
}
if (codec is IHasDirectory)
{
LinkVideoCodecDirectoryToApi(codec as IHasDirectory, trilist, joinMap);
}
if (codec is IHasScheduleAwareness)
{
LinkVideoCodecScheduleToApi(codec as IHasScheduleAwareness, trilist, joinMap);
}
if (codec is IHasParticipants)
{
LinkVideoCodecParticipantsToApi(codec as IHasParticipants, trilist, joinMap);
}
if (codec is IHasFarEndContentStatus)
{
(codec as IHasFarEndContentStatus).ReceivingContent.LinkInputSig(trilist.BooleanInput[joinMap.RecievingContent.JoinNumber]);
}
if (codec is IHasPhoneDialing)
{
LinkVideoCodecPhoneToApi(codec as IHasPhoneDialing, trilist, joinMap);
}
trilist.OnlineStatusChange += (device, args) =>
{
if (!args.DeviceOnLine) return;
if (codec is IHasDirectory)
{
(codec as IHasDirectory).SetCurrentDirectoryToRoot();
}
if (codec is IHasScheduleAwareness)
{
(codec as IHasScheduleAwareness).GetSchedule();
}
if (codec is IHasParticipants)
{
UpdateParticipantsXSig((codec as IHasParticipants).Participants.CurrentParticipants);
}
if (codec is IHasCameraAutoMode)
{
trilist.SetBool(joinMap.CameraSupportsAutoMode.JoinNumber, true);
(codec as IHasCameraAutoMode).CameraAutoModeIsOnFeedback.FireUpdate();
}
if (codec is IHasCodecSelfView)
{
(codec as IHasCodecSelfView).SelfviewIsOnFeedback.FireUpdate();
}
if (codec is IHasCameraAutoMode)
{
(codec as IHasCameraAutoMode).CameraAutoModeIsOnFeedback.FireUpdate();
}
if (codec is IHasCameraOff)
{
(codec as IHasCameraOff).CameraIsOffFeedback.FireUpdate();
}
if (codec is IHasPhoneDialing)
{
(codec as IHasPhoneDialing).PhoneOffHookFeedback.FireUpdate();
}
SharingContentIsOnFeedback.FireUpdate();
trilist.SetBool(joinMap.HookState.JoinNumber, IsInCall);
trilist.SetString(joinMap.CurrentCallData.JoinNumber, UpdateCallStatusXSig());
};
}
private void LinkVideoCodecPhoneToApi(IHasPhoneDialing codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
{
codec.PhoneOffHookFeedback.LinkInputSig(trilist.BooleanInput[joinMap.PhoneHookState.JoinNumber]);

View File

@@ -23,46 +23,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
zCommand
}
/// <summary>
/// The available layout styles
/// </summary>
public enum eZoomRoomLayoutStyle
{
Gallery,
Speaker,
Strip,
ShareAll
}
/// <summary>
/// The avaliable layout positions for the thumbnails
/// </summary>
public enum eZoomRoomLayoutPosition
{
Center,
Up,
Right,
UpRight,
Down,
DownRight,
Left,
UpLeft,
DownLeft
}
/// <summary>
/// The available layout sizes
/// </summary>
public enum eZoomRoomLayoutSize
{
Off,
Size1,
Size2,
Size3,
Strip
}
public abstract class NotifiableObject : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
@@ -606,7 +566,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
public bool can_Switch_Floating_Share_Content { get; set; }
/// <summary>
/// [on/off] // Set to On if it is possible to switch to Speaker view by invoking zConfiguration Call Layout Style: Speaker. The active speaker is shown full screen, and other video streams, like self-view, are shown in thumbnails.
/// [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.
/// </summary>
[JsonProperty("can_Switch_Share_On_All_Screens")]
public bool can_Switch_Share_On_All_Screens
@@ -993,12 +953,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
}
}
[Flags]
public enum eLayoutStyle
{
Gallery,
Speaker,
Strip,
ShareAll
None = 0,
Gallery = 1,
Speaker = 2,
Strip = 4,
ShareAll = 8,
}
public enum eLayoutSize
@@ -1023,20 +985,64 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
DownLeft
}
public class Layout:NotifiableObject
public class Layout : NotifiableObject
{
public bool ShareThumb { get; set; }
public eLayoutStyle Style { get; set; }
public eLayoutSize Size { get; set; }
private bool _shareThumb;
private eLayoutStyle _style;
private eLayoutSize _size;
private eLayoutPosition _position;
public eLayoutPosition Position {
public bool ShareThumb
{
get { return _shareThumb; }
set
{
if (value != _shareThumb)
{
_shareThumb = value;
NotifyPropertyChanged("ShareThumb");
}
}
}
public eLayoutStyle Style
{
get { return _style; }
set
{
if (value != _style)
{
_style = value;
NotifyPropertyChanged("Style");
}
}
}
public eLayoutSize Size
{
get { return _size; }
set
{
if (value != _size)
{
_size = value;
NotifyPropertyChanged("Size");
}
}
}
public eLayoutPosition Position
{
get { return _position; }
set
{
_position = value;
NotifyPropertyChanged("Position");
} }
if (value != _position)
{
_position = value;
NotifyPropertyChanged("Position");
}
}
}
}
public class Lock

View File

@@ -23,7 +23,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
public class ZoomRoom : VideoCodecBase, IHasCodecSelfView, IHasDirectoryHistoryStack, ICommunicationMonitor,
IRouting,
IHasScheduleAwareness, IHasCodecCameras, IHasParticipants, IHasCameraOff, IHasCameraMute, IHasCameraAutoMode,
IHasFarEndContentStatus, IHasSelfviewPosition, IHasPhoneDialing
IHasFarEndContentStatus, IHasSelfviewPosition, IHasPhoneDialing, IHasZoomRoomLayouts
{
private const long MeetingRefreshTimer = 60000;
private const uint DefaultMeetingDurationMin = 30;
@@ -121,6 +121,17 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
PhoneOffHookFeedback = new BoolFeedback(PhoneOffHookFeedbackFunc);
CallerIdNameFeedback = new StringFeedback(CallerIdNameFeedbackFunc);
CallerIdNumberFeedback = new StringFeedback(CallerIdNumberFeedbackFunc);
LocalLayoutFeedback = new StringFeedback(LocalLayoutFeedbackFunc);
LayoutViewIsOnFirstPageFeedback = new BoolFeedback(LayoutViewIsOnFirstPageFeedbackFunc);
LayoutViewIsOnLastPageFeedback = new BoolFeedback(LayoutViewIsOnLastPageFeedbackFunc);
CanSwapContentWithThumbnailFeedback = new BoolFeedback(CanSwapContentWithThumbnailFeedbackFunc);
ContentSwappedWithThumbnailFeedback = new BoolFeedback(ContentSwappedWithThumbnailFeedbackFunc);
}
public CommunicationGather PortGather { get; private set; }
@@ -216,11 +227,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
}
}
protected Func<string> LocalLayoutFeedbackFunc
{
get { return () => ""; }
}
protected Func<bool> LocalLayoutIsProminentFeedbackFunc
{
get { return () => false; }
@@ -484,11 +490,28 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
Configuration.Call.Layout.PropertyChanged += (o, a) =>
{
if (a.PropertyName != "Position") return;
switch (a.PropertyName)
{
case "Position":
{
ComputeSelfviewPipStatus();
ComputeSelfviewPipStatus();
SelfviewPipPositionFeedback.FireUpdate();
SelfviewPipPositionFeedback.FireUpdate();
break;
}
case "ShareThumb":
{
ContentSwappedWithThumbnailFeedback.FireUpdate();
break;
}
case "Style":
{
LocalLayoutFeedback.FireUpdate();
break;
}
}
};
Status.Call.Sharing.PropertyChanged += (o, a) =>
@@ -548,37 +571,31 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
switch (a.PropertyName)
{
case "can_Switch_Speaker_View":
{
// TODO: #697 Fire appropriate feedback(s)
break;
}
case "can_Switch_Wall_View":
{
// #697 TODO: Fire appropriate feedback(s)
break;
}
case "can_Switch_Share_On_All_Screens":
{
// #697 TODO: Fire appropriate feedback(s)
// #697 TODO: Calls the method to compute the available layouts and set the value of AvailableLayouts enum
ComputeAvailableLayouts();
break;
}
case "is_In_First_Page":
{
// TODO: #697 Fire appropriate feedback(s)
//
// TODO: #697 Fires appropriate feedback
LayoutViewIsOnFirstPageFeedback.FireUpdate();
break;
}
case "is_In_Last_Page":
{
// TODO: #697 Fire appropriate feedback(s)
break;
}
case "video_type":
{
// TODO: #697 Fire appropriate feedback(s)
// LocalLayoutFeedback.FireUpdate();
// TODO: #697 Fires appropriate feedback
LayoutViewIsOnLastPageFeedback.FireUpdate();
break;
}
//case "video_type":
// {
// // TODO: #697 It appears as though the actual value we want to watch is Configuration.Call.Layout.Style
// LocalLayoutFeedback.FireUpdate();
// break;
// }
}
};
}
@@ -1639,7 +1656,75 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{
LinkVideoCodecToApi(this, trilist, joinStart, joinMapKey, bridge);
var joinMap = new ZoomRoomJoinMap(joinStart);
var customJoins = JoinMapHelper.TryGetJoinMapAdvancedForDevice(joinMapKey);
if (customJoins != null)
{
joinMap.SetCustomJoinData(customJoins);
}
if (bridge != null)
{
bridge.AddJoinMap(Key, joinMap);
}
LinkVideoCodecToApi(this, trilist, joinMap);
LinkZoomRoomToApi(trilist, joinMap);
}
/// <summary>
/// Links all the specific Zoom functionality to the API bridge
/// </summary>
/// <param name="trilist"></param>
/// <param name="joinMap"></param>
public void LinkZoomRoomToApi(BasicTriList trilist, ZoomRoomJoinMap joinMap)
{
var codec = this as IHasZoomRoomLayouts;
if (codec != null)
{
codec.AvailableLayoutsChanged += (o, a) =>
{
trilist.SetBool(joinMap.LayoutGalleryIsAvailable.JoinNumber, a.AvailableLayouts
== (a.AvailableLayouts & zConfiguration.eLayoutStyle.Gallery));
trilist.SetBool(joinMap.LayoutSpeakerIsAvailable.JoinNumber, a.AvailableLayouts
== (a.AvailableLayouts & zConfiguration.eLayoutStyle.Speaker));
trilist.SetBool(joinMap.LayoutStripIsAvailable.JoinNumber, a.AvailableLayouts
== (a.AvailableLayouts & zConfiguration.eLayoutStyle.Strip));
trilist.SetBool(joinMap.LayoutShareAllIsAvailable.JoinNumber, a.AvailableLayouts
== (a.AvailableLayouts & zConfiguration.eLayoutStyle.ShareAll));
};
codec.CanSwapContentWithThumbnailFeedback.LinkInputSig(trilist.BooleanInput[joinMap.CanSwapContentWithThumbnail.JoinNumber]);
trilist.SetSigFalseAction(joinMap.SwapContentWithThumbnail.JoinNumber, () => codec.SwapContentWithThumbnail());
codec.ContentSwappedWithThumbnailFeedback.LinkInputSig(trilist.BooleanInput[joinMap.SwapContentWithThumbnail.JoinNumber]);
codec.LayoutViewIsOnFirstPageFeedback.LinkInputSig(trilist.BooleanInput[joinMap.LayoutIsOnFirstPage.JoinNumber]);
codec.LayoutViewIsOnLastPageFeedback.LinkInputSig(trilist.BooleanInput[joinMap.LayoutIsOnLastPage.JoinNumber]);
trilist.SetSigFalseAction(joinMap.LayoutTurnToNextPage.JoinNumber, () => codec.LayoutTurnNextPage() );
trilist.SetSigFalseAction(joinMap.LayoutTurnToPreviousPage.JoinNumber, () => codec.LayoutTurnPreviousPage());
trilist.SetStringSigAction(joinMap.GetSetCurrentLayout.JoinNumber, (s) =>
{
try
{
var style = (zConfiguration.eLayoutStyle)Enum.Parse(typeof(zConfiguration.eLayoutStyle), s, true);
SetLayout(style);
}
catch (Exception e)
{
Debug.Console(2, this, "Unable to parse '{0}' to zConfiguration.eLayoutStyle: {1}", s, e);
}
});
codec.LocalLayoutFeedback.LinkInputSig(trilist.StringInput[joinMap.GetSetCurrentLayout.JoinNumber]);
}
}
public override void ExecuteSwitch(object selector)
@@ -1938,6 +2023,123 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
}
#endregion
#region IHasZoomRoomLayouts Members
public event EventHandler<LayoutInfoChangedEventArgs> AvailableLayoutsChanged;
private Func<bool> LayoutViewIsOnFirstPageFeedbackFunc {get {return () => Status.Layout.is_In_First_Page; } }
private Func<bool> LayoutViewIsOnLastPageFeedbackFunc { get { return () => Status.Layout.is_In_Last_Page; } }
private Func<bool> CanSwapContentWithThumbnailFeedbackFunc { get { return () => Status.Layout.can_Switch_Floating_Share_Content; } }
private Func<bool> ContentSwappedWithThumbnailFeedbackFunc { get { return () => Configuration.Call.Layout.ShareThumb; } }
public BoolFeedback LayoutViewIsOnFirstPageFeedback { get; private set; }
public BoolFeedback LayoutViewIsOnLastPageFeedback { get; private set; }
public BoolFeedback CanSwapContentWithThumbnailFeedback { get; private set; }
public BoolFeedback ContentSwappedWithThumbnailFeedback { get; private set; }
public zConfiguration.eLayoutStyle LastSelectedLayout { get; private set; }
public zConfiguration.eLayoutStyle AvailableLayouts { get; private set; }
/// <summary>
/// Reads individual properties to determine if which layouts are avalailable
/// </summary>
private void ComputeAvailableLayouts()
{
zConfiguration.eLayoutStyle availableLayouts = zConfiguration.eLayoutStyle.None;
//TODO: #697 Compute the avaialble layouts and set the value of AvailableLayouts
if (Status.Layout.can_Switch_Wall_View)
{
availableLayouts |= zConfiguration.eLayoutStyle.Gallery;
}
if (Status.Layout.can_Switch_Speaker_View)
{
availableLayouts |= zConfiguration.eLayoutStyle.Speaker;
}
if (Status.Layout.can_Switch_Share_On_All_Screens)
{
availableLayouts |= zConfiguration.eLayoutStyle.ShareAll;
}
// There is no property that directly reports if strip mode is valid, but API stipulates
// that strip mode is available if the number of screens is 1
if (Status.NumberOfScreens.NumOfScreens == 1)
{
availableLayouts |= zConfiguration.eLayoutStyle.Strip;
}
var handler = AvailableLayoutsChanged;
if (handler != null)
{
handler(this, new LayoutInfoChangedEventArgs() { AvailableLayouts = availableLayouts });
}
AvailableLayouts = availableLayouts;
}
public void GetAvailableLayouts()
{
SendText("zStatus Call Layout");
}
public void SetLayout(zConfiguration.eLayoutStyle layoutStyle)
{
LastSelectedLayout = layoutStyle;
SendText(String.Format("zConfiguration Call Layout Style: {0}", layoutStyle.ToString()));
}
public void SwapContentWithThumbnail()
{
if (CanSwapContentWithThumbnailFeedback.BoolValue)
{
var oppositeValue = ContentSwappedWithThumbnailFeedback.BoolValue ? "on" : "off"; // Get the value based on the opposite of the current state
// TODO: #697 Need to verify the ternary above and make sure that the correct on/off value is being send based on the true/false value of the feedback
// to toggle the state
SendText(String.Format("zConfiguration Call Layout ShareThumb: {0}", oppositeValue));
}
}
public void LayoutTurnNextPage()
{
SendText("zCommand Call Layout TurnPage Forward: On");
}
public void LayoutTurnPreviousPage()
{
SendText("zCommand Call Layout TurnPage Forward: Off");
}
#endregion
#region IHasCodecLayouts Members
private Func<string> LocalLayoutFeedbackFunc { get { return () => Configuration.Call.Layout.Style.ToString(); } }
public StringFeedback LocalLayoutFeedback { get; private set; }
public void LocalLayoutToggle()
{
throw new NotImplementedException();
}
public void LocalLayoutToggleSingleProminent()
{
throw new NotImplementedException();
}
public void MinMaxLayoutToggle()
{
throw new NotImplementedException();
}
#endregion
}
/// <summary>

View File

@@ -0,0 +1,141 @@
using System;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Bridges.JoinMaps;
namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{
public class ZoomRoomJoinMap : VideoCodecControllerJoinMap
{
// TODO: #697 Set join numbers
[JoinName("LayoutIsOnFirstPage")]
public JoinDataComplete LayoutIsOnFirstPage =
new JoinDataComplete(new JoinData { JoinNumber = 999, JoinSpan = 1 },
new JoinMetadata
{
Description = "Indicates if layout is on first page",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Digital
});
[JoinName("LayoutIsOnLastPage")]
public JoinDataComplete LayoutIsOnLastPage =
new JoinDataComplete(new JoinData { JoinNumber = 999, JoinSpan = 1 },
new JoinMetadata
{
Description = "Indicates if layout is on first page",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Digital
});
[JoinName("LayoutTurnToNextPage")]
public JoinDataComplete LayoutTurnToNextPage =
new JoinDataComplete(new JoinData { JoinNumber = 999, JoinSpan = 1 },
new JoinMetadata
{
Description = "Turns layout view to next page",
JoinCapabilities = eJoinCapabilities.FromSIMPL,
JoinType = eJoinType.Digital
});
[JoinName("LayoutTurnToPreviousPage")]
public JoinDataComplete LayoutTurnToPreviousPage =
new JoinDataComplete(new JoinData { JoinNumber = 999, JoinSpan = 1 },
new JoinMetadata
{
Description = "Turns layout view to previous page",
JoinCapabilities = eJoinCapabilities.FromSIMPL,
JoinType = eJoinType.Digital
});
[JoinName("CanSwapContentWithThumbnail")]
public JoinDataComplete CanSwapContentWithThumbnail =
new JoinDataComplete(new JoinData { JoinNumber = 999, JoinSpan = 1 },
new JoinMetadata
{
Description = "FB Indicates if content can be swapped with thumbnail",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Digital
});
[JoinName("SwapContentWithThumbnail")]
public JoinDataComplete SwapContentWithThumbnail =
new JoinDataComplete(new JoinData { JoinNumber = 999, JoinSpan = 1 },
new JoinMetadata
{
Description = "Pulse to swap content with thumbnail. FB reports current state",
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
JoinType = eJoinType.Digital
});
[JoinName("GetSetCurrentLayout")]
public JoinDataComplete GetSetCurrentLayout =
new JoinDataComplete(new JoinData { JoinNumber = 999, 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
});
[JoinName("GetAvailableLayouts")]
public JoinDataComplete GetAvailableLayouts =
new JoinDataComplete(new JoinData { JoinNumber = 999, JoinSpan = 1 },
new JoinMetadata
{
Description = "Gets the available layouts. Will update the LayoutXXXXXIsAvailbale signals.",
JoinCapabilities = eJoinCapabilities.FromSIMPL,
JoinType = eJoinType.Serial
});
[JoinName("LayoutGalleryIsAvailable")]
public JoinDataComplete LayoutGalleryIsAvailable =
new JoinDataComplete(new JoinData { JoinNumber = 999, JoinSpan = 1 },
new JoinMetadata
{
Description = "FB Indicates if layout 'Gallery' is available",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Digital
});
[JoinName("LayoutSpeakerIsAvailable")]
public JoinDataComplete LayoutSpeakerIsAvailable =
new JoinDataComplete(new JoinData { JoinNumber = 999, JoinSpan = 1 },
new JoinMetadata
{
Description = "FB Indicates if layout 'Speaker' is available",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Digital
});
[JoinName("LayoutStripIsAvailable")]
public JoinDataComplete LayoutStripIsAvailable =
new JoinDataComplete(new JoinData { JoinNumber = 999, JoinSpan = 1 },
new JoinMetadata
{
Description = "FB Indicates if layout 'Strip' is available",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Digital
});
[JoinName("LayoutShareAllIsAvailable")]
public JoinDataComplete LayoutShareAllIsAvailable =
new JoinDataComplete(new JoinData { JoinNumber = 999, JoinSpan = 1 },
new JoinMetadata
{
Description = "FB Indicates if layout 'ShareAll' is available",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Digital
});
public ZoomRoomJoinMap(uint joinStart)
: base(joinStart, typeof(ZoomRoomJoinMap))
{
}
public ZoomRoomJoinMap(uint joinStart, Type type)
: base(joinStart, type)
{
}
}
}