From 1274c748079b1865eefef5cdbccfa11865b5f3e8 Mon Sep 17 00:00:00 2001 From: Heath Volmer Date: Mon, 2 Oct 2017 15:26:12 -0600 Subject: [PATCH] Premerge call history --- .../VideoCodec/MockVC/MockVC.cs | 23 ++++++++++- .../EsentialsRoomEmergencyContactClosure.cs | 8 +++- .../UI/JoinConstants/UISmartObjectJoin.cs | 12 ++++++ .../UI/JoinConstants/UIStringlJoin.cs | 5 +++ .../VC/EssentialsVideoCodecUiDriver.cs | 39 +++++++++++++++++- Release Package/PepperDashEssentials.cpz | Bin 2535907 -> 2536356 bytes Release Package/PepperDashEssentials.dll | Bin 218808 -> 219832 bytes 7 files changed, 83 insertions(+), 4 deletions(-) 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 65e60530..e66dd56b 100644 --- a/Essentials Devices Common/Essentials Devices Common/VideoCodec/MockVC/MockVC.cs +++ b/Essentials Devices Common/Essentials Devices Common/VideoCodec/MockVC/MockVC.cs @@ -11,7 +11,7 @@ using PepperDash.Essentials.Devices.Common.Codec; namespace PepperDash.Essentials.Devices.Common.VideoCodec { - public class MockVC : VideoCodecBase, IRoutingSource + public class MockVC : VideoCodecBase, IRoutingSource, IHasCallHistory { public RoutingInputPort CodecOsdIn { get; private set; } public RoutingInputPort HdmiIn1 { get; private set; } @@ -43,6 +43,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec InputPorts.Add(HdmiIn2); OutputPorts.Add(HdmiOut); + CallHistory = new CodecCallHistory(); + for (int i = 0; i < 10; i++) + { + var call = new CodecCallHistory.CallHistoryEntry(); + call.Name = "Call " + i; + call.Number = i + "@call.com"; + CallHistory.RecentCalls.Add(call); + } + // eventually fire history event here + SetIsReady(); } @@ -302,6 +312,17 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec Debug.Console(1, this, "TestFarEndHangup"); } + + #region IHasCallHistory Members + + public CodecCallHistory CallHistory { get; private set; } + + public void RemoveCallHistoryEntry(CodecCallHistory.CallHistoryEntry entry) + { + + } + + #endregion } /// diff --git a/Essentials/PepperDashEssentials/Room/Emergency/EsentialsRoomEmergencyContactClosure.cs b/Essentials/PepperDashEssentials/Room/Emergency/EsentialsRoomEmergencyContactClosure.cs index 330cb250..09e09bda 100644 --- a/Essentials/PepperDashEssentials/Room/Emergency/EsentialsRoomEmergencyContactClosure.cs +++ b/Essentials/PepperDashEssentials/Room/Emergency/EsentialsRoomEmergencyContactClosure.cs @@ -37,8 +37,12 @@ namespace PepperDash.Essentials.Room if (config.Trigger.Type.Equals("contact", StringComparison.OrdinalIgnoreCase)) { - if (config.Trigger.Number <= cs.NumberOfDigitalInputPorts) - cs.DigitalInputPorts[(uint)config.Trigger.Number].StateChange += new DigitalInputEventHandler(EsentialsRoomEmergencyContactClosure_StateChange); + var portNum = (uint)config.Trigger.Number; + if (portNum <= cs.NumberOfDigitalInputPorts) + { + cs.DigitalInputPorts[portNum].Register(); + cs.DigitalInputPorts[portNum].StateChange += EsentialsRoomEmergencyContactClosure_StateChange; + } } Behavior = config.Behavior; TriggerOnClose = config.Trigger.TriggerOnClose; diff --git a/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs b/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs index 207a7162..3ea7c07d 100644 --- a/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs +++ b/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs @@ -16,7 +16,19 @@ /// public const uint VCDialKeypad = 1201; + /// + /// 1202 + /// public const uint VCDirectoryList = 1202; + /// + /// 1203 + /// + public const uint VCRecentsList = 1203; + /// + /// 1204 + /// + public const uint VCFavoritesList = 1204; + //****************************************************** // General diff --git a/Essentials/PepperDashEssentials/UI/JoinConstants/UIStringlJoin.cs b/Essentials/PepperDashEssentials/UI/JoinConstants/UIStringlJoin.cs index b38188c9..e337b37b 100644 --- a/Essentials/PepperDashEssentials/UI/JoinConstants/UIStringlJoin.cs +++ b/Essentials/PepperDashEssentials/UI/JoinConstants/UIStringlJoin.cs @@ -20,6 +20,11 @@ namespace PepperDash.Essentials /// public const uint CodecAddressEntryText = 1001; + /// + /// 1201 - 1230 range of joins for recents list + /// + public const uint VCRecentListTextStart = 1201; + //****************************************************** // Keyboard diff --git a/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs b/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs index 53ea6eeb..53a40bb4 100644 --- a/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs +++ b/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs @@ -58,6 +58,8 @@ namespace PepperDash.Essentials.UIDrivers.VC SubpageReferenceList ActiveCallsSRL; + SmartObjectDynamicList RecentCallsList; + // These are likely temp until we get a keyboard built StringFeedback DialStringFeedback; StringBuilder DialStringBuilder = new StringBuilder(); @@ -82,6 +84,7 @@ namespace PepperDash.Essentials.UIDrivers.VC SetupCallStagingPopover(); SetupDialKeypad(); ActiveCallsSRL = new SubpageReferenceList(TriList, UISmartObjectJoin.CodecActiveCallsHeaderList, 3, 3, 3); + SetupRecentCallsList(); codec.CallStatusChange += new EventHandler(Codec_CallStatusChange); @@ -333,6 +336,40 @@ namespace PepperDash.Essentials.UIDrivers.VC TriList.ID, UISmartObjectJoin.VCDialKeypad); } + /// + /// + /// + void SetupRecentCallsList() + { + var codec = Codec as IHasCallHistory; + if (codec != null) + { + // EVENT??????????????? Pointed at refresh + RefreshRecentCallsList(); + } + } + + /// + /// + /// + void RefreshRecentCallsList() + { + var codec = Codec as IHasCallHistory; + if (codec != null) + { + RecentCallsList = new SmartObjectDynamicList(TriList.SmartObjects[UISmartObjectJoin.VCRecentsList], true, 1200); + ushort i = 0; + foreach (var c in codec.CallHistory.RecentCalls) + { + i++; + RecentCallsList.SetItemMainText(i, c.Name); + var call = c; // for lambda scope + RecentCallsList.SetItemButtonAction(i, b => { if(!b) Codec.Dial(call.Number); }); + } + RecentCallsList.Count = i; + } + } + /// /// /// @@ -404,7 +441,7 @@ namespace PepperDash.Essentials.UIDrivers.VC void ShowRecents() { //populate recents - VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible); + VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCRecentsVisible); StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingRecentsPress); } diff --git a/Release Package/PepperDashEssentials.cpz b/Release Package/PepperDashEssentials.cpz index a9eaa48fd8ee8fc98d664b62147a1af5ae05d924..b9ba95a18f161c673080cd0d68fa9b25fd465361 100644 GIT binary patch delta 248198 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