diff --git a/PepperDashEssentials/PepperDashEssentials.csproj b/PepperDashEssentials/PepperDashEssentials.csproj
index d215f64e..758542d4 100644
--- a/PepperDashEssentials/PepperDashEssentials.csproj
+++ b/PepperDashEssentials/PepperDashEssentials.csproj
@@ -233,6 +233,9 @@
Essentials Devices Common
+
+
+
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Types/EssentialsDualDisplayRoom.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Types/EssentialsDualDisplayRoom.cs
deleted file mode 100644
index f93b579e..00000000
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Types/EssentialsDualDisplayRoom.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-using System.Linq;
-using Crestron.SimplSharp;
-
-using Newtonsoft.Json;
-
-using PepperDash.Core;
-using PepperDash.Essentials.Core;
-using PepperDash.Essentials.Core.Config;
-using PepperDash.Essentials.Core.Rooms;
-using PepperDash.Essentials.Core.Rooms.Config;
-using PepperDash.Essentials.Core.Devices.Codec;
-using PepperDash.Essentials.Core.Devices.VideoCodec;
-using PepperDash.Essentials.Core.Devices.AudioCodec;
-
-namespace PepperDash.Essentials
-{
- public class EssentialsDualDisplayRoom
- {
-
- }
-}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Behaviours/RoomOnToDefaultSourceWhenOccupied.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Behaviours/RoomOnToDefaultSourceWhenOccupied.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Behaviours/RoomOnToDefaultSourceWhenOccupied.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Behaviours/RoomOnToDefaultSourceWhenOccupied.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/DDVC01RoomPropertiesConfig.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/DDVC01RoomPropertiesConfig.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/DDVC01RoomPropertiesConfig.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/DDVC01RoomPropertiesConfig.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsDualDisplayRoomPropertiesConfig.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsDualDisplayRoomPropertiesConfig.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsDualDisplayRoomPropertiesConfig.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsDualDisplayRoomPropertiesConfig.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsHuddleRoomPropertiesConfig.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsHuddleRoomPropertiesConfig.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsHuddleRoomPropertiesConfig.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsHuddleRoomPropertiesConfig.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsHuddleVtc1PropertiesConfig.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsHuddleVtc1PropertiesConfig.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsHuddleVtc1PropertiesConfig.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsHuddleVtc1PropertiesConfig.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsNDisplayRoomPropertiesConfig.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsNDisplayRoomPropertiesConfig.cs
similarity index 70%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsNDisplayRoomPropertiesConfig.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsNDisplayRoomPropertiesConfig.cs
index 30d1ea38..4678574a 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsNDisplayRoomPropertiesConfig.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsNDisplayRoomPropertiesConfig.cs
@@ -16,14 +16,8 @@ namespace PepperDash.Essentials.Core.Rooms.Config
public string DefaultAudioBehavior { get; set; }
[JsonProperty("defaultVideoBehavior")]
public string DefaultVideoBehavior { get; set; }
- [JsonProperty("displays")]
- public Dictionary Displays { get; set; }
-
- public EssentialsNDisplayRoomPropertiesConfig()
- {
- Displays = new Dictionary();
- }
-
+ [JsonProperty("destinationListKey")]
+ public string DestinationListKey { get; set; }
}
public class DisplayItem : IKeyName
@@ -31,5 +25,4 @@ namespace PepperDash.Essentials.Core.Rooms.Config
public string Key { get; set; }
public string Name { get; set; }
}
-
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsPresentationPropertiesConfig.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsPresentationPropertiesConfig.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsPresentationPropertiesConfig.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsPresentationPropertiesConfig.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsRoomConfig.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsRoomConfig.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsRoomConfig.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsRoomConfig.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsRoomEmergencyConfig.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsRoomEmergencyConfig.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsRoomEmergencyConfig.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsRoomEmergencyConfig.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsVolumeLevelConfig.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsVolumeLevelConfig.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Config/EssentialsVolumeLevelConfig.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Config/EssentialsVolumeLevelConfig.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Emergency/EsentialsRoomEmergencyContactClosure.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Emergency/EsentialsRoomEmergencyContactClosure.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Emergency/EsentialsRoomEmergencyContactClosure.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Emergency/EsentialsRoomEmergencyContactClosure.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/EssentialsRoomBase.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/EssentialsRoomBase.cs
similarity index 99%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/EssentialsRoomBase.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/EssentialsRoomBase.cs
index 901bc52d..d5d77fe4 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/EssentialsRoomBase.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/EssentialsRoomBase.cs
@@ -47,6 +47,8 @@ namespace PepperDash.Essentials.Core
///
public bool EnablePowerOnToLastSource { get; set; }
+ public const string DefaultSourceListKey = "default";
+
protected EssentialsRoomBase(DeviceConfig config)
: base(config)
{
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Interfaces.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Interfaces.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Interfaces.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Interfaces.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Room.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Room.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Room.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Room.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Types/EssentialsDualDisplayRoom.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Types/EssentialsDualDisplayRoom.cs
new file mode 100644
index 00000000..8e0c05f7
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Types/EssentialsDualDisplayRoom.cs
@@ -0,0 +1,192 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using PepperDash.Core;
+using PepperDash.Essentials.Core;
+using PepperDash.Essentials.Core.Config;
+using PepperDash.Essentials.Core.Rooms.Config;
+using PepperDash_Essentials_Core.Devices;
+
+namespace PepperDash.Essentials
+{
+ public class EssentialsDualDisplayRoom : EssentialsRoomBase
+ {
+ public const string DefaultDestinationListKey = "default";
+ private const string LeftDestinationKey = "leftDisplay";
+ private const string RightDestinationKey = "rightDisplay";
+ private readonly EssentialsDualDisplayRoomPropertiesConfig _config;
+
+ private string _destinationListKey;
+
+ public EssentialsDualDisplayRoom(DeviceConfig config) : base(config)
+ {
+ _config = config.Properties.ToObject();
+
+ DefaultDisplay = DeviceManager.GetDeviceForKey(_config.DefaultDisplayKey) as IRoutingSinkWithSwitching;
+ DefaultAudioDevice = DeviceManager.GetDeviceForKey(_config.DefaultAudioKey) as IRoutingSinkWithSwitching;
+
+ Initialize();
+ }
+
+ public Dictionary DestinationList { get; private set; }
+
+ public BoolFeedback LeftDisplayIsWarmingUpFeedback { get; private set; }
+ public BoolFeedback RightDisplayIsWarmingUpFeedback { get; private set; }
+ public BoolFeedback LeftDisplayIsCoolingDownFeedback { get; private set; }
+ public BoolFeedback RightDisplayIsCoolingDownFeedback { get; private set; }
+
+ public IRoutingSinkWithSwitching LeftDisplay { get; private set; }
+ public IRoutingSinkWithSwitching RightDisplay { get; private set; }
+
+ private void Initialize()
+ {
+ if (DefaultAudioDevice is IBasicVolumeControls)
+ {
+ DefaultVolumeControls = DefaultAudioDevice as IBasicVolumeControls;
+ }
+ else if (DefaultAudioDevice is IHasVolumeDevice)
+ {
+ DefaultVolumeControls = (DefaultAudioDevice as IHasVolumeDevice).VolumeDevice;
+ }
+
+ CurrentVolumeControls = DefaultVolumeControls;
+
+ _destinationListKey = String.IsNullOrEmpty(_config.DestinationListKey)
+ ? DefaultDestinationListKey
+ : _config.DestinationListKey;
+
+ SourceListKey = String.IsNullOrEmpty(_config.SourceListKey) ? DefaultSourceListKey : _config.SourceListKey;
+
+ InitializeDestinations();
+ }
+
+ private void InitializeDestinations()
+ {
+ DestinationList = ConfigReader.ConfigObject.GetDestinationListForKey(_destinationListKey);
+
+ if (DestinationList == null)
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Error, "No destination list with key {0} found",
+ _destinationListKey);
+ return;
+ }
+
+ //left destination is defined as the display on the 0 surface, at location 0,0 (h, v)
+ var leftDest = GetDestinationForKey(LeftDestinationKey);
+
+ //not found by key, check by expected location
+ if (leftDest == null)
+ {
+ DestinationList.Values.FirstOrDefault(
+ (li) => li.SurfaceLocation == 0 && li.HorizontalLocation == 0 && li.VerticalLocation == 0);
+ }
+
+ //right destination is defined as the display on the 0 surface, at location 0,0 (h, v)
+ var rightDest = GetDestinationForKey(RightDestinationKey);
+
+ //not found by key, check by expected location
+ if (rightDest == null)
+ {
+ DestinationList.Values.FirstOrDefault(
+ (li) => li.SurfaceLocation == 0 && li.HorizontalLocation == 1 && li.VerticalLocation == 0);
+ }
+
+ if (leftDest == null || rightDest == null)
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Error, "Dual destinations not defined. Please check configuration");
+ return;
+ }
+
+ var leftDisplay = leftDest.SinkDevice as DisplayBase;
+ var rightDisplay = rightDest.SinkDevice as DisplayBase;
+
+ if (leftDisplay == null || rightDisplay == null)
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Error,
+ "Display for key {0} && key {1} not found. Please check configurattion");
+ Debug.Console(0, Debug.ErrorLogLevel.Error, "LeftDisplay: {0}\r\nRightDisplay: {1}", leftDest.SinkKey,
+ rightDest.SinkKey);
+
+ return;
+ }
+
+ //need displays as DisplayBase later instead of IRoutingSinkWithSwtich
+ LeftDisplay = leftDisplay;
+ RightDisplay = rightDisplay;
+
+ //TODO: Check this definition for on for dual display rooms
+ OnFeedbackFunc = () => CurrentSourceInfo != null && CurrentSourceInfo.Type == eSourceListItemType.Route;
+
+ IsWarmingFeedbackFunc =
+ () => leftDisplay.IsWarmingUpFeedback.BoolValue || rightDisplay.IsWarmingUpFeedback.BoolValue;
+
+ IsCoolingFeedbackFunc = () => leftDisplay.IsWarmingUpFeedback.BoolValue ||
+ rightDisplay.IsCoolingDownFeedback.BoolValue;
+
+ LeftDisplayIsWarmingUpFeedback = new BoolFeedback(() => leftDisplay.IsWarmingUpFeedback.BoolValue);
+ LeftDisplayIsCoolingDownFeedback = new BoolFeedback(() => leftDisplay.IsCoolingDownFeedback.BoolValue);
+
+
+ RightDisplayIsWarmingUpFeedback = new BoolFeedback(() => rightDisplay.IsWarmingUpFeedback.BoolValue);
+ RightDisplayIsCoolingDownFeedback = new BoolFeedback(() => rightDisplay.IsCoolingDownFeedback.BoolValue);
+
+ InitializeDisplay(leftDisplay);
+ InitializeDisplay(rightDisplay);
+ }
+
+ private DestinationListItem GetDestinationForKey(string key)
+ {
+ DestinationListItem returnValue;
+
+ DestinationList.TryGetValue(key, out returnValue);
+
+ return returnValue;
+ }
+
+
+ protected override void IsCoolingDownFeedbackOnOutputChange(object sender, FeedbackEventArgs args)
+ {
+ IsCoolingDownFeedback.FireUpdate();
+ LeftDisplayIsCoolingDownFeedback.FireUpdate();
+ RightDisplayIsCoolingDownFeedback.FireUpdate();
+ }
+
+ public override void RoomVacatedForTimeoutPeriod(object o)
+ {
+ throw new NotImplementedException();
+ }
+
+
+ protected override void IsWarmingUpFeedbackOnOutputChange(object sender, FeedbackEventArgs args)
+ {
+ IsWarmingUpFeedback.FireUpdate();
+ LeftDisplayIsWarmingUpFeedback.FireUpdate();
+ RightDisplayIsWarmingUpFeedback.FireUpdate();
+ }
+
+ protected override void PowerIsOnFeedbackOnOutputChange(object sender, FeedbackEventArgs args)
+ {
+ var ld = LeftDisplay as DisplayBase;
+ var rd = RightDisplay as DisplayBase;
+
+ if (ld == null || rd == null)
+ {
+ return;
+ }
+
+ //if room is already on and either display is still on, no need to fire update
+ if (OnFeedback.BoolValue && (ld.PowerIsOnFeedback.BoolValue || rd.PowerIsOnFeedback.BoolValue))
+ {
+ return;
+ }
+
+ //if both displays are off, room is off, clear the current source
+ if (!ld.PowerIsOnFeedback.BoolValue && !rd.PowerIsOnFeedback.BoolValue)
+ {
+ CurrentSourceInfo = null;
+ }
+
+ OnFeedback.FireUpdate();
+ }
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Types/EssentialsHuddleSpaceRoom.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Types/EssentialsHuddleSpaceRoom.cs
similarity index 99%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Types/EssentialsHuddleSpaceRoom.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Types/EssentialsHuddleSpaceRoom.cs
index b36039f4..eb332e98 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Types/EssentialsHuddleSpaceRoom.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Types/EssentialsHuddleSpaceRoom.cs
@@ -47,7 +47,7 @@ namespace PepperDash.Essentials
CurrentVolumeControls = DefaultVolumeControls;
SourceListKey = String.IsNullOrEmpty(PropertiesConfig.SourceListKey)
- ? "default"
+ ? DefaultSourceListKey
: PropertiesConfig.SourceListKey;
EnablePowerOnToLastSource = true;
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Types/EssentialsHuddleVtc1Room.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Types/EssentialsHuddleVtc1Room.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Types/EssentialsHuddleVtc1Room.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Types/EssentialsHuddleVtc1Room.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Types/EssentialsNDisplayRoomBase.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Types/EssentialsNDisplayRoomBase.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/Types/EssentialsNDisplayRoomBase.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/Types/EssentialsNDisplayRoomBase.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/iOccupancyStatusProvider.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/iOccupancyStatusProvider.cs
similarity index 100%
rename from essentials-framework/Essentials Core/PepperDashEssentialsBase/Room/iOccupancyStatusProvider.cs
rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Rooms/iOccupancyStatusProvider.cs
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/SubpageReferenceList.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/SubpageReferenceList.cs
index fe69e4ca..720d1c6e 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/SubpageReferenceList.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/SmartObjects/SubpageReferencList/SubpageReferenceList.cs
@@ -66,8 +66,7 @@ namespace PepperDash.Essentials.Core
StringIncrement = stringIncrement;
// Count the enable lines to see what max items is
- MaxDefinedItems = (ushort)SRL.BooleanInput
- .Where(s => s.Name.Contains("Enable")).Count();
+ MaxDefinedItems = (ushort)SRL.BooleanInput.Count(s => s.Name.Contains("Enable"));
Debug.Console(2, "SRL {0} contains max {1} items", SRL.ID, MaxDefinedItems);
SRL.SigChange -= new SmartObjectSigChangeEventHandler(SRL_SigChange);