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);
        }
Example #2
0
 public void Dispose()
 {
     if (_pin != null)
     {
         _pin.ValueChanged -= Pin_ValueChanged;
         _pin.Dispose();
         _pin = null;
     }
     _driver           = null;
     _fallingCallbacks = null;
     _risingCallbacks  = null;
     GC.SuppressFinalize(this);
 }
Example #3
0
        /// <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;
            }
        }
Example #5
0
        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);
        }