apm2/src/main/java/com/kaijin/AdvPowerMan/MovingAverage.java
2015-02-11 16:42:18 -05:00

96 lines
2 KiB
Java
Executable file

/*******************************************************************************
* Copyright (c) 2012-2013 Yancarlo Ramsey and CJ Bowman
* Licensed as open source with restrictions. Please see attached LICENSE.txt.
******************************************************************************/
package com.kaijin.AdvPowerMan;
public class MovingAverage
{
protected int packets[] = null;
protected int delays[] = null;
protected int position;
//protected int packetTotal;
//protected int delayTotal;
protected int delay;
protected int window;
protected float average;
protected float delta;
public MovingAverage(int size)
{
packets = new int[size];
delays = new int[size];
position = 0;
//packetTotal = 0;
//delayTotal = size;
delay = 1;
window = size;
average = 0F;
delta = 0F;
for (int i = 0; i < size; i++)
{
packets[i] = 0;
delays[i] = 600;
}
}
public void tick(int value)
{
if (value > 0 || delay >= 600) // 600 ticks (30 sec) is long enough for 1 EU/t to have triggered a 512 EU packet by now
{
position++;
if (position >= packets.length) position = 0;
//packetTotal -= packet[position];
packets[position] = value;
//packetTotal += value;
//delayTotal -= time[position];
delays[position] = delay;
//delayTotal += delay;
delay = 1;
window = sumDelays();
final float newAvg = ((float)sumPackets()) / ((float)window);
delta = newAvg - average;
average = newAvg;
}
else
{
delay++;
// Estimate decline of average based on increased average delay
if (delays.length * delay > window)
{
window++;
average = ((float)sumPackets()) / ((float)window);
}
}
}
protected int sumDelays()
{
if (delays == null) return 1;
int delayTotal = 0;
for (int d : delays) delayTotal += d;
return delayTotal;
}
protected int sumPackets()
{
if (packets == null) return 0;
int packetTotal = 0;
for (int p : packets) packetTotal += p;
return packetTotal;
}
public float getAverage()
{
return average;
}
public int getWindow()
{
return window;
}
}