public Task Fade(IObserver<Color> deviceObserver, Color start, Color end, int durationMs, ITransformer transformer = null)
{
var taskSource = new TaskCompletionSource<bool>();
if (start == end)
{
taskSource.SetResult(true);
return taskSource.Task;
}
var startHSV = new HSV(start);
var endHSV = new HSV(end);
if (startHSV.Value == 0)
startHSV = new HSV(endHSV.Hue, endHSV.Saturation, 0);
var observer = Observer.Create<double>(
onNext: pos =>
{
if (transformer != null)
pos = transformer.Transform(pos);
double hue = startHSV.Hue + (endHSV.Hue - startHSV.Hue) * pos;
double sat = startHSV.Saturation + (endHSV.Saturation - startHSV.Saturation) * pos;
double val = startHSV.Value + (endHSV.Value - startHSV.Value) * pos;
Color newColor = HSV.ColorFromHSV(hue, sat, val);
deviceObserver.OnNext(newColor);
},
onCompleted: () =>
{
deviceObserver.OnCompleted();
taskSource.SetResult(true);
});
var cancelSource = this.timerJobRunner.AddTimerJobPos(observer, durationMs);
Executor.Current.SetManagedTask(taskSource.Task, cancelSource);
return taskSource.Task;
}