private void SendPattern(object sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { case nameof(Settings.Model.PatternId): var value = Settings.Model.PatternId; Enqueue(Message.SetPattern(value)); if (value == -2) //manual control { Enqueue(Message.SetRed(Settings.Model.Red)); Enqueue(Message.SetGreen(Settings.Model.Green)); Enqueue(Message.SetBlue(Settings.Model.Blue)); Enqueue(Message.SetBright(Settings.Model.Brightness)); } break; case nameof(Settings.Model.HorizontalLEDs): case nameof(Settings.Model.VerticalLEDs): Enqueue(Message.SetLedNumber(Settings.Model.TotalLeds)); break; case nameof(Settings.Model.Brightness): Enqueue(Message.SetBright(Settings.Model.Brightness)); break; case nameof(Settings.Model.Red): Enqueue(Message.SetRed(Settings.Model.Red)); break; case nameof(Settings.Model.Green): Enqueue(Message.SetGreen(Settings.Model.Green)); break; case nameof(Settings.Model.Blue): Enqueue(Message.SetBlue(Settings.Model.Blue)); break; case nameof(Settings.Model.Mirror): Enqueue(Settings.Model.Mirror? Message.StreamStart() : Message.StreamEnd()); break; } }
internal static void Run(object obj) { Thread.CurrentThread.Name = "DXGI Capture"; var token = (CancellationToken)obj; int i, ix; byte[] points, color; HardwareScreenCapture <T> instance = null; while (!token.IsCancellationRequested) { try { if (instance == null) { instance = new HardwareScreenCapture <T>(); instance.Initialize(); SerialCom.Enqueue(Message.StreamStart()); //first call or two returns an empty (black) screen //consume here during init instance.CaptureFrameGPU(); } if (instance.CaptureFrameGPU()) { #if DOT_TIMER var sw = new Stopwatch(); sw.Start(); #endif instance.TransferFrameCPU(); #if PARALLEL Parallel.ForEach(instance.ledPoints, x => x.Calculate()); #else for (i = 0; i < instance.ledPoints.Length; i++) { instance.ledPoints[i].Calculate(); } #endif points = new byte[instance.ledPoints.Length * 3]; for (i = 0, ix = 0; i < instance.ledPoints.Length; ++i, ix = i * 3) { color = instance.ledPoints[i].mean; points[ix] = color[0]; points[ix + 1] = color[1]; points[ix + 2] = color[2]; } if (token.IsCancellationRequested) { break; } SerialCom.Enqueue(new Message.Command() { Type = Message.Type.Stream, Raw = points }); #if DOT_TIMER Console.WriteLine(sw.Elapsed.TotalMilliseconds); #endif instance.Render(points); } } catch (Exception) { instance?.Dispose(); instance = null; } } instance?.Dispose(); }