using Crestron.SimplSharpPro.DeviceSupport; using Newtonsoft.Json.Linq; using PepperDash.Essentials.Core; using PepperDash.Essentials.Devices.Common.Codec; using System; using System.Collections.Generic; namespace PepperDash.Essentials.AppServer.Messengers { // ReSharper disable once InconsistentNaming public class SIMPLAtcMessenger : MessengerBase { private readonly BasicTriList _eisc; public SIMPLAtcJoinMap JoinMap { get; private set; } /// /// /// private readonly CodecActiveCallItem _currentCallItem; /// /// /// /// /// /// public SIMPLAtcMessenger(string key, BasicTriList eisc, string messagePath) : base(key, messagePath) { _eisc = eisc; JoinMap = new SIMPLAtcJoinMap(201); _currentCallItem = new CodecActiveCallItem { Type = eCodecCallType.Audio, Id = "-audio-" }; } /// /// /// private void SendFullStatus() { PostStatusMessage(JToken.FromObject(new { calls = GetCurrentCallList(), currentCallString = _eisc.GetString(JoinMap.CurrentCallName.JoinNumber), currentDialString = _eisc.GetString(JoinMap.CurrentDialString.JoinNumber), isInCall = _eisc.GetString(JoinMap.HookState.JoinNumber) == "Connected" }) ); } /// /// /// /// protected override void RegisterActions() { //EISC.SetStringSigAction(SCurrentDialString, s => PostStatusMessage(new { currentDialString = s })); _eisc.SetStringSigAction(JoinMap.HookState.JoinNumber, s => { _currentCallItem.Status = (eCodecCallStatus)Enum.Parse(typeof(eCodecCallStatus), s, true); //GetCurrentCallList(); SendFullStatus(); }); _eisc.SetStringSigAction(JoinMap.CurrentCallNumber.JoinNumber, s => { _currentCallItem.Number = s; SendCallsList(); }); _eisc.SetStringSigAction(JoinMap.CurrentCallName.JoinNumber, s => { _currentCallItem.Name = s; SendCallsList(); }); _eisc.SetStringSigAction(JoinMap.CallDirection.JoinNumber, s => { _currentCallItem.Direction = (eCodecCallDirection)Enum.Parse(typeof(eCodecCallDirection), s, true); SendCallsList(); }); // Add press and holds using helper //Action addPhAction = (s, u) => // AppServerController.AddAction(MessagePath + s, new PressAndHoldAction(b => _eisc.SetBool(u, b))); // Add straight pulse calls void addAction(string s, uint u) => AddAction(s, (id, content) => _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++; } // Get status AddAction("/fullStatus", (id, content) => SendFullStatus()); // Dial on string AddAction("/dial", (id, content) => { var msg = content.ToObject>(); _eisc.SetString(JoinMap.CurrentDialString.JoinNumber, msg.Value); }); // Pulse DTMF AddAction("/dtmf", (id, content) => { var s = content.ToObject>(); var join = JoinMap.Joins[s.Value]; if (join != null) { if (join.JoinNumber > 0) { _eisc.PulseBool(join.JoinNumber, 100); } } }); } /// /// /// private void SendCallsList() { PostStatusMessage(JToken.FromObject(new { calls = GetCurrentCallList(), }) ); } /// /// Turns the /// /// private List GetCurrentCallList() { return _currentCallItem.Status == eCodecCallStatus.Disconnected ? new List() : new List { _currentCallItem }; } } }