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