public Windows10DriverPin(Windows10Driver driver, WinGpio.GpioPin pin) { _driver = new WeakReference <Windows10Driver>(driver); _pin = pin; _pinNumber = _pin.PinNumber; // Set a reasonable default for DebounceTimeout (until .NET Core API adds a DebouceTimeout property) _pin.DebounceTimeout = TimeSpan.FromMilliseconds(ReasonableDebounceTimeoutMillseconds); }
public void Dispose() { if (_pin != null) { _pin.ValueChanged -= Pin_ValueChanged; _pin.Dispose(); _pin = null; } _driver = null; _fallingCallbacks = null; _risingCallbacks = null; GC.SuppressFinalize(this); }
/// <summary> /// Opens a pin in order for it to be ready to use. /// </summary> /// <param name="pinNumber">The pin number in the driver's logical numbering scheme.</param> protected internal override void OpenPin(int pinNumber) { // Ignore calls to open an already open pin if (_openPins.ContainsKey(pinNumber)) { return; } if (pinNumber < 0 || pinNumber >= PinCount) { throw new ArgumentOutOfRangeException(nameof(pinNumber)); } WinGpio.GpioPin windowsPin = s_winGpioController.OpenPin(pinNumber, WinGpio.GpioSharingMode.Exclusive); _openPins[pinNumber] = new Windows10DriverPin(this, windowsPin); }
private void Pin_ValueChanged(WinGpio.GpioPin sender, WinGpio.GpioPinValueChangedEventArgs args) { if (!_driver.TryGetTarget(out Windows10Driver driver)) { return; } switch (args.Edge) { case WinGpio.GpioPinEdge.FallingEdge: _fallingCallbacks?.Invoke(_driver, new PinValueChangedEventArgs(PinEventTypes.Falling, _pinNumber)); break; case WinGpio.GpioPinEdge.RisingEdge: _risingCallbacks?.Invoke(_driver, new PinValueChangedEventArgs(PinEventTypes.Rising, _pinNumber)); break; } }
protected internal override bool WaitForPinEvent(int gpioPinNumber, TimeSpan timeout) { VerifyPinIsInValidRange(gpioPinNumber, nameof(gpioPinNumber)); var waitEvent = new ManualResetEventSlim(); GpioPinValueChangedHandler handler = (s, a) => waitEvent.Set(); WinGpio.GpioPin pin = null; lock (_openPinsLock) { pin = VerifyPinIsOpen(gpioPinNumber, nameof(gpioPinNumber)).Pin; pin.ValueChanged += handler; } var result = waitEvent.Wait(timeout); pin.ValueChanged -= handler; return(result); }