示例#1
0
        public override int GetHashCode()
        {
            var hashCode = 505786036;

            hashCode = hashCode * -1521134295 + EqualityComparer <string> .Default.GetHashCode(Key);

            hashCode = hashCode * -1521134295 + EqualityComparer <string> .Default.GetHashCode(Hash);

            hashCode = hashCode * -1521134295 + EqualityComparer <string> .Default.GetHashCode(SongName);

            hashCode = hashCode * -1521134295 + EqualityComparer <string> .Default.GetHashCode(SongSubName);

            hashCode = hashCode * -1521134295 + EqualityComparer <string> .Default.GetHashCode(LevelAuthorName);

            hashCode = hashCode * -1521134295 + EqualityComparer <string> .Default.GetHashCode(SongAuthorName);

            hashCode = hashCode * -1521134295 + EqualityComparer <List <DifficultyStats> > .Default.GetHashCode(Diffs);

            hashCode = hashCode * -1521134295 + Bpm.GetHashCode();
            hashCode = hashCode * -1521134295 + PlayedCount.GetHashCode();
            hashCode = hashCode * -1521134295 + Upvotes.GetHashCode();
            hashCode = hashCode * -1521134295 + Downvotes.GetHashCode();
            hashCode = hashCode * -1521134295 + Heat.GetHashCode();
            hashCode = hashCode * -1521134295 + Rating.GetHashCode();
            return(hashCode);
        }
示例#2
0
 private void CalcBPM()
 {
     updateTimer  = updateRate;
     Bpm          = (int)(uniqBeats.Count / waitingNewTimer * 60 + Bpm) / 2;
     BPMText.text = Bpm.ToString();
     OnBPMUpdate?.Invoke(Bpm, OldBpm);
     OldBpm = Bpm;
 }
示例#3
0
        private void DisplaySmoothed(FileReader.AnalyzedResult result, int smoothFactor)
        {
            Spo2.Clear();
            Bpm.Clear();
            Accel.Clear();

            Spo2.AddRange(SmoothList(result.Spo2List, smoothFactor));
            Bpm.AddRange(SmoothList(result.BpmList, smoothFactor));
            //Spo2.AddRange(result.Spo2List);
            //Bpm.AddRange(result.BpmList);
            Accel.AddRange(result.AccelList);
        }
示例#4
0
        private void UpdateHR(JObject json)
        {
            if (json["payload"] != null && json["payload"]["hr"] != null)
            {
                Bpm.Bpm        = json["payload"]["hr"].ToObject <int>();
                Bpm.ReceivedAt = DateTime.Now.ToString("HH:mm:ss");
            }

            if (_logHr)
            {
                logger.Info(Bpm.ToString());
            }
        }
示例#5
0
        private IEnumerator UpdateHR()
        {
            using (var webRequest = UnityWebRequest.Get(_url))
            {
                // Request and wait for the desired page.
                yield return(webRequest.SendWebRequest());

                if (webRequest.isNetworkError)
                {
                    logger.Error($"Error Requesting HR data: {webRequest.error}");
                    throw new WebException();
                }

                if (_regex.IsMatch(webRequest.downloadHandler.text))
                {
                    Bpm.Bpm        = int.Parse(webRequest.downloadHandler.text);
                    Bpm.ReceivedAt = System.DateTime.Now.ToString("HH:mm:ss");
                }
                else
                {
                    // pulsoid: {"bpm":0,"measured_at":"2021-06-21T01:34:39.320Z"}
                    try
                    {
                        var json = JObject.Parse(webRequest.downloadHandler.text);
                        if (json["bpm"] != null)
                        {
                            Bpm.Bpm = json["bpm"].ToObject <int>();
                        }
                        else
                        {
                            logger.Warn("Json received does not contain necessary field");
                            logger.Warn(webRequest.downloadHandler.text);
                        }

                        Bpm.ReceivedAt = json["measured_at"] != null ? json["measured_at"].ToObject <string>() : Bpm.ReceivedAt = System.DateTime.Now.ToString("HH:mm:ss");
                    }
                    catch (JsonReaderException)
                    {
                        logger.Critical("Invalid json received.");
                        logger.Critical(webRequest.downloadHandler.text);
                    }
                }

                if (_logHr)
                {
                    logger.Info(Bpm.ToString());
                }
            }
        }
