public void Add(uint time,uint received,uint lost,uint size,uint ping)
{
long latencyGradient = 0;
if (_samples.Count > 0)
{
if (time >= _preTime)
{
var delta = time - _preTime;
var deltaReal = (uint) (_reception.Elapsed());
latencyGradient = (long) deltaReal - delta;
_latency += latencyGradient;
}
else
Logger.WARN("QoS computing with a error time value ({0}) inferiors than precedent time ({1})", time,
_preTime);
}
else
_latency = ping/2;
Latency = (uint) (_latency < 0 ? 0 : _latency);
_preTime = time;
_num += lost;
_den += (lost + received);
_size += size;
_latencyGradient += latencyGradient;
foreach (var sample in _samples.ToArray())
{
if (sample.Time.IsElapsed(5000))
{
_fullSample = true;
break;
}
_den -= (sample.Received + sample.Lost);
_num -= sample.Lost;
_size -= sample.Size;
_latencyGradient -= sample.LatencyGradient;
_samples.Remove(sample);
}
_reception = DateTime.Now;
_samples.Add(new Sample(_reception,received,lost,size,latencyGradient));
var elapsed = _fullSample?5000:(uint)(_samples[0].Time.Elapsed());
ByteRate = 0;
double congestion = 0;
if (elapsed > 0)
{
ByteRate = _size/elapsed*1000;
congestion = _latencyGradient/elapsed;
}
if (_den == 0) Logger.FATAL("Lost rate computing with a impossible null number of fragments received");
else
{
LostRate = _num/_den;
congestion += LostRate;
}
CongestionRate = congestion > 1 ? 1 : (congestion < -1 ? -1 : congestion);
}