diff --git a/Essentials Devices Common/Essentials Devices Common/Codec/CodecActiveCallItem.cs b/Essentials Devices Common/Essentials Devices Common/Codec/CodecActiveCallItem.cs index 86041f19..d8335873 100644 --- a/Essentials Devices Common/Essentials Devices Common/Codec/CodecActiveCallItem.cs +++ b/Essentials Devices Common/Essentials Devices Common/Codec/CodecActiveCallItem.cs @@ -20,5 +20,20 @@ namespace PepperDash.Essentials.Devices.Common.Codec public string Id { get; set; } public object CallMetaData { get; set; } + + /// + /// Returns true when this call is NOT status Unkown, + /// Disconnected, Disconnecting + /// + public bool IsActiveCall + { + get + { + return + !(Status == eCodecCallStatus.Disconnected + || Status == eCodecCallStatus.Disconnecting + || Status ==eCodecCallStatus.Unknown); + } + } } } \ No newline at end of file diff --git a/Essentials Devices Common/Essentials Devices Common/Codec/eCodecCallStatus.cs b/Essentials Devices Common/Essentials Devices Common/Codec/eCodecCallStatus.cs index 900a2aed..18462861 100644 --- a/Essentials Devices Common/Essentials Devices Common/Codec/eCodecCallStatus.cs +++ b/Essentials Devices Common/Essentials Devices Common/Codec/eCodecCallStatus.cs @@ -5,10 +5,21 @@ using System.Text; using Crestron.SimplSharp; namespace PepperDash.Essentials.Devices.Common.Codec - { public enum eCodecCallStatus { - Unknown = 0, Dialing, Connected, Connecting, Incoming, OnHold, Disconnected + Connected, + Connecting, + Dialing, + Disconnected, + Disconnecting, + EarlyMedia, + Idle, + Incoming, + OnHold, + Ringing, + Preserved, + RemotePreserved, + Unknown = 0 } } \ No newline at end of file diff --git a/Essentials Devices Common/Essentials Devices Common/Codec/iHasDialer.cs b/Essentials Devices Common/Essentials Devices Common/Codec/iHasDialer.cs index c19f6d44..59c9873f 100644 --- a/Essentials Devices Common/Essentials Devices Common/Codec/iHasDialer.cs +++ b/Essentials Devices Common/Essentials Devices Common/Codec/iHasDialer.cs @@ -22,7 +22,7 @@ namespace PepperDash.Essentials.Devices.Common.Codec void RejectCall(CodecActiveCallItem item); void SendDtmf(string digit); - IntFeedback ActiveCallCountFeedback { get; } + //IntFeedback ActiveCallCountFeedback { get; } BoolFeedback IncomingCallFeedback { get; } } } \ No newline at end of file diff --git a/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoCodec.cs b/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoCodec.cs index 73f99579..0a4a3151 100644 --- a/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoCodec.cs +++ b/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoCodec.cs @@ -799,11 +799,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco { SendText("xCommand SystemUnit Boot Action: Restart"); } - - protected override Func ActiveCallCountFeedbackFunc - { - get { return () => 0; } - } } /// diff --git a/Essentials Devices Common/Essentials Devices Common/VideoCodec/MockVC/MockVC.cs b/Essentials Devices Common/Essentials Devices Common/VideoCodec/MockVC/MockVC.cs index 53e5e2f1..f5066571 100644 --- a/Essentials Devices Common/Essentials Devices Common/VideoCodec/MockVC/MockVC.cs +++ b/Essentials Devices Common/Essentials Devices Common/VideoCodec/MockVC/MockVC.cs @@ -17,7 +17,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec : base(key, name) { // Debug helpers - ActiveCallCountFeedback.OutputChange += (o, a) => Debug.Console(1, this, "InCall={0}", ActiveCallCountFeedback.IntValue); + //ActiveCallCountFeedback.OutputChange += (o, a) => Debug.Console(1, this, "InCall={0}", ActiveCallCountFeedback.IntValue); IncomingCallFeedback.OutputChange += (o, a) => Debug.Console(1, this, "IncomingCall={0}", _IncomingCall); MuteFeedback.OutputChange += (o, a) => Debug.Console(1, this, "Mute={0}", _IsMuted); PrivacyModeIsOnFeedback.OutputChange += (o, a) => Debug.Console(1, this, "Privacy={0}", _PrivacyModeIsOn); @@ -25,11 +25,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec VolumeLevelFeedback.OutputChange += (o, a) => Debug.Console(1, this, "Volume={0}", _VolumeLevel); } - protected override Func ActiveCallCountFeedbackFunc - { - get { return () => ActiveCalls.Count; } - } - protected override Func IncomingCallFeedbackFunc { get { return () => _IncomingCall; } @@ -69,7 +64,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec var call = new CodecActiveCallItem() { Name = s, Number = s, Id = s, Status = eCodecCallStatus.Dialing }; ActiveCalls.Add(call); OnCallStatusChange(eCodecCallStatus.Unknown, call.Status, call); - ActiveCallCountFeedback.FireUpdate(); + //ActiveCallCountFeedback.FireUpdate(); // Simulate 2-second ring, then connecting, then connected new CTimer(o => { @@ -86,9 +81,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec { Debug.Console(1, this, "EndCall"); ActiveCalls.Remove(call); - SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Disconnected, call); - ActiveCallCountFeedback.FireUpdate(); + //ActiveCallCountFeedback.FireUpdate(); } /// @@ -102,7 +96,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec ActiveCalls.Remove(call); SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Disconnected, call); } - ActiveCallCountFeedback.FireUpdate(); + //ActiveCallCountFeedback.FireUpdate(); } /// @@ -122,6 +116,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec public override void RejectCall(CodecActiveCallItem call) { Debug.Console(1, this, "RejectCall"); + ActiveCalls.Remove(call); + SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Disconnected, call); + //ActiveCallCountFeedback.FireUpdate(); } /// @@ -259,7 +256,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Incoming, call); _IncomingCall = true; IncomingCallFeedback.FireUpdate(); - ActiveCallCountFeedback.FireUpdate(); + //ActiveCallCountFeedback.FireUpdate(); } /// @@ -274,7 +271,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Incoming, call); _IncomingCall = true; IncomingCallFeedback.FireUpdate(); - ActiveCallCountFeedback.FireUpdate(); + //ActiveCallCountFeedback.FireUpdate(); } /// diff --git a/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs b/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs index c10c5b88..6776281d 100644 --- a/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs +++ b/Essentials Devices Common/Essentials Devices Common/VideoCodec/VideoCodecBase.cs @@ -35,15 +35,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec #endregion /// - /// Returns true when ActiveCallCountFeedback is > 0 + /// Returns true when any call is not in state Unknown, Disconnecting, Disconnected /// - public bool IsInCall { get { return ActiveCallCountFeedback.IntValue > 0; } } + public bool IsInCall { get { return ActiveCalls.Any(c => c.IsActiveCall); } } public BoolFeedback IncomingCallFeedback { get; private set; } - public IntFeedback ActiveCallCountFeedback { get; private set; } + //public IntFeedback ActiveCallCountFeedback { get; private set; } - abstract protected Func ActiveCallCountFeedbackFunc { get; } + //abstract protected Func ActiveCallCountFeedbackFunc { get; } abstract protected Func IncomingCallFeedbackFunc { get; } abstract protected Func PrivacyModeIsOnFeedbackFunc { get; } abstract protected Func VolumeLevelFeedbackFunc { get; } @@ -55,7 +55,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec public VideoCodecBase(string key, string name) : base(key, name) { - ActiveCallCountFeedback = new IntFeedback(ActiveCallCountFeedbackFunc); + //ActiveCallCountFeedback = new IntFeedback(ActiveCallCountFeedbackFunc); IncomingCallFeedback = new BoolFeedback(IncomingCallFeedbackFunc); PrivacyModeIsOnFeedback = new BoolFeedback(PrivacyModeIsOnFeedbackFunc); VolumeLevelFeedback = new IntFeedback(VolumeLevelFeedbackFunc); @@ -64,7 +64,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec InputPorts = new RoutingPortCollection(); - ActiveCallCountFeedback.OutputChange += new EventHandler(ActiveCallCountFeedback_OutputChange); + //ActiveCallCountFeedback.OutputChange += new EventHandler(ActiveCallCountFeedback_OutputChange); ActiveCalls = new List(); } @@ -74,16 +74,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec /// /// /// - void ActiveCallCountFeedback_OutputChange(object sender, EventArgs e) - { - if (UsageTracker != null) - { - if (IsInCall) - UsageTracker.StartDeviceUsage(); - else - UsageTracker.EndDeviceUsage(); - } - } + //void ActiveCallCountFeedback_OutputChange(object sender, EventArgs e) + //{ + // if (UsageTracker != null) + // { + // if (IsInCall) + // UsageTracker.StartDeviceUsage(); + // else + // UsageTracker.EndDeviceUsage(); + // } + //} #region IHasDialer Members public abstract void Dial(string s); diff --git a/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs b/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs index ba8ead8f..1f34ba21 100644 --- a/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs +++ b/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs @@ -9,6 +9,7 @@ using PepperDash.Core; using PepperDash.Essentials; using PepperDash.Essentials.Core; using PepperDash.Essentials.Core.SmartObjects; +using PepperDash.Essentials.Devices.Common.Codec; using PepperDash.Essentials.Devices.Common.VideoCodec; namespace PepperDash.Essentials.UIDrivers.VC @@ -60,6 +61,8 @@ namespace PepperDash.Essentials.UIDrivers.VC StringBuilder DialStringBuilder = new StringBuilder(); BoolFeedback DialStringBackspaceVisibleFeedback; + ModalDialog IncomingCallModal; + /// /// /// @@ -72,6 +75,8 @@ namespace PepperDash.Essentials.UIDrivers.VC SetupCallStagingPopover(); SetupDialKeypad(); + codec.CallStatusChange += new EventHandler(Codec_CallStatusChange); + InCall = new BoolFeedback(() => false); LocalPrivacyIsMuted = new BoolFeedback(() => false); @@ -93,7 +98,91 @@ namespace PepperDash.Essentials.UIDrivers.VC DialStringBackspaceVisibleFeedback .LinkInputSig(TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible]); - Codec.ActiveCallCountFeedback.OutputChange += new EventHandler(InCallFeedback_OutputChange); + } + + /// + /// Handles status changes for calls + /// + /// + /// + void Codec_CallStatusChange(object sender, CodecCallStatusItemChangeEventArgs e) + { + var call = e.CallItem; + Debug.Console(1, "*#* UI: Codec status {0}: {1} --> {2}", call.Name, e.PreviousStatus, e.NewStatus); + switch (e.NewStatus) + { + case eCodecCallStatus.Connected: + // fire at SRL item + Debug.Console(1, "*#* UI: Call Connected {0}", call.Name); + break; + case eCodecCallStatus.Connecting: + // fire at SRL item + Debug.Console(1, "*#* UI: Call Connecting {0}", call.Name); + break; + case eCodecCallStatus.Dialing: + Debug.Console(1, "*#* UI: Call Dialing {0}", call.Name); + break; + case eCodecCallStatus.Disconnected: + Debug.Console(1, "*#* UI: Call Disconnecting {0}", call.Name); + break; + case eCodecCallStatus.Disconnecting: + break; + case eCodecCallStatus.EarlyMedia: + break; + case eCodecCallStatus.Idle: + break; + case eCodecCallStatus.Incoming: + // fire up a modal + ShowIncomingModal(call); + break; + case eCodecCallStatus.OnHold: + break; + case eCodecCallStatus.Preserved: + break; + case eCodecCallStatus.RemotePreserved: + break; + case eCodecCallStatus.Ringing: + break; + default: + break; + } + TriList.UShortInput[UIUshortJoin.VCStagingConnectButtonMode].UShortValue = (ushort)(Codec.IsInCall ? 1 : 0); + StagingBarInterlock.ShowInterlocked(Codec.IsInCall ? + UIBoolJoin.VCStagingActivePopoverVisible : UIBoolJoin.VCStagingInactivePopoverVisible); + + // Update list of calls + var activeList = Codec.ActiveCalls.Where(c => c.IsActiveCall).ToList(); + Debug.Console(1, "*#* UI - Codec has {0} calls", activeList.Count); + + } + + /// + /// + /// + void ShowIncomingModal(CodecActiveCallItem call) + { + IncomingCallModal = new ModalDialog(TriList); + string msg; + string icon; + if (call.Type == eCodecCallType.Audio) + { + icon = "Phone"; + msg = string.Format("Incoming phone call from: {0}", call.Name); + } + else + { + icon = "Camera"; + msg = string.Format("Incoming video call from: {0}", call.Name); + } + IncomingCallModal.PresentModalDialog(2, "Incoming Call", icon, msg, + "Ignore", "Accept", false, false, b => + { + if (b == 1) + Codec.RejectCall(call); + else //2 + Codec.AcceptCall(call); + IncomingCallModal = null; + }); } /// @@ -196,28 +285,6 @@ namespace PepperDash.Essentials.UIDrivers.VC Codec.Dial(DialStringBuilder.ToString()); } - /// - /// - /// - void InCallFeedback_OutputChange(object sender, EventArgs e) - { - var inCall = Codec.IsInCall; - Debug.Console(1, "*#* Codec Driver InCallFeedback change={0}", InCall); - TriList.UShortInput[UIUshortJoin.VCStagingConnectButtonMode].UShortValue = (ushort)(inCall ? 1 : 0); - StagingBarInterlock.ShowInterlocked( - inCall ? UIBoolJoin.VCStagingActivePopoverVisible : UIBoolJoin.VCStagingInactivePopoverVisible); - - if (Codec.IsInCall) // Call is starting - { - // Header icon - // Volume bar needs to have mic mute - } - else // ending - { - // Header icon - // Volume bar no mic mute (or hidden if no source?) - } - } /// /// diff --git a/Release Package/PepperDashEssentials.cpz b/Release Package/PepperDashEssentials.cpz index 849b24fc..89eb5530 100644 Binary files a/Release Package/PepperDashEssentials.cpz and b/Release Package/PepperDashEssentials.cpz differ diff --git a/Release Package/PepperDashEssentials.dll b/Release Package/PepperDashEssentials.dll index d92b4ced..57c0aec8 100644 Binary files a/Release Package/PepperDashEssentials.dll and b/Release Package/PepperDashEssentials.dll differ diff --git a/devjson commands.json b/devjson commands.json index c1e69fc2..a8afd494 100644 --- a/devjson commands.json +++ b/devjson commands.json @@ -8,4 +8,12 @@ devjson:1 {"deviceKey":"timer","methodName":"Cancel" } devjson:1 {"deviceKey":"timer","methodName":"Reset" } -devjson:1 {"deviceKey":"room1","methodName":"Shutdown" } \ No newline at end of file +devjson:1 {"deviceKey":"room1","methodName":"Shutdown" } + +devjson:1 {"deviceKey":"mockVc-1", "methodName":"TestIncomingVideoCall", "params": ["123-456-7890"]} + +devjson:1 {"deviceKey":"mockVc-1", "methodName":"TestIncomingAudioCall", "params": ["111-111-1111"]} + +devjson:1 {"deviceKey":"mockVc-1", "methodName":"TestIncomingVideoCall", "params": ["444-444-4444"]} + +devjson:1 {"deviceKey":"mockVc-1", "methodName":"ListCalls"}