private Task InitializeEventDetectionTask(CancellationToken token, SafeLineHandle pinHandle) { return(Task.Run(() => { while (!(token.IsCancellationRequested || _disposing)) { // WaitEventResult can be TimedOut, EventOccured or Error, in case of TimedOut will continue waiting TimeSpec timeout = new TimeSpec { TvSec = new IntPtr(0), TvNsec = new IntPtr(1000000) }; WaitEventResult waitResult = Interop.libgpiod.gpiod_line_event_wait(pinHandle, ref timeout); if (waitResult == WaitEventResult.Error) { throw ExceptionHelper.GetIOException(ExceptionResource.EventWaitError, Marshal.GetLastWin32Error(), _pinNumber); } if (waitResult == WaitEventResult.EventOccured) { GpioLineEvent eventResult = new GpioLineEvent(); int checkForEvent = Interop.libgpiod.gpiod_line_event_read(pinHandle, ref eventResult); if (checkForEvent == -1) { throw ExceptionHelper.GetIOException(ExceptionResource.EventReadError, Marshal.GetLastWin32Error()); } PinEventTypes eventType = (eventResult.event_type == 1) ? PinEventTypes.Rising : PinEventTypes.Falling; this?.OnPinValueChanged(new PinValueChangedEventArgs(eventType, _pinNumber), eventType); } } }, token)); }
internal static extern int gpiod_line_event_read(SafeLineHandle line, ref GpioLineEvent gpioEvent);