forked from ddrilling/AsbCloudServer
57 lines
1.8 KiB
C#
57 lines
1.8 KiB
C#
using AsbCloudDb.Model.Subsystems;
|
|
using System;
|
|
|
|
namespace AsbCloudInfrastructure.Services.Subsystems
|
|
{
|
|
public class SubsystemDetector
|
|
{
|
|
private readonly int idTelemetry;
|
|
private readonly int idSubsystem;
|
|
private readonly Func<short?, bool> isEnable;
|
|
private readonly Func<SubsystemOperationTime, bool> isValid;
|
|
(bool isEnable, DateTimeOffset date, float depth) pre = default;
|
|
|
|
public SubsystemDetector(
|
|
int idTelemetry,
|
|
int idSubsystem,
|
|
Func<short?, bool> isEnable,
|
|
Func<SubsystemOperationTime, bool> isValid)
|
|
{
|
|
this.idTelemetry = idTelemetry;
|
|
this.idSubsystem = idSubsystem;
|
|
this.isEnable = isEnable;
|
|
this.isValid = isValid;
|
|
}
|
|
|
|
public bool TryDetect(short? mode, DateTimeOffset date, float depth, out SubsystemOperationTime? subsystemOperationTime)
|
|
{
|
|
var isEnable = this.isEnable(mode);
|
|
|
|
if (!pre.isEnable && isEnable)
|
|
{
|
|
pre = (true, date, depth);
|
|
}
|
|
else if (pre.isEnable && !isEnable)
|
|
{
|
|
var detected = new SubsystemOperationTime
|
|
{
|
|
IdTelemetry = idTelemetry,
|
|
IdSubsystem = idSubsystem,
|
|
DateStart = pre.date,
|
|
DateEnd = date,
|
|
DepthStart = pre.depth,
|
|
DepthEnd = depth,
|
|
};
|
|
pre.isEnable = false;
|
|
if (isValid(detected))
|
|
{
|
|
subsystemOperationTime = detected;
|
|
return true;
|
|
}
|
|
}
|
|
subsystemOperationTime = null;
|
|
return false;
|
|
}
|
|
}
|
|
}
|