Exemple #1
0
        //Source: https://github.com/Q42/Q42.HueApi/pull/174
        public static void SetState(this EntertainmentLight light, CancellationToken cancellationToken, RGBColor?rgb = null, TimeSpan rgbTimeSpan = default, double?brightness = null, TimeSpan briTimeSpan = default, bool overwriteExistingTransition = true)
        {
            if (light == null)
            {
                throw new ArgumentNullException(nameof(light));
            }

            // No change in state required.
            if (!rgb.HasValue && !brightness.HasValue)
            {
                return;
            }

            var  currentTransition     = light.Transition;
            bool hasExistingTransition = currentTransition != null && !currentTransition.IsFinished;
            bool canCombineTransitions = hasExistingTransition &&
                                         (!rgb.HasValue || !brightness.HasValue) &&
                                         (!rgb.HasValue || !currentTransition !.IsBrightnessFinished) &&
                                         (!brightness.HasValue || !currentTransition !.IsRgbFinished);

            Transition transition;

            // If we can't combine the existing transition (if there is one) with the new transition, start a fresh transition.
            if (!canCombineTransitions || overwriteExistingTransition)
            {
                if (rgb.HasValue && brightness.HasValue)
                {
                    transition = new Transition(rgb.Value, brightness.Value, rgbTimeSpan, briTimeSpan);
                }
                else if (rgb.HasValue)
                {
                    transition = new Transition(rgb.Value, rgbTimeSpan);
                }
                else
                {
                    transition = new Transition(brightness.Value, briTimeSpan);
                }
            }
            else
            {
                // A transition is currently in progress, which we need to combine with the colour or brightness that was specified.
                if (rgb.HasValue)
                {
                    // Combine new colour transition with existing brightness transition.
                    transition = new Transition(rgb.Value, currentTransition !.TargetBri.Value, rgbTimeSpan, currentTransition.BrightnessRemainingTime);
                }
                else
                {
                    // Combine new brightness transition with existing colour transition.
                    transition = new Transition(currentTransition !.TargetRgb.Value, brightness.Value, currentTransition.RgbRemainingTime, briTimeSpan);
                }
            }

            light.Transition = transition;
            transition.Start(light.State.RGBColor, light.State.Brightness, cancellationToken);
        }
        /// <summary>
        /// Get the multiplier for an effect on a light
        /// </summary>
        /// <param name="effect"></param>
        /// <param name="light"></param>
        /// <returns></returns>
        public override double?GetEffectStrengthMultiplier(EntertainmentLight light)
        {
            var    distance   = Distance(light.LightLocation);
            double?multiplier = Radius - distance * 2;

            multiplier = multiplier > 1 ? 1 : multiplier;
            multiplier = multiplier < 0 ? 0 : multiplier;

            return(multiplier);
        }
        ///// <summary>
        /////
        ///// </summary>
        ///// <param name="light"></param>
        ///// <param name="xy"></param>
        ///// <param name="gamut">The gamut to use</param>
        ///// <param name="timeSpan"></param>
        ///// <param name="cancellationToken"></param>
        ///// <returns></returns>
        //public static void SetColor(this EntertainmentLight light, CancellationToken cancellationToken, CIE1931Point xy, CIE1931Gamut gamut, TimeSpan timeSpan = default)
        //{
        //  var rgb = HueColorConverter.XYToRgb(xy, gamut);
        //  light.SetState(cancellationToken, rgb, null, timeSpan);
        //}

        /// <summary>
        /// Set state on a single light
        /// </summary>
        /// <param name="light"></param>
        /// <param name="rgb"></param>
        /// <param name="brightness"></param>
        /// <param name="timeSpan"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public static void SetState(this EntertainmentLight light, CancellationToken cancellationToken, RGBColor?rgb = null, double?brightness = null, TimeSpan timeSpan = default)
        {
            //Create a new transition for this light
            Transition transition = new Transition(rgb, brightness, timeSpan);

            light.Transition = transition;

            //Start the transition
            transition.Start(light.State.RGBColor, light.State.Brightness, cancellationToken);
        }
Exemple #4
0
        /// <summary>
        /// Set state on a single light
        /// </summary>
        /// <param name="light"></param>
        /// <param name="xy"></param>
        /// <param name="gamut"></param>
        /// <param name="brightness"></param>
        /// <param name="timeSpan"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public static void SetState(this EntertainmentLight light, CancellationToken cancellationToken, CIE1931Point xy, CIE1931Gamut gamut, double?brightness = null, TimeSpan timeSpan = default(TimeSpan))
        {
            var rgb = HueColorConverter.XYToRgb(xy, gamut);

            //Create a new transition for this light
            Transition transition = new Transition(rgb, brightness, timeSpan);

            light.Transition = transition;

            //Start the transition
            transition.Start(light.State.RGBColor, light.State.Brightness, cancellationToken);
        }
Exemple #5
0
        /// <summary>
        /// Get the multiplier for an effect on a light
        /// </summary>
        /// <param name="effect"></param>
        /// <param name="light"></param>
        /// <returns></returns>
        public override double?GetEffectStrengthMultiplier(EntertainmentLight light)
        {
            var angle = Angle(light.LightLocation);

            var dif1 = Math.Abs(CurrentAngle - angle);
            var dif2 = Math.Abs(CurrentAngle - angle - 360);

            var diff = Math.Min(dif1, dif2) / 60;

            double?multiplier = this.Width - diff;

            multiplier = multiplier > 1 ? 1 : multiplier;
            multiplier = multiplier < 0 ? 0 : multiplier;

            return(multiplier);
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="light"></param>
 /// <param name="rgb"></param>
 /// <param name="timeSpan"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public static void SetColor(this EntertainmentLight light, CancellationToken cancellationToken, RGBColor rgb, TimeSpan timeSpan = default)
 {
     light.SetState(cancellationToken, rgb, null, timeSpan);
 }
 /// <summary>
 /// Brightness between 0 and 1
 /// </summary>
 /// <param name="light"></param>
 /// <param name="brightness">between 0 and 1</param>
 /// <param name="timeSpan"></param>
 /// <param name="cancellationToken"></param>
 public static void SetBrightness(this EntertainmentLight light, CancellationToken cancellationToken, double brightness, TimeSpan timeSpan = default)
 {
     light.SetState(cancellationToken, null, brightness, timeSpan);
 }
 public abstract double?GetEffectStrengthMultiplier(EntertainmentLight light);
Exemple #9
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="light"></param>
        /// <param name="xy"></param>
        /// <param name="gamut">The gamut to use</param>
        /// <param name="timeSpan"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public static void SetColor(this EntertainmentLight light, CancellationToken cancellationToken, CIE1931Point xy, CIE1931Gamut gamut, TimeSpan timeSpan = default)
        {
            var rgb = HueColorConverter.XYToRgb(xy, gamut);

            light.SetState(cancellationToken, rgb, null, timeSpan);
        }