Ejemplo n.º 1
0
        public void ActivatePreset(Preset preset, double milliseconds = 0)
        {
            if (preset is null)
            {
                throw new ArgumentNullException(nameof(preset));
            }

            Group defaultGroup = new Group()
            {
                Percentage = 100
            };
            IEnumerable <(string name, IPresetAware oldValue, Lamp newValue)> lamps = GetPresetValuesForLamps(preset);

            var groups = preset.GroupValues
                         .Union(groupService.GetGroupsNotNamed(preset.GroupValues.Keys)
                                .Select(i => new KeyValuePair <string, Group>(i, defaultGroup))
                                )
                         .Select(i => (name: i.Key, oldValue: groupService.GetTransitionable(i.Key), newValue: i.Value))
                         .ToList();

            groups = groups
                     .Select(i => i.name)
                     .Distinct()
                     .Select(i => groups.FirstOrDefault(j => j.name == i))
                     .ToList();


            if (tokenSource == null)
            {
                tokenSource = new CancellationTokenSource();
            }
            else
            {
                tokenSource.Cancel();
                tokenSource = new CancellationTokenSource();
            }

            Task.Run(() =>
            {
                DateTime start    = DateTime.Now;
                double percentage = 0;
                do
                {
                    Thread.Sleep(10);
                    percentage = Math.Min((DateTime.Now - start).TotalMilliseconds / milliseconds, 1);
                    foreach (var lamp in lamps)
                    {
                        lightService.ApplyPreset(lamp.name, lamp.oldValue, lamp.newValue, percentage);
                    }
                    foreach (var group in groups)
                    {
                        groupService.ApplyPreset(group.name, group.oldValue, group.newValue, percentage);
                    }
                } while (percentage < 1 && !tokenSource.IsCancellationRequested);
            }, tokenSource.Token);
        }