Newer
Older
TIAS_Imager2 / TIAS_Imager2 / lucamapi.h
/*****************************************************************************
*
* Copyright (c) 2002-2008 Lumenera Corporation. All rights reserved.
*
*****************************************************************************/

#ifndef __LUCAMAPI_H
#define __LUCAMAPI_H



#ifdef LUCAMAPI_EXPORTS
#ifdef __cplusplus
#define LUCAM_API extern "C" __declspec(dllexport)
#else
#define LUCAM_API __declspec(dllexport)
#endif
#else
#ifdef __cplusplus
#define LUCAM_API extern "C" __declspec(dllimport)
#else
#define LUCAM_API __declspec(dllimport)
#endif
#endif

#if (_MSC_VER >= 1300)
#define LUCAM_DEPRECATED   __declspec(deprecated)
#else
#define LUCAM_DEPRECATED
#endif


#define LUCAM_EXPORT __stdcall




//----------- Pixel Format IDs ------------------

#define LUCAM_PF_8                           0
#define LUCAM_PF_16                          1
#define LUCAM_PF_24                          2
#define LUCAM_PF_YUV422                      3
#define LUCAM_PF_COUNT                       4
#define LUCAM_PF_FILTER                      5
#define LUCAM_PF_32                          6
#define LUCAM_PF_48                          7


//----------- Properties ------------------------

#define LUCAM_PROP_BRIGHTNESS                0
#define LUCAM_PROP_CONTRAST            	   1
#define LUCAM_PROP_HUE                       2
#define LUCAM_PROP_SATURATION                3
#define LUCAM_PROP_SHARPNESS                 4
#define LUCAM_PROP_GAMMA                     5

#define LUCAM_PROP_PAN                       16
#define LUCAM_PROP_TILT                      17
#define LUCAM_PROP_ROLL                      18
#define LUCAM_PROP_ZOOM                      19
#define LUCAM_PROP_EXPOSURE                  20
#define LUCAM_PROP_IRIS                      21
#define LUCAM_PROP_FOCUS                     22



#define LUCAM_PROP_GAIN                      40
#define LUCAM_PROP_GAIN_RED                  41
#define LUCAM_PROP_GAIN_BLUE                 42
#define LUCAM_PROP_GAIN_GREEN1               43
#define LUCAM_PROP_GAIN_GREEN2               44
#define LUCAM_PROP_GAIN_MAGENTA              41
#define LUCAM_PROP_GAIN_CYAN                 42
#define LUCAM_PROP_GAIN_YELLOW1              43
#define LUCAM_PROP_GAIN_YELLOW2              44


#define LUCAM_PROP_DEMOSAICING_METHOD        64
#define LUCAM_PROP_CORRECTION_MATRIX         65
#define LUCAM_PROP_FLIPPING                  66

#define LUCAM_PROP_DIGITAL_WHITEBALANCE_U    69 // from -100 to 100
#define LUCAM_PROP_DIGITAL_WHITEBALANCE_V    70 // from -100 to 100
#define LUCAM_PROP_DIGITAL_GAIN              71 // from 0 to 2, 1 means a gain of 1.0
#define LUCAM_PROP_DIGITAL_GAIN_RED          72 // from 0 to 2.5, 1 means a gain of 1.0. Relates to GAIN_Y and WHITEBALANCE
#define LUCAM_PROP_DIGITAL_GAIN_GREEN        73 // from 0 to 2.5, 1 means a gain of 1.0. Relates to GAIN_Y and WHITEBALANCE
#define LUCAM_PROP_DIGITAL_GAIN_BLUE         74 // from 0 to 2.5, 1 means a gain of 1.0. Relates to GAIN_Y and WHITEBALANCE

#define LUCAM_PROP_COLOR_FORMAT              80 // (read only)
#define LUCAM_PROP_MAX_WIDTH                 81 // (read only)
#define LUCAM_PROP_MAX_HEIGHT                82 // (read only)

#define LUCAM_PROP_ABS_FOCUS                 85 // requires the auto lens to be initialized
#define LUCAM_PROP_BLACK_LEVEL               86

