//////////////////////////////////////////////////////////////////////
// File - CPIA.H
//
// Library for accessing the CPIA USB Web Cameras devices using
// WinDrive library.
//
// Copyrights (c) Jungo Ltd. 2000
// Written by Nir Borenshtein
//////////////////////////////////////////////////////////////////////

#ifndef _CAMERA_H_
#define _CAMERA_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "windrvr.h"

typedef struct CAMERA_STRUCT
{
    HANDLE              hWD;
    WD_USB_DEVICE_INFO  deviceInfo;
    DWORD               hDevice;
} CAMERA_STRUCT;

typedef struct CAMERA_STRUCT *CAMERA_HANDLE;

// Device state codes
#define LO_POWER_STATE  2
#define HI_POWER_STATE  3
#define SUSPEND_STATE   4

// Indicates which bit is used for each module on error report
#define CPIA        0
#define SYSTEM      1
#define INT_CTRL    2
#define PROCESS     3 
#define USB_COM     4
#define VP_CTRL     5
#define CAPTURE     6
#define DEBUG       7

// Frame configuration
typedef enum 
{            
    QCIF = 0,   // QCIF(176x144) pixels
    CIF = 1     // CIF(352x288) pixels
} FRAME_TYPE;

#define QCIF_ROW_NUM       144
#define QCIF_COL_NUM       176
#define QCIF_BUFFER_SIZE  (67 + QCIF_ROW_NUM * QCIF_COL_NUM * 2 + QCIF_ROW_NUM * 3)
#define QCIF_BYTES_IN_LINE 353
#define CIF_ROW_NUM        288
#define CIF_COL_NUM        352
#define CIF_BUFFER_SIZE  (67 + CIF_ROW_NUM * CIF_COL_NUM * 2 + CIF_ROW_NUM * 3)
#define CIF_BYTES_IN_LINE  705

// SubSample format
typedef enum 
{            
    SS_420 =  0,
    SS_422 =  1
} SUB_SAMPLE;

// Color parameters
#define BRIGHTNESS 50 // 0 to 100
#define CONTRAST   50 // 0 to 100
#define SATURATION 50 // 0 to 100

typedef struct 
{
   FRAME_TYPE frameType;
   DWORD dwBuffSize;
   DWORD dwBytesInLine;
   int frameColNum;
   int frameRowNum;
   SUB_SAMPLE subSample;
   int uniqueId;
} FRAME_INFO;

// CPIA function declaretion
BOOL GrabFrame(PVOID pBuffer, FRAME_INFO frameInfo, BOOL first_time, BOOL last_time);
void GotoLoPower(CAMERA_HANDLE hCAMERA);
void GotoSuspend(CAMERA_HANDLE hCAMERA);
BOOL IsCamHiPwr(CAMERA_HANDLE hCAMERA);
void PrintErrMsg(BYTE rslt, char *errStr);
BOOL IsCmdOrFatalError(CAMERA_HANDLE hCAMERA);
DWORD SetSetupPacket(PVOID pBuffer, DWORD dwBytes, char *strVal);
int SetHexChar(int ch);
BOOL ConvertYUV2RGB(PVOID pYCrCb_Buffer, BYTE *pBGR_Buffer, FRAME_INFO frameInfo);
void YUV2RGB_Calc(BYTE Y, BYTE Cb, BYTE Cr, PBYTE buffer);
BYTE CheckRGBVal(double val);
void StoreFrameOnFile(PVOID pBuffer, DWORD dwBytes, char *fileName);

// WinDrive function and constant declaretion for CPIA devices
enum { CAMERA_DEFAULT_VENDOR_ID  = 0x0553 };
enum { CAMERA_DEFAULT_PRODUCT_ID = 0x0002 };
enum { CAMERA_DEFAULT_CONFIG = 0 };
enum { CAMERA_DEFAULT_INTERFACE = 1 };
enum { CAMERA_DEFAULT_ALTERNATE = 3 };

// This string is set to an error message, if one occurs
extern CHAR CAMERA_ErrorString[];

DWORD CAMERA_CountDevices (DWORD dwVendorID, DWORD dwProductID);
CAMERA_HANDLE CAMERA_Open(DWORD uniqueId, DWORD configIndex, DWORD dwInterface, DWORD dwAlternate);
void CAMERA_Close(CAMERA_HANDLE hCAMERA);
void CAMERA_GetDeviceInfo(CAMERA_HANDLE hCAMERA, WD_USB_DEVICE_INFO *pDevInfo);
DWORD CAMERA_ReadPipe00(CAMERA_HANDLE hCAMERA, PVOID pBuffer, DWORD dwSize, CHAR setupPacket[8]);
DWORD CAMERA_WritePipe00(CAMERA_HANDLE hCAMERA, PVOID pBuffer, DWORD dwSize, CHAR setupPacket[8]);
BOOL CAMERA_ReadPipe81(CAMERA_HANDLE hCAMERA, PVOID pBuffer, DWORD dwSize, DWORD *pdwTransfered);
CAMERA_HANDLE CAMERA_LocateAndOpenDevice(DWORD uniqueId);

#ifdef __cplusplus
}
#endif

#endif