Files
DP44/Common/DTS.Common.Utilities/AverageShortValueOverTime.cs
2026-04-17 14:55:32 -04:00

147 lines
5.4 KiB
C#

/*
* AverageShortValueOverTime.cs
*
* Copyright © 2009
* Diversified Technical Systems, Inc.
* All Rights Reserved
*/
using DTS.Common.Utilities.Logging;
using System.Collections.Generic;
using System.Linq;
namespace DTS.Common.Utilities
{
/// <summary>
/// A class to represent the average value of a set of shorts over time.
/// </summary>
public class AverageShortValueOverTime
: AverageValueOverTime<short>
{
/// <summary>
/// Initialize an instance of the AverageShortValueOverTime class, assuming that no
/// averaging has been done yet.
/// </summary>
/// <param name="initialTime">
/// The <see cref="double"/> begin time of the average (using the time units specified
/// by the "TimeUnitSymbol" property.
/// </param>
///
/// <param name="sampleRate">
/// The <see cref="double"/> sample rate of the items being averaged (using the time units
/// specifed by the "TimeUnitSymbol" property.
/// </param>
///
/// <param name="timeUnitSymbol">
/// The <see cref="string"/> time unit description for begin/end times and the sample rate.
/// </param>
///
public AverageShortValueOverTime(double initialTime,
double sampleRate,
string timeUnitSymbol)
: base(initialTime,
sampleRate,
0,
timeUnitSymbol)
{
}
/// <summary>
/// Initialize an instance of the AverageShortValueOverTime class.
/// </summary>
///
/// <param name="beginTime">
/// The <see cref="double"/> begin time of the average (using the time units specified
/// by the "TimeUnitSymbol" property.
/// </param>
///
/// <param name="endTime">
/// The <see cref="double"/> end time of the average (using the time units specified
/// by the "TimeUnitSymbol" property.
/// </param>
///
/// <param name="sampleRate">
/// The <see cref="double"/> sample rate of the items being averaged (using the time units
/// specifed by the "TimeUnitSymbol" property.
/// </param>
///
/// <param name="initialAverage">
/// The <see cref="short"/> pre-existing average to be appended to.
/// </param>
///
/// <param name="timeUnitSymbol">
/// The <see cref="string"/> time unit description for begin/end times and the sample rate.
/// </param>
///
public AverageShortValueOverTime(double beginTime,
double endTime,
double sampleRate,
short initialAverage,
string timeUnitSymbol)
: base(beginTime,
endTime,
sampleRate,
initialAverage,
timeUnitSymbol)
{
}
/// <summary>
/// Append the specified <see cref="T:List"/> of values to the running average.
/// </summary>
///
/// <param name="values">
/// The <see cref="T:List"/> of <see cref="short"/>s to be appended to the running average.
/// </param>
///
public override void AppendValues(List<short> values)
{
AppendValues(values.ToArray());
}
/// <summary>
/// Append the specified array of values to the running average.
/// </summary>
///
/// <param name="values">
/// The array of <see cref="short"/>s to be appended to the running average.
/// </param>
///
public override void AppendValues(short[] values)
{
if (0 == values.Length)
{
APILogger.Log($"AverageShortValueOverTime.AppendValues - no values to append");
return;
}
//
// Get the average of the appended values by themselves.
//
var numAppendixSamples = values.Length;
var appendixSamples = new double[numAppendixSamples];
for (var i = 0; i < numAppendixSamples; i++)
appendixSamples[i] = values[i];
var appendixAverage = appendixSamples.Average();
//
// Get the previous average and number of samples.
//
var numPreviousSamples = (ulong)((EndTime - BeginTime) * SampleRate);
double previousAverage = CurrentAverage;
//
// Now combine them with the previous average values (with the
// appropriate weighting) to get a new combined average.
//
var numTotalSamples = numPreviousSamples + (ulong)numAppendixSamples;
var combinedAverage = ((previousAverage * numPreviousSamples) + (appendixAverage * numAppendixSamples)) / numTotalSamples;
// Save our new average.
CurrentAverage = (short)combinedAverage;
// Update the end time to take into account the appended data.
EndTime += (numAppendixSamples / SampleRate);
}
}
}