ecs-481 swapped call/share; ecs-483 phone number and address text code (with backing codec modifications)

This commit is contained in:
Heath Volmer
2017-09-29 10:12:09 -06:00
parent 3e6f345b8b
commit 5d2022549d
9 changed files with 291 additions and 215 deletions

View File

@@ -275,6 +275,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
/// <param name="e"></param> /// <param name="e"></param>
void SyncState_InitialSyncCompleted(object sender, EventArgs e) void SyncState_InitialSyncCompleted(object sender, EventArgs e)
{ {
// Fire the ready event
SetIsReady();
//CommDebuggingIsOn = false; //CommDebuggingIsOn = false;
GetCallHistory(); GetCallHistory();

View File

@@ -24,6 +24,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
public MockVC(string key, string name) public MockVC(string key, string name)
: base(key, name) : base(key, name)
{ {
CodecInfo = new MockCodecInfo();
// Debug helpers // Debug helpers
IncomingCallFeedback.OutputChange += (o, a) => Debug.Console(1, this, "IncomingCall={0}", _IncomingCall); IncomingCallFeedback.OutputChange += (o, a) => Debug.Console(1, this, "IncomingCall={0}", _IncomingCall);
MuteFeedback.OutputChange += (o, a) => Debug.Console(1, this, "Mute={0}", _IsMuted); MuteFeedback.OutputChange += (o, a) => Debug.Console(1, this, "Mute={0}", _IsMuted);
@@ -40,6 +42,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
InputPorts.Add(HdmiIn1); InputPorts.Add(HdmiIn1);
InputPorts.Add(HdmiIn2); InputPorts.Add(HdmiIn2);
OutputPorts.Add(HdmiOut); OutputPorts.Add(HdmiOut);
SetIsReady();
} }
protected override Func<bool> IncomingCallFeedbackFunc protected override Func<bool> IncomingCallFeedbackFunc
@@ -299,4 +303,42 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
} }
} }
/// <summary>
/// Implementation for the mock VC
/// </summary>
public class MockCodecInfo : VideoCodecInfo
{
public override bool MultiSiteOptionIsEnabled
{
get { return true; }
}
public override string IpAddress
{
get { return "xx.xx.xx.xx"; }
}
public override string PhoneNumber
{
get { return "333-444-5555"; }
}
public override string SipUri
{
get { return "mock@someurl.com"; }
}
public override bool AutoAnswerEnabled
{
get { return _AutoAnswerEnabled; }
}
bool _AutoAnswerEnabled;
public void SetAutoAnswer(bool value)
{
_AutoAnswerEnabled = value;
}
}
} }

View File