#define LUCAM_PROP_KNEE1_EXPOSURE            96
#define LUCAM_PROP_STILL_KNEE1_EXPOSURE      96
#define LUCAM_PROP_KNEE2_EXPOSURE            97
#define LUCAM_PROP_STILL_KNEE2_EXPOSURE      97
#define LUCAM_PROP_STILL_KNEE3_EXPOSURE      98
#define LUCAM_PROP_VIDEO_KNEE                99
#define LUCAM_PROP_KNEE1_LEVEL               99
#define LUCAM_PROP_THRESHOLD                 101
#define LUCAM_PROP_AUTO_EXP_TARGET           103
#define LUCAM_PROP_TIMESTAMPS                105
#define LUCAM_PROP_SNAPSHOT_CLOCK_SPEED      106 // 0 is the fastest
#define LUCAM_PROP_AUTO_EXP_MAXIMUM          107
#define LUCAM_PROP_TEMPERATURE               108
#define LUCAM_PROP_TRIGGER                   110
#define LUCAM_PROP_FRAME_GATE                112
#define LUCAM_PROP_EXPOSURE_INTERVAL         113
#define LUCAM_PROP_PWM                       114
#define LUCAM_PROP_MEMORY                    115 // value is RO and represent # of frames in memory
#define LUCAM_PROP_STILL_STROBE_DURATION     116
#define LUCAM_PROP_FAN                       118
#define LUCAM_PROP_SYNC_MODE                 119
#define LUCAM_PROP_SNAPSHOT_COUNT            120
#define LUCAM_PROP_LSC_X                     121
#define LUCAM_PROP_LSC_Y                     122
#define LUCAM_PROP_AUTO_IRIS_MAX             123
#define LUCAM_PROP_LENS_STABILIZATION        124
#define LUCAM_PROP_VIDEO_TRIGGER             125
#define LUCAM_PROP_KNEE2_LEVEL               163
#define LUCAM_PROP_THRESHOLD_LOW             165
#define LUCAM_PROP_THRESHOLD_HIGH            166
#define LUCAM_PROP_TEMPERATURE2              167
#define LUCAM_PROP_LIGHT_FREQUENCY           168
#define LUCAM_PROP_LUMINANCE                 169
#define LUCAM_PROP_AUTO_GAIN_MAXIMUM         170
#define LUCAM_PROP_AUTO_SHARPNESS_GAIN_THRESHOLD_LOW  171
#define LUCAM_PROP_AUTO_SHARPNESS_GAIN_THRESHOLD_HIGH 172
#define LUCAM_PROP_AUTO_SHARPNESS_LOW        173
#define LUCAM_PROP_AUTO_SHARPNESS_HIGH       174

#define LUCAM_PROP_JPEG_QUALITY              256


#define LUCAM_PROP_FLAG_USE                  0x80000000
#define LUCAM_PROP_FLAG_AUTO                 0x40000000
#define LUCAM_PROP_FLAG_MASTER               0x40000000 // for LUCAM_PROP_SYNC_MODE
#define LUCAM_PROP_FLAG_STROBE_FROM_START_OF_EXPOSURE   0x20000000
#define LUCAM_PROP_FLAG_BACKLASH_COMPENSATION           0x20000000 // LUCAM_PROP_IRIS and LUCAM_PROP_FOCUS
#define LUCAM_PROP_FLAG_USE_FOR_SNAPSHOTS    0x04000000 // For LUCAM_PROP_IRIS
#define LUCAM_PROP_FLAG_POLARITY             0x10000000
#define LUCAM_PROP_FLAG_MEMORY_READBACK      0x08000000 // for LUCAM_PROP_MEMORY
#define LUCAM_PROP_FLAG_BUSY                 0x00040000
#define LUCAM_PROP_FLAG_UNKNOWN_MAXIMUM      0x00020000
#define LUCAM_PROP_FLAG_UNKNOWN_MINIMUM      0x00010000
#define LUCAM_PROP_FLAG_LITTLE_ENDIAN        0x80000000 // for LUCAM_PROP_COLOR_FORMAT
#define LUCAM_PROP_FLAG_ALTERNATE            0x00080000 
#define LUCAM_PROP_FLAG_READONLY             0x00010000 // in caps param of GetPropertyRange

// Prop flags for VIDEO_TRIGGER (also uses LUCAM_PROP_FLAG_USE)
#define LUCAM_PROP_FLAG_HW_ENABLE            0x40000000
#define LUCAM_PROP_FLAG_SW_TRIGGER           0x00200000 // self cleared


// Those flags can be used with the LUCAM_PROP_GAMMA / LUCAM_PROP_BRIGHTNESS / LUCAM_PROP_CONTRAST
// properties. They are available on specifica cameras only.
#define LUCAM_PROP_FLAG_RED                  0x00000001
#define LUCAM_PROP_FLAG_GREEN1               0x00000002
#define LUCAM_PROP_FLAG_GREEN2               0x00000004
#define LUCAM_PROP_FLAG_BLUE                 0x00000008


// Do not access these properties unless you know what you are doing.

#define LUCAM_PROP_STILL_EXPOSURE            50
#define LUCAM_PROP_STILL_GAIN                51
#define LUCAM_PROP_STILL_GAIN_RED            52
#define LUCAM_PROP_STILL_GAIN_GREEN1         53
#define LUCAM_PROP_STILL_GAIN_GREEN2         54
#define LUCAM_PROP_STILL_GAIN_BLUE           55
#define LUCAM_PROP_STILL_GAIN_MAGENTA        52
#define LUCAM_PROP_STILL_GAIN_YELLOW1        53
#define LUCAM_PROP_STILL_GAIN_YELLOW2        54
#define LUCAM_PROP_STILL_GAIN_CYAN           55


