mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-01-31 05:14:51 +00:00
Compare commits
18 Commits
1.8.5-beta
...
1.8.6-beta
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4bd71b04bf | ||
|
|
c5bcd89695 | ||
|
|
c7cc98bff7 | ||
|
|
db60f8f1be | ||
|
|
ac0d5e59a0 | ||
|
|
63853739f3 | ||
|
|
c14193f9ac | ||
|
|
b4edb021ee | ||
|
|
52caa98f33 | ||
|
|
4e041d1773 | ||
|
|
118bd5a54a | ||
|
|
116abbf962 | ||
|
|
a06333e1c3 | ||
|
|
d937dc14fc | ||
|
|
604f4ca22d | ||
|
|
2d7ad8ba2a | ||
|
|
e4a3933743 | ||
|
|
d6445861f5 |
File diff suppressed because it is too large
Load Diff
@@ -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>
|
||||
|
||||
@@ -19,4 +19,32 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
void LocalLayoutToggleSingleProminent();
|
||||
void MinMaxLayoutToggle();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Defines the requirements for Zoom Room layout control
|
||||
/// </summary>
|
||||
public interface IHasZoomRoomLayouts : IHasCodecLayouts
|
||||
{
|
||||
event EventHandler<LayoutInfoChangedEventArgs> AvailableLayoutsChanged;
|
||||
|
||||
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; }
|
||||
|
||||
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; }
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,20 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using PepperDash.Essentials.Core;
|
||||
|
||||
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
||||
{
|
||||
/// <summary>
|
||||
/// Describes a device that has call participants
|
||||
/// </summary>
|
||||
public interface IHasParticipants
|
||||
{
|
||||
CodecParticipants Participants { get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Describes the ability to mute and unmute a participant's video in a meeting
|
||||
/// </summary>
|
||||
public interface IHasParticipantVideoMute:IHasParticipants
|
||||
{
|
||||
void MuteVideoForParticipant(int userId);
|
||||
@@ -15,13 +22,29 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
||||
void ToggleVideoForParticipant(int userId);
|
||||
}
|
||||
|
||||
public interface IHasParticipantAudioMute:IHasParticipantVideoMute
|
||||
/// <summary>
|
||||
/// Describes the ability to mute and unmute a participant's audio in a meeting
|
||||
/// </summary>
|
||||
public interface IHasParticipantAudioMute : IHasParticipantVideoMute
|
||||
{
|
||||
void MuteAudioForParticipant(int userId);
|
||||
void UnmuteAudioForParticipant(int userId);
|
||||
void ToggleAudioForParticipant(int userId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Describes the ability to pin and unpin a participant in a meeting
|
||||
/// </summary>
|
||||
public interface IHasParticipantPinUnpin : IHasParticipants
|
||||
{
|
||||
IntFeedback NumberOfScreensFeedback { get; }
|
||||
int ScreenIndexToPinUserTo { get; }
|
||||
|
||||
void PinParticipant(int userId, int screenIndex);
|
||||
void UnPinParticipant(int userId);
|
||||
void ToggleParticipantPinState(int userId, int screenIndex);
|
||||
}
|
||||
|
||||
public class CodecParticipants
|
||||
{
|
||||
private List<Participant> _currentParticipants;
|
||||
@@ -31,11 +54,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
||||
set
|
||||
{
|
||||
_currentParticipants = value;
|
||||
var handler = ParticipantsListHasChanged;
|
||||
|
||||
if(handler == null) return;
|
||||
|
||||
handler(this, new EventArgs());
|
||||
OnParticipantsChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,15 +64,31 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
||||
{
|
||||
_currentParticipants = new List<Participant>();
|
||||
}
|
||||
|
||||
public void OnParticipantsChanged()
|
||||
{
|
||||
var handler = ParticipantsListHasChanged;
|
||||
|
||||
if (handler == null) return;
|
||||
|
||||
handler(this, new EventArgs());
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Represents a call participant
|
||||
/// </summary>
|
||||
public class Participant
|
||||
{
|
||||
public int UserId { get; set; }
|
||||
public bool IsHost { get; set; }
|
||||
public string Name { get; set; }
|
||||
public bool CanMuteVideo { get; set; }
|
||||
public bool CanUnmuteVideo { get; set; }
|
||||
public bool VideoMuteFb { get; set; }
|
||||
public bool AudioMuteFb { get; set; }
|
||||
public bool HandIsRaisedFb { get; set; }
|
||||
public bool IsPinnedFb { get; set; }
|
||||
public int ScreenIndexIsPinnedToFb { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
IUsageTracking, IHasDialer, IHasContentSharing, ICodecAudio, iVideoCodecInfo, IBridgeAdvanced
|
||||
{
|
||||
private const int XSigEncoding = 28591;
|
||||
protected const int MaxParticipants = 50;
|
||||
private readonly byte[] _clearBytes = XSigHelpers.ClearOutputs();
|
||||
protected VideoCodecBase(DeviceConfig config)
|
||||
: base(config)
|
||||
@@ -271,6 +272,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,10 +297,19 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
bridge.AddJoinMap(Key, joinMap);
|
||||
}
|
||||
|
||||
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);
|
||||
@@ -524,6 +542,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
return;
|
||||
}
|
||||
|
||||
SetParticipantActions(trilist, joinMap, codec.Participants.CurrentParticipants);
|
||||
|
||||
participantsXSig = UpdateParticipantsXSig(codec.Participants.CurrentParticipants);
|
||||
|
||||
trilist.SetString(joinMap.CurrentParticipants.JoinNumber, participantsXSig);
|
||||
@@ -532,14 +552,59 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the actions for each participant in the list
|
||||
/// </summary>
|
||||
private void SetParticipantActions(BasicTriList trilist, VideoCodecControllerJoinMap joinMap, List<Participant> currentParticipants)
|
||||
{
|
||||
uint index = 0; // track the index of the participant in the
|
||||
|
||||
foreach (var participant in currentParticipants)
|
||||
{
|
||||
var p = participant;
|
||||
if (index > MaxParticipants) break;
|
||||
|
||||
var audioMuteCodec = this as IHasParticipantAudioMute;
|
||||
if (audioMuteCodec != null)
|
||||
{
|
||||
trilist.SetSigFalseAction(joinMap.ParticipantAudioMuteToggleStart.JoinNumber + index,
|
||||
() => audioMuteCodec.ToggleAudioForParticipant(p.UserId));
|
||||
|
||||
trilist.SetSigFalseAction(joinMap.ParticipantVideoMuteToggleStart.JoinNumber + index,
|
||||
() => audioMuteCodec.ToggleVideoForParticipant(p.UserId));
|
||||
}
|
||||
|
||||
var pinCodec = this as IHasParticipantPinUnpin;
|
||||
if (pinCodec != null)
|
||||
{
|
||||
trilist.SetSigFalseAction(joinMap.ParticipantPinToggleStart.JoinNumber + index,
|
||||
() => pinCodec.ToggleParticipantPinState(p.UserId, pinCodec.ScreenIndexToPinUserTo));
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
// Clear out any previously set actions
|
||||
while (index < MaxParticipants)
|
||||
{
|
||||
trilist.ClearBoolSigAction(joinMap.ParticipantAudioMuteToggleStart.JoinNumber + index);
|
||||
trilist.ClearBoolSigAction(joinMap.ParticipantVideoMuteToggleStart.JoinNumber + index);
|
||||
trilist.ClearBoolSigAction(joinMap.ParticipantPinToggleStart.JoinNumber + index);
|
||||
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
private string UpdateParticipantsXSig(List<Participant> currentParticipants)
|
||||
{
|
||||
const int maxParticipants = 50;
|
||||
const int maxDigitals = 5;
|
||||
const int maxParticipants = MaxParticipants;
|
||||
const int maxDigitals = 7;
|
||||
const int maxStrings = 1;
|
||||
const int offset = maxDigitals + maxStrings;
|
||||
var digitalIndex = maxStrings * maxParticipants; //15
|
||||
const int maxAnalogs = 1;
|
||||
const int offset = maxDigitals + maxStrings + maxAnalogs; // 9
|
||||
var digitalIndex = (maxStrings + maxAnalogs) * maxParticipants; // 100
|
||||
var stringIndex = 0;
|
||||
var analogIndex = stringIndex + maxParticipants;
|
||||
var meetingIndex = 0;
|
||||
|
||||
var tokenArray = new XSigToken[maxParticipants * offset];
|
||||
@@ -554,29 +619,42 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
tokenArray[digitalIndex + 2] = new XSigDigitalToken(digitalIndex + 3, participant.CanMuteVideo);
|
||||
tokenArray[digitalIndex + 3] = new XSigDigitalToken(digitalIndex + 4, participant.CanUnmuteVideo);
|
||||
tokenArray[digitalIndex + 4] = new XSigDigitalToken(digitalIndex + 5, participant.IsHost);
|
||||
tokenArray[digitalIndex + 5] = new XSigDigitalToken(digitalIndex + 6, participant.HandIsRaisedFb);
|
||||
tokenArray[digitalIndex + 6] = new XSigDigitalToken(digitalIndex + 7, participant.IsPinnedFb);
|
||||
|
||||
//serials
|
||||
tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, participant.Name);
|
||||
|
||||
//analogs
|
||||
tokenArray[analogIndex] = new XSigAnalogToken(analogIndex + 1, (ushort)participant.ScreenIndexIsPinnedToFb);
|
||||
|
||||
digitalIndex += maxDigitals;
|
||||
meetingIndex += offset;
|
||||
stringIndex += maxStrings;
|
||||
analogIndex += maxAnalogs;
|
||||
}
|
||||
|
||||
while (meetingIndex < maxParticipants * offset)
|
||||
{
|
||||
//digitals
|
||||
tokenArray[digitalIndex] = new XSigDigitalToken(digitalIndex + 1, false);
|
||||
tokenArray[digitalIndex + 1] = new XSigDigitalToken(digitalIndex + 2, false);
|
||||
tokenArray[digitalIndex + 2] = new XSigDigitalToken(digitalIndex + 3, false);
|
||||
tokenArray[digitalIndex + 3] = new XSigDigitalToken(digitalIndex + 4, false);
|
||||
tokenArray[digitalIndex + 4] = new XSigDigitalToken(digitalIndex + 5, false);
|
||||
tokenArray[digitalIndex + 5] = new XSigDigitalToken(digitalIndex + 6, false);
|
||||
tokenArray[digitalIndex + 6] = new XSigDigitalToken(digitalIndex + 7, false);
|
||||
|
||||
//serials
|
||||
tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, String.Empty);
|
||||
|
||||
//analogs
|
||||
tokenArray[analogIndex] = new XSigAnalogToken(analogIndex + 1, 0);
|
||||
|
||||
digitalIndex += maxDigitals;
|
||||
meetingIndex += offset;
|
||||
stringIndex += maxStrings;
|
||||
analogIndex += maxAnalogs;
|
||||
}
|
||||
|
||||
return GetXSigString(tokenArray);
|
||||
@@ -595,7 +673,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
trilist.SetBoolSigAction(joinMap.SourceShareAutoStart.JoinNumber, (b) => AutoShareContentWhileInCall = b);
|
||||
}
|
||||
|
||||
// TODO [ ] 2021-01-06, jkd: Added to debug OBTP dialing issues
|
||||
private List<Meeting> _currentMeetings = new List<Meeting>();
|
||||
|
||||
private void LinkVideoCodecScheduleToApi(IHasScheduleAwareness codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
||||
@@ -607,7 +684,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
codec.CodecSchedule.MeetingWarningMinutes = i;
|
||||
});
|
||||
|
||||
// TODO [ ] 2021-01-06, jkd: Added to debug OBTP dialing issues
|
||||
trilist.SetSigFalseAction(joinMap.DialMeeting1.JoinNumber, () =>
|
||||
{
|
||||
var mtg = 1;
|
||||
@@ -617,7 +693,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
if (_currentMeetings[index] != null)
|
||||
Dial(_currentMeetings[index]);
|
||||
});
|
||||
// TODO [ ] 2021-01-06, jkd: Added to debug OBTP dialing issues
|
||||
|
||||
trilist.SetSigFalseAction(joinMap.DialMeeting2.JoinNumber, () =>
|
||||
{
|
||||
var mtg = 2;
|
||||
@@ -627,7 +703,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
if (_currentMeetings[index] != null)
|
||||
Dial(_currentMeetings[index]);
|
||||
});
|
||||
// TODO [ ] 2021-01-06, jkd: Added to debug OBTP dialing issues
|
||||
|
||||
trilist.SetSigFalseAction(joinMap.DialMeeting3.JoinNumber, () =>
|
||||
{
|
||||
var mtg = 3;
|
||||
@@ -652,14 +728,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
{
|
||||
var currentTime = DateTime.Now;
|
||||
|
||||
// TODO [ ] 2021-01-06, jkd: Added to debug OBTP dialing issues
|
||||
// - changed var currentMeetings >> field _currentMeetings
|
||||
//_currentMeetings.Clear();
|
||||
_currentMeetings = codec.CodecSchedule.Meetings.Where(m => m.StartTime >= currentTime || m.EndTime >= currentTime).ToList();
|
||||
|
||||
// TODO [ ] 2021-01-06, jkd: Added to debug OBTP dialing issues
|
||||
// - moved the trilist.SetSigFlaseAction(joinMap.DialMeeting1..3.JoinNumber) lambda's to LinkVideoCodecScheduleToApi
|
||||
|
||||
var meetingsData = UpdateMeetingsListXSig(_currentMeetings);
|
||||
trilist.SetString(joinMap.Schedule.JoinNumber, meetingsData);
|
||||
trilist.SetUshort(joinMap.MeetingCount.JoinNumber, (ushort)_currentMeetings.Count);
|
||||
@@ -847,7 +917,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
|
||||
Debug.Console(1, this, "Call Direction: {0}", args.CallItem.Direction);
|
||||
Debug.Console(1, this, "Call is incoming: {0}", args.CallItem.Direction == eCodecCallDirection.Incoming);
|
||||
trilist.SetBool(joinMap.IncomingCall.JoinNumber, args.CallItem.Direction == eCodecCallDirection.Incoming && args.CallItem.Status == eCodecCallStatus.Ringing);
|
||||
trilist.SetBool(joinMap.IncomingCall.JoinNumber, args.CallItem.Direction == eCodecCallDirection.Incoming && args.CallItem.Status == eCodecCallStatus.Ringing);
|
||||
|
||||
if (args.CallItem.Direction == eCodecCallDirection.Incoming)
|
||||
{
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,273 @@
|
||||
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 [X] Set join numbers
|
||||
|
||||
#region Digital
|
||||
|
||||
[JoinName("CanSwapContentWithThumbnail")]
|
||||
public JoinDataComplete CanSwapContentWithThumbnail = new JoinDataComplete(
|
||||
new JoinData
|
||||
{
|
||||
JoinNumber = 206,
|
||||
JoinSpan = 1
|
||||
},
|
||||
new JoinMetadata
|
||||
{
|
||||
Description = "FB Indicates if content can be swapped with thumbnail",
|
||||
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||
JoinType = eJoinType.Digital
|
||||
});
|
||||
|
||||
[JoinName("SwapContentWithThumbnail")]
|
||||
public JoinDataComplete SwapContentWithThumbnail = new JoinDataComplete(
|
||||
new JoinData
|
||||
{
|
||||
JoinNumber = 206,
|
||||
JoinSpan = 1
|
||||
},
|
||||
new JoinMetadata
|
||||
{
|
||||
Description = "Pulse to swap content with thumbnail. FB reports current state",
|
||||
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
|
||||
JoinType = eJoinType.Digital
|
||||
});
|
||||
|
||||
[JoinName("GetAvailableLayouts")]
|
||||
public JoinDataComplete GetAvailableLayouts = new JoinDataComplete(
|
||||
new JoinData
|
||||
{
|
||||
JoinNumber = 215,
|
||||
JoinSpan = 1
|
||||
},
|
||||
new JoinMetadata
|
||||
{
|
||||
Description = "Gets the available layouts. Will update the LayoutXXXXXIsAvailbale signals.",
|
||||
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||
JoinType = eJoinType.Digital
|
||||
});
|
||||
|
||||
[JoinName("LayoutIsOnFirstPage")]
|
||||
public JoinDataComplete LayoutIsOnFirstPage = new JoinDataComplete(
|
||||
new JoinData
|
||||
{
|
||||
JoinNumber = 216,
|
||||
JoinSpan = 1
|
||||
},
|
||||
new JoinMetadata
|
||||
{
|
||||
Description = "Indicates if layout is on first page",
|
||||
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||
JoinType = eJoinType.Digital
|
||||
});
|
||||
|
||||
[JoinName("LayoutIsOnLastPage")]
|
||||
public JoinDataComplete LayoutIsOnLastPage = new JoinDataComplete(
|
||||
new JoinData
|
||||
{
|
||||
JoinNumber = 217,
|
||||
JoinSpan = 1
|
||||
},
|
||||
new JoinMetadata
|
||||
{
|
||||
Description = "Indicates if layout is on first page",
|
||||
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||
JoinType = eJoinType.Digital
|
||||
});
|
||||
|
||||
[JoinName("LayoutTurnToNextPage")]
|
||||
public JoinDataComplete LayoutTurnToNextPage = new JoinDataComplete(
|
||||
new JoinData
|
||||
{
|
||||
JoinNumber = 216,
|
||||
JoinSpan = 1
|
||||
},
|
||||
new JoinMetadata
|
||||
{
|
||||
Description = "Turns layout view to next page",
|
||||
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||
JoinType = eJoinType.Digital
|
||||
});
|
||||
|
||||
[JoinName("LayoutTurnToPreviousPage")]
|
||||
public JoinDataComplete LayoutTurnToPreviousPage = new JoinDataComplete(
|
||||
new JoinData
|
||||
{
|
||||
JoinNumber = 217,
|
||||
JoinSpan = 1
|
||||
},
|
||||
new JoinMetadata
|
||||
{
|
||||
Description = "Turns layout view to previous page",
|
||||
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||
JoinType = eJoinType.Digital
|
||||
});
|
||||
|
||||
[JoinName("LayoutGalleryIsAvailable")]
|
||||
public JoinDataComplete LayoutGalleryIsAvailable = new JoinDataComplete(
|
||||
new JoinData
|
||||
{
|
||||
JoinNumber = 221,
|
||||
JoinSpan = 1
|
||||
},
|
||||
new JoinMetadata
|
||||
{
|
||||
Description = "FB Indicates if layout 'Gallery' is available",
|
||||
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||
JoinType = eJoinType.DigitalSerial
|
||||
});
|
||||
|
||||
[JoinName("LayoutSpeakerIsAvailable")]
|
||||
public JoinDataComplete LayoutSpeakerIsAvailable = new JoinDataComplete(
|
||||
new JoinData
|
||||
{
|
||||
JoinNumber = 222,
|
||||
JoinSpan = 1
|
||||
},
|
||||
new JoinMetadata
|
||||
{
|
||||
Description = "FB Indicates if layout 'Speaker' is available",
|
||||
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||
JoinType = eJoinType.DigitalSerial
|
||||
});
|
||||
|
||||
[JoinName("LayoutStripIsAvailable")]
|
||||
public JoinDataComplete LayoutStripIsAvailable = new JoinDataComplete(
|
||||
new JoinData
|
||||
{
|
||||
JoinNumber = 223,
|
||||
JoinSpan = 1
|
||||
},
|
||||
new JoinMetadata
|
||||
{
|
||||
Description = "FB Indicates if layout 'Strip' is available",
|
||||
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||
JoinType = eJoinType.DigitalSerial
|
||||
});
|
||||
|
||||
[JoinName("LayoutShareAllIsAvailable")]
|
||||
public JoinDataComplete LayoutShareAllIsAvailable = new JoinDataComplete(
|
||||
new JoinData
|
||||
{
|
||||
JoinNumber = 224,
|
||||
JoinSpan = 1
|
||||
},
|
||||
new JoinMetadata
|
||||
{
|
||||
Description = "FB Indicates if layout 'ShareAll' is available",
|
||||
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||
JoinType = eJoinType.DigitalSerial
|
||||
});
|
||||
|
||||
//[JoinName("ParticipantAudioMuteToggleStart")]
|
||||
//public JoinDataComplete ParticipantAudioMuteToggleStart = new JoinDataComplete(
|
||||
// new JoinData
|
||||
// {
|
||||
// JoinNumber = 500,
|
||||
// JoinSpan = 100
|
||||
// },
|
||||
// new JoinMetadata
|
||||
// {
|
||||
// Description = "Toggles the participant's audio mute status",
|
||||
// JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||
// JoinType = eJoinType.Digital
|
||||
// });
|
||||
|
||||
//[JoinName("ParticipantVideoMuteToggleStart")]
|
||||
//public JoinDataComplete ParticipantVideoMuteToggleStart = new JoinDataComplete(
|
||||
// new JoinData
|
||||
// {
|
||||
// JoinNumber = 800,
|
||||
// JoinSpan = 100
|
||||
// },
|
||||
// new JoinMetadata
|
||||
// {
|
||||
// Description = "Toggles the participant's video mute status",
|
||||
// JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||
// JoinType = eJoinType.Digital
|
||||
// });
|
||||
|
||||
//[JoinName("ParticipantPinToggleStart")]
|
||||
//public JoinDataComplete ParticipantPinToggleStart = new JoinDataComplete(
|
||||
// new JoinData
|
||||
// {
|
||||
// JoinNumber = 1100,
|
||||
// JoinSpan = 100
|
||||
// },
|
||||
// new JoinMetadata
|
||||
// {
|
||||
// Description = "Toggles the participant's pin status",
|
||||
// JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||
// JoinType = eJoinType.Digital
|
||||
// });
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region Analog
|
||||
|
||||
[JoinName("NumberOfScreens")]
|
||||
public JoinDataComplete NumberOfScreens = new JoinDataComplete(
|
||||
new JoinData
|
||||
{
|
||||
JoinNumber = 11,
|
||||
JoinSpan = 1
|
||||
},
|
||||
new JoinMetadata
|
||||
{
|
||||
Description = "Reports the number of screens connected",
|
||||
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||
JoinType = eJoinType.Analog
|
||||
});
|
||||
|
||||
[JoinName("ScreenIndexToPinUserTo")]
|
||||
public JoinDataComplete ScreenIndexToPinUserTo = new JoinDataComplete(
|
||||
new JoinData
|
||||
{
|
||||
JoinNumber = 11,
|
||||
JoinSpan = 1
|
||||
},
|
||||
new JoinMetadata
|
||||
{
|
||||
Description = "Specifies the screen index a participant should be pinned to",
|
||||
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||
JoinType = eJoinType.Analog
|
||||
});
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region Serials
|
||||
|
||||
[JoinName("GetSetCurrentLayout")]
|
||||
public JoinDataComplete GetSetCurrentLayout = new JoinDataComplete(
|
||||
new JoinData
|
||||
{
|
||||
JoinNumber = 215,
|
||||
JoinSpan = 1
|
||||
},
|
||||
new JoinMetadata
|
||||
{
|
||||
Description = "Sets and reports the current layout. Use the LayoutXXXXIsAvailable signals to determine valid layouts",
|
||||
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
|
||||
JoinType = eJoinType.Serial
|
||||
});
|
||||
|
||||
#endregion
|
||||
|
||||
public ZoomRoomJoinMap(uint joinStart)
|
||||
: base(joinStart, typeof(ZoomRoomJoinMap))
|
||||
{
|
||||
}
|
||||
|
||||
public ZoomRoomJoinMap(uint joinStart, Type type)
|
||||
: base(joinStart, type)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user