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; }
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))); }
public static float GetSaturationPercent(this ILifxHsbkData data) => data.Saturation / (float)UInt16.MaxValue;
public static float GetBrightnessPercent(this ILifxHsbkData data) => data.Brightness / (float)UInt16.MaxValue;
public static float GetHueDegrees(this ILifxHsbkData data) => data.Hue / (float)UInt16.MaxValue * 360f;