package dk.itu.eyedroid;
import android.content.Context;
import android.widget.ImageView;
import dk.itu.eyedroid.filters.AfterErodeDilateFilter;
import dk.itu.eyedroid.filters.BeforeErodeDilateFilter;
import dk.itu.eyedroid.filters.BlobDetectionFilter;
import dk.itu.eyedroid.filters.CoordinatesFilter;
import dk.itu.eyedroid.filters.DetectAndDrawPupilFilter;
import dk.itu.eyedroid.filters.PreviewFilter;
import dk.itu.eyedroid.filters.RGB2GRAYFilter;
import dk.itu.eyedroid.filters.ThresholdFilter;
import dk.itu.eyedroid.io.IOAndroidController;
import dk.itu.spcl.jlpf.core.FilterComposite;
import dk.itu.spcl.jlpf.core.ProcessingCore;
import dk.itu.spcl.jlpf.io.IOController;
import dk.itu.spcl.jlpf.io.InputReader;
import dk.itu.spcl.jlpf.io.OutputWriter;
/**
* EyeDroid core implementation. IO controller is defined to read from source
* and produce to destination. Core and IO controller are based on JLPF library.
* PIpes and filters arquitecture
*/
public class EyeDroid {
private ProcessingCore core; // Processing core
private IOController ioController; // IO controller intsance
private PreviewFilter mPreviewFilter; // Display preview filter
private Context mContext; // Application context
private static final int CORE_QUEUE_SIZE = 10; // Pipe capacity
private static final int NUM_OF_THREADS = 3; // No of threads to run the
// processing filters
private static final boolean ENABLE_STATISTICS = false; // Enable/disable
// statistics
/**
* Deault constructor
*
* @param context
* Application context
*/
public EyeDroid(Context context) {
this.mContext = context;
core = new ProcessingCore(CORE_QUEUE_SIZE);
}
/**
* Attach IO protocols to core
*
* @param reader
* Source
* @param writer
* Sink
*/
public void setIOProtocols(InputReader reader, OutputWriter writer) {
ioController = new IOAndroidController(core, reader, writer);
}
/**
* Add coordinates result preview to application
*
* @param imageView
* Preview image view
* @return Preview filter
*/
public PreviewFilter addAndGetPreview(ImageView imageView) {
if (imageView != null) {
mPreviewFilter = new PreviewFilter(mContext, imageView);
mPreviewFilter.setFilterName("Preview filter");
return mPreviewFilter;
}
return null;
}
/**
* Parallel algorithm execution setup. Processing algorithm is decomposed in
* 3 composites and executed in 3 threads. Each composite a thread.
*/
private void setUpParallelAlgorithm() {
RGB2GRAYFilter rgb2gray = new RGB2GRAYFilter();
rgb2gray.setFilterName("RGB2Gray");
FilterComposite compo1 = new FilterComposite();
FilterComposite compo2 = new FilterComposite();
FilterComposite compo3 = new FilterComposite();
BeforeErodeDilateFilter beforeErode = new BeforeErodeDilateFilter();
beforeErode.setFilterName("Before dilation");
ThresholdFilter thresholdFilter = new ThresholdFilter();
thresholdFilter.setFilterName("Threshold");
AfterErodeDilateFilter afterErode = new AfterErodeDilateFilter();
afterErode.setFilterName("After dilation");
BlobDetectionFilter blobDetectionFilter = new BlobDetectionFilter();
blobDetectionFilter.setFilterName("Blob detection");
DetectAndDrawPupilFilter detectAndDrawPupilFilter = new DetectAndDrawPupilFilter();
detectAndDrawPupilFilter.setFilterName("Detect and draw");
CoordinatesFilter coordinatesFilter = new CoordinatesFilter();
coordinatesFilter.setFilterName("Coordinates");
compo1.addFilter(rgb2gray);
compo1.addFilter(beforeErode);
compo1.addFilter(thresholdFilter);
compo2.addFilter(afterErode);
compo3.addFilter(blobDetectionFilter);
compo3.addFilter(detectAndDrawPupilFilter);
compo3.addFilter(coordinatesFilter);
if (mPreviewFilter != null)
compo3.addFilter(mPreviewFilter);
compo1.setFilterName("Composite 1");
compo2.setFilterName("Composite 2");
compo3.setFilterName("Composite 3");
core.addFilter(compo1);
core.addFilter(compo2);
core.addFilter(compo3);
}
/**
* Start EyeDroid
*/
public void start() {
if (core == null || ioController == null)
throw new RuntimeException(
"Core and IOController are not set up. Call setIOProtocols first");
setUpParallelAlgorithm();
core.start(NUM_OF_THREADS);
if (ENABLE_STATISTICS)
core.start(NUM_OF_THREADS);
// core.enableStatistics(new FileStatisticsLogger(
// FileStatisticsLogger.STATISTICS_FULL_PATH), 5000);
ioController.start();
}
/**
* Stop EyeDroid
*/
public void stop() {
core.stop();
ioController.stop();
}
}