// color pattern for the LUCAM_PROP_COLOR_FORMAT property
#define LUCAM_CF_MONO                        0
#define LUCAM_CF_BAYER_RGGB                  8
#define LUCAM_CF_BAYER_GRBG                  9
#define LUCAM_CF_BAYER_GBRG                  10
#define LUCAM_CF_BAYER_BGGR                  11
#define LUCAM_CF_BAYER_CYYM                  16
#define LUCAM_CF_BAYER_YCMY                  17
#define LUCAM_CF_BAYER_YMCY                  18
#define LUCAM_CF_BAYER_MYYC                  19

// parameter for the LUCAM_PROP_FLIPPING property
#define LUCAM_PROP_FLIPPING_NONE             0
#define LUCAM_PROP_FLIPPING_X                1
#define LUCAM_PROP_FLIPPING_Y                2
#define LUCAM_PROP_FLIPPING_XY               3



//----------- Version Structure ------------------

typedef struct {
		ULONG firmware; 	// Firmware version
		ULONG fpga; 		// FPGA version
		ULONG api;			// API version
		ULONG driver; 		// Device driver version
      ULONG serialnumber; // of the camera
      ULONG reserved;   // do not use
} LUCAM_VERSION;


//------------- Frame format --------------------

typedef struct {
   ULONG xOffset; 	// x coordinate on imager of top left corner of subwindow in pixels
   ULONG yOffset; 	// y coordinate on imager of top left corner of subwindow in pixels
   ULONG width; 	// width in pixels of subwindow
   ULONG height; 	// height in pixels of subwindow
   ULONG pixelFormat; // pixel format for data
   union
   {
      USHORT subSampleX;	// sub-sample ratio in x direction in pixels (x:1)
      USHORT binningX;	// binning ratio in x direction in pixels (x:1)
   };
   USHORT flagsX; // LUCAM_FRAME_FORMAT_FLAGS_*
   union
   {
      USHORT subSampleY;  // sub-sample ratio in y direction in pixels (y:1)
      USHORT binningY;	// binning ratio in y direction in pixels (y:1)
   };
   USHORT flagsY; // LUCAM_FRAME_FORMAT_FLAGS_*
} LUCAM_FRAME_FORMAT;

#define LUCAM_FRAME_FORMAT_FLAGS_BINNING     0x0001


//------------ Snapshot Settings Structure -------


typedef struct {
		FLOAT exposure;		// Exposure in milliseconds
		FLOAT gain;			// Overall gain as a multiplicative factor
        union {
         struct {
          FLOAT gainRed; 	// Gain for Red pixels as multiplicative factor
          FLOAT gainBlue; 	// Gain for Blue pixels as multiplicative factor
          FLOAT gainGrn1; 	// Gain for Green pixels on Red rows as multiplicative factor
          FLOAT gainGrn2; 	// Gain for Green pixels on Blue rows as multiplicative factor
         };
         struct {  
          FLOAT gainMag; 	// Gain for Magenta pixels as multiplicative factor
          FLOAT gainCyan; 	// Gain for Cyan pixels as multiplicative factor
          FLOAT gainYel1; 	// Gain for Yellow pixels on Magenta rows as multiplicative factor
          FLOAT gainYel2; 	// Gain for Yellow pixels on Cyan rows as multiplicative factor
         };
        };
      union
      {
		   BOOL useStrobe;		// for backward compatibility
         ULONG strobeFlags;   // use LUCAM_PROP_FLAG_USE and/or LUCAM_PROP_FLAG_STROBE_FROM_START_OF_EXPOSURE
      };
		FLOAT strobeDelay;	// time interval from when exposure starts to time the flash is fired in milliseconds
		BOOL useHwTrigger;	// wait for hardware trigger
		FLOAT timeout;		// maximum time to wait for hardware trigger prior to returning from function in milliseconds
      LUCAM_FRAME_FORMAT format;   // frame format for data
      ULONG shutterType;
      FLOAT exposureDelay;
      union
      {
         BOOL bufferlastframe;   // set to TRUE if you want TakeFastFrame to return an already received frame.
         ULONG ulReserved1;
      };
      ULONG ulReserved2;   // must be set to 0
      FLOAT flReserved1;   // must be set to 0
      FLOAT flReserved2;   // must be set to 0
} LUCAM_SNAPSHOT;


//------------ Streaming Video Modes --------------

#define STOP_STREAMING	0
#define START_STREAMING 1
#define START_DISPLAY	2
#define PAUSE_STREAM    3
#define START_RGBSTREAM 6

//------------ Streaming AVI Modes --------------
#define STOP_AVI 0
#define START_AVI 1
#define PAUSE_AVI 2

//------------ Parameters for AVI types --------------
#define AVI_RAW_LUMENERA	0
#define AVI_STANDARD_24		1
#define AVI_STANDARD_32		2
#define AVI_XVID_24			3
#define AVI_STANDARD_8     4 // for monochrome only


