mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-06 08:16:11 +00:00
Compare commits
1 Commits
1.9.5-beta
...
1.9.5-pr79
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
41c700a640 |
5
.github/workflows/docker.yml
vendored
5
.github/workflows/docker.yml
vendored
@@ -8,9 +8,12 @@ on:
|
||||
- bugfix/*
|
||||
- release/*
|
||||
- development
|
||||
pull_request:
|
||||
branches:
|
||||
- development
|
||||
|
||||
env:
|
||||
# solution path doesn't need slashes unless it is multiple folders deep
|
||||
# solution path doesn't need slashes unless there it is multiple folders deep
|
||||
# solution name does not include extension. .sln is assumed
|
||||
SOLUTION_PATH: PepperDashEssentials
|
||||
SOLUTION_FILE: PepperDashEssentials
|
||||
|
||||
@@ -207,7 +207,7 @@ namespace PepperDash.Essentials
|
||||
|
||||
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IBasicVolumeControls;
|
||||
|
||||
InitializeRoom();
|
||||
Initialize();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -215,7 +215,7 @@ namespace PepperDash.Essentials
|
||||
}
|
||||
}
|
||||
|
||||
void InitializeRoom()
|
||||
void Initialize()
|
||||
{
|
||||
if (DefaultAudioDevice is IBasicVolumeControls)
|
||||
DefaultVolumeControls = DefaultAudioDevice as IBasicVolumeControls;
|
||||
|
||||
@@ -156,7 +156,7 @@ namespace PepperDash.Essentials
|
||||
|
||||
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IRoutingSinkWithSwitching;
|
||||
|
||||
InitializeRoom();
|
||||
Initialize();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -164,7 +164,7 @@ namespace PepperDash.Essentials
|
||||
}
|
||||
}
|
||||
|
||||
void InitializeRoom()
|
||||
void Initialize()
|
||||
{
|
||||
if (DefaultAudioDevice is IBasicVolumeControls)
|
||||
DefaultVolumeControls = DefaultAudioDevice as IBasicVolumeControls;
|
||||
|
||||
@@ -226,7 +226,7 @@ namespace PepperDash.Essentials
|
||||
|
||||
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IBasicVolumeControls;
|
||||
|
||||
InitializeRoom();
|
||||
Initialize();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -234,7 +234,7 @@ namespace PepperDash.Essentials
|
||||
}
|
||||
}
|
||||
|
||||
void InitializeRoom()
|
||||
void Initialize()
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
|
||||
using PepperDash.Essentials.Core;
|
||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||
using PepperDash.Essentials.Room.Config;
|
||||
using PepperDash.Essentials.Core.Devices;
|
||||
using PepperDash.Essentials.Devices.Common.Codec;
|
||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||
using PepperDash.Essentials.Devices.Common.AudioCodec;
|
||||
|
||||
|
||||
using PepperDash.Core;
|
||||
|
||||
namespace PepperDash.Essentials
|
||||
{
|
||||
public interface IEssentialsHuddleSpaceRoom : IEssentialsRoom, IHasCurrentSourceInfoChange, IRunRouteAction, IHasDefaultDisplay
|
||||
{
|
||||
bool ExcludeFromGlobalFunctions { get; }
|
||||
|
||||
void RunRouteAction(string routeKey);
|
||||
|
||||
EssentialsHuddleRoomPropertiesConfig PropertiesConfig { get; }
|
||||
|
||||
IBasicVolumeControls CurrentVolumeControls { get; }
|
||||
|
||||
event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
||||
}
|
||||
|
||||
public interface IEssentialsHuddleVtc1Room : IEssentialsRoom, IHasCurrentSourceInfoChange,
|
||||
IHasCurrentVolumeControls, IRunRouteAction, IRunDefaultCallRoute, IHasVideoCodec, IHasAudioCodec, IHasDefaultDisplay
|
||||
{
|
||||
EssentialsHuddleVtc1PropertiesConfig PropertiesConfig { get; }
|
||||
|
||||
void RunRouteAction(string routeKey);
|
||||
|
||||
IHasScheduleAwareness ScheduleSource { get; }
|
||||
|
||||
string DefaultCodecRouteString { get; }
|
||||
}
|
||||
}
|
||||
@@ -49,16 +49,6 @@ namespace PepperDash.Essentials
|
||||
/// 1006
|
||||
/// </summary>
|
||||
public const uint CallEndAllConfirmVisible = 1006;
|
||||
/// <summary>
|
||||
/// 1007
|
||||
/// </summary>
|
||||
public const uint MeetingPasswordVisible = 1007;
|
||||
/// <summary>
|
||||
/// 1008
|
||||
/// </summary>
|
||||
public const uint MeetingLeavePress = 1008;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -163,11 +153,6 @@ namespace PepperDash.Essentials
|
||||
public const uint VCFavoriteVisibleStart = 1221;
|
||||
// RANGE IN USE
|
||||
public const uint VCFavoriteVisibleEnd = 1225;
|
||||
|
||||
/// <summary>
|
||||
/// 1230
|
||||
/// </summary>
|
||||
public const uint VCStagingMeetNowPress = 1230;
|
||||
/// <summary>
|
||||
/// 1231
|
||||
/// </summary>
|
||||
@@ -767,10 +752,10 @@ namespace PepperDash.Essentials
|
||||
/// 15044 Close button for source modal overlay
|
||||
/// </summary>
|
||||
public const uint SourceBackgroundOverlayClosePress = 15044;
|
||||
/// <summary>
|
||||
/// 15045
|
||||
/// </summary>
|
||||
public const uint ZoomRoomContentSharingVisible = 15045;
|
||||
///// <summary>
|
||||
///// 15045 - Visibility for the bar containing call navigation button list
|
||||
///// </summary>
|
||||
//public const uint CallStagingBarVisible = 15045;
|
||||
/// <summary>
|
||||
/// 15046
|
||||
/// </summary>
|
||||
@@ -859,11 +844,6 @@ namespace PepperDash.Essentials
|
||||
/// 15067
|
||||
/// </summary>
|
||||
public const uint NotificationRibbonVisible = 15067;
|
||||
/// <summary>
|
||||
/// 15068
|
||||
/// </summary>
|
||||
public const uint HeaderMeetingInfoVisible = 15068;
|
||||
|
||||
/// <summary>
|
||||
/// 15083 - Press for Call help desk on AC/VC
|
||||
/// </summary>
|
||||
@@ -968,24 +948,5 @@ namespace PepperDash.Essentials
|
||||
/// 15214
|
||||
/// </summary>
|
||||
public const uint PinDialogDot4 = 15214;
|
||||
|
||||
// Password Prompt Dialog **************************
|
||||
|
||||
/// <summary>
|
||||
/// 15301
|
||||
/// </summary>
|
||||
public const uint PasswordPromptDialogVisible = 15301;
|
||||
/// <summary>
|
||||
/// 15302
|
||||
/// </summary>
|
||||
public const uint PasswordPromptTextPress = 15302;
|
||||
/// <summary>
|
||||
/// 15306
|
||||
/// </summary>
|
||||
public const uint PasswordPromptCancelPress = 15306;
|
||||
/// <summary>
|
||||
/// 15307
|
||||
/// </summary>
|
||||
public const uint PasswordPromptErrorVisible = 15307;
|
||||
}
|
||||
}
|
||||
@@ -27,28 +27,6 @@ namespace PepperDash.Essentials
|
||||
/// 1004
|
||||
/// </summary>
|
||||
public const uint CallSharedSourceNameText = 1004;
|
||||
/// <summary>
|
||||
/// 1005
|
||||
/// </summary>
|
||||
public const uint MeetingIdText = 1005;
|
||||
/// <summary>
|
||||
/// 1006
|
||||
/// </summary>
|
||||
public const uint MeetingHostText = 1006;
|
||||
/// <summary>
|
||||
/// 1007
|
||||
/// </summary>
|
||||
public const uint MeetingPasswordText = 1007;
|
||||
/// <summary>
|
||||
/// 1008
|
||||
/// </summary>
|
||||
public const uint MeetingLeaveText = 1008;
|
||||
/// <summary>
|
||||
/// 1009
|
||||
/// </summary>
|
||||
public const uint MeetingNameText = 1009;
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -140,14 +118,6 @@ namespace PepperDash.Essentials
|
||||
|
||||
//----- through 3120
|
||||
|
||||
/// <summary>
|
||||
/// 3201
|
||||
/// </summary>
|
||||
public const uint PasswordPromptMessageText = 3201;
|
||||
/// <summary>
|
||||
/// 3202
|
||||
/// </summary>
|
||||
public const uint PasswordPromptPasswordText = 3202;
|
||||
|
||||
/// <summary>
|
||||
/// 3812
|
||||
|
||||
@@ -164,7 +164,7 @@ namespace PepperDash.Essentials
|
||||
CallCaretVisible = tempJoin + 10;
|
||||
TriList.SetSigFalseAction(tempJoin, () =>
|
||||
{
|
||||
avDriver.ShowActiveCallsListOrMeetingInfo();
|
||||
avDriver.ShowActiveCallsList();
|
||||
if(avDriver.CurrentRoom.InCallFeedback.BoolValue)
|
||||
CaretInterlock.ShowInterlocked(CallCaretVisible);
|
||||
});
|
||||
@@ -256,7 +256,7 @@ namespace PepperDash.Essentials
|
||||
TriList.SetSigFalseAction(UIBoolJoin.HeaderCallStatusLabelPress,
|
||||
() =>
|
||||
{
|
||||
avDriver.ShowActiveCallsListOrMeetingInfo();
|
||||
avDriver.ShowActiveCallsList();
|
||||
if (avDriver.CurrentRoom.InCallFeedback.BoolValue)
|
||||
CaretInterlock.ShowInterlocked(CallCaretVisible);
|
||||
});
|
||||
@@ -354,8 +354,6 @@ namespace PepperDash.Essentials
|
||||
headerPopupShown = true;
|
||||
else if (e.NewJoin == UIBoolJoin.HeaderActiveCallsListVisible)
|
||||
headerPopupShown = true;
|
||||
else if (e.NewJoin == UIBoolJoin.HeaderMeetingInfoVisible)
|
||||
headerPopupShown = true;
|
||||
else if (e.NewJoin == UIBoolJoin.HelpPageVisible)
|
||||
headerPopupShown = true;
|
||||
else if (e.NewJoin == UIBoolJoin.MeetingsOrContacMethodsListVisible)
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharpPro;
|
||||
using Crestron.SimplSharpPro.UI;
|
||||
@@ -14,7 +13,6 @@ using PepperDash.Essentials.Core.PageManagers;
|
||||
using PepperDash.Essentials.Room.Config;
|
||||
using PepperDash.Essentials.Devices.Common.Codec;
|
||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||
using PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces;
|
||||
|
||||
namespace PepperDash.Essentials
|
||||
{
|
||||
@@ -100,9 +98,6 @@ namespace PepperDash.Essentials
|
||||
/// </summary>
|
||||
public SubpageReferenceList MeetingOrContactMethodModalSrl { get; set; }
|
||||
|
||||
public uint CallListOrMeetingInfoPopoverVisibilityJoin { get; private set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The list of buttons on the header. Managed with visibility only
|
||||
/// </summary>
|
||||
@@ -181,16 +176,6 @@ namespace PepperDash.Essentials
|
||||
|
||||
private UiDisplayMode _currentMode;
|
||||
|
||||
private bool _isZoomRoomWithNoExternalSources
|
||||
{
|
||||
get
|
||||
{
|
||||
return CurrentRoom.VideoCodec is Essentials.Devices.Common.VideoCodec.ZoomRoom.ZoomRoom && _sourceListCount <= 1;
|
||||
}
|
||||
}
|
||||
|
||||
private uint _sourceListCount;
|
||||
|
||||
/// <summary>
|
||||
/// The mode showing. Presentation or call.
|
||||
/// </summary>
|
||||
@@ -365,17 +350,15 @@ namespace PepperDash.Essentials
|
||||
/// <summary>
|
||||
/// Allows PopupInterlock to be toggled if the calls list is already visible, or if the codec is in a call
|
||||
/// </summary>
|
||||
public void ShowActiveCallsListOrMeetingInfo()
|
||||
public void ShowActiveCallsList()
|
||||
{
|
||||
TriList.SetBool(UIBoolJoin.CallEndAllConfirmVisible, true);
|
||||
|
||||
|
||||
if(PopupInterlock.CurrentJoin == CallListOrMeetingInfoPopoverVisibilityJoin)
|
||||
PopupInterlock.ShowInterlockedWithToggle(CallListOrMeetingInfoPopoverVisibilityJoin);
|
||||
if(PopupInterlock.CurrentJoin == UIBoolJoin.HeaderActiveCallsListVisible)
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HeaderActiveCallsListVisible);
|
||||
else
|
||||
{
|
||||
if(CurrentRoom.VideoCodec.IsInCall)
|
||||
PopupInterlock.ShowInterlockedWithToggle(CallListOrMeetingInfoPopoverVisibilityJoin);
|
||||
if((CurrentRoom.ScheduleSource as VideoCodecBase).IsInCall)
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HeaderActiveCallsListVisible);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -487,16 +470,12 @@ namespace PepperDash.Essentials
|
||||
Debug.Console(0, "*#* Room on: {0}, lastMeetingDismissedId: {1} {2} *#*",
|
||||
CurrentRoom.OnFeedback.BoolValue,
|
||||
LastMeetingDismissedId,
|
||||
lastMeetingDismissed != null ? lastMeetingDismissed.StartTime.ToString("t", Global.Culture) : "");
|
||||
lastMeetingDismissed != null ? lastMeetingDismissed.StartTime.ToShortTimeString() : "");
|
||||
|
||||
var meeting = meetings.LastOrDefault(m => m.Joinable);
|
||||
if (CurrentRoom.OnFeedback.BoolValue
|
||||
&& lastMeetingDismissed == meeting)
|
||||
{
|
||||
// meeting no longer joinable, hide popup
|
||||
if(meeting == null)
|
||||
HideNextMeetingPopup();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -508,11 +487,9 @@ namespace PepperDash.Essentials
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
|
||||
TriList.SetString(UIStringJoin.MeetingsOrContactMethodListTitleText, "Upcoming meeting");
|
||||
TriList.SetString(UIStringJoin.NextMeetingStartTimeText, meeting.StartTime.ToString("t", Global.Culture));
|
||||
TriList.SetString(UIStringJoin.NextMeetingEndTimeText, meeting.EndTime.ToString("t", Global.Culture));
|
||||
TriList.SetString(UIStringJoin.NextMeetingStartTimeText, meeting.StartTime.ToShortTimeString());
|
||||
TriList.SetString(UIStringJoin.NextMeetingEndTimeText, meeting.EndTime.ToShortTimeString());
|
||||
TriList.SetString(UIStringJoin.NextMeetingTitleText, meeting.Title);
|
||||
TriList.SetString(UIStringJoin.NextMeetingNameText, meeting.Organizer);
|
||||
TriList.SetString(UIStringJoin.NextMeetingButtonLabel, "Join");
|
||||
@@ -535,7 +512,7 @@ namespace PepperDash.Essentials
|
||||
// indexOf = 3, 4 meetings :
|
||||
if (indexOfNext < meetings.Count)
|
||||
TriList.SetString(UIStringJoin.NextMeetingFollowingMeetingText,
|
||||
meetings[indexOfNext].StartTime.ToString("t", Global.Culture));
|
||||
meetings[indexOfNext].StartTime.ToShortTimeString());
|
||||
else
|
||||
TriList.SetString(UIStringJoin.NextMeetingFollowingMeetingText, "No more meetings today");
|
||||
|
||||
@@ -657,24 +634,9 @@ namespace PepperDash.Essentials
|
||||
|
||||
TriList.SetBool(StartPageVisibleJoin, startMode ? true : false);
|
||||
|
||||
if (presentationMode &&_isZoomRoomWithNoExternalSources)
|
||||
{
|
||||
// For now, if this is a Zoom Room and there are no shareable sources just display the informational subpage
|
||||
TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, false);
|
||||
TriList.SetBool(UIBoolJoin.ZoomRoomContentSharingVisible, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Otherwise, show the staging bar
|
||||
TriList.SetBool(UIBoolJoin.ZoomRoomContentSharingVisible, false);
|
||||
TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, presentationMode ? true : false);
|
||||
|
||||
}
|
||||
TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, presentationMode ? true : false);
|
||||
if (!presentationMode)
|
||||
{
|
||||
TriList.SetBool(UIBoolJoin.ZoomRoomContentSharingVisible, false);
|
||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
||||
}
|
||||
|
||||
CallButtonSig.BoolValue = callMode
|
||||
&& CurrentRoom.ShutdownType == eShutdownType.None;
|
||||
@@ -712,39 +674,25 @@ namespace PepperDash.Essentials
|
||||
if (VCDriver.IsVisible)
|
||||
VCDriver.Hide();
|
||||
HideNextMeetingPopup();
|
||||
|
||||
|
||||
if (_isZoomRoomWithNoExternalSources)
|
||||
// Run default source when room is off and share is pressed
|
||||
if (!CurrentRoom.OnFeedback.BoolValue)
|
||||
{
|
||||
// If there's no default, show UI elements
|
||||
if (!(CurrentRoom as IRunDefaultPresentRoute).RunDefaultPresentRoute())
|
||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
||||
}
|
||||
else // room is on show what's active or select a source if nothing is yet active
|
||||
{
|
||||
(CurrentRoom as IRunDefaultPresentRoute).RunDefaultPresentRoute();
|
||||
// For now, if this is a Zoom Room and there are no shareable sources just display the informational subpage
|
||||
TriList.SetBool(UIBoolJoin.ZoomRoomContentSharingVisible, true);
|
||||
|
||||
if (CurrentSourcePageManager != null)
|
||||
CurrentSourcePageManager.Hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Run default source when room is off and share is pressed
|
||||
if (!CurrentRoom.OnFeedback.BoolValue)
|
||||
if(CurrentRoom.CurrentSourceInfo == null || (CurrentRoom.VideoCodec != null && CurrentRoom.CurrentSourceInfo.SourceDevice.Key == CurrentRoom.VideoCodec.OsdSource.Key))
|
||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
||||
else if (CurrentSourcePageManager != null)
|
||||
{
|
||||
// If there's no default, show UI elements
|
||||
if (!(CurrentRoom as IRunDefaultPresentRoute).RunDefaultPresentRoute())
|
||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
||||
CurrentSourcePageManager.Show();
|
||||
}
|
||||
else // room is on show what's active or select a source if nothing is yet active
|
||||
{
|
||||
if (CurrentRoom.CurrentSourceInfo == null || (CurrentRoom.VideoCodec != null && CurrentRoom.CurrentSourceInfo.SourceDevice.Key == CurrentRoom.VideoCodec.OsdSource.Key))
|
||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
||||
else if (CurrentSourcePageManager != null)
|
||||
{
|
||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
||||
CurrentSourcePageManager.Show();
|
||||
}
|
||||
}
|
||||
SetupSourceList();
|
||||
}
|
||||
CurrentMode = UiDisplayMode.Presentation;
|
||||
SetupSourceList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -783,7 +731,7 @@ namespace PepperDash.Essentials
|
||||
/// </summary>
|
||||
void ShowCurrentSource()
|
||||
{
|
||||
if (CurrentRoom.CurrentSourceInfo == null || _isZoomRoomWithNoExternalSources)
|
||||
if (CurrentRoom.CurrentSourceInfo == null)
|
||||
return;
|
||||
|
||||
CurrentMode = UiDisplayMode.Presentation;
|
||||
@@ -993,18 +941,6 @@ namespace PepperDash.Essentials
|
||||
_CurrentRoom.IsWarmingUpFeedback.OutputChange -= CurrentRoom_IsWarmingFeedback_OutputChange;
|
||||
_CurrentRoom.IsCoolingDownFeedback.OutputChange -= CurrentRoom_IsCoolingDownFeedback_OutputChange;
|
||||
_CurrentRoom.InCallFeedback.OutputChange -= CurrentRoom_InCallFeedback_OutputChange;
|
||||
|
||||
var scheduleAwareCodec = _CurrentRoom.VideoCodec as IHasScheduleAwareness;
|
||||
if (scheduleAwareCodec != null)
|
||||
{
|
||||
scheduleAwareCodec.CodecSchedule.MeetingsListHasChanged -= CodecSchedule_MeetingsListHasChanged;
|
||||
}
|
||||
|
||||
var meetingInfoCodec = _CurrentRoom.VideoCodec as IHasMeetingInfo;
|
||||
if (meetingInfoCodec != null)
|
||||
{
|
||||
meetingInfoCodec.MeetingInfoChanged -= meetingInfoCodec_MeetingInfoChanged;
|
||||
}
|
||||
}
|
||||
|
||||
_CurrentRoom = room;
|
||||
@@ -1037,23 +973,9 @@ namespace PepperDash.Essentials
|
||||
_CurrentRoom.CurrentSourceChange += CurrentRoom_SourceInfoChange;
|
||||
RefreshSourceInfo();
|
||||
|
||||
|
||||
var scheduleAwareCodec = _CurrentRoom.VideoCodec as IHasScheduleAwareness;
|
||||
if (scheduleAwareCodec != null)
|
||||
if (_CurrentRoom.VideoCodec is IHasScheduleAwareness)
|
||||
{
|
||||
scheduleAwareCodec.CodecSchedule.MeetingsListHasChanged += CodecSchedule_MeetingsListHasChanged;
|
||||
}
|
||||
|
||||
var meetingInfoCodec = _CurrentRoom.VideoCodec as IHasMeetingInfo;
|
||||
if (meetingInfoCodec != null)
|
||||
{
|
||||
meetingInfoCodec.MeetingInfoChanged += new EventHandler<MeetingInfoEventArgs>(meetingInfoCodec_MeetingInfoChanged);
|
||||
|
||||
CallListOrMeetingInfoPopoverVisibilityJoin = UIBoolJoin.HeaderMeetingInfoVisible;
|
||||
}
|
||||
else
|
||||
{
|
||||
CallListOrMeetingInfoPopoverVisibilityJoin = UIBoolJoin.HeaderActiveCallsListVisible;
|
||||
(_CurrentRoom.VideoCodec as IHasScheduleAwareness).CodecSchedule.MeetingsListHasChanged += CodecSchedule_MeetingsListHasChanged;
|
||||
}
|
||||
|
||||
CallSharingInfoVisibleFeedback = new BoolFeedback(() => _CurrentRoom.VideoCodec.SharingContentIsOnFeedback.BoolValue);
|
||||
@@ -1065,8 +987,7 @@ namespace PepperDash.Essentials
|
||||
if (_CurrentRoom != null)
|
||||
_CurrentRoom.CurrentSourceChange += new SourceInfoChangeHandler(CurrentRoom_CurrentSingleSourceChange);
|
||||
|
||||
// Moved to EssentialsVideoCodecUiDriver
|
||||
//TriList.SetSigFalseAction(UIBoolJoin.CallStopSharingPress, () => _CurrentRoom.RunRouteAction("codecOsd", _CurrentRoom.SourceListKey));
|
||||
TriList.SetSigFalseAction(UIBoolJoin.CallStopSharingPress, () => _CurrentRoom.RunRouteAction("codecOsd", _CurrentRoom.SourceListKey));
|
||||
|
||||
(Parent as EssentialsPanelMainInterfaceDriver).HeaderDriver.SetupHeaderButtons(this, CurrentRoom);
|
||||
}
|
||||
@@ -1077,21 +998,6 @@ namespace PepperDash.Essentials
|
||||
}
|
||||
}
|
||||
|
||||
void meetingInfoCodec_MeetingInfoChanged(object sender, MeetingInfoEventArgs e)
|
||||
{
|
||||
TriList.SetString(UIStringJoin.MeetingIdText, e.Info.Id);
|
||||
TriList.SetString(UIStringJoin.MeetingHostText, e.Info.Host);
|
||||
TriList.SetString(UIStringJoin.MeetingNameText, e.Info.Name);
|
||||
|
||||
TriList.SetString(UIStringJoin.MeetingPasswordText, e.Info.Password);
|
||||
// Show the password fields if one is present
|
||||
TriList.SetBool(UIBoolJoin.MeetingPasswordVisible, string.IsNullOrEmpty(e.Info.Password) ? false : true);
|
||||
|
||||
TriList.SetString(UIStringJoin.CallSharedSourceNameText, e.Info.ShareStatus);
|
||||
|
||||
TriList.SetString(UIStringJoin.MeetingLeaveText, e.Info.IsHost ? "End Meeting" : "Leave Meeting");
|
||||
}
|
||||
|
||||
void SetCurrentRoom(IEssentialsHuddleVtc1Room room)
|
||||
{
|
||||
if (_CurrentRoom == room) return;
|
||||
@@ -1205,8 +1111,7 @@ namespace PepperDash.Essentials
|
||||
Debug.Console(1, "**** KEY {0}", kvp.Key);
|
||||
|
||||
}
|
||||
_sourceListCount = (i - 1);
|
||||
SourceStagingSrl.Count = (ushort)_sourceListCount;
|
||||
SourceStagingSrl.Count = (ushort)(i - 1);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1304,8 +1209,8 @@ namespace PepperDash.Essentials
|
||||
foreach (var m in CurrentRoom.ScheduleSource.CodecSchedule.Meetings)
|
||||
{
|
||||
i++;
|
||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 1).StringValue = m.StartTime.ToString("t", Global.Culture);
|
||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 2).StringValue = m.EndTime.ToString("t", Global.Culture);
|
||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 1).StringValue = m.StartTime.ToShortTimeString();
|
||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 2).StringValue = m.EndTime.ToShortTimeString();
|
||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 3).StringValue = m.Title;
|
||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 4).StringValue = string.Format("<br>{0}",m.Organizer);
|
||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 5).StringValue = "Join";
|
||||
@@ -1602,8 +1507,6 @@ namespace PepperDash.Essentials
|
||||
/// </summary>
|
||||
void PrepareForCodecIncomingCall();
|
||||
|
||||
uint CallListOrMeetingInfoPopoverVisibilityJoin { get; }
|
||||
|
||||
SubpageReferenceList MeetingOrContactMethodModalSrl { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Globalization;
|
||||
using System.Text.RegularExpressions;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharpPro;
|
||||
@@ -15,7 +14,6 @@ using PepperDash.Essentials.Core.SmartObjects;
|
||||
using PepperDash.Essentials.Core.Touchpanels.Keyboards;
|
||||
using PepperDash.Essentials.Devices.Common.Codec;
|
||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||
using PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces;
|
||||
using PepperDash.Essentials.Devices.Common.Cameras;
|
||||
|
||||
namespace PepperDash.Essentials.UIDrivers.VC
|
||||
@@ -85,9 +83,6 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
StringBuilder SearchStringBuilder = new StringBuilder();
|
||||
BoolFeedback SearchStringBackspaceVisibleFeedback;
|
||||
|
||||
StringFeedback PasswordStringFeedback;
|
||||
StringBuilder PasswordStringBuilder = new StringBuilder();
|
||||
|
||||
ModalDialog IncomingCallModal;
|
||||
|
||||
eKeypadMode KeypadMode;
|
||||
@@ -128,6 +123,12 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
|
||||
codec.CallStatusChange += new EventHandler<CodecCallStatusItemChangeEventArgs>(Codec_CallStatusChange);
|
||||
|
||||
// If the codec is ready, then get the values we want, otherwise wait
|
||||
if (Codec.IsReady)
|
||||
Codec_IsReady();
|
||||
else
|
||||
codec.IsReadyChange += (o, a) => Codec_IsReady();
|
||||
|
||||
//InCall = new BoolFeedback(() => false);
|
||||
LocalPrivacyIsMuted = new BoolFeedback(() => false);
|
||||
|
||||
@@ -152,8 +153,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
// Return formatted when dialing, straight digits when in call
|
||||
DialStringFeedback = new StringFeedback(() =>
|
||||
{
|
||||
// Format the number feedback if in dial mode and the codec is not IHasStartMeeting (ZoomRoom)
|
||||
if (KeypadMode == eKeypadMode.Dial && !(Codec is IHasStartMeeting))
|
||||
if (KeypadMode == eKeypadMode.Dial)
|
||||
return GetFormattedDialString(DialStringBuilder.ToString());
|
||||
else
|
||||
return DialStringBuilder.ToString();
|
||||
@@ -180,23 +180,9 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
});
|
||||
SearchStringFeedback.LinkInputSig(triList.StringInput[UIStringJoin.CodecDirectorySearchEntryText]);
|
||||
|
||||
PasswordStringFeedback = new StringFeedback(() =>
|
||||
{
|
||||
if (PasswordStringBuilder.Length > 0)
|
||||
{
|
||||
Parent.Keyboard.EnableGoButton();
|
||||
return PasswordStringBuilder.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
Parent.Keyboard.DisableGoButton();
|
||||
return "";
|
||||
}
|
||||
});
|
||||
PasswordStringFeedback.LinkInputSig(triList.StringInput[UIStringJoin.PasswordPromptPasswordText]);
|
||||
|
||||
SetupDirectoryList();
|
||||
|
||||
|
||||
SearchStringBackspaceVisibleFeedback = new BoolFeedback(() => SearchStringBuilder.Length > 0);
|
||||
SearchStringBackspaceVisibleFeedback.LinkInputSig(triList.BooleanInput[UIBoolJoin.VCDirectoryBackspaceVisible]);
|
||||
|
||||
@@ -213,18 +199,6 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
triList.SetSigHeldAction(UIBoolJoin.VCDirectoryBackspacePress, 500,
|
||||
StartSearchBackspaceRepeat, StopSearchBackspaceRepeat, SearchKeypadBackspacePress);
|
||||
|
||||
|
||||
if (Codec is IPasswordPrompt)
|
||||
{
|
||||
SetupPasswordPrompt();
|
||||
}
|
||||
|
||||
|
||||
// If the codec is ready, then get the values we want, otherwise wait
|
||||
if (Codec.IsReady)
|
||||
Codec_IsReady();
|
||||
else
|
||||
codec.IsReadyChange += (o, a) => Codec_IsReady();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -325,7 +299,6 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
{
|
||||
case eCodecCallStatus.Connected:
|
||||
// fire at SRL item
|
||||
HidePasswordPrompt();
|
||||
KeypadMode = eKeypadMode.DTMF;
|
||||
DialStringBuilder.Remove(0, DialStringBuilder.Length);
|
||||
DialStringFeedback.FireUpdate();
|
||||
@@ -424,8 +397,8 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
ActiveCallsSRL.Count = (ushort)activeList.Count;
|
||||
|
||||
// If Active Calls list is visible and codec is not in a call, hide the list
|
||||
if (!Codec.IsInCall && Parent.PopupInterlock.CurrentJoin == Parent.CallListOrMeetingInfoPopoverVisibilityJoin)
|
||||
Parent.PopupInterlock.ShowInterlockedWithToggle(Parent.CallListOrMeetingInfoPopoverVisibilityJoin);
|
||||
if (!Codec.IsInCall && Parent.PopupInterlock.CurrentJoin == UIBoolJoin.HeaderActiveCallsListVisible)
|
||||
Parent.PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HeaderActiveCallsListVisible);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -516,46 +489,20 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
TriList.SetSigFalseAction(UIBoolJoin.VCStagingRecentsPress, ShowRecents);
|
||||
TriList.SetSigFalseAction(UIBoolJoin.VCStagingCameraPress, ShowCameraControls);
|
||||
TriList.SetSigFalseAction(UIBoolJoin.VCStagingConnectPress, ConnectPress);
|
||||
TriList.SetSigFalseAction(UIBoolJoin.VCStagingMeetNowPress, MeetNowPress);
|
||||
TriList.SetSigFalseAction(UIBoolJoin.CallStopSharingPress, CallStopSharingPress);
|
||||
|
||||
TriList.SetSigFalseAction(UIBoolJoin.CallEndPress, () =>
|
||||
{
|
||||
if (Codec.ActiveCalls.Count > 1)
|
||||
{
|
||||
Parent.PopupInterlock.ShowInterlocked(Parent.CallListOrMeetingInfoPopoverVisibilityJoin);
|
||||
Parent.PopupInterlock.ShowInterlocked(UIBoolJoin.HeaderActiveCallsListVisible);
|
||||
}
|
||||
else
|
||||
Codec.EndAllCalls();
|
||||
});
|
||||
|
||||
TriList.SetSigFalseAction(UIBoolJoin.CallEndAllConfirmPress, () =>
|
||||
{
|
||||
Parent.PopupInterlock.HideAndClear();
|
||||
Codec.EndAllCalls();
|
||||
});
|
||||
|
||||
var meetingInfoCodec = Codec as IHasMeetingInfo;
|
||||
if (meetingInfoCodec != null)
|
||||
{
|
||||
TriList.SetSigFalseAction(UIBoolJoin.MeetingLeavePress, () =>
|
||||
{
|
||||
Parent.PopupInterlock.HideAndClear();
|
||||
|
||||
if (meetingInfoCodec.MeetingInfo.IsHost)
|
||||
{
|
||||
Codec.EndAllCalls();
|
||||
}
|
||||
else
|
||||
{
|
||||
var startMeetingCodec = Codec as IHasStartMeeting;
|
||||
if (startMeetingCodec != null)
|
||||
{
|
||||
startMeetingCodec.LeaveMeeting();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void SetupCameraControls()
|
||||
@@ -1037,7 +984,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
// if it's today, show a simpler string
|
||||
string timeText = null;
|
||||
if (c.StartTime.Date == DateTime.Now.Date)
|
||||
timeText = c.StartTime.ToString("t", Global.Culture);
|
||||
timeText = c.StartTime.ToShortTimeString();
|
||||
else if (c.StartTime == DateTime.MinValue)
|
||||
timeText = "";
|
||||
else
|
||||
@@ -1381,21 +1328,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
/// </summary>
|
||||
void RevealKeyboard()
|
||||
{
|
||||
if (_passwordPromptDialogVisible)
|
||||
{
|
||||
Debug.Console(2, "Attaching Keyboard to PasswordPromptDialog");
|
||||
DetachDialKeyboard();
|
||||
DetachSearchKeyboard();
|
||||
var kb = Parent.Keyboard;
|
||||
kb.KeyPress -= Keyboard_PasswordKeyPress;
|
||||
kb.KeyPress += Keyboard_PasswordKeyPress;
|
||||
kb.HideAction = this.DetachPasswordKeyboard;
|
||||
kb.GoButtonText = "Submit";
|
||||
kb.GoButtonVisible = true;
|
||||
PasswordStringCheckEnables();
|
||||
kb.Show();
|
||||
}
|
||||
else if (VCControlsInterlock.CurrentJoin == UIBoolJoin.VCKeypadWithFavoritesVisible && KeypadMode == eKeypadMode.Dial)
|
||||
if (VCControlsInterlock.CurrentJoin == UIBoolJoin.VCKeypadWithFavoritesVisible && KeypadMode == eKeypadMode.Dial)
|
||||
{
|
||||
var kb = Parent.Keyboard;
|
||||
kb.KeyPress -= Keyboard_DialKeyPress;
|
||||
@@ -1417,7 +1350,6 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
SearchStringKeypadCheckEnables();
|
||||
kb.Show();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -1473,32 +1405,6 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Event handler for keyboard dialing
|
||||
/// </summary>
|
||||
void Keyboard_PasswordKeyPress(object sender, PepperDash.Essentials.Core.Touchpanels.Keyboards.KeyboardControllerPressEventArgs e)
|
||||
{
|
||||
if (_passwordPromptDialogVisible)
|
||||
{
|
||||
if (e.Text != null)
|
||||
PasswordStringBuilder.Append(e.Text);
|
||||
else
|
||||
{
|
||||
if (e.SpecialKey == KeyboardSpecialKey.Backspace)
|
||||
PasswordKeypadBackspacePress();
|
||||
else if (e.SpecialKey == KeyboardSpecialKey.Clear)
|
||||
PasswordKeypadClear();
|
||||
else if (e.SpecialKey == KeyboardSpecialKey.GoButton)
|
||||
{
|
||||
(Codec as IPasswordPrompt).SubmitPassword(PasswordStringBuilder.ToString());
|
||||
HidePasswordPrompt();
|
||||
}
|
||||
}
|
||||
PasswordStringFeedback.FireUpdate();
|
||||
PasswordStringCheckEnables();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Call
|
||||
/// </summary>
|
||||
@@ -1512,11 +1418,6 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
Parent.Keyboard.KeyPress -= Keyboard_SearchKeyPress;
|
||||
}
|
||||
|
||||
void DetachPasswordKeyboard()
|
||||
{
|
||||
Parent.Keyboard.KeyPress -= Keyboard_PasswordKeyPress;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shows the camera controls subpage
|
||||
/// </summary>
|
||||
@@ -1594,22 +1495,6 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingRecentsPress);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Meet Now button
|
||||
/// </summary>
|
||||
void MeetNowPress()
|
||||
{
|
||||
var startMeetingCodec = Codec as IHasStartMeeting;
|
||||
if (startMeetingCodec != null)
|
||||
{
|
||||
startMeetingCodec.StartMeeting(startMeetingCodec.DefaultMeetingDurationMin);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Console(2, "Codce does not implment IHasStartMeeting. Cannot meet now");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Connect call button
|
||||
/// </summary>
|
||||
@@ -1620,16 +1505,6 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
Codec.Dial(DialStringBuilder.ToString());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stop Sharing button
|
||||
/// </summary>
|
||||
void CallStopSharingPress()
|
||||
{
|
||||
Codec.StopSharing();
|
||||
Parent.CurrentRoom.RunRouteAction("codecOsd", Parent.CurrentRoom.SourceListKey);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
@@ -1796,40 +1671,6 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
Parent.Keyboard.DisableGoButton();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clears the Password keypad
|
||||
/// </summary>
|
||||
void PasswordKeypadClear()
|
||||
{
|
||||
PasswordStringBuilder.Remove(0, SearchStringBuilder.Length);
|
||||
PasswordStringFeedback.FireUpdate();
|
||||
PasswordStringCheckEnables();
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
void PasswordKeypadBackspacePress()
|
||||
{
|
||||
PasswordStringBuilder.Remove(PasswordStringBuilder.Length - 1, 1);
|
||||
|
||||
PasswordStringFeedback.FireUpdate();
|
||||
PasswordStringCheckEnables();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks the enabled states of various elements around the keypad
|
||||
/// </summary>
|
||||
void PasswordStringCheckEnables()
|
||||
{
|
||||
var textIsEntered = PasswordStringBuilder.Length > 0;
|
||||
if (textIsEntered)
|
||||
Parent.Keyboard.EnableGoButton();
|
||||
else
|
||||
Parent.Keyboard.DisableGoButton();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Returns the text value for the keypad dial entry field
|
||||
@@ -1875,61 +1716,5 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
Dial = 0,
|
||||
DTMF
|
||||
}
|
||||
|
||||
void SetupPasswordPrompt()
|
||||
{
|
||||
var passwordPromptCodec = Codec as IPasswordPrompt;
|
||||
|
||||
passwordPromptCodec.PasswordRequired += new EventHandler<PasswordPromptEventArgs>(passwordPromptCodec_PasswordRequired);
|
||||
|
||||
TriList.SetSigFalseAction(UIBoolJoin.PasswordPromptCancelPress, HidePasswordPrompt);
|
||||
TriList.SetSigFalseAction(UIBoolJoin.PasswordPromptTextPress, RevealKeyboard);
|
||||
}
|
||||
|
||||
void passwordPromptCodec_PasswordRequired(object sender, PasswordPromptEventArgs e)
|
||||
{
|
||||
if (e.LoginAttemptCancelled)
|
||||
{
|
||||
HidePasswordPrompt();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(e.Message))
|
||||
{
|
||||
TriList.SetString(UIStringJoin.PasswordPromptMessageText, e.Message);
|
||||
}
|
||||
|
||||
if (e.LoginAttemptFailed)
|
||||
{
|
||||
// TODO: Show a message modal to indicate the login attempt failed
|
||||
return;
|
||||
}
|
||||
|
||||
TriList.SetBool(UIBoolJoin.PasswordPromptErrorVisible, e.LastAttemptWasIncorrect);
|
||||
|
||||
ShowPasswordPrompt();
|
||||
}
|
||||
|
||||
private bool _passwordPromptDialogVisible;
|
||||
|
||||
void ShowPasswordPrompt()
|
||||
{
|
||||
// Clear out any previous data
|
||||
PasswordKeypadClear();
|
||||
|
||||
_passwordPromptDialogVisible = true;
|
||||
TriList.SetBool(UIBoolJoin.PasswordPromptDialogVisible, _passwordPromptDialogVisible);
|
||||
RevealKeyboard();
|
||||
}
|
||||
|
||||
void HidePasswordPrompt()
|
||||
{
|
||||
if (_passwordPromptDialogVisible)
|
||||
{
|
||||
_passwordPromptDialogVisible = false;
|
||||
Parent.Keyboard.Hide();
|
||||
TriList.SetBool(UIBoolJoin.PasswordPromptDialogVisible, _passwordPromptDialogVisible);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
|
||||
namespace PepperDash.Essentials.Core
|
||||
{
|
||||
/// <summary>
|
||||
/// Describes the functionality required to prompt a user to enter a password
|
||||
/// </summary>
|
||||
public interface IPasswordPrompt
|
||||
{
|
||||
/// <summary>
|
||||
/// Notifies when a password is required or is entered incorrectly
|
||||
/// </summary>
|
||||
event EventHandler<PasswordPromptEventArgs> PasswordRequired;
|
||||
|
||||
/// <summary>
|
||||
/// Submits the password
|
||||
/// </summary>
|
||||
/// <param name="password"></param>
|
||||
void SubmitPassword(string password);
|
||||
}
|
||||
|
||||
public class PasswordPromptEventArgs : EventArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// Indicates if the last submitted password was incorrect
|
||||
/// </summary>
|
||||
public bool LastAttemptWasIncorrect { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Indicates that the login attempt has failed
|
||||
/// </summary>
|
||||
public bool LoginAttemptFailed { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Indicates that the process was cancelled and the prompt should be dismissed
|
||||
/// </summary>
|
||||
public bool LoginAttemptCancelled { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// A message to be displayed to the user
|
||||
/// </summary>
|
||||
public string Message { get; private set; }
|
||||
|
||||
public PasswordPromptEventArgs(bool lastAttemptIncorrect, bool loginFailed, bool loginCancelled, string message)
|
||||
{
|
||||
LastAttemptWasIncorrect = lastAttemptIncorrect;
|
||||
LoginAttemptFailed = loginFailed;
|
||||
LoginAttemptCancelled = loginCancelled;
|
||||
Message = message;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Globalization;
|
||||
using Crestron.SimplSharp;
|
||||
using System.Collections.Generic;
|
||||
using Crestron.SimplSharp.CrestronIO;
|
||||
@@ -29,10 +28,6 @@ namespace PepperDash.Essentials.Core
|
||||
|
||||
public static eCrestronSeries ProcessorSeries { get { return CrestronEnvironment.ProgramCompatibility; } }
|
||||
|
||||
// TODO: consider making this configurable later
|
||||
public static IFormatProvider Culture = CultureInfo.CreateSpecificCulture("en-US");
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The file path prefix to the folder containing configuration files
|
||||
/// </summary>
|
||||
|
||||
@@ -203,7 +203,6 @@
|
||||
<Compile Include="Devices\PC\Laptop.cs" />
|
||||
<Compile Include="Devices\ReconfigurableDevice.cs" />
|
||||
<Compile Include="Devices\VolumeDeviceChangeEventArgs.cs" />
|
||||
<Compile Include="DeviceTypeInterfaces\IPasswordPrompt.cs" />
|
||||
<Compile Include="DeviceTypeInterfaces\ITvPresetsProvider.cs" />
|
||||
<Compile Include="DeviceTypeInterfaces\LanguageLabel.cs" />
|
||||
<Compile Include="DeviceTypeInterfaces\ILanguageProvider.cs" />
|
||||
|
||||
@@ -15,7 +15,7 @@ namespace PepperDash.Essentials.Core
|
||||
/// <summary>
|
||||
/// Describes the basic functionality of an EssentialsRoom
|
||||
/// </summary>
|
||||
public interface IEssentialsRoom : IKeyName, IReconfigurableDevice, IRunDefaultPresentRoute
|
||||
public interface IEssentialsRoom : IKeyName, IReconfigurableDevice
|
||||
{
|
||||
BoolFeedback OnFeedback { get; }
|
||||
|
||||
@@ -56,6 +56,7 @@ namespace PepperDash.Essentials.Core
|
||||
void SetRoomOccupancy(IOccupancyStatusProvider statusProvider, int timeoutMinutes);
|
||||
|
||||
void PowerOnToDefaultOrLastSource();
|
||||
bool RunDefaultPresentRoute();
|
||||
|
||||
void SetDefaultLevels();
|
||||
|
||||
|
||||
@@ -1,40 +1,40 @@
|
||||
using Crestron.SimplSharpPro;
|
||||
using System;
|
||||
using System.Linq;
|
||||
//using Crestron.SimplSharpPro.DeviceSupport;
|
||||
using Crestron.SimplSharpPro.DeviceSupport;
|
||||
using Crestron.SimplSharpPro.DM;
|
||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
||||
using Crestron.SimplSharpPro.DM.Endpoints.Transmitters;
|
||||
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core;
|
||||
using PepperDash.Essentials.Core.Bridges;
|
||||
|
||||
namespace PepperDash.Essentials.DM
|
||||
{
|
||||
using eVst = eX02VideoSourceType;
|
||||
using Crestron.SimplSharpPro;
|
||||
using System;
|
||||
using System.Linq;
|
||||
//using Crestron.SimplSharpPro.DeviceSupport;
|
||||
using Crestron.SimplSharpPro.DeviceSupport;
|
||||
using Crestron.SimplSharpPro.DM;
|
||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
||||
using Crestron.SimplSharpPro.DM.Endpoints.Transmitters;
|
||||
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core;
|
||||
using PepperDash.Essentials.Core.Bridges;
|
||||
|
||||
namespace PepperDash.Essentials.DM
|
||||
{
|
||||
using eVst = eX02VideoSourceType;
|
||||
using eAst = eX02AudioSourceType;
|
||||
|
||||
public class DmTx4kz202CController : DmTxControllerBase, ITxRoutingWithFeedback,
|
||||
IIROutputPorts, IComPorts
|
||||
{
|
||||
public DmTx4kz202C Tx { get; private set; }
|
||||
|
||||
public RoutingInputPortWithVideoStatuses HdmiIn1 { get; private set; }
|
||||
public RoutingInputPortWithVideoStatuses HdmiIn2 { get; private set; }
|
||||
public RoutingOutputPort DmOut { get; private set; }
|
||||
public RoutingOutputPort HdmiLoopOut { get; private set; }
|
||||
|
||||
public override StringFeedback ActiveVideoInputFeedback { get; protected set; }
|
||||
public IntFeedback VideoSourceNumericFeedback { get; protected set; }
|
||||
public IntFeedback AudioSourceNumericFeedback { get; protected set; }
|
||||
public IntFeedback HdmiIn1HdcpCapabilityFeedback { get; protected set; }
|
||||
public IntFeedback HdmiIn2HdcpCapabilityFeedback { get; protected set; }
|
||||
public BoolFeedback Hdmi1VideoSyncFeedback { get; protected set; }
|
||||
public BoolFeedback Hdmi2VideoSyncFeedback { get; protected set; }
|
||||
|
||||
//public override IntFeedback HdcpSupportAllFeedback { get; protected set; }
|
||||
public class DmTx4kz202CController : DmTxControllerBase, ITxRoutingWithFeedback,
|
||||
IIROutputPorts, IComPorts
|
||||
{
|
||||
public DmTx4kz202C Tx { get; private set; }
|
||||
|
||||
public RoutingInputPortWithVideoStatuses HdmiIn1 { get; private set; }
|
||||
public RoutingInputPortWithVideoStatuses HdmiIn2 { get; private set; }
|
||||
public RoutingOutputPort DmOut { get; private set; }
|
||||
public RoutingOutputPort HdmiLoopOut { get; private set; }
|
||||
|
||||
public override StringFeedback ActiveVideoInputFeedback { get; protected set; }
|
||||
public IntFeedback VideoSourceNumericFeedback { get; protected set; }
|
||||
public IntFeedback AudioSourceNumericFeedback { get; protected set; }
|
||||
public IntFeedback HdmiIn1HdcpCapabilityFeedback { get; protected set; }
|
||||
public IntFeedback HdmiIn2HdcpCapabilityFeedback { get; protected set; }
|
||||
public BoolFeedback Hdmi1VideoSyncFeedback { get; protected set; }
|
||||
public BoolFeedback Hdmi2VideoSyncFeedback { get; protected set; }
|
||||
|
||||
//public override IntFeedback HdcpSupportAllFeedback { get; protected set; }
|
||||
//public override ushort HdcpSupportCapability { get; protected set; }
|
||||
//IroutingNumericEvent
|
||||
public event EventHandler<RoutingNumericEventArgs> NumericSwitchChange;
|
||||
@@ -47,48 +47,48 @@ namespace PepperDash.Essentials.DM
|
||||
{
|
||||
var newEvent = NumericSwitchChange;
|
||||
if (newEvent != null) newEvent(this, e);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Helps get the "real" inputs, including when in Auto
|
||||
/// </summary>
|
||||
public eX02VideoSourceType ActualActiveVideoInput
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Tx.VideoSourceFeedback != eVst.Auto)
|
||||
return Tx.VideoSourceFeedback;
|
||||
|
||||
if (Tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue)
|
||||
return eVst.Hdmi1;
|
||||
|
||||
return Tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue ? eVst.Hdmi2 : eVst.AllDisabled;
|
||||
}
|
||||
}
|
||||
public RoutingPortCollection<RoutingInputPort> InputPorts
|
||||
{
|
||||
get
|
||||
{
|
||||
return new RoutingPortCollection<RoutingInputPort>
|
||||
{
|
||||
HdmiIn1,
|
||||
HdmiIn2,
|
||||
AnyVideoInput
|
||||
};
|
||||
}
|
||||
}
|
||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts
|
||||
{
|
||||
get
|
||||
{
|
||||
return new RoutingPortCollection<RoutingOutputPort> { DmOut, HdmiLoopOut };
|
||||
}
|
||||
}
|
||||
public DmTx4kz202CController(string key, string name, DmTx4kz202C tx)
|
||||
: base(key, name, tx)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Helps get the "real" inputs, including when in Auto
|
||||
/// </summary>
|
||||
public eX02VideoSourceType ActualActiveVideoInput
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Tx.VideoSourceFeedback != eVst.Auto)
|
||||
return Tx.VideoSourceFeedback;
|
||||
|
||||
if (Tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue)
|
||||
return eVst.Hdmi1;
|
||||
|
||||
return Tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue ? eVst.Hdmi2 : eVst.AllDisabled;
|
||||
}
|
||||
}
|
||||
public RoutingPortCollection<RoutingInputPort> InputPorts
|
||||
{
|
||||
get
|
||||
{
|
||||
return new RoutingPortCollection<RoutingInputPort>
|
||||
{
|
||||
HdmiIn1,
|
||||
HdmiIn2,
|
||||
AnyVideoInput
|
||||
};
|
||||
}
|
||||
}
|
||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts
|
||||
{
|
||||
get
|
||||
{
|
||||
return new RoutingPortCollection<RoutingOutputPort> { DmOut, HdmiLoopOut };
|
||||
}
|
||||
}
|
||||
public DmTx4kz202CController(string key, string name, DmTx4kz202C tx)
|
||||
: base(key, name, tx)
|
||||
{
|
||||
Tx = tx;
|
||||
|
||||
HdmiIn1 = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn1,
|
||||
@@ -104,208 +104,208 @@ namespace PepperDash.Essentials.DM
|
||||
FeedbackMatchObject = eVst.Hdmi2
|
||||
};
|
||||
|
||||
ActiveVideoInputFeedback = new StringFeedback("ActiveVideoInput",
|
||||
() => ActualActiveVideoInput.ToString());
|
||||
|
||||
|
||||
|
||||
Tx.HdmiInputs[1].InputStreamChange += InputStreamChangeEvent;
|
||||
Tx.HdmiInputs[2].InputStreamChange += InputStreamChangeEvent;
|
||||
Tx.BaseEvent += Tx_BaseEvent;
|
||||
Tx.OnlineStatusChange += Tx_OnlineStatusChange;
|
||||
|
||||
VideoSourceNumericFeedback = new IntFeedback(() => (int)Tx.VideoSourceFeedback);
|
||||
|
||||
//Return VideoSourceFeedback here as DM-TX-4KZ-202-C does not support audio breakaway
|
||||
AudioSourceNumericFeedback = new IntFeedback(() => (int)Tx.VideoSourceFeedback);
|
||||
|
||||
HdmiIn1HdcpCapabilityFeedback = new IntFeedback("HdmiIn1HdcpCapability", () => (int)tx.HdmiInputs[1].HdcpCapabilityFeedback);
|
||||
|
||||
HdmiIn2HdcpCapabilityFeedback = new IntFeedback("HdmiIn2HdcpCapability", () => (int)tx.HdmiInputs[2].HdcpCapabilityFeedback);
|
||||
|
||||
HdcpStateFeedback =
|
||||
new IntFeedback(
|
||||
() =>
|
||||
tx.HdmiInputs[1].HdcpCapabilityFeedback > tx.HdmiInputs[2].HdcpCapabilityFeedback
|
||||
? (int)tx.HdmiInputs[1].HdcpCapabilityFeedback
|
||||
: (int)tx.HdmiInputs[2].HdcpCapabilityFeedback);
|
||||
|
||||
HdcpSupportCapability = eHdcpCapabilityType.Hdcp2_2Support;
|
||||
|
||||
Hdmi1VideoSyncFeedback = new BoolFeedback(() => (bool)tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue);
|
||||
|
||||
Hdmi2VideoSyncFeedback = new BoolFeedback(() => (bool)tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue);
|
||||
|
||||
var combinedFuncs = new VideoStatusFuncsWrapper
|
||||
{
|
||||
HdcpActiveFeedbackFunc = () =>
|
||||
(ActualActiveVideoInput == eVst.Hdmi1
|
||||
&& tx.HdmiInputs[1].VideoAttributes.HdcpActiveFeedback.BoolValue)
|
||||
|| (ActualActiveVideoInput == eVst.Hdmi2
|
||||
&& tx.HdmiInputs[2].VideoAttributes.HdcpActiveFeedback.BoolValue),
|
||||
|
||||
HdcpStateFeedbackFunc = () =>
|
||||
{
|
||||
if (ActualActiveVideoInput == eVst.Hdmi1)
|
||||
return tx.HdmiInputs[1].VideoAttributes.HdcpStateFeedback.ToString();
|
||||
if (ActualActiveVideoInput == eVst.Hdmi2)
|
||||
return tx.HdmiInputs[2].VideoAttributes.HdcpStateFeedback.ToString();
|
||||
return "";
|
||||
},
|
||||
|
||||
VideoResolutionFeedbackFunc = () =>
|
||||
{
|
||||
if (ActualActiveVideoInput == eVst.Hdmi1)
|
||||
return tx.HdmiInputs[1].VideoAttributes.GetVideoResolutionString();
|
||||
if (ActualActiveVideoInput == eVst.Hdmi2)
|
||||
return tx.HdmiInputs[2].VideoAttributes.GetVideoResolutionString();
|
||||
return "";
|
||||
},
|
||||
VideoSyncFeedbackFunc = () =>
|
||||
(ActualActiveVideoInput == eVst.Hdmi1
|
||||
&& tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue)
|
||||
|| (ActualActiveVideoInput == eVst.Hdmi2
|
||||
&& tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue)
|
||||
|
||||
};
|
||||
|
||||
AnyVideoInput = new RoutingInputPortWithVideoStatuses(DmPortName.AnyVideoIn,
|
||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.None, 0, this, combinedFuncs);
|
||||
|
||||
DmOut = new RoutingOutputPort(DmPortName.DmOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
||||
eRoutingPortConnectionType.DmCat, null, this);
|
||||
HdmiLoopOut = new RoutingOutputPort(DmPortName.HdmiLoopOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
||||
eRoutingPortConnectionType.Hdmi, null, this);
|
||||
|
||||
|
||||
AddToFeedbackList(ActiveVideoInputFeedback, VideoSourceNumericFeedback, AudioSourceNumericFeedback,
|
||||
AnyVideoInput.VideoStatus.HasVideoStatusFeedback, AnyVideoInput.VideoStatus.HdcpActiveFeedback,
|
||||
AnyVideoInput.VideoStatus.HdcpStateFeedback, AnyVideoInput.VideoStatus.VideoResolutionFeedback,
|
||||
AnyVideoInput.VideoStatus.VideoSyncFeedback, HdmiIn1HdcpCapabilityFeedback, HdmiIn2HdcpCapabilityFeedback,
|
||||
Hdmi1VideoSyncFeedback, Hdmi2VideoSyncFeedback);
|
||||
|
||||
// Set Ports for CEC
|
||||
HdmiIn1.Port = Tx.HdmiInputs[1];
|
||||
HdmiIn2.Port = Tx.HdmiInputs[2];
|
||||
HdmiLoopOut.Port = Tx.HdmiOutput;
|
||||
DmOut.Port = Tx.DmOutput;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public override bool CustomActivate()
|
||||
{
|
||||
// Link up all of these damned events to the various RoutingPorts via a helper handler
|
||||
Tx.HdmiInputs[1].InputStreamChange += (o, a) => FowardInputStreamChange(HdmiIn1, a.EventId);
|
||||
Tx.HdmiInputs[1].VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn1, a.EventId);
|
||||
|
||||
Tx.HdmiInputs[2].InputStreamChange += (o, a) => FowardInputStreamChange(HdmiIn2, a.EventId);
|
||||
Tx.HdmiInputs[2].VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn2, a.EventId);
|
||||
|
||||
// Base does register and sets up comm monitoring.
|
||||
return base.CustomActivate();
|
||||
}
|
||||
|
||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
||||
{
|
||||
var joinMap = GetDmTxJoinMap(joinStart, joinMapKey);
|
||||
|
||||
if (Hdmi1VideoSyncFeedback != null)
|
||||
{
|
||||
Hdmi1VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input1VideoSyncStatus.JoinNumber]);
|
||||
}
|
||||
if (Hdmi2VideoSyncFeedback != null)
|
||||
{
|
||||
Hdmi2VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input2VideoSyncStatus.JoinNumber]);
|
||||
}
|
||||
|
||||
LinkDmTxToApi(this, trilist, joinMap, bridge);
|
||||
}
|
||||
|
||||
public void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type)
|
||||
{
|
||||
Debug.Console(2, this, "Executing Numeric Switch to input {0}.", input);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case eRoutingSignalType.Video:
|
||||
switch (input)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
ExecuteSwitch(eVst.Auto, null, type);
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
ExecuteSwitch(HdmiIn1.Selector, null, type);
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
ExecuteSwitch(HdmiIn2.Selector, null, type);
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
ExecuteSwitch(eVst.AllDisabled, null, type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case eRoutingSignalType.Audio:
|
||||
switch (input)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
ExecuteSwitch(eAst.Auto, null, type);
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
ExecuteSwitch(eAst.Hdmi1, null, type);
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
ExecuteSwitch(eAst.Hdmi2, null, type);
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
ExecuteSwitch(eAst.AllDisabled, null, type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
|
||||
{
|
||||
if ((signalType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
|
||||
Tx.VideoSource = (eVst)inputSelector;
|
||||
if(((signalType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio))
|
||||
Debug.Console(2, this, "Unable to execute audio-only switch for tx {0}", Key);
|
||||
}
|
||||
|
||||
void InputStreamChangeEvent(EndpointInputStream inputStream, EndpointInputStreamEventArgs args)
|
||||
{
|
||||
Debug.Console(2, "{0} event {1} stream {2}", Tx.ToString(), inputStream.ToString(), args.EventId.ToString());
|
||||
|
||||
switch (args.EventId)
|
||||
{
|
||||
case EndpointInputStreamEventIds.HdcpSupportOffFeedbackEventId:
|
||||
case EndpointInputStreamEventIds.HdcpSupportOnFeedbackEventId:
|
||||
case EndpointInputStreamEventIds.HdcpCapabilityFeedbackEventId:
|
||||
if (inputStream == Tx.HdmiInputs[1]) HdmiIn1HdcpCapabilityFeedback.FireUpdate();
|
||||
if (inputStream == Tx.HdmiInputs[2]) HdmiIn2HdcpCapabilityFeedback.FireUpdate();
|
||||
break;
|
||||
case EndpointInputStreamEventIds.SyncDetectedFeedbackEventId:
|
||||
if (inputStream == Tx.HdmiInputs[1]) Hdmi1VideoSyncFeedback.FireUpdate();
|
||||
if (inputStream == Tx.HdmiInputs[2]) Hdmi2VideoSyncFeedback.FireUpdate();
|
||||
break;
|
||||
}
|
||||
ActiveVideoInputFeedback = new StringFeedback("ActiveVideoInput",
|
||||
() => ActualActiveVideoInput.ToString());
|
||||
|
||||
|
||||
|
||||
Tx.HdmiInputs[1].InputStreamChange += InputStreamChangeEvent;
|
||||
Tx.HdmiInputs[2].InputStreamChange += InputStreamChangeEvent;
|
||||
Tx.BaseEvent += Tx_BaseEvent;
|
||||
Tx.OnlineStatusChange += Tx_OnlineStatusChange;
|
||||
|
||||
VideoSourceNumericFeedback = new IntFeedback(() => (int)Tx.VideoSourceFeedback);
|
||||
|
||||
//Return VideoSourceFeedback here as DM-TX-4KZ-202-C does not support audio breakaway
|
||||
AudioSourceNumericFeedback = new IntFeedback(() => (int)Tx.VideoSourceFeedback);
|
||||
|
||||
HdmiIn1HdcpCapabilityFeedback = new IntFeedback("HdmiIn1HdcpCapability", () => (int)tx.HdmiInputs[1].HdcpCapabilityFeedback);
|
||||
|
||||
HdmiIn2HdcpCapabilityFeedback = new IntFeedback("HdmiIn2HdcpCapability", () => (int)tx.HdmiInputs[2].HdcpCapabilityFeedback);
|
||||
|
||||
HdcpStateFeedback =
|
||||
new IntFeedback(
|
||||
() =>
|
||||
tx.HdmiInputs[1].HdcpCapabilityFeedback > tx.HdmiInputs[2].HdcpCapabilityFeedback
|
||||
? (int)tx.HdmiInputs[1].HdcpCapabilityFeedback
|
||||
: (int)tx.HdmiInputs[2].HdcpCapabilityFeedback);
|
||||
|
||||
HdcpSupportCapability = eHdcpCapabilityType.Hdcp2_2Support;
|
||||
|
||||
Hdmi1VideoSyncFeedback = new BoolFeedback(() => (bool)tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue);
|
||||
|
||||
Hdmi2VideoSyncFeedback = new BoolFeedback(() => (bool)tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue);
|
||||
|
||||
var combinedFuncs = new VideoStatusFuncsWrapper
|
||||
{
|
||||
HdcpActiveFeedbackFunc = () =>
|
||||
(ActualActiveVideoInput == eVst.Hdmi1
|
||||
&& tx.HdmiInputs[1].VideoAttributes.HdcpActiveFeedback.BoolValue)
|
||||
|| (ActualActiveVideoInput == eVst.Hdmi2
|
||||
&& tx.HdmiInputs[2].VideoAttributes.HdcpActiveFeedback.BoolValue),
|
||||
|
||||
HdcpStateFeedbackFunc = () =>
|
||||
{
|
||||
if (ActualActiveVideoInput == eVst.Hdmi1)
|
||||
return tx.HdmiInputs[1].VideoAttributes.HdcpStateFeedback.ToString();
|
||||
if (ActualActiveVideoInput == eVst.Hdmi2)
|
||||
return tx.HdmiInputs[2].VideoAttributes.HdcpStateFeedback.ToString();
|
||||
return "";
|
||||
},
|
||||
|
||||
VideoResolutionFeedbackFunc = () =>
|
||||
{
|
||||
if (ActualActiveVideoInput == eVst.Hdmi1)
|
||||
return tx.HdmiInputs[1].VideoAttributes.GetVideoResolutionString();
|
||||
if (ActualActiveVideoInput == eVst.Hdmi2)
|
||||
return tx.HdmiInputs[2].VideoAttributes.GetVideoResolutionString();
|
||||
return "";
|
||||
},
|
||||
VideoSyncFeedbackFunc = () =>
|
||||
(ActualActiveVideoInput == eVst.Hdmi1
|
||||
&& tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue)
|
||||
|| (ActualActiveVideoInput == eVst.Hdmi2
|
||||
&& tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue)
|
||||
|
||||
};
|
||||
|
||||
AnyVideoInput = new RoutingInputPortWithVideoStatuses(DmPortName.AnyVideoIn,
|
||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.None, 0, this, combinedFuncs);
|
||||
|
||||
DmOut = new RoutingOutputPort(DmPortName.DmOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
||||
eRoutingPortConnectionType.DmCat, null, this);
|
||||
HdmiLoopOut = new RoutingOutputPort(DmPortName.HdmiLoopOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
||||
eRoutingPortConnectionType.Hdmi, null, this);
|
||||
|
||||
|
||||
AddToFeedbackList(ActiveVideoInputFeedback, VideoSourceNumericFeedback, AudioSourceNumericFeedback,
|
||||
AnyVideoInput.VideoStatus.HasVideoStatusFeedback, AnyVideoInput.VideoStatus.HdcpActiveFeedback,
|
||||
AnyVideoInput.VideoStatus.HdcpStateFeedback, AnyVideoInput.VideoStatus.VideoResolutionFeedback,
|
||||
AnyVideoInput.VideoStatus.VideoSyncFeedback, HdmiIn1HdcpCapabilityFeedback, HdmiIn2HdcpCapabilityFeedback,
|
||||
Hdmi1VideoSyncFeedback, Hdmi2VideoSyncFeedback);
|
||||
|
||||
// Set Ports for CEC
|
||||
HdmiIn1.Port = Tx.HdmiInputs[1];
|
||||
HdmiIn2.Port = Tx.HdmiInputs[2];
|
||||
HdmiLoopOut.Port = Tx.HdmiOutput;
|
||||
DmOut.Port = Tx.DmOutput;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public override bool CustomActivate()
|
||||
{
|
||||
// Link up all of these damned events to the various RoutingPorts via a helper handler
|
||||
Tx.HdmiInputs[1].InputStreamChange += (o, a) => FowardInputStreamChange(HdmiIn1, a.EventId);
|
||||
Tx.HdmiInputs[1].VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn1, a.EventId);
|
||||
|
||||
Tx.HdmiInputs[2].InputStreamChange += (o, a) => FowardInputStreamChange(HdmiIn2, a.EventId);
|
||||
Tx.HdmiInputs[2].VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn2, a.EventId);
|
||||
|
||||
// Base does register and sets up comm monitoring.
|
||||
return base.CustomActivate();
|
||||
}
|
||||
|
||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
||||
{
|
||||
var joinMap = GetDmTxJoinMap(joinStart, joinMapKey);
|
||||
|
||||
if (Hdmi1VideoSyncFeedback != null)
|
||||
{
|
||||
Hdmi1VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input1VideoSyncStatus.JoinNumber]);
|
||||
}
|
||||
if (Hdmi2VideoSyncFeedback != null)
|
||||
{
|
||||
Hdmi2VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input2VideoSyncStatus.JoinNumber]);
|
||||
}
|
||||
|
||||
LinkDmTxToApi(this, trilist, joinMap, bridge);
|
||||
}
|
||||
|
||||
public void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type)
|
||||
{
|
||||
Debug.Console(2, this, "Executing Numeric Switch to input {0}.", input);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case eRoutingSignalType.Video:
|
||||
switch (input)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
ExecuteSwitch(eVst.Auto, null, type);
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
ExecuteSwitch(HdmiIn1.Selector, null, type);
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
ExecuteSwitch(HdmiIn2.Selector, null, type);
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
ExecuteSwitch(eVst.AllDisabled, null, type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case eRoutingSignalType.Audio:
|
||||
switch (input)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
ExecuteSwitch(eAst.Auto, null, type);
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
ExecuteSwitch(eAst.Hdmi1, null, type);
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
ExecuteSwitch(eAst.Hdmi2, null, type);
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
ExecuteSwitch(eAst.AllDisabled, null, type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
|
||||
{
|
||||
if ((signalType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
|
||||
Tx.VideoSource = (eVst)inputSelector;
|
||||
if(((signalType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio))
|
||||
Debug.Console(2, this, "Unable to execute audio-only switch for tx {0}", Key);
|
||||
}
|
||||
|
||||
void InputStreamChangeEvent(EndpointInputStream inputStream, EndpointInputStreamEventArgs args)
|
||||
{
|
||||
Debug.Console(2, "{0} event {1} stream {2}", Tx.ToString(), inputStream.ToString(), args.EventId.ToString());
|
||||
|
||||
switch (args.EventId)
|
||||
{
|
||||
case EndpointInputStreamEventIds.HdcpSupportOffFeedbackEventId:
|
||||
case EndpointInputStreamEventIds.HdcpSupportOnFeedbackEventId:
|
||||
case EndpointInputStreamEventIds.HdcpCapabilityFeedbackEventId:
|
||||
if (inputStream == Tx.HdmiInputs[1]) HdmiIn1HdcpCapabilityFeedback.FireUpdate();
|
||||
if (inputStream == Tx.HdmiInputs[2]) HdmiIn2HdcpCapabilityFeedback.FireUpdate();
|
||||
break;
|
||||
case EndpointInputStreamEventIds.SyncDetectedFeedbackEventId:
|
||||
if (inputStream == Tx.HdmiInputs[1]) Hdmi1VideoSyncFeedback.FireUpdate();
|
||||
if (inputStream == Tx.HdmiInputs[2]) Hdmi2VideoSyncFeedback.FireUpdate();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Tx_OnlineStatusChange(GenericBase currentDevice, OnlineOfflineEventArgs args)
|
||||
@@ -313,7 +313,7 @@ namespace PepperDash.Essentials.DM
|
||||
var localVideoInputPort =
|
||||
InputPorts.FirstOrDefault(p => (eVst)p.Selector == Tx.VideoSourceFeedback);
|
||||
var localAudioInputPort =
|
||||
InputPorts.FirstOrDefault(p => (eVst)p.Selector == Tx.VideoSourceFeedback);
|
||||
InputPorts.FirstOrDefault(p => (eAst)p.Selector == Tx.AudioSourceFeedback);
|
||||
|
||||
ActiveVideoInputFeedback.FireUpdate();
|
||||
VideoSourceNumericFeedback.FireUpdate();
|
||||
@@ -338,68 +338,68 @@ namespace PepperDash.Essentials.DM
|
||||
OnSwitchChange(new RoutingNumericEventArgs(1, VideoSourceNumericFeedback.UShortValue, OutputPorts.First(), localVideoInputPort, eRoutingSignalType.Video));
|
||||
break;
|
||||
case EndpointTransmitterBase.AudioSourceFeedbackEventId:
|
||||
var localInputAudioPort = InputPorts.FirstOrDefault(p => (eVst)p.Selector == Tx.VideoSourceFeedback);
|
||||
Debug.Console(2, this, " Audio Source: {0}", Tx.VideoSourceFeedback);
|
||||
var localInputAudioPort = InputPorts.FirstOrDefault(p => (eAst)p.Selector == Tx.AudioSourceFeedback);
|
||||
Debug.Console(2, this, " Audio Source: {0}", Tx.AudioSourceFeedback);
|
||||
AudioSourceNumericFeedback.FireUpdate();
|
||||
OnSwitchChange(new RoutingNumericEventArgs(1, AudioSourceNumericFeedback.UShortValue, OutputPorts.First(), localInputAudioPort, eRoutingSignalType.Audio));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Relays the input stream change to the appropriate RoutingInputPort.
|
||||
/// </summary>
|
||||
void FowardInputStreamChange(RoutingInputPortWithVideoStatuses inputPort, int eventId)
|
||||
{
|
||||
if (eventId != EndpointInputStreamEventIds.SyncDetectedFeedbackEventId)
|
||||
{
|
||||
return;
|
||||
}
|
||||
inputPort.VideoStatus.VideoSyncFeedback.FireUpdate();
|
||||
AnyVideoInput.VideoStatus.VideoSyncFeedback.FireUpdate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Relays the VideoAttributes change to a RoutingInputPort
|
||||
/// </summary>
|
||||
void ForwardVideoAttributeChange(RoutingInputPortWithVideoStatuses inputPort, int eventId)
|
||||
{
|
||||
//// LOCATION: Crestron.SimplSharpPro.DM.VideoAttributeEventIds
|
||||
//Debug.Console(2, this, "VideoAttributes_AttributeChange event id={0} from {1}",
|
||||
// args.EventId, (sender as VideoAttributesEnhanced).Owner.GetType());
|
||||
switch (eventId)
|
||||
{
|
||||
case VideoAttributeEventIds.HdcpActiveFeedbackEventId:
|
||||
inputPort.VideoStatus.HdcpActiveFeedback.FireUpdate();
|
||||
AnyVideoInput.VideoStatus.HdcpActiveFeedback.FireUpdate();
|
||||
break;
|
||||
case VideoAttributeEventIds.HdcpStateFeedbackEventId:
|
||||
inputPort.VideoStatus.HdcpStateFeedback.FireUpdate();
|
||||
AnyVideoInput.VideoStatus.HdcpStateFeedback.FireUpdate();
|
||||
break;
|
||||
case VideoAttributeEventIds.HorizontalResolutionFeedbackEventId:
|
||||
case VideoAttributeEventIds.VerticalResolutionFeedbackEventId:
|
||||
inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
||||
AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
||||
break;
|
||||
case VideoAttributeEventIds.FramesPerSecondFeedbackEventId:
|
||||
inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
||||
AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#region IIROutputPorts Members
|
||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return Tx.IROutputPorts; } }
|
||||
public int NumberOfIROutputPorts { get { return Tx.NumberOfIROutputPorts; } }
|
||||
#endregion
|
||||
|
||||
#region IComPorts Members
|
||||
public CrestronCollection<ComPort> ComPorts { get { return Tx.ComPorts; } }
|
||||
public int NumberOfComPorts { get { return Tx.NumberOfComPorts; } }
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Relays the input stream change to the appropriate RoutingInputPort.
|
||||
/// </summary>
|
||||
void FowardInputStreamChange(RoutingInputPortWithVideoStatuses inputPort, int eventId)
|
||||
{
|
||||
if (eventId != EndpointInputStreamEventIds.SyncDetectedFeedbackEventId)
|
||||
{
|
||||
return;
|
||||
}
|
||||
inputPort.VideoStatus.VideoSyncFeedback.FireUpdate();
|
||||
AnyVideoInput.VideoStatus.VideoSyncFeedback.FireUpdate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Relays the VideoAttributes change to a RoutingInputPort
|
||||
/// </summary>
|
||||
void ForwardVideoAttributeChange(RoutingInputPortWithVideoStatuses inputPort, int eventId)
|
||||
{
|
||||
//// LOCATION: Crestron.SimplSharpPro.DM.VideoAttributeEventIds
|
||||
//Debug.Console(2, this, "VideoAttributes_AttributeChange event id={0} from {1}",
|
||||
// args.EventId, (sender as VideoAttributesEnhanced).Owner.GetType());
|
||||
switch (eventId)
|
||||
{
|
||||
case VideoAttributeEventIds.HdcpActiveFeedbackEventId:
|
||||
inputPort.VideoStatus.HdcpActiveFeedback.FireUpdate();
|
||||
AnyVideoInput.VideoStatus.HdcpActiveFeedback.FireUpdate();
|
||||
break;
|
||||
case VideoAttributeEventIds.HdcpStateFeedbackEventId:
|
||||
inputPort.VideoStatus.HdcpStateFeedback.FireUpdate();
|
||||
AnyVideoInput.VideoStatus.HdcpStateFeedback.FireUpdate();
|
||||
break;
|
||||
case VideoAttributeEventIds.HorizontalResolutionFeedbackEventId:
|
||||
case VideoAttributeEventIds.VerticalResolutionFeedbackEventId:
|
||||
inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
||||
AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
||||
break;
|
||||
case VideoAttributeEventIds.FramesPerSecondFeedbackEventId:
|
||||
inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
||||
AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#region IIROutputPorts Members
|
||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return Tx.IROutputPorts; } }
|
||||
public int NumberOfIROutputPorts { get { return Tx.NumberOfIROutputPorts; } }
|
||||
#endregion
|
||||
|
||||
#region IComPorts Members
|
||||
public CrestronCollection<ComPort> ComPorts { get { return Tx.ComPorts; } }
|
||||
public int NumberOfComPorts { get { return Tx.NumberOfComPorts; } }
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -339,7 +339,7 @@ namespace PepperDash.Essentials.DM
|
||||
var localVideoInputPort =
|
||||
InputPorts.FirstOrDefault(p => (eVst)p.Selector == Tx.VideoSourceFeedback);
|
||||
var localAudioInputPort =
|
||||
InputPorts.FirstOrDefault(p => (eVst)p.Selector == Tx.VideoSourceFeedback);
|
||||
InputPorts.FirstOrDefault(p => (eAst)p.Selector == Tx.AudioSourceFeedback);
|
||||
|
||||
ActiveVideoInputFeedback.FireUpdate();
|
||||
VideoSourceNumericFeedback.FireUpdate();
|
||||
@@ -364,8 +364,8 @@ namespace PepperDash.Essentials.DM
|
||||
OnSwitchChange(new RoutingNumericEventArgs(1, VideoSourceNumericFeedback.UShortValue, OutputPorts.First(), localVideoInputPort, eRoutingSignalType.Video));
|
||||
break;
|
||||
case EndpointTransmitterBase.AudioSourceFeedbackEventId:
|
||||
var localInputAudioPort = InputPorts.FirstOrDefault(p => (eVst)p.Selector == Tx.VideoSourceFeedback);
|
||||
Debug.Console(2, this, " Audio Source: {0}", Tx.VideoSourceFeedback);
|
||||
var localInputAudioPort = InputPorts.FirstOrDefault(p => (eAst)p.Selector == Tx.AudioSourceFeedback);
|
||||
Debug.Console(2, this, " Audio Source: {0}", Tx.AudioSourceFeedback);
|
||||
AudioSourceNumericFeedback.FireUpdate();
|
||||
OnSwitchChange(new RoutingNumericEventArgs(1, AudioSourceNumericFeedback.UShortValue, OutputPorts.First(), localInputAudioPort, eRoutingSignalType.Audio));
|
||||
break;
|
||||
|
||||
@@ -11,9 +11,10 @@ namespace PepperDash.Essentials.Devices.Common.AudioCodec
|
||||
/// <summary>
|
||||
/// For rooms that have audio codec
|
||||
/// </summary>
|
||||
public interface IHasAudioCodec:IHasInCallFeedback
|
||||
public interface IHasAudioCodec
|
||||
{
|
||||
AudioCodecBase AudioCodec { get; }
|
||||
BoolFeedback InCallFeedback { get; }
|
||||
|
||||
///// <summary>
|
||||
///// Make this more specific
|
||||
|
||||
@@ -160,19 +160,7 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
/// </summary>
|
||||
public interface IInvitableContact
|
||||
{
|
||||
bool IsInvitableContact { get; }
|
||||
}
|
||||
|
||||
public class InvitableDirectoryContact : DirectoryContact, IInvitableContact
|
||||
{
|
||||
[JsonProperty("isInvitableContact")]
|
||||
public bool IsInvitableContact
|
||||
{
|
||||
get
|
||||
{
|
||||
return this is IInvitableContact;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -221,6 +209,8 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
[JsonProperty("title")]
|
||||
public string Title { get; set; }
|
||||
|
||||
|
||||
|
||||
[JsonProperty("contactMethods")]
|
||||
public List<ContactMethod> ContactMethods { get; set; }
|
||||
|
||||
|
||||
@@ -120,11 +120,9 @@
|
||||
<Compile Include="VideoCodec\CiscoCodec\RoomPresets.cs" />
|
||||
<Compile Include="Cameras\CameraControl.cs" />
|
||||
<Compile Include="Display\PanasonicThDisplay.cs" />
|
||||
<Compile Include="VideoCodec\Interfaces\IHasMeetingInfo.cs" />
|
||||
<Compile Include="VideoCodec\Interfaces\IHasParticipants.cs" />
|
||||
<Compile Include="VideoCodec\Interfaces\IHasSelfviewPosition.cs" />
|
||||
<Compile Include="VideoCodec\Interfaces\IHasSelfviewSize.cs" />
|
||||
<Compile Include="VideoCodec\Interfaces\IHasStartMeeting.cs" />
|
||||
<Compile Include="VideoCodec\Interfaces\iVideoCodecInfo.cs" />
|
||||
<Compile Include="Codec\iHasCallFavorites.cs" />
|
||||
<Compile Include="Codec\iHasCallHistory.cs" />
|
||||
|
||||
@@ -743,10 +743,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Appends the delimiter and send the command to the codec
|
||||
/// </summary>
|
||||
/// <param name="command"></param>
|
||||
public void SendText(string command)
|
||||
{
|
||||
if (CommDebuggingIsOn)
|
||||
|
||||
@@ -327,7 +327,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
||||
public SpeakerTrack()
|
||||
{
|
||||
Status = new Status2();
|
||||
Availability = new Availability();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
||||
{
|
||||
/// <summary>
|
||||
/// Describes a device that provides meeting information (like a ZoomRoom)
|
||||
/// </summary>
|
||||
public interface IHasMeetingInfo
|
||||
{
|
||||
event EventHandler<MeetingInfoEventArgs> MeetingInfoChanged;
|
||||
|
||||
MeetingInfo MeetingInfo { get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Represents the information about a meeting in progress
|
||||
/// Currently used for Zoom meetings
|
||||
/// </summary>
|
||||
public class MeetingInfo
|
||||
{
|
||||
[JsonProperty("id")]
|
||||
public string Id { get; private set; }
|
||||
[JsonProperty("name")]
|
||||
public string Name { get; private set; }
|
||||
[JsonProperty("host")]
|
||||
public string Host { get; private set; }
|
||||
[JsonProperty("password")]
|
||||
public string Password { get; private set; }
|
||||
[JsonProperty("shareStatus")]
|
||||
public string ShareStatus { get; private set; }
|
||||
[JsonProperty("isHost")]
|
||||
public Boolean IsHost { get; private set; }
|
||||
|
||||
public MeetingInfo(string id, string name, string host, string password, string shareStatus, bool isHost)
|
||||
{
|
||||
Id = id;
|
||||
Name = name;
|
||||
Host = host;
|
||||
Password = password;
|
||||
ShareStatus = shareStatus;
|
||||
IsHost = isHost;
|
||||
}
|
||||
}
|
||||
|
||||
public class MeetingInfoEventArgs : EventArgs
|
||||
{
|
||||
public MeetingInfo Info { get; private set; }
|
||||
|
||||
public MeetingInfoEventArgs(MeetingInfo info)
|
||||
{
|
||||
Info = info;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core;
|
||||
@@ -61,14 +60,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
||||
}
|
||||
}
|
||||
|
||||
public Participant Host
|
||||
{
|
||||
get
|
||||
{
|
||||
return _currentParticipants.FirstOrDefault(p => p.IsHost);
|
||||
}
|
||||
}
|
||||
|
||||
public event EventHandler<EventArgs> ParticipantsListHasChanged;
|
||||
|
||||
public CodecParticipants()
|
||||
@@ -93,7 +84,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
||||
{
|
||||
public int UserId { get; set; }
|
||||
public bool IsHost { get; set; }
|
||||
public bool IsMyself { get; set; }
|
||||
public string Name { get; set; }
|
||||
public bool CanMuteVideo { get; set; }
|
||||
public bool CanUnmuteVideo { get; set; }
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
|
||||
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
||||
{
|
||||
/// <summary>
|
||||
/// Describes the ability to start an ad-hoc meeting
|
||||
/// </summary>
|
||||
public interface IHasStartMeeting
|
||||
{
|
||||
/// <summary>
|
||||
/// The default meeting duration in minutes
|
||||
/// </summary>
|
||||
uint DefaultMeetingDurationMin { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Start an ad-hoc meeting for the specified duration
|
||||
/// </summary>
|
||||
/// <param name="duration"></param>
|
||||
void StartMeeting(uint duration);
|
||||
|
||||
/// <summary>
|
||||
/// Leaves a meeting without ending it
|
||||
/// </summary>
|
||||
void LeaveMeeting();
|
||||
}
|
||||
}
|
||||
@@ -11,9 +11,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
/// <summary>
|
||||
/// For rooms that have video codec
|
||||
/// </summary>
|
||||
public interface IHasVideoCodec:IHasInCallFeedback,IPrivacy
|
||||
public interface IHasVideoCodec
|
||||
{
|
||||
VideoCodecBase VideoCodec { get; }
|
||||
BoolFeedback InCallFeedback { get; }
|
||||
|
||||
///// <summary>
|
||||
///// Make this more specific
|
||||
@@ -25,6 +26,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
/// </summary>
|
||||
IntFeedback CallTypeFeedback { get; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
BoolFeedback PrivacyModeIsOnFeedback { get; }
|
||||
|
||||
/// <summary>
|
||||
/// When something in the room is sharing with the far end or through other means
|
||||
/// </summary>
|
||||
|
||||
@@ -78,8 +78,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
|
||||
SetupCameras();
|
||||
|
||||
CreateOsdSource();
|
||||
|
||||
SetIsReady();
|
||||
}
|
||||
|
||||
@@ -119,19 +117,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
}
|
||||
bool _StandbyIsOn;
|
||||
|
||||
/// <summary>
|
||||
/// Creates the fake OSD source, and connects it's AudioVideo output to the CodecOsdIn input
|
||||
/// to enable routing
|
||||
/// </summary>
|
||||
private void CreateOsdSource()
|
||||
{
|
||||
OsdSource = new DummyRoutingInputsDevice(Key + "[osd]");
|
||||
DeviceManager.AddDevice(OsdSource);
|
||||
var tl = new TieLine(OsdSource.AudioVideoOutputPort, CodecOsdIn);
|
||||
TieLineCollection.Default.Add(tl);
|
||||
|
||||
//foreach(var input in Status.Video.
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dials, yo!
|
||||
@@ -582,10 +567,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
|
||||
void SetupCameras()
|
||||
{
|
||||
SupportsCameraAutoMode = true;
|
||||
|
||||
SupportsCameraOff = false;
|
||||
|
||||
Cameras = new List<CameraBase>();
|
||||
|
||||
var internalCamera = new MockVCCamera(Key + "-camera1", "Near End", this);
|
||||
|
||||
@@ -836,10 +836,10 @@ ScreenIndexIsPinnedTo: {8} (a{17})
|
||||
//serials
|
||||
tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, meeting.Organizer);
|
||||
tokenArray[stringIndex + 1] = new XSigSerialToken(stringIndex + 2, meeting.Title);
|
||||
tokenArray[stringIndex + 2] = new XSigSerialToken(stringIndex + 3, meeting.StartTime.ToString("t", Global.Culture));
|
||||
tokenArray[stringIndex + 3] = new XSigSerialToken(stringIndex + 4, meeting.StartTime.ToString("t", Global.Culture));
|
||||
tokenArray[stringIndex + 4] = new XSigSerialToken(stringIndex + 5, meeting.EndTime.ToString("t", Global.Culture));
|
||||
tokenArray[stringIndex + 5] = new XSigSerialToken(stringIndex + 6, meeting.EndTime.ToString("t", Global.Culture));
|
||||
tokenArray[stringIndex + 2] = new XSigSerialToken(stringIndex + 3, meeting.StartTime.ToShortDateString());
|
||||
tokenArray[stringIndex + 3] = new XSigSerialToken(stringIndex + 4, meeting.StartTime.ToShortTimeString());
|
||||
tokenArray[stringIndex + 4] = new XSigSerialToken(stringIndex + 5, meeting.EndTime.ToShortDateString());
|
||||
tokenArray[stringIndex + 5] = new XSigSerialToken(stringIndex + 6, meeting.EndTime.ToShortTimeString());
|
||||
tokenArray[stringIndex + 6] = new XSigSerialToken(stringIndex + 7, meeting.Id);
|
||||
|
||||
|
||||
|
||||
@@ -236,6 +236,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Used to be able to inplement IInvitableContact on DirectoryContact
|
||||
/// </summary>
|
||||
public class ZoomDirectoryContact : DirectoryContact, IInvitableContact
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class Phonebook
|
||||
{
|
||||
[JsonProperty("Contacts")]
|
||||
@@ -294,7 +302,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
|
||||
foreach (Contact c in zoomContacts)
|
||||
{
|
||||
var contact = new InvitableDirectoryContact { Name = c.ScreenName, ContactId = c.Jid };
|
||||
var contact = new ZoomDirectoryContact { Name = c.ScreenName, ContactId = c.Jid };
|
||||
|
||||
contact.ContactMethods.Add(new ContactMethod() { Number = c.Jid, Device = eContactMethodDevice.Video, CallType = eContactMethodCallType.Video, ContactMethodId = c.Jid });
|
||||
|
||||
@@ -431,10 +439,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
{
|
||||
private string _dispState;
|
||||
private string _password;
|
||||
private bool _isAirHostClientConnected;
|
||||
private bool _isSharingBlackMagic;
|
||||
private bool _isDirectPresentationConnected;
|
||||
|
||||
|
||||
public string directPresentationPairingCode { get; set; }
|
||||
/// <summary>
|
||||
@@ -456,51 +460,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool isAirHostClientConnected
|
||||
{
|
||||
get { return _isAirHostClientConnected; }
|
||||
set
|
||||
{
|
||||
if (value != _isAirHostClientConnected)
|
||||
{
|
||||
_isAirHostClientConnected = value;
|
||||
NotifyPropertyChanged("isAirHostClientConnected");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool isAirHostClientConnected { get; set; }
|
||||
public bool isBlackMagicConnected { get; set; }
|
||||
public bool isBlackMagicDataAvailable { get; set; }
|
||||
|
||||
public bool isDirectPresentationConnected
|
||||
{
|
||||
get { return _isDirectPresentationConnected; }
|
||||
set
|
||||
{
|
||||
if (value != _isDirectPresentationConnected)
|
||||
{
|
||||
_isDirectPresentationConnected = value;
|
||||
NotifyPropertyChanged("isDirectPresentationConnected");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool isSharingBlackMagic
|
||||
{
|
||||
get { return _isSharingBlackMagic; }
|
||||
set
|
||||
{
|
||||
if (value != _isSharingBlackMagic)
|
||||
{
|
||||
_isSharingBlackMagic = value;
|
||||
NotifyPropertyChanged("isSharingBlackMagic");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public bool isDirectPresentationConnected { get; set; }
|
||||
public bool isSharingBlackMagic { get; set; }
|
||||
/// <summary>
|
||||
/// IOS Airplay code
|
||||
/// </summary>
|
||||
@@ -823,7 +787,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
private bool _paused;
|
||||
private eSharingState _state;
|
||||
|
||||
public bool IsSharing { get; private set; }
|
||||
public bool IsSharing;
|
||||
|
||||
[JsonProperty("paused")]
|
||||
public bool Paused
|
||||
@@ -963,15 +927,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
PhoneCallStatus_InCall,
|
||||
PhoneCallStatus_Init,
|
||||
}
|
||||
|
||||
public class MeetingNeedsPassword
|
||||
{
|
||||
[JsonProperty("needsPassword")]
|
||||
public bool NeedsPassword { get; set; }
|
||||
|
||||
[JsonProperty("wrongAndRetry")]
|
||||
public bool WrongAndRetry { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -1489,7 +1444,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
UserId = p.UserId,
|
||||
Name = p.UserName,
|
||||
IsHost = p.IsHost,
|
||||
IsMyself = p.IsMyself,
|
||||
CanMuteVideo = p.IsVideoCanMuteByHost,
|
||||
CanUnmuteVideo = p.IsVideoCanUnmuteByHost,
|
||||
AudioMuteFb = p.AudioStatusState == "AUDIO_MUTED",
|
||||
|
||||
@@ -25,11 +25,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
IRouting,
|
||||
IHasScheduleAwareness, IHasCodecCameras, IHasParticipants, IHasCameraOff, IHasCameraMute, IHasCameraAutoMode,
|
||||
IHasFarEndContentStatus, IHasSelfviewPosition, IHasPhoneDialing, IHasZoomRoomLayouts, IHasParticipantPinUnpin,
|
||||
IHasParticipantAudioMute, IHasSelfviewSize, IPasswordPrompt, IHasStartMeeting, IHasMeetingInfo
|
||||
IHasParticipantAudioMute, IHasSelfviewSize
|
||||
{
|
||||
private const long MeetingRefreshTimer = 60000;
|
||||
public uint DefaultMeetingDurationMin { get; private set; }
|
||||
|
||||
private const uint DefaultMeetingDurationMin = 30;
|
||||
private const string Delimiter = "\x0D\x0A";
|
||||
|
||||
private readonly GenericQueue _receiveQueue;
|
||||
@@ -46,15 +45,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
private StringBuilder _jsonMessage;
|
||||
private int _previousVolumeLevel;
|
||||
private CameraBase _selectedCamera;
|
||||
private string _lastDialedMeetingNumber;
|
||||
|
||||
private readonly ZoomRoomPropertiesConfig _props;
|
||||
|
||||
public ZoomRoom(DeviceConfig config, IBasicCommunication comm)
|
||||
: base(config)
|
||||
{
|
||||
DefaultMeetingDurationMin = 30;
|
||||
|
||||
_props = JsonConvert.DeserializeObject<ZoomRoomPropertiesConfig>(config.Properties.ToString());
|
||||
|
||||
_receiveQueue = new GenericQueue(Key + "-rxQueue", Thread.eThreadPriority.MediumPriority, 512);
|
||||
@@ -470,10 +466,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
{
|
||||
SharingContentIsOnFeedback.FireUpdate();
|
||||
ReceivingContent.FireUpdate();
|
||||
|
||||
// Update the share status of the meeting info
|
||||
var meetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, Participants.Host.Name, MeetingInfo.Password, GetSharingStatus(), GetIsHostMyself());
|
||||
MeetingInfo = meetingInfo;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -622,15 +614,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
break;
|
||||
case "password":
|
||||
break;
|
||||
case "isAirHostClientConnected":
|
||||
case "isDirectPresentationConnected":
|
||||
case "isSharingBlackMagic":
|
||||
{
|
||||
// Update the share status of the meeting info
|
||||
var meetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, MeetingInfo.Host, MeetingInfo.Password, GetSharingStatus(), GetIsHostMyself());
|
||||
MeetingInfo = meetingInfo;
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -747,7 +730,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
ConsoleAccessLevelEnum.AccessOperator);
|
||||
if (!_props.DisablePhonebookAutoDownload)
|
||||
{
|
||||
CrestronConsole.AddNewConsoleCommand(s => SendText("zCommand Phonebook List Offset: 0 Limit: 10000"),
|
||||
CrestronConsole.AddNewConsoleCommand(s => SendText("zCommand Phonebook List Offset: 0 Limit: 512"),
|
||||
"GetZoomRoomContacts", "Triggers a refresh of the codec phonebook",
|
||||
ConsoleAccessLevelEnum.AccessOperator);
|
||||
}
|
||||
@@ -877,7 +860,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
|
||||
if (!_props.DisablePhonebookAutoDownload)
|
||||
{
|
||||
_syncState.AddQueryToQueue("zCommand Phonebook List Offset: 0 Limit: 10000");
|
||||
_syncState.AddQueryToQueue("zCommand Phonebook List Offset: 0 Limit: 512");
|
||||
}
|
||||
|
||||
_syncState.AddQueryToQueue("zCommand Bookings List");
|
||||
@@ -979,14 +962,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
{
|
||||
_syncState.LoginMessageReceived();
|
||||
|
||||
|
||||
// Fire up a thread to send the intial commands.
|
||||
CrestronInvoke.BeginInvoke(o =>
|
||||
{
|
||||
// Currently the feedback exclusions don't work when using the API in JSON response mode
|
||||
// But leave these here in case the API gets updated in the future
|
||||
|
||||
|
||||
Thread.Sleep(100);
|
||||
// disable echo of commands
|
||||
SendText("echo off");
|
||||
@@ -1206,11 +1184,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
Status.Call.Participants);
|
||||
|
||||
Participants.CurrentParticipants = participants;
|
||||
|
||||
// Update the share status of the meeting info
|
||||
var meetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, Participants.Host.Name, MeetingInfo.Password, MeetingInfo.ShareStatus, GetIsHostMyself());
|
||||
MeetingInfo = meetingInfo;
|
||||
|
||||
PrintCurrentCallParticipants();
|
||||
|
||||
break;
|
||||
@@ -1385,20 +1358,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
}
|
||||
case "meetingneedspassword":
|
||||
{
|
||||
var meetingNeedsPassword =
|
||||
responseObj.ToObject<zEvent.MeetingNeedsPassword>();
|
||||
|
||||
if (meetingNeedsPassword.NeedsPassword)
|
||||
{
|
||||
var prompt = "Password required to join this meeting. Please enter the meeting password.";
|
||||
|
||||
OnPasswordRequired(meetingNeedsPassword.WrongAndRetry, false, false, prompt);
|
||||
}
|
||||
else
|
||||
{
|
||||
OnPasswordRequired(false, false, true, "");
|
||||
}
|
||||
|
||||
// TODO: notify user to enter a password
|
||||
break;
|
||||
}
|
||||
case "needwaitforhost":
|
||||
@@ -1674,7 +1634,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
// If not crrently in a meeting, intialize the call object
|
||||
if (callStatus != zStatus.eCallStatus.IN_MEETING && callStatus != zStatus.eCallStatus.CONNECTING_MEETING)
|
||||
{
|
||||
//Debug.Console(1, this, "[UpdateCallStatus] Creating new Status.Call object");
|
||||
Debug.Console(1, this, "[UpdateCallStatus] Creating new Status.Call object");
|
||||
Status.Call = new zStatus.Call {Status = callStatus};
|
||||
|
||||
OnCallStatusChange(new CodecActiveCallItem() {Status = eCodecCallStatus.Disconnected});
|
||||
@@ -1712,15 +1672,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
|
||||
ActiveCalls.Add(newCall);
|
||||
|
||||
//Debug.Console(1, this, "[UpdateCallStatus] IF w/ meeting_id AcitveCalls.Count == {1} - Current Call Status: {0}",
|
||||
//Status.Call != null ? Status.Call.Status.ToString() : "no call", ActiveCalls.Count);
|
||||
Debug.Console(1, this, "[UpdateCallStatus] IF w/ meeting_id AcitveCalls.Count == {1} - Current Call Status: {0}",
|
||||
Status.Call != null ? Status.Call.Status.ToString() : "no call", ActiveCalls.Count);
|
||||
|
||||
OnCallStatusChange(newCall);
|
||||
}
|
||||
else
|
||||
{
|
||||
//Debug.Console(1, this, "[UpdateCallStatus] IF w/o meeting_id AcitveCalls.Count == {1} - Current Call Status: {0}",
|
||||
//Status.Call != null ? Status.Call.Status.ToString() : "no call", ActiveCalls.Count);
|
||||
Debug.Console(1, this, "[UpdateCallStatus] IF w/o meeting_id AcitveCalls.Count == {1} - Current Call Status: {0}",
|
||||
Status.Call != null ? Status.Call.Status.ToString() : "no call", ActiveCalls.Count);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1780,24 +1740,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
{
|
||||
base.OnCallStatusChange(item);
|
||||
|
||||
if (item.Status == eCodecCallStatus.Connected)
|
||||
{
|
||||
|
||||
var host = "";
|
||||
|
||||
if (Participants.Host != null)
|
||||
host = Participants.Host.Name;
|
||||
|
||||
MeetingInfo = new MeetingInfo(
|
||||
Status.Call.Info.meeting_id,
|
||||
Status.Call.Info.meeting_list_item.meetingName,
|
||||
host,
|
||||
Status.Call.Info.meeting_password,
|
||||
GetSharingStatus(),
|
||||
GetIsHostMyself()
|
||||
);
|
||||
}
|
||||
|
||||
Debug.Console(1, this, "[OnCallStatusChange] Current Call Status: {0}",
|
||||
Status.Call != null ? Status.Call.Status.ToString() : "no call");
|
||||
|
||||
@@ -1807,47 +1749,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
}
|
||||
}
|
||||
|
||||
private string GetSharingStatus()
|
||||
{
|
||||
string sharingState = "None";
|
||||
|
||||
if (Status.Call.Sharing.State == zEvent.eSharingState.Receiving)
|
||||
{
|
||||
sharingState = "Receiving Content";
|
||||
}
|
||||
if (Status.Sharing.isAirHostClientConnected)
|
||||
{
|
||||
sharingState = "Sharing AirPlay";
|
||||
}
|
||||
if (Status.Sharing.isDirectPresentationConnected)
|
||||
{
|
||||
sharingState = "Sharing Laptop";
|
||||
}
|
||||
if (Status.Sharing.isSharingBlackMagic)
|
||||
{
|
||||
sharingState = "Sharing HDMI Source";
|
||||
}
|
||||
|
||||
return sharingState;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Will return true if the host is myself (this zoom room)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private bool GetIsHostMyself()
|
||||
{
|
||||
var host = Participants.Host;
|
||||
|
||||
if(host == null)
|
||||
{
|
||||
Debug.Console(2, this, "Host is currently null");
|
||||
return false;
|
||||
}
|
||||
Debug.Console(2, this, "Host is: '{0}' IsMyself?: {1}", host.Name, host.IsMyself);
|
||||
return host.IsMyself;
|
||||
}
|
||||
|
||||
public override void StartSharing()
|
||||
{
|
||||
SendText("zCommand Call Sharing HDMI Start");
|
||||
@@ -2149,21 +2050,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
|
||||
public override void Dial(string number)
|
||||
{
|
||||
_lastDialedMeetingNumber = number;
|
||||
SendText(string.Format("zCommand Dial Join meetingNumber: {0}", number));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dials a meeting with a password
|
||||
/// </summary>
|
||||
/// <param name="number"></param>
|
||||
/// <param name="password"></param>
|
||||
public void Dial(string number, string password)
|
||||
{
|
||||
Debug.Console(2, this, "Dialing meeting number: {0} with password: {1}", number, password);
|
||||
SendText(string.Format("zCommand Dial Join meetingNumber: {0} password: {1}", number, password));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Invites a contact to either a new meeting (if not already in a meeting) or the current meeting.
|
||||
/// Currently only invites a single user
|
||||
@@ -2171,7 +2060,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
/// <param name="contact"></param>
|
||||
public override void Dial(IInvitableContact contact)
|
||||
{
|
||||
var ic = contact as InvitableDirectoryContact;
|
||||
var ic = contact as zStatus.ZoomDirectoryContact;
|
||||
|
||||
if (ic != null)
|
||||
{
|
||||
@@ -2189,26 +2078,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Starts a PMI Meeting for the specified duration (or default meeting duration if 0 is specified)
|
||||
/// </summary>
|
||||
/// <param name="duration">duration of meeting</param>
|
||||
public void StartMeeting(uint duration)
|
||||
{
|
||||
uint dur = DefaultMeetingDurationMin;
|
||||
|
||||
if (duration > 0)
|
||||
dur = duration;
|
||||
|
||||
SendText(string.Format("zCommand Dial StartPmi Duration: {0}", dur));
|
||||
}
|
||||
|
||||
public void LeaveMeeting()
|
||||
{
|
||||
SendText("zCommand Call Leave");
|
||||
}
|
||||
|
||||
public override void EndCall(CodecActiveCallItem call)
|
||||
{
|
||||
SendText("zCommand Call Disconnect");
|
||||
@@ -2812,54 +2681,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IPasswordPrompt Members
|
||||
|
||||
public event EventHandler<PasswordPromptEventArgs> PasswordRequired;
|
||||
|
||||
public void SubmitPassword(string password)
|
||||
{
|
||||
Debug.Console(2, this, "Password Submitted: {0}", password);
|
||||
Dial(_lastDialedMeetingNumber, password);
|
||||
}
|
||||
|
||||
void OnPasswordRequired(bool lastAttemptIncorrect, bool loginFailed, bool loginCancelled, string message)
|
||||
{
|
||||
var handler = PasswordRequired;
|
||||
if (handler != null)
|
||||
{
|
||||
handler(this, new PasswordPromptEventArgs(lastAttemptIncorrect, loginFailed, loginCancelled, message));
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IHasMeetingInfo Members
|
||||
|
||||
public event EventHandler<MeetingInfoEventArgs> MeetingInfoChanged;
|
||||
|
||||
private MeetingInfo _meetingInfo;
|
||||
|
||||
public MeetingInfo MeetingInfo
|
||||
{
|
||||
get { return _meetingInfo; }
|
||||
private set
|
||||
{
|
||||
if (value != _meetingInfo)
|
||||
{
|
||||
_meetingInfo = value;
|
||||
|
||||
var handler = MeetingInfoChanged;
|
||||
if (handler != null)
|
||||
{
|
||||
handler(this, new MeetingInfoEventArgs(_meetingInfo));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Zoom Room specific info object
|
||||
|
||||
Reference in New Issue
Block a user