1 /*
2  *  avgspeed.cpp
3  *  Class to compute moving average speed
4  *
5  *  Created by Arno Bakker
6  *  Copyright 2009-2012 Delft University of Technology. All rights reserved.
7  *
8  */
9 #include "avgspeed.h"
10 
11 using namespace swift;
12 
MovingAverageSpeed(tint speed_interval,tint fudge)13 MovingAverageSpeed::MovingAverageSpeed(tint speed_interval, tint fudge)
14 {
15     speed_interval_ = speed_interval;
16     fudge_ = fudge;
17     t_start_ = usec_time() - fudge_;
18     t_end_ = t_start_;
19     speed_ = 0.0;
20     resetstate_ = false;
21 }
22 
23 
AddPoint(uint64_t amount)24 void MovingAverageSpeed::AddPoint(uint64_t amount)
25 {
26     // Arno, 2012-01-04: Resetting this measurement includes not adding
27     // points for a few seconds after the reset, to accomodate the case
28     // of going from high speed to low speed and content still coming in.
29     //
30     if (resetstate_) {
31         if ((t_start_ + speed_interval_/2) > usec_time()) {
32             return;
33         }
34         resetstate_ = false;
35     }
36 
37     tint t = usec_time();
38     speed_ = (speed_ * ((double)(t_end_ - t_start_)/((double)TINT_SEC)) + (double)amount) / ((t - t_start_)/((
39                  double)TINT_SEC) + 0.0001);
40     t_end_ = t;
41     if (t_start_ < t - speed_interval_)
42         t_start_ = t - speed_interval_;
43 }
44 
45 
GetSpeed()46 double MovingAverageSpeed::GetSpeed()
47 {
48     AddPoint(0);
49     return speed_;
50 }
51 
52 
GetSpeedNeutral()53 double MovingAverageSpeed::GetSpeedNeutral()
54 {
55     return speed_;
56 }
57 
58 
Reset()59 void MovingAverageSpeed::Reset()
60 {
61     resetstate_ = true;
62     t_start_ = usec_time() - fudge_;
63     t_end_ = t_start_;
64     speed_ = 0.0;
65 }
66