Dash Core  0.12.2.1
P2P Digital Currency
trafficgraphdata.cpp
Go to the documentation of this file.
1 #include "trafficgraphdata.h"
2 
3 const int TrafficGraphData::RangeMinutes[] = {5,10,15,30,60,120,180,360,720,1440};
16  } ;
17 
20 
22  :currentGraphRange(range),
23  currentSampleCounter(0),
24  nLastBytesIn(0),
25  nLastBytesOut(0)
26 {
27 }
28 
30 {
31  SampleQueue& queue = sampleMap[range];
32  if (queue.size() > DesiredQueueSizes[range]){
33  sampleStash[range].push_front(queue.at(DesiredQueueSizes[range]));
34  }
35 }
36 
38 {
39  SampleQueue& queue = sampleMap[range];
40  if (queue.size() == DesiredQueueSizes[range] + 2){
41  update(nextRange, queue.takeLast() + queue.takeLast());
42  }
43 }
44 
46 {
47  SampleQueue& stashQueue = sampleStash[range];
48  if (stashQueue.size() == 3){
49  update(nextRange, stashQueue.takeLast() + stashQueue.takeLast() + stashQueue.takeLast());
50  }
51 }
52 
53 void TrafficGraphData::setLastBytes(quint64 nLastBytesIn, quint64 nLastBytesOut)
54 {
55  this->nLastBytesIn = nLastBytesIn;
56  this->nLastBytesOut = nLastBytesOut;
57 }
58 
59 bool TrafficGraphData::update(quint64 totalBytesRecv, quint64 totalBytesSent)
60 {
61  float inRate = totalBytesRecv - nLastBytesIn ;
62  float outRate = totalBytesSent - nLastBytesOut;
63  nLastBytesIn = totalBytesRecv;
64  nLastBytesOut = totalBytesSent;
65  return update(TrafficSample(inRate,outRate));
66 }
67 
68 bool TrafficGraphData::update(const TrafficSample& trafficSample)
69 {
70  update(Range_5m, trafficSample);
71 
73 
76  return true;
77  }
78  return false;
79 }
80 
81 void TrafficGraphData::update(GraphRange range, const TrafficSample& trafficSample)
82 {
83  SampleQueue& queue = sampleMap[range];
84  queue.push_front(trafficSample);
85 
86  switch(range){
87  case Range_5m:
91  return;
92  case Range_15m:
94  return;
95  case Range_30m:
97  return;
98  case Range_1h:
102  return;
103  case Range_3h:
105  return;
106  case Range_6h:
108  return;
109  case Range_12h:
111  return;
112  default:
113  if (queue.size() > DesiredQueueSizes[range])
114  queue.removeLast();
115  return;
116  }
117 }
118 
119 
121 {
122  currentGraphRange = newRange;
124 }
125 
127 {
129  int i = rangeQueue.size() - 1;
130 
131  while (i - 1 >= 0){
132  result.push_front(rangeQueue.at(i)+ rangeQueue.at(i-1));
133  i -= 2;
134  }
135  return result;
136 }
137 
139 {
141  int lastUnusedSample = std::min(rangeQueue.size()-1 ,DESIRED_DATA_SAMPLES-1);
142 
143  // use stash first
144  SampleQueue& stashQueue = sampleStash[range];
145  TrafficSample sum(0,0);
146  for (int i = 0; i < stashQueue.size(); i++){
147  sum+=stashQueue.at(i);
148  }
149  int toFullSample = 3 - stashQueue.size();
150  if (toFullSample > rangeQueue.size())
151  return result;
152 
153  // append to stash data to create whole sample
154  for (int i = 0; i < toFullSample; i++){
155  sum+=rangeQueue.at(lastUnusedSample);
156  lastUnusedSample--;
157  }
158  result.push_front(sum);
159 
160  while (lastUnusedSample - 2 >= 0){
161  result.push_front(rangeQueue.at(lastUnusedSample) + rangeQueue.at(lastUnusedSample-1) + rangeQueue.at(lastUnusedSample-2));
162  lastUnusedSample -= 3;
163  }
164  return result;
165 }
166 
168 {
169  switch(range){
170  case Range_5m:
171  return sampleMap[Range_5m];
172  case Range_10m:
173  {
175  queue.append(sampleMap[Range_10m]);
176  return queue;
177  }
178  case Range_15m:
179  {
181  queue.append(sampleMap[Range_15m]);
182  return queue;
183  }
184  case Range_30m:
185  {
187  queue.append(sampleMap[Range_30m]);
188  return queue;
189  }
190  case Range_1h:
191  {
193  queue.append(sampleMap[Range_1h]);
194  return queue;
195  }
196  case Range_2h:
197  {
199  queue.append(sampleMap[Range_2h]);
200  return queue;
201  }
202  case Range_3h:
203  {
205  queue.append(sampleMap[Range_3h]);
206  return queue;
207  }
208  case Range_6h:
209  {
211  queue.append(sampleMap[Range_6h]);
212  return queue;
213  }
214  case Range_12h:
215  {
217  queue.append(sampleMap[Range_12h]);
218  return queue;
219  }
220  case Range_24h:
221  {
223  queue.append(sampleMap[Range_24h]);
224  return queue;
225  };
226  default:
227  return SampleQueue();
228 
229  }
230 }
231 
233 {
234  SampleQueue newQueue;
236  return newQueue;
237 }
238 
239 
241  // to base range
243  // to B/s
245  // to KB/s
246  result = result / 1024;
247 
248  return result;
249 
250 }
251 
253  SampleQueue newQueue;
255  for(auto& sample : newQueue){
256  sample.in = converSampletoBandwith(sample.in);
257  sample.out = converSampletoBandwith(sample.out);
258  }
259  return newQueue;
260 }
261 
263 {
264  sampleMap.clear();
265  sampleMap.clear();
267  nLastBytesIn = 0;
268  nLastBytesOut = 0;
269 }
270 
271 
void setLastBytes(quint64 nLastBytesIn, quint64 nLastBytesOut)
float converSampletoBandwith(float dataAmount)
static const int SMALLEST_SAMPLE_PERIOD
void switchRange(GraphRange newRange)
volatile double sum
Definition: Examples.cpp:23
SampleQueue sumEach3Samples(const SampleQueue &rangeQueue, GraphRange range)
SampleQueueMap sampleMap
TrafficGraphData(GraphRange range)
SampleQueue sumEach2Samples(const SampleQueue &rangeQueue)
SampleQueueMap sampleStash
void tryUpdateNextWithLast2Samples(GraphRange range, GraphRange nextRange)
static const int RangeMinutes[]
void tryAddingSampleToStash(GraphRange range)
void tryUpdateNextWithLast3Samples(GraphRange range, GraphRange nextRange)
SampleQueue getRangeQueue(GraphRange range)
GraphRange currentGraphRange
bool update(const TrafficSample &trafficSample)
static const int DESIRED_DATA_SAMPLES
SampleQueue getCurrentRangeQueueWithAverageBandwidth()
static const int DesiredQueueSizes[]
SampleQueue getCurrentRangeQueue()
QQueue< TrafficSample > SampleQueue
result
Definition: rpcuser.py:37