//---------- Parameters for LucamConvertFrameToRgb24 --------------

typedef struct
{
    ULONG DemosaicMethod;
    ULONG CorrectionMatrix;
    
}LUCAM_CONVERSION;

// to use with LUCAM_CONVERSION.DemosaicMethod
#define LUCAM_DM_NONE                   0
#define LUCAM_DM_FAST                   1
#define LUCAM_DM_HIGH_QUALITY           2
#define LUCAM_DM_HIGHER_QUALITY         3
#define LUCAM_DM_SIMPLE                 8


// to use with LUCAM_CONVERSION.CorrectionMatrix
#define LUCAM_CM_NONE                   0
#define LUCAM_CM_FLUORESCENT            1
#define LUCAM_CM_DAYLIGHT               2
#define LUCAM_CM_INCANDESCENT           3
#define LUCAM_CM_XENON_FLASH            4
#define LUCAM_CM_HALOGEN                5

#define LUCAM_CM_IDENTITY               14
#define LUCAM_CM_CUSTOM                 15


//----------- Shutter types ------------

#define LUCAM_SHUTTER_TYPE_GLOBAL         0
#define LUCAM_SHUTTER_TYPE_ROLLING        1


//----------- Extern interfaces -------

#define LUCAM_EXTERN_INTERFACE_USB1       1
#define LUCAM_EXTERN_INTERFACE_USB2       2



//---------- Functions ----------------

LUCAM_API LONG LUCAM_EXPORT LucamNumCameras(void);
LUCAM_API LONG LUCAM_EXPORT LucamEnumCameras(LUCAM_VERSION *pVersionsArray, ULONG arrayCount);

LUCAM_API HANDLE LUCAM_EXPORT LucamCameraOpen(ULONG index);
LUCAM_API BOOL LUCAM_EXPORT LucamCameraClose(HANDLE hCamera);
LUCAM_API BOOL LUCAM_EXPORT LucamCameraReset(HANDLE hCamera);

LUCAM_API BOOL LUCAM_EXPORT LucamQueryVersion(HANDLE hCamera, LUCAM_VERSION *pVersion);
LUCAM_API BOOL LUCAM_EXPORT LucamQueryExternInterface(HANDLE hCamera, ULONG *pExternInterface);
LUCAM_API BOOL LUCAM_EXPORT LucamGetCameraId(HANDLE hCamera, ULONG *pId);

LUCAM_API BOOL LUCAM_EXPORT LucamGetProperty(HANDLE hCamera, ULONG property, FLOAT *pValue, LONG *pFlags);
LUCAM_API BOOL LUCAM_EXPORT LucamSetProperty(HANDLE hCamera, ULONG property, FLOAT value, LONG flags);
LUCAM_API BOOL LUCAM_EXPORT LucamPropertyRange(HANDLE hCamera, ULONG property, FLOAT *pMin, FLOAT *pMax, FLOAT *pDefault, LONG *pFlags);

LUCAM_API BOOL LUCAM_EXPORT LucamDisplayPropertyPage(HANDLE hCamera, HWND parentWnd);
LUCAM_API BOOL LUCAM_EXPORT LucamDisplayVideoFormatPage(HANDLE hCamera, HWND parentWnd);

LUCAM_API BOOL LUCAM_EXPORT LucamQueryDisplayFrameRate(HANDLE hCamera, FLOAT *pValue);

LUCAM_API BOOL LUCAM_EXPORT LucamCreateDisplayWindow(HANDLE hCamera, LPCTSTR lpTitle = NULL, DWORD dwStyle = WS_OVERLAPPED|WS_MINIMIZEBOX|WS_CAPTION|WS_SYSMENU|WS_VISIBLE, int x = 0, int y = 0, int width = 0, int height = 0, HWND parent = NULL, HMENU childId = NULL);
LUCAM_API BOOL LUCAM_EXPORT LucamDestroyDisplayWindow(HANDLE hCamera);
LUCAM_API BOOL LUCAM_EXPORT LucamAdjustDisplayWindow(HANDLE hCamera, LPCTSTR lpTitle = NULL, int x = 0, int y = 0, int width = 0, int height = 0);

LUCAM_API BOOL LUCAM_EXPORT LucamReadRegister(HANDLE hCamera, LONG address, LONG numReg, LONG *pValue);
LUCAM_API BOOL LUCAM_EXPORT LucamWriteRegister(HANDLE hCamera, LONG address, LONG numReg, LONG *pValue);

LUCAM_API BOOL LUCAM_EXPORT LucamSetFormat(HANDLE hCamera, LUCAM_FRAME_FORMAT *pFormat, FLOAT frameRate);
LUCAM_API BOOL LUCAM_EXPORT LucamGetFormat(HANDLE hCamera, LUCAM_FRAME_FORMAT *pFormat, FLOAT *pFrameRate);

LUCAM_API ULONG LUCAM_EXPORT LucamEnumAvailableFrameRates(HANDLE hCamera, ULONG entryCount, FLOAT *pAvailableFrameRates);

