From daa0427b5300f03935c30643639bd9dde7f66545 Mon Sep 17 00:00:00 2001 From: Neil Dorin Date: Thu, 12 Mar 2020 10:05:24 -0600 Subject: [PATCH] Adds logic to enable button actions on MPC3 series keypads --- .../Factory/DeviceFactory.cs | 33 ++++++-- .../PepperDash_Essentials_Core.csproj | 1 + .../Touchpanels/Mpc3Touchpanel.cs | 80 +++++++++++++++++++ 3 files changed, 106 insertions(+), 8 deletions(-) create mode 100644 essentials-framework/Essentials Core/PepperDashEssentialsBase/Touchpanels/Mpc3Touchpanel.cs diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Factory/DeviceFactory.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Factory/DeviceFactory.cs index 8bc89bd4..45779dd9 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Factory/DeviceFactory.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Factory/DeviceFactory.cs @@ -9,6 +9,7 @@ using PepperDash.Core; using PepperDash.Essentials.Core; using PepperDash.Essentials.Core.Config; using PepperDash.Essentials.Core.CrestronIO; +using PepperDash.Essentials.Core.Touchpanels; namespace PepperDash.Essentials.Core { @@ -47,13 +48,21 @@ namespace PepperDash.Essentials.Core var typeName = dc.Type.ToLower(); - // Check "core" types first + + // Check for types that have been added by plugin dlls. + if (FactoryMethods.ContainsKey(typeName)) + { + Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loading '{0}' from plugin", dc.Type); + return FactoryMethods[typeName](dc); + } + + // Check "core" types if (typeName == "genericcomm") { Debug.Console(1, "Factory Attempting to create new Generic Comm Device"); return new GenericComm(dc); } - else if (typeName == "ceniodigin104") + if (typeName == "ceniodigin104") { var control = CommFactory.GetControlPropertiesConfig(dc); var ipid = control.IpIdInt; @@ -74,13 +83,21 @@ namespace PepperDash.Essentials.Core return new C2nRthsController(key, name, new C2nRths(cresnetId, Global.ControlSystem)); } + if (typeName.StartsWith("mpc3")) + { + var butToken = dc.Properties["buttons"]; + if (butToken != null) + { + var buttons = butToken.ToObject>(); + return new Mpc3TouchpanelController(key, name, Global.ControlSystem, buttons); + } + else + { + Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: Unable to deserialize buttons collection for device: {0}", key); + } + } - // then check for types that have been added by plugin dlls. - if (FactoryMethods.ContainsKey(typeName)) - { - Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loading '{0}' from plugin", dc.Type); - return FactoryMethods[typeName](dc); - } + return null; } diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj index cc3c6d74..28128a65 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj @@ -236,6 +236,7 @@ + diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Touchpanels/Mpc3Touchpanel.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Touchpanels/Mpc3Touchpanel.cs new file mode 100644 index 00000000..dd266c24 --- /dev/null +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Touchpanels/Mpc3Touchpanel.cs @@ -0,0 +1,80 @@ +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.Touchpanels +{ + public class Mpc3TouchpanelController : Device + { + MPC3Basic _Touchpanel; + + Dictionary _Buttons; + + public Mpc3TouchpanelController(string key, string name, CrestronControlSystem processor, Dictionary buttons) + : base(key, name) + { + _Touchpanel = processor.ControllerTouchScreenSlotDevice as MPC3Basic; + _Buttons = buttons; + + + _Touchpanel.ButtonStateChange += new Crestron.SimplSharpPro.DeviceSupport.ButtonEventHandler(_Touchpanel_ButtonStateChange); + } + + void _Touchpanel_ButtonStateChange(GenericBase device, Crestron.SimplSharpPro.DeviceSupport.ButtonEventArgs args) + { + Debug.Console(1, this, "Button {0}, {1}", args.Button.Number, args.NewButtonState); + if (_Buttons.ContainsKey(args.Button.Number)) + { + var type = args.NewButtonState.ToString(); + Press(args.Button.Number, type); + } + } + + /// + /// Runs the function associated with this button/type. One of the following strings: + /// Pressed, Released, Tapped, DoubleTapped, Held, HeldReleased + /// + /// + /// + public void Press(uint number, string type) + { + if (!_Buttons.ContainsKey(number)) { return; } + var but = _Buttons[number]; + if (but.EventTypes.ContainsKey(type)) + { + foreach (var a in but.EventTypes[type]) { DeviceJsonApi.DoDeviceAction(a); } + } + } + + + } + + /// + /// + /// + public class KeypadButton + { + public Dictionary EventTypes { get; set; } + public KeypadButtonFeedback Feedback { get; set; } + + public KeypadButton() + { + EventTypes = new Dictionary(); + Feedback = new KeypadButtonFeedback(); + } + } + + /// + /// + /// + public class KeypadButtonFeedback + { + public string Type { get; set; } + public string LinkToKey { get; set; } + } +} \ No newline at end of file