示例#6
0
        /// <summary>
        /// 初始化的方法
        /// </summary>
        public void Init()
        {
            if (!ClientZone_Init)
            {
                QueryParam qp = new QueryParam();
                qp.Where.Add(new SearchParam(Playngo_ClientZone_Event._.ModuleId, Bpm.ModuleId, SearchType.Equal));
                if (Playngo_ClientZone_Event.FindCount(qp) == 0)//文章数为0的情况下,才增加默认的文章和分类
                {
                    //初始化分类和文章
                    //Int32 EventID = Playngo_ClientZone_Event.Initialization(Bpm);
                }

                Bpm.UpdateModuleSetting("ClientZone_Init", "true");
            }
        }
示例#7
0
        private void HandleData(string data)
        {
#if DEBUG
            logger.Debug(data);
#endif

            try
            {
                var json = JObject.Parse(data);
                if (json["actionType"]?.ToString() != "OverlayUpdate")
                {
                    return;
                }

                if (json["jsonData"] == null)
                {
                    return;
                }

                var osu = JObject.Parse(json["jsonData"]?.ToString());

#if DEBUG
                logger.Debug(osu.ToString());
#endif

                var hrToken = osu["status"]?["heartRate"]?.Type != JTokenType.Null
                    ? osu["status"]?["heartRate"]
                    : osu["status"]?["calculationMetrics"]?["estHeartRate"];

                var hr = hrToken?.ToObject <int>() ?? 0;

                // Console.WriteLine($"HR {hr}");
                Bpm.Bpm        = hr;
                Bpm.ReceivedAt = DateTimeOffset.Now.ToUnixTimeSeconds().ToString();
                if (_logHr)
                {
                    logger.Info(Bpm.ToString());
                }
            }
            catch (Exception e)
            {
                logger.Warn("Exception occured while parsing hr data");
                logger.Warn(e.Message);
                logger.Debug(e);
            }
        }
示例#8
0
 public override string ToString() =>
 $"\nSetId: {Id}\n" +
 $"RankedStatus: {RankedStatus}\n" +
 $"Artist: {Artist}\n" +
 $"Title: {Title}\n" +
 $"Creator: {Creator}\n" +
 $"Tags: [{Tags.Join(", ")}]\n" +
 $"Modes: [{Mode.Select(s => s.ToString()).Join(", ")}]\n" +
 $"DiffNames: [{DiffName.Join(", ")}]\n" +
 $"Cs: [{Cs.Select(s => s.ToString()).Join(", ")}]\n" +
 $"Ar: [{Ar.Select(s => s.ToString()).Join(", ")}]\n" +
 $"Od: [{Od.Select(s => s.ToString()).Join(", ")}]\n" +
 $"Hp: [{Hp.Select(s => s.ToString()).Join(", ")}]\n" +
 $"DifficultyRating: [{DifficultyRating.Select(s => s.ToString(CultureInfo.InvariantCulture)).Join(", ")}]\n" +
 $"Bpm: [{Bpm.Select(s => s.ToString()).Join(", ")}]\n" +
 $"TotalLength: [{TotalLength.Select(s => s.ToString()).Join(", ")}]\n" +
 $"Genre: {Genre}\n" +
 $"Language: {Language}\n" +
 $"DiffName: [{Mode.Select(s => s.ToString()).Join(", ")}]\n" +
 $"ApprovedDate: {ApprovedDate}";