LUCAM_API BOOL LUCAM_EXPORT LucamStreamVideoControl (HANDLE hCamera, ULONG controlType, HWND hWnd);
LUCAM_API BOOL LUCAM_EXPORT LucamStreamVideoControlAVI (HANDLE hCamera, ULONG controlType, LPCWSTR pFileName, HWND hWnd);

LUCAM_API BOOL LUCAM_EXPORT LucamTakeVideo(HANDLE hCamera, LONG numFrames, BYTE *pData);
LUCAM_API BOOL LUCAM_EXPORT LucamTakeVideoEx(HANDLE hCamera, BYTE *pData, ULONG *pLength, ULONG timeout);
LUCAM_API BOOL LUCAM_EXPORT LucamCancelTakeVideo(HANDLE hCamera);

LUCAM_API BOOL LUCAM_EXPORT LucamTakeSnapshot(HANDLE hCamera, LUCAM_SNAPSHOT *pSettings, BYTE *pData);

LUCAM_API LUCAM_DEPRECATED BOOL LUCAM_EXPORT LucamSaveImage(ULONG width, ULONG height, ULONG pixelFormat, BYTE *pData, const CHAR *pFilename);
LUCAM_API BOOL LUCAM_EXPORT LucamSaveImageEx(HANDLE hCamera, ULONG width, ULONG height, ULONG pixelFormat, BYTE *pData, const CHAR *pFilename);
LUCAM_API LUCAM_DEPRECATED BOOL LUCAM_EXPORT LucamSaveImageW(ULONG width, ULONG height, ULONG pixelFormat, BYTE *pData, const WCHAR *pFilename);
LUCAM_API BOOL LUCAM_EXPORT LucamSaveImageWEx(HANDLE hCamera, ULONG width, ULONG height, ULONG userPixelFormat, BYTE *pData, const WCHAR *pWFilename);

LUCAM_API LONG LUCAM_EXPORT LucamAddStreamingCallback(HANDLE hCamera, VOID (__stdcall *VideoFilter)(VOID *pContext, BYTE *pData, ULONG dataLength), VOID *pCBContext);
LUCAM_API BOOL LUCAM_EXPORT LucamRemoveStreamingCallback(HANDLE hCamera, LONG callbackId);

LUCAM_API LONG LUCAM_EXPORT LucamAddRgbPreviewCallback(HANDLE hCamera, VOID (__stdcall *RgbVideoFilter)(VOID *pContext, BYTE *pData, ULONG dataLength, ULONG unused), VOID *pContext, ULONG rgbPixelFormat);
LUCAM_API BOOL LUCAM_EXPORT LucamRemoveRgbPreviewCallback(HANDLE hCamera, LONG callbackId);
LUCAM_API BOOL LUCAM_EXPORT LucamQueryRgbPreviewPixelFormat(HANDLE hCamera, ULONG *pRgbPixelFormat);

LUCAM_API LONG LUCAM_EXPORT LucamAddSnapshotCallback(HANDLE hCamera, VOID (__stdcall *SnapshotCallback)(VOID *pContext, BYTE *pData, ULONG dataLength), VOID *pCBContext);
LUCAM_API BOOL LUCAM_EXPORT LucamRemoveSnapshotCallback(HANDLE hCamera, LONG callbackId);

LUCAM_API BOOL LUCAM_EXPORT LucamConvertFrameToRgb24(HANDLE hCamera, BYTE *pDest, BYTE *pSrc, ULONG width, ULONG height, ULONG pixelFormat, LUCAM_CONVERSION *pParams);
LUCAM_API BOOL LUCAM_EXPORT LucamConvertFrameToRgb32(HANDLE hCamera, BYTE *pDest, BYTE *pSrc, ULONG width, ULONG height, ULONG pixelFormat, LUCAM_CONVERSION *pParams);
LUCAM_API BOOL LUCAM_EXPORT LucamConvertFrameToRgb48(HANDLE hCamera, USHORT *pDest, USHORT *pSrc, ULONG width, ULONG height, ULONG userPixelFormat, LUCAM_CONVERSION *pParams);
LUCAM_API BOOL LUCAM_EXPORT LucamConvertFrameToGreyscale8(HANDLE hCamera, BYTE *pDest, BYTE *pSrc, ULONG width, ULONG height, ULONG userPixelFormat, LUCAM_CONVERSION *pParams);
LUCAM_API BOOL LUCAM_EXPORT LucamConvertFrameToGreyscale16(HANDLE hCamera, USHORT *pDest, USHORT *pSrc, ULONG width, ULONG height, ULONG userPixelFormat, LUCAM_CONVERSION *pParams);
LUCAM_API VOID LUCAM_EXPORT LucamConvertBmp24ToRgb24(UCHAR *pFrame, ULONG width, ULONG height);

