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