diff --git a/PepperDashEssentials/PepperDashEssentials.csproj b/PepperDashEssentials/PepperDashEssentials.csproj index b7df4b0d..7b548dd5 100644 --- a/PepperDashEssentials/PepperDashEssentials.csproj +++ b/PepperDashEssentials/PepperDashEssentials.csproj @@ -137,7 +137,7 @@ - + diff --git a/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs b/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs index 201b583c..6a59cc56 100644 --- a/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs +++ b/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs @@ -196,9 +196,20 @@ namespace PepperDash.Essentials.Room.Config public string DefaultAudioKey { get; set; } [JsonProperty("sourceListKey")] public string SourceListKey { get; set; } + [JsonProperty("destinationListKey")] + public string DestinationListKey { get; set; } [JsonProperty("defaultSourceItem")] public string DefaultSourceItem { get; set; } - + /// + /// Indicates if the room supports advanced sharing + /// + [JsonProperty("supportsAdvancedSharing")] + public bool SupportsAdvancedSharing { get; set; } + /// + /// Indicates if non-tech users can change the share mode + /// + [JsonProperty("userCanChangeShareMode")] + public bool UserCanChangeShareMode { get; set; } } public class EssentialsConferenceRoomPropertiesConfig : EssentialsAvRoomPropertiesConfig diff --git a/PepperDashEssentials/Room/Config/DDVC01RoomPropertiesConfig.cs b/PepperDashEssentials/Room/Config/SimplRoomPropertiesConfig.cs similarity index 78% rename from PepperDashEssentials/Room/Config/DDVC01RoomPropertiesConfig.cs rename to PepperDashEssentials/Room/Config/SimplRoomPropertiesConfig.cs index be779f3a..f0fea9b9 100644 --- a/PepperDashEssentials/Room/Config/DDVC01RoomPropertiesConfig.cs +++ b/PepperDashEssentials/Room/Config/SimplRoomPropertiesConfig.cs @@ -8,19 +8,19 @@ using Newtonsoft.Json; namespace PepperDash.Essentials.Room.Config { - public class DDVC01RoomPropertiesConfig : EssentialsHuddleVtc1PropertiesConfig + public class SimplRoomPropertiesConfig : EssentialsHuddleVtc1PropertiesConfig { [JsonProperty("roomPhoneNumber")] public string RoomPhoneNumber { get; set; } [JsonProperty("roomURI")] public string RoomURI { get; set; } [JsonProperty("speedDials")] - public List SpeedDials { get; set; } + public List SpeedDials { get; set; } [JsonProperty("volumeSliderNames")] public List VolumeSliderNames { get; set; } } - public class DDVC01SpeedDial + public class SimplSpeedDial { [JsonProperty("name")] public string Name { get; set; } diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/BasicConfig.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/BasicConfig.cs index 7cbaa5a1..f44f6000 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/BasicConfig.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/BasicConfig.cs @@ -1,11 +1,6 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Text; -using Crestron.SimplSharp; using Newtonsoft.Json; -using PepperDash.Core; -using PepperDash.Essentials.Core; using Newtonsoft.Json.Linq; @@ -25,12 +20,25 @@ namespace PepperDash.Essentials.Core.Config [JsonProperty("sourceLists")] public Dictionary> SourceLists { get; set; } - [JsonProperty("tieLines")] + [JsonProperty("destinationLists")] + public Dictionary> DestinationLists { get; set; } + + [JsonProperty("tieLines")] public List TieLines { get; set; } [JsonProperty("joinMaps")] public Dictionary JoinMaps { get; set; } + public BasicConfig() + { + Info = new InfoConfig(); + Devices = new List(); + SourceLists = new Dictionary>(); + DestinationLists = new Dictionary>(); + TieLines = new List(); + JoinMaps = new Dictionary(); + } + /// /// Checks SourceLists for a given list and returns it if found. Otherwise, returns null /// @@ -42,6 +50,21 @@ namespace PepperDash.Essentials.Core.Config return SourceLists[key]; } + /// + /// Retrieves a DestinationListItem based on the key + /// + /// key of the item to retrieve + /// DestinationListItem if the key exists, null otherwise + public Dictionary GetDestinationListForKey(string key) + { + if (string.IsNullOrEmpty(key) || !DestinationLists.ContainsKey(key)) + { + return null; + } + + return DestinationLists[key]; + } + /// /// Checks Devices for an item with a Key that matches and returns it if found. Otherwise, retunes null /// diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Essentials/EssentialsConfig.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Essentials/EssentialsConfig.cs index cc3375e2..1e819414 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Essentials/EssentialsConfig.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Essentials/EssentialsConfig.cs @@ -51,6 +51,13 @@ namespace PepperDash.Essentials.Core.Config [JsonProperty("rooms")] public List Rooms { get; set; } + + + public EssentialsConfig() + : base() + { + Rooms = new List(); + } } /// diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/DeviceTypeInterfaces/IMobileControl.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/DeviceTypeInterfaces/IMobileControl.cs index 2dfa7c41..c87e7865 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/DeviceTypeInterfaces/IMobileControl.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/DeviceTypeInterfaces/IMobileControl.cs @@ -20,6 +20,10 @@ namespace PepperDash.Essentials.Core.DeviceTypeInterfaces { event EventHandler UserCodeChanged; + event EventHandler UserPromptedForCode; + + event EventHandler ClientJoined; + string UserCode { get; } string QrCodeUrl { get; } diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/DestinationListItem.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/DestinationListItem.cs new file mode 100644 index 00000000..49379e44 --- /dev/null +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/DestinationListItem.cs @@ -0,0 +1,54 @@ +using Newtonsoft.Json; +using PepperDash.Essentials.Core; + +namespace PepperDash.Essentials.Core +{ + public class DestinationListItem + { + [JsonProperty("sinkKey")] + public string SinkKey { get; set; } + + private EssentialsDevice _sinkDevice; + + [JsonIgnore] + public EssentialsDevice SinkDevice + { + get { return _sinkDevice ?? (_sinkDevice = DeviceManager.GetDeviceForKey(SinkKey) as EssentialsDevice); } + } + + [JsonProperty("preferredName")] + public string PreferredName + { + get + { + if (!string.IsNullOrEmpty(Name)) + { + return Name; + } + + return SinkDevice == null ? "---" : SinkDevice.Name; + } + } + + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("includeInDestinationList")] + public bool IncludeInDestinationList { get; set; } + + [JsonProperty("order")] + public int Order { get; set; } + + [JsonProperty("surfaceLocation")] + public int SurfaceLocation { get; set; } + + [JsonProperty("verticalLocation")] + public int VerticalLocation { get; set; } + + [JsonProperty("horizontalLocation")] + public int HorizontalLocation { get; set; } + + [JsonProperty("sinkType")] + public eRoutingSignalType SinkType { get; set; } + } +} \ No newline at end of file diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/SourceListItem.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/SourceListItem.cs index 601d75a7..e302a2a4 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/SourceListItem.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/SourceListItem.cs @@ -130,10 +130,24 @@ namespace PepperDash.Essentials.Core [JsonProperty("sourceListKey")] public string SourceListKey { get; set; } + /// + /// Indicates if the device associated with this source is controllable + /// + [JsonProperty("isControllable")] + public bool IsControllable { get; set; } + + /// + /// Indicates that the device associated with this source has audio available + /// + [JsonProperty("isAudioSource")] + public bool IsAudioSource { get; set; } + public SourceListItem() { Icon = "Blank"; } + + } public class SourceRouteListItem diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj index d5bce861..e4c775d0 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj @@ -189,6 +189,7 @@ + diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Plugins/PluginLoader.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Plugins/PluginLoader.cs index 7192c667..ba4ffab4 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Plugins/PluginLoader.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Plugins/PluginLoader.cs @@ -400,6 +400,7 @@ namespace PepperDash.Essentials { Debug.Console(2, "Load Plugin not found. {0}.{2} is not a plugin factory. Exception: {1}", loadedAssembly.Name, e.Message, type.Name); + continue; } } diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Queues/GenericQueue.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Queues/GenericQueue.cs index a5def83d..a1cef30d 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Queues/GenericQueue.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Queues/GenericQueue.cs @@ -180,7 +180,7 @@ namespace PepperDash.Essentials.Core.Queues { try { - Debug.Console(2, this, "Processing queue item: '{0}'", item.ToString()); + //Debug.Console(2, this, "Processing queue item: '{0}'", item.ToString()); item.Dispatch(); if (_delayEnabled) diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs index 1cf6ade0..a0d4fb74 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs @@ -490,11 +490,21 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco Debug.Console(2, this, "Setting QR code URL: {0}", mcBridge.QrCodeUrl); mcBridge.UserCodeChanged += (o, a) => SendMcBrandingUrl(mcBridge); + mcBridge.UserPromptedForCode += (o, a) => DisplayUserCode(mcBridge.UserCode); SendMcBrandingUrl(mcBridge); } } + /// + /// Displays the code for the specified duration + /// + /// Mobile Control user code + private void DisplayUserCode(string code) + { + SendText(string.Format("xcommand userinterface message alert display title:\"Mobile Control User Code:\" text:\"{0}\" duration: 30", code)); + } + private void SendMcBrandingUrl(IMobileControlRoomBridge mcBridge) { if (mcBridge == null) @@ -561,6 +571,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco prefix + "/Status/Standby" + Delimiter + prefix + "/Status/Video/Selfview" + Delimiter + prefix + "/Status/Video/Layout" + Delimiter + + prefix + "/Status/Video/Input/MainVideoMute" + Delimiter + prefix + "/Bookings" + Delimiter + prefix + "/Event/CallDisconnect" + Delimiter + prefix + "/Event/Bookings" + Delimiter + @@ -1650,12 +1661,21 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco public void CameraAutoModeOn() { + if (CameraIsOffFeedback.BoolValue) + { + CameraMuteOff(); + } + SendText("xCommand Cameras SpeakerTrack Activate"); - CameraMuteOff(); } public void CameraAutoModeOff() { + if (CameraIsOffFeedback.BoolValue) + { + CameraMuteOff(); + } + SendText("xCommand Cameras SpeakerTrack Deactivate"); } @@ -2011,7 +2031,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco /// public void CameraMuteOn() { - SendText("xCommand Video InputMainVideo Mute"); + SendText("xCommand Video Input MainVideo Mute"); } /// @@ -2019,7 +2039,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco /// public void CameraMuteOff() { - SendText("xCommand Video InputMainVideo Unmute"); + SendText("xCommand Video Input MainVideo Unmute"); } ///