示例#1
0
        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;
            };
        }