diff --git a/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj b/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj index 94e66af1..6fe716eb 100644 --- a/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj +++ b/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj @@ -184,6 +184,7 @@ + @@ -208,7 +209,7 @@ - + @@ -216,9 +217,9 @@ - - - + + + diff --git a/Essentials Core/PepperDashEssentialsBase/SubpageReferencList/DeviceStatusListController.cs b/Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/DeviceStatusListController.cs similarity index 100% rename from Essentials Core/PepperDashEssentialsBase/SubpageReferencList/DeviceStatusListController.cs rename to Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/DeviceStatusListController.cs diff --git a/Essentials Core/PepperDashEssentialsBase/SubpageReferencList/SourceListSubpageReferenceList.cs b/Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/SourceListSubpageReferenceList.cs similarity index 100% rename from Essentials Core/PepperDashEssentialsBase/SubpageReferencList/SourceListSubpageReferenceList.cs rename to Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/SourceListSubpageReferenceList.cs diff --git a/Essentials Core/PepperDashEssentialsBase/SubpageReferencList/SubpageReferenceList.cs b/Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/SubpageReferenceList.cs similarity index 100% rename from Essentials Core/PepperDashEssentialsBase/SubpageReferencList/SubpageReferenceList.cs rename to Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/SubpageReferenceList.cs diff --git a/Essentials Core/PepperDashEssentialsBase/SubpageReferencList/SubpageReferenceListItem.cs b/Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/SubpageReferenceListItem.cs similarity index 100% rename from Essentials Core/PepperDashEssentialsBase/SubpageReferencList/SubpageReferenceListItem.cs rename to Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/SubpageReferenceListItem.cs diff --git a/Essentials Core/PepperDashEssentialsBase/Touchpanels/Keyboards/HabaneroKeyboardController.cs b/Essentials Core/PepperDashEssentialsBase/Touchpanels/Keyboards/HabaneroKeyboardController.cs new file mode 100644 index 00000000..a5e2fead --- /dev/null +++ b/Essentials Core/PepperDashEssentialsBase/Touchpanels/Keyboards/HabaneroKeyboardController.cs @@ -0,0 +1,185 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Crestron.SimplSharp; +using Crestron.SimplSharpPro.DeviceSupport; + +namespace PepperDash.Essentials.Core.Touchpanels.Keyboards +{ + public class HabaneroKeyboardController + { + public BasicTriList TriList { get; private set; } + + int ShiftMode; + + public StringFeedback OutputFeedback { get; private set; } + StringBuilder Output; + + + /// + /// + /// + /// + public HabaneroKeyboardController(BasicTriList trilist) + { + TriList = trilist; + Output = new StringBuilder(); + OutputFeedback = new StringFeedback(() => Output.ToString()); + + } + + /// + /// Puts actions on buttons + /// + void SetUp() + { + TriList.SetSigTrueAction(KeyboardClosePress, Hide); + + TriList.SetSigTrueAction(2921, () => Append(A(ShiftMode))); + TriList.SetSigTrueAction(2922, () => Append(B(ShiftMode))); + TriList.SetSigTrueAction(2923, () => Append(C(ShiftMode))); + TriList.SetSigTrueAction(2924, () => Append(D(ShiftMode))); + TriList.SetSigTrueAction(2925, () => Append(E(ShiftMode))); + TriList.SetSigTrueAction(2926, () => Append(F(ShiftMode))); + TriList.SetSigTrueAction(2927, () => Append(G(ShiftMode))); + TriList.SetSigTrueAction(2928, () => Append(H(ShiftMode))); + TriList.SetSigTrueAction(2929, () => Append(I(ShiftMode))); + TriList.SetSigTrueAction(2930, () => Append(J(ShiftMode))); + TriList.SetSigTrueAction(2931, () => Append(K(ShiftMode))); + TriList.SetSigTrueAction(2932, () => Append(L(ShiftMode))); + TriList.SetSigTrueAction(2933, () => Append(M(ShiftMode))); + TriList.SetSigTrueAction(2934, () => Append(N(ShiftMode))); + TriList.SetSigTrueAction(2935, () => Append(O(ShiftMode))); + TriList.SetSigTrueAction(2936, () => Append(P(ShiftMode))); + TriList.SetSigTrueAction(2937, () => Append(Q(ShiftMode))); + TriList.SetSigTrueAction(2938, () => Append(R(ShiftMode))); + TriList.SetSigTrueAction(2939, () => Append(S(ShiftMode))); + TriList.SetSigTrueAction(2940, () => Append(T(ShiftMode))); + TriList.SetSigTrueAction(2941, () => Append(U(ShiftMode))); + TriList.SetSigTrueAction(2942, () => Append(V(ShiftMode))); + TriList.SetSigTrueAction(2943, () => Append(W(ShiftMode))); + TriList.SetSigTrueAction(2944, () => Append(X(ShiftMode))); + TriList.SetSigTrueAction(2945, () => Append(Y(ShiftMode))); + TriList.SetSigTrueAction(2946, () => Append(Z(ShiftMode))); + TriList.SetSigTrueAction(2947, () => Append('.')); + TriList.SetSigTrueAction(2948, () => Append('@')); + TriList.SetSigTrueAction(2949, () => Append(' ')); + TriList.SetSigTrueAction(2950, Backspace); + TriList.SetSigTrueAction(2951, Clear); + TriList.SetSigTrueAction(2952, Shift); + TriList.SetSigTrueAction(2953, NumShift); + + } + + public void Show() + { + TriList.SetBool(KeyboardVisible, true); + } + + public void Hide() + { + TriList.SetBool(KeyboardVisible, false); + } + + void Append(char c) + { + Output.Append(c); + OutputFeedback.FireUpdate(); + } + + char A(int i) { return new char[] { 'a', 'A', '?', '?' }[i]; } + char B(int i) { return new char[] { 'b', 'B', ':', ':' }[i]; } + char C(int i) { return new char[] { 'c', 'C', '>', '>' }[i]; } + char D(int i) { return new char[] { 'd', 'D', '_', '_' }[i]; } + char E(int i) { return new char[] { 'e', 'E', '3', '#' }[i]; } + char F(int i) { return new char[] { 'f', 'F', '=', '=' }[i]; } + char G(int i) { return new char[] { 'g', 'G', '+', '+' }[i]; } + char H(int i) { return new char[] { 'h', 'H', '[', '[' }[i]; } + char I(int i) { return new char[] { 'i', 'I', '8', '*' }[i]; } + char J(int i) { return new char[] { 'j', 'J', ']', ']' }[i]; } + char K(int i) { return new char[] { 'k', 'K', '/', '/' }[i]; } + char L(int i) { return new char[] { 'l', 'L', '\\', '\\' }[i]; } + char M(int i) { return new char[] { 'm', 'M', '"', '"' }[i]; } + char N(int i) { return new char[] { 'n', 'N', '\'', '\'' }[i]; } + char O(int i) { return new char[] { 'o', 'O', '9', '(' }[i]; } + char P(int i) { return new char[] { 'p', 'P', '0', ')' }[i]; } + char Q(int i) { return new char[] { 'q', 'Q', '1', '!' }[i]; } + char R(int i) { return new char[] { 'r', 'R', '4', '$' }[i]; } + char S(int i) { return new char[] { 's', 'S', '-', '-' }[i]; } + char T(int i) { return new char[] { 't', 'T', '5', '%' }[i]; } + char U(int i) { return new char[] { 'u', 'U', '7', '&' }[i]; } + char V(int i) { return new char[] { 'v', 'V', ';', ';' }[i]; } + char W(int i) { return new char[] { 'w', 'W', '2', '@' }[i]; } + char X(int i) { return new char[] { 'x', 'X', '<', '<' }[i]; } + char Y(int i) { return new char[] { 'y', 'Y', '6', '^' }[i]; } + char Z(int i) { return new char[] { 'z', 'Z', ',', ',' }[i]; } + + void Backspace() + { + if (Output.Length > 0) + { + Output.Remove(Output.Length - 1, 1); + OutputFeedback.FireUpdate(); + } + } + + void Clear() + { + Output.Remove(0, Output.Length); + OutputFeedback.FireUpdate(); + } + + void Shift() + { + if (ShiftMode == 0) + ShiftMode = 1; + else if (ShiftMode == 1) + ShiftMode = 0; + else if (ShiftMode == 2) + ShiftMode = 3; + else + ShiftMode = 2; + + TriList.SetUshort(2951, 0); // 0 = up, 1 = down, 2 = #, 3 = 123 + TriList.SetUshort(2952, 0); // 0 = #, 1 = abc + } + + void NumShift() + { + if (ShiftMode == 0 || ShiftMode == 1) + ShiftMode = 2; + else if (ShiftMode == 2) + ShiftMode = 3; + else + ShiftMode = 0; + } + + + /// + /// 2901 + /// + public const uint KeyboardVisible = 2901; + /// + /// 2902 + /// + public const uint KeyboardClosePress = 2902; + /// + /// 2903 + /// + public const uint KeyboardButton1Press = 2903; + /// + /// 2904 + /// + public const uint KeyboardButton1Press = 2904; + /// + /// 2910 + /// + public const uint KeyboardClearPress = 2910; + /// + /// 2911 + /// + public const uint KeyboardClearVisible = 2911; + + } +} \ No newline at end of file diff --git a/Essentials/PepperDashEssentials/OTHER/Fusion/FusionSystemController.cs b/Essentials/PepperDashEssentials/OTHER/Fusion/FusionSystemController.cs index 59b53112..1bcccf51 100644 --- a/Essentials/PepperDashEssentials/OTHER/Fusion/FusionSystemController.cs +++ b/Essentials/PepperDashEssentials/OTHER/Fusion/FusionSystemController.cs @@ -26,8 +26,8 @@ namespace PepperDash.Essentials.Fusion public class EssentialsHuddleSpaceFusionSystemController : Device { public event EventHandler ScheduleChange; - public event EventHandler MeetingEndWarning; - public event EventHandler NextMeetingBeginWarning; + //public event EventHandler MeetingEndWarning; + //public event EventHandler NextMeetingBeginWarning; FusionRoom FusionRoom; EssentialsHuddleSpaceRoom Room; diff --git a/Essentials/PepperDashEssentials/UI/EssentialsTouchpanelController.cs b/Essentials/PepperDashEssentials/UI/EssentialsTouchpanelController.cs index 21130a5f..637dca18 100644 --- a/Essentials/PepperDashEssentials/UI/EssentialsTouchpanelController.cs +++ b/Essentials/PepperDashEssentials/UI/EssentialsTouchpanelController.cs @@ -154,7 +154,7 @@ namespace PepperDash.Essentials { Debug.Console(0, this, "Adding huddle space driver"); var avDriver = new EssentialsHuddleVtc1PanelAvFunctionsDriver(mainDriver, props); - var codecDriver = new PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver(Panel, + var codecDriver = new PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver(Panel, avDriver, (room as EssentialsHuddleVtc1Room).VideoCodec); avDriver.SetVideoCodecDriver(codecDriver); avDriver.CurrentRoom = room as EssentialsHuddleVtc1Room; diff --git a/Essentials/PepperDashEssentials/UI/JoinConstants/UIBoolJoin.cs b/Essentials/PepperDashEssentials/UI/JoinConstants/UIBoolJoin.cs index c055ff77..1cf624a1 100644 --- a/Essentials/PepperDashEssentials/UI/JoinConstants/UIBoolJoin.cs +++ b/Essentials/PepperDashEssentials/UI/JoinConstants/UIBoolJoin.cs @@ -22,8 +22,21 @@ namespace PepperDash.Essentials /// public const uint VolumeDownPress = 902; - //****************************************************** + //**************************************************** + // Codec General + + /// + /// 1001 + /// + public const uint CallEndPress = 1001; + /// + /// 1002 + /// + public const uint CallEndAllConfirmPress = 1002; + + // Audio Conference +#warning Move these to 1100's /// /// 1001 /// @@ -153,7 +166,21 @@ namespace PepperDash.Essentials /// /// 2901 /// - public const uint KeyboardVisible = 2901; + public const uint KeyboardVisible = 2901; + /// + /// 2902 + /// + public const uint KeyboardClosePress = 2902; + /// + /// 2903 + /// + public const uint KeyboardButton1Press = 2903; + /// + /// 2904 + /// + public const uint KeyboardButton1Press = 2904; + + /// /// 2910 /// @@ -163,6 +190,9 @@ namespace PepperDash.Essentials /// public const uint KeyboardClearVisible = 2911; + // Letter joins start at 2921; + + //****************************************************** /// /// 3811 /// @@ -476,32 +506,31 @@ namespace PepperDash.Essentials /// 15060 /// public const uint Display2AudioButtonPressAndFb = 15060; - /// /// 15061 Reveals the dual-display subpage /// public const uint DualDisplayPageVisible = 15061; - /// /// 15062 Reveals the toggle switch for the sharing mode /// public const uint ToggleSharingModeVisible = 15062; - /// /// 15063 Press for the toggle mode switch /// public const uint ToggleSharingModePress = 15063; - /// /// 15064 /// public const uint LogoDefaultVisible = 15064; - /// /// 15065 /// public const uint LogoUrlVisible = 15065; /// + /// 15066 - Reveals the active calls header item + /// + public const uint HeaderActiveCallsListVisible = 15066; + /// /// 15083 - Press for Call help desk on AC/VC /// public const uint HelpPageShowCallButtonPress = 15083; diff --git a/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs b/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs index 3fdd58be..ceea3a89 100644 --- a/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs +++ b/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs @@ -3,6 +3,12 @@ public class UISmartObjectJoin { //****************************************************** + // Conference + /// + /// 1001 - The list that reveals in header to show calls + /// + public const uint CodecActiveCallsHeaderList = 1001; + // Video Conference /// diff --git a/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/HuddleVTCPanelAvFunctionsDriver.cs b/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/HuddleVTCPanelAvFunctionsDriver.cs index b041e28f..e511d7d0 100644 --- a/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/HuddleVTCPanelAvFunctionsDriver.cs +++ b/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/HuddleVTCPanelAvFunctionsDriver.cs @@ -16,7 +16,7 @@ namespace PepperDash.Essentials /// /// /// - public class EssentialsHuddleVtc1PanelAvFunctionsDriver : PanelDriverBase + public class EssentialsHuddleVtc1PanelAvFunctionsDriver : PanelDriverBase, IHasPopupInterlock { CrestronTouchpanelPropertiesConfig Config; @@ -118,7 +118,7 @@ namespace PepperDash.Essentials /// /// Represents /// - JoinedSigInterlock PopupInterlock; + public JoinedSigInterlock PopupInterlock { get; private set; } /// /// Interlock for various source, camera, call control bars. The bar above the activity footer. This is also @@ -155,12 +155,6 @@ namespace PepperDash.Essentials //PowerOffTimeout = 30000; //TriList.StringInput[UIStringJoin.StartActivityText].StringValue = "Tap an activity below"; - - // Reveal proper header buttons with/without lighting - if(false) // has lighting - TriList.SetBool(UIBoolJoin.CallLeftHeaderButtonVisible, true); - else - TriList.SetBool(UIBoolJoin.CallRightHeaderButtonVisible, true); } /// @@ -272,9 +266,14 @@ namespace PepperDash.Essentials if(roomConf.OneButtonMeeting != null && roomConf.OneButtonMeeting.Enable) { TriList.SetBool(UIBoolJoin.CalendarHeaderButtonVisible, true); - TriList.SetSigFalseAction(UIBoolJoin.CallHeaderButtonPress, () => - { }); - } + TriList.SetBool(UIBoolJoin.CallLeftHeaderButtonVisible, true); + } + else + TriList.SetBool(UIBoolJoin.CallRightHeaderButtonVisible, true); + + TriList.SetSigFalseAction(UIBoolJoin.CallHeaderButtonPress, () => + PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HeaderActiveCallsListVisible)); + // Setup button - shows volumes with default button OR hold for tech page TriList.SetSigHeldAction(UIBoolJoin.GearHeaderButtonPress, 2000, @@ -978,4 +977,9 @@ namespace PepperDash.Essentials RefreshSourceInfo(); } } + + public interface IHasPopupInterlock + { + JoinedSigInterlock PopupInterlock { get; } + } } diff --git a/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs b/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs index 81d40683..471cf8d0 100644 --- a/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs +++ b/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs @@ -16,8 +16,6 @@ namespace PepperDash.Essentials.UIDrivers.VC { -#warning When InCall, keypad text should clear. Keypad becomes DTMF only. Delete is gone and disabled. Send keypresses immediately to SendDTMF. Queue them in disaply string. -#warning when Call ends, clear keypad text. #warning FOR SPARK - (GFX also) we need a staging bar for in call state where there is no camera button /// /// This fella will likely need to interact with the room's source, although that is routed via the spark... @@ -26,6 +24,8 @@ namespace PepperDash.Essentials.UIDrivers.VC /// public class EssentialsVideoCodecUiDriver : PanelDriverBase { + IHasPopupInterlock Parent; + /// /// /// @@ -60,6 +60,8 @@ namespace PepperDash.Essentials.UIDrivers.VC SmartObjectNumeric DialKeypad; + SubpageReferenceList ActiveCallsSRL; + // These are likely temp until we get a keyboard built StringFeedback DialStringFeedback; StringBuilder DialStringBuilder = new StringBuilder(); @@ -67,17 +69,20 @@ namespace PepperDash.Essentials.UIDrivers.VC ModalDialog IncomingCallModal; + eKeypadMode KeypadMode; + /// /// /// /// /// - public EssentialsVideoCodecUiDriver(BasicTriListWithSmartObject triList, VideoCodecBase codec) + public EssentialsVideoCodecUiDriver(BasicTriListWithSmartObject triList, IHasPopupInterlock parent, VideoCodecBase codec) : base(triList) { Codec = codec; SetupCallStagingPopover(); SetupDialKeypad(); + ActiveCallsSRL = new SubpageReferenceList(TriList, UISmartObjectJoin.CodecActiveCallsHeaderList, 3, 3, 3); codec.CallStatusChange += new EventHandler(Codec_CallStatusChange); @@ -118,6 +123,10 @@ namespace PepperDash.Essentials.UIDrivers.VC case eCodecCallStatus.Connected: // fire at SRL item Debug.Console(1, "*#* UI: Call Connected {0}", call.Name); + KeypadMode = eKeypadMode.DTMF; + DialStringBuilder.Remove(0, DialStringBuilder.Length); + DialStringFeedback.FireUpdate(); + TriList.SetBool(UIBoolJoin.KeyboardClearVisible, false); break; case eCodecCallStatus.Connecting: // fire at SRL item @@ -128,6 +137,12 @@ namespace PepperDash.Essentials.UIDrivers.VC break; case eCodecCallStatus.Disconnected: Debug.Console(1, "*#* UI: Call Disconnecting {0}", call.Name); + if (!Codec.IsInCall) + { + KeypadMode = eKeypadMode.Dial; + DialStringBuilder.Remove(0, DialStringBuilder.Length); + DialStringFeedback.FireUpdate(); + } break; case eCodecCallStatus.Disconnecting: break; @@ -153,6 +168,7 @@ namespace PepperDash.Essentials.UIDrivers.VC TriList.UShortInput[UIUshortJoin.VCStagingConnectButtonMode].UShortValue = (ushort)(Codec.IsInCall ? 1 : 0); StagingBarInterlock.ShowInterlocked(Codec.IsInCall ? UIBoolJoin.VCStagingActivePopoverVisible : UIBoolJoin.VCStagingInactivePopoverVisible); + // Set mode of header button if (!Codec.IsInCall) TriList.SetUshort(UIUshortJoin.CallHeaderButtonMode, 0); @@ -162,9 +178,29 @@ namespace PepperDash.Essentials.UIDrivers.VC TriList.SetUshort(UIUshortJoin.CallHeaderButtonMode, 1); // Update list of calls - var activeList = Codec.ActiveCalls.Where(c => c.IsActiveCall).ToList(); - Debug.Console(1, "*#* UI - Codec has {0} calls", activeList.Count); + UpdateCallsHeaderList(call); + } + /// + /// Redraws the calls list on the header + /// + void UpdateCallsHeaderList(CodecActiveCallItem call) + { + var activeList = Codec.ActiveCalls.Where(c => c.IsActiveCall).ToList(); + ActiveCallsSRL.Clear(); + ushort i = 1; + foreach (var c in activeList) + { + var item = new SubpageReferenceListItem(1, ActiveCallsSRL); + ActiveCallsSRL.StringInputSig(i, 1).StringValue = c.Name; + ActiveCallsSRL.StringInputSig(i, 2).StringValue = c.Number; + ActiveCallsSRL.StringInputSig(i, 3).StringValue = c.Status.ToString(); + ActiveCallsSRL.UShortInputSig(i, 1).UShortValue = (ushort)(c.Type == eCodecCallType.Video ? 2 : 1); + var cc = c; // for scope in lambda + ActiveCallsSRL.GetBoolFeedbackSig(i, 1).SetSigFalseAction(() => Codec.EndCall(cc)); + i++; + } + ActiveCallsSRL.Count = (ushort)activeList.Count; } /// @@ -222,9 +258,17 @@ namespace PepperDash.Essentials.UIDrivers.VC void SetupCallStagingPopover() { TriList.SetSigFalseAction(UIBoolJoin.VCStagingDirectoryPress, ShowDirectory); - TriList.SetSigFalseAction(UIBoolJoin.VCStagingConnectPress, ConnectPress); TriList.SetSigFalseAction(UIBoolJoin.VCStagingKeypadPress, ShowKeypad); TriList.SetSigFalseAction(UIBoolJoin.VCStagingRecentsPress, ShowRecents); + TriList.SetSigFalseAction(UIBoolJoin.VCStagingConnectPress, ConnectPress); + TriList.SetSigFalseAction(UIBoolJoin.CallEndPress, () => + { + if (Codec.ActiveCalls.Count > 1) + Parent.PopupInterlock.ShowInterlocked(UIBoolJoin.HeaderActiveCallsListVisible); + else + Codec.EndAllCalls(); + }); + TriList.SetSigFalseAction(UIBoolJoin.CallEndAllConfirmPress, Codec.EndAllCalls); } /// @@ -290,10 +334,7 @@ namespace PepperDash.Essentials.UIDrivers.VC /// void ConnectPress() { - if (Codec.IsInCall) - Codec.EndAllCalls(); - else - Codec.Dial(DialStringBuilder.ToString()); + Codec.Dial(DialStringBuilder.ToString()); } @@ -303,10 +344,20 @@ namespace PepperDash.Essentials.UIDrivers.VC /// void DialKeypadPress(string i) { - DialStringBuilder.Append(i); - DialStringFeedback.FireUpdate(); - TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible].BoolValue = - DialStringBuilder.Length > 0; + if (KeypadMode == eKeypadMode.Dial) + { + DialStringBuilder.Append(i); + DialStringFeedback.FireUpdate(); + TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible].BoolValue = + DialStringBuilder.Length > 0; + } + else + { + Codec.SendDtmf(i); + DialStringBuilder.Append(i); + DialStringFeedback.FireUpdate(); + // no delete key in this mode! + } } /// @@ -320,5 +371,10 @@ namespace PepperDash.Essentials.UIDrivers.VC DialStringBuilder.Length > 0; TriList.SetBool(UIBoolJoin.VCStagingConnectEnable, DialStringBuilder.Length > 0); } + + enum eKeypadMode + { + Dial, DTMF + } } } \ No newline at end of file diff --git a/Release Package/PepperDashEssentials.cpz b/Release Package/PepperDashEssentials.cpz index feb3c651..6abfc342 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 4a9581ef..ec9a3d7e 100644 Binary files a/Release Package/PepperDashEssentials.dll and b/Release Package/PepperDashEssentials.dll differ