@@ -1,185 +1,200 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Crestron.SimplSharp; using Crestron.SimplSharp;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using PepperDash.Essentials.Devices.Common; using PepperDash.Essentials.Devices.Common;
using PepperDash.Essentials.Devices.Common.Codec; using PepperDash.Essentials.Devices.Common.Codec;
namespace PepperDash.Essentials.Devices.Common.VideoCodec namespace PepperDash.Essentials.Devices.Common.VideoCodec
{ {
public abstract class VideoCodecBase : Device, IRoutingInputsOutputs, IUsageTracking, IHasDialer, IHasSharing, ICodecAudio, iCodecInfo public abstract class VideoCodecBase : Device, IRoutingInputsOutputs, IUsageTracking, IHasDialer, IHasSharing, ICodecAudio, iCodecInfo
{ {
/// <summary> /// <summary>
/// Fires when the status of any active, dialing, or incoming call changes or is new /// Fires when the status of any active, dialing, or incoming call changes or is new
/// </summary> /// </summary>
public event EventHandler<CodecCallStatusItemChangeEventArgs> CallStatusChange; public event EventHandler<CodecCallStatusItemChangeEventArgs> CallStatusChange;
#region IUsageTracking Members public event EventHandler<EventArgs> IsReadyChange;
/// <summary> #region IUsageTracking Members
/// This object can be added by outside users of this class to provide usage tracking
/// for various services /// <summary>
/// </summary> /// This object can be added by outside users of this class to provide usage tracking
public UsageTracking UsageTracker { get; set; } /// for various services
/// </summary>
#endregion public UsageTracking UsageTracker { get; set; }
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; } #endregion
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; } public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
/// <summary> public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
/// Returns true when any call is not in state Unknown, Disconnecting, Disconnected
/// </summary> /// <summary>
public bool IsInCall { get { return ActiveCalls.Any(c => c.IsActiveCall); } } /// Returns true when any call is not in state Unknown, Disconnecting, Disconnected
/// </summary>
public BoolFeedback IncomingCallFeedback { get; private set; } public bool IsInCall { get { return ActiveCalls.Any(c => c.IsActiveCall); } }
abstract protected Func<bool> IncomingCallFeedbackFunc { get; } public BoolFeedback IncomingCallFeedback { get; private set; }
abstract protected Func<bool> PrivacyModeIsOnFeedbackFunc { get; }
abstract protected Func<int> VolumeLevelFeedbackFunc { get; } abstract protected Func<bool> IncomingCallFeedbackFunc { get; }
abstract protected Func<bool> MuteFeedbackFunc { get; } abstract protected Func<bool> PrivacyModeIsOnFeedbackFunc { get; }
abstract protected Func<string> SharingSourceFeedbackFunc { get; } abstract protected Func<int> VolumeLevelFeedbackFunc { get; }
abstract protected Func<bool> MuteFeedbackFunc { get; }
abstract protected Func<string> SharingSourceFeedbackFunc { get; }
public List<CodecActiveCallItem> ActiveCalls { get; set; } public List<CodecActiveCallItem> ActiveCalls { get; set; }
public VideoCodecInfo CodecInfo { get; protected set; } public VideoCodecInfo CodecInfo { get; protected set; }
public VideoCodecBase(string key, string name) public bool IsReady { get; protected set; }
: base(key, name)
{ public VideoCodecBase(string key, string name)
IncomingCallFeedback = new BoolFeedback(IncomingCallFeedbackFunc); : base(key, name)
PrivacyModeIsOnFeedback = new BoolFeedback(PrivacyModeIsOnFeedbackFunc); {
VolumeLevelFeedback = new IntFeedback(VolumeLevelFeedbackFunc); IncomingCallFeedback = new BoolFeedback(IncomingCallFeedbackFunc);
MuteFeedback = new BoolFeedback(MuteFeedbackFunc); PrivacyModeIsOnFeedback = new BoolFeedback(PrivacyModeIsOnFeedbackFunc);
SharingSourceFeedback = new StringFeedback(SharingSourceFeedbackFunc); VolumeLevelFeedback = new IntFeedback(VolumeLevelFeedbackFunc);
MuteFeedback = new BoolFeedback(MuteFeedbackFunc);
InputPorts = new RoutingPortCollection<RoutingInputPort>(); SharingSourceFeedback = new StringFeedback(SharingSourceFeedbackFunc);
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
InputPorts = new RoutingPortCollection<RoutingInputPort>();
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
ActiveCalls = new List<CodecActiveCallItem>(); ActiveCalls = new List<CodecActiveCallItem>();
}
#region IHasDialer Members
public abstract void Dial(string s);
public abstract void EndCall(CodecActiveCallItem call);
public abstract void EndAllCalls();
public abstract void AcceptCall(CodecActiveCallItem call);
public abstract void RejectCall(CodecActiveCallItem call);
public abstract void SendDtmf(string s);
#endregion
public virtual List<Feedback> Feedbacks
{
get
{
return new List<Feedback>
{
IncomingCallFeedback,
PrivacyModeIsOnFeedback,
SharingSourceFeedback
};
}
}
public abstract void ExecuteSwitch(object selector);
/// <summary>
/// Helper method to fire CallStatusChange event with old and new status
/// </summary>
protected void SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus newStatus, CodecActiveCallItem call)
{
var prevStatus = call.Status;
call.Status = newStatus;
OnCallStatusChange(prevStatus, newStatus, call);
}
/// <summary>
///
/// </summary>
/// <param name="previousStatus"></param>
/// <param name="newStatus"></param>
/// <param name="item"></param>
protected void OnCallStatusChange(eCodecCallStatus previousStatus, eCodecCallStatus newStatus, CodecActiveCallItem item)
{
var handler = CallStatusChange;
if (handler != null)
handler(this, new CodecCallStatusItemChangeEventArgs(previousStatus, newStatus, item));
}
#region ICodecAudio Members
public abstract void PrivacyModeOn();
public abstract void PrivacyModeOff();
public abstract void PrivacyModeToggle();
public BoolFeedback PrivacyModeIsOnFeedback { get; private set; }
public BoolFeedback MuteFeedback { get; private set; }
public abstract void MuteOff();
public abstract void MuteOn();
public abstract void SetVolume(ushort level);
public IntFeedback VolumeLevelFeedback { get; private set; }
public abstract void MuteToggle();
public abstract void VolumeDown(bool pressRelease);
public abstract void VolumeUp(bool pressRelease);
#endregion
#region IHasSharing Members
public abstract void StartSharing();
public abstract void StopSharing();
public StringFeedback SharingSourceFeedback { get; private set; }
#endregion
// **** DEBUGGING THINGS ****
/// <summary>
///
/// </summary>
public virtual void ListCalls()
{
var sb = new StringBuilder();
foreach (var c in ActiveCalls)
sb.AppendFormat("{0} {1} -- {2} {3}\r", c.Id, c.Number, c.Name, c.Status);
Debug.Console(1, "{0}", sb.ToString());
} }
} #region IHasDialer Members
/// <summary> public abstract void Dial(string s);
/// public abstract void EndCall(CodecActiveCallItem call);
/// </summary> public abstract void EndAllCalls();
public class CodecCallStatusItemChangeEventArgs : EventArgs public abstract void AcceptCall(CodecActiveCallItem call);
{ public abstract void RejectCall(CodecActiveCallItem call);
public CodecActiveCallItem CallItem { get; private set; } public abstract void SendDtmf(string s);
public eCodecCallStatus PreviousStatus { get; private set; } #endregion
public eCodecCallStatus NewStatus { get; private set; } public virtual List<Feedback> Feedbacks
{
public CodecCallStatusItemChangeEventArgs(eCodecCallStatus previousStatus, get
eCodecCallStatus newStatus, CodecActiveCallItem item) {
{ return new List<Feedback>
PreviousStatus = previousStatus; {
NewStatus = newStatus; IncomingCallFeedback,
CallItem = item; PrivacyModeIsOnFeedback,
} SharingSourceFeedback
} };
}
}
public abstract void ExecuteSwitch(object selector);
/// <summary>
/// Helper method to fire CallStatusChange event with old and new status
/// </summary>
protected void SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus newStatus, CodecActiveCallItem call)
{
var prevStatus = call.Status;
call.Status = newStatus;
OnCallStatusChange(prevStatus, newStatus, call);
}
/// <summary>
///
/// </summary>
/// <param name="previousStatus"></param>
/// <param name="newStatus"></param>
/// <param name="item"></param>
protected void OnCallStatusChange(eCodecCallStatus previousStatus, eCodecCallStatus newStatus, CodecActiveCallItem item)
{
var handler = CallStatusChange;
if (handler != null)
handler(this, new CodecCallStatusItemChangeEventArgs(previousStatus, newStatus, item));
}
/// <summary>
/// Sets IsReady property and fires the event. Used for dependent classes to sync up their data.
/// </summary>
protected void SetIsReady()
{
IsReady = true;
var h = IsReadyChange;
if(h != null)
h(this, new EventArgs());
}
#region ICodecAudio Members
public abstract void PrivacyModeOn();
public abstract void PrivacyModeOff();
public abstract void PrivacyModeToggle();
public BoolFeedback PrivacyModeIsOnFeedback { get; private set; }
public BoolFeedback MuteFeedback { get; private set; }
public abstract void MuteOff();
public abstract void MuteOn();
public abstract void SetVolume(ushort level);
public IntFeedback VolumeLevelFeedback { get; private set; }
public abstract void MuteToggle();
public abstract void VolumeDown(bool pressRelease);
public abstract void VolumeUp(bool pressRelease);
#endregion
#region IHasSharing Members
public abstract void StartSharing();
public abstract void StopSharing();
public StringFeedback SharingSourceFeedback { get; private set; }
#endregion
// **** DEBUGGING THINGS ****
/// <summary>
///
/// </summary>
public virtual void ListCalls()
{
var sb = new StringBuilder();
foreach (var c in ActiveCalls)
sb.AppendFormat("{0} {1} -- {2} {3}\r", c.Id, c.Number, c.Name, c.Status);
Debug.Console(1, "{0}", sb.ToString());
}
}
/// <summary>
///
/// </summary>
public class CodecCallStatusItemChangeEventArgs : EventArgs
{
public CodecActiveCallItem CallItem { get; private set; }
public eCodecCallStatus PreviousStatus { get; private set; }
public eCodecCallStatus NewStatus { get; private set; }
public CodecCallStatusItemChangeEventArgs(eCodecCallStatus previousStatus,
eCodecCallStatus newStatus, CodecActiveCallItem item)
{
PreviousStatus = previousStatus;
NewStatus = newStatus;
CallItem = item;
}
}
} }

