ShockTestMode instantiateTestMode(AxisShockTestMode testMode) { return(new ShockTestMode(testMode, PulseDurationVM.SelectedPulseDuration)); }
async Task testAsync(AxisShockTestMode mode, double pulseDuration, IProgress <double> progress, CancellationToken cancellation) { savePulseDuration(); var extrema = await aquireExtremaPoint(); var avg = extrema.Average(); switch (mode) { case AxisShockTestMode.X: _axisShockTestResults.XMaxRaw = avg; break; case AxisShockTestMode.Y: _axisShockTestResults.YMaxRaw = avg; break; case AxisShockTestMode.Z: _axisShockTestResults.ZMaxRaw = avg; break; default: throw new NotSupportedException(); } return; ////////////////////////////////////////////////////////////////// void savePulseDuration() { if (_axisShockTestResults.PulseDurationCode != pulseDuration) { _axisShockTestResults.PulseDurationCode = getDurationCode(); _axisShockTestResults.XMaxRaw = null; _axisShockTestResults.YMaxRaw = null; _axisShockTestResults.ZMaxRaw = null; int getDurationCode() { switch (pulseDuration) { case 2D: return(2); case 1D: return(1); case 0.5D: return(0); case 0.25D: return(-1); default: throw new NotSupportedException("Некорректная длительность импульса"); } } } } async Task <double[]> aquireExtremaPoint() { double peakDuration = PULSE_DURATION_TO_PEAK_WIDTH_COEFFICIENT * pulseDuration; var probability = 0D; // Probability of all points acquired var points = new List <(double DTime, double Point)>(); while (probability < 1) { var point = await fetchPoint(); var dTime = _entitiesSource.Current.Result.DTime; points.Add((dTime, point)); // Probability that this points are measured on impulse's peak / num of measurments required probability += (peakDuration / dTime) * (dTime / MIN_PULSE_PERIOD) / NUM_OF_EXTREMA; progress.Report(probability); cancellation.ThrowIfCancellationRequested(); } return(points .Select(p => p.Point) .Max(NUM_OF_EXTREMA) .ToArray()); async Task <double> fetchPoint() { var measureResult = await fetchPoints(); switch (mode) { case AxisShockTestMode.X: return(measureResult.X); case AxisShockTestMode.Y: return(measureResult.Y); case AxisShockTestMode.Z: return(measureResult.Z); default: throw new NotSupportedException(); } } } }
public ShockTestMode(AxisShockTestMode mode, double pulseDuration) { _mode = mode; _pulseDuration = pulseDuration; TestType = TestType.AXIS_SHOCK; }