Пример #1
0
 public Analyse(BlockingCollection <DtoBpRaw> dataQueue2, BlockingCollection <Dto_AnalysisBP> dataQueue3)
 {
     _dataQueue2     = dataQueue2;
     _dataQueue3     = dataQueue3;
     OneSecondOfData = new DtoMeassuredDataFs();
     PulseAnalysis   = new PulseAnalysis(StaticVariables);
     mapCalculater   = new MapCalculator5Periods();
 }
        public void GetPulse_addSignalWithPuls90AndMAP100_returnpuls90()
        {
            int pulse;
            DtoMeassuredDataFs dtoMeassured1 = new DtoMeassuredDataFs();

            dtoMeassured1.MeassureDoubles.AddRange(sinusValue(90, 100));
            pulse = uut.GetPulse(dtoMeassured1, 100);

            Assert.That(pulse, Is.EqualTo(90));
        }
Пример #3
0
        public void GetAarm_addNotFallingMeassurement_returnFalse()
        {
            bool isAlarmOn = false;
            DtoMeassuredDataFs dtoMeassured1 = new DtoMeassuredDataFs();

            dtoMeassured1.MeassureDoubles.AddRange(sinusValue(0, 186));
            isAlarmOn = uut.GetAlarm(dtoMeassured1, 95);

            double fallingMeassurement = 100 - staticVariables.PersentageFall;

            Assert.That(isAlarmOn, Is.False);
        }
Пример #4
0
        public void calculateMAP_addXandY_returnXplusYtimes0point5(double x, double y)
        {
            double             map;
            double             expectedMap   = (x + y) * 0.5;
            DtoMeassuredDataFs dtoMeassured1 = new DtoMeassuredDataFs();

            dtoMeassured1.MeassureDoubles.AddRange(meangenerator(x, y));
            map = uut.calculateMAP(dtoMeassured1);



            Assert.That(map, Is.EqualTo(expectedMap));
        }
        public void GetSysAndDiastolic_addMeassurementWithThreePeriods_return10OverMinus10()
        {
            double             systolic      = 0;
            double             diastolic     = 0;
            double             map           = 0;
            DtoMeassuredDataFs dtoMeassured1 = new DtoMeassuredDataFs();

            dtoMeassured1.MeassureDoubles.AddRange(ThreePeriods(10));
            uut.GetSysAndDiastolic(dtoMeassured1, map);

            systolic  = uut.Systolic;
            diastolic = uut.Diastolic;

            Assert.That(systolic, Is.EqualTo(10));
            Assert.That(diastolic, Is.EqualTo(-10));
        }