View File

@@ -40,47 +40,46 @@ namespace PepperDash.Essentials
// Audio Conference // Audio Conference
#warning Move these to 1100's
/// <summary> /// <summary>
/// 1001 /// 1101
/// </summary> /// </summary>
public const uint ACKeypadVisible = 1001; public const uint ACKeypadVisible = 1101;
/// <summary> /// <summary>
/// 1002 /// 1102
/// </summary> /// </summary>
public const uint ACStagingPopoverVisible = 1002; public const uint ACStagingPopoverVisible = 1102;
/// <summary> /// <summary>
/// 1011 /// 1111
/// </summary> /// </summary>
public const uint ACSpeedDial1Press = 1011; public const uint ACSpeedDial1Press = 1111;
/// <summary> /// <summary>
/// 1012 /// 1112
/// </summary> /// </summary>
public const uint ACSpeedDial2Press = 1012; public const uint ACSpeedDial2Press = 1112;
/// <summary> /// <summary>
/// 1013 /// 1113
/// </summary> /// </summary>
public const uint ACSpeedDial3Press = 1013; public const uint ACSpeedDial3Press = 1113;
/// <summary> /// <summary>
/// 1014 /// 1114
/// </summary> /// </summary>
public const uint ACSpeedDial4Press = 1014; public const uint ACSpeedDial4Press = 1114;
/// <summary> /// <summary>
/// 1021 /// 1121
/// </summary> /// </summary>
public const uint ACSpeedDial1Visible = 1021; public const uint ACSpeedDial1Visible = 1121;
/// <summary> /// <summary>
/// 1022 /// 1122
/// </summary> /// </summary>
public const uint ACSpeedDial2Visible = 1022; public const uint ACSpeedDial2Visible = 1122;
/// <summary> /// <summary>
/// 1023 /// 1123
/// </summary> /// </summary>
public const uint ACSpeedDial3Visible = 1023; public const uint ACSpeedDial3Visible = 1123;
/// <summary> /// <summary>
/// 1024 /// 1124
/// </summary> /// </summary>
public const uint ACSpeedDial4Visible = 1024; public const uint ACSpeedDial4Visible = 1124;
//****************************************************** //******************************************************
// Video Conference // Video Conference

