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));
        }
        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
                    WaitEventResult waitResult = Interop.WaitForEventOnLine(pinHandle);
                    if (waitResult == WaitEventResult.Error)
                    {
                        throw ExceptionHelper.GetIOException(ExceptionResource.EventWaitError, Marshal.GetLastWin32Error(), _pinNumber);
                    }

                    if (waitResult == WaitEventResult.EventOccured)
                    {
                        int readResult = Interop.ReadEventForLine(pinHandle);
                        if (readResult == -1)
                        {
                            throw ExceptionHelper.GetIOException(ExceptionResource.EventReadError, Marshal.GetLastWin32Error());
                        }

                        PinEventTypes eventType = (readResult == 1) ? PinEventTypes.Rising : PinEventTypes.Falling;
                        this?.OnPinValueChanged(new PinValueChangedEventArgs(eventType, _pinNumber), eventType);
                    }
                }
            }, token));
        }