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); } } }
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); } }