Ejemplo n.º 1
0
        public async Task SendSetColorMessage(int frameIndex, UdpClient client,
                                              int transitionDuration = 0)
        {
            Rgb24 color = GetColor(frameIndex);

            LifxSetColorMessage message = new LifxSetColorMessage
            {
                Kelvin   = 3500, /* Neutral */
                Duration = (uint)transitionDuration
            }.SetRgb24(color);

            message.Brightness = (ushort)Math.Min(ushort.MaxValue, message.Brightness * BrightnessFactor);

            // Prevent a white flicker when blacking a bulb with transitions enabled.
            if (message.Brightness == 0 && lastSetColor != null && transitionDuration > 0)
            {
                message.Hue        = lastSetColor.Hue;
                message.Saturation = lastSetColor.Saturation;
            }

            LifxPacket packet = new LifxPacket
            {
                FrameHeaderTagged = true,
                FrameHeaderSource = 092985, // An arbitrary, unique value.
                FrameAddressAcknowledgementRequired = false,
                FrameAddressResponseRequired        = false,
                ProtocolHeaderType = LifxMessageType.SetColor,
                Payload            = message
            };

            using (MemoryStream data = new MemoryStream())
                using (BinaryWriter writer = new BinaryWriter(data))
                {
                    packet.Serialize(writer);
                    await client.SendAsync(data.ToArray(), (int)data.Length, EndPoint);
                }

            lastSetColor = message;
        }
Ejemplo n.º 2
0
        public static Rgb24 GetRgb24(this ILifxHsbkData data)
        {
            // Reference: https://en.wikipedia.org/wiki/HSL_and_HSV#From_HSV
            float hue        = data.GetHueDegrees();
            float saturation = data.GetSaturationPercent();
            float brightness = data.GetBrightnessPercent();

            float chroma   = brightness * saturation;
            float huePrime = hue / 60f;
            float x        = chroma * (1f - Math.Abs(huePrime % 2 - 1));
            var   rgb1     = huePrime <= 1 ? (chroma, x, 0f)
                : huePrime <= 2 ? (x, chroma, 0f)
                : huePrime <= 3 ? (0f, chroma, x)
                : huePrime <= 4 ? (0f, x, chroma)
                : huePrime <= 5 ? (x, 0f, chroma)
                : /* huePrime <= 6 */ (chroma, 0f, x);
            float m = brightness - chroma;

            return(new Rgb24(
                       r: (byte)Math.Round((rgb1.Item1 + m) * byte.MaxValue, 0),
                       g: (byte)Math.Round((rgb1.Item2 + m) * byte.MaxValue, 0),
                       b: (byte)Math.Round((rgb1.Item3 + m) * byte.MaxValue, 0)));
        }
Ejemplo n.º 3
0
 public static float GetSaturationPercent(this ILifxHsbkData data)
 => data.Saturation / (float)UInt16.MaxValue;
Ejemplo n.º 4
0
 public static float GetBrightnessPercent(this ILifxHsbkData data)
 => data.Brightness / (float)UInt16.MaxValue;
Ejemplo n.º 5
0
 public static float GetHueDegrees(this ILifxHsbkData data)
 => data.Hue / (float)UInt16.MaxValue * 360f;