//This function is used for converting a raw AVI to a standard AVI
LUCAM_API BOOL LUCAM_EXPORT LucamConvertRawAVIToStdVideo(HANDLE hCamera, const WCHAR *pOutputFileName, const WCHAR *pInputFileName, ULONG outputType);

//The 3 next functions are used for previewing raw AVI files
LUCAM_API HANDLE LUCAM_EXPORT LucamPreviewAVIOpen(const WCHAR *pFileName);
LUCAM_API BOOL LUCAM_EXPORT LucamPreviewAVIClose(HANDLE hAVI);
LUCAM_API BOOL LUCAM_EXPORT LucamPreviewAVIControl(HANDLE hAVI, ULONG previewControlType, HWND previewWindow);
LUCAM_API BOOL LUCAM_EXPORT LucamPreviewAVIGetDuration(HANDLE hAVI, LONGLONG *pDurationMinutes, LONGLONG *pDurationSeconds, LONGLONG *pDurationMilliseconds, LONGLONG *pDurationMicroSeconds);
LUCAM_API BOOL LUCAM_EXPORT LucamPreviewAVIGetFrameCount(HANDLE hAVI, LONGLONG *pFrameCount);
LUCAM_API BOOL LUCAM_EXPORT LucamPreviewAVIGetFrameRate(HANDLE hAVI, FLOAT *pFrameRate);
LUCAM_API BOOL LUCAM_EXPORT LucamPreviewAVIGetPositionTime(HANDLE hAVI, LONGLONG *pPositionMinutes, LONGLONG *pPositionSeconds, LONGLONG *pPositionMilliSeconds, LONGLONG *pPositionMicroSeconds);
LUCAM_API BOOL LUCAM_EXPORT LucamPreviewAVIGetPositionFrame(HANDLE hAVI, LONGLONG *pPositionCurrentFrame);
LUCAM_API BOOL LUCAM_EXPORT LucamPreviewAVISetPositionTime(HANDLE hAVI, LONGLONG pPositionMinutes, LONGLONG pPositionSeconds, LONGLONG pPositionMilliSeconds, LONGLONG pPositionMicroSeconds);
LUCAM_API BOOL LUCAM_EXPORT LucamPreviewAVISetPositionFrame(HANDLE hAVI, LONGLONG pPositionFrame);
LUCAM_API BOOL LUCAM_EXPORT LucamPreviewAVIGetFormat(HANDLE hAVI, LONG *width, LONG *height, LONG *fileType, LONG *bitDepth);


LUCAM_API BOOL LUCAM_EXPORT LucamSetupCustomMatrix(HANDLE hCamera, FLOAT *pMatrix);
LUCAM_API BOOL LUCAM_EXPORT LucamGetCurrentMatrix(HANDLE hCamera, FLOAT *pMatrix);

LUCAM_API BOOL LUCAM_EXPORT LucamEnableFastFrames(HANDLE hCamera, LUCAM_SNAPSHOT *pSettings);
LUCAM_API BOOL LUCAM_EXPORT LucamTakeFastFrame(HANDLE hCamera, BYTE *pData);
LUCAM_API BOOL LUCAM_EXPORT LucamForceTakeFastFrame(HANDLE hCamera, BYTE *pData);
LUCAM_API BOOL LUCAM_EXPORT LucamTakeFastFrameNoTrigger(HANDLE hCamera, BYTE *pData);
LUCAM_API BOOL LUCAM_EXPORT LucamDisableFastFrames(HANDLE hCamera);
LUCAM_API BOOL LUCAM_EXPORT LucamSetTriggerMode(HANDLE hCamera, BOOL useHwTrigger);
LUCAM_API BOOL LUCAM_EXPORT LucamTriggerFastFrame(HANDLE hCamera);
LUCAM_API BOOL LUCAM_EXPORT LucamCancelTakeFastFrame(HANDLE hCamera);

LUCAM_API HANDLE LUCAM_EXPORT LucamEnableSynchronousSnapshots(ULONG numberOfCameras, HANDLE *phCameras, LUCAM_SNAPSHOT **ppSettings);
LUCAM_API BOOL LUCAM_EXPORT LucamTakeSynchronousSnapshots(HANDLE syncSnapsHandle, BYTE **ppBuffers);
LUCAM_API BOOL LUCAM_EXPORT LucamDisableSynchronousSnapshots(HANDLE syncSnapsHandle);

LUCAM_API BOOL LUCAM_EXPORT LucamGpioRead(HANDLE hCamera, BYTE *pGpoValues, BYTE *pGpiValues);
LUCAM_API BOOL LUCAM_EXPORT LucamGpioWrite(HANDLE hCamera, BYTE gpoValues);
LUCAM_API BOOL LUCAM_EXPORT LucamGpoSelect(HANDLE hCamera, BYTE gpoEnable); // Selects between GPO output or alternate function
LUCAM_API BOOL LUCAM_EXPORT LucamGpioConfigure(HANDLE hCamera, BYTE enableOutput); // Enables output drive on a pin.