View File

@@ -232,7 +232,6 @@ namespace PepperDash.Essentials
TriList.SetSigFalseAction(UIBoolJoin.RoomHeaderButtonPress, () => TriList.SetSigFalseAction(UIBoolJoin.RoomHeaderButtonPress, () =>
ShowInterlockedModal(UIBoolJoin.RoomHeaderPageVisible)); ShowInterlockedModal(UIBoolJoin.RoomHeaderPageVisible));
#warning Add press and hold to gear button here
TriList.SetSigFalseAction(UIBoolJoin.GearHeaderButtonPress, () => TriList.SetSigFalseAction(UIBoolJoin.GearHeaderButtonPress, () =>
ShowInterlockedModal(UIBoolJoin.VolumesPageVisible)); ShowInterlockedModal(UIBoolJoin.VolumesPageVisible));

View File

@@ -178,8 +178,8 @@ namespace PepperDash.Essentials
SourceStagingSrl = new SubpageReferenceList(TriList, UISmartObjectJoin.SourceStagingSRL, 3, 3, 3); SourceStagingSrl = new SubpageReferenceList(TriList, UISmartObjectJoin.SourceStagingSRL, 3, 3, 3);
ActivityFooterSrl = new SubpageReferenceList(TriList, UISmartObjectJoin.ActivityFooterSRL, 3, 3, 3); ActivityFooterSrl = new SubpageReferenceList(TriList, UISmartObjectJoin.ActivityFooterSRL, 3, 3, 3);
CallButtonSig = ActivityFooterSrl.BoolInputSig(1, 1); CallButtonSig = ActivityFooterSrl.BoolInputSig(2, 1);
ShareButtonSig = ActivityFooterSrl.BoolInputSig(2, 1); ShareButtonSig = ActivityFooterSrl.BoolInputSig(1, 1);
EndMeetingButtonSig = ActivityFooterSrl.BoolInputSig(3, 1); EndMeetingButtonSig = ActivityFooterSrl.BoolInputSig(3, 1);
SetupActivityFooterWhenRoomOff(); SetupActivityFooterWhenRoomOff();
@@ -425,13 +425,13 @@ namespace PepperDash.Essentials
void SetupActivityFooterWhenRoomOff() void SetupActivityFooterWhenRoomOff()
{ {
ActivityFooterSrl.Clear(); ActivityFooterSrl.Clear();
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(1, ActivityFooterSrl, 1, ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(1, ActivityFooterSrl, 0,
b => { if (!b) ActivityCallButtonPressed(); }));
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(2, ActivityFooterSrl, 0,
b => { if (!b) ActivityShareButtonPressed(); })); b => { if (!b) ActivityShareButtonPressed(); }));
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(2, ActivityFooterSrl, 3,
b => { if (!b) ActivityCallButtonPressed(); }));
ActivityFooterSrl.Count = 2; ActivityFooterSrl.Count = 2;
TriList.SetUshort(UIUshortJoin.PresentationStagingCaretMode, 5); // right one slot TriList.SetUshort(UIUshortJoin.PresentationStagingCaretMode, 1); // right one slot
TriList.SetUshort(UIUshortJoin.CallStagingCaretMode, 1); // left one slot TriList.SetUshort(UIUshortJoin.CallStagingCaretMode, 5); // left one slot
} }
/// <summary> /// <summary>
@@ -440,15 +440,15 @@ namespace PepperDash.Essentials
void SetupActivityFooterWhenRoomOn() void SetupActivityFooterWhenRoomOn()
{ {
ActivityFooterSrl.Clear(); ActivityFooterSrl.Clear();
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(1, ActivityFooterSrl, 1, ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(1, ActivityFooterSrl, 0,
b => { if (!b) ActivityCallButtonPressed(); }));
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(2, ActivityFooterSrl, 0,
b => { if (!b) ActivityShareButtonPressed(); })); b => { if (!b) ActivityShareButtonPressed(); }));
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(3, ActivityFooterSrl, ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(2, ActivityFooterSrl, 3,
3, b => { if (!b) PowerButtonPressed(); })); b => { if (!b) ActivityCallButtonPressed(); }));
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(3, ActivityFooterSrl, 4,
b => { if (!b) PowerButtonPressed(); }));
ActivityFooterSrl.Count = 3; ActivityFooterSrl.Count = 3;
TriList.SetUshort(UIUshortJoin.PresentationStagingCaretMode, 0); // center TriList.SetUshort(UIUshortJoin.PresentationStagingCaretMode, 2); // center
TriList.SetUshort(UIUshortJoin.CallStagingCaretMode, 2); // left -2 TriList.SetUshort(UIUshortJoin.CallStagingCaretMode, 0); // left -2
} }
/// <summary> /// <summary>

View File

@@ -85,6 +85,12 @@ namespace PepperDash.Essentials.UIDrivers.VC
codec.CallStatusChange += new EventHandler<CodecCallStatusItemChangeEventArgs>(Codec_CallStatusChange); 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); InCall = new BoolFeedback(() => false);
LocalPrivacyIsMuted = new BoolFeedback(() => false); LocalPrivacyIsMuted = new BoolFeedback(() => false);
@@ -113,6 +119,19 @@ namespace PepperDash.Essentials.UIDrivers.VC
.LinkInputSig(TriList.BooleanInput[UIBoolJoin.VCKeypadBackspaceVisible]); .LinkInputSig(TriList.BooleanInput[UIBoolJoin.VCKeypadBackspaceVisible]);
TriList.SetSigFalseAction(UIBoolJoin.VCKeypadTextPress, RevealKeyboard); TriList.SetSigFalseAction(UIBoolJoin.VCKeypadTextPress, RevealKeyboard);
// Address and number
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Codec_IsReady()
{
TriList.SetString(UIStringJoin.RoomPhoneText, Codec.CodecInfo.PhoneNumber);
TriList.SetString(UIStringJoin.RoomSipText, Codec.CodecInfo.SipUri);
} }
/// <summary> /// <summary>