forked from ddrilling/AsbCloudServer
49 lines
1.7 KiB
C#
49 lines
1.7 KiB
C#
using System.Linq;
|
||
|
||
namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
|
||
{
|
||
#nullable enable
|
||
class DetectorDrillingRotor : DetectorAbstract
|
||
{
|
||
public DetectorDrillingRotor() : base(1)
|
||
{
|
||
FragmentLength = 15;
|
||
StepLength = 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.IsAverageYLessThanBound(minRotorSpeed))
|
||
return false;
|
||
|
||
return true;
|
||
}
|
||
|
||
protected override bool DetectEnd(DetectableTelemetry[] telemetry, int position)
|
||
=> !DetectStart(telemetry, position);
|
||
|
||
}
|
||
#nullable disable
|
||
}
|