/// <summary> /// /// </summary> /// <param name="previousStatus"></param> /// <param name="newStatus"></param> /// <param name="item"></param> protected void OnCallStatusChange(CodecActiveCallItem item) { var handler = CallStatusChange; if (handler != null) { handler(this, new CodecCallStatusItemChangeEventArgs(item)); } if (AutoShareContentWhileInCall) { StartSharing(); } if (UsageTracker != null) { if (IsInCall && !UsageTracker.UsageTrackingStarted) { UsageTracker.StartDeviceUsage(); } else if (UsageTracker.UsageTrackingStarted && !IsInCall) { UsageTracker.EndDeviceUsage(); } } }
private void Initialize(string key, TesiraDialerControlBlockConfig config) { if (config.Enabled) { DeviceManager.AddDevice(this); } Debug.Console(2, this, "Adding Dialer '{0}'", Key); IsSubscribed = false; PotsIsSubscribed = false; VoipIsSubscribed = false; AutoAnswerIsSubscribed = false; Label = config.Label; IsVoip = config.IsVoip; LineNumber = config.Index; AppendDtmf = config.AppendDtmf; ClearOnHangup = config.ClearOnHangup; Enabled = config.Enabled; CallAppearance = config.CallAppearance; DisplayNumber = config.DisplayNumber; ActiveCalls = new List <CodecActiveCallItem>(); var activeCall = new CodecActiveCallItem(); activeCall.Name = ""; activeCall.Number = ""; activeCall.Type = eCodecCallType.Audio; activeCall.Status = eCodecCallStatus.Idle; activeCall.Direction = eCodecCallDirection.Unknown; activeCall.Id = Key; ActiveCalls.Add(activeCall); }
/// <summary> /// For a call from the test methods below /// </summary> public override void AcceptCall(CodecActiveCallItem call) { Debug.Console(1, this, "AcceptCall"); SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Connecting, call); new CTimer(o => SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Connected, call), 1000); // should already be in active list }
/// <summary> /// For a call from the test methods below /// </summary> public override void RejectCall(CodecActiveCallItem call) { Debug.Console(1, this, "RejectCall"); ActiveCalls.Remove(call); SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Disconnected, call); //ActiveCallCountFeedback.FireUpdate(); }
/// <summary> /// /// </summary> void ShowIncomingModal(CodecActiveCallItem call) { (Parent as IAVWithVCDriver).PrepareForCodecIncomingCall(); 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 { AcceptIncomingCall(call); } IncomingCallModal = null; }); }
/// <summary> /// /// </summary> /// <param name="eisc"></param> /// <param name="messagePath"></param> public Ddvc01VtcMessenger(string key, BasicTriList eisc, string messagePath) : base(key, messagePath) { EISC = eisc; CurrentCallItem = new CodecActiveCallItem(); CurrentCallItem.Type = eCodecCallType.Video; CurrentCallItem.Id = "-video-"; }
/// <summary> /// /// </summary> /// <param name="url"></param> public void TestIncomingAudioCall(string number) { Debug.Console(1, this, "TestIncomingAudioCall from {0}", number); var call = new CodecActiveCallItem() { Name = number, Id = number, Number = number, Type = eCodecCallType.Audio, Direction = eCodecCallDirection.Incoming }; ActiveCalls.Add(call); SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Ringing, call); }
/// <summary> /// /// </summary> /// <param name="eisc"></param> /// <param name="messagePath"></param> public SIMPLAtcMessenger(string key, BasicTriList eisc, string messagePath) : base(key, messagePath) { EISC = eisc; JoinMap = new SIMPLAtcJoinMap(201); CurrentCallItem = new CodecActiveCallItem(); CurrentCallItem.Type = eCodecCallType.Audio; CurrentCallItem.Id = "-audio-"; }
//******************************************************** // SIMULATION METHODS /// <summary> /// /// </summary> /// <param name="url"></param> public void TestIncomingVideoCall(string url) { Debug.Console(1, this, "TestIncomingVideoCall from {0}", url); var call = new CodecActiveCallItem() { Name = url, Id = url, Number = url, Type = eCodecCallType.Video, Direction = eCodecCallDirection.Incoming }; ActiveCalls.Add(call); SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Ringing, call); //OnCallStatusChange(eCodecCallStatus.Unknown, eCodecCallStatus.Ringing, call); }
/// <summary> /// Dials, yo! /// </summary> public override void Dial(string number) { Debug.Console(1, this, "Dial: {0}", number); var call = new CodecActiveCallItem() { Name = number, Number = number, Id = number, Status = eCodecCallStatus.Dialing, Direction = eCodecCallDirection.Outgoing, Type = eCodecCallType.Video }; ActiveCalls.Add(call); OnCallStatusChange(call); //ActiveCallCountFeedback.FireUpdate(); // Simulate 2-second ring, then connecting, then connected new CTimer(o => { call.Type = eCodecCallType.Video; SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Connecting, call); new CTimer(oo => SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Connected, call), 1000); }, 2000); }
public override void Dial(string number) { if (!IsInCall) { Debug.Console(1, this, "Dial: {0}", number); var call = new CodecActiveCallItem() { Name = "Mock Outgoing Call", Number = number, Type = eCodecCallType.Audio, Status = eCodecCallStatus.Connected, Direction = eCodecCallDirection.Outgoing, Id = "mockAudioCall-1" }; ActiveCalls.Add(call); OnCallStatusChange(call); } else { Debug.Console(1, this, "Already in call. Cannot dial new call."); } }
/// <summary> /// /// </summary> /// <param name="appServerController"></param> protected override void CustomRegisterWithAppServer(MobileControlSystemController appServerController) { var asc = appServerController; EISC.SetStringSigAction(JoinMap.HookState.JoinNumber, s => { CurrentCallItem.Status = (eCodecCallStatus)Enum.Parse(typeof(eCodecCallStatus), s, true); PostFullStatus(); // SendCallsList(); }); EISC.SetStringSigAction(JoinMap.CurrentCallNumber.JoinNumber, s => { CurrentCallItem.Number = s; PostCallsList(); }); EISC.SetStringSigAction(JoinMap.CurrentCallName.JoinNumber, s => { CurrentCallItem.Name = s; PostCallsList(); }); EISC.SetStringSigAction(JoinMap.CallDirection.JoinNumber, s => { CurrentCallItem.Direction = (eCodecCallDirection)Enum.Parse(typeof(eCodecCallDirection), s, true); PostCallsList(); }); EISC.SetBoolSigAction(JoinMap.IncomingCall.JoinNumber, b => { if (b) { var ica = new CodecActiveCallItem() { Direction = eCodecCallDirection.Incoming, Id = "-video-incoming", Name = EISC.GetString(JoinMap.IncomingCallName.JoinNumber), Number = EISC.GetString(JoinMap.IncomingCallNumber.JoinNumber), Status = eCodecCallStatus.Ringing, Type = eCodecCallType.Video }; IncomingCallItem = ica; } else { IncomingCallItem = null; } PostCallsList(); }); EISC.SetBoolSigAction(JoinMap.CameraSupportsAutoMode.JoinNumber, b => { PostStatusMessage(new { cameraSupportsAutoMode = b }); }); EISC.SetBoolSigAction(JoinMap.CameraSupportsOffMode.JoinNumber, b => { PostStatusMessage(new { cameraSupportsOffMode = b }); }); // Directory insanity EISC.SetUShortSigAction(JoinMap.DirectoryRowCount.JoinNumber, u => { // The length of the list comes in before the list does. // Splice the sig change operation onto the last string sig that will be changing // when the directory entries make it through. if (PreviousDirectoryLength > 0) { EISC.ClearStringSigAction(JoinMap.DirectoryEntriesStart.JoinNumber + PreviousDirectoryLength - 1); } EISC.SetStringSigAction(JoinMap.DirectoryEntriesStart.JoinNumber + u - 1, s => PostDirectory()); PreviousDirectoryLength = u; }); EISC.SetStringSigAction(JoinMap.DirectoryEntrySelectedName.JoinNumber, s => { PostStatusMessage(new { directoryContactSelected = new { name = EISC.GetString(JoinMap.DirectoryEntrySelectedName.JoinNumber), } }); }); EISC.SetStringSigAction(JoinMap.DirectoryEntrySelectedNumber.JoinNumber, s => { PostStatusMessage(new { directoryContactSelected = new { number = EISC.GetString(JoinMap.DirectoryEntrySelectedNumber.JoinNumber), } }); }); EISC.SetStringSigAction(JoinMap.DirectorySelectedFolderName.JoinNumber, s => PostStatusMessage(new { directorySelectedFolderName = EISC.GetString(JoinMap.DirectorySelectedFolderName.JoinNumber) })); EISC.SetSigTrueAction(JoinMap.CameraModeAuto.JoinNumber, () => PostCameraMode()); EISC.SetSigTrueAction(JoinMap.CameraModeManual.JoinNumber, () => PostCameraMode()); EISC.SetSigTrueAction(JoinMap.CameraModeOff.JoinNumber, () => PostCameraMode()); EISC.SetBoolSigAction(JoinMap.CameraSelfView.JoinNumber, b => PostStatusMessage(new { cameraSelfView = b })); EISC.SetUShortSigAction(JoinMap.CameraNumberSelect.JoinNumber, (u) => PostSelectedCamera()); // Add press and holds using helper action Action <string, uint> addPHAction = (s, u) => AppServerController.AddAction(MessagePath + s, new PressAndHoldAction(b => EISC.SetBool(u, b))); addPHAction("/cameraUp", JoinMap.CameraTiltUp.JoinNumber); addPHAction("/cameraDown", JoinMap.CameraTiltDown.JoinNumber); addPHAction("/cameraLeft", JoinMap.CameraPanLeft.JoinNumber); addPHAction("/cameraRight", JoinMap.CameraPanRight.JoinNumber); addPHAction("/cameraZoomIn", JoinMap.CameraZoomIn.JoinNumber); addPHAction("/cameraZoomOut", JoinMap.CameraZoomOut.JoinNumber); // Add straight pulse calls using helper action Action <string, uint> addAction = (s, u) => AppServerController.AddAction(MessagePath + s, new Action(() => EISC.PulseBool(u, 100))); addAction("/endCallById", JoinMap.EndCall.JoinNumber); addAction("/endAllCalls", JoinMap.EndCall.JoinNumber); addAction("/acceptById", JoinMap.IncomingAnswer.JoinNumber); addAction("/rejectById", JoinMap.IncomingReject.JoinNumber); var speeddialStart = JoinMap.SpeedDialStart.JoinNumber; var speeddialEnd = JoinMap.SpeedDialStart.JoinNumber + JoinMap.SpeedDialStart.JoinSpan; var speedDialIndex = 1; for (uint i = speeddialStart; i < speeddialEnd; i++) { addAction(string.Format("/speedDial{0}", speedDialIndex), i); speedDialIndex++; } addAction("/cameraModeAuto", JoinMap.CameraModeAuto.JoinNumber); addAction("/cameraModeManual", JoinMap.CameraModeManual.JoinNumber); addAction("/cameraModeOff", JoinMap.CameraModeOff.JoinNumber); addAction("/cameraSelfView", JoinMap.CameraSelfView.JoinNumber); addAction("/cameraLayout", JoinMap.CameraLayout.JoinNumber); asc.AddAction("/cameraSelect", new Action <string>(SelectCamera)); // camera presets for (uint i = 0; i < 6; i++) { addAction("/cameraPreset" + (i + 1), JoinMap.CameraPresetStart.JoinNumber + i); } asc.AddAction(MessagePath + "/isReady", new Action(PostIsReady)); // Get status asc.AddAction(MessagePath + "/fullStatus", new Action(PostFullStatus)); // Dial on string asc.AddAction(MessagePath + "/dial", new Action <string>(s => EISC.SetString(JoinMap.CurrentDialString.JoinNumber, s))); // Pulse DTMF AppServerController.AddAction(MessagePath + "/dtmf", new Action <string>(s => { var join = JoinMap.Joins[s]; if (join != null) { if (join.JoinNumber > 0) { EISC.PulseBool(join.JoinNumber, 100); } } })); // Directory madness asc.AddAction(MessagePath + "/directoryRoot", new Action(() => EISC.PulseBool(JoinMap.DirectoryRoot.JoinNumber))); asc.AddAction(MessagePath + "/directoryBack", new Action(() => EISC.PulseBool(JoinMap.DirectoryFolderBack.JoinNumber))); asc.AddAction(MessagePath + "/directoryById", new Action <string>(s => { // the id should contain the line number to forward to simpl try { var u = ushort.Parse(s); EISC.SetUshort(JoinMap.DirectorySelectRow.JoinNumber, u); EISC.PulseBool(JoinMap.DirectoryLineSelected.JoinNumber); } catch (Exception) { Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "/directoryById request contains non-numeric ID incompatible with DDVC bridge"); } })); asc.AddAction(MessagePath + "/directorySelectContact", new Action <string>(s => { try { var u = ushort.Parse(s); EISC.SetUshort(JoinMap.DirectorySelectRow.JoinNumber, u); EISC.PulseBool(JoinMap.DirectoryLineSelected.JoinNumber); } catch { } })); asc.AddAction(MessagePath + "/directoryDialContact", new Action(() => { EISC.PulseBool(JoinMap.DirectoryDialSelectedLine.JoinNumber); })); asc.AddAction(MessagePath + "/getDirectory", new Action(() => { if (EISC.GetUshort(JoinMap.DirectoryRowCount.JoinNumber) > 0) { PostDirectory(); } else { EISC.PulseBool(JoinMap.DirectoryRoot.JoinNumber); } })); }
public override void AcceptCall(CodecActiveCallItem call) { Debug.Console(1, this, "AcceptCall"); SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Connecting, call); }
public override void EndCall(CodecActiveCallItem call) { Debug.Console(1, this, "EndCall"); ActiveCalls.Remove(call); SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Disconnected, call); }
/// <summary> /// /// </summary> /// <param name="appServerController"></param> protected override void CustomRegisterWithAppServer(MobileControlSystemController appServerController) { var asc = appServerController; EISC.SetStringSigAction(SHookState, s => { CurrentCallItem.Status = (eCodecCallStatus)Enum.Parse(typeof(eCodecCallStatus), s, true); PostFullStatus(); // SendCallsList(); }); EISC.SetStringSigAction(SCurrentCallNumber, s => { CurrentCallItem.Number = s; PostCallsList(); }); EISC.SetStringSigAction(SCurrentCallName, s => { CurrentCallItem.Name = s; PostCallsList(); }); EISC.SetStringSigAction(SCallDirection, s => { CurrentCallItem.Direction = (eCodecCallDirection)Enum.Parse(typeof(eCodecCallDirection), s, true); PostCallsList(); }); EISC.SetBoolSigAction(BCallIncoming, b => { if (b) { var ica = new CodecActiveCallItem() { Direction = eCodecCallDirection.Incoming, Id = "-video-incoming", Name = EISC.GetString(SIncomingCallName), Number = EISC.GetString(SIncomingCallNumber), Status = eCodecCallStatus.Ringing, Type = eCodecCallType.Video }; IncomingCallItem = ica; } else { IncomingCallItem = null; } PostCallsList(); }); EISC.SetBoolSigAction(BCameraSupportsAutoMode, b => { PostStatusMessage(new { cameraSupportsAutoMode = b }); }); EISC.SetBoolSigAction(BCameraSupportsOffMode, b => { PostStatusMessage(new { cameraSupportsOffMode = b }); }); // Directory insanity EISC.SetUShortSigAction(UDirectoryRowCount, u => { // The length of the list comes in before the list does. // Splice the sig change operation onto the last string sig that will be changing // when the directory entries make it through. if (PreviousDirectoryLength > 0) { EISC.ClearStringSigAction(SDirectoryEntriesStart + PreviousDirectoryLength - 1); } EISC.SetStringSigAction(SDirectoryEntriesStart + u - 1, s => PostDirectory()); PreviousDirectoryLength = u; }); EISC.SetStringSigAction(SDirectoryEntrySelectedName, s => { PostStatusMessage(new { directoryContactSelected = new { name = EISC.GetString(SDirectoryEntrySelectedName), } }); }); EISC.SetStringSigAction(SDirectoryEntrySelectedNumber, s => { PostStatusMessage(new { directoryContactSelected = new { number = EISC.GetString(SDirectoryEntrySelectedNumber), } }); }); EISC.SetStringSigAction(SDirectorySelectedFolderName, s => PostStatusMessage(new { directorySelectedFolderName = EISC.GetString(SDirectorySelectedFolderName) })); EISC.SetSigTrueAction(BCameraModeAuto, () => PostCameraMode()); EISC.SetSigTrueAction(BCameraModeManual, () => PostCameraMode()); EISC.SetSigTrueAction(BCameraModeOff, () => PostCameraMode()); EISC.SetBoolSigAction(BCameraSelfView, b => PostStatusMessage(new { cameraSelfView = b })); EISC.SetUShortSigAction(UCameraNumberSelect, (u) => PostSelectedCamera()); // Add press and holds using helper action Action <string, uint> addPHAction = (s, u) => AppServerController.AddAction(MessagePath + s, new PressAndHoldAction(b => EISC.SetBool(u, b))); addPHAction("/cameraUp", BCameraControlUp); addPHAction("/cameraDown", BCameraControlDown); addPHAction("/cameraLeft", BCameraControlLeft); addPHAction("/cameraRight", BCameraControlRight); addPHAction("/cameraZoomIn", BCameraControlZoomIn); addPHAction("/cameraZoomOut", BCameraControlZoomOut); // Add straight pulse calls using helper action Action <string, uint> addAction = (s, u) => AppServerController.AddAction(MessagePath + s, new Action(() => EISC.PulseBool(u, 100))); addAction("/endCallById", BDialHangup); addAction("/endAllCalls", BDialHangup); addAction("/acceptById", BIncomingAnswer); addAction("/rejectById", BIncomingReject); addAction("/speedDial1", BSpeedDial1); addAction("/speedDial2", BSpeedDial2); addAction("/speedDial3", BSpeedDial3); addAction("/speedDial4", BSpeedDial4); addAction("/cameraModeAuto", BCameraModeAuto); addAction("/cameraModeManual", BCameraModeManual); addAction("/cameraModeOff", BCameraModeOff); addAction("/cameraSelfView", BCameraSelfView); addAction("/cameraLayout", BCameraLayout); asc.AddAction("/cameraSelect", new Action <string>(SelectCamera)); // camera presets for (uint i = 0; i < 6; i++) { addAction("/cameraPreset" + (i + 1), BCameraPresetStart + i); } asc.AddAction(MessagePath + "/isReady", new Action(PostIsReady)); // Get status asc.AddAction(MessagePath + "/fullStatus", new Action(PostFullStatus)); // Dial on string asc.AddAction(MessagePath + "/dial", new Action <string>(s => EISC.SetString(SCurrentDialString, s))); // Pulse DTMF asc.AddAction(MessagePath + "/dtmf", new Action <string>(s => { if (DTMFMap.ContainsKey(s)) { EISC.PulseBool(DTMFMap[s], 100); } })); // Directory madness asc.AddAction(MessagePath + "/directoryRoot", new Action(() => EISC.PulseBool(BDirectoryRoot))); asc.AddAction(MessagePath + "/directoryBack", new Action(() => EISC.PulseBool(BDirectoryFolderBack))); asc.AddAction(MessagePath + "/directoryById", new Action <string>(s => { // the id should contain the line number to forward to simpl try { var u = ushort.Parse(s); EISC.SetUshort(UDirectorySelectRow, u); EISC.PulseBool(BDirectoryLineSelected); } catch (Exception) { Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "/directoryById request contains non-numeric ID incompatible with DDVC bridge"); } })); asc.AddAction(MessagePath + "/directorySelectContact", new Action <string>(s => { try { var u = ushort.Parse(s); EISC.SetUshort(UDirectorySelectRow, u); EISC.PulseBool(BDirectoryLineSelected); } catch { } })); asc.AddAction(MessagePath + "/directoryDialContact", new Action(() => { EISC.PulseBool(BDirectoryDialSelectedLine); })); asc.AddAction(MessagePath + "/getDirectory", new Action(() => { if (EISC.GetUshort(UDirectoryRowCount) > 0) { PostDirectory(); } else { EISC.PulseBool(BDirectoryRoot); } })); }
public abstract void AcceptCall(CodecActiveCallItem item);
public override void AcceptCall(CodecActiveCallItem item) { }
public void AcceptCall(CodecActiveCallItem item) { }
public void EndCall(CodecActiveCallItem activeCall) { }
public override void EndCall(CodecActiveCallItem activeCall) { }
/// <summary> /// Reject incoming call /// </summary> /// <param name="item">Call Object to Reject</param> public override void RejectCall(CodecActiveCallItem item) { SendFullCommand(null, "end", null, 1); }
/// <summary> /// Helper method to fire CallStatusChange event with old and new status /// </summary> protected void SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus newStatus, CodecActiveCallItem call) { call.Status = newStatus; OnCallStatusChange(call); }
public abstract void RejectCall(CodecActiveCallItem item);
public void RejectCall(CodecActiveCallItem item) { }
public override void RejectCall(CodecActiveCallItem item) { }
/// <summary> /// Accept Incoming Call /// </summary> /// <param name="item">Call Object to Accept</param> public override void AcceptCall(CodecActiveCallItem item) { SendFullCommand(null, "answer", null, 1); }
/// <summary> /// /// </summary> void AcceptIncomingCall(CodecActiveCallItem call) { (Parent as IAVWithVCDriver).PrepareForCodecIncomingCall(); (Parent as IAVWithVCDriver).ActivityCallButtonPressed(); Codec.AcceptCall(call); }
public abstract void EndCall(CodecActiveCallItem activeCall);