/// <inheritdoc/> protected override WaitForEventResult WaitForEvent(int pinNumber, PinEventTypes eventTypes, CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { ushort queueSize; var ftStatus = FtFunction.FT4222_GPIO_GetTriggerStatus(_ftHandle, (GpioPort)pinNumber, out queueSize); if (ftStatus != FtStatus.Ok) { throw new IOException($"Can't get trigger status, error {ftStatus}"); } if (queueSize > 0) { Span <GpioTrigger> gpioTriggers = stackalloc GpioTrigger[queueSize]; ushort readTrigger; ftStatus = FtFunction.FT4222_GPIO_ReadTriggerQueue(_ftHandle, (GpioPort)pinNumber, in MemoryMarshal.GetReference(gpioTriggers), queueSize, out readTrigger); if (ftStatus != FtStatus.Ok) { throw new IOException($"Can't read trigger status, error {ftStatus}"); } switch (eventTypes) { case PinEventTypes.Rising: if (_gpioTriggers[pinNumber].HasFlag(GpioTrigger.Rising)) { if (gpioTriggers.ToArray().Where(m => m == GpioTrigger.Rising).Count() > 0) { return(new WaitForEventResult() { EventTypes = PinEventTypes.Rising, TimedOut = false }); } } break; case PinEventTypes.Falling: if (_gpioTriggers[pinNumber].HasFlag(GpioTrigger.Falling)) { if (gpioTriggers.ToArray().Where(m => m == GpioTrigger.Falling).Count() > 0) { return(new WaitForEventResult() { EventTypes = PinEventTypes.Falling, TimedOut = false }); } } break; case PinEventTypes.None: default: break; } } } return(new WaitForEventResult() { EventTypes = PinEventTypes.None, TimedOut = true }); }