Ejemplo n.º 1
0
        /// <summary>
        /// Sets the LED <see cref="INavioLedDevice.Red"/>, <see cref="INavioLedDevice.Green"/> and
        /// <see cref="INavioLedDevice.Blue"/> values together (in one operation).
        /// </summary>
        /// <param name="red">Red value in the range 0-<see cref="INavioLedDevice.MaximumValue"/>.</param>
        /// <param name="green">Green value in the range 0-<see cref="INavioLedDevice.MaximumValue"/>.</param>
        /// <param name="blue">Blue value in the range 0-<see cref="INavioLedDevice.MaximumValue"/>.</param>
        void INavioLedDevice.SetRgb(int red, int green, int blue)
        {
            // Thread-safe lock
            lock (_lock)
            {
                // Validate
                if (red < 0 || red > Pca9685ChannelValue.Maximum)
                {
                    throw new ArgumentOutOfRangeException(nameof(red));
                }
                if (green < 0 || green > Pca9685ChannelValue.Maximum)
                {
                    throw new ArgumentOutOfRangeException(nameof(green));
                }
                if (blue < 0 || blue > Pca9685ChannelValue.Maximum)
                {
                    throw new ArgumentOutOfRangeException(nameof(blue));
                }

                // Invert values
                var inverseRed   = ~red & 0x0fff;
                var inverseGreen = ~green & 0x0fff;
                var inverseBlue  = ~blue & 0x0fff;

                // Set all three LED channels together (BGR order)
                var values = new Pca9685ChannelValue[]
                {
                    Pca9685ChannelValue.FromWidth(inverseBlue),
                    Pca9685ChannelValue.FromWidth(inverseGreen),
                    Pca9685ChannelValue.FromWidth(inverseRed)
                };
                _device.WriteChannels(0, values);

                // Update cached values
                _ledBlue  = blue;
                _ledGreen = green;
                _ledRed   = red;
            }
        }