package de.tu.darmstadt.seemoo.ansian.control;
import java.util.Arrays;
import java.util.Hashtable;
import de.greenrobot.event.EventBus;
import de.greenrobot.event.Subscribe;
import de.tu.darmstadt.seemoo.ansian.control.StateHandler.State;
import de.tu.darmstadt.seemoo.ansian.control.events.DataEvent;
import de.tu.darmstadt.seemoo.ansian.control.events.DemodDataEvent;
import de.tu.darmstadt.seemoo.ansian.control.events.FFTDataEvent;
import de.tu.darmstadt.seemoo.ansian.control.events.ScanAreaUpdateEvent;
import de.tu.darmstadt.seemoo.ansian.control.events.StateEvent;
import de.tu.darmstadt.seemoo.ansian.model.FFTDrawData;
import de.tu.darmstadt.seemoo.ansian.model.FFTSample;
import de.tu.darmstadt.seemoo.ansian.model.ObjectRingBuffer;
import de.tu.darmstadt.seemoo.ansian.model.ScannerBuffer;
import de.tu.darmstadt.seemoo.ansian.model.WaveformBuffer;
import de.tu.darmstadt.seemoo.ansian.model.WaveformDrawData;
import de.tu.darmstadt.seemoo.ansian.model.preferences.Preferences;
/**
*
* DataHandler intermediately stores buffers and other data for further operations
*
* @author Markus Grau
* @author Steffen Kreis
*
*/
public class DataHandler {
private static DataHandler instance;
private static ObjectRingBuffer<FFTSample> fftBuffer;
private ScannerBuffer scannerBuffer;
private Hashtable<Long, FFTSample> lastHash;
private FFTSample last;
private FFTSample[] ffts;
private WaveformBuffer waveformBuffer;
public static DataHandler getInstance() {
if (instance == null)
instance = new DataHandler();
return instance;
}
public DataHandler() {
fftBuffer = new ObjectRingBuffer<FFTSample>(FFTSample.class);
scannerBuffer = new ScannerBuffer();
waveformBuffer = new WaveformBuffer();
EventBus.getDefault().register(this);
}
public FFTDrawData getScannerDrawData(int pixelWidth) {
if (lastHash != null)
return scannerBuffer.getDrawData(lastHash, pixelWidth);
else
return scannerBuffer.getDrawData(pixelWidth);
}
public FFTSample[] getSamples(int i) {
if (ffts != null)
return Arrays.copyOf(ffts, i);
return fftBuffer.getLast(i);
}
public FFTSample getLastFFTSample() {
return fftBuffer.getLast();
}
public FFTSample[] getSamples() {
return fftBuffer.getSamples();
}
@Subscribe
public void onEvent(ScanAreaUpdateEvent event) {
if (scannerBuffer != null) {
scannerBuffer.setSamplerate(event.getSamplerate());
}
}
@Subscribe
public void onEvent(FFTDataEvent event) {
FFTSample sample = event.getSample();
fftBuffer.add(sample);
scannerBuffer.addSample(sample);
}
@Subscribe
public void onEvent(DataEvent event) {
if (!StateHandler.isDemodulating()) {
waveformBuffer.addPacket(event.getSample(), false);
}
}
@Subscribe
public void onEvent(DemodDataEvent event) {
if (StateHandler.isDemodulating()) {
waveformBuffer.addPacket(event.getSample(), true);
}
}
@SuppressWarnings("unchecked")
@Subscribe
public void onEvent(StateEvent event) {
if (event.getState() == State.PAUSED) {
lastHash = (Hashtable<Long, FFTSample>) scannerBuffer.getScannerSamples().clone();
last = getLastFFTSample();
ffts = getSamples();
} else {
lastHash = null;
last = null;
ffts = null;
}
}
public FFTDrawData getFrequencyDrawData(int width) {
if (last != null)
return last.getDrawData(width);
else
return getDrawData(width);
}
public FFTDrawData getWaterfallDrawData(int width) {
if (last != null && Preferences.GUI_PREFERENCE.isWaterfallPaused())
return last.getDrawData(width);
else
return getDrawData(width);
}
private FFTDrawData getDrawData(int width) {
FFTSample sample = getLastFFTSample();
if (sample != null)
return getLastFFTSample().getDrawData(width);
else
return null;
}
public WaveformDrawData[] getWaveformDrawData(int shownDataAmount) {
return waveformBuffer.getDrawData(shownDataAmount);
}
}