/// <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 } } } }); }