package imseProc.app;

import org.eclipse.swt.widgets.Display;



import org.eclipse.swt.widgets.Shell;

import otherSupport.SettingsManager;

import edu.emory.mathcs.utils.ConcurrencyUtils;

import mds.GMDSFetcher;
import imseProc.aqui.AquisitionHanger;
import imseProc.arduinoComm.ArduinoCommHanger;
import imseProc.core.IMSEProc;
import imseProc.core.Img;
import imseProc.dacControl.DACTimingHanger;
import imseProc.dshGen.DSHGenSource;
import imseProc.gmds.GMDSSink;
import imseProc.gmds.GMDSSource;
import imseProc.graph.GraphUtilProcessor;
import imseProc.gui.swt.ImageWindow;
import imseProc.jotter.JotterSink;
import imseProc.jotter.JotterSource;
import imseProc.noiseGen.NoiseGenSWTControl;
import imseProc.noiseGen.NoiseGenSource;
import imseProc.platesGen.PlatesGenSource;
import imseProc.proc.demod.DSHDemod;
import imseProc.proc.fft.FFTProcessor;
import imseProc.proc.imgFit.ImageFitProcessor;
import imseProc.proc.pitch.PitchProcessor;
import imseProc.proc.seriesAvg.SeriesAverageProcessor;
import imseProc.sensicam.SensicamSource;
import imseProc.stepperMotor.controllers.StepperHanger;
import imseProc.stepperMotor.controllers.StepperSWTController;
import imseProc.proc.transform.TransformProcessor;

/** The IMSE GUI App to tie all the SWT modules together
 * 
 * All the big image and DAC/ADC allocations are done via direct NIO
 * buffers, so it shouldn't need a huge amount of java heap space, but
 * does need the "-XX:MaxDirectMemorySize" setting to be turned up a bit.
 * 
 * Meanwhile, the heap size needs to be kept as small as possible.
 * 
 * Run with something like:
 * -Xms100M -Xmx512M -XX:+UseParNewGC -XX:MinHeapFreeRatio=10
 * -XX:MaxHeapFreeRatio=40 -XX:MaxDirectMemorySize=4096M
 *  
 */
public class IMSEProcAnalysis {
	public static void main(String[] args) {
		new SettingsManager("minerva", true);
				
		Display swtDisplay = new Display();
		
		///ConcurrencyUtils.setThreadPool(IMSEProc.getThreadPool()); //bad idea :(
		   
		//Read data from PCCIS MDS+ DB (HGW Lab)
		
		//Sources need to be instantiated
		GMDSSource mdsSrc = new GMDSSource();		
		NoiseGenSource noiseSrc = new NoiseGenSource(344,260);
		SensicamSource camSrc = new SensicamSource();
		DSHGenSource dshSrc = new DSHGenSource();
		PlatesGenSource platesSrc = new PlatesGenSource();
		
		//Sinks get instantiated as required, but we need to register the classes
		IMSEProc.addImgPipeClass(GraphUtilProcessor.class);
		IMSEProc.addImgPipeClass(GMDSSink.class);
		IMSEProc.addImgPipeClass(FFTProcessor.class);
		IMSEProc.addImgPipeClass(DSHDemod.class);
		IMSEProc.addImgPipeClass(AquisitionHanger.class);
		IMSEProc.addImgPipeClass(DACTimingHanger.class);
		IMSEProc.addImgPipeClass(ArduinoCommHanger.class);
		IMSEProc.addImgPipeClass(TransformProcessor.class);
		IMSEProc.addImgPipeClass(SeriesAverageProcessor.class);
		IMSEProc.addImgPipeClass(ImageFitProcessor.class);
		IMSEProc.addImgPipeClass(PitchProcessor.class);
		
		
		SeriesAverageProcessor seriesAvg = new SeriesAverageProcessor(mdsSrc, 0);		
		FFTProcessor fft = new FFTProcessor(seriesAvg, 0);
		fft.setAutoCalc(true);
		DSHDemod dsh = new DSHDemod(fft, 0); dsh.loadSelectionsFromGMDS("AUG", 0);
		dsh.setAutoCalc(true);
		TransformProcessor trans = new TransformProcessor(dsh, 0);
		trans.setAutoCalc(true);
		PitchProcessor pitch = new PitchProcessor(trans, 0);
		pitch.setAutoCalc(true);
		
		ImageWindow imgWin = new ImageWindow(swtDisplay, mdsSrc, 0);

		IMSEProc.msgLoop(swtDisplay);
		
		IMSEProc.shutdown();
		
		swtDisplay.dispose();
	}
}