diff --git a/Essentials Devices Common/Essentials Devices Common/Display/InputInterfaces.cs b/Essentials Devices Common/Essentials Devices Common/Display/InputInterfaces.cs
new file mode 100644
index 00000000..ca237a4c
--- /dev/null
+++ b/Essentials Devices Common/Essentials Devices Common/Display/InputInterfaces.cs
@@ -0,0 +1,16 @@
+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(); }
+
+}
\ No newline at end of file
diff --git a/Essentials Devices Common/Essentials Devices Common/Display/SamsungMDCDisplay.cs b/Essentials Devices Common/Essentials Devices Common/Display/SamsungMDCDisplay.cs
index ee6ec9c6..75e6a446 100644
--- a/Essentials Devices Common/Essentials Devices Common/Display/SamsungMDCDisplay.cs
+++ b/Essentials Devices Common/Essentials Devices Common/Display/SamsungMDCDisplay.cs
@@ -14,7 +14,8 @@ namespace PepperDash.Essentials.Devices.Displays
///
///
///
- public class SamsungMDC : TwoWayDisplayBase, IBasicVolumeWithFeedback, ICommunicationMonitor
+ public class SamsungMDC : TwoWayDisplayBase, IBasicVolumeWithFeedback, ICommunicationMonitor, IInputDisplayPort1, IInputDisplayPort2,
+ IInputHdmi1, IInputHdmi2, IInputHdmi3, IInputHdmi4
{
public IBasicCommunication Communication { get; private set; }
diff --git a/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj b/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj
index c6efdea9..807ed249 100644
--- a/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj
+++ b/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj
@@ -114,6 +114,7 @@
+
diff --git a/Essentials/PepperDashEssentials/PepperDashEssentials.csproj b/Essentials/PepperDashEssentials/PepperDashEssentials.csproj
index cb43f6ca..831d7fc7 100644
--- a/Essentials/PepperDashEssentials/PepperDashEssentials.csproj
+++ b/Essentials/PepperDashEssentials/PepperDashEssentials.csproj
@@ -144,6 +144,7 @@
+
@@ -154,6 +155,7 @@
+
diff --git a/Essentials/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs b/Essentials/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
index 934bd1f5..7b5c35bb 100644
--- a/Essentials/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
+++ b/Essentials/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
@@ -69,11 +69,30 @@ namespace PepperDash.Essentials.Room.Config
rm.DefaultSourceItem = props.DefaultSourceItem;
rm.DefaultVolume = (ushort)(props.Volumes.Master.Level * 65535 / 100);
+ rm.Emergency = GetEmergency(props, rm); // Get emergency object, if any
+
return rm;
}
return null;
}
+
+ ///
+ /// Gets and operating, standalone emergegncy object that can be plugged into a room.
+ /// Returns null if there is no emergency defined
+ ///
+ EssentialsRoomEmergencyBase GetEmergency(EssentialsRoomPropertiesConfig props, EssentialsRoomBase room)
+ {
+ // This emergency
+ var emergency = props.Emergency;
+ if (emergency != null)
+ {
+ //switch on emergency type here. Right now only contact and shutdown
+ var e = new EssentialsRoomEmergencyContactClosure(room.Key + "-emergency", props.Emergency, room);
+ DeviceManager.AddDevice(e);
+ }
+ return null;
+ }
}
///
@@ -81,6 +100,7 @@ namespace PepperDash.Essentials.Room.Config
///
public class EssentialsRoomPropertiesConfig
{
+ public EssentialsRoomEmergencyConfig Emergency { get; set; }
public string HelpMessage { get; set; }
public string Description { get; set; }
public int ShutdownVacancySeconds { get; set; }
diff --git a/Essentials/PepperDashEssentials/Room/Config/EssentialsRoomEmergencyConfig.cs b/Essentials/PepperDashEssentials/Room/Config/EssentialsRoomEmergencyConfig.cs
new file mode 100644
index 00000000..69d04579
--- /dev/null
+++ b/Essentials/PepperDashEssentials/Room/Config/EssentialsRoomEmergencyConfig.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Essentials.Room.Config
+{
+ ///
+ ///
+ ///
+ public class EssentialsRoomEmergencyConfig
+ {
+ public EssentialsRoomEmergencyTriggerConfig Trigger { get; set; }
+
+ public string Behavior { get; set; }
+ }
+
+ ///
+ ///
+ ///
+ public class EssentialsRoomEmergencyTriggerConfig
+ {
+ ///
+ /// contact,
+ ///
+ public string Type { get; set; }
+ ///
+ /// Input number if contact
+ ///
+ public int Number { get; set; }
+
+ public bool TriggerOnClose { get; set; }
+
+ }
+}
\ No newline at end of file
diff --git a/Essentials/PepperDashEssentials/Room/Emergency/EsentialsRoomEmergencyContactClosure.cs b/Essentials/PepperDashEssentials/Room/Emergency/EsentialsRoomEmergencyContactClosure.cs
new file mode 100644
index 00000000..330cb250
--- /dev/null
+++ b/Essentials/PepperDashEssentials/Room/Emergency/EsentialsRoomEmergencyContactClosure.cs
@@ -0,0 +1,62 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using Crestron.SimplSharpPro;
+using Crestron.SimplSharpPro.DeviceSupport;
+
+using PepperDash.Core;
+using PepperDash.Essentials.Core;
+using PepperDash.Essentials.Room.Config;
+
+namespace PepperDash.Essentials.Room
+{
+ public abstract class EssentialsRoomEmergencyBase : IKeyed
+ {
+ public string Key { get; private set; }
+
+ public EssentialsRoomEmergencyBase(string key)
+ {
+ Key = key;
+ }
+ }
+
+
+ public class EssentialsRoomEmergencyContactClosure : EssentialsRoomEmergencyBase
+ {
+ EssentialsRoomBase Room;
+ string Behavior;
+ bool TriggerOnClose;
+
+ public EssentialsRoomEmergencyContactClosure(string key, EssentialsRoomEmergencyConfig config, EssentialsRoomBase room) :
+ base(key)
+ {
+ Room = room;
+ var cs = Global.ControlSystem;
+
+ if (config.Trigger.Type.Equals("contact", StringComparison.OrdinalIgnoreCase))
+ {
+ if (config.Trigger.Number <= cs.NumberOfDigitalInputPorts)
+ cs.DigitalInputPorts[(uint)config.Trigger.Number].StateChange += new DigitalInputEventHandler(EsentialsRoomEmergencyContactClosure_StateChange);
+ }
+ Behavior = config.Behavior;
+ TriggerOnClose = config.Trigger.TriggerOnClose;
+ }
+
+ void EsentialsRoomEmergencyContactClosure_StateChange(DigitalInput digitalInput, DigitalInputEventArgs args)
+ {
+ if (args.State && TriggerOnClose || !args.State && !TriggerOnClose)
+ RunEmergencyBehavior();
+ }
+
+ ///
+ ///
+ ///
+ public void RunEmergencyBehavior()
+ {
+ if (Behavior.Equals("shutdown"))
+ Room.Shutdown();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Essentials/PepperDashEssentials/Room/Types/EssentialsRoomBase.cs b/Essentials/PepperDashEssentials/Room/Types/EssentialsRoomBase.cs
index 6cea3717..2652f99f 100644
--- a/Essentials/PepperDashEssentials/Room/Types/EssentialsRoomBase.cs
+++ b/Essentials/PepperDashEssentials/Room/Types/EssentialsRoomBase.cs
@@ -45,6 +45,8 @@ namespace PepperDash.Essentials
public int ShutdownVacancySeconds { get; set; }
public ShutdownType ShutdownType { get; private set; }
+ public PepperDash.Essentials.Room.EssentialsRoomEmergencyBase Emergency { get; set; }
+
public string LogoUrl { get; set; }
///
diff --git a/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs b/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs
index eb79c655..207a7162 100644
--- a/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs
+++ b/Essentials/PepperDashEssentials/UI/JoinConstants/UISmartObjectJoin.cs
@@ -41,6 +41,10 @@
/// 3903
///
public const uint TechPinDialogKeypad = 3903;
+ ///
+ /// 3904 - Display controls on the tech page
+ ///
+ public const uint TechDisplayControlsList = 3904;
}
}
\ No newline at end of file
diff --git a/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/EssentialsHuddleTechPageDriver.cs b/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/EssentialsHuddleTechPageDriver.cs
index 641bfc1f..e9efd398 100644
--- a/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/EssentialsHuddleTechPageDriver.cs
+++ b/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/EssentialsHuddleTechPageDriver.cs
@@ -11,6 +11,7 @@ using PepperDash.Essentials;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.SmartObjects;
using PepperDash.Essentials.Core.Touchpanels.Keyboards;
+using PepperDash.Essentials.Devices.Displays;
namespace PepperDash.Essentials.UIDrivers
{
@@ -25,6 +26,10 @@ namespace PepperDash.Essentials.UIDrivers
///
SubpageReferenceList StatusList;
///
+ /// The list of display controls
+ ///
+ SubpageReferenceList DisplayList;
+ ///
/// References lines in the list against device instances
///
Dictionary StatusListDeviceIndexes;
@@ -96,6 +101,8 @@ namespace PepperDash.Essentials.UIDrivers
BuildStatusList();
+ BuildDisplayList();
+
SetupPinModal();
}
@@ -239,6 +246,47 @@ namespace PepperDash.Essentials.UIDrivers
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);
+ Debug.Console(1, "#################### Config has {0} displays", devKeys.Count());
+ var disps = DeviceManager.AllDevices.Where(d =>
+ devKeys.Contains(d.Key));
+ Debug.Console(1, "#################### Devices has {0} displays", disps.Count());
+ 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);
+ 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, 7).SetSigFalseAction(() =>
+ { if (display is IInputDisplayPort1) (display as IInputDisplayPort1).InputDisplayPort1(); });
+ }
+ }
+
+ DisplayList.Count = i;
+ }
+
///
///
///
diff --git a/Release Package/PepperDashEssentials.cpz b/Release Package/PepperDashEssentials.cpz
index 1871f08c..a9eaa48f 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 48850cd2..c743f06a 100644
Binary files a/Release Package/PepperDashEssentials.dll and b/Release Package/PepperDashEssentials.dll differ
diff --git a/devjson commands.json b/devjson commands.json
index a8afd494..03a1f2bc 100644
--- a/devjson commands.json
+++ b/devjson commands.json
@@ -17,3 +17,5 @@ devjson:1 {"deviceKey":"mockVc-1", "methodName":"TestIncomingAudioCall", "params
devjson:1 {"deviceKey":"mockVc-1", "methodName":"TestIncomingVideoCall", "params": ["444-444-4444"]}
devjson:1 {"deviceKey":"mockVc-1", "methodName":"ListCalls"}
+
+devjson:1 {"deviceKey":"room1-emergency", "methodName":"RunEmergencyBehavior"}
\ No newline at end of file