Exemple #1
0
        /// <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
            });
        }