Ejemplo n.º 1
0
        /// <summary>
        /// Sets multiple channel values at once.
        /// </summary>
        void INavioPwmDevice.SetChannels(int number, IList <PwmPulse> values, int count)
        {
            // Thread-safe lock
            lock (_lock)
            {
                // Validate
                if (number < 1 || number > PwmChannelCount)
                {
                    throw new ArgumentOutOfRangeException(nameof(number));
                }
                if (values == null)
                {
                    throw new ArgumentNullException(nameof(values));
                }
                if (count < 1 || number + count > PwmChannelCount)
                {
                    throw new ArgumentOutOfRangeException(nameof(count));
                }

                // Build device values, check frequency and detect change
                var changed       = false;
                var channelValues = new List <Pca9685ChannelValue>();
                for (var index = 0; index < count; index++)
                {
                    // Get value and convert to channel value
                    var value = values[index];
                    channelValues.Add(Pca9685ChannelValue.FromWidthMs(value.Width, value.Frequency, 0));

                    // Check frequency
                    if (value.Frequency != _device.Frequency)
                    {
                        throw new ArgumentOutOfRangeException(nameof(value.Frequency));
                    }

                    // Check value
                    var oldValue = _pwmChannels[number + index - 1];
                    if (value != oldValue)
                    {
                        changed = true;
                    }
                }

                // Do nothing when unchanged
                if (!changed)
                {
                    return;
                }

                // Write new value
                _device.WriteChannels(PwmChannelIndex + number - 1, channelValues);

                // Update properties
                for (var index = 0; index < count; index++)
                {
                    _pwmChannels[index] = values[index];
                }
            }
        }