First step for using multiple recvs from mptp.
[swifty.git] / src / libswift / avgspeed.cpp
1 /*
2  *  avgspeed.cpp
3  *  Class to compute moving average speed
4  *
5  *  Created by Arno Bakker
6  *  Copyright 2009 Delft University of Technology. All rights reserved.
7  *
8  */
9 #include "avgspeed.h"
10
11 using namespace swift;
12
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
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_)/((double)TINT_SEC) + 0.0001);
39     t_end_ = t;
40     if (t_start_ < t - speed_interval_)
41         t_start_ = t - speed_interval_;
42 }
43
44
45 double MovingAverageSpeed::GetSpeed()
46 {
47     AddPoint(0);
48     return speed_;
49 }
50
51
52 double MovingAverageSpeed::GetSpeedNeutral()
53 {
54     return speed_;
55 }
56
57
58 void MovingAverageSpeed::Reset()
59 {
60         resetstate_ = true;
61         t_start_ = usec_time() - fudge_;
62         t_end_ = t_start_;
63         speed_ = 0.0;
64 }