示例#9
0
 /// <summary>
 /// Parses the BPM change events
 /// </summary>
 private void ParseBpms(string val)
 {
     string[] commaSplit = val.Split(',');
     foreach (string split in commaSplit)
     {
         string[] equalsSplit = split.Split('=');
         if (equalsSplit.Length < 2)
         {
             Warning("Improperly formatted #BPMS value: " + split);
             continue;
         }
         float beat   = this.ParseFloat("BPM change beat", equalsSplit[0], false);
         float bpmVal = this.ParseFloat("BPM change bpm", equalsSplit[1], false);
         if (beat != -1f && bpmVal != -1f)
         {
             Bpm bpm = new Bpm();
             bpm.beat = beat;
             bpm.bpm  = bpmVal;
             _bpms.Add(bpm);
         }
     }
 }
示例#10
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Agilite"/> class.
        /// </summary>
        /// <param name="baseConfig">The base configuration.</param>
        /// <exception cref="ArgumentNullException">ApiKey</exception>
        public Agilite(AgiliteConfig baseConfig)
        {
            if (string.IsNullOrEmpty(baseConfig.ApiKey))
            {
                throw new ArgumentNullException(nameof(baseConfig.ApiKey));
            }

            Keywords = new Keywords(new AgiliteRequestConfig {
                AgiliteConfig = baseConfig
            });
            Numbering = new Numbering(new AgiliteRequestConfig {
                AgiliteConfig = baseConfig
            });
            Connectors = new Connectors(new AgiliteRequestConfig {
                AgiliteConfig = baseConfig
            });
            DataMapping = new DataMapping(new AgiliteRequestConfig {
                AgiliteConfig = baseConfig
            });
            Bpm = new Bpm(new AgiliteRequestConfig {
                AgiliteConfig = baseConfig
            });
            Roles = new Roles(new AgiliteRequestConfig {
                AgiliteConfig = baseConfig
            });
            Templates = new Templates(new AgiliteRequestConfig {
                AgiliteConfig = baseConfig
            });
            Utils = new Utils(new AgiliteRequestConfig {
                AgiliteConfig = baseConfig
            });
            Files = new Files(new AgiliteRequestConfig {
                AgiliteConfig = baseConfig
            });
            TierStructures = new TierStructures(new AgiliteRequestConfig {
                AgiliteConfig = baseConfig
            });
        }
示例#11
0
        /// <summary>
        ///     Updates the text of the metadata with a new map/mods
        ///     Realigns it so it's in the middle.
        /// </summary>
        /// <param name="map"></param>
        public void UpdateAndAlignMetadata(Map map)
        {
            Mode.UpdateValue(ModeHelper.ToShortHand(map.Mode));
            Bpm.UpdateValue(((int)(map.Bpm * ModHelper.GetRateFromMods(ModManager.Mods))).ToString(CultureInfo.InvariantCulture));
            Length.UpdateValue(TimeSpan.FromMilliseconds(map.SongLength / ModHelper.GetRateFromMods(ModManager.Mods)).ToString(@"mm\:ss"));
            Difficulty.UpdateValue(StringHelper.AccuracyToString((float)map.DifficultyFromMods(ModManager.Mods)).Replace("%", ""));

            for (var i = 0; i < Items.Count; i++)
            {
                var metadata = Items[i];

                if (i == 0)
                {
                    metadata.X = 5;
                    continue;
                }

                var previous = Items[i - 1];
                metadata.X = previous.X + previous.Width + 5 + 5;
            }

            Items.ForEach(x => x.X += (Banner.Width - Items.Last().X) / Items.Count / 2);
        }
        private Track getSuggestedTrack()
        {
            Bpm bpm = new Bpm(null);
            Year year = new Year(null);
            Ending ending = new Ending(Ending.Attribute.None);

            int temp;
            if(!String.IsNullOrEmpty(tbBpm.Text) && int.TryParse(tbBpm.Text, out temp))
                bpm.Value = temp;
            if(!String.IsNullOrEmpty(tbYear.Text) && int.TryParse(tbYear.Text, out temp))
                year.Value = temp;
            if(!String.IsNullOrEmpty(tbEnding.Text))
                if(new List<string>(Enum.GetNames(typeof(Ending.Attribute))).Contains(tbEnding.Text))
                    ending.Value = (Ending.Attribute)Enum.Parse(typeof(Ending.Attribute), tbEnding.Text);

            Track track = new Track(
                new Autor(String.IsNullOrEmpty(tbAutor.Text) ? " " : tbAutor.Text),
                bpm,
                new Code(String.IsNullOrEmpty(tbCode.Text) ? " " : tbCode.Text),
                new Interpret(String.IsNullOrEmpty(tbInterpret.Text) ? " " : tbInterpret.Text),
                new Label(String.IsNullOrEmpty(tbLabel.Text) ? " " : tbLabel.Text),
                new Laenge(String.IsNullOrEmpty(tbLaenge.Text) ? " " : tbLaenge.Text),
                new Titel(String.IsNullOrEmpty(tbTitel.Text) ? " " : tbTitel.Text),
                new Verlag(String.IsNullOrEmpty(tbVerlag.Text) ? " " : tbVerlag.Text),
                year,
                ending);

            return track;
        }
