forked from ddrilling/AsbCloudServer
42 lines
1.5 KiB
C#
42 lines
1.5 KiB
C#
|
using System.Linq;
|
|||
|
|
|||
|
namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
|
|||
|
{
|
|||
|
#nullable enable
|
|||
|
class DetectorDrillingSlide : DetectorAbstract
|
|||
|
{
|
|||
|
public DetectorDrillingSlide() : base(10_003, "Бурение в слайде")
|
|||
|
{
|
|||
|
FragmentLength = 10;
|
|||
|
}
|
|||
|
|
|||
|
protected override bool DetectStart(DetectableTelemetry[] telemetry, int position)
|
|||
|
{
|
|||
|
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);
|
|||
|
|
|||
|
}
|
|||
|
#nullable disable
|
|||
|
}
|