package me.legrange.panstamp.gui.model;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.jfree.data.DomainOrder;
import org.jfree.data.general.DatasetChangeEvent;
import org.jfree.data.general.DatasetChangeListener;
import org.jfree.data.general.DatasetGroup;
import org.jfree.data.xy.XYDataset;
/**
*
* @author gideon
*/
public class SignalDataSet implements XYDataset {
public void addSample(int rssi, int lqi) {
data.add(new Entry(rssi, lqi));
fire();
}
@Override
public DomainOrder getDomainOrder() {
return DomainOrder.ASCENDING;
}
@Override
public int getItemCount(int i) {
return data.size();
}
@Override
public Number getX(int series, int index) {
return getXValue(series, index);
}
@Override
public double getXValue(int series, int index) {
switch (series) {
case RSSI : return data.get(index).rssi;
case LQI : return data.get(index).lqi;
default : throw new IndexOutOfBoundsException(String.format("No series %d", series));
}
}
@Override
public Number getY(int series, int index) {
return getYValue(series, index);
}
@Override
public double getYValue(int series, int index) {
return data.get(index).time;
}
@Override
public int getSeriesCount() {
return 2;
}
@Override
public Comparable getSeriesKey(int series) {
switch (series) {
case LQI : return "LQI";
case RSSI : return "RSSI";
default : throw new IndexOutOfBoundsException(String.format("No series %d", series));
}
}
@Override
public int indexOf(Comparable key) {
switch (key.toString()) {
case "LQI" : return LQI;
case "RSSI" : return RSSI;
default : throw new IndexOutOfBoundsException("No series for key '" + key + "'");
}
}
@Override
public void addChangeListener(DatasetChangeListener dl) {
listeners.add(dl);
}
@Override
public void removeChangeListener(DatasetChangeListener dl) {
listeners.remove(dl);
}
@Override
public DatasetGroup getGroup() {
return group;
}
@Override
public void setGroup(DatasetGroup dg) {
this.group = dg;
}
private void fire() {
for (DatasetChangeListener l : listeners) {
l.datasetChanged(new DatasetChangeEvent(this, this));
}
}
private final List<Entry> data = new ArrayList<>();
private final List<DatasetChangeListener> listeners = new CopyOnWriteArrayList<>();
private DatasetGroup group;
private class Entry {
public Entry(int rssi, int lqi) {
this.rssi = rssi;
this.lqi = lqi;
this.time = System.currentTimeMillis();
}
final int rssi;
final int lqi;
final long time;
}
private static final int RSSI = 0;
private static final int LQI = 1;
}