/// <inheritdoc/> protected override void Dispose(bool disposing) { if (_pinNumberToEventHandler != null) { foreach (KeyValuePair <int, LibGpiodDriverEventHandler> kv in _pinNumberToEventHandler) { LibGpiodDriverEventHandler eventHandler = kv.Value; eventHandler.Dispose(); } _pinNumberToEventHandler.Clear(); } if (_pinNumberToSafeLineHandle != null) { foreach (int pin in _pinNumberToSafeLineHandle.Keys) { if (_pinNumberToSafeLineHandle.TryGetValue(pin, out SafeLineHandle pinHandle)) { pinHandle?.Dispose(); } } _pinNumberToSafeLineHandle.Clear(); } _chip?.Dispose(); _chip = null; base.Dispose(disposing); }
/// <inheritdoc/> protected internal override void AddCallbackForPinValueChangedEvent(int pinNumber, PinEventTypes eventTypes, PinChangeEventHandler callback) { if ((eventTypes & PinEventTypes.Rising) != 0 || (eventTypes & PinEventTypes.Falling) != 0) { LibGpiodDriverEventHandler eventHandler = _pinNumberToEventHandler.GetOrAdd(pinNumber, PopulateEventHandler); if ((eventTypes & PinEventTypes.Rising) != 0) { eventHandler.ValueRising += callback; } if ((eventTypes & PinEventTypes.Falling) != 0) { eventHandler.ValueFalling += callback; } } else { throw ExceptionHelper.GetArgumentException(ExceptionResource.InvalidEventType); } }
/// <inheritdoc/> protected internal override WaitForEventResult WaitForEvent(int pinNumber, PinEventTypes eventTypes, CancellationToken cancellationToken) { if ((eventTypes & PinEventTypes.Rising) != 0 || (eventTypes & PinEventTypes.Falling) != 0) { LibGpiodDriverEventHandler eventHandler = _pinNumberToEventHandler.GetOrAdd(pinNumber, PopulateEventHandler); if ((eventTypes & PinEventTypes.Rising) != 0) { eventHandler.ValueRising += Callback; } if ((eventTypes & PinEventTypes.Falling) != 0) { eventHandler.ValueFalling += Callback; } bool eventOccurred = false; PinEventTypes typeOfEventOccured = PinEventTypes.None; void Callback(object o, PinValueChangedEventArgs e) { eventOccurred = true; typeOfEventOccured = e.ChangeType; } WaitForEventResult(cancellationToken, eventHandler.CancellationTokenSource.Token, ref eventOccurred); RemoveCallbackForPinValueChangedEvent(pinNumber, Callback); return(new WaitForEventResult { TimedOut = !eventOccurred, EventTypes = eventOccurred ? typeOfEventOccured : PinEventTypes.None, }); } else { throw ExceptionHelper.GetArgumentException(ExceptionResource.InvalidEventType); } }