示例#13
0
 public Measure(Bpm bpm)
 {
     Time   = bpm.Time;
     Number = bpm.Measure;
 }
        /// <summary>
        ///     输出为BangCraft谱面工程格式
        /// </summary>
        /// <returns></returns>
        private string ToBangCraftScore()
        {
            var xml  = new XmlDocument();
            var Save = xml.CreateElement("Save");

            Save.SetAttribute("name", "BGCdate");
            xml.AppendChild(Save);

            var info = xml.CreateElement("info");

            Save.AppendChild(info);

            var music = xml.CreateElement("music");

            music.InnerText = "test";
            info.AppendChild(music);

            var bpm = xml.CreateElement("bpm");

            bpm.InnerText = Bpm.ToString();
            info.AppendChild(bpm);

            var delay = xml.CreateElement("delay");

            delay.InnerText = Delay_ms.ToString();
            info.AppendChild(delay);

            var bpmP1 = xml.CreateElement("bpmP1");

            bpmP1.InnerText = "";
            info.AppendChild(bpmP1);

            var bpmD1 = xml.CreateElement("bpmD1");

            bpmD1.InnerText = "0";
            info.AppendChild(bpmD1);

            var bpmP2 = xml.CreateElement("bpmP2");

            bpmP2.InnerText = "";
            info.AppendChild(bpmP2);

            var bpmD2 = xml.CreateElement("bpmD2");

            bpmD2.InnerText = "0";
            info.AppendChild(bpmD2);

            var bpmP3 = xml.CreateElement("bpmP3");

            bpmP3.InnerText = "";
            info.AppendChild(bpmP3);

            var bpmD3 = xml.CreateElement("bpmD3");

            bpmD3.InnerText = "0";
            info.AppendChild(bpmD3);

            foreach (var note in Notes)
            {
                //N
                if (note.NoteType == NoteType.白键 || note.NoteType == NoteType.技能)
                {
                    var noteN = xml.CreateElement("noteN");
                    Save.AppendChild(noteN);

                    var lineN = xml.CreateElement("lineN");
                    lineN.InnerText = (note.Track - 4).ToString();
                    noteN.AppendChild(lineN);

                    var posN = xml.CreateElement("posN");
                    posN.InnerText = (note.Time * 2).ToString();
                    noteN.AppendChild(posN);

                    var typeN = xml.CreateElement("typeN");
                    typeN.InnerText = "N";
                    noteN.AppendChild(typeN);
                }
            }

            foreach (var note in Notes)
            {
                //F
                if (note.NoteType == NoteType.粉键)
                {
                    var noteF = xml.CreateElement("noteF");
                    Save.AppendChild(noteF);

                    var lineF = xml.CreateElement("lineF");
                    lineF.InnerText = (note.Track - 4).ToString();
                    noteF.AppendChild(lineF);

                    var posF = xml.CreateElement("posF");
                    posF.InnerText = (note.Time * 2).ToString();
                    noteF.AppendChild(posF);

                    var typeF = xml.CreateElement("typeF");
                    typeF.InnerText = "F";
                    noteF.AppendChild(typeF);
                }
            }

            var index = 0;

            foreach (var note in Notes)
            {
                //LS
                if (note.NoteType == NoteType.滑条a_开始)
                {
                    var noteL = xml.CreateElement("noteL");
                    Save.AppendChild(noteL);

                    var lineL = xml.CreateElement("lineL");
                    lineL.InnerText = (note.Track - 4).ToString();
                    noteL.AppendChild(lineL);

                    var posL = xml.CreateElement("posL");
                    posL.InnerText = (note.Time * 2).ToString();
                    noteL.AppendChild(posL);

                    var typeL = xml.CreateElement("typeL");
                    typeL.InnerText = "LS";
                    noteL.AppendChild(typeL);

                    var startlineL = xml.CreateElement("startlineL");
                    startlineL.InnerText = (note.Track - 4).ToString();
                    noteL.AppendChild(startlineL);

                    var startposL = xml.CreateElement("startposL");
                    startposL.InnerText = (note.Time * 2).ToString();
                    noteL.AppendChild(startposL);

                    for (var i = index + 1; i < Notes.Count; i++)
                    {
                        if (Notes[i].NoteType == NoteType.滑条a_中间 && Notes[i].Time != note.Time)
                        {
                            var noteM = xml.CreateElement("noteL");
                            Save.AppendChild(noteM);

                            var lineM = xml.CreateElement("lineL");
                            lineM.InnerText = (Notes[i].Track - 4).ToString();
                            noteM.AppendChild(lineM);

                            var posM = xml.CreateElement("posL");
                            posM.InnerText = (Notes[i].Time * 2).ToString();
                            noteM.AppendChild(posM);

                            var typeM = xml.CreateElement("typeL");
                            typeM.InnerText = "LM";
                            noteM.AppendChild(typeM);

                            noteM.AppendChild(startlineL.Clone());

                            noteM.AppendChild(startposL.Clone());
                            continue;
                        }

                        if ((Notes[i].NoteType == NoteType.滑条a_结束 ||
                             Notes[i].NoteType == NoteType.滑条a_粉键结束) && Notes[i].Time != note.Time)
                        {
                            var noteE = xml.CreateElement("noteL");
                            Save.AppendChild(noteE);

                            var lineE = xml.CreateElement("lineL");
                            lineE.InnerText = (Notes[i].Track - 4).ToString();
                            noteE.AppendChild(lineE);

                            var posE = xml.CreateElement("posL");
                            posE.InnerText = (Notes[i].Time * 2).ToString();
                            noteE.AppendChild(posE);

                            var typeE = xml.CreateElement("typeL");
                            typeE.InnerText = Notes[i].NoteType == NoteType.滑条a_结束 ? "LE" : "LF";
                            noteE.AppendChild(typeE);

                            noteE.AppendChild(startlineL.Clone());

                            noteE.AppendChild(startposL.Clone());
                            break;
                        }
                    }
                }

                if (note.NoteType == NoteType.滑条b_开始)
                {
                    var noteL = xml.CreateElement("noteL");
                    Save.AppendChild(noteL);

                    var lineL = xml.CreateElement("lineL");
                    lineL.InnerText = (note.Track - 4).ToString();
                    noteL.AppendChild(lineL);

                    var posL = xml.CreateElement("posL");
                    posL.InnerText = (note.Time * 2).ToString();
                    noteL.AppendChild(posL);

                    var typeL = xml.CreateElement("typeL");
                    typeL.InnerText = "LS";
                    noteL.AppendChild(typeL);

                    var startlineL = xml.CreateElement("startlineL");
                    startlineL.InnerText = (note.Track - 4).ToString();
                    noteL.AppendChild(startlineL);

                    var startposL = xml.CreateElement("startposL");
                    startposL.InnerText = (note.Time * 2).ToString();
                    noteL.AppendChild(startposL);

                    for (var i = index + 1; i < Notes.Count; i++)
                    {
                        if (Notes[i].NoteType == NoteType.滑条b_中间 && Notes[i].Time != note.Time)
                        {
                            var noteM = xml.CreateElement("noteL");
                            Save.AppendChild(noteM);

                            var lineM = xml.CreateElement("lineL");
                            lineM.InnerText = (Notes[i].Track - 4).ToString();
                            noteM.AppendChild(lineM);

                            var posM = xml.CreateElement("posL");
                            posM.InnerText = (Notes[i].Time * 2).ToString();
                            noteM.AppendChild(posM);

                            var typeM = xml.CreateElement("typeL");
                            typeM.InnerText = "LM";
                            noteM.AppendChild(typeM);

                            noteM.AppendChild(startlineL.Clone());

                            noteM.AppendChild(startposL.Clone());
                            continue;
                        }

                        if ((Notes[i].NoteType == NoteType.滑条b_结束 ||
                             Notes[i].NoteType == NoteType.滑条b_粉键结束) && Notes[i].Time != note.Time)
                        {
                            var noteE = xml.CreateElement("noteL");
                            Save.AppendChild(noteE);

                            var lineE = xml.CreateElement("lineL");
                            lineE.InnerText = (Notes[i].Track - 4).ToString();
                            noteE.AppendChild(lineE);

                            var posE = xml.CreateElement("posL");
                            posE.InnerText = (Notes[i].Time * 2).ToString();
                            noteE.AppendChild(posE);

                            var typeE = xml.CreateElement("typeL");
                            typeE.InnerText = Notes[i].NoteType == NoteType.滑条b_结束 ? "LE" : "LF";
                            noteE.AppendChild(typeE);

                            noteE.AppendChild(startlineL.Clone());

                            noteE.AppendChild(startposL.Clone());
                            break;
                        }
                    }
                }

                if (note.NoteType == NoteType.长键_开始)
                {
                    var noteL = xml.CreateElement("noteL");
                    Save.AppendChild(noteL);

                    var lineL = xml.CreateElement("lineL");
                    lineL.InnerText = (note.Track - 4).ToString();
                    noteL.AppendChild(lineL);

                    var posL = xml.CreateElement("posL");
                    posL.InnerText = (note.Time * 2).ToString();
                    noteL.AppendChild(posL);

                    var typeL = xml.CreateElement("typeL");
                    typeL.InnerText = "LS";
                    noteL.AppendChild(typeL);

                    var startlineL = xml.CreateElement("startlineL");
                    startlineL.InnerText = (note.Track - 4).ToString();
                    noteL.AppendChild(startlineL);

                    var startposL = xml.CreateElement("startposL");
                    startposL.InnerText = (note.Time * 2).ToString();
                    noteL.AppendChild(startposL);

                    for (var i = index + 1; i < Notes.Count; i++)
                    {
                        if ((Notes[i].NoteType == NoteType.长键_结束 ||
                             Notes[i].NoteType == NoteType.长键_粉键结束) && Notes[i].Time != note.Time &&
                            Notes[i].Track == note.Track)
                        {
                            var noteE = xml.CreateElement("noteL");
                            Save.AppendChild(noteE);

                            var lineE = xml.CreateElement("lineL");
                            lineE.InnerText = (Notes[i].Track - 4).ToString();
                            noteE.AppendChild(lineE);

                            var posE = xml.CreateElement("posL");
                            posE.InnerText = (Notes[i].Time * 2).ToString();
                            noteE.AppendChild(posE);

                            var typeE = xml.CreateElement("typeL");
                            typeE.InnerText = Notes[i].NoteType == NoteType.长键_结束 ? "LE" : "LF";
                            noteE.AppendChild(typeE);

                            noteE.AppendChild(startlineL.Clone());

                            noteE.AppendChild(startposL.Clone());
                            break;
                        }
                    }
                }

                index++;
            }

            var result = Helper.ConvertXmlDocumentTostring(xml);

            return(result);
        }
示例#15
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;
            };
        }