From 72e67a1c4c68b29114f8261c2d7989a797f10a08 Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Thu, 25 Sep 2025 09:47:44 -0500 Subject: [PATCH] fix: implement IHasFeedback for all IO devices and modify logging --- .../CrestronIO/GenericDigitalInputDevice.cs | 85 +++++------ .../GenericVersiportAnalogInputDevice.cs | 138 +++++++----------- .../CrestronIO/GenericVersiportInputDevice.cs | 109 +++++++------- .../GenericVersiportOutputDevice.cs | 136 +++++++---------- 4 files changed, 195 insertions(+), 273 deletions(-) diff --git a/src/PepperDash.Essentials.Core/CrestronIO/GenericDigitalInputDevice.cs b/src/PepperDash.Essentials.Core/CrestronIO/GenericDigitalInputDevice.cs index 8463ae96..6f858144 100644 --- a/src/PepperDash.Essentials.Core/CrestronIO/GenericDigitalInputDevice.cs +++ b/src/PepperDash.Essentials.Core/CrestronIO/GenericDigitalInputDevice.cs @@ -2,59 +2,54 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using Crestron.SimplSharp; using Crestron.SimplSharpPro; using Crestron.SimplSharpPro.DeviceSupport; using Newtonsoft.Json; using PepperDash.Core; +using PepperDash.Core.Logging; using PepperDash.Essentials.Core.Bridges; using PepperDash.Essentials.Core.Config; -using Serilog.Events; namespace PepperDash.Essentials.Core.CrestronIO { - [Description("Wrapper class for Digital Input")] + /// /// Represents a GenericDigitalInputDevice /// - public class GenericDigitalInputDevice : EssentialsBridgeableDevice, IDigitalInput + /// [Description("Wrapper class for Digital Input")] + public class GenericDigitalInputDevice : EssentialsBridgeableDevice, IDigitalInput, IHasFeedback { - /// - /// Gets or sets the InputPort - /// - public DigitalInput InputPort { get; private set; } + private DigitalInput inputPort; /// /// Gets or sets the InputStateFeedback /// public BoolFeedback InputStateFeedback { get; private set; } - Func InputStateFeedbackFunc - { - get - { - return () => InputPort.State; - } - } - + /// + public FeedbackCollection Feedbacks { get; private set; } = new FeedbackCollection(); + /// + /// Initializes a new instance of the class. + /// + /// key for device + /// name for device + /// function to call after activation. Should return the DigitalInput + /// config for device public GenericDigitalInputDevice(string key, string name, Func postActivationFunc, IOPortConfig config) : base(key, name) { - InputStateFeedback = new BoolFeedback(InputStateFeedbackFunc); + InputStateFeedback = new BoolFeedback("inputState", () => inputPort.State); AddPostActivationAction(() => { - InputPort = postActivationFunc(config); + inputPort = postActivationFunc(config); - InputPort.Register(); - - InputPort.StateChange += InputPort_StateChange; + inputPort.Register(); + inputPort.StateChange += InputPort_StateChange; }); } @@ -71,41 +66,31 @@ namespace PepperDash.Essentials.Core.CrestronIO private static DigitalInput GetDigitalInput(IOPortConfig dc) { - IDigitalInputPorts ioPortDevice; if (dc.PortDeviceKey.Equals("processor")) { if (!Global.ControlSystem.SupportsDigitalInput) { - Debug.LogMessage(LogEventLevel.Information, "GetDigitalInput: Processor does not support Digital Inputs"); + Debug.LogError("GetDigitalInput: Processor does not support Digital Inputs"); return null; } - ioPortDevice = Global.ControlSystem; + + return Global.ControlSystem.DigitalInputPorts[dc.PortNumber]; } - else + + if (!(DeviceManager.GetDeviceForKey(dc.PortDeviceKey) is IDigitalInputPorts ioPortDevice)) { - var ioPortDev = DeviceManager.GetDeviceForKey(dc.PortDeviceKey) as IDigitalInputPorts; - if (ioPortDev == null) - { - Debug.LogMessage(LogEventLevel.Information, "GetDigitalInput: Device {0} is not a valid device", dc.PortDeviceKey); - return null; - } - ioPortDevice = ioPortDev; - } - if (ioPortDevice == null) - { - Debug.LogMessage(LogEventLevel.Information, "GetDigitalInput: Device '0' is not a valid IDigitalInputPorts Device", dc.PortDeviceKey); + Debug.LogError("GetDigitalInput: Device {key} is not a valid device", dc.PortDeviceKey); return null; } if (dc.PortNumber > ioPortDevice.NumberOfDigitalInputPorts) { - Debug.LogMessage(LogEventLevel.Information, "GetDigitalInput: Device {0} does not contain a port {1}", dc.PortDeviceKey, dc.PortNumber); + Debug.LogError("GetDigitalInput: Device {key} does not contain a digital input port {port}", dc.PortDeviceKey, dc.PortNumber); + return null; } return ioPortDevice.DigitalInputPorts[dc.PortNumber]; - - } #endregion @@ -131,20 +116,20 @@ namespace PepperDash.Essentials.Core.CrestronIO } else { - Debug.LogMessage(LogEventLevel.Information, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device."); + this.LogWarning("Please update config to use 'eiscapiadvanced' to get all join map features for this device."); } try { - Debug.LogMessage(LogEventLevel.Debug, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X")); + this.LogDebug("Linking to Trilist '{0}'", trilist.ID.ToString("X")); // Link feedback for input state InputStateFeedback.LinkInputSig(trilist.BooleanInput[joinMap.InputState.JoinNumber]); } catch (Exception e) { - Debug.LogMessage(LogEventLevel.Debug, this, "Unable to link device '{0}'. Input is null", Key); - Debug.LogMessage(LogEventLevel.Debug, this, "Error: {0}", e); + this.LogError("Unable to link device {key}. {message}", Key, e.Message); + this.LogDebug(e, "Stack Trace: "); } } @@ -153,22 +138,22 @@ namespace PepperDash.Essentials.Core.CrestronIO #region Factory /// - /// Represents a GenericDigitalInputDeviceFactory + /// Factory for creating GenericDigitalInputDevice devices /// public class GenericDigitalInputDeviceFactory : EssentialsDeviceFactory { + /// + /// Constructor for GenericDigitalInputDeviceFactory + /// public GenericDigitalInputDeviceFactory() { TypeNames = new List() { "digitalinput" }; } - /// - /// BuildDevice method - /// /// public override EssentialsDevice BuildDevice(DeviceConfig dc) { - Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new Generic Digital Input Device"); + Debug.LogDebug("Factory Attempting to create new Generic Digital Input Device"); var props = JsonConvert.DeserializeObject(dc.Properties.ToString()); diff --git a/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportAnalogInputDevice.cs b/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportAnalogInputDevice.cs index c87a688c..0c5cec65 100644 --- a/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportAnalogInputDevice.cs +++ b/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportAnalogInputDevice.cs @@ -2,66 +2,64 @@ 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.Config; -using PepperDash.Essentials.Core.Bridges; - - using Newtonsoft.Json; -using Serilog.Events; +using PepperDash.Core; +using PepperDash.Core.Logging; +using PepperDash.Essentials.Core.Bridges; +using PepperDash.Essentials.Core.Config; namespace PepperDash.Essentials.Core.CrestronIO { /// /// Represents a generic digital input deviced tied to a versiport /// - public class GenericVersiportAnalogInputDevice : EssentialsBridgeableDevice, IAnalogInput + public class GenericVersiportAnalogInputDevice : EssentialsBridgeableDevice, IAnalogInput, IHasFeedback { - public Versiport InputPort { get; private set; } + private Versiport inputPort; + /// public IntFeedback InputValueFeedback { get; private set; } + + /// + /// Get the InputMinimumChangeFeedback + /// + /// + /// Updates when the analog input minimum change value changes + /// public IntFeedback InputMinimumChangeFeedback { get; private set; } - Func InputValueFeedbackFunc - { - get - { - return () => InputPort.AnalogIn; - } - } - - Func InputMinimumChangeFeedbackFunc - { - get { return () => InputPort.AnalogMinChange; } - } + /// + public FeedbackCollection Feedbacks { get; private set; } = new FeedbackCollection(); + /// + /// Initializes a new instance of the class. + /// + /// key for the device + /// name for the device + /// function to call after activation + /// IO port configuration public GenericVersiportAnalogInputDevice(string key, string name, Func postActivationFunc, IOPortConfig config) : base(key, name) { - InputValueFeedback = new IntFeedback(InputValueFeedbackFunc); - InputMinimumChangeFeedback = new IntFeedback(InputMinimumChangeFeedbackFunc); + InputValueFeedback = new IntFeedback("inputValue", () => inputPort.AnalogIn); + InputMinimumChangeFeedback = new IntFeedback("inputMinimumChange", () => inputPort.AnalogMinChange); AddPostActivationAction(() => { - InputPort = postActivationFunc(config); + inputPort = postActivationFunc(config); - InputPort.Register(); + inputPort.Register(); - InputPort.SetVersiportConfiguration(eVersiportConfiguration.AnalogInput); - InputPort.AnalogMinChange = (ushort)(config.MinimumChange > 0 ? config.MinimumChange : 655); + inputPort.SetVersiportConfiguration(eVersiportConfiguration.AnalogInput); + inputPort.AnalogMinChange = (ushort)(config.MinimumChange > 0 ? config.MinimumChange : 655); if (config.DisablePullUpResistor) - InputPort.DisablePullUpResistor = true; + inputPort.DisablePullUpResistor = true; - InputPort.VersiportChange += InputPort_VersiportChange; - - Debug.LogMessage(LogEventLevel.Debug, this, "Created GenericVersiportAnalogInputDevice on port '{0}'. DisablePullUpResistor: '{1}'", config.PortNumber, InputPort.DisablePullUpResistor); + inputPort.VersiportChange += InputPort_VersiportChange; + this.LogDebug("Created GenericVersiportAnalogInputDevice on port {port}. DisablePullUpResistor: {pullUpResistorDisabled}", config.PortNumber, inputPort.DisablePullUpResistor); }); } @@ -69,20 +67,17 @@ namespace PepperDash.Essentials.Core.CrestronIO /// /// Set minimum voltage change for device to update voltage changed method /// - /// valid values range from 0 - 65535, representing the full 100% range of the processor voltage source. Check processor documentation for details - /// - /// SetMinimumChange method - /// + /// valid values range from 0 - 65535, representing the full 100% range of the processor voltage source. Check processor documentation for details public void SetMinimumChange(ushort value) { - InputPort.AnalogMinChange = value; + inputPort.AnalogMinChange = value; } void InputPort_VersiportChange(Versiport port, VersiportEventArgs args) { - Debug.LogMessage(LogEventLevel.Debug, this, "Versiport change: {0}", args.Event); + this.LogDebug("Versiport change: {event}", args.Event); - if(args.Event == eVersiportEvent.AnalogInChange) + if (args.Event == eVersiportEvent.AnalogInChange) InputValueFeedback.FireUpdate(); if (args.Event == eVersiportEvent.AnalogMinChangeChange) InputMinimumChangeFeedback.FireUpdate(); @@ -91,9 +86,6 @@ namespace PepperDash.Essentials.Core.CrestronIO #region Bridge Linking - /// - /// LinkToApi method - /// /// public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge) { @@ -110,12 +102,12 @@ namespace PepperDash.Essentials.Core.CrestronIO } else { - Debug.LogMessage(LogEventLevel.Information, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device."); + this.LogWarning("Please update config to use 'eiscapiadvanced' to get all join map features for this device."); } try { - Debug.LogMessage(LogEventLevel.Debug, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X")); + this.LogDebug("Linking to Trilist '{trilistId}'", trilist.ID.ToString("X")); // Link feedback for input state InputValueFeedback.LinkInputSig(trilist.UShortInput[joinMap.InputValue.JoinNumber]); @@ -125,8 +117,8 @@ namespace PepperDash.Essentials.Core.CrestronIO } catch (Exception e) { - Debug.LogMessage(LogEventLevel.Debug, this, "Unable to link device '{0}'. Input is null", Key); - Debug.LogMessage(LogEventLevel.Debug, this, "Error: {0}", e); + this.LogError("Unable to link device {key}: {message}", Key, e.Message); + this.LogDebug(e, "Stack Trace: "); } trilist.OnlineStatusChange += (d, args) => @@ -138,11 +130,6 @@ namespace PepperDash.Essentials.Core.CrestronIO } - void trilist_OnlineStatusChange(GenericBase currentDevice, OnlineOfflineEventArgs args) - { - throw new NotImplementedException(); - } - #endregion @@ -151,70 +138,55 @@ namespace PepperDash.Essentials.Core.CrestronIO /// public static Versiport GetVersiportDigitalInput(IOPortConfig dc) { - - IIOPorts ioPortDevice; - if (dc.PortDeviceKey.Equals("processor")) { if (!Global.ControlSystem.SupportsVersiport) { - Debug.LogMessage(LogEventLevel.Information, "GetVersiportAnalogInput: Processor does not support Versiports"); + Debug.LogError("GetVersiportAnalogInput: Processor does not support Versiports"); return null; } - ioPortDevice = Global.ControlSystem; + return Global.ControlSystem.VersiPorts[dc.PortNumber]; } - else + + if (!(DeviceManager.GetDeviceForKey(dc.PortDeviceKey) is IIOPorts ioPortDevice)) { - var ioPortDev = DeviceManager.GetDeviceForKey(dc.PortDeviceKey) as IIOPorts; - if (ioPortDev == null) - { - Debug.LogMessage(LogEventLevel.Information, "GetVersiportAnalogInput: Device {0} is not a valid device", dc.PortDeviceKey); - return null; - } - ioPortDevice = ioPortDev; - } - if (ioPortDevice == null) - { - Debug.LogMessage(LogEventLevel.Information, "GetVersiportAnalogInput: Device '0' is not a valid IIOPorts Device", dc.PortDeviceKey); + Debug.LogError("GetVersiportAnalogInput: Device {key} is not a valid device", dc.PortDeviceKey); return null; } if (dc.PortNumber > ioPortDevice.NumberOfVersiPorts) { - Debug.LogMessage(LogEventLevel.Information, "GetVersiportAnalogInput: Device {0} does not contain a port {1}", dc.PortDeviceKey, dc.PortNumber); + Debug.LogError("GetVersiportAnalogInput: Device {key} does not contain a port {port}", dc.PortDeviceKey, dc.PortNumber); return null; } - if(!ioPortDevice.VersiPorts[dc.PortNumber].SupportsAnalogInput) + if (!ioPortDevice.VersiPorts[dc.PortNumber].SupportsAnalogInput) { - Debug.LogMessage(LogEventLevel.Information, "GetVersiportAnalogInput: Device {0} does not support AnalogInput on port {1}", dc.PortDeviceKey, dc.PortNumber); + Debug.LogError("GetVersiportAnalogInput: Device {key} does not support AnalogInput on port {port}", dc.PortDeviceKey, dc.PortNumber); return null; } - return ioPortDevice.VersiPorts[dc.PortNumber]; - - } } /// - /// Represents a GenericVersiportAbalogInputDeviceFactory + /// Represents a GenericVersiportAnalogInputDeviceFactory /// - public class GenericVersiportAbalogInputDeviceFactory : EssentialsDeviceFactory + public class GenericVersiportAnalogInputDeviceFactory : EssentialsDeviceFactory { - public GenericVersiportAbalogInputDeviceFactory() + /// + /// Constructor for GenericVersiportAnalogInputDeviceFactory + /// + public GenericVersiportAnalogInputDeviceFactory() { TypeNames = new List() { "versiportanaloginput" }; } - /// - /// BuildDevice method - /// /// public override EssentialsDevice BuildDevice(DeviceConfig dc) { - Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new Generic Versiport Device"); + Debug.LogDebug("Factory Attempting to create new Generic Versiport Device"); var props = JsonConvert.DeserializeObject(dc.Properties.ToString()); diff --git a/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportInputDevice.cs b/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportInputDevice.cs index f94137c3..e2c4474a 100644 --- a/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportInputDevice.cs +++ b/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportInputDevice.cs @@ -2,78 +2,82 @@ 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.Config; -using PepperDash.Essentials.Core.Bridges; - - using Newtonsoft.Json; -using Serilog.Events; +using PepperDash.Core; +using PepperDash.Core.Logging; +using PepperDash.Essentials.Core.Bridges; +using PepperDash.Essentials.Core.Config; namespace PepperDash.Essentials.Core.CrestronIO { /// /// Represents a generic digital input deviced tied to a versiport /// - public class GenericVersiportDigitalInputDevice : EssentialsBridgeableDevice, IDigitalInput, IPartitionStateProvider + public class GenericVersiportDigitalInputDevice : EssentialsBridgeableDevice, IDigitalInput, IPartitionStateProvider, IHasFeedback { - public Versiport InputPort { get; private set; } + private Versiport inputPort; + /// + /// Gets or sets the InputStateFeedback + /// public BoolFeedback InputStateFeedback { get; private set; } - Func InputStateFeedbackFunc - { - get - { - return () => InputPort.DigitalIn; - } - } + /// + public FeedbackCollection Feedbacks { get; private set; } = new FeedbackCollection(); /// /// Gets or sets the PartitionPresentFeedback /// public BoolFeedback PartitionPresentFeedback { get; } - public bool PartitionPresent => !InputStateFeedbackFunc(); + /// + /// Get partition state + /// + public bool PartitionPresent => !inputPort.DigitalIn; + /// + /// Initializes a new instance of the class. + /// + /// key for device + /// name for device + /// function to call after activation. Should return the Versiport + /// config for device public GenericVersiportDigitalInputDevice(string key, string name, Func postActivationFunc, IOPortConfig config) : base(key, name) { - InputStateFeedback = new BoolFeedback(InputStateFeedbackFunc); - PartitionPresentFeedback = new BoolFeedback(() => !InputStateFeedbackFunc()); + InputStateFeedback = new BoolFeedback("inputState", () => inputPort.DigitalIn); + PartitionPresentFeedback = new BoolFeedback("partitionPresent", () => !inputPort.DigitalIn); AddPostActivationAction(() => { - InputPort = postActivationFunc(config); + inputPort = postActivationFunc(config); - InputPort.Register(); + inputPort.Register(); - InputPort.SetVersiportConfiguration(eVersiportConfiguration.DigitalInput); + inputPort.SetVersiportConfiguration(eVersiportConfiguration.DigitalInput); if (config.DisablePullUpResistor) - InputPort.DisablePullUpResistor = true; + inputPort.DisablePullUpResistor = true; - InputPort.VersiportChange += InputPort_VersiportChange; + inputPort.VersiportChange += InputPort_VersiportChange; InputStateFeedback.FireUpdate(); PartitionPresentFeedback.FireUpdate(); - Debug.LogMessage(LogEventLevel.Debug, this, "Created GenericVersiportDigitalInputDevice on port '{0}'. DisablePullUpResistor: '{1}'", config.PortNumber, InputPort.DisablePullUpResistor); + this.LogDebug("Created GenericVersiportDigitalInputDevice for port {port}. DisablePullUpResistor: {pullUpResistorDisable}", config.PortNumber, inputPort.DisablePullUpResistor); }); + Feedbacks.Add(InputStateFeedback); + Feedbacks.Add(PartitionPresentFeedback); } void InputPort_VersiportChange(Versiport port, VersiportEventArgs args) { - Debug.LogMessage(LogEventLevel.Debug, this, "Versiport change: {0}", args.Event); + this.LogDebug("Versiport change: {0}", args.Event); - if(args.Event == eVersiportEvent.DigitalInChange) + if (args.Event == eVersiportEvent.DigitalInChange) { InputStateFeedback.FireUpdate(); PartitionPresentFeedback.FireUpdate(); @@ -102,20 +106,20 @@ namespace PepperDash.Essentials.Core.CrestronIO } else { - Debug.LogMessage(LogEventLevel.Information, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device."); + this.LogWarning("Please update config to use 'eiscapiadvanced' to get all join map features for this device."); } try { - Debug.LogMessage(LogEventLevel.Debug, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X")); + this.LogDebug("Linking to Trilist '{0}'", trilist.ID.ToString("X")); // Link feedback for input state InputStateFeedback.LinkInputSig(trilist.BooleanInput[joinMap.InputState.JoinNumber]); } catch (Exception e) { - Debug.LogMessage(LogEventLevel.Debug, this, "Unable to link device '{0}'. Input is null", Key); - Debug.LogMessage(LogEventLevel.Debug, this, "Error: {0}", e); + this.LogError("Unable to link device {key}. Input is null. {message}", Key, e.Message); + this.LogDebug(e, "Stack Trace: "); } } @@ -127,63 +131,50 @@ namespace PepperDash.Essentials.Core.CrestronIO /// public static Versiport GetVersiportDigitalInput(IOPortConfig dc) { - - IIOPorts ioPortDevice; - if (dc.PortDeviceKey.Equals("processor")) { if (!Global.ControlSystem.SupportsVersiport) { - Debug.LogMessage(LogEventLevel.Information, "GetVersiportDigitalInput: Processor does not support Versiports"); + Debug.LogError("GetVersiportDigitalInput: Processor does not support Versiports"); return null; } - ioPortDevice = Global.ControlSystem; + return Global.ControlSystem.VersiPorts[dc.PortNumber]; } - else + + if (!(DeviceManager.GetDeviceForKey(dc.PortDeviceKey) is IIOPorts ioPortDevice)) { - var ioPortDev = DeviceManager.GetDeviceForKey(dc.PortDeviceKey) as IIOPorts; - if (ioPortDev == null) - { - Debug.LogMessage(LogEventLevel.Information, "GetVersiportDigitalInput: Device {0} is not a valid device", dc.PortDeviceKey); - return null; - } - ioPortDevice = ioPortDev; - } - if (ioPortDevice == null) - { - Debug.LogMessage(LogEventLevel.Information, "GetVersiportDigitalInput: Device '0' is not a valid IIOPorts Device", dc.PortDeviceKey); + Debug.LogError("GetVersiportDigitalInput: Device {key} is not a valid device", dc.PortDeviceKey); return null; } if (dc.PortNumber > ioPortDevice.NumberOfVersiPorts) { - Debug.LogMessage(LogEventLevel.Information, "GetVersiportDigitalInput: Device {0} does not contain a port {1}", dc.PortDeviceKey, dc.PortNumber); + Debug.LogError("GetVersiportDigitalInput: Device {key} does not contain versiport {port}", dc.PortDeviceKey, dc.PortNumber); + return null; } return ioPortDevice.VersiPorts[dc.PortNumber]; - - } } /// - /// Represents a GenericVersiportDigitalInputDeviceFactory + /// Factory class for GenericVersiportDigitalInputDevice /// public class GenericVersiportDigitalInputDeviceFactory : EssentialsDeviceFactory { + /// + /// Constructor for GenericVersiportDigitalInputDeviceFactory + /// public GenericVersiportDigitalInputDeviceFactory() { TypeNames = new List() { "versiportinput" }; } - /// - /// BuildDevice method - /// /// public override EssentialsDevice BuildDevice(DeviceConfig dc) { - Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new Generic Versiport Device"); + Debug.LogDebug("Factory Attempting to create new Generic Versiport Device"); var props = JsonConvert.DeserializeObject(dc.Properties.ToString()); diff --git a/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportOutputDevice.cs b/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportOutputDevice.cs index 7a823c9a..1ff4db6e 100644 --- a/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportOutputDevice.cs +++ b/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportOutputDevice.cs @@ -2,18 +2,13 @@ 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.Config; -using PepperDash.Essentials.Core.Bridges; - - using Newtonsoft.Json; +using PepperDash.Core; +using PepperDash.Core.Logging; +using PepperDash.Essentials.Core.Bridges; +using PepperDash.Essentials.Core.Config; using Serilog.Events; namespace PepperDash.Essentials.Core.CrestronIO @@ -21,76 +16,68 @@ namespace PepperDash.Essentials.Core.CrestronIO /// /// Represents a generic digital input deviced tied to a versiport /// - public class GenericVersiportDigitalOutputDevice : EssentialsBridgeableDevice, IDigitalOutput + public class GenericVersiportDigitalOutputDevice : EssentialsBridgeableDevice, IDigitalOutput, IHasFeedback { - public Versiport OutputPort { get; private set; } + private Versiport outputPort; + /// + /// Gets or sets the OutputStateFeedback + /// public BoolFeedback OutputStateFeedback { get; private set; } - Func OutputStateFeedbackFunc - { - get - { - return () => OutputPort.DigitalOut; - } - } + /// + public FeedbackCollection Feedbacks { get; private set; } = new FeedbackCollection(); + /// + /// Initializes a new instance of the class. + /// public GenericVersiportDigitalOutputDevice(string key, string name, Func postActivationFunc, IOPortConfig config) : base(key, name) { - OutputStateFeedback = new BoolFeedback(OutputStateFeedbackFunc); + OutputStateFeedback = new BoolFeedback("outputState", () => outputPort.DigitalOut); AddPostActivationAction(() => { - OutputPort = postActivationFunc(config); + outputPort = postActivationFunc(config); - OutputPort.Register(); + outputPort.Register(); - if (!OutputPort.SupportsDigitalOutput) + if (!outputPort.SupportsDigitalOutput) { - Debug.LogMessage(LogEventLevel.Information, this, "Device does not support configuration as a Digital Output"); + this.LogError("Device does not support configuration as a Digital Output"); return; } - OutputPort.SetVersiportConfiguration(eVersiportConfiguration.DigitalOutput); + outputPort.SetVersiportConfiguration(eVersiportConfiguration.DigitalOutput); - OutputPort.VersiportChange += OutputPort_VersiportChange; + outputPort.VersiportChange += OutputPort_VersiportChange; }); - } void OutputPort_VersiportChange(Versiport port, VersiportEventArgs args) { - Debug.LogMessage(LogEventLevel.Debug, this, "Versiport change: {0}", args.Event); + this.LogDebug("Versiport change: {event}", args.Event); - if(args.Event == eVersiportEvent.DigitalOutChange) + if (args.Event == eVersiportEvent.DigitalOutChange) OutputStateFeedback.FireUpdate(); } /// /// Set value of the versiport digital output /// - /// value to set the output to - /// - /// SetOutput method - /// + /// value to set the output to public void SetOutput(bool state) { - if (OutputPort.SupportsDigitalOutput) - { - Debug.LogMessage(LogEventLevel.Information, this, "Passed the Check"); - - OutputPort.DigitalOut = state; - - } - else - { - Debug.LogMessage(LogEventLevel.Information, this, "Versiport does not support Digital Output Mode"); - } + if (!outputPort.SupportsDigitalOutput) + { + this.LogError("Versiport does not support Digital Output Mode"); + return; + } + outputPort.DigitalOut = state; } #region Bridge Linking @@ -114,12 +101,12 @@ namespace PepperDash.Essentials.Core.CrestronIO } else { - Debug.LogMessage(LogEventLevel.Information, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device."); + this.LogWarning("Please update config to use 'eiscapiadvanced' to get all join map features for this device."); } try { - Debug.LogMessage(LogEventLevel.Debug, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X")); + this.LogDebug("Linking to Trilist '{0}'", trilist.ID.ToString("X")); // Link feedback for input state OutputStateFeedback.LinkInputSig(trilist.BooleanInput[joinMap.OutputState.JoinNumber]); @@ -127,8 +114,8 @@ namespace PepperDash.Essentials.Core.CrestronIO } catch (Exception e) { - Debug.LogMessage(LogEventLevel.Debug, this, "Unable to link device '{0}'. Input is null", Key); - Debug.LogMessage(LogEventLevel.Debug, this, "Error: {0}", e); + this.LogError("Unable to link device: {message}", e.Message); + this.LogDebug(e, "Stack Trace: "); } } @@ -140,41 +127,28 @@ namespace PepperDash.Essentials.Core.CrestronIO /// public static Versiport GetVersiportDigitalOutput(IOPortConfig dc) { - - IIOPorts ioPortDevice; - - if (dc.PortDeviceKey.Equals("processor")) + if (dc.PortDeviceKey.Equals("processor")) + { + if (!Global.ControlSystem.SupportsVersiport) { - if (!Global.ControlSystem.SupportsVersiport) - { - Debug.LogMessage(LogEventLevel.Information, "GetVersiportDigitalOuptut: Processor does not support Versiports"); - return null; - } - ioPortDevice = Global.ControlSystem; - } - else - { - var ioPortDev = DeviceManager.GetDeviceForKey(dc.PortDeviceKey) as IIOPorts; - if (ioPortDev == null) - { - Debug.LogMessage(LogEventLevel.Information, "GetVersiportDigitalOuptut: Device {0} is not a valid device", dc.PortDeviceKey); - return null; - } - ioPortDevice = ioPortDev; - } - if (ioPortDevice == null) - { - Debug.LogMessage(LogEventLevel.Information, "GetVersiportDigitalOuptut: Device '0' is not a valid IOPorts Device", dc.PortDeviceKey); + Debug.LogError("GetVersiportDigitalOuptut: Processor does not support Versiports"); return null; } + return Global.ControlSystem.VersiPorts[dc.PortNumber]; + } - if (dc.PortNumber > ioPortDevice.NumberOfVersiPorts) - { - Debug.LogMessage(LogEventLevel.Information, "GetVersiportDigitalOuptut: Device {0} does not contain a port {1}", dc.PortDeviceKey, dc.PortNumber); - } - var port = ioPortDevice.VersiPorts[dc.PortNumber]; - return port; + if (!(DeviceManager.GetDeviceForKey(dc.PortDeviceKey) is IIOPorts ioPortDevice)) + { + Debug.LogError("GetVersiportDigitalOutput: Device {key} is not a valid device", dc.PortDeviceKey); + return null; + } + if (dc.PortNumber > ioPortDevice.NumberOfVersiPorts) + { + Debug.LogMessage(LogEventLevel.Information, "GetVersiportDigitalOutput: Device {0} does not contain a port {1}", dc.PortDeviceKey, dc.PortNumber); + return null; + } + return ioPortDevice.VersiPorts[dc.PortNumber]; } } @@ -184,18 +158,18 @@ namespace PepperDash.Essentials.Core.CrestronIO /// public class GenericVersiportDigitalOutputDeviceFactory : EssentialsDeviceFactory { + /// + /// Initialize a new instance of the class. + /// public GenericVersiportDigitalOutputDeviceFactory() { TypeNames = new List() { "versiportoutput" }; } - /// - /// BuildDevice method - /// /// public override EssentialsDevice BuildDevice(DeviceConfig dc) { - Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new Generic Versiport Device"); + Debug.LogDebug("Factory Attempting to create new Generic Versiport Device"); var props = JsonConvert.DeserializeObject(dc.Properties.ToString());