92 lines
2.1 KiB
Java
Executable file
92 lines
2.1 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;
|
|
}
|
|
}
|