package sensicamJNI;

import java.util.HashMap;
import java.util.Map;

/** Stuff from sencam_def.h */
public abstract class SencamDef {

	public static final int MAXBOARD = 8;
	public static final int MAXTAB = 400;
	public static final int MAXBUF = 64;

	//new structure
	public static class cam_param implements Cloneable {
		//values for communication with correct board
		public long hdriver;
		public int boardnr;

		//values readout from camera at init
		public int boardtyp;
		public int boardrev;
		public int  cam_typ;                       //cameratyp
		public int  cam_ccd;                       //camera ccd
		public int  cam_id;                        //camera id
		public int  ccdwidth;
		public int  ccdheight;
		public int  bit_pix;
		
		@Override
		public cam_param clone() throws CloneNotSupportedException { return (cam_param)super.clone(); }

		public Map<String, Object> toMap(String prefix) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put(prefix + "/boardtyp", boardtyp);	
			map.put(prefix + "/boardrev", boardrev);	
			map.put(prefix + "/cam_typ", cam_typ);	
			map.put(prefix + "/cam_ccd", cam_ccd);	
			map.put(prefix + "/cam_id", cam_id);	
			map.put(prefix + "/ccdwidth", ccdwidth);	
			map.put(prefix + "/ccdheight", ccdheight);	
			map.put(prefix + "/bit_pix", bit_pix);	
			return map;
		}
	};


	public static class cam_values implements Cloneable {
		//values for all cameras  by different functions
		public int  runcoc;                        //current start_coc value
		public int  pic_in_buf;                    //pictures in buffer
		public int  ccdtemp;                       //actual ccd temperature
		public int  eletemp;                       //actual electronic temperature

		public int  readtime;                      //ms full frame time, lib header says: "readouttime in ms (beltime+coctime)"
		public float coctime;						//us Seems to be the intrinsic bit
		public float beltime;						//us Seems to be exp+del+a tiny bit
		public float exptime;						//us exposure time
		public float deltime;						//us delay time 
		
		@Override
		public cam_values clone() { try{ return (cam_values)super.clone(); } catch(CloneNotSupportedException e){ return null; } }

		public Map<String, Object> toMap(String prefix) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put(prefix + "/readtime", readtime);	
			map.put(prefix + "/coctime", coctime);	
			map.put(prefix + "/beltime", beltime);	
			map.put(prefix + "/exptime", exptime);
			map.put(prefix + "/deltime", deltime);
			return map;
		}
		
		public double totalFrameTimeMS(){ 
			return (beltime + coctime) / 1000; //this is the same as readtime, but it is only an int 
		}

	};


	public static class cam_settings implements Cloneable {
		//values for all cameras  by setcoc
		public int  submode;                      //mode of camera
		public int  aoixmin;                      //aoixmin value
		public int  aoixmax;                      //aoixmax value
		public int  aoiymin;                      //aoiymin value
		public int  aoiymax;                      //aoiymax value
		public int  vbin;                         //vertical binning value
		public int  hbin;                         //horizontal binning value
		public int  trig;                         //trigger settings
		// 0=SW
		// 0x01=UP
		// 0x02=DOWN
		// 0x0100= pre UP
		// 0x0200= pre DOWN
		public int  gain;                         //enable and value of gain
		//some ccd support blacklines at top of picture
		public int blacklines;

		public int  tab[] = new int[MAXTAB];                  //current time and delay values

		public int  multiply_val;
		public int  nominal_temp;
		public int  minimal_ccdtemp;

		@Override
		public cam_settings clone() throws CloneNotSupportedException { return (cam_settings)super.clone(); }
	};

	public static class dicam_set implements Cloneable {
		//dicampro camera
		public int  pulser;                       //pulser built in dicampro
		public int  mindelpulser;                 //minimal delay between to Pulses of pulser
		public int  dicam_wait;
		
		@Override
		public dicam_set clone() throws CloneNotSupportedException { return (dicam_set)super.clone(); }
	};

	public static class sen_buflist implements Cloneable {
		public int bufnr;
		public long status; //actually DWORD
		public long counter; //actually DWORD
		public long wait_ev;
		
		@Override
		public sen_buflist clone() throws CloneNotSupportedException { return (sen_buflist)super.clone(); }
	};

	//runcoc
	public static final int CAM_STOPPED = 0xFF;
	public static final int CAM_CONT    = 0x00;
	public static final int CAM_SINGLE  = 0x04;

	public static final int PICIN  = 0x04000000;


	public static final int SEN_HEAD_EVENT    = 0x0000;
	public static final int SEN_EVENT_ENABLE  =(0x0000<<16);
	public static final int SEN_EVENT_DISABLE =(0x8000<<16);
	//public static final int SEN_HEAD_EVENT_ENABLE   = PCC_HEAD_EVENT + PCC_EVENT_ENABLE;
	//public static final int SEN_HEAD_EVENT_DISABLE  = PCC_HEAD_EVENT + PCC_EVENT_DISABLE;
	

	/** Trigger modes from the manual. (not actually defined in senlib) */
	public static final int TRIG_SEQ_AUTO = 0x000; 
	public static final int TRIG_SEQ_RISING = 0x100;
	public static final int TRIG_SEQ_FALLING = 0x200;	
	public static final int TRIG_FRAME_AUTO = 0x000;
	public static final int TRIG_FRAME_RISING = 0x001;
	public static final int TRIG_FRAME_FALLING = 0x002;
	
	
}
