Beispiel #1
0
 ShockTestMode instantiateTestMode(AxisShockTestMode testMode)
 {
     return(new ShockTestMode(testMode, PulseDurationVM.SelectedPulseDuration));
 }
Beispiel #2
0
        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();
                    }
                }
            }
        }
Beispiel #3
0
 public ShockTestMode(AxisShockTestMode mode, double pulseDuration)
 {
     _mode          = mode;
     _pulseDuration = pulseDuration;
     TestType       = TestType.AXIS_SHOCK;
 }