diff --git a/Essentials/PepperDashEssentials/Config/EssentialsConfig.cs b/Essentials/PepperDashEssentials/Config/EssentialsConfig.cs
index b9ba2bc8..34d2f516 100644
--- a/Essentials/PepperDashEssentials/Config/EssentialsConfig.cs
+++ b/Essentials/PepperDashEssentials/Config/EssentialsConfig.cs
@@ -1,11 +1,13 @@
using System;
using System.Collections.Generic;
-using Crestron.SimplSharp.CrestronIO;
+using System.Text.RegularExpressions;
+using Crestron.SimplSharp.CrestronIO;
using Newtonsoft.Json;
+
using PepperDash.Core;
using PepperDash.Essentials.Core.Config;
-using System.Text.RegularExpressions;
+using PepperDash.Essentials.Room.Config;
namespace PepperDash.Essentials
{
diff --git a/Essentials/PepperDashEssentials/PepperDashEssentials.csproj b/Essentials/PepperDashEssentials/PepperDashEssentials.csproj
index 85db3115..bad7c445 100644
--- a/Essentials/PepperDashEssentials/PepperDashEssentials.csproj
+++ b/Essentials/PepperDashEssentials/PepperDashEssentials.csproj
@@ -141,6 +141,9 @@
+
+
+
@@ -151,23 +154,24 @@
-
-
-
+
+
+
+
-
+
-
-
-
+
+
+
@@ -176,22 +180,21 @@
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
diff --git a/Essentials/PepperDashEssentials/Room/Config/EssentialsHuddleRoomPropertiesConfig.cs b/Essentials/PepperDashEssentials/Room/Config/EssentialsHuddleRoomPropertiesConfig.cs
new file mode 100644
index 00000000..2044484d
--- /dev/null
+++ b/Essentials/PepperDashEssentials/Room/Config/EssentialsHuddleRoomPropertiesConfig.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Essentials.Room.Config
+{
+ ///
+ ///
+ ///
+ public class EssentialsHuddleRoomPropertiesConfig : EssentialsRoomPropertiesConfig
+ {
+ public string DefaultDisplayKey { get; set; }
+ public string DefaultAudioKey { get; set; }
+ public string SourceListKey { get; set; }
+ public string DefaultSourceItem { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/Essentials/PepperDashEssentials/Room/Config/EssentialsHuddleVtc1PropertiesConfig.cs b/Essentials/PepperDashEssentials/Room/Config/EssentialsHuddleVtc1PropertiesConfig.cs
new file mode 100644
index 00000000..9e41285b
--- /dev/null
+++ b/Essentials/PepperDashEssentials/Room/Config/EssentialsHuddleVtc1PropertiesConfig.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Essentials.Room.Config
+{
+
+ public class EssentialsHuddleVtc1PropertiesConfig
+ {
+
+
+ }
+}
\ No newline at end of file
diff --git a/Essentials/PepperDashEssentials/Room/Config/EssentialsPresentationPropertiesConfig.cs b/Essentials/PepperDashEssentials/Room/Config/EssentialsPresentationPropertiesConfig.cs
new file mode 100644
index 00000000..a40e0fdc
--- /dev/null
+++ b/Essentials/PepperDashEssentials/Room/Config/EssentialsPresentationPropertiesConfig.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Essentials.Room.Config
+{
+ ///
+ ///
+ ///
+ public class EssentialsPresentationRoomPropertiesConfig : EssentialsRoomPropertiesConfig
+ {
+ public string DefaultAudioBehavior { get; set; }
+ public string DefaultAudioKey { get; set; }
+ public string DefaultVideoBehavior { get; set; }
+ public List DisplayKeys { get; set; }
+ public string SourceListKey { get; set; }
+ public bool HasDsp { get; set; }
+
+ public EssentialsPresentationRoomPropertiesConfig()
+ {
+ DisplayKeys = new List();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Essentials/PepperDashEssentials/Room/EssentialsRoomConfig.cs b/Essentials/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
similarity index 81%
rename from Essentials/PepperDashEssentials/Room/EssentialsRoomConfig.cs
rename to Essentials/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
index 5bb7317b..f2b845c8 100644
--- a/Essentials/PepperDashEssentials/Room/EssentialsRoomConfig.cs
+++ b/Essentials/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
@@ -2,16 +2,16 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
-using System.Text.RegularExpressions;
+
using Crestron.SimplSharp;
using Newtonsoft.Json;
using PepperDash.Core;
+using PepperDash.Essentials;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Config;
-using PepperDash.Essentials.DM;
-namespace PepperDash.Essentials
+namespace PepperDash.Essentials.Room.Config
{
public class EssentialsRoomConfig : DeviceConfig
{
@@ -54,6 +54,15 @@ namespace PepperDash.Essentials
var presRoom = new EssentialsPresentationRoom(Key, Name, displaysDict, masterVolumeControlDev, props);
return presRoom;
}
+ else if (typeName == "huddlevtc1")
+ {
+ var props = JsonConvert.DeserializeObject
+ (this.Properties.ToString());
+
+ var vtcRoom = new EssentialsHuddleVtc1Room(Key, Name, null, null, props);
+ return vtcRoom;
+ }
+
return null;
}
}
@@ -138,32 +147,4 @@ namespace PepperDash.Essentials
public List Types { get; set; }
}
- ///
- ///
- ///
- public class EssentialsHuddleRoomPropertiesConfig : EssentialsRoomPropertiesConfig
- {
- public string DefaultDisplayKey { get; set; }
- public string DefaultAudioKey { get; set; }
- public string SourceListKey { get; set; }
- public string DefaultSourceItem { get; set; }
- }
-
- ///
- ///
- ///
- public class EssentialsPresentationRoomPropertiesConfig : EssentialsRoomPropertiesConfig
- {
- public string DefaultAudioBehavior { get; set; }
- public string DefaultAudioKey { get; set; }
- public string DefaultVideoBehavior { get; set; }
- public List DisplayKeys { get; set; }
- public string SourceListKey { get; set; }
- public bool HasDsp { get; set; }
-
- public EssentialsPresentationRoomPropertiesConfig()
- {
- DisplayKeys = new List();
- }
- }
}
\ No newline at end of file
diff --git a/Essentials/PepperDashEssentials/Room/EssentialsHuddleSpaceRoom.cs b/Essentials/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs
similarity index 97%
rename from Essentials/PepperDashEssentials/Room/EssentialsHuddleSpaceRoom.cs
rename to Essentials/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs
index 455fcd9b..7685de18 100644
--- a/Essentials/PepperDashEssentials/Room/EssentialsHuddleSpaceRoom.cs
+++ b/Essentials/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs
@@ -1,419 +1,420 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-
-using PepperDash.Core;
-using PepperDash.Essentials.Core;
-
-namespace PepperDash.Essentials
-{
- public class EssentialsHuddleSpaceRoom : EssentialsRoomBase, IHasCurrentSourceInfoChange
- {
- public event EventHandler CurrentVolumeDeviceChange;
- public event SourceInfoChangeHandler CurrentSingleSourceChange;
-
- protected override Func OnFeedbackFunc
- {
- get
- {
- return () =>
- {
- var disp = DefaultDisplay as DisplayBase;
- var val = CurrentSourceInfo != null
- && CurrentSourceInfo.Type == eSourceListItemType.Route
- && disp != null
- && disp.PowerIsOnFeedback.BoolValue;
- return val;
- };
- }
- }
- ///
- ///
- ///
- protected override Func IsWarmingFeedbackFunc
- {
- get
- {
- return () =>
- {
- var disp = DefaultDisplay as DisplayBase;
- if (disp != null)
- return disp.IsWarmingUpFeedback.BoolValue;
- else
- return false;
- };
- }
- }
- ///
- ///
- ///
- protected override Func IsCoolingFeedbackFunc
- {
- get
- {
- return () =>
- {
- var disp = DefaultDisplay as DisplayBase;
- if (disp != null)
- return disp.IsCoolingDownFeedback.BoolValue;
- else
- return false;
- };
- }
- }
-
- public EssentialsRoomPropertiesConfig Config { get; private set; }
-
- public IRoutingSinkWithSwitching DefaultDisplay { get; private set; }
- public IRoutingSinkNoSwitching DefaultAudioDevice { get; private set; }
- public IBasicVolumeControls DefaultVolumeControls { get; private set; }
-
- public bool ExcludeFromGlobalFunctions { get; set; }
-
- ///
- /// The config name of the source list
- ///
- public string SourceListKey { get; set; }
-
- public string DefaultSourceItem { get; set; }
-
- public ushort DefaultVolume { get; set; }
-
- ///
- /// If room is off, enables power on to last source. Default true
- ///
- public bool EnablePowerOnToLastSource { get; set; }
- string LastSourceKey;
-
- ///
- ///
- ///
- public IBasicVolumeControls CurrentVolumeControls
- {
- get { return _CurrentAudioDevice; }
- set
- {
- if (value == _CurrentAudioDevice) return;
-
- var oldDev = _CurrentAudioDevice;
- // derigister this room from the device, if it can
- if (oldDev is IInUseTracking)
- (oldDev as IInUseTracking).InUseTracker.RemoveUser(this, "audio");
- var handler = CurrentVolumeDeviceChange;
- if (handler != null)
- CurrentVolumeDeviceChange(this, new VolumeDeviceChangeEventArgs(oldDev, value, ChangeType.WillChange));
- _CurrentAudioDevice = value;
- if (handler != null)
- CurrentVolumeDeviceChange(this, new VolumeDeviceChangeEventArgs(oldDev, value, ChangeType.DidChange));
- // register this room with new device, if it can
- if (_CurrentAudioDevice is IInUseTracking)
- (_CurrentAudioDevice as IInUseTracking).InUseTracker.AddUser(this, "audio");
- }
- }
- IBasicVolumeControls _CurrentAudioDevice;
-
- ///
- /// The SourceListItem last run - containing names and icons
- ///
- public SourceListItem CurrentSourceInfo
- {
- get { return _CurrentSourceInfo; }
- private set
- {
- if (value == _CurrentSourceInfo) return;
-
- var handler = CurrentSingleSourceChange;
- // remove from in-use tracker, if so equipped
- if(_CurrentSourceInfo != null && _CurrentSourceInfo.SourceDevice is IInUseTracking)
- (_CurrentSourceInfo.SourceDevice as IInUseTracking).InUseTracker.RemoveUser(this, "control");
-
- if (handler != null)
- handler(this, _CurrentSourceInfo, ChangeType.WillChange);
-
- _CurrentSourceInfo = value;
-
- // add to in-use tracking
- if (_CurrentSourceInfo != null && _CurrentSourceInfo.SourceDevice is IInUseTracking)
- (_CurrentSourceInfo.SourceDevice as IInUseTracking).InUseTracker.AddUser(this, "control");
- if (handler != null)
- handler(this, _CurrentSourceInfo, ChangeType.DidChange);
- }
- }
- SourceListItem _CurrentSourceInfo;
-
- public string CurrentSourceInfoKey { get; private set; }
-
- ///
- ///
- ///
- ///
- ///
- public EssentialsHuddleSpaceRoom(string key, string name, IRoutingSinkWithSwitching defaultDisplay,
- IRoutingSinkNoSwitching defaultAudio, EssentialsRoomPropertiesConfig config)
- : base(key, name)
- {
- Config = config;
- DefaultDisplay = defaultDisplay;
- DefaultAudioDevice = defaultAudio;
- if (defaultAudio is IBasicVolumeControls)
- DefaultVolumeControls = defaultAudio as IBasicVolumeControls;
- else if (defaultAudio is IHasVolumeDevice)
- DefaultVolumeControls = (defaultAudio as IHasVolumeDevice).VolumeDevice;
- CurrentVolumeControls = DefaultVolumeControls;
-
- var disp = DefaultDisplay as DisplayBase;
- if (disp != null)
- {
- // Link power, warming, cooling to display
- disp.PowerIsOnFeedback.OutputChange += (o, a) =>
- {
- if (disp.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
- {
- if (!disp.PowerIsOnFeedback.BoolValue)
- CurrentSourceInfo = null;
- OnFeedback.FireUpdate();
- }
- };
-
- disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
- {
- IsWarmingUpFeedback.FireUpdate();
- if (!IsWarmingUpFeedback.BoolValue)
- (DefaultDisplay as IBasicVolumeWithFeedback).SetVolume(DefaultVolume);
- };
- disp.IsCoolingDownFeedback.OutputChange += (o, a) =>
- {
- IsCoolingDownFeedback.FireUpdate();
- if (IsCoolingDownFeedback.BoolValue)
- (DefaultDisplay as IBasicVolumeWithFeedback).SetVolume(DefaultVolume);
- };
- }
-
- SourceListKey = "default";
- EnablePowerOnToLastSource = true;
- }
-
-
- ///
- ///
- ///
- public override void Shutdown()
- {
- RunRouteAction("roomOff");
- }
-
- ///
- /// Routes the default source item, if any
- ///
- public void RunDefaultRoute()
- {
- if (DefaultSourceItem != null)
- RunRouteAction(DefaultSourceItem);
- }
-
- ///
- ///
- ///
- ///
- public void RunRouteAction(string routeKey)
- {
- RunRouteAction(routeKey, null);
- }
-
- ///
- /// Gets a source from config list SourceListKey and dynamically build and executes the
- /// route or commands
- ///
- ///
- public void RunRouteAction(string routeKey, Action successCallback)
- {
- // Run this on a separate thread
- new CTimer(o =>
- {
- Debug.Console(1, this, "Run route action '{0}'", routeKey);
- var dict = ConfigReader.ConfigObject.GetSourceListForKey(SourceListKey);
- if(dict == null)
- {
- Debug.Console(1, this, "WARNING: Config source list '{0}' not found", SourceListKey);
- return;
- }
-
- // Try to get the list item by it's string key
- if (!dict.ContainsKey(routeKey))
- {
- Debug.Console(1, this, "WARNING: No item '{0}' found on config list '{1}'",
- routeKey, SourceListKey);
- return;
- }
-
- var item = dict[routeKey];
- //Debug.Console(2, this, "Action {0} has {1} steps",
- // item.SourceKey, item.RouteList.Count);
-
- // End usage timer on last source
- if (!string.IsNullOrEmpty(LastSourceKey))
- {
- var lastSource = dict[LastSourceKey].SourceDevice;
-
- try
- {
- if (lastSource != null && lastSource is IUsageTracking)
- (lastSource as IUsageTracking).UsageTracker.EndDeviceUsage();
- }
- catch (Exception e)
- {
- Debug.Console(1, this, "*#* EXCEPTION in end usage tracking (257):\r{0}", e);
- }
- }
-
- // Let's run it
- if (routeKey.ToLower() != "roomoff")
- {
- LastSourceKey = routeKey;
- }
- else
- {
- CurrentSourceInfoKey = null;
- }
-
- foreach (var route in item.RouteList)
- {
- // if there is a $defaultAll on route, run two separate
- if (route.DestinationKey.Equals("$defaultAll", StringComparison.OrdinalIgnoreCase))
- {
- // Going to assume a single-path route for now
- var tempVideo = new SourceRouteListItem
- {
- DestinationKey = "$defaultDisplay",
- SourceKey = route.SourceKey,
- Type = eRoutingSignalType.Video
- };
- DoRoute(tempVideo);
-
- //var tempAudio = new SourceRouteListItem
- //{
- // DestinationKey = "$defaultAudio",
- // SourceKey = route.SourceKey,
- // Type = eRoutingSignalType.Audio
- //};
- //DoRoute(tempAudio);
- //continue; -- not sure why this was here
- }
- else
- DoRoute(route);
- }
-
- // Start usage timer on routed source
- if (item.SourceDevice is IUsageTracking)
- {
- (item.SourceDevice as IUsageTracking).UsageTracker.StartDeviceUsage();
- }
-
-
- // Set volume control on room, using default if non provided
- IBasicVolumeControls volDev = null;
- // Handle special cases for volume control
- if (string.IsNullOrEmpty(item.VolumeControlKey)
- || item.VolumeControlKey.Equals("$defaultAudio", StringComparison.OrdinalIgnoreCase))
- volDev = DefaultVolumeControls;
- else if (item.VolumeControlKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase))
- volDev = DefaultDisplay as IBasicVolumeControls;
- // Or a specific device, probably rarely used.
- else
- {
- var dev = DeviceManager.GetDeviceForKey(item.VolumeControlKey);
- if (dev is IBasicVolumeControls)
- volDev = dev as IBasicVolumeControls;
- else if (dev is IHasVolumeDevice)
- volDev = (dev as IHasVolumeDevice).VolumeDevice;
- }
- CurrentVolumeControls = volDev;
-
- // store the name and UI info for routes
- if (item.SourceKey == "$off")
- {
- CurrentSourceInfoKey = routeKey;
- CurrentSourceInfo = null;
- }
- else if (item.SourceKey != null)
- {
- CurrentSourceInfoKey = routeKey;
- CurrentSourceInfo = item;
- }
- // And finally, set the "control". This will trigger event
- //CurrentControlDevice = DeviceManager.GetDeviceForKey(item.SourceKey) as Device;
-
- OnFeedback.FireUpdate();
-
- // report back when done
- if (successCallback != null)
- successCallback();
-
- }, 0); // end of CTimer
- }
-
- ///
- /// Will power the room on with the last-used source
- ///
- public void PowerOnToDefaultOrLastSource()
- {
- if (!EnablePowerOnToLastSource || LastSourceKey == null)
- return;
- RunRouteAction(LastSourceKey);
- }
-
- ///
- ///
- ///
- ///
- ///
- bool DoRoute(SourceRouteListItem route)
- {
- IRoutingSinkNoSwitching dest = null;
-
- if (route.DestinationKey.Equals("$defaultaudio", StringComparison.OrdinalIgnoreCase))
- dest = DefaultAudioDevice;
- else if (route.DestinationKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase))
- dest = DefaultDisplay;
- else
- dest = DeviceManager.GetDeviceForKey(route.DestinationKey) as IRoutingSinkNoSwitching;
-
- if (dest == null)
- {
- Debug.Console(1, this, "Cannot route, unknown destination '{0}'", route.DestinationKey);
- return false;
- }
-
- if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase))
- {
- dest.ReleaseRoute();
- if (dest is IPower)
- (dest as IPower).PowerOff();
- }
- else
- {
- var source = DeviceManager.GetDeviceForKey(route.SourceKey) as IRoutingOutputs;
- if (source == null)
- {
- Debug.Console(1, this, "Cannot route unknown source '{0}' to {1}", route.SourceKey, route.DestinationKey);
- return false;
- }
- dest.ReleaseAndMakeRoute(source, route.Type);
- }
- return true;
- }
-
- ///
- /// Runs "roomOff" action on all rooms not set to ExcludeFromGlobalFunctions
- ///
- public static void AllRoomsOff()
- {
- var allRooms = DeviceManager.AllDevices.Where(d =>
- d is EssentialsHuddleSpaceRoom && !(d as EssentialsHuddleSpaceRoom).ExcludeFromGlobalFunctions);
- foreach (var room in allRooms)
- (room as EssentialsHuddleSpaceRoom).RunRouteAction("roomOff");
- }
- }
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+using PepperDash.Core;
+using PepperDash.Essentials.Core;
+using PepperDash.Essentials.Room.Config;
+
+namespace PepperDash.Essentials
+{
+ public class EssentialsHuddleSpaceRoom : EssentialsRoomBase, IHasCurrentSourceInfoChange
+ {
+ public event EventHandler CurrentVolumeDeviceChange;
+ public event SourceInfoChangeHandler CurrentSingleSourceChange;
+
+ protected override Func OnFeedbackFunc
+ {
+ get
+ {
+ return () =>
+ {
+ var disp = DefaultDisplay as DisplayBase;
+ var val = CurrentSourceInfo != null
+ && CurrentSourceInfo.Type == eSourceListItemType.Route
+ && disp != null
+ && disp.PowerIsOnFeedback.BoolValue;
+ return val;
+ };
+ }
+ }
+ ///
+ ///
+ ///
+ protected override Func IsWarmingFeedbackFunc
+ {
+ get
+ {
+ return () =>
+ {
+ var disp = DefaultDisplay as DisplayBase;
+ if (disp != null)
+ return disp.IsWarmingUpFeedback.BoolValue;
+ else
+ return false;
+ };
+ }
+ }
+ ///
+ ///
+ ///
+ protected override Func IsCoolingFeedbackFunc
+ {
+ get
+ {
+ return () =>
+ {
+ var disp = DefaultDisplay as DisplayBase;
+ if (disp != null)
+ return disp.IsCoolingDownFeedback.BoolValue;
+ else
+ return false;
+ };
+ }
+ }
+
+ public EssentialsRoomPropertiesConfig Config { get; private set; }
+
+ public IRoutingSinkWithSwitching DefaultDisplay { get; private set; }
+ public IRoutingSinkNoSwitching DefaultAudioDevice { get; private set; }
+ public IBasicVolumeControls DefaultVolumeControls { get; private set; }
+
+ public bool ExcludeFromGlobalFunctions { get; set; }
+
+ ///
+ /// The config name of the source list
+ ///
+ public string SourceListKey { get; set; }
+
+ public string DefaultSourceItem { get; set; }
+
+ public ushort DefaultVolume { get; set; }
+
+ ///
+ /// If room is off, enables power on to last source. Default true
+ ///
+ public bool EnablePowerOnToLastSource { get; set; }
+ string LastSourceKey;
+
+ ///
+ ///
+ ///
+ public IBasicVolumeControls CurrentVolumeControls
+ {
+ get { return _CurrentAudioDevice; }
+ set
+ {
+ if (value == _CurrentAudioDevice) return;
+
+ var oldDev = _CurrentAudioDevice;
+ // derigister this room from the device, if it can
+ if (oldDev is IInUseTracking)
+ (oldDev as IInUseTracking).InUseTracker.RemoveUser(this, "audio");
+ var handler = CurrentVolumeDeviceChange;
+ if (handler != null)
+ CurrentVolumeDeviceChange(this, new VolumeDeviceChangeEventArgs(oldDev, value, ChangeType.WillChange));
+ _CurrentAudioDevice = value;
+ if (handler != null)
+ CurrentVolumeDeviceChange(this, new VolumeDeviceChangeEventArgs(oldDev, value, ChangeType.DidChange));
+ // register this room with new device, if it can
+ if (_CurrentAudioDevice is IInUseTracking)
+ (_CurrentAudioDevice as IInUseTracking).InUseTracker.AddUser(this, "audio");
+ }
+ }
+ IBasicVolumeControls _CurrentAudioDevice;
+
+ ///
+ /// The SourceListItem last run - containing names and icons
+ ///
+ public SourceListItem CurrentSourceInfo
+ {
+ get { return _CurrentSourceInfo; }
+ private set
+ {
+ if (value == _CurrentSourceInfo) return;
+
+ var handler = CurrentSingleSourceChange;
+ // remove from in-use tracker, if so equipped
+ if(_CurrentSourceInfo != null && _CurrentSourceInfo.SourceDevice is IInUseTracking)
+ (_CurrentSourceInfo.SourceDevice as IInUseTracking).InUseTracker.RemoveUser(this, "control");
+
+ if (handler != null)
+ handler(this, _CurrentSourceInfo, ChangeType.WillChange);
+
+ _CurrentSourceInfo = value;
+
+ // add to in-use tracking
+ if (_CurrentSourceInfo != null && _CurrentSourceInfo.SourceDevice is IInUseTracking)
+ (_CurrentSourceInfo.SourceDevice as IInUseTracking).InUseTracker.AddUser(this, "control");
+ if (handler != null)
+ handler(this, _CurrentSourceInfo, ChangeType.DidChange);
+ }
+ }
+ SourceListItem _CurrentSourceInfo;
+
+ public string CurrentSourceInfoKey { get; private set; }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public EssentialsHuddleSpaceRoom(string key, string name, IRoutingSinkWithSwitching defaultDisplay,
+ IRoutingSinkNoSwitching defaultAudio, EssentialsRoomPropertiesConfig config)
+ : base(key, name)
+ {
+ Config = config;
+ DefaultDisplay = defaultDisplay;
+ DefaultAudioDevice = defaultAudio;
+ if (defaultAudio is IBasicVolumeControls)
+ DefaultVolumeControls = defaultAudio as IBasicVolumeControls;
+ else if (defaultAudio is IHasVolumeDevice)
+ DefaultVolumeControls = (defaultAudio as IHasVolumeDevice).VolumeDevice;
+ CurrentVolumeControls = DefaultVolumeControls;
+
+ var disp = DefaultDisplay as DisplayBase;
+ if (disp != null)
+ {
+ // Link power, warming, cooling to display
+ disp.PowerIsOnFeedback.OutputChange += (o, a) =>
+ {
+ if (disp.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
+ {
+ if (!disp.PowerIsOnFeedback.BoolValue)
+ CurrentSourceInfo = null;
+ OnFeedback.FireUpdate();
+ }
+ };
+
+ disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
+ {
+ IsWarmingUpFeedback.FireUpdate();
+ if (!IsWarmingUpFeedback.BoolValue)
+ (DefaultDisplay as IBasicVolumeWithFeedback).SetVolume(DefaultVolume);
+ };
+ disp.IsCoolingDownFeedback.OutputChange += (o, a) =>
+ {
+ IsCoolingDownFeedback.FireUpdate();
+ if (IsCoolingDownFeedback.BoolValue)
+ (DefaultDisplay as IBasicVolumeWithFeedback).SetVolume(DefaultVolume);
+ };
+ }
+
+ SourceListKey = "default";
+ EnablePowerOnToLastSource = true;
+ }
+
+
+ ///
+ ///
+ ///
+ public override void Shutdown()
+ {
+ RunRouteAction("roomOff");
+ }
+
+ ///
+ /// Routes the default source item, if any
+ ///
+ public void RunDefaultRoute()
+ {
+ if (DefaultSourceItem != null)
+ RunRouteAction(DefaultSourceItem);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void RunRouteAction(string routeKey)
+ {
+ RunRouteAction(routeKey, null);
+ }
+
+ ///
+ /// Gets a source from config list SourceListKey and dynamically build and executes the
+ /// route or commands
+ ///
+ ///
+ public void RunRouteAction(string routeKey, Action successCallback)
+ {
+ // Run this on a separate thread
+ new CTimer(o =>
+ {
+ Debug.Console(1, this, "Run route action '{0}'", routeKey);
+ var dict = ConfigReader.ConfigObject.GetSourceListForKey(SourceListKey);
+ if(dict == null)
+ {
+ Debug.Console(1, this, "WARNING: Config source list '{0}' not found", SourceListKey);
+ return;
+ }
+
+ // Try to get the list item by it's string key
+ if (!dict.ContainsKey(routeKey))
+ {
+ Debug.Console(1, this, "WARNING: No item '{0}' found on config list '{1}'",
+ routeKey, SourceListKey);
+ return;
+ }
+
+ var item = dict[routeKey];
+ //Debug.Console(2, this, "Action {0} has {1} steps",
+ // item.SourceKey, item.RouteList.Count);
+
+ // End usage timer on last source
+ if (!string.IsNullOrEmpty(LastSourceKey))
+ {
+ var lastSource = dict[LastSourceKey].SourceDevice;
+
+ try
+ {
+ if (lastSource != null && lastSource is IUsageTracking)
+ (lastSource as IUsageTracking).UsageTracker.EndDeviceUsage();
+ }
+ catch (Exception e)
+ {
+ Debug.Console(1, this, "*#* EXCEPTION in end usage tracking (257):\r{0}", e);
+ }
+ }
+
+ // Let's run it
+ if (routeKey.ToLower() != "roomoff")
+ {
+ LastSourceKey = routeKey;
+ }
+ else
+ {
+ CurrentSourceInfoKey = null;
+ }
+
+ foreach (var route in item.RouteList)
+ {
+ // if there is a $defaultAll on route, run two separate
+ if (route.DestinationKey.Equals("$defaultAll", StringComparison.OrdinalIgnoreCase))
+ {
+ // Going to assume a single-path route for now
+ var tempVideo = new SourceRouteListItem
+ {
+ DestinationKey = "$defaultDisplay",
+ SourceKey = route.SourceKey,
+ Type = eRoutingSignalType.Video
+ };
+ DoRoute(tempVideo);
+
+ //var tempAudio = new SourceRouteListItem
+ //{
+ // DestinationKey = "$defaultAudio",
+ // SourceKey = route.SourceKey,
+ // Type = eRoutingSignalType.Audio
+ //};
+ //DoRoute(tempAudio);
+ //continue; -- not sure why this was here
+ }
+ else
+ DoRoute(route);
+ }
+
+ // Start usage timer on routed source
+ if (item.SourceDevice is IUsageTracking)
+ {
+ (item.SourceDevice as IUsageTracking).UsageTracker.StartDeviceUsage();
+ }
+
+
+ // Set volume control on room, using default if non provided
+ IBasicVolumeControls volDev = null;
+ // Handle special cases for volume control
+ if (string.IsNullOrEmpty(item.VolumeControlKey)
+ || item.VolumeControlKey.Equals("$defaultAudio", StringComparison.OrdinalIgnoreCase))
+ volDev = DefaultVolumeControls;
+ else if (item.VolumeControlKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase))
+ volDev = DefaultDisplay as IBasicVolumeControls;
+ // Or a specific device, probably rarely used.
+ else
+ {
+ var dev = DeviceManager.GetDeviceForKey(item.VolumeControlKey);
+ if (dev is IBasicVolumeControls)
+ volDev = dev as IBasicVolumeControls;
+ else if (dev is IHasVolumeDevice)
+ volDev = (dev as IHasVolumeDevice).VolumeDevice;
+ }
+ CurrentVolumeControls = volDev;
+
+ // store the name and UI info for routes
+ if (item.SourceKey == "$off")
+ {
+ CurrentSourceInfoKey = routeKey;
+ CurrentSourceInfo = null;
+ }
+ else if (item.SourceKey != null)
+ {
+ CurrentSourceInfoKey = routeKey;
+ CurrentSourceInfo = item;
+ }
+ // And finally, set the "control". This will trigger event
+ //CurrentControlDevice = DeviceManager.GetDeviceForKey(item.SourceKey) as Device;
+
+ OnFeedback.FireUpdate();
+
+ // report back when done
+ if (successCallback != null)
+ successCallback();
+
+ }, 0); // end of CTimer
+ }
+
+ ///
+ /// Will power the room on with the last-used source
+ ///
+ public void PowerOnToDefaultOrLastSource()
+ {
+ if (!EnablePowerOnToLastSource || LastSourceKey == null)
+ return;
+ RunRouteAction(LastSourceKey);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ bool DoRoute(SourceRouteListItem route)
+ {
+ IRoutingSinkNoSwitching dest = null;
+
+ if (route.DestinationKey.Equals("$defaultaudio", StringComparison.OrdinalIgnoreCase))
+ dest = DefaultAudioDevice;
+ else if (route.DestinationKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase))
+ dest = DefaultDisplay;
+ else
+ dest = DeviceManager.GetDeviceForKey(route.DestinationKey) as IRoutingSinkNoSwitching;
+
+ if (dest == null)
+ {
+ Debug.Console(1, this, "Cannot route, unknown destination '{0}'", route.DestinationKey);
+ return false;
+ }
+
+ if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase))
+ {
+ dest.ReleaseRoute();
+ if (dest is IPower)
+ (dest as IPower).PowerOff();
+ }
+ else
+ {
+ var source = DeviceManager.GetDeviceForKey(route.SourceKey) as IRoutingOutputs;
+ if (source == null)
+ {
+ Debug.Console(1, this, "Cannot route unknown source '{0}' to {1}", route.SourceKey, route.DestinationKey);
+ return false;
+ }
+ dest.ReleaseAndMakeRoute(source, route.Type);
+ }
+ return true;
+ }
+
+ ///
+ /// Runs "roomOff" action on all rooms not set to ExcludeFromGlobalFunctions
+ ///
+ public static void AllRoomsOff()
+ {
+ var allRooms = DeviceManager.AllDevices.Where(d =>
+ d is EssentialsHuddleSpaceRoom && !(d as EssentialsHuddleSpaceRoom).ExcludeFromGlobalFunctions);
+ foreach (var room in allRooms)
+ (room as EssentialsHuddleSpaceRoom).RunRouteAction("roomOff");
+ }
+ }
}
\ No newline at end of file
diff --git a/Essentials/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs b/Essentials/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs
new file mode 100644
index 00000000..cb3d962a
--- /dev/null
+++ b/Essentials/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs
@@ -0,0 +1,420 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+using PepperDash.Core;
+using PepperDash.Essentials.Core;
+using PepperDash.Essentials.Room.Config;
+
+namespace PepperDash.Essentials
+{
+ public class EssentialsHuddleVtc1Room : EssentialsRoomBase, IHasCurrentSourceInfoChange
+ {
+ public event EventHandler CurrentVolumeDeviceChange;
+ public event SourceInfoChangeHandler CurrentSingleSourceChange;
+
+ protected override Func OnFeedbackFunc
+ {
+ get
+ {
+ return () =>
+ {
+ var disp = DefaultDisplay as DisplayBase;
+ var val = CurrentSourceInfo != null
+ && CurrentSourceInfo.Type == eSourceListItemType.Route
+ && disp != null
+ && disp.PowerIsOnFeedback.BoolValue;
+ return val;
+ };
+ }
+ }
+ ///
+ ///
+ ///
+ protected override Func IsWarmingFeedbackFunc
+ {
+ get
+ {
+ return () =>
+ {
+ var disp = DefaultDisplay as DisplayBase;
+ if (disp != null)
+ return disp.IsWarmingUpFeedback.BoolValue;
+ else
+ return false;
+ };
+ }
+ }
+ ///
+ ///
+ ///
+ protected override Func IsCoolingFeedbackFunc
+ {
+ get
+ {
+ return () =>
+ {
+ var disp = DefaultDisplay as DisplayBase;
+ if (disp != null)
+ return disp.IsCoolingDownFeedback.BoolValue;
+ else
+ return false;
+ };
+ }
+ }
+
+ public EssentialsHuddleVtc1PropertiesConfig Config { get; private set; }
+
+ public IRoutingSinkWithSwitching DefaultDisplay { get; private set; }
+ public IRoutingSinkNoSwitching DefaultAudioDevice { get; private set; }
+ public IBasicVolumeControls DefaultVolumeControls { get; private set; }
+
+ public bool ExcludeFromGlobalFunctions { get; set; }
+
+ ///
+ /// The config name of the source list
+ ///
+ public string SourceListKey { get; set; }
+
+ public string DefaultSourceItem { get; set; }
+
+ public ushort DefaultVolume { get; set; }
+
+ ///
+ /// If room is off, enables power on to last source. Default true
+ ///
+ public bool EnablePowerOnToLastSource { get; set; }
+ string LastSourceKey;
+
+ ///
+ ///
+ ///
+ public IBasicVolumeControls CurrentVolumeControls
+ {
+ get { return _CurrentAudioDevice; }
+ set
+ {
+ if (value == _CurrentAudioDevice) return;
+
+ var oldDev = _CurrentAudioDevice;
+ // derigister this room from the device, if it can
+ if (oldDev is IInUseTracking)
+ (oldDev as IInUseTracking).InUseTracker.RemoveUser(this, "audio");
+ var handler = CurrentVolumeDeviceChange;
+ if (handler != null)
+ CurrentVolumeDeviceChange(this, new VolumeDeviceChangeEventArgs(oldDev, value, ChangeType.WillChange));
+ _CurrentAudioDevice = value;
+ if (handler != null)
+ CurrentVolumeDeviceChange(this, new VolumeDeviceChangeEventArgs(oldDev, value, ChangeType.DidChange));
+ // register this room with new device, if it can
+ if (_CurrentAudioDevice is IInUseTracking)
+ (_CurrentAudioDevice as IInUseTracking).InUseTracker.AddUser(this, "audio");
+ }
+ }
+ IBasicVolumeControls _CurrentAudioDevice;
+
+ ///
+ /// The SourceListItem last run - containing names and icons
+ ///
+ public SourceListItem CurrentSourceInfo
+ {
+ get { return _CurrentSourceInfo; }
+ private set
+ {
+ if (value == _CurrentSourceInfo) return;
+
+ var handler = CurrentSingleSourceChange;
+ // remove from in-use tracker, if so equipped
+ if(_CurrentSourceInfo != null && _CurrentSourceInfo.SourceDevice is IInUseTracking)
+ (_CurrentSourceInfo.SourceDevice as IInUseTracking).InUseTracker.RemoveUser(this, "control");
+
+ if (handler != null)
+ handler(this, _CurrentSourceInfo, ChangeType.WillChange);
+
+ _CurrentSourceInfo = value;
+
+ // add to in-use tracking
+ if (_CurrentSourceInfo != null && _CurrentSourceInfo.SourceDevice is IInUseTracking)
+ (_CurrentSourceInfo.SourceDevice as IInUseTracking).InUseTracker.AddUser(this, "control");
+ if (handler != null)
+ handler(this, _CurrentSourceInfo, ChangeType.DidChange);
+ }
+ }
+ SourceListItem _CurrentSourceInfo;
+
+ public string CurrentSourceInfoKey { get; private set; }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public EssentialsHuddleVtc1Room(string key, string name, IRoutingSinkWithSwitching defaultDisplay,
+ IRoutingSinkNoSwitching defaultAudio, EssentialsHuddleVtc1PropertiesConfig config)
+ : base(key, name)
+ {
+ Config = config;
+ DefaultDisplay = defaultDisplay;
+ DefaultAudioDevice = defaultAudio;
+ if (defaultAudio is IBasicVolumeControls)
+ DefaultVolumeControls = defaultAudio as IBasicVolumeControls;
+ else if (defaultAudio is IHasVolumeDevice)
+ DefaultVolumeControls = (defaultAudio as IHasVolumeDevice).VolumeDevice;
+ CurrentVolumeControls = DefaultVolumeControls;
+
+ var disp = DefaultDisplay as DisplayBase;
+ if (disp != null)
+ {
+ // Link power, warming, cooling to display
+ disp.PowerIsOnFeedback.OutputChange += (o, a) =>
+ {
+ if (disp.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
+ {
+ if (!disp.PowerIsOnFeedback.BoolValue)
+ CurrentSourceInfo = null;
+ OnFeedback.FireUpdate();
+ }
+ };
+
+ disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
+ {
+ IsWarmingUpFeedback.FireUpdate();
+ if (!IsWarmingUpFeedback.BoolValue)
+ (DefaultDisplay as IBasicVolumeWithFeedback).SetVolume(DefaultVolume);
+ };
+ disp.IsCoolingDownFeedback.OutputChange += (o, a) =>
+ {
+ IsCoolingDownFeedback.FireUpdate();
+ if (IsCoolingDownFeedback.BoolValue)
+ (DefaultDisplay as IBasicVolumeWithFeedback).SetVolume(DefaultVolume);
+ };
+ }
+
+ SourceListKey = "default";
+ EnablePowerOnToLastSource = true;
+ }
+
+
+ ///
+ ///
+ ///
+ public override void Shutdown()
+ {
+ RunRouteAction("roomOff");
+ }
+
+ ///
+ /// Routes the default source item, if any
+ ///
+ public void RunDefaultRoute()
+ {
+ if (DefaultSourceItem != null)
+ RunRouteAction(DefaultSourceItem);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void RunRouteAction(string routeKey)
+ {
+ RunRouteAction(routeKey, null);
+ }
+
+ ///
+ /// Gets a source from config list SourceListKey and dynamically build and executes the
+ /// route or commands
+ ///
+ ///
+ public void RunRouteAction(string routeKey, Action successCallback)
+ {
+ // Run this on a separate thread
+ new CTimer(o =>
+ {
+ Debug.Console(1, this, "Run route action '{0}'", routeKey);
+ var dict = ConfigReader.ConfigObject.GetSourceListForKey(SourceListKey);
+ if(dict == null)
+ {
+ Debug.Console(1, this, "WARNING: Config source list '{0}' not found", SourceListKey);
+ return;
+ }
+
+ // Try to get the list item by it's string key
+ if (!dict.ContainsKey(routeKey))
+ {
+ Debug.Console(1, this, "WARNING: No item '{0}' found on config list '{1}'",
+ routeKey, SourceListKey);
+ return;
+ }
+
+ var item = dict[routeKey];
+ //Debug.Console(2, this, "Action {0} has {1} steps",
+ // item.SourceKey, item.RouteList.Count);
+
+ // End usage timer on last source
+ if (!string.IsNullOrEmpty(LastSourceKey))
+ {
+ var lastSource = dict[LastSourceKey].SourceDevice;
+
+ try
+ {
+ if (lastSource != null && lastSource is IUsageTracking)
+ (lastSource as IUsageTracking).UsageTracker.EndDeviceUsage();
+ }
+ catch (Exception e)
+ {
+ Debug.Console(1, this, "*#* EXCEPTION in end usage tracking (257):\r{0}", e);
+ }
+ }
+
+ // Let's run it
+ if (routeKey.ToLower() != "roomoff")
+ {
+ LastSourceKey = routeKey;
+ }
+ else
+ {
+ CurrentSourceInfoKey = null;
+ }
+
+ foreach (var route in item.RouteList)
+ {
+ // if there is a $defaultAll on route, run two separate
+ if (route.DestinationKey.Equals("$defaultAll", StringComparison.OrdinalIgnoreCase))
+ {
+ // Going to assume a single-path route for now
+ var tempVideo = new SourceRouteListItem
+ {
+ DestinationKey = "$defaultDisplay",
+ SourceKey = route.SourceKey,
+ Type = eRoutingSignalType.Video
+ };
+ DoRoute(tempVideo);
+
+ //var tempAudio = new SourceRouteListItem
+ //{
+ // DestinationKey = "$defaultAudio",
+ // SourceKey = route.SourceKey,
+ // Type = eRoutingSignalType.Audio
+ //};
+ //DoRoute(tempAudio);
+ //continue; -- not sure why this was here
+ }
+ else
+ DoRoute(route);
+ }
+
+ // Start usage timer on routed source
+ if (item.SourceDevice is IUsageTracking)
+ {
+ (item.SourceDevice as IUsageTracking).UsageTracker.StartDeviceUsage();
+ }
+
+
+ // Set volume control on room, using default if non provided
+ IBasicVolumeControls volDev = null;
+ // Handle special cases for volume control
+ if (string.IsNullOrEmpty(item.VolumeControlKey)
+ || item.VolumeControlKey.Equals("$defaultAudio", StringComparison.OrdinalIgnoreCase))
+ volDev = DefaultVolumeControls;
+ else if (item.VolumeControlKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase))
+ volDev = DefaultDisplay as IBasicVolumeControls;
+ // Or a specific device, probably rarely used.
+ else
+ {
+ var dev = DeviceManager.GetDeviceForKey(item.VolumeControlKey);
+ if (dev is IBasicVolumeControls)
+ volDev = dev as IBasicVolumeControls;
+ else if (dev is IHasVolumeDevice)
+ volDev = (dev as IHasVolumeDevice).VolumeDevice;
+ }
+ CurrentVolumeControls = volDev;
+
+ // store the name and UI info for routes
+ if (item.SourceKey == "$off")
+ {
+ CurrentSourceInfoKey = routeKey;
+ CurrentSourceInfo = null;
+ }
+ else if (item.SourceKey != null)
+ {
+ CurrentSourceInfoKey = routeKey;
+ CurrentSourceInfo = item;
+ }
+ // And finally, set the "control". This will trigger event
+ //CurrentControlDevice = DeviceManager.GetDeviceForKey(item.SourceKey) as Device;
+
+ OnFeedback.FireUpdate();
+
+ // report back when done
+ if (successCallback != null)
+ successCallback();
+
+ }, 0); // end of CTimer
+ }
+
+ ///
+ /// Will power the room on with the last-used source
+ ///
+ public void PowerOnToDefaultOrLastSource()
+ {
+ if (!EnablePowerOnToLastSource || LastSourceKey == null)
+ return;
+ RunRouteAction(LastSourceKey);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ bool DoRoute(SourceRouteListItem route)
+ {
+ IRoutingSinkNoSwitching dest = null;
+
+ if (route.DestinationKey.Equals("$defaultaudio", StringComparison.OrdinalIgnoreCase))
+ dest = DefaultAudioDevice;
+ else if (route.DestinationKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase))
+ dest = DefaultDisplay;
+ else
+ dest = DeviceManager.GetDeviceForKey(route.DestinationKey) as IRoutingSinkNoSwitching;
+
+ if (dest == null)
+ {
+ Debug.Console(1, this, "Cannot route, unknown destination '{0}'", route.DestinationKey);
+ return false;
+ }
+
+ if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase))
+ {
+ dest.ReleaseRoute();
+ if (dest is IPower)
+ (dest as IPower).PowerOff();
+ }
+ else
+ {
+ var source = DeviceManager.GetDeviceForKey(route.SourceKey) as IRoutingOutputs;
+ if (source == null)
+ {
+ Debug.Console(1, this, "Cannot route unknown source '{0}' to {1}", route.SourceKey, route.DestinationKey);
+ return false;
+ }
+ dest.ReleaseAndMakeRoute(source, route.Type);
+ }
+ return true;
+ }
+
+ ///
+ /// Runs "roomOff" action on all rooms not set to ExcludeFromGlobalFunctions
+ ///
+ public static void AllRoomsOff()
+ {
+ var allRooms = DeviceManager.AllDevices.Where(d =>
+ d is EssentialsHuddleSpaceRoom && !(d as EssentialsHuddleSpaceRoom).ExcludeFromGlobalFunctions);
+ foreach (var room in allRooms)
+ (room as EssentialsHuddleSpaceRoom).RunRouteAction("roomOff");
+ }
+ }
+}
\ No newline at end of file
diff --git a/Essentials/PepperDashEssentials/Room/EssentialsPresentationRoom.cs b/Essentials/PepperDashEssentials/Room/Types/EssentialsPresentationRoom.cs
similarity index 99%
rename from Essentials/PepperDashEssentials/Room/EssentialsPresentationRoom.cs
rename to Essentials/PepperDashEssentials/Room/Types/EssentialsPresentationRoom.cs
index 698013be..4cc4d197 100644
--- a/Essentials/PepperDashEssentials/Room/EssentialsPresentationRoom.cs
+++ b/Essentials/PepperDashEssentials/Room/Types/EssentialsPresentationRoom.cs
@@ -6,6 +6,7 @@ using Crestron.SimplSharp;
using PepperDash.Core;
using PepperDash.Essentials.Core;
+using PepperDash.Essentials.Room.Config;
namespace PepperDash.Essentials
{
diff --git a/Essentials/PepperDashEssentials/Room/EssentialsRoomBase.cs b/Essentials/PepperDashEssentials/Room/Types/EssentialsRoomBase.cs
similarity index 100%
rename from Essentials/PepperDashEssentials/Room/EssentialsRoomBase.cs
rename to Essentials/PepperDashEssentials/Room/Types/EssentialsRoomBase.cs
diff --git a/Essentials/PepperDashEssentials/Room/UI/CrestronTouchpanelPropertiesConfig.cs b/Essentials/PepperDashEssentials/UI - FILES ORPHANED-DELETE/CrestronTouchpanelPropertiesConfig.cs
similarity index 77%
rename from Essentials/PepperDashEssentials/Room/UI/CrestronTouchpanelPropertiesConfig.cs
rename to Essentials/PepperDashEssentials/UI - FILES ORPHANED-DELETE/CrestronTouchpanelPropertiesConfig.cs
index b5144841..f327e0d5 100644
--- a/Essentials/PepperDashEssentials/Room/UI/CrestronTouchpanelPropertiesConfig.cs
+++ b/Essentials/PepperDashEssentials/UI - FILES ORPHANED-DELETE/CrestronTouchpanelPropertiesConfig.cs
@@ -12,7 +12,6 @@
public bool ShowDate { get; set; }
public bool ShowTime { get; set; }
public UiSetupPropertiesConfig Setup { get; set; }
- public UiHeaderStyle HeaderStyle { get; set; }
///
/// The count of sources that will trigger the "additional" arrows to show on the SRL.
@@ -23,25 +22,12 @@
public CrestronTouchpanelPropertiesConfig()
{
SourcesOverflowCount = 5;
- HeaderStyle = UiHeaderStyle.Habanero;
}
}
- ///
- ///
- ///
public class UiSetupPropertiesConfig
{
public bool IsVisible { get; set; }
}
- ///
- ///
- ///
- public enum UiHeaderStyle
- {
- Habanero,
- Verbose
- }
-
}
\ No newline at end of file
diff --git a/Essentials/PepperDashEssentials/Room/UI/DualDisplaySourceSRLController.cs b/Essentials/PepperDashEssentials/UI - FILES ORPHANED-DELETE/DualDisplaySourceSRLController.cs
similarity index 100%
rename from Essentials/PepperDashEssentials/Room/UI/DualDisplaySourceSRLController.cs
rename to Essentials/PepperDashEssentials/UI - FILES ORPHANED-DELETE/DualDisplaySourceSRLController.cs
diff --git a/Essentials/PepperDashEssentials/Room/UI/EssentialsTouchpanelController.cs b/Essentials/PepperDashEssentials/UI - FILES ORPHANED-DELETE/EssentialsTouchpanelController.cs
similarity index 100%
rename from Essentials/PepperDashEssentials/Room/UI/EssentialsTouchpanelController.cs
rename to Essentials/PepperDashEssentials/UI - FILES ORPHANED-DELETE/EssentialsTouchpanelController.cs
diff --git a/Essentials/PepperDashEssentials/Room/UI/SubpageReferenceListActivityItem.cs b/Essentials/PepperDashEssentials/UI - FILES ORPHANED-DELETE/SubpageReferenceListActivityItem.cs
similarity index 100%
rename from Essentials/PepperDashEssentials/Room/UI/SubpageReferenceListActivityItem.cs
rename to Essentials/PepperDashEssentials/UI - FILES ORPHANED-DELETE/SubpageReferenceListActivityItem.cs
diff --git a/Essentials/PepperDashEssentials/Room/UI/SubpageReferenceListSourceItem.cs b/Essentials/PepperDashEssentials/UI - FILES ORPHANED-DELETE/SubpageReferenceListSourceItem.cs
similarity index 100%
rename from Essentials/PepperDashEssentials/Room/UI/SubpageReferenceListSourceItem.cs
rename to Essentials/PepperDashEssentials/UI - FILES ORPHANED-DELETE/SubpageReferenceListSourceItem.cs
diff --git a/Essentials/PepperDashEssentials/UI/CrestronTouchpanelPropertiesConfig.cs b/Essentials/PepperDashEssentials/UI/CrestronTouchpanelPropertiesConfig.cs
index f327e0d5..a79ef0b9 100644
--- a/Essentials/PepperDashEssentials/UI/CrestronTouchpanelPropertiesConfig.cs
+++ b/Essentials/PepperDashEssentials/UI/CrestronTouchpanelPropertiesConfig.cs
@@ -12,6 +12,7 @@
public bool ShowDate { get; set; }
public bool ShowTime { get; set; }
public UiSetupPropertiesConfig Setup { get; set; }
+ public UiHeaderStyle HeaderStyle { get; set; }
///
/// The count of sources that will trigger the "additional" arrows to show on the SRL.
@@ -22,12 +23,25 @@
public CrestronTouchpanelPropertiesConfig()
{
SourcesOverflowCount = 5;
+ HeaderStyle = UiHeaderStyle.Habanero;
}
}
+ ///
+ ///
+ ///
public class UiSetupPropertiesConfig
{
public bool IsVisible { get; set; }
}
+ ///
+ ///
+ ///
+ public enum UiHeaderStyle
+ {
+ Habanero = 0,
+ Verbose
+ }
+
}
\ No newline at end of file
diff --git a/Essentials/PepperDashEssentials/UIDrivers/UIBoolJoin.cs b/Essentials/PepperDashEssentials/UI/JoinConstants/UIBoolJoin.cs
similarity index 77%
rename from Essentials/PepperDashEssentials/UIDrivers/UIBoolJoin.cs
rename to Essentials/PepperDashEssentials/UI/JoinConstants/UIBoolJoin.cs
index bee7544e..a74df0f0 100644
--- a/Essentials/PepperDashEssentials/UIDrivers/UIBoolJoin.cs
+++ b/Essentials/PepperDashEssentials/UI/JoinConstants/UIBoolJoin.cs
@@ -22,6 +22,131 @@ namespace PepperDash.Essentials
///
public const uint VolumeDownPress = 902;
+ //******************************************************
+ // Audio Conference
+ ///
+ /// 1001
+ ///
+ public const uint ACKeypadVisible = 1001;
+ ///
+ /// 1002
+ ///
+ public const uint ACStagingPopoverVisible = 1002;
+ ///
+ /// 1011
+ ///
+ public const uint ACSpeedDial1Press = 1011;
+ ///
+ /// 1012
+ ///
+ public const uint ACSpeedDial2Press = 1012;
+ ///
+ /// 1013
+ ///
+ public const uint ACSpeedDial3Press = 1013;
+ ///
+ /// 1014
+ ///
+ public const uint ACSpeedDial4Press = 1014;
+ ///
+ /// 1021
+ ///
+ public const uint ACSpeedDial1Press = 1021;
+ ///
+ /// 1022
+ ///
+ public const uint ACSpeedDial2Press = 1022;
+ ///
+ /// 1023
+ ///
+ public const uint ACSpeedDial3Press = 1023;
+ ///
+ /// 1024
+ ///
+ public const uint ACSpeedDial4Press = 1024;
+
+ //******************************************************
+ // Video Conference
+ ///
+ /// 1201
+ ///
+ public const uint VCKeypadVisible = 1201;
+ ///
+ /// 1202
+ ///
+ public const uint VCStagingInactivePopoverVisible = 1202;
+ ///
+ ///
+ ///
+ public const uint VCStagingActivePopoverVisible = 1203;
+ ///
+ /// 1205
+ ///
+ public const uint VCDirectoryVisible = 1205;
+ ///
+ /// 1211
+ ///
+ public const uint VCSpeedDial1Press = 1211;
+ ///
+ /// 1212
+ ///
+ public const uint VCSpeedDial2Press = 1212;
+ ///
+ /// 1213
+ ///
+ public const uint VCSpeedDial3Press = 1213;
+ ///
+ /// 1214
+ ///
+ public const uint VCSpeedDial4Press = 1214;
+ ///
+ /// 1221
+ ///
+ public const uint VCSpeedDial1Press = 1221;
+ ///
+ /// 1222
+ ///
+ public const uint VCSpeedDial2Press = 1222;
+ ///
+ /// 1223
+ ///
+ public const uint VCSpeedDial3Press = 1223;
+ ///
+ /// 1224
+ ///
+ public const uint VCSpeedDial4Press = 1224;
+ ///
+ /// 1231
+ ///
+ public const uint VCStagingRecentsPress = 1231;
+ ///
+ /// 1232
+ ///
+ public const uint VCStagingDirectoryPress = 1232;
+ ///
+ /// 1233
+ ///
+ public const uint VCStagingKeypadPress = 1233;
+ ///
+ /// 1234
+ ///
+ public const uint VCStagingConnectPress = 1234;
+
+ //******************************************************
+ // Keyboard
+ ///
+ /// 2901
+ ///
+ public const uint KeyboardVisible = 2901;
+ ///
+ /// 2910
+ ///
+ public const uint KeyboardClearPress = 2910;
+ ///
+ /// 2911
+ ///
+ public const uint KeyboardClearVisible = 2911;
+
///
/// 3811
///
diff --git a/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs b/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs
new file mode 100644
index 00000000..cb7cd96d
--- /dev/null
+++ b/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs
@@ -0,0 +1,38 @@
+namespace PepperDash.Essentials
+{
+ public class UISmartObjectJoin
+ {
+ //******************************************************
+ // Video Conference
+
+ ///
+ /// 1201
+ ///
+ public const uint VCDialKeypad = 1201;
+
+ //******************************************************
+ // General
+
+ ///
+ /// 3200 The staging, source-select list
+ ///
+ public const uint SourceStagingSRL = 3200;
+ ///
+ /// 15022 The main activity footer
+ ///
+ public const uint ActivityFooterSRL = 15022;
+ ///
+ /// 15045
+ ///
+ public const uint CallStagingSrl = 15045;
+ ///
+ /// 3002
+ ///
+ public const uint CallQuickDialList = 15046;
+ ///
+ /// 3003
+ ///
+ public const uint DirectorySrl = 15047;
+
+ }
+}
\ No newline at end of file
diff --git a/Essentials/PepperDashEssentials/UIDrivers/UIStringlJoin.cs b/Essentials/PepperDashEssentials/UI/JoinConstants/UIStringlJoin.cs
similarity index 94%
rename from Essentials/PepperDashEssentials/UIDrivers/UIStringlJoin.cs
rename to Essentials/PepperDashEssentials/UI/JoinConstants/UIStringlJoin.cs
index 67d0c1aa..bb709aad 100644
--- a/Essentials/PepperDashEssentials/UIDrivers/UIStringlJoin.cs
+++ b/Essentials/PepperDashEssentials/UI/JoinConstants/UIStringlJoin.cs
@@ -13,6 +13,13 @@ namespace PepperDash.Essentials
///
public class UIStringJoin
{
+ //******************************************************
+ // Keyboard
+ ///
+ /// 1901
+ ///
+ public const uint KeyboardText = 2901;
+
///
/// 3812
///
diff --git a/Essentials/PepperDashEssentials/UIDrivers/UIUshortJoin.cs b/Essentials/PepperDashEssentials/UI/JoinConstants/UIUshortJoin.cs
similarity index 100%
rename from Essentials/PepperDashEssentials/UIDrivers/UIUshortJoin.cs
rename to Essentials/PepperDashEssentials/UI/JoinConstants/UIUshortJoin.cs
diff --git a/Essentials/PepperDashEssentials/Room/UI/SubpageReferenceListCallStagingItem.cs b/Essentials/PepperDashEssentials/UI/SubpageReferenceListCallStagingItem.cs
similarity index 100%
rename from Essentials/PepperDashEssentials/Room/UI/SubpageReferenceListCallStagingItem.cs
rename to Essentials/PepperDashEssentials/UI/SubpageReferenceListCallStagingItem.cs
diff --git a/Essentials/PepperDashEssentials/UIDrivers/EssentialsCiscoSpark/EssentialsCiscoSparkUiDriver.cs b/Essentials/PepperDashEssentials/UIDrivers/EssentialsCiscoSpark/EssentialsCiscoSparkUiDriver.cs
index 34cac2f3..2fd93da2 100644
--- a/Essentials/PepperDashEssentials/UIDrivers/EssentialsCiscoSpark/EssentialsCiscoSparkUiDriver.cs
+++ b/Essentials/PepperDashEssentials/UIDrivers/EssentialsCiscoSpark/EssentialsCiscoSparkUiDriver.cs
@@ -48,6 +48,12 @@ namespace PepperDash.Essentials.UIDrivers.EssentialsCiscoSpark
{
Codec = codec;
SetupCallStagingSrl();
+
+ InCall = new BoolFeedback(() => false);
+ LocalPrivacyIsMuted = new BoolFeedback(() => false);
+
+ CallQuickDialList = new SmartObjectDynamicList(triList.SmartObjects[UISmartObjectJoin.CallQuickDialList], true, 1);
+ DirectorySrl = new SubpageReferenceList(triList, UISmartObjectJoin.DirectorySrl, 3, 3, 3);
}
///
diff --git a/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/HuddleVTCPanelAvFunctionsDriver.cs b/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/HuddleVTCPanelAvFunctionsDriver.cs
index d7c4e7e2..df3fcb0d 100644
--- a/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/HuddleVTCPanelAvFunctionsDriver.cs
+++ b/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/HuddleVTCPanelAvFunctionsDriver.cs
@@ -8,6 +8,7 @@ using PepperDash.Core;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.SmartObjects;
using PepperDash.Essentials.Core.PageManagers;
+using PepperDash.Essentials.Room.Config;
namespace PepperDash.Essentials
{
@@ -88,7 +89,6 @@ namespace PepperDash.Essentials
///
SubpageReferenceList CallStagingSrl;
-
///
/// Tracks which audio page group the UI is in
///
@@ -150,6 +150,7 @@ namespace PepperDash.Essentials
CallButtonSig = ActivityFooterSrl.BoolInputSig(1, 1);
ShareButtonSig = ActivityFooterSrl.BoolInputSig(2, 1);
+ CallStagingSrl = new SubpageReferenceList(TriList, UISmartObjectJoin.CallStagingSrl, 3, 3, 3);
SetupActivityFooterWhenRoomOff();
@@ -172,7 +173,7 @@ namespace PepperDash.Essentials
var roomConf = CurrentRoom.Config;
- if (Config.HeaderStyle == null || Config.HeaderStyle == UiHeaderStyle.Habanero)
+ if (Config.HeaderStyle == UiHeaderStyle.Habanero)
{
TriList.SetString(UIStringJoin.CurrentRoomName, CurrentRoom.Name);
TriList.SetSigFalseAction(UIBoolJoin.RoomHeaderButtonPress, () =>
diff --git a/Essentials/PepperDashEssentials/UIDrivers/UISmartObjectJoin.cs b/Essentials/PepperDashEssentials/UIDrivers/UISmartObjectJoin.cs
deleted file mode 100644
index 5e302403..00000000
--- a/Essentials/PepperDashEssentials/UIDrivers/UISmartObjectJoin.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-namespace PepperDash.Essentials
-{
- public class UISmartObjectJoin
- {
- ///
- /// 3200 The staging, source-select list
- ///
- public const uint SourceStagingSRL = 3200;
- ///
- /// 15022 The main activity footer
- ///
- public const uint ActivityFooterSRL = 15022;
-
- ///
- /// 15045
- ///
- public const uint CallStagingSrl = 15045;
- }
-}
\ No newline at end of file
diff --git a/Release Package/PepperDashEssentials.cpz b/Release Package/PepperDashEssentials.cpz
index bbb952c7..70657419 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 9f5c7562..572de6e3 100644
Binary files a/Release Package/PepperDashEssentials.dll and b/Release Package/PepperDashEssentials.dll differ