diff --git a/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs b/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs
index 14fa93e1..906136b4 100644
--- a/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs
+++ b/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs
@@ -454,7 +454,8 @@ namespace PepperDash.Essentials
else
{
Debug.Console(1, this, "sourceListKey present but not yet implemented");
- throw new NotImplementedException();
+
+ RunRouteAction(routeKey, new Action(() => { }));
}
}
@@ -471,7 +472,11 @@ namespace PepperDash.Essentials
RunRouteAction(routeKey, successCallback);
}
else
- throw new NotImplementedException();
+ {
+ Debug.Console(1, this, "sourceListKey present but not yet implemented");
+
+ RunRouteAction(routeKey, successCallback);
+ }
}
///
diff --git a/PepperDashEssentials/UI/JoinConstants/UIBoolJoin.cs b/PepperDashEssentials/UI/JoinConstants/UIBoolJoin.cs
index aaecb81a..81be9002 100644
--- a/PepperDashEssentials/UI/JoinConstants/UIBoolJoin.cs
+++ b/PepperDashEssentials/UI/JoinConstants/UIBoolJoin.cs
@@ -752,10 +752,10 @@ namespace PepperDash.Essentials
/// 15044 Close button for source modal overlay
///
public const uint SourceBackgroundOverlayClosePress = 15044;
- ///
- /// 15045 - Visibility for the bar containing call navigation button list
- ///
- public const uint CallStagingBarVisible = 15045;
+ /////
+ ///// 15045 - Visibility for the bar containing call navigation button list
+ /////
+ //public const uint CallStagingBarVisible = 15045;
///
/// 15046
///
diff --git a/PepperDashEssentials/UIDrivers/EssentialsHuddle/EssentialsHuddleTechPageDriver.cs b/PepperDashEssentials/UIDrivers/EssentialsHuddle/EssentialsHuddleTechPageDriver.cs
index 776e1034..57aed03e 100644
--- a/PepperDashEssentials/UIDrivers/EssentialsHuddle/EssentialsHuddleTechPageDriver.cs
+++ b/PepperDashEssentials/UIDrivers/EssentialsHuddle/EssentialsHuddleTechPageDriver.cs
@@ -1,326 +1,326 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Text.RegularExpressions;
-using Crestron.SimplSharp;
-using Crestron.SimplSharpPro.DeviceSupport;
-
-using PepperDash.Core;
-using PepperDash.Essentials;
-using PepperDash.Essentials.Core;
-using PepperDash.Essentials.Core.Config;
-using PepperDash.Essentials.Core.SmartObjects;
-using PepperDash.Essentials.Core.Touchpanels.Keyboards;
-using PepperDash.Essentials.Devices.Displays;
-using PepperDash.Essentials.Room.Config;
-
-namespace PepperDash.Essentials.UIDrivers
-{
- public class EssentialsHuddleTechPageDriver : PanelDriverBase
- {
- ///
- ///
- ///
- SmartObjectDynamicList MenuList;
- ///
- ///
- ///
- SubpageReferenceList StatusList;
- ///
- /// The list of display controls
- ///
- SubpageReferenceList DisplayList;
- ///
- /// References lines in the list against device instances
- ///
- Dictionary StatusListDeviceIndexes;
- ///
- ///
- ///
- JoinedSigInterlock PagesInterlock;
-
- ///
- /// 1
- ///
- public const uint JoinText = 1;
-
- CTimer PinAuthorizedTimer;
-
- EssentialsRoomTechConfig Config;
-
- StringBuilder PinEntryBuilder = new StringBuilder(4);
-
- bool IsAuthorized;
-
- SmartObjectNumeric PinKeypad;
-
- ///
- ///
- ///
- ///
- ///
- public EssentialsHuddleTechPageDriver(BasicTriListWithSmartObject trilist, EssentialsRoomTechConfig config)
- : base(trilist)
- {
- Config = config;
-
- PagesInterlock = new JoinedSigInterlock(trilist);
- PagesInterlock.SetButDontShow(UIBoolJoin.TechSystemStatusVisible);
-
- trilist.SetSigFalseAction(UIBoolJoin.TechExitButton, Hide);
-
- MenuList = new SmartObjectDynamicList(trilist.SmartObjects[UISmartObjectJoin.TechMenuList],
- true, 3100);
-
- MenuList.SetFeedback(1, true); // initial fb
- ushort count = 0;
-
- MenuList.SetItemMainText(1, "System Status");
- MenuList.SetItemButtonAction(1, b => {
- if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechSystemStatusVisible);
- MenuList.SetFeedback(1, true);
- });
-
- MenuList.SetItemMainText(2, "Display Controls");
- MenuList.SetItemButtonAction(2, b => {
- if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechDisplayControlsVisible);
- MenuList.SetFeedback(2, true);
- });
-
- count = 2;
-
- // Don't show panel setup on iPad or xpanel
- if (TriList is Crestron.SimplSharpPro.DeviceSupport.TswFt5Button)
- {
- count++;
- MenuList.SetItemMainText(count, "Panel Setup");
- MenuList.SetItemButtonAction(count, b =>
- {
- if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechPanelSetupVisible);
- MenuList.SetFeedback(count, true);
- });
- }
-
- MenuList.Count = count;
- BuildStatusList();
- BuildDisplayList();
- SetupPinModal();
- }
-
- ///
- ///
- ///
- public override void Show()
- {
- // divert to PIN if we need auth
- if (IsAuthorized)
- {
- // Cancel the auth timer so we don't deauth after coming back in
- if (PinAuthorizedTimer != null)
- PinAuthorizedTimer.Stop();
-
- TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, true);
- PagesInterlock.Show();
- base.Show();
- }
- else
- {
- TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, true);
- }
- }
-
- ///
- ///
- ///
- public override void Hide()
- {
- // Leave it authorized for 60 seconds.
- if (IsAuthorized)
- PinAuthorizedTimer = new CTimer(o => {
- IsAuthorized = false;
- PinAuthorizedTimer = null;
- }, 60000);
- TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, false);
- PagesInterlock.Hide();
- base.Hide();
- }
-
- ///
- /// Wire up the keypad and buttons
- ///
- void SetupPinModal()
- {
- TriList.SetSigFalseAction(UIBoolJoin.PinDialogCancelPress, CancelPinDialog);
- PinKeypad = new SmartObjectNumeric(TriList.SmartObjects[UISmartObjectJoin.TechPinDialogKeypad], true);
- PinKeypad.Digit0.UserObject = new Action(b => { if (b)DialPinDigit('0'); });
- PinKeypad.Digit1.UserObject = new Action(b => { if (b)DialPinDigit('1'); });
- PinKeypad.Digit2.UserObject = new Action(b => { if (b)DialPinDigit('2'); });
- PinKeypad.Digit3.UserObject = new Action(b => { if (b)DialPinDigit('3'); });
- PinKeypad.Digit4.UserObject = new Action(b => { if (b)DialPinDigit('4'); });
- PinKeypad.Digit5.UserObject = new Action(b => { if (b)DialPinDigit('5'); });
- PinKeypad.Digit6.UserObject = new Action(b => { if (b)DialPinDigit('6'); });
- PinKeypad.Digit7.UserObject = new Action(b => { if (b)DialPinDigit('7'); });
- PinKeypad.Digit8.UserObject = new Action(b => { if (b)DialPinDigit('8'); });
- PinKeypad.Digit9.UserObject = new Action(b => { if (b)DialPinDigit('9'); });
- }
-
- ///
- ///
- ///
- ///
- void DialPinDigit(char d)
- {
- PinEntryBuilder.Append(d);
- var len = PinEntryBuilder.Length;
- SetPinDotsFeedback(len);
-
- // check it!
- if (len == 4)
- {
- if (Config.Password == PinEntryBuilder.ToString())
- {
- IsAuthorized = true;
- SetPinDotsFeedback(0);
- TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, false);
- Show();
- }
- else
- {
- SetPinDotsFeedback(0);
- TriList.SetBool(UIBoolJoin.PinDialogErrorVisible, true);
- new CTimer(o =>
- {
- TriList.SetBool(UIBoolJoin.PinDialogErrorVisible, false);
- }, 1500);
- }
-
- PinEntryBuilder.Remove(0, len); // clear it either way
- }
- }
-
- ///
- /// Draws the dots as pin is entered
- ///
- ///
- void SetPinDotsFeedback(int len)
- {
- TriList.SetBool(UIBoolJoin.PinDialogDot1, len >= 1);
- TriList.SetBool(UIBoolJoin.PinDialogDot2, len >= 2);
- TriList.SetBool(UIBoolJoin.PinDialogDot3, len >= 3);
- TriList.SetBool(UIBoolJoin.PinDialogDot4, len == 4);
-
- }
-
- ///
- /// Does what it says
- ///
- void CancelPinDialog()
- {
- PinEntryBuilder.Remove(0, PinEntryBuilder.Length);
- TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, false);
- }
-
-
- ///
- ///
- ///
- void BuildStatusList()
- {
- StatusList = new SubpageReferenceList(TriList, UISmartObjectJoin.TechStatusList, 3, 3, 3);
- StatusListDeviceIndexes = new Dictionary();
- uint i = 0;
- foreach (var d in DeviceManager.AllDevices)
- {
- // make sure it is both ICommunicationMonitor and a Device
- var sd = d as ICommunicationMonitor;
- if (sd == null)
- continue;
- var dd = sd as Device;
- if(dd == null)
- continue;
- i++;
- StatusList.StringInputSig(i, 1).StringValue = dd.Name;
- StatusList.UShortInputSig(i, 1).UShortValue = (ushort)sd.CommunicationMonitor.Status;
- StatusListDeviceIndexes.Add(sd, i);
- sd.CommunicationMonitor.StatusChange += CommunicationMonitor_StatusChange ;
- }
- StatusList.Count = (ushort)i;
- }
-
- ///
- /// Builds the list of display controls
- ///
- void BuildDisplayList()
- {
- DisplayList = new SubpageReferenceList(TriList, UISmartObjectJoin.TechDisplayControlsList, 10, 3, 3);
-
- var devKeys = ConfigReader.ConfigObject.Devices.Where(d =>
- d.Group.Equals("display", StringComparison.OrdinalIgnoreCase)
- || d.Group.Equals("projector", StringComparison.OrdinalIgnoreCase))
- .Select(dd => dd.Key);
- var disps = DeviceManager.AllDevices.Where(d =>
- devKeys.Contains(d.Key));
- ushort i = 0;
- foreach (var disp in disps)
- {
- var display = disp as DisplayBase;
- if (display != null)
- {
- i++;
- DisplayList.StringInputSig(i, 1).StringValue = display.Name;
- DisplayList.GetBoolFeedbackSig(i, 1).SetSigFalseAction(display.PowerOn);
- DisplayList.GetBoolFeedbackSig(i, 2).SetSigFalseAction(display.PowerOff);
- if (display is TwoWayDisplayBase)
- {
- var powerOnSig = DisplayList.BoolInputSig(i, 1);
- (display as TwoWayDisplayBase).PowerIsOnFeedback.LinkInputSig(powerOnSig);
-
- var powerOffSig = DisplayList.BoolInputSig(1, 2);
- (display as TwoWayDisplayBase).PowerIsOnFeedback.LinkComplementInputSig(powerOffSig);
- }
- DisplayList.GetBoolFeedbackSig(i, 3).SetSigFalseAction(() =>
- { if (display is IInputHdmi1) (display as IInputHdmi1).InputHdmi1(); });
- DisplayList.GetBoolFeedbackSig(i, 4).SetSigFalseAction(() =>
- { if (display is IInputHdmi2) (display as IInputHdmi2).InputHdmi2(); });
- DisplayList.GetBoolFeedbackSig(i, 5).SetSigFalseAction(() =>
- { if (display is IInputHdmi3) (display as IInputHdmi3).InputHdmi3(); });
- //DisplayList.GetBoolFeedbackSig(i, 6).SetSigFalseAction(() =>
- //{ if (display is IInputHdmi4) (display as IInputHdmi4).InputHdmi4(); });
- DisplayList.GetBoolFeedbackSig(i, 6).SetSigFalseAction(() =>
- { if (display is IInputDisplayPort1) (display as IInputDisplayPort1).InputDisplayPort1(); });
-
-
- // Figure out some way to provide current input feedback
- if (display is TwoWayDisplayBase)
- {
- (display as TwoWayDisplayBase).CurrentInputFeedback.OutputChange += CurrentInputFeedback_OutputChange;
- }
- }
-
-
- }
-
- DisplayList.Count = i;
- }
-
-
- void CurrentInputFeedback_OutputChange(object sender, EventArgs e)
- {
-
- }
-
- ///
- ///
- ///
- void CommunicationMonitor_StatusChange(object sender, MonitorStatusChangeEventArgs e)
- {
- var c = sender as ICommunicationMonitor;
- if (StatusListDeviceIndexes.ContainsKey(c))
- {
- var i = StatusListDeviceIndexes[c];
- StatusList.UShortInputSig(i, 1).UShortValue = (ushort)e.Status;
- }
- }
- }
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using Crestron.SimplSharp;
+using Crestron.SimplSharpPro.DeviceSupport;
+
+using PepperDash.Core;
+using PepperDash.Essentials;
+using PepperDash.Essentials.Core;
+using PepperDash.Essentials.Core.Config;
+using PepperDash.Essentials.Core.SmartObjects;
+using PepperDash.Essentials.Core.Touchpanels.Keyboards;
+using PepperDash.Essentials.Devices.Displays;
+using PepperDash.Essentials.Room.Config;
+
+namespace PepperDash.Essentials.UIDrivers
+{
+ public class EssentialsHuddleTechPageDriver : PanelDriverBase
+ {
+ ///
+ ///
+ ///
+ SmartObjectDynamicList MenuList;
+ ///
+ ///
+ ///
+ SubpageReferenceList StatusList;
+ ///
+ /// The list of display controls
+ ///
+ SubpageReferenceList DisplayList;
+ ///
+ /// References lines in the list against device instances
+ ///
+ Dictionary StatusListDeviceIndexes;
+ ///
+ ///
+ ///
+ JoinedSigInterlock PagesInterlock;
+
+ ///
+ /// 1
+ ///
+ public const uint JoinText = 1;
+
+ CTimer PinAuthorizedTimer;
+
+ EssentialsRoomTechConfig Config;
+
+ StringBuilder PinEntryBuilder = new StringBuilder(4);
+
+ bool IsAuthorized;
+
+ SmartObjectNumeric PinKeypad;
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public EssentialsHuddleTechPageDriver(BasicTriListWithSmartObject trilist, EssentialsRoomTechConfig config)
+ : base(trilist)
+ {
+ Config = config;
+
+ PagesInterlock = new JoinedSigInterlock(trilist);
+ PagesInterlock.SetButDontShow(UIBoolJoin.TechSystemStatusVisible);
+
+ trilist.SetSigFalseAction(UIBoolJoin.TechExitButton, Hide);
+
+ MenuList = new SmartObjectDynamicList(trilist.SmartObjects[UISmartObjectJoin.TechMenuList],
+ true, 3100);
+
+ MenuList.SetFeedback(1, true); // initial fb
+ ushort count = 0;
+
+ MenuList.SetItemMainText(1, "System Status");
+ MenuList.SetItemButtonAction(1, b => {
+ if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechSystemStatusVisible);
+ MenuList.SetFeedback(1, true);
+ });
+
+ MenuList.SetItemMainText(2, "Display Controls");
+ MenuList.SetItemButtonAction(2, b => {
+ if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechDisplayControlsVisible);
+ MenuList.SetFeedback(2, true);
+ });
+
+ count = 2;
+
+ // Don't show panel setup on iPad or xpanel
+ if (TriList is Crestron.SimplSharpPro.DeviceSupport.TswFt5Button)
+ {
+ count++;
+ MenuList.SetItemMainText(count, "Panel Setup");
+ MenuList.SetItemButtonAction(count, b =>
+ {
+ if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechPanelSetupVisible);
+ MenuList.SetFeedback(count, true);
+ });
+ }
+
+ MenuList.Count = count;
+ BuildStatusList();
+ BuildDisplayList();
+ SetupPinModal();
+ }
+
+ ///
+ ///
+ ///
+ public override void Show()
+ {
+ // divert to PIN if we need auth
+ if (IsAuthorized)
+ {
+ // Cancel the auth timer so we don't deauth after coming back in
+ if (PinAuthorizedTimer != null)
+ PinAuthorizedTimer.Stop();
+
+ TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, true);
+ PagesInterlock.Show();
+ base.Show();
+ }
+ else
+ {
+ TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, true);
+ }
+ }
+
+ ///
+ ///
+ ///
+ public override void Hide()
+ {
+ // Leave it authorized for 60 seconds.
+ if (IsAuthorized)
+ PinAuthorizedTimer = new CTimer(o => {
+ IsAuthorized = false;
+ PinAuthorizedTimer = null;
+ }, 60000);
+ TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, false);
+ PagesInterlock.Hide();
+ base.Hide();
+ }
+
+ ///
+ /// Wire up the keypad and buttons
+ ///
+ void SetupPinModal()
+ {
+ TriList.SetSigFalseAction(UIBoolJoin.PinDialogCancelPress, CancelPinDialog);
+ PinKeypad = new SmartObjectNumeric(TriList.SmartObjects[UISmartObjectJoin.TechPinDialogKeypad], true);
+ PinKeypad.Digit0.UserObject = new Action(b => { if (b)DialPinDigit('0'); });
+ PinKeypad.Digit1.UserObject = new Action(b => { if (b)DialPinDigit('1'); });
+ PinKeypad.Digit2.UserObject = new Action(b => { if (b)DialPinDigit('2'); });
+ PinKeypad.Digit3.UserObject = new Action(b => { if (b)DialPinDigit('3'); });
+ PinKeypad.Digit4.UserObject = new Action(b => { if (b)DialPinDigit('4'); });
+ PinKeypad.Digit5.UserObject = new Action(b => { if (b)DialPinDigit('5'); });
+ PinKeypad.Digit6.UserObject = new Action(b => { if (b)DialPinDigit('6'); });
+ PinKeypad.Digit7.UserObject = new Action(b => { if (b)DialPinDigit('7'); });
+ PinKeypad.Digit8.UserObject = new Action(b => { if (b)DialPinDigit('8'); });
+ PinKeypad.Digit9.UserObject = new Action(b => { if (b)DialPinDigit('9'); });
+ }
+
+ ///
+ ///
+ ///
+ ///
+ void DialPinDigit(char d)
+ {
+ PinEntryBuilder.Append(d);
+ var len = PinEntryBuilder.Length;
+ SetPinDotsFeedback(len);
+
+ // check it!
+ if (len == 4)
+ {
+ if (Config.Password == PinEntryBuilder.ToString())
+ {
+ IsAuthorized = true;
+ SetPinDotsFeedback(0);
+ TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, false);
+ Show();
+ }
+ else
+ {
+ SetPinDotsFeedback(0);
+ TriList.SetBool(UIBoolJoin.PinDialogErrorVisible, true);
+ new CTimer(o =>
+ {
+ TriList.SetBool(UIBoolJoin.PinDialogErrorVisible, false);
+ }, 1500);
+ }
+
+ PinEntryBuilder.Remove(0, len); // clear it either way
+ }
+ }
+
+ ///
+ /// Draws the dots as pin is entered
+ ///
+ ///
+ void SetPinDotsFeedback(int len)
+ {
+ TriList.SetBool(UIBoolJoin.PinDialogDot1, len >= 1);
+ TriList.SetBool(UIBoolJoin.PinDialogDot2, len >= 2);
+ TriList.SetBool(UIBoolJoin.PinDialogDot3, len >= 3);
+ TriList.SetBool(UIBoolJoin.PinDialogDot4, len == 4);
+
+ }
+
+ ///
+ /// Does what it says
+ ///
+ void CancelPinDialog()
+ {
+ PinEntryBuilder.Remove(0, PinEntryBuilder.Length);
+ TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, false);
+ }
+
+
+ ///
+ ///
+ ///
+ void BuildStatusList()
+ {
+ StatusList = new SubpageReferenceList(TriList, UISmartObjectJoin.TechStatusList, 3, 3, 3);
+ StatusListDeviceIndexes = new Dictionary();
+ uint i = 0;
+ foreach (var d in DeviceManager.AllDevices)
+ {
+ // make sure it is both ICommunicationMonitor and a Device
+ var sd = d as ICommunicationMonitor;
+ if (sd == null)
+ continue;
+ var dd = sd as Device;
+ if(dd == null)
+ continue;
+ i++;
+ StatusList.StringInputSig(i, 1).StringValue = dd.Name;
+ StatusList.UShortInputSig(i, 1).UShortValue = (ushort)sd.CommunicationMonitor.Status;
+ StatusListDeviceIndexes.Add(sd, i);
+ sd.CommunicationMonitor.StatusChange += CommunicationMonitor_StatusChange ;
+ }
+ StatusList.Count = (ushort)i;
+ }
+
+ ///
+ /// Builds the list of display controls
+ ///
+ void BuildDisplayList()
+ {
+ DisplayList = new SubpageReferenceList(TriList, UISmartObjectJoin.TechDisplayControlsList, 10, 3, 3);
+
+ var devKeys = ConfigReader.ConfigObject.Devices.Where(d =>
+ d.Group.Equals("display", StringComparison.OrdinalIgnoreCase)
+ || d.Group.Equals("projector", StringComparison.OrdinalIgnoreCase))
+ .Select(dd => dd.Key);
+ var disps = DeviceManager.AllDevices.Where(d =>
+ devKeys.Contains(d.Key));
+ ushort i = 0;
+ foreach (var disp in disps)
+ {
+ var display = disp as DisplayBase;
+ if (display != null)
+ {
+ i++;
+ DisplayList.StringInputSig(i, 1).StringValue = display.Name;
+ DisplayList.GetBoolFeedbackSig(i, 1).SetSigFalseAction(display.PowerOn);
+ DisplayList.GetBoolFeedbackSig(i, 2).SetSigFalseAction(display.PowerOff);
+ if (display is TwoWayDisplayBase)
+ {
+ var powerOnSig = DisplayList.BoolInputSig(i, 1);
+ (display as TwoWayDisplayBase).PowerIsOnFeedback.LinkInputSig(powerOnSig);
+
+ var powerOffSig = DisplayList.BoolInputSig(1, 2);
+ (display as TwoWayDisplayBase).PowerIsOnFeedback.LinkComplementInputSig(powerOffSig);
+ }
+ DisplayList.GetBoolFeedbackSig(i, 3).SetSigFalseAction(() =>
+ { if (display is IInputHdmi1) (display as IInputHdmi1).InputHdmi1(); });
+ DisplayList.GetBoolFeedbackSig(i, 4).SetSigFalseAction(() =>
+ { if (display is IInputHdmi2) (display as IInputHdmi2).InputHdmi2(); });
+ DisplayList.GetBoolFeedbackSig(i, 5).SetSigFalseAction(() =>
+ { if (display is IInputHdmi3) (display as IInputHdmi3).InputHdmi3(); });
+ //DisplayList.GetBoolFeedbackSig(i, 6).SetSigFalseAction(() =>
+ //{ if (display is IInputHdmi4) (display as IInputHdmi4).InputHdmi4(); });
+ DisplayList.GetBoolFeedbackSig(i, 6).SetSigFalseAction(() =>
+ { if (display is IInputDisplayPort1) (display as IInputDisplayPort1).InputDisplayPort1(); });
+
+
+ // Figure out some way to provide current input feedback
+ if (display is TwoWayDisplayBase)
+ {
+ (display as TwoWayDisplayBase).CurrentInputFeedback.OutputChange += CurrentInputFeedback_OutputChange;
+ }
+ }
+
+
+ }
+
+ DisplayList.Count = i;
+ }
+
+
+ void CurrentInputFeedback_OutputChange(object sender, EventArgs e)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ void CommunicationMonitor_StatusChange(object sender, MonitorStatusChangeEventArgs e)
+ {
+ var c = sender as ICommunicationMonitor;
+ if (c != null && StatusListDeviceIndexes.ContainsKey(c))
+ {
+ var i = StatusListDeviceIndexes[c];
+ StatusList.UShortInputSig(i, 1).UShortValue = (ushort)e.Status;
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/EssentialsHuddleVtc1PanelAvFunctionsDriver.cs b/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/EssentialsHuddleVtc1PanelAvFunctionsDriver.cs
index d2978c44..0e132ce6 100644
--- a/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/EssentialsHuddleVtc1PanelAvFunctionsDriver.cs
+++ b/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/EssentialsHuddleVtc1PanelAvFunctionsDriver.cs
@@ -173,10 +173,28 @@ namespace PepperDash.Essentials
///
public PepperDash.Essentials.Core.Touchpanels.Keyboards.HabaneroKeyboardController Keyboard { get; private set; }
+
+ private UiDisplayMode _currentMode;
+
///
/// The mode showing. Presentation or call.
///
- UiDisplayMode CurrentMode = UiDisplayMode.Start;
+ UiDisplayMode CurrentMode
+ {
+ get
+ {
+ return _currentMode;
+ }
+ set
+ {
+ if (value != _currentMode)
+ {
+ _currentMode = value;
+
+ SetActivityFooterFeedbacks();
+ }
+ }
+ }
CTimer NextMeetingTimer;
@@ -207,6 +225,7 @@ namespace PepperDash.Essentials
MeetingOrContactMethodModalSrl = new SubpageReferenceList(TriList, UISmartObjectJoin.MeetingListSRL, 3, 3, 5);
+ CurrentMode = UiDisplayMode.Start;
// buttons are added in SetCurrentRoom
//HeaderButtonsList = new SmartObjectHeaderButtonList(TriList.SmartObjects[UISmartObjectJoin.HeaderButtonList]);
@@ -607,11 +626,21 @@ namespace PepperDash.Essentials
///
void SetActivityFooterFeedbacks()
{
- CallButtonSig.BoolValue = CurrentMode == UiDisplayMode.Call
- && CurrentRoom.ShutdownType == eShutdownType.None;
- ShareButtonSig.BoolValue = CurrentMode == UiDisplayMode.Presentation
- && CurrentRoom.ShutdownType == eShutdownType.None;
- EndMeetingButtonSig.BoolValue = CurrentRoom.ShutdownType != eShutdownType.None;
+ if (CurrentRoom != null)
+ {
+ var startMode = CurrentMode == UiDisplayMode.Start;
+ var presentationMode = CurrentMode == UiDisplayMode.Presentation;
+ var callMode = CurrentMode == UiDisplayMode.Call;
+
+ TriList.SetBool(StartPageVisibleJoin, startMode ? true : false);
+ TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, presentationMode ? true : false);
+
+ CallButtonSig.BoolValue = callMode
+ && CurrentRoom.ShutdownType == eShutdownType.None;
+ ShareButtonSig.BoolValue = presentationMode
+ && CurrentRoom.ShutdownType == eShutdownType.None;
+ EndMeetingButtonSig.BoolValue = CurrentRoom.ShutdownType != eShutdownType.None;
+ }
}
///
@@ -623,14 +652,13 @@ namespace PepperDash.Essentials
return;
HideLogo();
HideNextMeetingPopup();
- TriList.SetBool(StartPageVisibleJoin, false);
- TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, false);
- TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
+ //TriList.SetBool(StartPageVisibleJoin, false);
+ //TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, false);
+ //TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
if (CurrentSourcePageManager != null)
CurrentSourcePageManager.Hide();
PowerOnFromCall();
CurrentMode = UiDisplayMode.Call;
- SetActivityFooterFeedbacks();
VCDriver.Show();
}
@@ -643,9 +671,6 @@ namespace PepperDash.Essentials
if (VCDriver.IsVisible)
VCDriver.Hide();
HideNextMeetingPopup();
- TriList.SetBool(StartPageVisibleJoin, false);
- TriList.SetBool(UIBoolJoin.CallStagingBarVisible, false);
- TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, true);
// Run default source when room is off and share is pressed
if (!CurrentRoom.OnFeedback.BoolValue)
{
@@ -665,7 +690,6 @@ namespace PepperDash.Essentials
}
CurrentMode = UiDisplayMode.Presentation;
SetupSourceList();
- SetActivityFooterFeedbacks();
}
///
@@ -707,6 +731,8 @@ namespace PepperDash.Essentials
if (CurrentRoom.CurrentSourceInfo == null)
return;
+ CurrentMode = UiDisplayMode.Presentation;
+
if (CurrentRoom.CurrentSourceInfo.SourceDevice == null)
{
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
@@ -1218,9 +1244,8 @@ namespace PepperDash.Essentials
VCDriver.Hide();
SetupActivityFooterWhenRoomOff();
ShowLogo();
- SetActivityFooterFeedbacks();
- TriList.BooleanInput[UIBoolJoin.VolumeDualMute1Visible].BoolValue = false;
- TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue = false;
+ //TriList.BooleanInput[UIBoolJoin.VolumeDualMute1Visible].BoolValue = false;
+ //TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue = false;
// Clear this so that the pesky meeting warning can resurface every minute when off
LastMeetingDismissedId = null;
}
diff --git a/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs b/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs
index 9159381e..e6aa1b7d 100644
--- a/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs
+++ b/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs
@@ -787,12 +787,14 @@ namespace PepperDash.Essentials.UIDrivers.VC
if (camerasCodec != null && camerasCodec.SelectedCamera != null)
{
-
+ Debug.Console(2, "Attempting to map camera actions to selected camera: '{0}'", camerasCodec.SelectedCamera.Key);
var dpad = CameraPtzPad;
var camera = camerasCodec.SelectedCamera as IHasCameraPtzControl;
if (camera != null)
{
+
+ Debug.Console(2, "Selected camera is IHasCameraPtzControl");
if (camerasCodec.SelectedCamera.CanTilt)
{
dpad.SigUp.SetBoolSigAction((b) =>
@@ -857,6 +859,14 @@ namespace PepperDash.Essentials.UIDrivers.VC
}
}
+ else
+ {
+ Debug.Console(2, "Selected Camera is not IHasCameraPtzControl. No controls to map");
+ }
+ }
+ else
+ {
+ Debug.Console(2, "Codec does not have cameras of selected camera is null");
}
}
@@ -1036,22 +1046,21 @@ namespace PepperDash.Essentials.UIDrivers.VC
void SetupDirectoryList()
{
var codec = Codec as IHasDirectory;
- if (codec != null)
- {
- DirectoryList = new SmartObjectDynamicList(TriList.SmartObjects[UISmartObjectJoin.VCDirectoryList],
- true, 1300);
- codec.DirectoryResultReturned += new EventHandler(dir_DirectoryResultReturned);
+ if (codec == null)
+ {
+ return;
+ }
- if (codec.PhonebookSyncState.InitialSyncComplete)
- SetCurrentDirectoryToRoot();
- else
- {
- codec.PhonebookSyncState.InitialSyncCompleted += new EventHandler(PhonebookSyncState_InitialSyncCompleted);
- }
+ DirectoryList = new SmartObjectDynamicList(TriList.SmartObjects[UISmartObjectJoin.VCDirectoryList],
+ true, 1300);
+ codec.DirectoryResultReturned += dir_DirectoryResultReturned;
- RefreshDirectory();
-
- }
+ if (codec.PhonebookSyncState.InitialSyncComplete)
+ SetCurrentDirectoryToRoot();
+ else
+ {
+ codec.PhonebookSyncState.InitialSyncCompleted += PhonebookSyncState_InitialSyncCompleted;
+ }
}
///
@@ -1059,11 +1068,15 @@ namespace PepperDash.Essentials.UIDrivers.VC
///
void SetCurrentDirectoryToRoot()
{
- (Codec as IHasDirectory).SetCurrentDirectoryToRoot();
+ var hasDirectory = Codec as IHasDirectory;
+ if (hasDirectory == null)
+ {
+ return;
+ }
+
+ hasDirectory.SetCurrentDirectoryToRoot();
SearchKeypadClear();
-
- RefreshDirectory();
}
///
@@ -1075,10 +1088,17 @@ namespace PepperDash.Essentials.UIDrivers.VC
{
var codec = Codec as IHasDirectory;
- SetCurrentDirectoryToRoot();
+ if (codec == null)
+ {
+ return;
+ }
- RefreshDirectory();
-
+ if (!codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue)
+ {
+ return;
+ }
+
+ SetCurrentDirectoryToRoot();
}
///
@@ -1088,8 +1108,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
///
void dir_DirectoryResultReturned(object sender, DirectoryEventArgs e)
{
-
- RefreshDirectory();
+ RefreshDirectory(e.Directory);
}
///
@@ -1118,16 +1137,27 @@ namespace PepperDash.Essentials.UIDrivers.VC
}
- ///
- ///
- ///
- ///
- void RefreshDirectory()
+ ///
+ ///
+ ///
+ void RefreshDirectory()
{
- if ((Codec as IHasDirectory).CurrentDirectoryResult.CurrentDirectoryResults.Count > 0)
+ var codec = Codec as IHasDirectory;
+
+ if (codec == null)
+ {
+ return;
+ }
+
+ RefreshDirectory(codec.CurrentDirectoryResult);
+ }
+
+ void RefreshDirectory(CodecDirectory directory)
+ {
+ if (directory.CurrentDirectoryResults.Count > 0)
{
ushort i = 0;
- foreach (var r in (Codec as IHasDirectory).CurrentDirectoryResult.CurrentDirectoryResults)
+ foreach (var r in directory.CurrentDirectoryResults)
{
if (i == DirectoryList.MaxCount)
{
@@ -1147,19 +1177,33 @@ namespace PepperDash.Essentials.UIDrivers.VC
// If more than one contact method, show contact method modal dialog
DirectoryList.SetItemButtonAction(i, b =>
{
- if (!b)
+ if (b)
{
- // Refresh the contact methods list
- RefreshContactMethodsModalList(dc);
- Parent.PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.MeetingsOrContacMethodsListVisible);
+ return;
}
+ // Refresh the contact methods list
+ RefreshContactMethodsModalList(dc);
+ Parent.PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.MeetingsOrContacMethodsListVisible);
});
}
+ else if (dc.ContactMethods.Count == 1)
+ {
+ var invitableContact = dc as IInvitableContact;
+
+ if (invitableContact != null)
+ {
+ DirectoryList.SetItemButtonAction(i, b => { if (!b) Codec.Dial(invitableContact); });
+ }
+ else
+ {
+ // If only one contact method, just dial that method
+ DirectoryList.SetItemButtonAction(i, b => { if (!b) Codec.Dial(dc.ContactMethods[0].Number); });
+ }
+ }
else
{
- // If only one contact method, just dial that method
- DirectoryList.SetItemButtonAction(i, b => { if (!b) Codec.Dial(dc.ContactMethods[0].Number); });
+ Debug.Console(1, "Unable to dial contact. No availble ContactMethod(s) specified");
}
}
else // is DirectoryFolder
@@ -1186,8 +1230,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
DirectoryList.SetItemMainText(1, "No Results Found");
}
-
- }
+ }
void RefreshContactMethodsModalList(DirectoryContact contact)
{
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraBase.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraBase.cs
index def22069..18a1ad36 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraBase.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraBase.cs
@@ -216,21 +216,11 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
var presetsCamera = cameraDevice as IHasCameraPresets;
presetsCamera.PresetsListHasChanged += new EventHandler((o, a) =>
{
- for (int i = 1; i <= joinMap.NumberOfPresets.JoinNumber; i++)
- {
- int tempNum = i - 1;
-
- string label = "";
-
- var preset = presetsCamera.Presets.FirstOrDefault(p => p.ID.Equals(i));
-
- if (preset != null)
- label = preset.Description;
-
- trilist.SetString((ushort) (joinMap.PresetLabelStart.JoinNumber + tempNum), label);
- }
+ SendCameraPresetNamesToApi(presetsCamera, joinMap, trilist);
});
+ SendCameraPresetNamesToApi(presetsCamera, joinMap, trilist);
+
for (int i = 0; i < joinMap.NumberOfPresets.JoinNumber; i++)
{
int tempNum = i;
@@ -246,10 +236,35 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
presetsCamera.PresetStore(tempNum, label);
});
}
+ trilist.OnlineStatusChange += (sender, args) =>
+ {
+ if (!args.DeviceOnLine)
+ { return; }
+
+ SendCameraPresetNamesToApi(presetsCamera, joinMap, trilist);
+ };
+
+ }
+ }
+ private void SendCameraPresetNamesToApi(IHasCameraPresets presetsCamera, CameraControllerJoinMap joinMap, BasicTriList trilist)
+ {
+ for (int i = 1; i <= joinMap.NumberOfPresets.JoinNumber; i++)
+ {
+ int tempNum = i - 1;
+
+ string label = "";
+
+ var preset = presetsCamera.Presets.FirstOrDefault(p => p.ID.Equals(i));
+
+ if (preset != null)
+ label = preset.Description;
+
+ trilist.SetString((ushort)(joinMap.PresetLabelStart.JoinNumber + tempNum), label);
}
}
}
+
public class CameraPreset : PresetBase
{
public CameraPreset(int id, string description, bool isDefined, bool isDefinable)
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraVisca.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraVisca.cs
index fb8ae79c..6acf5850 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraVisca.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraVisca.cs
@@ -525,6 +525,15 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
public event EventHandler PresetsListHasChanged;
+ protected void OnPresetsListHasChanged()
+ {
+ var handler = PresetsListHasChanged;
+ if (handler == null)
+ return;
+
+ handler.Invoke(this, EventArgs.Empty);
+ }
+
public List Presets { get; private set; }
public void PresetSelect(int preset)
@@ -537,6 +546,7 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
SavePreset(preset);
}
+
#endregion
#region IHasCameraFocusControl Members
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Codec/iHasDirectory.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Codec/iHasDirectory.cs
index 3a59b62d..29a46466 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Codec/iHasDirectory.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Codec/iHasDirectory.cs
@@ -69,6 +69,22 @@ namespace PepperDash.Essentials.Devices.Common.Codec
[JsonProperty("directoryResults")]
public List CurrentDirectoryResults { get; private set; }
+ public List Contacts
+ {
+ get
+ {
+ return CurrentDirectoryResults.OfType().Cast().ToList();
+ }
+ }
+
+ public List Folders
+ {
+ get
+ {
+ return CurrentDirectoryResults.OfType().Cast().ToList();
+ }
+ }
+
///
/// Used to store the ID of the current folder for CurrentDirectoryResults
///
@@ -104,6 +120,15 @@ namespace PepperDash.Essentials.Devices.Common.Codec
SortDirectory();
}
+ ///
+ /// Filters the CurrentDirectoryResults by the predicate
+ ///
+ ///
+ public void FilterContacts(Func predicate)
+ {
+ CurrentDirectoryResults = CurrentDirectoryResults.Where(predicate).ToList();
+ }
+
///
/// Sorts the DirectoryResults list to display all folders alphabetically, then all contacts alphabetically
///
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/InputInterfaces.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/InputInterfaces.cs
index d984f523..95070e1b 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/InputInterfaces.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Display/InputInterfaces.cs
@@ -1,17 +1,17 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-
-namespace PepperDash.Essentials.Devices.Displays
-{
- public interface IInputHdmi1 { void InputHdmi1(); }
- public interface IInputHdmi2 { void InputHdmi2(); }
- public interface IInputHdmi3 { void InputHdmi3(); }
- public interface IInputHdmi4 { void InputHdmi4(); }
- public interface IInputDisplayPort1 { void InputDisplayPort1(); }
- public interface IInputDisplayPort2 { void InputDisplayPort2(); }
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Essentials.Devices.Displays
+{
+ public interface IInputHdmi1 { void InputHdmi1(); }
+ public interface IInputHdmi2 { void InputHdmi2(); }
+ public interface IInputHdmi3 { void InputHdmi3(); }
+ public interface IInputHdmi4 { void InputHdmi4(); }
+ public interface IInputDisplayPort1 { void InputDisplayPort1(); }
+ public interface IInputDisplayPort2 { void InputDisplayPort2(); }
public interface IInputVga1 { void InputVga1(); }
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ResponseObjects.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ResponseObjects.cs
index 708abe34..c116a4a8 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ResponseObjects.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ResponseObjects.cs
@@ -276,6 +276,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
if (zoomRooms.Count > 0)
{
// If so, setup a rooms and contacts folder and add them.
+
+ directory.ResultsFolderId = "root";
+
roomFolder.Name = "Rooms";
roomFolder.ParentFolderId = "root";
roomFolder.FolderId = "rooms";
@@ -292,22 +295,26 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
try
{
- if (zoomContacts.Count == 0) return directory;
+ if (zoomContacts.Count == 0)
+ {
+ return directory;
+ }
+
+ foreach (Contact c in zoomContacts)
{
- foreach (Contact c in zoomContacts)
+ var contact = new ZoomDirectoryContact { Name = c.ScreenName, ContactId = c.Jid };
+
+ contact.ContactMethods.Add(new ContactMethod() { Number = c.Jid, Device = eContactMethodDevice.Video, CallType = eContactMethodCallType.Video, ContactMethodId = c.Jid });
+
+ if (folders.Count > 0)
{
- var contact = new ZoomDirectoryContact { Name = c.ScreenName, ContactId = c.Jid };
-
- if (folders.Count > 0)
- {
- contact.ParentFolderId = c.IsZoomRoom ? "rooms" : "contacts";
- }
-
- contacts.Add(contact);
+ contact.ParentFolderId = c.IsZoomRoom ? "rooms" : "contacts";
}
- directory.AddContactsToDirectory(contacts);
+ contacts.Add(contact);
}
+
+ directory.AddContactsToDirectory(contacts);
}
catch (Exception e)
{
@@ -1161,11 +1168,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
}
set
{
- if (value != _hideConfSelfVideo)
- {
+ //if (value != _hideConfSelfVideo)
+ //{
_hideConfSelfVideo = value;
NotifyPropertyChanged("HideConfSelfVideo");
- }
+ //}
}
}
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs
index 75569f12..5df53635 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs
@@ -157,7 +157,18 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{
get
{
- return () => CrestronEnvironment.ScaleWithLimits(Configuration.Audio.Output.Volume, 100, 0, 65535, 0);
+ return () =>
+ {
+ var scaledVol = CrestronEnvironment.ScaleWithLimits(Configuration.Audio.Output.Volume, 100, 0, 65535, 0);
+
+ if (Configuration.Audio.Output.Volume != 0)
+ {
+ Debug.Console(2, this, "Storing previous volume level as: {0}, scaled: {1}", Configuration.Audio.Output.Volume, scaledVol);
+ _previousVolumeLevel = scaledVol; // Store the previous level for recall
+ }
+
+ return scaledVol;
+ };
}
}
@@ -281,7 +292,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
var handler = CameraSelected;
if (handler != null)
{
- handler(this, new CameraSelectedEventArgs(SelectedCamera));
+ handler(this, new CameraSelectedEventArgs(_selectedCamera));
}
}
}
@@ -318,6 +329,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
public BoolFeedback SelfviewIsOnFeedback { get; private set; }
+ public void GetSelfViewMode()
+ {
+ SendText("zConfiguration Video hide_conf_self_video");
+ }
+
public void SelfViewModeOn()
{
SendText("zConfiguration Video hide_conf_self_video: off");
@@ -350,6 +366,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
public CodecDirectory CurrentDirectoryResult
{
get { return _currentDirectoryResult; }
+ private set
+ {
+ _currentDirectoryResult = value;
+
+ Debug.Console(2, this, "CurrentDirectoryResult Updated. ResultsFolderId: {0}", _currentDirectoryResult.ResultsFolderId);
+
+ CurrentDirectoryResultIsNotDirectoryRoot.FireUpdate();
+
+ OnDirectoryResultReturned(_currentDirectoryResult);
+ }
}
public CodecPhonebookSyncState PhonebookSyncState { get; private set; }
@@ -363,9 +389,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
c => c.Name.IndexOf(searchString, 0, StringComparison.OrdinalIgnoreCase) > -1));
DirectoryBrowseHistoryStack.Clear();
- _currentDirectoryResult = directoryResults;
+ CurrentDirectoryResult = directoryResults;
- OnDirectoryResultReturned(directoryResults);
}
public void GetDirectoryFolderContents(string folderId)
@@ -377,19 +402,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
DirectoryBrowseHistoryStack.Push(_currentDirectoryResult);
- _currentDirectoryResult = directoryResults;
+ CurrentDirectoryResult = directoryResults;
- OnDirectoryResultReturned(directoryResults);
}
public void SetCurrentDirectoryToRoot()
{
DirectoryBrowseHistoryStack.Clear();
- _currentDirectoryResult = DirectoryRoot;
-
- OnDirectoryResultReturned(DirectoryRoot);
- }
+ CurrentDirectoryResult = DirectoryRoot;
+ }
public void GetDirectoryParentFolderContents()
{
@@ -400,10 +422,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
var currentDirectory = DirectoryBrowseHistoryStack.Pop();
- _currentDirectoryResult = currentDirectory;
-
- OnDirectoryResultReturned(currentDirectory);
- }
+ CurrentDirectoryResult = currentDirectory;
+ }
public BoolFeedback CurrentDirectoryResultIsNotDirectoryRoot { get; private set; }
@@ -669,16 +689,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
private void SetUpDirectory()
{
- DirectoryRoot = new CodecDirectory();
+ DirectoryRoot = new CodecDirectory() { ResultsFolderId = "root" };
- _currentDirectoryResult = DirectoryRoot;
+ CurrentDirectoryResultIsNotDirectoryRoot = new BoolFeedback(() => CurrentDirectoryResult.ResultsFolderId != "root");
+
+ CurrentDirectoryResult = DirectoryRoot;
DirectoryBrowseHistory = new List();
DirectoryBrowseHistoryStack = new Stack();
- CurrentDirectoryResultIsNotDirectoryRoot = new BoolFeedback(() => _currentDirectoryResult != DirectoryRoot);
-
- CurrentDirectoryResultIsNotDirectoryRoot.FireUpdate();
}
private void SetUpRouting()
@@ -1052,24 +1071,30 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
}
case "phonebooklistresult":
{
+ // This result will always be the complete contents of the directory and never
+ // A subset of the results via a search
+
JsonConvert.PopulateObject(responseObj.ToString(), Status.Phonebook);
+ var directoryResults =
+ zStatus.Phonebook.ConvertZoomContactsToGeneric(Status.Phonebook.Contacts);
+
if (!PhonebookSyncState.InitialSyncComplete)
{
PhonebookSyncState.InitialPhonebookFoldersReceived();
PhonebookSyncState.PhonebookRootEntriesReceived();
- PhonebookSyncState.SetPhonebookHasFolders(false);
+ PhonebookSyncState.SetPhonebookHasFolders(true);
PhonebookSyncState.SetNumberOfContacts(Status.Phonebook.Contacts.Count);
}
- var directoryResults =
- zStatus.Phonebook.ConvertZoomContactsToGeneric(Status.Phonebook.Contacts);
+ if (directoryResults.ResultsFolderId != "root")
+ {
+ directoryResults.ResultsFolderId = "root";
+ }
- DirectoryRoot = directoryResults;
+ DirectoryRoot = directoryResults;
- _currentDirectoryResult = DirectoryRoot;
-
- OnDirectoryResultReturned(directoryResults);
+ CurrentDirectoryResult = directoryResults;
break;
}
@@ -1225,7 +1250,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{
Direction = eCodecCallDirection.Incoming,
Status = eCodecCallStatus.Ringing,
- Type = eCodecCallType.Unknown,
+ Type = eCodecCallType.Video,
Name = incomingCall.callerName,
Id = incomingCall.callerJID
};
@@ -1578,8 +1603,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
var newCall = new CodecActiveCallItem
{
Name = Status.Call.Info.meeting_list_item.meetingName,
+ Number = Status.Call.Info.meeting_id,
Id = Status.Call.Info.meeting_id,
- Status = newStatus
+ Status = newStatus,
+ Type = eCodecCallType.Video,
};
ActiveCalls.Add(newCall);
@@ -1693,12 +1720,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
public override void MuteOff()
{
+ Debug.Console(2, this, "Unmuting to previous level: {0}", _previousVolumeLevel);
SetVolume((ushort)_previousVolumeLevel);
}
public override void MuteOn()
{
- _previousVolumeLevel = Configuration.Audio.Output.Volume; // Store the previous level for recall
SetVolume(0);
}
@@ -1997,18 +2024,43 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
///
private void OnDirectoryResultReturned(CodecDirectory result)
{
- CurrentDirectoryResultIsNotDirectoryRoot.FireUpdate();
+ try
+ {
+ Debug.Console(2, this, "OnDirectoryResultReturned");
- // This will return the latest results to all UIs. Multiple indendent UI Directory browsing will require a different methodology
- var handler = DirectoryResultReturned;
- if (handler != null)
- {
- handler(this, new DirectoryEventArgs
- {
- Directory = result,
- DirectoryIsOnRoot = !CurrentDirectoryResultIsNotDirectoryRoot.BoolValue
- });
- }
+ var directoryResult = new CodecDirectory();
+
+ // If result is Root, create a copy and filter out contacts whose parent folder is not root
+ if (!CurrentDirectoryResultIsNotDirectoryRoot.BoolValue)
+ {
+ Debug.Console(2, this, "Filtering DirectoryRoot to remove contacts for display");
+
+ directoryResult.ResultsFolderId = result.ResultsFolderId;
+ directoryResult.AddFoldersToDirectory(result.Folders);
+ directoryResult.AddContactsToDirectory(result.Contacts.Where((c) => c.ParentFolderId == result.ResultsFolderId).ToList());
+ }
+ else
+ {
+ directoryResult = result;
+ }
+
+ Debug.Console(2, this, "Updating directoryResult. IsOnRoot: {0}", !CurrentDirectoryResultIsNotDirectoryRoot.BoolValue);
+
+ // This will return the latest results to all UIs. Multiple indendent UI Directory browsing will require a different methodology
+ var handler = DirectoryResultReturned;
+ if (handler != null)
+ {
+ handler(this, new DirectoryEventArgs
+ {
+ Directory = directoryResult,
+ DirectoryIsOnRoot = !CurrentDirectoryResultIsNotDirectoryRoot.BoolValue
+ });
+ }
+ }
+ catch (Exception e)
+ {
+ Debug.Console(2, this, "Error: {0}", e);
+ }
//PrintDirectory(result);
}
@@ -2024,6 +2076,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
foreach (var cam in Status.Cameras)
{
+ // Known Issue:
+ // Crestron UC engine systems seem to report an item in the cameras list that represnts the USB bridge device.
+ // If we know the name and it's reliably consistent, we could ignore it here...
+
+ if (cam.Name.IndexOf("HD-CONV-USB") > -1)
+ {
+ // Skip this as it's the Crestron USB box, not a real camera
+ continue;
+ }
+
var camera = new ZoomRoomCamera(cam.id, cam.Name, this);
Cameras.Add(camera);
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomCamera.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomCamera.cs
index 7a3abdaa..b0fc52fe 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomCamera.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomCamera.cs
@@ -63,6 +63,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
: base(key, name)
{
ParentCodec = codec;
+
+ Capabilities = eCameraCapabilities.Pan | eCameraCapabilities.Tilt | eCameraCapabilities.Zoom;
}
///