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