2015-04-15 18:32:56 +00:00
|
|
|
|
///
|
2022-01-23 18:56:15 +00:00
|
|
|
|
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
|
2015-04-15 18:32:56 +00:00
|
|
|
|
///
|
|
|
|
|
|
using System;
|
2022-01-23 18:56:15 +00:00
|
|
|
|
using System.Collections.Generic;
|
2014-07-28 07:54:35 +00:00
|
|
|
|
|
2015-12-04 16:17:20 +00:00
|
|
|
|
namespace Config.Entities
|
2014-07-28 07:54:35 +00:00
|
|
|
|
{
|
2022-01-23 18:56:15 +00:00
|
|
|
|
public class MeasurementCorrection : Common.IMeasurementCorrection
|
2014-07-28 07:54:35 +00:00
|
|
|
|
{
|
|
|
|
|
|
public virtual int Id { get; protected set; }
|
2018-01-24 13:16:38 +00:00
|
|
|
|
public virtual int RangeIx { get; set; } /// 0..5
|
2014-07-28 07:54:35 +00:00
|
|
|
|
public virtual float Measurement { get; set; }
|
|
|
|
|
|
public virtual float Correction { get; set; }
|
2018-01-24 13:16:38 +00:00
|
|
|
|
|
2018-11-12 17:35:47 +00:00
|
|
|
|
public MeasurementCorrection()
|
|
|
|
|
|
{
|
|
|
|
|
|
RangeIx = 0;
|
|
|
|
|
|
}
|
2018-01-24 13:16:38 +00:00
|
|
|
|
|
|
|
|
|
|
public MeasurementCorrection(int rangeIx)
|
|
|
|
|
|
{
|
2018-11-12 17:35:47 +00:00
|
|
|
|
RangeIx = rangeIx;
|
2018-01-24 13:16:38 +00:00
|
|
|
|
}
|
2022-01-23 18:56:15 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Calculates corrected value from a list of corrections by interpolation.
|
|
|
|
|
|
/// It is assumed that values in the list 'corrections' are sorted.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="rawMeasurement">Raw uncorrected value</param>
|
|
|
|
|
|
/// <param name="corrections">Sorted (value, correction) pairs</param>
|
|
|
|
|
|
/// <returns>Corrected value</returns>
|
|
|
|
|
|
public static double CorrectedValue(double rawValue, IList<MeasurementCorrection> corrections)
|
|
|
|
|
|
{
|
|
|
|
|
|
return rawValue + GetCorrection(rawValue, corrections);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Get a correction from a list of corrections by interpolation.
|
|
|
|
|
|
/// It is assumed that values in the list 'corrections' are sorted.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="rawMeasurement">Raw uncorrected value</param>
|
|
|
|
|
|
/// <param name="corrections">Sorted (value, correction) pairs</param>
|
|
|
|
|
|
/// <returns>Corrected value</returns>
|
|
|
|
|
|
public static double GetCorrection(double rawValue, IList<MeasurementCorrection> corrections)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((corrections == null) || (corrections.Count == 0)) return 0; /// No correction
|
|
|
|
|
|
|
|
|
|
|
|
if (rawValue < corrections[0].Measurement)
|
|
|
|
|
|
{
|
|
|
|
|
|
/// rawValue is below the lowest value in the correction table
|
|
|
|
|
|
return corrections[0].Correction;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 1; i < corrections.Count; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (rawValue < corrections[i].Measurement)
|
|
|
|
|
|
{
|
|
|
|
|
|
double d1 = rawValue - corrections[i - 1].Measurement;
|
|
|
|
|
|
double d2 = corrections[i].Measurement - rawValue;
|
|
|
|
|
|
|
|
|
|
|
|
if (d1 + d2 <= float.Epsilon)
|
|
|
|
|
|
{
|
|
|
|
|
|
/// Neigboring values in the corection table are close to each other -> calculate the average
|
|
|
|
|
|
return (corrections[i - 1].Correction + corrections[i].Correction) / 2.0;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
/// Interpolate the correction from neigboring values in the corection table
|
|
|
|
|
|
return (corrections[i - 1].Correction * d2 + corrections[i].Correction * d1) / (d1 + d2);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// rawValue is above the highest value in the correction table
|
|
|
|
|
|
return corrections[corrections.Count - 1].Correction;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2014-07-28 07:54:35 +00:00
|
|
|
|
}
|