diff --git a/Essentials/PepperDashEssentials/ControlSystem.cs b/Essentials/PepperDashEssentials/ControlSystem.cs index c5de215b..f9708f48 100644 --- a/Essentials/PepperDashEssentials/ControlSystem.cs +++ b/Essentials/PepperDashEssentials/ControlSystem.cs @@ -59,7 +59,7 @@ namespace PepperDash.Essentials "Template URL: {1}", ConfigReader.ConfigObject.SystemUrl, ConfigReader.ConfigObject.TemplateUrl); }, "portalinfo", "Shows portal URLS from configuration", ConsoleAccessLevelEnum.AccessOperator); - GoWithLoad(); + //GoWithLoad(); } /// diff --git a/Essentials/PepperDashEssentials/OTHER/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs b/Essentials/PepperDashEssentials/OTHER/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs index 93db0a6e..bc0eae18 100644 --- a/Essentials/PepperDashEssentials/OTHER/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs +++ b/Essentials/PepperDashEssentials/OTHER/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs @@ -1005,6 +1005,10 @@ namespace PepperDash.Essentials.Fusion /// void SetUpCommunitcationMonitors() { + uint displayNum = 0; + uint touchpanelNum = 0; + uint xpanelNum = 0; + // Attach to all room's devices with monitors. //foreach (var dev in DeviceManager.Devices) foreach (var dev in DeviceManager.GetDevices()) @@ -1012,41 +1016,56 @@ namespace PepperDash.Essentials.Fusion if (!(dev is ICommunicationMonitor)) continue; - var keyNum = ExtractNumberFromKey(dev.Key); - if (keyNum == -1) - { - Debug.Console(1, this, "WARNING: Cannot link device '{0}' to numbered Fusion monitoring attributes", - dev.Key); - continue; - } - string attrName = null; - uint attrNum = Convert.ToUInt32(keyNum); + string attrName = null; + uint attrNum = 1; - if (dev is EssentialsTouchpanelController) + //var keyNum = ExtractNumberFromKey(dev.Key); + //if (keyNum == -1) + //{ + // Debug.Console(1, this, "WARNING: Cannot link device '{0}' to numbered Fusion monitoring attributes", + // dev.Key); + // continue; + //} + //uint attrNum = Convert.ToUInt32(keyNum); + + // Check for UI devices + var uiDev = dev as EssentialsTouchpanelController; + if (uiDev != null) { - if ((dev as EssentialsTouchpanelController).Panel is Crestron.SimplSharpPro.DeviceSupport.TswFt5Button) - { - if (attrNum > 10) - continue; - attrName = "Online - Touch Panel " + attrNum; - attrNum += 150; - } - else if ((dev as EssentialsTouchpanelController).Panel is Crestron.SimplSharpPro.UI.XpanelForSmartGraphics) + if (uiDev.Panel is Crestron.SimplSharpPro.UI.XpanelForSmartGraphics) { + attrNum = attrNum + touchpanelNum; + if (attrNum > 10) continue; attrName = "Online - XPanel " + attrNum; attrNum += 160; + + touchpanelNum++; } - } + else + { + attrNum = attrNum + xpanelNum; + + if (attrNum > 10) + continue; + attrName = "Online - Touch Panel " + attrNum; + attrNum += 150; + + xpanelNum++; + } + } //else if (dev is DisplayBase) { + attrNum = attrNum + displayNum; if (attrNum > 10) continue; attrName = "Online - Display " + attrNum; attrNum += 170; + + displayNum++; } //else if (dev is DvdDeviceBase) //{ @@ -1265,7 +1284,7 @@ namespace PepperDash.Essentials.Fusion /// -1 if no number matched int ExtractNumberFromKey(string key) { - var capture = System.Text.RegularExpressions.Regex.Match(key, @"\D+(\d+)"); + var capture = System.Text.RegularExpressions.Regex.Match(key, @"\b(\d+)"); if (!capture.Success) return -1; else return Convert.ToInt32(capture.Groups[1].Value); diff --git a/Essentials/PepperDashEssentials/UI/CrestronTouchpanelPropertiesConfig.cs b/Essentials/PepperDashEssentials/UI/CrestronTouchpanelPropertiesConfig.cs index cfa8e996..4b504af0 100644 --- a/Essentials/PepperDashEssentials/UI/CrestronTouchpanelPropertiesConfig.cs +++ b/Essentials/PepperDashEssentials/UI/CrestronTouchpanelPropertiesConfig.cs @@ -12,7 +12,9 @@ public bool ShowDate { get; set; } public bool ShowTime { get; set; } public UiSetupPropertiesConfig Setup { get; set; } - public string HeaderStyle { get; set; } + public string HeaderStyle { get; set; } + public bool IncludeInFusionRoomHealth { get; set; } + /// /// The count of sources that will trigger the "additional" arrows to show on the SRL. diff --git a/Essentials/PepperDashEssentials/UI/EssentialsTouchpanelController.cs b/Essentials/PepperDashEssentials/UI/EssentialsTouchpanelController.cs index e9cdd21c..fb053ffe 100644 --- a/Essentials/PepperDashEssentials/UI/EssentialsTouchpanelController.cs +++ b/Essentials/PepperDashEssentials/UI/EssentialsTouchpanelController.cs @@ -1,181 +1,309 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Crestron.SimplSharp; -using Crestron.SimplSharp.CrestronIO; -using Crestron.SimplSharpPro; -using Crestron.SimplSharpPro.DeviceSupport; -using Crestron.SimplSharpPro.UI; -using PepperDash.Core; -using PepperDash.Essentials.Core; -using PepperDash.Essentials.Core.PageManagers; - -namespace PepperDash.Essentials -{ - public class EssentialsTouchpanelController : Device - { - public BasicTriListWithSmartObject Panel { get; private set; } - - public PanelDriverBase PanelDriver { get; private set; } - - CTimer BacklightTransitionedOnTimer; - - public EssentialsTouchpanelController(string key, string name, Tswx52ButtonVoiceControl tsw, - string projectName, string sgdPath) - : base(key, name) - { - Panel = tsw; - tsw.LoadSmartObjects(sgdPath); - tsw.SigChange += new Crestron.SimplSharpPro.DeviceSupport.SigEventHandler(Tsw_SigChange); - } - - /// - /// Config constructor - /// - public EssentialsTouchpanelController(string key, string name, string type, CrestronTouchpanelPropertiesConfig props, uint id) - : base(key, name) - { - - Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Creating touchpanel hardware..."); - type = type.ToLower(); - try - { - if (type == "crestronapp") - { - var app = new CrestronApp(id, Global.ControlSystem); - app.ParameterProjectName.Value = props.ProjectName; - Panel = app; - } - else if (type == "tsw550") - Panel = new Tsw550(id, Global.ControlSystem); - else if (type == "tsw552") - Panel = new Tsw552(id, Global.ControlSystem); - else if (type == "tsw560") - Panel = new Tsw560(id, Global.ControlSystem); - else if (type == "tsw750") - Panel = new Tsw750(id, Global.ControlSystem); - else if (type == "tsw752") - Panel = new Tsw752(id, Global.ControlSystem); - else if (type == "tsw760") - Panel = new Tsw760(id, Global.ControlSystem); - else if (type == "tsw1050") - Panel = new Tsw1050(id, Global.ControlSystem); - else if (type == "tsw1052") - Panel = new Tsw1052(id, Global.ControlSystem); - else if (type == "tsw1060") - Panel = new Tsw1060(id, Global.ControlSystem); - else - { - Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW controller with type '{0}'", type); - return; - } - } - catch (Exception e) - { - Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW base class. Panel will not function: {0}", e.Message); - return; - } - - // Reserved sigs - if (Panel is TswFt5ButtonSystem) - { - var tsw = Panel as TswFt5ButtonSystem; - tsw.ExtenderSystemReservedSigs.Use(); - tsw.ExtenderSystemReservedSigs.DeviceExtenderSigChange - += ExtenderSystemReservedSigs_DeviceExtenderSigChange; - - tsw.ButtonStateChange += new ButtonEventHandler(Tsw_ButtonStateChange); - - } - - if (Panel.Register() != eDeviceRegistrationUnRegistrationResponse.Success) - Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Registration failed. Continuing, but panel may not function: {0}", Panel.RegistrationFailureReason); - - // Give up cleanly if SGD is not present. - var sgdName = Global.FilePathPrefix - + Global.DirectorySeparator + "sgd" + Global.DirectorySeparator + props.SgdFile; - if (!File.Exists(sgdName)) - { - Debug.Console(0, this, "ERROR: Smart object file '{0}' not present. Exiting TSW load", sgdName); - return; - } - - Panel.LoadSmartObjects(sgdName); - Panel.SigChange += Tsw_SigChange; - - } - - public void LoadAndShowDriver(PanelDriverBase driver) - { - PanelDriver = driver; - driver.Show(); - } - - void HomePressed() - { - if (BacklightTransitionedOnTimer == null) - PanelDriver.BackButtonPressed(); - } - - - void ExtenderSystemReservedSigs_DeviceExtenderSigChange(DeviceExtender currentDeviceExtender, SigEventArgs args) - { - // If the sig is transitioning on, mark it in case it was home button that transitioned it - var blOnSig = (Panel as TswFt5ButtonSystem).ExtenderSystemReservedSigs.BacklightOnFeedback; - if (args.Sig == blOnSig && blOnSig.BoolValue) - { - BacklightTransitionedOnTimer = new CTimer(o => - { - BacklightTransitionedOnTimer = null; - }, 200); - } - } - - public void PulseBool(uint join) - { - var act = Panel.BooleanInput[join].UserObject as Action; - if (act != null) - { - act(true); - act(false); - } - } - - public void SetBoolSig(uint join, bool value) - { - var act = Panel.BooleanInput[join].UserObject as Action; - if (act != null) - act(value); - } - - public void SetIntSig(uint join, ushort value) - { - var act = Panel.BooleanInput[join].UserObject as Action; - if (act != null) - { - act(value); - } - } - - void Tsw_SigChange(object currentDevice, Crestron.SimplSharpPro.SigEventArgs args) - { - if (Debug.Level == 2) - Debug.Console(2, this, "Sig change: {0} {1}={2}", args.Sig.Type, args.Sig.Number, args.Sig.StringValue); - var uo = args.Sig.UserObject; - if (uo is Action) - (uo as Action)(args.Sig.BoolValue); - else if (uo is Action) - (uo as Action)(args.Sig.UShortValue); - else if (uo is Action) - (uo as Action)(args.Sig.StringValue); - } - - void Tsw_ButtonStateChange(GenericBase device, ButtonEventArgs args) - { - var uo = args.Button.UserObject; - if(uo is Action) - (uo as Action)(args.Button.State == eButtonState.Pressed); - } - } +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Crestron.SimplSharp; +using Crestron.SimplSharp.CrestronIO; +using Crestron.SimplSharpPro; +using Crestron.SimplSharpPro.DeviceSupport; +using Crestron.SimplSharpPro.UI; +using PepperDash.Core; +using PepperDash.Essentials.Core; +using PepperDash.Essentials.Core.PageManagers; + +namespace PepperDash.Essentials +{ + public class EssentialsTouchpanelController : Device, ICommunicationMonitor + { + public BasicTriListWithSmartObject Panel { get; private set; } + + public StatusMonitorBase CommunicationMonitor { get; private set; } + + public bool IncludeInFusionRoomHealth { get; private set; } + + public PanelDriverBase PanelDriver { get; private set; } + + CTimer BacklightTransitionedOnTimer; + + public EssentialsTouchpanelController(string key, string name, Tswx52ButtonVoiceControl tsw, + string projectName, string sgdPath) + : base(key, name) + { + Panel = tsw; + tsw.LoadSmartObjects(sgdPath); + tsw.SigChange += new Crestron.SimplSharpPro.DeviceSupport.SigEventHandler(Tsw_SigChange); + } + + /// + /// Config constructor + /// + public EssentialsTouchpanelController(string key, string name, string type, CrestronTouchpanelPropertiesConfig props, uint id) + : base(key, name) + { + IncludeInFusionRoomHealth = props.IncludeInFusionRoomHealth; + + Debug.Console(0, this, "Creating hardware..."); + type = type.ToLower(); + try + { + if (type == "crestronapp") + { + var app = new CrestronApp(id, Global.ControlSystem); + app.ParameterProjectName.Value = props.ProjectName; + Panel = app; + } + else if (type == "tsw550") + Panel = new Tsw550(id, Global.ControlSystem); + else if (type == "tsw552") + Panel = new Tsw552(id, Global.ControlSystem); + else if (type == "tsw560") + Panel = new Tsw560(id, Global.ControlSystem); + else if (type == "tsw750") + Panel = new Tsw750(id, Global.ControlSystem); + else if (type == "tsw752") + Panel = new Tsw752(id, Global.ControlSystem); + else if (type == "tsw760") + Panel = new Tsw760(id, Global.ControlSystem); + else if (type == "tsw1050") + Panel = new Tsw1050(id, Global.ControlSystem); + else if (type == "tsw1052") + Panel = new Tsw1052(id, Global.ControlSystem); + else if (type == "tsw1060") + Panel = new Tsw1060(id, Global.ControlSystem); + else if (type == "xpanel") + Panel = new XpanelForSmartGraphics(id, Global.ControlSystem); + else + { + Debug.Console(0, this, "WARNING: Cannot create TSW controller with type '{0}'", type); + return; + } + } + catch (Exception e) + { + Debug.Console(0, this, "WARNING: Cannot create TSW base class. Panel will not function: {0}", e.Message); + return; + } + + CommunicationMonitor = new CrestronGenericBaseCommunicationMonitor(this, Panel, 30000, 120000); + + AddPostActivationAction(() => + { + //Debug.Console(0, this, "Creating hardware..."); + //type = type.ToLower(); + //try + //{ + // if (type == "crestronapp") + // { + // var app = new CrestronApp(id, Global.ControlSystem); + // app.ParameterProjectName.Value = props.ProjectName; + // Panel = app; + // } + // else if (type == "tsw550") + // Panel = new Tsw550(id, Global.ControlSystem); + // else if (type == "tsw552") + // Panel = new Tsw552(id, Global.ControlSystem); + // else if (type == "tsw560") + // Panel = new Tsw560(id, Global.ControlSystem); + // else if (type == "tsw750") + // Panel = new Tsw750(id, Global.ControlSystem); + // else if (type == "tsw752") + // Panel = new Tsw752(id, Global.ControlSystem); + // else if (type == "tsw760") + // Panel = new Tsw760(id, Global.ControlSystem); + // else if (type == "tsw1050") + // Panel = new Tsw1050(id, Global.ControlSystem); + // else if (type == "tsw1052") + // Panel = new Tsw1052(id, Global.ControlSystem); + // else if (type == "tsw1060") + // Panel = new Tsw1060(id, Global.ControlSystem); + // else if (type == "xpanel") + // Panel = new XpanelForSmartGraphics(id, Global.ControlSystem); + // else + // { + // Debug.Console(0, this, "WARNING: Cannot create TSW controller with type '{0}'", type); + // return; + // } + //} + //catch (Exception e) + //{ + // Debug.Console(0, this, "WARNING: Cannot create TSW base class. Panel will not function: {0}", e.Message); + // return; + //} + + + // Reserved sigs + if (Panel is TswFt5ButtonSystem) + { + var tsw = Panel as TswFt5ButtonSystem; + tsw.ExtenderSystemReservedSigs.Use(); + tsw.ExtenderSystemReservedSigs.DeviceExtenderSigChange + += ExtenderSystemReservedSigs_DeviceExtenderSigChange; + } + + //CrestronInvoke.BeginInvoke(o => + // { + var regSuccess = Panel.Register(); + if (regSuccess != eDeviceRegistrationUnRegistrationResponse.Success) + Debug.Console(0, this, "WARNING: Registration failed. Continuing, but panel may not function: {0}", regSuccess); + + // Give up cleanly if SGD is not present. + var sgdName = @"\NVRAM\Program" + InitialParametersClass.ApplicationNumber + + @"\sgd\" + props.SgdFile; + if (!File.Exists(sgdName)) + { + Debug.Console(0, this, "ERROR: Smart object file '{0}' not present. Exiting TSW load", sgdName); + return; + } + + Panel.LoadSmartObjects(sgdName); + Panel.SigChange += Tsw_SigChange; + + var mainDriver = new EssentialsPanelMainInterfaceDriver(Panel, props); + // Then the AV driver + + // spin up different room drivers depending on room type + var room = DeviceManager.GetDeviceForKey(props.DefaultRoomKey); + if (room is EssentialsHuddleSpaceRoom) + { + Debug.Console(0, this, "Adding huddle space driver"); + var avDriver = new EssentialsHuddlePanelAvFunctionsDriver(mainDriver, props); + avDriver.CurrentRoom = room as EssentialsHuddleSpaceRoom; + avDriver.DefaultRoomKey = props.DefaultRoomKey; + mainDriver.AvDriver = avDriver; + LoadAndShowDriver(mainDriver); // This is a little convoluted. + + if (Panel is TswFt5ButtonSystem) + { + var tsw = Panel as TswFt5ButtonSystem; + // Wire up hard keys + tsw.Power.UserObject = new Action(b => { if (!b) avDriver.PowerButtonPressed(); }); + //tsw.Home.UserObject = new Action(b => { if (!b) HomePressed(); }); + tsw.Up.UserObject = new Action(avDriver.VolumeUpPress); + tsw.Down.UserObject = new Action(avDriver.VolumeDownPress); + tsw.ButtonStateChange += new ButtonEventHandler(Tsw_ButtonStateChange); + } + } + else if (room is EssentialsPresentationRoom) + { + Debug.Console(0, this, "Adding presentation room driver"); + var avDriver = new EssentialsPresentationPanelAvFunctionsDriver(mainDriver, props); + avDriver.CurrentRoom = room as EssentialsPresentationRoom; + avDriver.DefaultRoomKey = props.DefaultRoomKey; + mainDriver.AvDriver = avDriver; + LoadAndShowDriver(mainDriver); + + if (Panel is TswFt5ButtonSystem) + { + var tsw = Panel as TswFt5ButtonSystem; + // Wire up hard keys + tsw.Power.UserObject = new Action(b => { if (!b) avDriver.PowerButtonPressed(); }); + //tsw.Home.UserObject = new Action(b => { if (!b) HomePressed(); }); + tsw.Up.UserObject = new Action(avDriver.VolumeUpPress); + tsw.Down.UserObject = new Action(avDriver.VolumeDownPress); + tsw.ButtonStateChange += new ButtonEventHandler(Tsw_ButtonStateChange); + } + } + else if (room is EssentialsHuddleVtc1Room) + { + Debug.Console(0, this, "Adding huddle space driver"); + var avDriver = new EssentialsHuddleVtc1PanelAvFunctionsDriver(mainDriver, props); + var codecDriver = new PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver(Panel, avDriver, + (room as EssentialsHuddleVtc1Room).VideoCodec); + avDriver.SetVideoCodecDriver(codecDriver); + avDriver.CurrentRoom = room as EssentialsHuddleVtc1Room; + avDriver.DefaultRoomKey = props.DefaultRoomKey; + mainDriver.AvDriver = avDriver; + LoadAndShowDriver(mainDriver); // This is a little convoluted. + + if (Panel is TswFt5ButtonSystem) + { + var tsw = Panel as TswFt5ButtonSystem; + // Wire up hard keys + tsw.Power.UserObject = new Action(b => { if (!b) avDriver.EndMeetingPress(); }); + //tsw.Home.UserObject = new Action(b => { if (!b) HomePressed(); }); + tsw.Up.UserObject = new Action(avDriver.VolumeUpPress); + tsw.Down.UserObject = new Action(avDriver.VolumeDownPress); + tsw.ButtonStateChange += new ButtonEventHandler(Tsw_ButtonStateChange); + } + } + else + { + Debug.Console(0, this, "ERROR: Cannot load AvFunctionsDriver for room '{0}'", props.DefaultRoomKey); + } + //}, 0); + }); + } + + public void LoadAndShowDriver(PanelDriverBase driver) + { + PanelDriver = driver; + driver.Show(); + } + + void HomePressed() + { + if (BacklightTransitionedOnTimer == null) + PanelDriver.BackButtonPressed(); + } + + + void ExtenderSystemReservedSigs_DeviceExtenderSigChange(DeviceExtender currentDeviceExtender, SigEventArgs args) + { + // If the sig is transitioning on, mark it in case it was home button that transitioned it + var blOnSig = (Panel as TswFt5ButtonSystem).ExtenderSystemReservedSigs.BacklightOnFeedback; + if (args.Sig == blOnSig && blOnSig.BoolValue) + { + BacklightTransitionedOnTimer = new CTimer(o => + { + BacklightTransitionedOnTimer = null; + }, 200); + } + } + + public void PulseBool(uint join) + { + var act = Panel.BooleanInput[join].UserObject as Action; + if (act != null) + { + act(true); + act(false); + } + } + + public void SetBoolSig(uint join, bool value) + { + var act = Panel.BooleanInput[join].UserObject as Action; + if (act != null) + act(value); + } + + public void SetIntSig(uint join, ushort value) + { + var act = Panel.BooleanInput[join].UserObject as Action; + if (act != null) + { + act(value); + } + } + + void Tsw_SigChange(object currentDevice, Crestron.SimplSharpPro.SigEventArgs args) + { + if (Debug.Level == 2) + Debug.Console(2, this, "Sig change: {0} {1}={2}", args.Sig.Type, args.Sig.Number, args.Sig.StringValue); + var uo = args.Sig.UserObject; + if (uo is Action) + (uo as Action)(args.Sig.BoolValue); + else if (uo is Action) + (uo as Action)(args.Sig.UShortValue); + else if (uo is Action) + (uo as Action)(args.Sig.StringValue); + } + + void Tsw_ButtonStateChange(GenericBase device, ButtonEventArgs args) + { + var uo = args.Button.UserObject; + if(uo is Action) + (uo as Action)(args.Button.State == eButtonState.Pressed); + } + } } \ No newline at end of file diff --git a/Release Package/PepperDashEssentials.cpz b/Release Package/PepperDashEssentials.cpz index 3d899cbd..71977d34 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 68eabfc4..e6b84329 100644 Binary files a/Release Package/PepperDashEssentials.dll and b/Release Package/PepperDashEssentials.dll differ