fix(essentials): adds cancel method for password prompt and adds wireless share instructions

This commit is contained in:
Neil Dorin
2022-09-22 13:05:09 -06:00
parent ee735388bb
commit bda46eb1b9
5 changed files with 236 additions and 20 deletions

View File

@@ -21,6 +21,11 @@ namespace PepperDash.Essentials.Core
/// </summary> /// </summary>
/// <param name="password"></param> /// <param name="password"></param>
void SubmitPassword(string password); void SubmitPassword(string password);
/// <summary>
/// Cancels the password submission
/// </summary>
void CancelPasswordPrompt();
} }
public class PasswordPromptEventArgs : EventArgs public class PasswordPromptEventArgs : EventArgs

View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom;
namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{
public class ShareInfoEventArgs : EventArgs
{
public zStatus.Sharing SharingStatus { get; private set; }
public ShareInfoEventArgs(zStatus.Sharing status)
{
SharingStatus = status;
}
}
public interface IZoomWirelessShareInstructions
{
event EventHandler<ShareInfoEventArgs> ShareInfoChanged;
zStatus.Sharing SharingState { get; }
}
}

View File

@@ -434,9 +434,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
public bool supports_Web_Settings_Push { get; set; } public bool supports_Web_Settings_Push { get; set; }
} }
public enum eDisplayState
{
None,
Laptop,
IOS,
}
public class Sharing : NotifiableObject public class Sharing : NotifiableObject
{ {
private string _dispState; private eDisplayState _dispState;
private string _password; private string _password;
private bool _isAirHostClientConnected; private bool _isAirHostClientConnected;
private bool _isSharingBlackMagic; private bool _isSharingBlackMagic;
@@ -448,7 +455,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
/// Laptop client sharing key /// Laptop client sharing key
/// </summary> /// </summary>
public string directPresentationSharingKey { get; set; } public string directPresentationSharingKey { get; set; }
public string dispState public eDisplayState dispState
{ {
get get
{ {
@@ -506,8 +513,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
} }
} }
/// <summary> /// <summary>
/// IOS Airplay code /// IOS Airplay code
/// </summary> /// </summary>

View File

@@ -27,7 +27,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
IHasScheduleAwareness, IHasCodecCameras, IHasParticipants, IHasCameraOff, IHasCameraMuteWithUnmuteReqeust, IHasCameraAutoMode, IHasScheduleAwareness, IHasCodecCameras, IHasParticipants, IHasCameraOff, IHasCameraMuteWithUnmuteReqeust, IHasCameraAutoMode,
IHasFarEndContentStatus, IHasSelfviewPosition, IHasPhoneDialing, IHasZoomRoomLayouts, IHasParticipantPinUnpin, IHasFarEndContentStatus, IHasSelfviewPosition, IHasPhoneDialing, IHasZoomRoomLayouts, IHasParticipantPinUnpin,
IHasParticipantAudioMute, IHasSelfviewSize, IPasswordPrompt, IHasStartMeeting, IHasMeetingInfo, IHasPresentationOnlyMeeting, IHasParticipantAudioMute, IHasSelfviewSize, IPasswordPrompt, IHasStartMeeting, IHasMeetingInfo, IHasPresentationOnlyMeeting,
IHasMeetingLock, IHasMeetingRecordingWithPrompt IHasMeetingLock, IHasMeetingRecordingWithPrompt, IZoomWirelessShareInstructions
{ {
public event EventHandler VideoUnmuteRequested; public event EventHandler VideoUnmuteRequested;
@@ -47,12 +47,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
private const string JsonDelimiter = "\x0D\x0A\x7D\x0D\x0A"; private const string JsonDelimiter = "\x0D\x0A\x7D\x0D\x0A";
private string[] Delimiters = new string[] { EchoDelimiter, JsonDelimiter, "OK\x0D\x0A", "end\x0D\x0A" }; private string[] Delimiters = new string[] { EchoDelimiter, JsonDelimiter, "OK\x0D\x0A", "end\x0D\x0A" };
//"echo off\x0D\x0A\x0A\x0D\x0A"
private readonly GenericQueue _receiveQueue; private readonly GenericQueue _receiveQueue;
//private readonly CrestronQueue<string> _receiveQueue;
//private readonly Thread _receiveThread;
private readonly ZoomRoomSyncState _syncState; private readonly ZoomRoomSyncState _syncState;
public bool CommDebuggingIsOn; public bool CommDebuggingIsOn;
@@ -64,6 +59,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
private CameraBase _selectedCamera; private CameraBase _selectedCamera;
private string _lastDialedMeetingNumber; private string _lastDialedMeetingNumber;
private readonly ZoomRoomPropertiesConfig _props; private readonly ZoomRoomPropertiesConfig _props;
public ZoomRoom(DeviceConfig config, IBasicCommunication comm) public ZoomRoom(DeviceConfig config, IBasicCommunication comm)
@@ -754,6 +750,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
Status.Sharing.PropertyChanged += (o, a) => Status.Sharing.PropertyChanged += (o, a) =>
{ {
OnShareInfoChanged(Status.Sharing);
SharingSourceFeedback.FireUpdate(); SharingSourceFeedback.FireUpdate();
switch (a.PropertyName) switch (a.PropertyName)
{ {
@@ -2523,8 +2520,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
}; };
trilist.SetSigFalseAction(joinMap.CancelPasswordPrompt.JoinNumber, () => CancelPasswordPrompt());
PasswordRequired += (devices, args) => PasswordRequired += (devices, args) =>
{ {
Debug.Console(0, this, "***********************************PaswordRequired. Message: {0} Cancelled: {1} Last Incorrect: {2} Failed: {3}", args.Message, args.LoginAttemptCancelled, args.LastAttemptWasIncorrect, args.LoginAttemptFailed);
if (args.LoginAttemptCancelled) if (args.LoginAttemptCancelled)
{ {
trilist.SetBool(joinMap.ShowPasswordPrompt.JoinNumber, false); trilist.SetBool(joinMap.ShowPasswordPrompt.JoinNumber, false);
@@ -2559,6 +2560,29 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
pinCodec.NumberOfScreensFeedback.FireUpdate(); pinCodec.NumberOfScreensFeedback.FireUpdate();
layoutSizeCodec.SelfviewPipSizeFeedback.FireUpdate(); layoutSizeCodec.SelfviewPipSizeFeedback.FireUpdate();
}; };
var wirelessInfoCodec = this as IZoomWirelessShareInstructions;
if (wirelessInfoCodec != null)
{
SetSharingStateJoins(Status.Sharing, trilist, joinMap);
wirelessInfoCodec.ShareInfoChanged += (o, a) =>
{
SetSharingStateJoins(a.SharingStatus, trilist, joinMap);
};
}
}
void SetSharingStateJoins(zStatus.Sharing state, BasicTriList trilist, ZoomRoomJoinMap joinMap)
{
trilist.SetBool(joinMap.IsSharingAirplay.JoinNumber, state.isAirHostClientConnected);
trilist.SetBool(joinMap.IsSharingHdmi.JoinNumber, state.isBlackMagicConnected || state.isDirectPresentationConnected);
trilist.SetString(joinMap.DisplayState.JoinNumber, state.dispState.ToString());
trilist.SetString(joinMap.AirplayShareCode.JoinNumber, state.password);
trilist.SetString(joinMap.LaptopShareKey.JoinNumber, state.directPresentationSharingKey);
trilist.SetString(joinMap.WifiName.JoinNumber, state.wifiName);
trilist.SetString(joinMap.ServerName.JoinNumber, state.serverName);
} }
public override void ExecuteSwitch(object selector) public override void ExecuteSwitch(object selector)
@@ -3388,6 +3412,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
//OnPasswordRequired(false, false, true, ""); //OnPasswordRequired(false, false, true, "");
} }
public void CancelPasswordPrompt()
{
OnPasswordRequired(false, false, true, "Login Cancelled");
}
void OnPasswordRequired(bool lastAttemptIncorrect, bool loginFailed, bool loginCancelled, string message) void OnPasswordRequired(bool lastAttemptIncorrect, bool loginFailed, bool loginCancelled, string message)
{ {
var handler = PasswordRequired; var handler = PasswordRequired;
@@ -3521,6 +3550,29 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
} }
#endregion #endregion
#region IZoomWirelessShareInstructions Members
public event EventHandler<ShareInfoEventArgs> ShareInfoChanged;
public zStatus.Sharing SharingState
{
get
{
return Status.Sharing;
}
}
void OnShareInfoChanged(zStatus.Sharing status)
{
var handler = ShareInfoChanged;
if (handler != null)
{
handler(this, new ShareInfoEventArgs(status));
}
}
#endregion
} }
/// <summary> /// <summary>

View File

@@ -8,7 +8,20 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{ {
#region Digital #region Digital
// TODO [ ] Issue #868 [JoinName("CancelPasswordPrompt")]
public JoinDataComplete CancelPasswordPrompt = new JoinDataComplete(
new JoinData
{
JoinNumber = 5,
JoinSpan = 1
},
new JoinMetadata
{
Description = "Pulse to hide the password prompt",
JoinCapabilities = eJoinCapabilities.FromSIMPL,
JoinType = eJoinType.Digital
});
[JoinName("ShowPasswordPrompt")] [JoinName("ShowPasswordPrompt")]
public JoinDataComplete ShowPasswordPrompt = new JoinDataComplete( public JoinDataComplete ShowPasswordPrompt = new JoinDataComplete(
new JoinData new JoinData
@@ -23,7 +36,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
JoinType = eJoinType.Digital JoinType = eJoinType.Digital
}); });
// TODO [ ] Issue #868
[JoinName("PasswordIncorrect")] [JoinName("PasswordIncorrect")]
public JoinDataComplete PasswordIncorrect = new JoinDataComplete( public JoinDataComplete PasswordIncorrect = new JoinDataComplete(
new JoinData new JoinData
@@ -38,8 +50,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
JoinType = eJoinType.Digital JoinType = eJoinType.Digital
}); });
// TODO [ ] Issue #868 [JoinName("PasswordLoginFailed")]
[JoinName("PassowrdLoginFailed")]
public JoinDataComplete PasswordLoginFailed = new JoinDataComplete( public JoinDataComplete PasswordLoginFailed = new JoinDataComplete(
new JoinData new JoinData
{ {
@@ -53,7 +64,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
JoinType = eJoinType.Digital JoinType = eJoinType.Digital
}); });
// TODO [ ] Issue #868
[JoinName("WaitingForHost")] [JoinName("WaitingForHost")]
public JoinDataComplete WaitingForHost = new JoinDataComplete( public JoinDataComplete WaitingForHost = new JoinDataComplete(
new JoinData new JoinData
@@ -68,7 +78,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
JoinType = eJoinType.Digital JoinType = eJoinType.Digital
}); });
// TODO [ ] Issue #868
[JoinName("IsHost")] [JoinName("IsHost")]
public JoinDataComplete IsHost = new JoinDataComplete( public JoinDataComplete IsHost = new JoinDataComplete(
new JoinData new JoinData
@@ -83,7 +92,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
JoinType = eJoinType.Digital JoinType = eJoinType.Digital
}); });
// TODO [ ] Issue #868
[JoinName("StartMeetingNow")] [JoinName("StartMeetingNow")]
public JoinDataComplete StartMeetingNow = new JoinDataComplete( public JoinDataComplete StartMeetingNow = new JoinDataComplete(
new JoinData new JoinData
@@ -98,7 +106,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
JoinType = eJoinType.Digital JoinType = eJoinType.Digital
}); });
// TODO [ ] Issue #868
[JoinName("ShareOnlyMeeting")] [JoinName("ShareOnlyMeeting")]
public JoinDataComplete ShareOnlyMeeting = new JoinDataComplete( public JoinDataComplete ShareOnlyMeeting = new JoinDataComplete(
new JoinData new JoinData
@@ -113,7 +120,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
JoinType = eJoinType.Digital JoinType = eJoinType.Digital
}); });
// TODO [ ] Issue #868
[JoinName("StartNormalMeetingFromSharingOnlyMeeting")] [JoinName("StartNormalMeetingFromSharingOnlyMeeting")]
public JoinDataComplete StartNormalMeetingFromSharingOnlyMeeting = new JoinDataComplete( public JoinDataComplete StartNormalMeetingFromSharingOnlyMeeting = new JoinDataComplete(
new JoinData new JoinData
@@ -367,6 +373,40 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
JoinType = eJoinType.Digital JoinType = eJoinType.Digital
}); });
#region Sharing Status
[JoinName("IsSharingAirplay")]
public JoinDataComplete IsSharingAirplay = new JoinDataComplete(
new JoinData
{
JoinNumber = 250,
JoinSpan = 1
},
new JoinMetadata
{
Description = "Indicates an Airplay source is sharing",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Digital
});
[JoinName("IsSharingHdmi")]
public JoinDataComplete IsSharingHdmi = new JoinDataComplete(
new JoinData
{
JoinNumber = 251,
JoinSpan = 1
},
new JoinMetadata
{
Description = "Indicates an HDMI source is sharing",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Digital
});
#endregion
//[JoinName("ParticipantAudioMuteToggleStart")] //[JoinName("ParticipantAudioMuteToggleStart")]
//public JoinDataComplete ParticipantAudioMuteToggleStart = new JoinDataComplete( //public JoinDataComplete ParticipantAudioMuteToggleStart = new JoinDataComplete(
// new JoinData // new JoinData
@@ -551,6 +591,92 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
JoinType = eJoinType.DigitalSerial JoinType = eJoinType.DigitalSerial
}); });
[JoinName("DisplayState")]
public JoinDataComplete DisplayState = new JoinDataComplete(
new JoinData
{
JoinNumber = 250,
JoinSpan = 1
},
new JoinMetadata
{
Description = "Reports the instructions the ZoomRoom is displaying on the monitor. <None | Laptop | IOS>",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Serial
});
[JoinName("AirplayShareCode")]
public JoinDataComplete AirplayShareCode = new JoinDataComplete(
new JoinData
{
JoinNumber = 251,
JoinSpan = 1
},
new JoinMetadata
{
Description = "Reports the current code for Airplay Sharing.",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Serial
});
[JoinName("LaptopShareKey")]
public JoinDataComplete LaptopShareKey = new JoinDataComplete(
new JoinData
{
JoinNumber = 252,
JoinSpan = 1
},
new JoinMetadata
{
Description = "The alpha-only sharing key that users type into a laptop client to share with the Zoom Room.",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Serial
});
[JoinName("LaptopSharePairingCode")]
public JoinDataComplete LaptopSharePairingCode = new JoinDataComplete(
new JoinData
{
JoinNumber = 253,
JoinSpan = 1
},
new JoinMetadata
{
Description = "This is the paring code that is broadcast via an ultrasonic signal from the ZRC. It is different than the user-supplied paring code. The ZRC uses a Zoom-proprietary method of advertizing the ultrasonic pairing code, so it\'s not possible to advertize it using commonly available libraries.",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Serial
});
[JoinName("WifiName")]
public JoinDataComplete WifiName = new JoinDataComplete(
new JoinData
{
JoinNumber = 254,
JoinSpan = 1
},
new JoinMetadata
{
Description = "Reports the Wifi SSID used by the ZoomRoom.",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Serial
});
[JoinName("ServerName")]
public JoinDataComplete ServerName = new JoinDataComplete(
new JoinData
{
JoinNumber = 255,
JoinSpan = 1
},
new JoinMetadata
{
Description = "Reports the namne of the the ZoomRoom.",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Serial
});
#endregion #endregion
public ZoomRoomJoinMap(uint joinStart) public ZoomRoomJoinMap(uint joinStart)