using AsbCloudDb.Model; using System.Linq; namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors { #nullable enable class DetectorDrillingSlide : DetectorAbstract { public DetectorDrillingSlide() : base(3) { FragmentLength = 10; } protected override bool DetectStart(DetectableTelemetry[] telemetry, int position) { var firstItem = telemetry[position]; var delta = firstItem.WellDepth - firstItem.BitDepth; if (delta is not null && System.Math.Abs((float)delta) > 1d) return false; var fragment = telemetry[position .. (position + FragmentLength)]; const double minRop = 5; //м/час const double minRotorSpeed = 5; //об/мин const double ticksPerHour = 60 * 60 * 10_000_000d; var lineBlockPosition = new InterpolationLine(fragment.Select(d => (d.BlockPosition ?? 0d, d.DateTime.Ticks / ticksPerHour))); if (!lineBlockPosition.IsYDecreases(minRop)) return false; var lineWellDepth = new InterpolationLine(fragment.Select(d => (d.WellDepth ?? 0d, d.DateTime.Ticks / ticksPerHour))); if(!lineWellDepth.IsYIncreases(minRop)) return false; var lineRotorSpeed = new InterpolationLine(fragment.Select(d => (d.RotorSpeed ?? 0d, d.DateTime.Ticks / ticksPerHour))); if (!lineRotorSpeed.IsAverageYMoreThanBound(minRotorSpeed)) return false; return true; } protected override bool DetectEnd(DetectableTelemetry[] telemetry, int position) => !DetectStart(telemetry, position); protected override void CalcValue(ref DetectedOperation result) { throw new System.NotImplementedException(); } } #nullable disable }