protected DataValue ComputeDurationGoodBad(TimeSlice slice, bool isBad, bool usePercent)
{
// get the values in the slice.
List<DataValue> values = GetValuesWithSimpleBounds(slice);
// check for empty slice.
if (values == null || values.Count == 0)
{
return GetNoDataValue(slice);
}
// get the regions.
List<SubRegion> regions = GetRegionsInValueSet(values, false, true);
double duration = 0;
double total = 0;
for (int ii = 0; ii < regions.Count; ii++)
{
total += regions[ii].Duration;
if (isBad)
{
if (StatusCode.IsBad(regions[ii].StatusCode))
{
duration += regions[ii].Duration;
}
}
else
{
if (StatusCode.IsGood(regions[ii].StatusCode))
{
duration += regions[ii].Duration;
}
}
}
if (usePercent)
{
duration = (duration / total) * 100;
}
// set the timestamp and status.
DataValue value = new DataValue();
value.WrappedValue = new Variant(duration, TypeInfo.Scalars.Double);
value.SourceTimestamp = GetTimestamp(slice);
value.ServerTimestamp = GetTimestamp(slice);
value.StatusCode = value.StatusCode.SetAggregateBits(AggregateBits.Calculated);
// return result.
return value;
}