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
            });
        }
Exemple #2
0
        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;
        }