/* This file is part of Wattzap Community Edition. * * Wattzap Community Edtion is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Wattzap Community Edition is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Wattzap. If not, see <http://www.gnu.org/licenses/>. */ package com.wattzap.utils; import java.util.LinkedList; /** * Rolling Average Calculator for a time delta Not thread safe * * @author David George * @date 2nd September 2013 */ public class RollingTime { LinkedList<Value> fifo = new LinkedList<Value>(); long delta; int total; public RollingTime(long delta) { this.delta = delta; } /** * @param v * - value * @param t * - time in seconds value was taken */ public int average(int v, long t) { int time = 1; if (!fifo.isEmpty()) { Value last = fifo.getLast(); time = (int) (t - last.t); if (v > delta) { return v; } } for (int i = 0; i < time; i++) { Value value = new Value(v, t); fifo.add(value); total += v; Value first = fifo.getFirst(); // keep just delta number of values in fifo while (t > first.t + delta) { fifo.removeFirst(); total -= first.v; first = fifo.getFirst(); }// while }// for if (fifo.getLast().t < (fifo.getFirst().t + delta)) { return 0; } return (int) total / fifo.size(); } private class Value { int v; long t; Value(int i, long t) { this.v = i; this.t = t; } } }