57 lines
1.1 KiB
C#
57 lines
1.1 KiB
C#
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;
|
|
}
|
|
} |