diff --git a/Essentials Core/PepperDashEssentialsBase/Monitoring/GenericCommunicationMonitor.cs b/Essentials Core/PepperDashEssentialsBase/Monitoring/GenericCommunicationMonitor.cs index bf5bc25b..ceb79207 100644 --- a/Essentials Core/PepperDashEssentialsBase/Monitoring/GenericCommunicationMonitor.cs +++ b/Essentials Core/PepperDashEssentialsBase/Monitoring/GenericCommunicationMonitor.cs @@ -40,8 +40,8 @@ namespace PepperDash.Essentials.Core { if (pollTime > warningTime || pollTime > errorTime) throw new ArgumentException("pollTime must be less than warning or errorTime"); - if (pollTime < 5000) - throw new ArgumentException("pollTime cannot be less than 5000 ms"); + //if (pollTime < 5000) + // throw new ArgumentException("pollTime cannot be less than 5000 ms"); Client = client; PollTime = pollTime; @@ -63,8 +63,8 @@ namespace PepperDash.Essentials.Core { if (pollTime > warningTime || pollTime > errorTime) throw new ArgumentException("pollTime must be less than warning or errorTime"); - if (pollTime < 5000) - throw new ArgumentException("pollTime cannot be less than 5000 ms"); + //if (pollTime < 5000) + // throw new ArgumentException("pollTime cannot be less than 5000 ms"); Client = client; PollTime = pollTime; @@ -112,7 +112,7 @@ namespace PepperDash.Essentials.Core StartErrorTimers(); if (Client.IsConnected) { - Debug.Console(2, Client, "Monitor, Polling"); + Debug.Console(2, this, "Polling"); if(PollAction != null) PollAction.Invoke(); else @@ -120,7 +120,7 @@ namespace PepperDash.Essentials.Core } else { - Debug.Console(2, Client, "Monitor, Comm not connected"); + Debug.Console(2, this, "Comm not connected"); } } @@ -132,7 +132,7 @@ namespace PepperDash.Essentials.Core if (Client.IsConnected) { //Client.IsConnected -= OneTimeConnectHandler; - Debug.Console(2, Client, "Monitor, Comm connected"); + Debug.Console(2, this, "Comm connected"); Poll(); } } diff --git a/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj b/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj index 684cfafd..08bd5c19 100644 --- a/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj +++ b/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj @@ -99,6 +99,7 @@ + @@ -132,6 +133,7 @@ + diff --git a/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.projectinfo b/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.projectinfo index 9ddd1b74..86124937 100644 Binary files a/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.projectinfo and b/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.projectinfo differ diff --git a/Essentials Core/PepperDashEssentialsBase/Ramps and Increments/ActionIncrementer.cs b/Essentials Core/PepperDashEssentialsBase/Ramps and Increments/ActionIncrementer.cs new file mode 100644 index 00000000..f63d57bf --- /dev/null +++ b/Essentials Core/PepperDashEssentialsBase/Ramps and Increments/ActionIncrementer.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Crestron.SimplSharp; + +using PepperDash.Core; + +namespace PepperDash.Essentials.Core +{ + /// + /// An incrementer that can use the values of some other object/primitive value to do its thing. + /// It uses an Action to set the value and a Func to get the value from whatever this is + /// attached to. + /// + public class ActionIncrementer + { + public int ChangeAmount { get; set; } + public int MaxValue { get; set; } + public int MinValue { get; set; } + public uint RepeatDelay { get; set; } + public uint RepeatTime { get; set; } + + Action SetAction; + Func GetFunc; + CTimer Timer; + + /// + /// + /// + /// + /// + /// + /// + /// + /// Action that will be called when this needs to set the destination value + /// Func that is called to get the current value + public ActionIncrementer(int changeAmount, int minValue, int maxValue, uint repeatDelay, uint repeatTime, Action setAction, Func getFunc) + { + SetAction = setAction; + GetFunc = getFunc; + ChangeAmount = changeAmount; + MaxValue = maxValue; + MinValue = minValue; + RepeatDelay = repeatDelay; + RepeatTime = repeatTime; + } + + /// + /// Starts incrementing cycle + /// + public void StartUp() + { + if (Timer != null) return; + Go(ChangeAmount); + } + + /// + /// Starts decrementing cycle + /// + public void StartDown() + { + if (Timer != null) return; + Go(-ChangeAmount); + } + + /// + /// Stops the repeat + /// + public void Stop() + { + if (Timer != null) + Timer.Stop(); + Timer = null; + } + + /// + /// Helper that does the work of setting new level, and starting repeat loop, checking against bounds first. + /// + /// + void Go(int change) + { + int currentLevel = GetFunc(); + // Fire once then pause + int newLevel = currentLevel + change; + bool atLimit = CheckLevel(newLevel, out newLevel); + SetAction(newLevel); + + if (atLimit) // Don't go past end + Stop(); + else if (Timer == null) // Only enter the timer if it's not already running + Timer = new CTimer(o => { Go(change); }, null, RepeatDelay, RepeatTime); + } + + /// + /// Helper to check a new level against min/max. Returns revised level if new level + /// will go out of bounds + /// + /// The level to check against bounds + /// Revised level if bounds are exceeded. Min or max + /// true if new level is at or past bounds + bool CheckLevel(int levelIn, out int levelOut) + { + bool isAtLimit = false; + if (levelIn > MaxValue) + { + levelOut = MaxValue; + isAtLimit = true; + } + else if (levelIn < MinValue) + { + levelOut = MinValue; + isAtLimit = true; + } + else + levelOut = levelIn; + return isAtLimit; + } + } +} \ No newline at end of file diff --git a/Essentials Core/PepperDashEssentialsBase/Ramps and Increments/UshortSigIncrementer.cs b/Essentials Core/PepperDashEssentialsBase/Ramps and Increments/UshortSigIncrementer.cs new file mode 100644 index 00000000..1a6f3c06 --- /dev/null +++ b/Essentials Core/PepperDashEssentialsBase/Ramps and Increments/UshortSigIncrementer.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Crestron.SimplSharp; +using Crestron.SimplSharpPro; + +using PepperDash.Core; + +namespace PepperDash.Essentials.Core +{ + /// + /// Attaches to UShortInputSig and does incremental ramping of the signal + /// + public class UshortSigIncrementer + { + UShortInputSig TheSig; + public ushort ChangeAmount { get; set; } + public int MaxValue { get; set; } + public int MinValue { get; set; } + public uint RepeatDelay { get; set; } + public uint RepeatTime { get; set; } + bool SignedMode; + CTimer Timer; + + public UshortSigIncrementer(UShortInputSig sig, ushort changeAmount, int minValue, int maxValue, uint repeatDelay, uint repeatTime) + { + TheSig = sig; + ChangeAmount = changeAmount; + MaxValue = maxValue; + MinValue = minValue; + if (MinValue < 0 || MaxValue < 0) SignedMode = true; + RepeatDelay = repeatDelay; + RepeatTime = repeatTime; + if (SignedMode && (MinValue < -32768 || MaxValue > 32767)) + Debug.Console(1, "UshortSigIncrementer has signed values that exceed range of -32768, 32767"); + } + + public void StartUp() + { + if (Timer != null) return; + Go(ChangeAmount); + } + + public void StartDown() + { + if (Timer != null) return; + Go(-ChangeAmount); + } + + void Go(int change) + { + int level; + if (SignedMode) level = TheSig.ShortValue; + else level = TheSig.UShortValue; + + // Fire once then pause + int newLevel = level + change; + bool atLimit = CheckLevel(newLevel, out newLevel); + SetValue((ushort)newLevel); + + + if (atLimit) // Don't go past end + Stop(); + else if (Timer == null) // Only enter the timer if it's not already running + Timer = new CTimer(o => { Go(change); }, null, RepeatDelay, RepeatTime); + } + + bool CheckLevel(int levelIn, out int levelOut) + { + bool IsAtLimit = false; + if (levelIn > MaxValue) + { + levelOut = MaxValue; + IsAtLimit = true; + } + else if (levelIn < MinValue) + { + levelOut = MinValue; + IsAtLimit = true; + } + else + levelOut = levelIn; + return IsAtLimit; + } + + public void Stop() + { + if (Timer != null) + Timer.Stop(); + Timer = null; + } + + void SetValue(ushort value) + { + //CrestronConsole.PrintLine("Increment level:{0} / {1}", value, (short)value); + TheSig.UShortValue = value; + } + } +} \ No newline at end of file diff --git a/Essentials Core/PepperDashEssentialsBase/SigHelper.cs b/Essentials Core/PepperDashEssentialsBase/SigHelper.cs index 3eac3b4f..86395114 100644 --- a/Essentials Core/PepperDashEssentialsBase/SigHelper.cs +++ b/Essentials Core/PepperDashEssentialsBase/SigHelper.cs @@ -69,93 +69,4 @@ namespace PepperDash.Essentials.Core sig.CreateRamp(level, time / 10); } } - - /// - /// Attaches to UShortInputSig and does incremental ramping of the signal - /// - public class UshortSigIncrementer - { - UShortInputSig TheSig; - public ushort ChangeAmount { get; set; } - public int MaxValue { get; set; } - public int MinValue { get; set; } - public uint RepeatDelay { get; set; } - public uint RepeatTime { get; set; } - bool SignedMode; - CTimer Timer; - - public UshortSigIncrementer(UShortInputSig sig, ushort changeAmount, int minValue, int maxValue, uint repeatDelay, uint repeatTime) - { - TheSig = sig; - ChangeAmount = changeAmount; - MaxValue = maxValue; - MinValue = minValue; - if (MinValue < 0 || MaxValue < 0) SignedMode = true; - RepeatDelay = repeatDelay; - RepeatTime = repeatTime; - if (SignedMode && (MinValue < -32768 || MaxValue > 32767)) - Debug.Console(1, "UshortSigIncrementer has signed values that exceed range of -32768, 32767"); - } - - public void StartUp() - { - if (Timer != null) return; - Go(ChangeAmount); - } - - public void StartDown() - { - if (Timer != null) return; - Go(-ChangeAmount); - } - - void Go(int change) - { - int level; - if (SignedMode) level = TheSig.ShortValue; - else level = TheSig.UShortValue; - - // Fire once then pause - int newLevel = level + change; - bool atLimit = CheckLevel(newLevel, out newLevel); - SetValue((ushort)newLevel); - - - if (atLimit) // Don't go past end - Stop(); - else if (Timer == null) // Only enter the timer if it's not already running - Timer = new CTimer(o => { Go(change); }, null, RepeatDelay, RepeatTime); - } - - bool CheckLevel(int levelIn, out int levelOut) - { - bool IsAtLimit = false; - if (levelIn > MaxValue) - { - levelOut = MaxValue; - IsAtLimit = true; - } - else if (levelIn < MinValue) - { - levelOut = MinValue; - IsAtLimit = true; - } - else - levelOut = levelIn; - return IsAtLimit; - } - - public void Stop() - { - if (Timer != null) - Timer.Stop(); - Timer = null; - } - - void SetValue(ushort value) - { - //CrestronConsole.PrintLine("Increment level:{0} / {1}", value, (short)value); - TheSig.UShortValue = value; - } - } } \ No newline at end of file diff --git a/Essentials DM/Essentials_DM/Essentials_DM.projectinfo b/Essentials DM/Essentials_DM/Essentials_DM.projectinfo index e026e968..64e201fb 100644 Binary files a/Essentials DM/Essentials_DM/Essentials_DM.projectinfo and b/Essentials DM/Essentials_DM/Essentials_DM.projectinfo differ diff --git a/Essentials Devices Common/Essentials Devices Common/Display/SamsungMDCDisplay.cs b/Essentials Devices Common/Essentials Devices Common/Display/SamsungMDCDisplay.cs index 8f7831b3..4010b62b 100644 --- a/Essentials Devices Common/Essentials Devices Common/Display/SamsungMDCDisplay.cs +++ b/Essentials Devices Common/Essentials Devices Common/Display/SamsungMDCDisplay.cs @@ -24,11 +24,13 @@ namespace PepperDash.Essentials.Devices.Displays bool _PowerIsOn; bool _IsWarmingUp; bool _IsCoolingDown; - ushort _VolumeLevel; + ushort _VolumeLevelForSig; + int _LastVolumeSent; bool _IsMuted; RoutingInputPort _CurrentInputPort; byte[] IncomingBuffer = new byte[]{}; - //CTimer StatusTimer; + ActionIncrementer VolumeIncrementer; + bool VolumeIsRamping; protected override Func PowerIsOnFeedbackFunc { get { return () => _PowerIsOn; } } protected override Func IsCoolingDownFeedbackFunc { get { return () => _IsCoolingDown; } } @@ -85,9 +87,13 @@ namespace PepperDash.Essentials.Devices.Displays void Init() { WarmupTime = 10000; - CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, 30000, 120000, 300000, StatusGet); + CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, 2000, 120000, 300000, StatusGet); DeviceManager.AddDevice(CommunicationMonitor); + VolumeIncrementer = new ActionIncrementer(655, 0, 65535, 800, 80, + v => SetVolume((ushort)v), + () => _LastVolumeSent); + AddRoutingInputPort(new RoutingInputPort(RoutingPortNames.HdmiIn1, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.Hdmi, new Action(InputHdmi1), this), 0x21); @@ -112,7 +118,7 @@ namespace PepperDash.Essentials.Devices.Displays AddRoutingInputPort(new RoutingInputPort(RoutingPortNames.RgbIn2, eRoutingSignalType.Video, eRoutingPortConnectionType.Rgb, new Action(new Action(InputRgb2)), this), 0x1E); - VolumeLevelFeedback = new IntFeedback(() => { return _VolumeLevel; }); + VolumeLevelFeedback = new IntFeedback(() => { return _VolumeLevelForSig; }); MuteFeedback = new BoolFeedback(() => _IsMuted); StatusGet(); @@ -238,7 +244,6 @@ namespace PepperDash.Essentials.Devices.Displays _PowerIsOn = newVal; PowerIsOnFeedback.FireUpdate(); } - } /// @@ -246,11 +251,13 @@ namespace PepperDash.Essentials.Devices.Displays /// /// void UpdateVolumeFB(byte b) - { + { var newVol = (ushort)Scale((double)b, 0, 100, 0, 65535); - if (newVol != _VolumeLevel) + if (!VolumeIsRamping) + _LastVolumeSent = newVol; + if (newVol != _VolumeLevelForSig) { - _VolumeLevel = newVol; + _VolumeLevelForSig = newVol; VolumeLevelFeedback.FireUpdate(); } } @@ -450,8 +457,10 @@ namespace PepperDash.Essentials.Devices.Displays /// public void SetVolume(ushort level) { - var volByte = Convert.ToByte(Scale(level, 0, 65535, 0, 100)); // The inputs to Scale ensures it won't overflow - SendBytes(new byte[] { 0xAA, 0x12, 0x00, 0x01, volByte, 0x00 }); + _LastVolumeSent = level; + var scaled = (int)Scale(level, 0, 65535, 0, 100); + // The inputs to Scale ensure that byte won't overflow + SendBytes(new byte[] { 0xAA, 0x12, 0x00, 0x01, Convert.ToByte(scaled), 0x00 }); } /// @@ -534,7 +543,16 @@ namespace PepperDash.Essentials.Devices.Displays /// public void VolumeDown(bool pressRelease) { - throw new NotImplementedException(); + if (pressRelease) + { + VolumeIncrementer.StartDown(); + VolumeIsRamping = true; + } + else + { + VolumeIsRamping = false; + VolumeIncrementer.Stop(); + } } /// @@ -543,9 +561,21 @@ namespace PepperDash.Essentials.Devices.Displays /// public void VolumeUp(bool pressRelease) { - throw new NotImplementedException(); - } + if (pressRelease) + { + VolumeIncrementer.StartUp(); + VolumeIsRamping = true; + } + else + { + VolumeIsRamping = false; + VolumeIncrementer.Stop(); + } + } + /// + /// + /// public void VolumeGet() { SendBytes(new byte[] { 0xAA, 0x12, 0x00, 0x00, 0x00 }); diff --git a/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.projectinfo b/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.projectinfo index 42c6d232..936dbfd7 100644 Binary files a/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.projectinfo and b/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.projectinfo differ diff --git a/Essentials/PepperDashEssentials/PepperDashEssentials.projectinfo b/Essentials/PepperDashEssentials/PepperDashEssentials.projectinfo index 9c956c7d..4b4070d0 100644 Binary files a/Essentials/PepperDashEssentials/PepperDashEssentials.projectinfo and b/Essentials/PepperDashEssentials/PepperDashEssentials.projectinfo differ diff --git a/Essentials/PepperDashEssentials/Room/EssentialsHuddleSpaceRoom.cs b/Essentials/PepperDashEssentials/Room/EssentialsHuddleSpaceRoom.cs index 985abf01..c06bb06c 100644 --- a/Essentials/PepperDashEssentials/Room/EssentialsHuddleSpaceRoom.cs +++ b/Essentials/PepperDashEssentials/Room/EssentialsHuddleSpaceRoom.cs @@ -14,6 +14,23 @@ namespace PepperDash.Essentials public event EventHandler CurrentVolumeDeviceChange; public event SourceInfoChangeHandler CurrentSingleSourceChange; + protected override Func OnFeedbackFunc + { + get + { + return () => + { + var disp = DefaultDisplay as DisplayBase; + var val = CurrentSourceInfo != null + && CurrentSourceInfo.Type == eSourceListItemType.Route + && disp != null + && disp.PowerIsOnFeedback.BoolValue; + Debug.Console(2, this, "************** ROOM POWER {0}", val); + return val; + }; + } + } + public EssentialsRoomPropertiesConfig Config { get; private set; } public IRoutingSinkWithSwitching DefaultDisplay { get; private set; } @@ -91,11 +108,6 @@ namespace PepperDash.Essentials public string CurrentSourceInfoKey { get; private set; } - /// - /// - /// - public BoolFeedback OnFeedback { get; private set; } - /// /// /// @@ -115,13 +127,19 @@ namespace PepperDash.Essentials CurrentVolumeControls = DefaultVolumeControls; var disp = DefaultDisplay as DisplayBase; - OnFeedback = new BoolFeedback(() => - { - return CurrentSourceInfo != null - && CurrentSourceInfo.Type == eSourceListItemType.Route - && disp != null - && disp.PowerIsOnFeedback.BoolValue; - }); + if (disp != null) + { + disp.PowerIsOnFeedback.OutputChange += (o, a) => + { + if (disp.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue) + { + if (!disp.PowerIsOnFeedback.BoolValue) + CurrentSourceInfo = null; + OnFeedback.FireUpdate(); + } + }; + } + SourceListKey = "default"; EnablePowerOnToLastSource = true; } diff --git a/Essentials/PepperDashEssentials/Room/EssentialsPresentationRoom.cs b/Essentials/PepperDashEssentials/Room/EssentialsPresentationRoom.cs index 73fd504f..f91e00f9 100644 --- a/Essentials/PepperDashEssentials/Room/EssentialsPresentationRoom.cs +++ b/Essentials/PepperDashEssentials/Room/EssentialsPresentationRoom.cs @@ -16,6 +16,14 @@ namespace PepperDash.Essentials public event SourceInfoChangeHandler CurrentDisplay1SourceChange; public event SourceInfoChangeHandler CurrentDisplay2SourceChange; + protected override Func OnFeedbackFunc { get { + return () => (CurrentSingleSourceInfo != null + && CurrentSingleSourceInfo.Type != eSourceListItemType.Off) + || (Display1SourceInfo != null + && Display1SourceInfo.Type != eSourceListItemType.Off) + || (Display2SourceInfo != null + && Display2SourceInfo.Type != eSourceListItemType.Off); } } + public EssentialsPresentationRoomPropertiesConfig Config { get; private set; } public Dictionary Displays { get; private set; } @@ -141,16 +149,10 @@ namespace PepperDash.Essentials } SourceListItem _Display2SourceInfo; - /// - /// - /// - public BoolFeedback OnFeedback { get; private set; } - /// /// If an audio dialer is available for this room /// public bool HasAudioDialer { get { return false; } } - /// /// /// @@ -173,15 +175,7 @@ namespace PepperDash.Essentials //else if (defaultAudio is IHasVolumeDevice) // DefaultVolumeControls = (defaultAudio as IHasVolumeDevice).VolumeDevice; - OnFeedback = new BoolFeedback(() => - { return (CurrentSingleSourceInfo != null - && CurrentSingleSourceInfo.Type != eSourceListItemType.Off) - || (Display1SourceInfo != null - && Display1SourceInfo.Type != eSourceListItemType.Off) - || (Display2SourceInfo != null - && Display2SourceInfo.Type != eSourceListItemType.Off); - - }); + SourceListKey = "default"; EnablePowerOnToLastSource = true; } diff --git a/Essentials/PepperDashEssentials/Room/EssentialsRoomBase.cs b/Essentials/PepperDashEssentials/Room/EssentialsRoomBase.cs index 62e01ad7..787df20f 100644 --- a/Essentials/PepperDashEssentials/Room/EssentialsRoomBase.cs +++ b/Essentials/PepperDashEssentials/Room/EssentialsRoomBase.cs @@ -20,11 +20,23 @@ namespace PepperDash.Essentials /// /// /// - public class EssentialsRoomBase : Device + public abstract class EssentialsRoomBase : Device { + /// + /// + /// + public BoolFeedback OnFeedback { get; private set; } + + public BoolFeedback IsWarmingFeedback { get; private set; } + public BoolFeedback IsCoolingFeedback { get; private set; } + public BoolFeedback ShutdownPendingFeedback { get; private set; } + + protected abstract Func OnFeedbackFunc { get; } + + public EssentialsRoomBase(string key, string name) : base(key, name) { - + OnFeedback = new BoolFeedback(OnFeedbackFunc); } } } \ No newline at end of file diff --git a/Essentials/PepperDashEssentials/UI Drivers/EssentialsHuddlePanelAvFunctionsDriver.cs b/Essentials/PepperDashEssentials/UI Drivers/EssentialsHuddlePanelAvFunctionsDriver.cs index f8462186..488f38e4 100644 --- a/Essentials/PepperDashEssentials/UI Drivers/EssentialsHuddlePanelAvFunctionsDriver.cs +++ b/Essentials/PepperDashEssentials/UI Drivers/EssentialsHuddlePanelAvFunctionsDriver.cs @@ -147,13 +147,7 @@ namespace PepperDash.Essentials : base(parent.TriList) { Config = config; - Parent = parent; - - //SelectASourceVisibleFeedback = new BoolFeedback(() => - // CurrentRoom != null && !CurrentRoom.OnFeedback.BoolValue && this.IsVisible); - - //SourcesDynamicList = new SmartObjectDynamicList( - // TriList.SmartObjects[UISmartObjectJoin.SourceList], true, 3200); + Parent = parent; SourcesSrl = new SubpageReferenceList(TriList, 3200, 3, 3, 3); ActivityFooterSrl = new SubpageReferenceList(TriList, 15022, 3, 3, 3); @@ -242,12 +236,16 @@ namespace PepperDash.Essentials base.Show(); } + /// + /// Handler for room on/off feedback + /// + /// + /// void OnFeedback_OutputChange(object sender, EventArgs e) { if (CurrentRoom.OnFeedback.BoolValue) { TriList.BooleanInput[UIBoolJoin.VolumeSingleMute1Visible].BoolValue = true; - //TriList.BooleanInput[UIBoolJoin.StagingPageVisible].BoolValue = true; } else { diff --git a/Release Package/PepperDashEssentials.cpz b/Release Package/PepperDashEssentials.cpz index 3588ac22..ffd5460c 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 99b5fda6..fe634b9e 100644 Binary files a/Release Package/PepperDashEssentials.dll and b/Release Package/PepperDashEssentials.dll differ