using AsbCloudDb.Model; using System.Linq; namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors { #nullable enable internal class DetectorRotor : DetectorAbstract { public DetectorRotor() : base(2) { } protected override bool DetectBegin(DetectableTelemetry[] telemetry, int position, DetectedOperation? previousOperation) { var point0 = telemetry[position]; var delta = point0.WellDepth - point0.BitDepth; if (delta > 0.03d) return false; if (point0.Pressure < 25) return false; if (point0.RotorSpeed < 5) return false; var point1 = telemetry[position + 1]; if (point1.WellDepth - point0.WellDepth <= 0.003) return false; return true; } protected override int DetectEnd(DetectableTelemetry[] telemetry, int position, DetectedOperation? previousOperation) { var point0 = telemetry[position]; var delta = point0.WellDepth - point0.BitDepth; if (delta > 0.03d) return IdReasonOfEnd_DeltaDepthIsHi; if (point0.Pressure < 25) return IdReasonOfEnd_PressureIsLo; var avgRotorSpeed = CalcAvgAppr(d => d.RotorSpeed, telemetry, position, 60); if (avgRotorSpeed < 10) return IdReasonOfEnd_AvgRotorSpeedIsLo; if (!DeviatesFromBegin(telemetry, t => t.WellDepth, position, 150, 0.003)) return IdReasonOfEnd_WellDepthDeviates; return IdReasonOfEnd_NotDetected; } protected override bool IsValid(DetectableTelemetry[] telemetry, int begin, int end) => IsValidByWellDepthIncreasing(telemetry, begin, end); protected override double CalcValue(DetectableTelemetry[] telemetry, int begin, int end) => CalcRop(telemetry, begin, end); } #nullable disable }