LUCAM_API BOOL LUCAM_EXPORT LucamOneShotAutoExposure(HANDLE hCamera, UCHAR target, ULONG startX, ULONG startY, ULONG width, ULONG height);
LUCAM_API BOOL LUCAM_EXPORT LucamOneShotAutoWhiteBalance(HANDLE hCamera, ULONG startX, ULONG startY, ULONG width, ULONG height);
LUCAM_API BOOL LUCAM_EXPORT LucamOneShotAutoWhiteBalanceEx(HANDLE hCamera, float redOverGreen, float blueOverGreen, ULONG startX, ULONG startY, ULONG width, ULONG height);
LUCAM_API BOOL LUCAM_EXPORT LucamDigitalWhiteBalance(HANDLE hCamera, ULONG startX, ULONG startY, ULONG width, ULONG height);
LUCAM_API BOOL LUCAM_EXPORT LucamDigitalWhiteBalanceEx(HANDLE hCamera, float redOverGreen, float blueOverGreen, ULONG startX, ULONG startY, ULONG width, ULONG height);
LUCAM_API BOOL LUCAM_EXPORT LucamAdjustWhiteBalanceFromSnapshot(HANDLE hCamera, LUCAM_SNAPSHOT *pSettings, BYTE *pData, float redOverGreen, float blueOverGreen, ULONG startX, ULONG startY, ULONG width, ULONG height);
LUCAM_API BOOL LUCAM_EXPORT LucamOneShotAutoIris(HANDLE hCamera, UCHAR target, ULONG startX, ULONG startY, ULONG width, ULONG height);
LUCAM_API BOOL LUCAM_EXPORT LucamContinuousAutoExposureEnable(HANDLE hCamera, UCHAR target, ULONG startX, ULONG startY, ULONG width, ULONG height, FLOAT lightingPeriod);
LUCAM_API BOOL LUCAM_EXPORT LucamContinuousAutoExposureDisable(HANDLE hCamera);

LUCAM_API BOOL LUCAM_EXPORT LucamAutoFocusStart(HANDLE hCamera, ULONG startX, ULONG startY, ULONG width, ULONG height, FLOAT putZeroThere1, FLOAT putZeroThere2, FLOAT putZeroThere3, BOOL (__stdcall * ProgressCallback)(void *context, FLOAT percentageCompleted), void *contextForCallback);
LUCAM_API BOOL LUCAM_EXPORT LucamAutoFocusWait(HANDLE hCamera, DWORD timeout);
LUCAM_API BOOL LUCAM_EXPORT LucamAutoFocusStop(HANDLE hCamera);
LUCAM_API BOOL LUCAM_EXPORT LucamAutoFocusQueryProgress(HANDLE hCamera, FLOAT *pPercentageCompleted);
LUCAM_API BOOL LUCAM_EXPORT LucamInitAutoLens(HANDLE hCamera, BOOL force);

LUCAM_API BOOL LUCAM_EXPORT LucamSetup8bitsLUT(HANDLE hCamera, UCHAR *pLut, ULONG length);   // length must be 0 or 256
LUCAM_API BOOL LUCAM_EXPORT LucamSetup8bitsColorLUT(HANDLE hCamera, UCHAR *pLut, ULONG length, BOOL applyOnRed, BOOL applyOnGreen1, BOOL applyOnGreen2 , BOOL applyOnBlue);   // length must be 0 or 256

LUCAM_API int LUCAM_EXPORT LucamRs232Transmit(HANDLE hCamera, char *pData, int length);
LUCAM_API int LUCAM_EXPORT LucamRs232Receive(HANDLE hCamera, char *pData, int maxLength);
LUCAM_API BOOL LUCAM_EXPORT LucamAddRs232Callback(HANDLE hCamera, void (__stdcall * callback)(void *), void *context);
LUCAM_API VOID LUCAM_EXPORT LucamRemoveRs232Callback(HANDLE hCamera);

LUCAM_API BOOL LUCAM_EXPORT LucamPermanentBufferRead(HANDLE hCamera, UCHAR *pBuf, ULONG offset, ULONG length);
LUCAM_API BOOL LUCAM_EXPORT LucamPermanentBufferWrite(HANDLE hCamera, UCHAR *pBuf, ULONG offset, ULONG length);

LUCAM_API BOOL LUCAM_EXPORT LucamGetTruePixelDepth(HANDLE hCamera, ULONG *pCount);

LUCAM_API BOOL LUCAM_EXPORT LucamSetTimeout(HANDLE hCamera, BOOL still, FLOAT timeout);

LUCAM_API ULONG LUCAM_EXPORT LucamGetLastError(void);
LUCAM_API ULONG LUCAM_EXPORT LucamGetLastErrorForCamera(HANDLE hCamera);

// New Structure used for the new conversion functions

