private void AsyncCorrection(object sender, DoWorkEventArgs e)
        {
            const int   nSamples = 10;
            Queue <int> queue    = new Queue <int>();
            int?        meanDesiredBrightness = null;

            while (working)
            {
                if (desiredBrightness == null || desiredBrightness.Value == currentBrightness)
                {
                    continue;
                }
                if (meanDesiredBrightness == null)
                {
                    meanDesiredBrightness = desiredBrightness;
                }

                while (queue.Count < nSamples)
                {
                    queue.Enqueue(desiredBrightness.Value);
                }

                queue.Enqueue(desiredBrightness.Value);

                while (queue.Count > nSamples)
                {
                    queue.TryDequeue(out int _);
                }

                // calcualte the mean of signal to filter fast changes
                int newMeanDesiredBrightness = Enumerable.Sum(queue) / nSamples;

                // filter small changes
                if (Math.Abs(newMeanDesiredBrightness - meanDesiredBrightness.Value) > 3)
                {
                    meanDesiredBrightness = newMeanDesiredBrightness;
                }

                // smooth update of current brightness
                int Delta = (meanDesiredBrightness.Value - currentBrightness) / 3;
                if (Delta == 0)
                {
                    continue;
                }

                currentBrightness += Delta;

                Corrected?.Invoke(currentBrightness);
                Thread.Sleep(50);
            }
        }
Example #2
0
        public override void Update(int value)
        {
            if (Math.Abs(value - currentBrightness) >= 10)
            {
                long now = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

                if (LastUpdated != null && (now - LastUpdated.Value) < 500)                 // value isn't stable for 500ms
                {
                    LastUpdated = now;
                }
                else
                {
                    currentBrightness = value;
                    Corrected?.Invoke(value);
                }
            }
        }