Пример #6
0
        public double calculateMAP(DtoMeassuredDataFs meassuredDataFs)
        {
            MAP = 0;

            //Tilføjer den nyeste måling til old5meassurements
            if (old5meassurements.Count >= meassuredDataFs.MeassureDoubles.Count * 5)
            {
                old5meassurements.RemoveRange(0, meassuredDataFs.MeassureDoubles.Count - 1);
            }
            old5meassurements.AddRange(meassuredDataFs.MeassureDoubles);

            //Bestem MAB ud fra hvad jeg har i listen
            foreach (double bloodpreassure in old5meassurements)
            {
                MAP += bloodpreassure;
            }

            MAP = MAP / old5meassurements.Count;

            return(MAP);
        }
        /*
         * Denne klasse skal beregne pulsen. Jeg vil gerne have data for 10 sekunder at regne på. Derfor skal jeg gemme 10 DTOMeasseredDataFS, og ud fra dette beregne pulsen
         * For at detektere pulsen har jeg brug for at lave digital hysterese, men på tal hvor jeg ikke kender mit normale max..
         * Måske kan man bestemme MAP og ud fra dette sige, at når vi måler 10 mmHG over dette, så må der være en puls, og først når vi er kommet 10 mmHG
         * under MAP kan vi registrere ny puls?
         *
         */

        public int GetPulse(DtoMeassuredDataFs meassuredData, double map)
        {
            MAP = map;
            bool canRegisterPulse = true;

            puls           = 0;
            hysteresisLow  = MAP - 5;
            hysteresisHigh = MAP + 5;
            index.Clear();

            //Opdaterer MeassurementList
            if (MeassurementsList.Count >= StaticVariables.SampleFrequense * 10)
            {
                MeassurementsList.RemoveRange(0, 120);
            }
            MeassurementsList.AddRange(meassuredData.MeassureDoubles);

            //Finder antal puls - algoritme
            //Det nye er, at jeg gemmer indexet hvor der gemmes højt, og så deler trækker jeg første index fra sidste og

            for (int i = 0; i < MeassurementsList.Count - 1; i++)
            {
                if (MeassurementsList[i] >= hysteresisHigh && canRegisterPulse == true)
                {
                    canRegisterPulse = false;
                    index.Add(i);
                }
                else if (MeassurementsList[i] <= hysteresisLow)
                {
                    canRegisterPulse = true;
                }
            }

            //Omregner fra de registrerede pulse, til antal pulse pr minut
            double tiden = (index[index.Count - 1] - index[0]) * ts;

            puls = Convert.ToInt32(((index.Count - 1) / tiden) * 60);
            return(puls);
        }
        public void GetSysAndDiastolic(DtoMeassuredDataFs meassuredData, double map)
        {
            mAP            = map;
            hysteresisLow  = mAP - 5;
            hysteresisHigh = mAP + 5;
            Diastolic      = mAP;
            Systolic       = mAP;


            //Opdaterer MeassurementList.
            //Bruger 3 for at være sikker på, at sekvensen indeholder både en systolisk værdi og en diastolisk værdi
            if (MeassurementsList.Count >= StaticVariables.SampleFrequense * 3)
            {
                MeassurementsList.RemoveRange(0, meassuredData.MeassureDoubles.Count - 1);
            }
            MeassurementsList.AddRange(meassuredData.MeassureDoubles);

            //Finder diastolisk og systolisk værdier - algoritme
            for (int i = 0; i < MeassurementsList.Count; i++)
            {
                if (MeassurementsList[i] < Diastolic)
                {
                    Diastolic       = MeassurementsList[i];
                    diastolicIndex  = i;
                    canAddDiastolic = true;
                }

                else if (MeassurementsList[i] > hysteresisHigh && canAddDiastolic == true)
                {
                    diastolicValues.Add(Diastolic);
                    canAddDiastolic = false;
                    Diastolic       = mAP;
                }

                else if (MeassurementsList[i] > Systolic)
                {
                    Systolic       = MeassurementsList[i];
                    systolicIndex  = i;
                    canAddSystolic = true;
                }

                else if (MeassurementsList[i] < hysteresisLow && canAddSystolic == true)
                {
                    systolicValues.Add(Systolic);
                    Systolic       = mAP;
                    canAddSystolic = false;
                }
            }

            if (MeassurementsList.Count >= systolicIndex + 3 && MeassurementsList.Count >= diastolicIndex + 3)
            {
                //Tjekker om jeg er har at gøre med en diastolisk værdi, men ikke er kommet over min øvre hysteresegrænse endnu
                if (Diastolic != diastolicValues.Last() && Diastolic < MeassurementsList[diastolicIndex + 3])
                {
                    diastolicValues.Add(Diastolic);
                }

                if (Systolic != systolicValues.Last() && Systolic > MeassurementsList[systolicIndex + 3])
                {
                    systolicValues.Add(Systolic);
                }
            }


            // tager den sidste værdi og gemmer denne.
            Systolic  = systolicValues.Last();
            Diastolic = diastolicValues.Last();

            // Tømmer listetn
            systolicValues.Clear();
            diastolicValues.Clear();
        }
        // Tilføjer et sekunds måledata til min lange liste.
        public bool GetAlarm(DtoMeassuredDataFs _meassuredData, double _map)
        {
            MAP = _map;
            //Sørger for at der kun gemmes 3 målinger/3 sekunder ad gangen. Jeg kopierer dem over i en liste med målinger:
            if (LastSavedMeassurements.Count >= _meassuredData.MeassureDoubles.Count * alarmperiod)
            {
                LastSavedMeassurements.RemoveRange(0, _meassuredData.MeassureDoubles.Count - 1);
            }

            LastSavedMeassurements.AddRange(_meassuredData.MeassureDoubles);


            hysteresisHigh = MAP + hysteresisSpring;
            hysteresisLow  = MAP - hysteresisSpring;

            List <int> index = new List <int>();

            //Her bestemmes ved hvilke index vi registrerer høj
            for (int i = 0; i < LastSavedMeassurements.Count; i++)
            {
                if (LastSavedMeassurements[i] >= hysteresisHigh && isOverHys == false)
                {
                    index.Add(i);
                    isOverHys = true;
                }

                else if (LastSavedMeassurements[i] <= hysteresisLow && isOverHys == true)
                {
                    isOverHys = false;
                }
            }

            MAP = 0;
            //Beregner nu MAP for de nyeste målinger
            double forHowlong = index[index.Count - 1];
            int    counter    = 1;

            if (index.Count > 1)
            {
                for (int i = index[0]; i <= index[index.Count - 1]; i++)
                {
                    MAP += LastSavedMeassurements[i];
                    if (i == index[counter])
                    {
                        MAP = MAP / (index[counter] - index[counter - 1]);
                        if (oldMAP.Count >= alarmperiod)
                        {
                            oldMAP.RemoveAt(0);
                        }
                        oldMAP.Add(MAP);
                        MAP = 0;
                        counter++;
                    }
                }
            }

            LastSavedMeassurements.RemoveRange(0, index[index.Count - 1]);
            if (LastSavedMeassurements[0] > hysteresisHigh)
            {
                isOverHys = true;
            }

            isFall = false;

            if (oldMAP.Count > 1)
            {
                oldMap = oldMAP[0];
            }

            foreach (double map in oldMAP)
            {
                if (map <= oldMap * persentage)
                {
                    isFall = true;
                }

                else
                {
                    isFall = false;
                }

                oldMap = map;
            }

            return(isFall);
        }