typedef struct _capture{
	SIZE resolution;
	int exposure, gain;
	LPWORD image;
	double *dimage;
} CAPTURE,*PCAPTURE;

typedef struct _fwfft{
	fftw_complex *pFwFFTData;
	SIZE FwFFTresolution;
} FWFFT, *PFWFFT;

typedef struct _comp {
	double re;
    double im;
} complex, *pcomplex;

typedef struct _shift{
	pcomplex inp; // pointer na vstupni pole, vysledek fft
	SIZE  inp_resolution; // velikost vstupniho pole
	int type_shift; // typ shiftovani fft
	SIZE  out_resolution; //velikost pole po konverzi
	int offset; //kde hledat nosnou - vzdalenost v pixelech
	SIZE nosna; // poloha nosne frekvenece
	double intenzitazdroje; // intenzita zdroje
	pcomplex separovana; // pointer na separovane pole
	SIZE velsepar; // velikost separovane casti
	SIZE velsepexp; // velikost separace po expanzi vypocita se
	double *apodizace; // hanningovo okno
	double	apod_koef; // koeficient apodizace
	int expanze; // expanze nulou po separaci

} SHIFT, *PSHIFT;

typedef struct _outp {
	pcomplex data; // vystup rekonstruovanych dat
	SIZE resolution; //velikost vystupniho pole
	double intenzitaZdroje; // intenzita zdroje pro rezistenci vuci kolisani
} output, *poutput;

typedef struct _init {
	int		expozice; //expozice
	int		gain; //zisk
	int		offset; // posunuti od stredu fft kde se hleda nosna 
	SIZE	separxy; // velikost separace
	int		expanz; //expanze nulou
	double	apod;	// koeficient apodizace
	int		threads; // pocet vlaken pro fft
	int		fpsrefr; // po kolika obrazcich se obnovi fps
	int		detekcenosne; // zapnuti nonstop detekce nosne
	int		showacq; // zobrazeni snimku kamery
	SIZE	showacqxy; // velikost nahledu
	int		showamp; // zobrazeni prumerne amplitudy
	SIZE	showampxy; // graf - okno prumerne rekonstruovane amplitudy
	SIZE	posrecA;	// poloha okna amplitudy
	SIZE	posrecF;	// poloha okna faze
	SIZE	posampl;	// poloha okna amplitudy
	SIZE	poscam;		// pozice okna nahledu
	int		regulace;	// zapnuti regulace
	int		SimAF;	// ukladani amplitudy a faze
	int		Scpx;	// ukladani complexni rekonstrukce
	SIZE	posavF; // pozice vyrezu prumerovani faze
	SIZE	posavA; // pozice vyrezu prumerovani amplitudy
	SIZE	posrec3D; // poloha okna 3D rekonstrukce
	int		rec3d; // zapnuti 3d zobrazeni
} initial, *pinitial;


typedef struct _outputdata {
	double fps; // pocet snimku za sekundu
	double avampl; // prumerna rekounstruovana amlituda ze stredu 
	double phase;  // prumerna faze z vyrezu
	int posit; //poloha pieza
	SIZE positionF; // misto kde se bude provadet vyrez faze
	SIZE positionA; // misto kde se bude provadet vyrez amplitudy
} outputdata, *poutputdata;



//extern volatile BOOL bRun;
//extern CAPTURE data;
extern output odata;
extern CRITICAL_SECTION cs_copyBwFFTdata;
extern HANDLE hSemBwFFT,hSemBwFFTReady;
/* extern DWORD	ThreadId;
extern HANDLE hCaptureThread;
extern CRITICAL_SECTION cs_copydata;
*/
extern outputdata recdata; // vystupni rekonstruovana data


//extern void m12_16(LPWORD ip, LPWORD op, int n);
//extern void mv40Unpack12( LPWORD pwDst, double *pDst, LPWORD pwSrc, DWORD dwBuffWidth, DWORD dwHeight, DWORD dwPixSize, DWORD dwField1, DWORD dwWidth);

// ++ vlakno zachytavani obrazu
extern DWORD WINAPI AcquisitionProc( LPVOID );
extern void shStopAcq();
extern BOOL shStartAcq();
// -- vlakno zachytavani obrazu

extern initial inidata; //konfigurace
extern void setting();

// ++ spracovani FFT
extern DWORD WINAPI FwFFTProc( LPVOID );
extern BOOL shStartFwFFT();
extern void shStopFwFFT();
//extern void FwFFTProc();

// ++ spracovani zpetne FFT
extern DWORD WINAPI BwFFTProc( LPVOID );
extern BOOL shStartBwFFT();
extern void shStopBwFFT();
//extern void FwFFTProc();

// -- spracovani zpetne FFT

// ++ zobrazeni
extern volatile BOOL bRunShowRec;
extern DWORD WINAPI ShowRecProc(LPVOID);
extern BOOL shStartShowRec();
extern void shStopShowRec();
//extern void FwFFTProc();

//-- zobrazeni

// handle externi
static HINSTANCE hInstance;


//++ obsluha
//extern "C" _declspec(dllexport) void savesetting();
extern "C" _declspec(dllexport) void Gain(int input); // nastaveni zisku
extern "C" _declspec(dllexport) void Exposure(int input); //nastaveni expozice
extern "C" _declspec(dllexport) int gGain(); // stav zisku
extern "C" _declspec(dllexport) int gExposure(); //stav expozice
extern "C" _declspec(dllexport) void nosna(int input); // nastaveni netekce nosne
extern "C" _declspec(dllexport) int gnosna(); // stav detekce nosne 
extern "C" _declspec(dllexport) double getfps(); // pocet snimku za sekundu
extern "C" _declspec(dllexport) double getavampl(); // prumerna intenzita ze stredu rekonstuovane amplitudy
extern "C" _declspec(dllexport) double getavpha(); // prumerna faze z vyrezu
extern "C" _declspec(dllexport) int getavpos(); // aktualni poloha pieza

//spusteni stabilizace obrazu
extern "C" _declspec(dllexport) void DoRegulace(int input);
extern "C" _declspec(dllexport) int gRegulace();
extern "C" _declspec(dllexport) void setpiezo(int data); // rucni nastaveni pieza vypne stabilizaci a hledani maxima

//spousteni zobrazeni nahledu
extern "C" _declspec(dllexport) void ShowCam(int input);
extern "C" _declspec(dllexport) int gShowCam();

//prubeh amplitudy
extern "C" _declspec(dllexport) void ShowAmpl(int input);
extern "C" _declspec(dllexport) int gShowAmpl();

//3d zobrazeni
extern "C" _declspec(dllexport) void Show3D(int input);
extern "C" _declspec(dllexport) int gShow3D();


//ukladani obrazku a dat  jedno zavolani = jedno ulozeni
extern "C" _declspec(dllexport) void SaveData();

//start
extern "C" _declspec(dllexport) void initialize();
extern "C" _declspec(dllexport) void start();
extern "C" _declspec(dllexport) void deinitialize();
extern "C" _declspec(dllexport) void stop();

//-- obsluha