package org.yamcs.algorithms;
import org.yamcs.parameter.ParameterValue;
/**
* A history window is for looking up past values. Intentionally it
* does not allow multiple values at the same generation-time
*/
public class WindowBuffer {
// Sorted least-recent to most-recent
private long[] genTimes;
private ParameterValue[] historicValues;
WindowBuffer(int size) {
genTimes=new long[size];
historicValues=new ParameterValue[size];
}
/** -1 goes back one */
public ParameterValue getHistoricValue(int instance) {
return historicValues[historicValues.length-1+instance];
}
void update(ParameterValue pval) {
long genTime = pval.getGenerationTime();
// Find index to insert at
int index=-1;
for(int i=genTimes.length-1; i>=0; i--) {
if(genTimes[i]==genTime) {
break; // Only one value per genTime
} else if(genTimes[i]<genTime) {
index=i;
break;
}
}
if(index==-1) {
return; // Outdated value
}
// Shift older values to the left
for(int i=0; i<index; i++) {
genTimes[i]=genTimes[i+1];
historicValues[i]=historicValues[i+1];
}
genTimes[index]=genTime;
historicValues[index]=pval;
}
void expandIfNecessary(int newSize) {
if(newSize>genTimes.length) {
ParameterValue[] newPvals=new ParameterValue[newSize];
long[] newGenTimes=new long[newSize];
int diff=newSize-genTimes.length;
for(int i=diff; i<newSize; i++) {
newGenTimes[i]=genTimes[i-diff];
newPvals[i]=historicValues[i-diff];
}
genTimes=newGenTimes;
historicValues=newPvals;
}
}
public int getSize() {
return genTimes.length;
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder("[");
buf.append(genTimes[0]).append("->").append(toValue(historicValues[0]));
for (int i=1;i<genTimes.length;i++) {
buf.append(", ").append(genTimes[i]).append("->").append(toValue(historicValues[i]));
}
return buf.append("]").toString();
}
private static String toValue(ParameterValue pval) {
if(pval==null) return null;
return pval.getEngValue().toString();
}
}