Пример #1
0
        /// <summary>
        ///   Start the endurance test.
        /// </summary>
        /// <returns>Returns the test results.</returns>
        public async Task <JObject> StartAsync()
        {
            int?testPower = null, ssHR = null;

            try
            {
                var results = await Task.Run(() =>
                {
                    _ergometer.Reset();
                    Thread.Sleep(1000);
                    _hRs         = new List <int>();
                    CurrentState = TestState.Warmup;
                    _listener.OnStateChanged(CurrentState.ToString(), 120000);
                    _ergometer.RequestedPower = 50;

                    var stateTimer      = new Timer();
                    stateTimer.Elapsed += ChangeState;
                    stateTimer.Interval = 120000;
                    stateTimer.Start();

                    double[] prevValue = _ageValues[0];
                    foreach (double[] values in _ageValues)
                    {
                        if (values[0] > _patient.Age)
                        {
                            _values = prevValue;
                        }
                        prevValue = values;
                    }

                    if (_values == null)
                    {
                        _values = _ageValues[_ageValues.Length - 1];
                    }

                    int[] hRs             = new int[8];
                    var pretestTimer      = new Timer();
                    pretestTimer.Interval = 15000;
                    pretestTimer.Elapsed += WarmupTimerElapsed;

                    var testTimer      = new Timer();
                    testTimer.Interval = 15000;
                    testTimer.Elapsed += EndTestTimerElapsed;

                    var cooldownTimer      = new Timer();
                    cooldownTimer.Interval = 5000;
                    cooldownTimer.Elapsed += CooldownTimerElapsed;

                    int power = 0;

                    var test     = false;
                    var endtest  = false;
                    var cooldown = false;
                    while (CurrentState != TestState.No)
                    {
                        {
                            if (_exceptionInTimer != null)
                            {
                                throw _exceptionInTimer;
                            }
                            {
                            }
                            switch (CurrentState)
                            {
                            case TestState.Warmup:
                                break;

                            case TestState.Test:
                                if (!test)
                                {
                                    _listener.OnStateChanged(CurrentState.ToString(), 240000);
                                    pretestTimer.Start();
                                    power = _ergometer.RequestedPower;
                                    test  = true;
                                }
                                break;

                            case TestState.EndTest:
                                if (!endtest)
                                {
                                    pretestTimer.Stop();
                                    testTimer.Start();
                                    endtest = true;
                                }
                                break;

                            case TestState.Cooldown:
                                if (!cooldown)
                                {
                                    _listener.OnStateChanged(CurrentState.ToString(), 60000);
                                    stateTimer.Interval = 60000;
                                    testTimer.Stop();
                                    cooldownTimer.Start();
                                    cooldown = true;
                                }
                                break;
                            }
                        }
                    }
                    cooldownTimer.Stop();
                    stateTimer.Stop();
                    _ergometer.Close();

                    return(Tuple.Create(Convert.ToInt32(_hRs.Average()), power));
                });

                testPower = results.Item2;
                ssHR      = results.Item1;
            }
            catch (MaxHRReachedException)
            {
                new Thread(() => MessageBox.Show("Maximum heartrate exceeded!", "Test failed.")).Start();
            }
            catch (MinHRNotReachedException)
            {
                new Thread(() => MessageBox.Show("Heartrate did not reach 130 BPM", "Test failed.")).Start();
            }
            catch (SteadyStateUnreachableException)
            {
                new Thread(() => MessageBox.Show("Heartrate too irregular.", "Test failed.")).Start();
            }
            var    ergometerLog = _ergometer.Log;
            double?vO2MaxAbs    = null;
            double?vO2MaxRel    = null;

            if (testPower != null && ssHR != null)
            {
                vO2MaxAbs = Nomogram.CalcVO2MaxAbsolute(_patient, (int)testPower, (int)ssHR);
                vO2MaxRel = Nomogram.CalcVO2MaxRelative(_patient, (double)vO2MaxAbs);
            }
            return(new JObject
            {
                {
                    "EnduranceTest", new JObject
                    {
                        {
                            "Patient", new JObject
                            {
                                { "FirstName", _patient.FirstName },
                                { "LastName", _patient.LastName },
                                { "BirthDate", _patient.Birthdate.ToString("dd-MM-yyyy") },
                                { "Mass", _patient.Mass }
                            }
                        },
                        {
                            "TestResults", new JObject
                            {
                                { "VO2MaxAbsolute", vO2MaxAbs },
                                { "VO2MaxRelative", vO2MaxRel },
                                { "Power", testPower },
                                { "HR", ssHR }
                            }
                        },
                        {
                            "ErgometerLog", ergometerLog
                        }
                    }
                }
            });
        }