public SubtMeasurement Measure(SubtLocalPeer subtLocalPeer) // manager thread // used by easyGui { // measure float rxBandwidth = 0; float confirmedTxBandwidth = 0; TimeSpan?bestRttToPeers = null; float? averageTxLossG = null; float? averageRxLossG = null; foreach (var cp in subtLocalPeer.ConnectedPeers) { AverageSingle averageTxLoss = new AverageSingle(); AverageSingle averageRxLoss = new AverageSingle(); foreach (var s in cp.Streams) { rxBandwidth += s.RecentRxBandwidth; var st = s.LatestRemoteStatus; if (st != null) { confirmedTxBandwidth += st.RecentRxBandwidth; if (bestRttToPeers == null || s.RecentRtt < bestRttToPeers.Value) { bestRttToPeers = s.RecentRtt; } averageTxLoss.Input(st.RecentRxPacketLoss); } averageRxLoss.Input(s.RecentPacketLoss); } var averageRxLossAverage = averageRxLoss.Average; if (averageRxLossAverage.HasValue) { if (averageRxLossG == null || averageRxLossAverage.Value < averageRxLossG.Value) { averageRxLossG = averageRxLossAverage; } } var averageTxLossAverage = averageTxLoss.Average; if (averageTxLossAverage.HasValue) { if (averageTxLossG == null || averageTxLossAverage.Value < averageTxLossG.Value) { averageTxLossG = averageTxLossAverage; } } } return(new SubtMeasurement { MeasurementPeriodEndUtc = subtLocalPeer.LocalPeer.DateTimeNowUtc, RxBandwidth = rxBandwidth, TxBandwidth = confirmedTxBandwidth, BestRttToPeers = bestRttToPeers, TxPacketLoss = averageTxLossG, RxPacketLoss = averageRxLossG }); }
public void GetStreamsAveragePacketLoss(out float?averageRxLossAverage, out float?averageTxLossAverage) { AverageSingle averageTxLoss = new AverageSingle(); AverageSingle averageRxLoss = new AverageSingle(); foreach (var s in Streams) { var st = s.LatestRemoteStatus; if (st != null) { if (st.RecentRxBandwidth > SubtLogicConfiguration.MinBandwidthPerStreamForPacketLossMeasurement) { averageTxLoss.Input(st.RecentRxPacketLoss); } } if (s.RecentRxBandwidth > SubtLogicConfiguration.MinBandwidthPerStreamForPacketLossMeasurement) { averageRxLoss.Input(s.RecentPacketLoss); } } averageRxLossAverage = averageRxLoss.Average; averageTxLossAverage = averageTxLoss.Average; }