From c2c23f3cc5b588b9d83cb773c4b949c5371dc955 Mon Sep 17 00:00:00 2001 From: Filip Strajnar Date: Fri, 27 Sep 2024 23:33:29 +0200 Subject: [PATCH] Added PwmWrapper class to simplify value management of each pin. --- Proculite.GpioRest/Wrappers/PwmWrapper.cs | 64 +++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 Proculite.GpioRest/Wrappers/PwmWrapper.cs diff --git a/Proculite.GpioRest/Wrappers/PwmWrapper.cs b/Proculite.GpioRest/Wrappers/PwmWrapper.cs new file mode 100644 index 0000000..8d2bfcd --- /dev/null +++ b/Proculite.GpioRest/Wrappers/PwmWrapper.cs @@ -0,0 +1,64 @@ +using System.Device.Pwm.Drivers; + +namespace Proculite.GpioRest.Wrappers +{ + public class PwmWrapper + { + private readonly SoftwarePwmChannel _softwarePwmChannel; + private readonly ILogger? _logger; + public int PinNumber { get; } + public double Value + { + get => _softwarePwmChannel.DutyCycle; + set { _softwarePwmChannel.DutyCycle = value; } + } + + public PwmWrapper(int pinNumber, ILogger? logger = null) + { + PinNumber = pinNumber; + _softwarePwmChannel = new SoftwarePwmChannel(pinNumber, usePrecisionTimer: true); + _logger = logger; + _softwarePwmChannel.DutyCycle = 0; + _softwarePwmChannel.Start(); + } + + public void SetValue(double value) + { + LogValue(value); + if (value < 0 || value > 1) + { + LogValueOutOfBounds(); + return; + } + + _softwarePwmChannel.DutyCycle = value; + } + + public void SetHigh() + { + SetValue(1); + } + + public void SetLow() + { + SetValue(0); + } + + private void LogValue(double value) + { + if (_logger is null) + return; + _logger.LogDebug("New value for pin {PinNumber}: {Value}", PinNumber, value); + } + + private void LogValueOutOfBounds() + { + if (_logger is null) + return; + _logger.LogWarning( + "Attempting to set value of pin {PinNumber}, but it's not between 0 and 1.", + PinNumber + ); + } + } +}