typedef struct _LUCAM_CONVERSION_PARAMS
{
   ULONG Size;  // of this structure
   ULONG DemosaicMethod;
   ULONG CorrectionMatrix;
   BOOL FlipX;
   BOOL FlipY;
   FLOAT Hue;
   FLOAT Saturation;
   BOOL UseColorGainsOverWb;
   union
   {
      struct
      {
         FLOAT DigitalGain;
         FLOAT DigitalWhiteBalanceU;
         FLOAT DigitalWhiteBalanceV;
      };
      struct
      {
         FLOAT DigitalGainRed;
         FLOAT DigitalGainGreen;
         FLOAT DigitalGainBlue;
      };
   };
}LUCAM_CONVERSION_PARAMS, *PLUCAM_CONVERSION_PARAMS;


typedef struct _LUCAM_IMAGE_FORMAT
{
   ULONG Size; // of this structure
   ULONG Width;
   ULONG Height;
   ULONG PixelFormat;
   ULONG ImageSize;

   ULONG LucamReserved[8];

}LUCAM_IMAGE_FORMAT, *PLUCAM_IMAGE_FORMAT;

LUCAM_API BOOL LUCAM_EXPORT LucamGetVideoImageFormat(HANDLE hCamera, LUCAM_IMAGE_FORMAT *pImageFormat);
LUCAM_API BOOL LUCAM_EXPORT LucamGetStillImageFormat(HANDLE hCamera, LUCAM_IMAGE_FORMAT *pImageFormat);

LUCAM_API BOOL LUCAM_EXPORT LucamConvertFrameToRgb24Ex(HANDLE hCamera, BYTE *pDest, const BYTE *pSrc, const LUCAM_IMAGE_FORMAT *pImageFormat, const LUCAM_CONVERSION_PARAMS *pParams);
LUCAM_API BOOL LUCAM_EXPORT LucamConvertFrameToRgb32Ex(HANDLE hCamera, BYTE *pDest, const BYTE *pSrc, const LUCAM_IMAGE_FORMAT *pImageFormat, const LUCAM_CONVERSION_PARAMS *pParams);
LUCAM_API BOOL LUCAM_EXPORT LucamConvertFrameToRgb48Ex(HANDLE hCamera, USHORT *pDest, const USHORT *pSrc, const LUCAM_IMAGE_FORMAT *pImageFormat, const LUCAM_CONVERSION_PARAMS *pParams);
LUCAM_API BOOL LUCAM_EXPORT LucamConvertFrameToGreyscale8Ex(HANDLE hCamera, BYTE *pDest, const BYTE *pSrc, LUCAM_IMAGE_FORMAT *pImageFormat, LUCAM_CONVERSION_PARAMS *pParams);
LUCAM_API BOOL LUCAM_EXPORT LucamConvertFrameToGreyscale16Ex(HANDLE hCamera, USHORT *pDest, const USHORT *pSrc, LUCAM_IMAGE_FORMAT *pImageFormat, LUCAM_CONVERSION_PARAMS *pParams);


LUCAM_API PVOID LUCAM_EXPORT LucamRegisterEventNotification(HANDLE hCamera, DWORD eventId, HANDLE hEvent);
LUCAM_API BOOL LUCAM_EXPORT LucamUnregisterEventNotification(HANDLE hCamera, PVOID pEventInformation);

// For use with LucamRegisterEventNotification
#define LUCAM_EVENT_START_OF_READOUT         2
#define LUCAM_EVENT_GPI1_CHANGED             4
#define LUCAM_EVENT_GPI2_CHANGED             5
#define LUCAM_EVENT_GPI3_CHANGED             6
#define LUCAM_EVENT_GPI4_CHANGED             7
#define LUCAM_EVENT_DEVICE_SURPRISE_REMOVAL  32


LUCAM_API BOOL LUCAM_EXPORT LucamPerformDualTapCorrection(HANDLE hCamera, BYTE *pFrame, const LUCAM_IMAGE_FORMAT *pImageFormat);
LUCAM_API BOOL LUCAM_EXPORT LucamPerformMonoGridCorrection(HANDLE hCamera, BYTE *pFrame, const LUCAM_IMAGE_FORMAT *pImageFormat);

LUCAM_API BOOL LUCAM_EXPORT LucamGetImageIntensity(HANDLE hCamera, BYTE *pFrame, LUCAM_IMAGE_FORMAT *pImageFormat , ULONG startX, ULONG startY, ULONG width, ULONG height, FLOAT *pIntensity, FLOAT *pRedIntensity, FLOAT *pGreen1Intensity, FLOAT *pGreen2Intensity, FLOAT *pBlueIntensity);

LUCAM_API BOOL LUCAM_EXPORT LucamAutoRoiGet(HANDLE hCamera, LONG *pStartX, LONG *pStartY, LONG *pWidth, LONG *pHeight);
LUCAM_API BOOL LUCAM_EXPORT LucamAutoRoiSet(HANDLE hCamera, LONG startX, LONG startY, LONG width, LONG height);


#endif // __LUCAMAPI_H