📄 camapi.c
字号:
#include "portab_new.h"
#include "346reg.h"
#include "camconfig.h"
#include "camapi.h"
#include "globlapi.h"
#include "uhapi.h"
#include "devgpio.h"
#include "idevapi.h"
typedef enum
{
CLC346_BMP_CAPTURE = 0x0001,
CLC346_PREVIEW_ON = 0x0002,
CLC346_STILL_CAPTURE = 0x0004,
CLC346_CONTINUOUS_CAPTURE = 0x0008,
CLC346_MOVIE_CAPTURE = 0x0010,
CLC346_DO_STILL_DECODE = 0x0020,
CLC346_DO_MOVIE_DECODE = 0x0040,
CLC346_DO_STILL_UPLOAD = 0x0080,
CLC346_DO_MOVIE_UPLOAD = 0x0100,
CLC346_DO_STILL_DOWNLOAD = 0x0200,
CLC346_DO_MOVIE_DOWNLOAD = 0x0400,
CLC346_OSD_CAPTURE = 0x0800,
CLC346_RESERVED0 = 0x1000,
CLC346_JPEGTOBMP = 0x2000,
CLC346_RESERVED1 = 0x4000,
CLC346_BMPTOJPEG = 0x8000
} CLC346_CAMFUNCTION_ENUM;
typedef enum
{
CLC346_LCD_FREE = 0x0001,
CLC346_IMAGE_CAPTURE_DONE = 0x0002,
CLC346_IMAGE_CAPTURE_STATE = 0x0004,
CLC346_MULTI_CAPTURE_DONE = 0x0008,
CLC346_LCD_UPDATE_DONE = 0x0010,
CLC346_RESERVED = 0x0020,
CLC346_WATCHDOG_FIRE = 0x0040,
CLC346_IMAGE_TRANS_DONE = 0x0080,
CLC346_IMAGE_TRANS_STATE = 0x0100,
CLC346_MOVIE_CAPTURE_DONE = 0x0200,
CLC346_MOVIE_CAPTURE_STATE = 0x0400,
CLC346_IMAGE_DECODE_DONE = 0x0800,
CLC346_IMAGE_DECODE_STATE = 0x1000,
CLC346_MOVIE_DECODE_DONE = 0x2000,
CLC346_MOVIE_DECODE_STATE = 0x4000,
CLC346_BMPSAVE_DONE = 0x8000
} CLC346_INTERRUPT_ENUM;
typedef enum
{
BMP_SHOT,
SINGLE_SHOT,
SPLIT_SHOT,
CONTINUOUS_SHOT,
TIMER_SHOT,
SPEED_CONT_SHOT,
MOVIE_SHOT,
OSD_SHOT
}CAM_PREVIEW_MODE_ENUM;
typedef enum
{
IMAGE_ROTAION_NORMAL=0,
IMAGE_ROTAION_90,
IMAGE_ROTAION_180,
IMAGE_ROTAION_270,
IMAGE_ROTAION_HFLIP,
IMAGE_ROTAION_VFLIP,
IMAGE_ROTAION_UNDEFINED
}CAM_IMAGE_ROTAION_ENUM;
typedef struct
{
UINT16 u16ZoomMin;
UINT16 u16ZoomMax;
UINT16 u16ZoomStepSize;
UINT16 u16ZoomCurStep;
} IMAGE_ZOOM_SETTING_STRUCT;
typedef struct
{
UINT16 u16Parameter;
UINT16 u16ImgEffectMode;
BOOL bGray;
BOOL bHalfColorKey;
BOOL bHalfImageVal;
UINT16 u16R_KeyValue;
UINT16 u16G_KeyValue;
UINT16 u16B_KeyValue;
} IMAGE_EFFECT_SETTING_STRUCT;
typedef enum
{
MAIN_LCD,
SUB_LCD,
MAIN_SUB
}CUR_DISP_LCD_ENUM;
typedef struct
{
CAM_IMAGE_RESOLUTION_ENUM eJPEGResolution;
CAM_IMAGE_RESOLUTION_ENUM eImageType;
CAM_PREVIEW_MODE_ENUM eCurPreviewMode;
CUR_DISP_LCD_ENUM eCurLCD;
UINT8 u8SensorBright;
UINT16 u16JPEGTargetX;
UINT16 u16JPEGTargetY;
UINT16 u16JPEGSX;
UINT16 u16JPEGSY;
UINT16 u16JPEGWX;
UINT16 u16JPEGWY;
UINT16 u16LCDWinSX;
UINT16 u16LCDWinSY;
UINT16 u16LCDWinWX;
UINT16 u16LCDWinWY;
UINT16 u16SubLCDWinSX;
UINT16 u16SubLCDWinSY;
UINT16 u16SubLCDWinWX;
UINT16 u16SubLCDWinWY;
UINT16 u16ViewTargetX;
UINT16 u16ViewTargetY;
UINT16 u16ViewSX;
UINT16 u16ViewSY;
UINT16 u16ViewWX;
UINT16 u16ViewWY;
UINT16 u16LCDHeight;
UINT16 u16LCDWidth;
UINT32 u32CurImgSize;
UINT32 u32RemainSize;
UINT16 u16ImageQuality;
BOOL bIntEnable;
CAM_OSD_OPTION_STRUCT sOSDOption;
CAM_CONTINUOUSSHOT_SETTING_STRUCT sCShotSetting;
CAM_MOVIESHOT_SETTING_STRUCT sMShotSetting;
IMAGE_ZOOM_SETTING_STRUCT sZoomSetting;
CAM_IMAGE_ROTAION_ENUM eCurRotation;
IMAGE_EFFECT_SETTING_STRUCT sImageEffect;
}CAMCTRL_PARAM_STRUCT;
static CAMCTRL_PARAM_STRUCT sCamCtrlParam;
static CAM_CTRL_STATE_ENUM eCamCtrlState = CAMCTRL_STATE_UNINITIALIZED;
static void (*pCallBackFunc)(CAMCTRL_OPERATION_EVENT_ENUM Mode, void *Param);
void CamCtrlIntHandle(void)
{
UINT16 interrupt;
uhGPIODisableInterrupt(CLC346_INT_PIN);
CamInterruptMask(0xffff);
CamWatchDogTimer(0,OFF); // disable watch dog
interrupt = CamCommandStatus();
switch(interrupt)
{
//case CLC346_LCD_FREE: //Bit[0]
// break;
case CLC346_IMAGE_CAPTURE_DONE: //Bit[1]
eCamCtrlState = CAMCTRL_STATE_CAPTURE_END;
break;
// case CLC346_IMAGE_CAPTURE_STATE: //Bit[2]
// break;
case CLC346_MULTI_CAPTURE_DONE: //Bit[3]
eCamCtrlState = CAMCTRL_STATE_CAPTURE_END;
break;
// case CLC346_LCD_UPDATE_DONE: //Bit[4]
// break;
// case CLC346_RESERVED: //Bit[5]
// break;
case CLC346_WATCHDOG_FIRE: //Bit[6]
eCamCtrlState = CAMCTRL_STATE_ERROR;
break;
// case CLC346_IMAGE_TRANS_DONE: //Bit[7]
// break;
// case CLC346_IMAGE_TRANS_STATE: //Bit[8]
// break;
case CLC346_MOVIE_CAPTURE_DONE: //Bit[9]
eCamCtrlState = CAMCTRL_STATE_CAPTURE_END;
break;
// case CLC346_MOVIE_CAPTURE_STATE: //Bit[10]
// break;
case CLC346_IMAGE_DECODE_DONE: //Bit[11]
eCamCtrlState = CAMCTRL_STATE_DECODE_END;
break;
// case CLC346_IMAGE_DECODE_STATE: //Bit[12]
// break;
case CLC346_MOVIE_DECODE_DONE: //Bit[13]
eCamCtrlState = CAMCTRL_STATE_DECODE_END;
break;
// case CLC346_MOVIE_DECODE_STATE: //Bit[14]
// break;
// case CLC346_BMPSAVE_DONE: //Bit[15]
// break;
}
if(pCallBackFunc != NULL) pCallBackFunc(CAMCTRL_EVENT_OPERATION_COMPLETE,NULL);
uhGPIOClearPendingInterrupt(CLC346_INT_PIN);
uhGPIOEnableInterrupt(CLC346_INT_PIN);
}
void InstallCamIntHandle()
{
UHERR GPIOStatus;
GPIO_HANDLE_TYPE t;
GPIO_INIT_PARAM_TYPE InitParam = {CLC346_INT_PIN , IN_MODE, NEGATIVE_POLARITY, ASYNCHRONOUS,
EDGE_TRIGGER, CamCtrlIntHandle, DEFAULT_STATE, ISR_HANDLER_CONTEXT};
GPIOStatus = uhGPIOSetConfig(&t,InitParam);
// uhGPIOEnableInterrupt(CLC346_INT_PIN); //we enable it after open
}
static void SetViewResolution(CAM_IMAGE_RESOLUTION_ENUM eResolution)
{
UINT16 u16LCDSX,u16LCDSY,u16LCD_ENDX,u16LCD_ENDY;
sCamCtrlParam.u16ViewWY =
sCamCtrlParam.u16JPEGWY;
sCamCtrlParam.u16ViewWX =
sCamCtrlParam.u16ViewWY*sCamCtrlParam.u16LCDWinWX/sCamCtrlParam.u16LCDWinWY;
sCamCtrlParam.u16ViewSX =
((SENSOR_WIDTH - sCamCtrlParam.u16ViewWX)/2)/4*4;
sCamCtrlParam.u16ViewSY =
((SENSOR_HEIGTH - sCamCtrlParam.u16ViewWY)/2)/4*4;
sCamCtrlParam.u16ViewWX =
(SENSOR_WIDTH-sCamCtrlParam.u16ViewSX*2);
sCamCtrlParam.u16ViewWY =
(SENSOR_HEIGTH-sCamCtrlParam.u16ViewSY*2);
sCamCtrlParam.u16ViewTargetX = sCamCtrlParam.u16LCDWinWX;
sCamCtrlParam.u16ViewTargetY = sCamCtrlParam.u16LCDWinWY;
SetViewWindowSize(
sCamCtrlParam.u16ViewSX, sCamCtrlParam.u16ViewSY,
sCamCtrlParam.u16ViewWX, sCamCtrlParam.u16ViewWY,
sCamCtrlParam.u16ViewTargetX, sCamCtrlParam.u16ViewTargetY);
u16LCDSX = sCamCtrlParam.u16LCDWinSX;
u16LCDSY = sCamCtrlParam.u16LCDWinSY;
u16LCD_ENDX = sCamCtrlParam.u16LCDWinSX+sCamCtrlParam.u16LCDWinWX-1;
u16LCD_ENDY = sCamCtrlParam.u16LCDWinSY+sCamCtrlParam.u16LCDWinWY-1;
MainLCDDisplayRegion(
u16LCDSX, u16LCDSY,
u16LCD_ENDX, u16LCD_ENDY);
}
static void SetSubViewResolution(CAM_IMAGE_RESOLUTION_ENUM eResolution)
{
}
static void SetJPEGResolution(CAM_IMAGE_RESOLUTION_ENUM eResolution)
{
switch(eResolution)
{
case IMAGE_RES_VGA:
#ifdef CLC346_CHINA_ONLY
sCamCtrlParam.sZoomSetting.u16ZoomMin = SENSOR_HEIGTH;
sCamCtrlParam.sZoomSetting.u16ZoomMax = SENSOR_HEIGTH;
#endif
#ifdef CLC346_COMMON
sCamCtrlParam.sZoomSetting.u16ZoomMin = SENSOR_HEIGTH/2;
sCamCtrlParam.sZoomSetting.u16ZoomMax = SENSOR_HEIGTH;
#endif
sCamCtrlParam.sZoomSetting.u16ZoomStepSize =
(sCamCtrlParam.sZoomSetting.u16ZoomMax-sCamCtrlParam.sZoomSetting.u16ZoomMin)/ZOOM_STEP;
// sCamCtrlParam.sZoomSetting.u16ZoomCurStep = ZOOM_STEP/2;
sCamCtrlParam.u16JPEGTargetX = SENSOR_WIDTH;
sCamCtrlParam.u16JPEGTargetY = SENSOR_HEIGTH;
break;
case IMAGE_RES_QVGA:
sCamCtrlParam.sZoomSetting.u16ZoomMin = SENSOR_HEIGTH/2;
sCamCtrlParam.sZoomSetting.u16ZoomMax = SENSOR_HEIGTH;
sCamCtrlParam.sZoomSetting.u16ZoomStepSize =
(sCamCtrlParam.sZoomSetting.u16ZoomMax-sCamCtrlParam.sZoomSetting.u16ZoomMin)/ZOOM_STEP;
// sCamCtrlParam.sZoomSetting.u16ZoomCurStep = ZOOM_STEP/2;
sCamCtrlParam.u16JPEGTargetX = SENSOR_WIDTH/2;
sCamCtrlParam.u16JPEGTargetY = SENSOR_HEIGTH/2;
break;
case IMAGE_RES_QQVGA:
sCamCtrlParam.sZoomSetting.u16ZoomMin = SENSOR_HEIGTH/4;
sCamCtrlParam.sZoomSetting.u16ZoomMax = SENSOR_HEIGTH;
sCamCtrlParam.sZoomSetting.u16ZoomStepSize =
(sCamCtrlParam.sZoomSetting.u16ZoomMax-sCamCtrlParam.sZoomSetting.u16ZoomMin)/ZOOM_STEP;
// sCamCtrlParam.sZoomSetting.u16ZoomCurStep = ZOOM_STEP/2;
sCamCtrlParam.u16JPEGTargetX = SENSOR_WIDTH/4;
sCamCtrlParam.u16JPEGTargetY = SENSOR_HEIGTH/4;
break;
case IMAGE_RES_MOVIE:
case IMAGE_RES_OSD:
case IMAGE_RES_CLDC:
sCamCtrlParam.sZoomSetting.u16ZoomMin = sCamCtrlParam.u16LCDWinWY;
sCamCtrlParam.sZoomSetting.u16ZoomMax = SENSOR_HEIGTH;
sCamCtrlParam.sZoomSetting.u16ZoomStepSize =
(sCamCtrlParam.sZoomSetting.u16ZoomMax-sCamCtrlParam.sZoomSetting.u16ZoomMin)/ZOOM_STEP;
// sCamCtrlParam.sZoomSetting.u16ZoomCurStep = ZOOM_STEP/2;
sCamCtrlParam.u16JPEGTargetX = sCamCtrlParam.u16LCDWinWX;
sCamCtrlParam.u16JPEGTargetY = sCamCtrlParam.u16LCDWinWY;
break;
default: return;
}
sCamCtrlParam.u16JPEGWY =
(sCamCtrlParam.sZoomSetting.u16ZoomMax-sCamCtrlParam.sZoomSetting.u16ZoomStepSize*sCamCtrlParam.sZoomSetting.u16ZoomCurStep);
sCamCtrlParam.u16JPEGWX =
sCamCtrlParam.u16JPEGWY*SENSOR_WIDTH/SENSOR_HEIGTH;
sCamCtrlParam.u16JPEGSX =
((SENSOR_WIDTH - sCamCtrlParam.u16JPEGWX)/2)/4*4;
sCamCtrlParam.u16JPEGSY =
((SENSOR_HEIGTH - sCamCtrlParam.u16JPEGWY)/2)/4*4;
sCamCtrlParam.u16JPEGWX =
(SENSOR_WIDTH-sCamCtrlParam.u16JPEGSX*2);
sCamCtrlParam.u16JPEGWY =
(SENSOR_HEIGTH-sCamCtrlParam.u16JPEGSY*2);
SetJPEGWindowSize(
sCamCtrlParam.u16JPEGSX, sCamCtrlParam.u16JPEGSY,
sCamCtrlParam.u16JPEGWX, sCamCtrlParam.u16JPEGWY,
sCamCtrlParam.u16JPEGTargetX, sCamCtrlParam.u16JPEGTargetY);
}
static void OnPreView(CAM_IMAGE_RESOLUTION_ENUM eResolution)
{
CamPreview_Off();
CamFrameSamplingInterval(sCamCtrlParam.sCShotSetting.eImageSamplingRate,FALSE);
SetJPEGResolution(eResolution);
if(sCamCtrlParam.eCurLCD == MAIN_LCD )
SetViewResolution(eResolution);
else
SetSubViewResolution(eResolution);
CamPreview_On();
}
void WaitTime_us(UINT32 time)
{
UINT32 i;
for(i=0;i<time;i++);
}
static void SetNormalMode()
{
uhGPIOWrite (CLC346_MODE_CONTROL, LOW_STATE);
}
static void SetBypassMode()
{
uhGPIOWrite (CLC346_MODE_CONTROL, HIGH_STATE);
}
/*mSecond at 19.68MHz*/
static BOOL WaitCamOperationDone(UINT16 u16CamFunction, UINT16 u16time, UINT16 u16IntFlag,BOOL bIntWanted)
{
UINT16 u16Status;
BOOL ret;
if((sCamCtrlParam.bIntEnable == TRUE) && ( bIntWanted == FALSE))
uhGPIODisableInterrupt(CLC346_INT_PIN);
CamWatchDogTimer(u16time,ON);
CamInterruptMask(~(u16IntFlag | CLC346_WATCHDOG_FIRE));
if(u16CamFunction==BMP_SHOT) DoCameraOperation(0x03); // WHY BMP is special ?
else if(u16CamFunction) DoCameraOperation(u16CamFunction&0x0fff); // WHY and ?
if(( bIntWanted == TRUE)&&(sCamCtrlParam.bIntEnable == TRUE)) // if we want to used interrupt and int is enabled
return TRUE;
u16Status = 0;
while(u16Status==0)
{
u16Status =CamCommandStatus();
if(u16Status & CLC346_WATCHDOG_FIRE ) // timer out?
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -