6 #include "flowpusher.h"
8 FlowPusher::FlowPusher(std::vector<flow_element> &flow) : flow(flow)
12 void FlowPusher::find_diff(double x, double &prev_x, unsigned long long y1, unsigned long long prev_y1, unsigned long long y2, unsigned long long prev_y2,
13 unsigned long long &yf1, unsigned long long &yf2)
15 // Heuristics: if last reading was more than ten minutes away, and both
16 // readings went down from last reading, we assume the counters
17 // were zeroed. If not, we assume wraparound.
18 bool over_10mins = (x - prev_x >= 600);
19 bool y1_wrapped = ((prev_y1 == 0 && y1 == 0) || y1 < prev_y1);
20 bool y2_wrapped = ((prev_y2 == 0 && y2 == 0) || y2 < prev_y2);
21 bool both_zero = (y1 == 0 && y2 == 0);
22 bool any_wide = (prev_y1 > 4294967296ULL || prev_y2 > 4294967296ULL);
24 if ((over_10mins && (y1_wrapped || y2_wrapped)) || both_zero || (any_wide && (y1_wrapped || y2_wrapped))) {
28 // our best estimate for when it was zeroed :-)
29 prev_x = (prev_x + x) / 2;
33 yf1 = (unsigned long long)(((unsigned long long)y1 + 4294967296ULL) - prev_y1);
35 yf1 = (unsigned long long)(y1 - prev_y1);
39 yf2 = (unsigned long long)(((unsigned long long)y2 + 4294967296ULL) - prev_y2) / (x - prev_x);
41 yf2 = (unsigned long long)(y2 - prev_y2);
45 void FlowPusher::push(double x, unsigned long long y1, unsigned long long y2)
47 unsigned long long yf1, yf2;
49 find_diff(x, prev_x, y1, prev_y1, y2, prev_y2, yf1, yf2);
54 fe.x = unsigned((prev_x + x)*0.5);
58 min_x = std::min(min_x, fe.x);
59 max_x = std::max(max_x, fe.x);
61 min_y = std::min(min_y, fe.y1);
62 max_y = std::max(max_y, fe.y1);
64 min_y = std::min(min_y, fe.y2);
65 max_y = std::max(max_y, fe.y2);
74 void FlowPusher::reset(double x, unsigned long long y1, unsigned long long y2)
82 min_x = max_x - 86400;