public DataSeries CalculateMissingCurrentChannel(MeterInfoDataContext meterInfo)
{
Meter meter;
DataSeries missingSeries;
// If the data group does not have exactly 3 channels,
// then there is no missing channel or there is not
// enough data to calculate the missing channel
if (DefinedCurrents != 3)
return null;
// Get the meter associated with the channels in this data group
meter = (IA ?? IB).SeriesInfo.Channel.Meter;
if (m_iaIndex == -1)
{
// Calculate IA = IR - IB - IC
missingSeries = IR.Add(IB.Negate()).Add(IC.Negate());
missingSeries.SeriesInfo = GetSeriesInfo(meterInfo, meter, m_dataGroup, "Current", "General1");
m_iaIndex = m_dataGroup.DataSeries.Count;
m_dataGroup.Add(missingSeries);
}
else if (m_ibIndex == -1)
{
// Calculate IB = IR - IA - IC
missingSeries = IR.Add(IA.Negate()).Add(IC.Negate());
missingSeries.SeriesInfo = GetSeriesInfo(meterInfo, meter, m_dataGroup, "Current", "General2");
m_ibIndex = m_dataGroup.DataSeries.Count;
m_dataGroup.Add(missingSeries);
}
else if (m_icIndex == -1)
{
// Calculate IC = IR - IA - IB
missingSeries = IR.Add(IA.Negate()).Add(IB.Negate());
missingSeries.SeriesInfo = GetSeriesInfo(meterInfo, meter, m_dataGroup, "Current", "General3");
m_icIndex = m_dataGroup.DataSeries.Count;
m_dataGroup.Add(missingSeries);
}
else
{
// Calculate IR = IA + IB + IC
missingSeries = IA.Add(IB).Add(IC);
missingSeries.SeriesInfo = GetSeriesInfo(meterInfo, meter, m_dataGroup, "Current", "RES");
m_irIndex = m_dataGroup.DataSeries.Count;
m_dataGroup.Add(missingSeries);
}
return missingSeries;
}