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
 * 
 * Sets up the standard analysis chain
 *  
 */
public class IMSEProcApp {
	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);
		//JotterSource jotter = new JotterSource();
		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(JotterSink.class);
		IMSEProc.addImgPipeClass(GMDSSink.class);
		IMSEProc.addImgPipeClass(FFTProcessor.class);
		IMSEProc.addImgPipeClass(DSHDemod.class);
		//IMSEProc.addImgPipeClass(StepperHanger.class); // The old stepper driver, now done via DACTiming, or ArduinoCommHanger
		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);
			
		ImageWindow imgWin1 = new ImageWindow(swtDisplay, null, 0);
		
		IMSEProc.msgLoop(swtDisplay);
		
		IMSEProc.shutdown();
		
		swtDisplay.dispose();
	}
}