Ejemplo n.º 1
0
        public static void StartEffect(string typeName, string colorHex, string?group = null, IteratorEffectMode iteratorMode = IteratorEffectMode.All, IteratorEffectMode secondaryIteratorMode = IteratorEffectMode.All)
        {
            var hub = (IHubContext <StatusHub>)Startup.ServiceProvider.GetService(typeof(IHubContext <StatusHub>));

            var all      = GetEffectTypes();
            var allGroup = GetGroupEffectTypes();

            var effectType      = all.Where(x => x.Name == typeName).FirstOrDefault();
            var groupEffectType = allGroup.Where(x => x.Name == typeName).FirstOrDefault();

            bool isGroupEffect  = groupEffectType != null && !string.IsNullOrEmpty(group);
            var  selectedEffect = isGroupEffect ? groupEffectType : effectType;

            if (selectedEffect != null)
            {
                var hueEffectAtt = selectedEffect.GetCustomAttribute <HueEffectAttribute>();
                if (hueEffectAtt == null)
                {
                    return;
                }

                var isBaseLayer = hueEffectAtt.IsBaseEffect && iteratorMode != IteratorEffectMode.Single && iteratorMode != IteratorEffectMode.RandomOrdered;
                var layer       = GetLayer(isBaseLayer);

                if (layerInfo.ContainsKey(layer))
                {
                    //Cancel currently running job
                    layerInfo[layer].CancellationTokenSource?.Cancel();
                }

                CancellationTokenSource cts = new CancellationTokenSource();
                layerInfo[layer] = new RunningEffectInfo()
                {
                    Name = hueEffectAtt.Name, CancellationTokenSource = cts
                };

                Func <TimeSpan> waitTime = () => StreamingSetup.WaitTime;
                RGBColor?       color    = null;
                if (!string.IsNullOrEmpty(colorHex))
                {
                    color = new RGBColor(colorHex);
                }


                if (isGroupEffect)
                {
                    //get group
                    var selectedGroup = GroupService.GetAll(layer).Where(x => x.Name == group).Select(x => x.Lights).FirstOrDefault();

                    StartEffect(cts.Token, selectedEffect, selectedGroup.SelectMany(x => x), group, waitTime, color, iteratorMode, secondaryIteratorMode);
                }
                else
                {
                    StartEffect(cts.Token, selectedEffect, layer, waitTime, color);
                }
            }
        }
Ejemplo n.º 2
0
        private static void StartRandomGroupEffect(bool useMultipleEffects = true)
        {
            Func <TimeSpan> waitTime = () => StreamingSetup.WaitTime;

            Random r = new Random();
            var    allGroupEffects = GetGroupEffectTypes();

            //Always run on baselayer
            var layer = GetLayer(isBaseLayer: true);

            //Random group that supports multiple effects
            var group = GroupService.GetAll(layer).OrderBy(x => Guid.NewGuid()).FirstOrDefault();

            if (group == null)
            {
                return;
            }

            //Get same number of effects as groups in the light list
            var effects = allGroupEffects.OrderBy(x => Guid.NewGuid()).Take(group.MaxEffects).ToList();

            //Cancel current
            if (layerInfo.ContainsKey(layer))
            {
                //Cancel currently running job
                layerInfo[layer].CancellationTokenSource?.Cancel();
            }

            CancellationTokenSource cts = new CancellationTokenSource();

            layerInfo[layer] = new RunningEffectInfo()
            {
                Name = "Double random", CancellationTokenSource = cts
            };


            for (int i = 0; i < group.Lights.Count; i++)
            {
                var section = group.Lights[i];
                GenerateRandomEffectSettings(out RGBColor hexColor, out IteratorEffectMode iteratorMode, out IteratorEffectMode iteratorSecondaryMode);

                if (group.Lights.Count == 1 &&
                    iteratorSecondaryMode != IteratorEffectMode.All &&
                    (effects[i] == typeof(HueLightDJ.Effects.Group.RandomColorsEffect) || effects[i] == typeof(HueLightDJ.Effects.Group.RandomColorloopEffect))
                    )
                {
                    //Random colors on all individual is boring, start another effect!
                    StartRandomEffect();
                    break;
                }

                StartEffect(cts.Token, effects[i], section, group.Name, waitTime, hexColor, iteratorMode, iteratorSecondaryMode);
            }
        }