private void MainWindow_Loaded(object sender, RoutedEventArgs e) { _reader = new DeviceReader(); _reader.Start("COM3", 9600, BatchSize); _reader.OnLineRead += (r, ir, g, m, dt) => { if (ChartValuesIR.Count > BatchSize) { ChartValuesIR.RemoveAt(0); ChartValuesRed.RemoveAt(0); ChartValuesHeart.RemoveAt(0); } ChartValuesRed.Add(new MeasureModel { Time = dt, Value = r, //r.Next(-8, 10) }); ChartValuesIR.Add(new MeasureModel { Time = dt, Value = ir, //r.Next(-8, 10) }); ChartValuesHeart.Add(new MeasureModel { Time = dt, Value = g, }); Bpm.Add(new MeasureModel { Value = m, Time = dt, }); if (Bpm.Count > 500) { Bpm.RemoveAt(0); } SetAxisLimits(dt); }; _reader.OnEveryLine += (r, ir, g, m, t) => { }; _reader.OnBatchCompleted += (r, ir, g, m) => { //SignalProcessor.Mean(ref r, ref ir); //SignalProcessor.LineLeveling(ref ir, ref r); SignalProcessor.Mean(ref g); SignalProcessor.LineLeveling(ref g); List <MeasureModel> smoothed = null; double myBpm = SignalProcessor.ComputeBpm(g, out smoothed); double spo2 = 0, bpm = 0, xyRatio = 0; if (Interop.Compute(ir.Select(n => n.Value).ToArray(), r.Select(n => n.Value).ToArray(), ref spo2, ref bpm, ref xyRatio) && myBpm > 0) { Dispatcher.Invoke(() => { SpO2Label.Content = $"SPO2: {(int)Math.Round(spo2)}, BPM: {(int)Math.Round(myBpm)}, Ratio: {xyRatio}"; }); //Spo2.Add(new MeasureModel //{ // Value = spo2, // Time = m.Last().Time, //}); //Bpm.Add(new MeasureModel //{ // Value = myBpm, // Time = r.Last().Time, //}); if (Spo2.Count > 2000) { Spo2.RemoveAt(0); Bpm.RemoveAt(0); } } return; }; }