using System; using System.Device.Gpio; namespace GPIORaspberryPI4; public sealed class DigitalInput : IDigitalInput { private readonly GpioController _gpio; private readonly int _pin; private readonly bool _activeLow; private bool _disposed; public int Pin => _pin; public bool IsActive => Read(); public DigitalInput(int pin, bool pullUp = true, bool activeLow = true) { _pin = pin; _activeLow = activeLow; _gpio = new GpioController(); var mode = pullUp ? PinMode.InputPullUp : PinMode.Input; _gpio.OpenPin(_pin, mode); } public bool Read() { ThrowIfDisposed(); var value = _gpio.Read(_pin); return _activeLow ? value == PinValue.Low : value == PinValue.High; } private void ThrowIfDisposed() { if (_disposed) throw new ObjectDisposedException(nameof(DigitalInput)); } public void Dispose() { if (_disposed) return; if (_gpio.IsPinOpen(_pin)) _gpio.ClosePin(_pin); _gpio.Dispose(); _disposed = true; } }