📄 camapi.c
字号:
switch(sCamCtrlParam.eCurPreviewMode)
{
case SINGLE_SHOT:
u16IntFlag = CLC346_IMAGE_CAPTURE_DONE;u16WaitTime= 5000; // 1s?
u16CamFunction= CLC346_STILL_CAPTURE;
break;
case OSD_SHOT:
u16IntFlag = CLC346_IMAGE_CAPTURE_DONE;u16WaitTime= 5000; // 1s?
u16CamFunction= CLC346_OSD_CAPTURE;
break;
case CONTINUOUS_SHOT:
CamMultiShotImageCount(sCamCtrlParam.sCShotSetting.eCaptureCounts );
CamFrameSamplingInterval(sCamCtrlParam.sCShotSetting.eImageSamplingRate,TRUE);
CamOSDMode(0, 0,0);
u16IntFlag = CLC346_IMAGE_CAPTURE_DONE|CLC346_MULTI_CAPTURE_DONE; u16WaitTime = 0xffff;
u16CamFunction= CLC346_CONTINUOUS_CAPTURE;
break;
case MOVIE_SHOT:
CamStopMovieCapture(FALSE);
CamFrameSamplingInterval(sCamCtrlParam.sMShotSetting.eImageSamplingRate, TRUE);
CamOSDMode(0,0,0);
u16IntFlag = CLC346_MOVIE_CAPTURE_DONE; u16WaitTime = 0xffff;
u16CamFunction= CLC346_MOVIE_CAPTURE;
break;
default: return CAM_CTRL_OPERATION_FAILED;
}
eCamCtrlState =CAMCTRL_STATE_ON_CAPTURE;
CamWatchDogTimer(u16WaitTime,ON);
CamInterruptMask(~(u16IntFlag | CLC346_WATCHDOG_FIRE));
if(u16CamFunction==BMP_SHOT) DoCameraOperation(0x03);
else if(u16CamFunction) DoCameraOperation(u16CamFunction&0x0fff);
return CAM_CTRL_ERR_NONE;
}
CAM_CTRL_ERR_ENUM CamCtrl_StopMovieCapture()
{
if((eCamCtrlState == CAMCTRL_STATE_ON_CAPTURE)
&&(sCamCtrlParam.eCurPreviewMode == MOVIE_SHOT))
{
CamStopMovieCapture(TRUE);
return CAM_CTRL_ERR_NONE;
}
return CAM_CTRL_INVALID_STATE;
}
CAM_CTRL_ERR_ENUM CamCtrl_GetCaptureImgInfo(CAM_IMAGE_INFO_STRUCT *psImageInfo,UINT8 u8ImageNum)
{
UINT16 u16Low,u16High;
if(eCamCtrlState != CAMCTRL_STATE_CAPTURE_END)
return CAM_CTRL_INVALID_STATE;
if(u8ImageNum>=sCamCtrlParam.sCShotSetting.eCaptureCounts)
return CAM_CTRL_INVALID_PARAMS;
if(sCamCtrlParam.eCurPreviewMode ==CONTINUOUS_SHOT)
{
CamSetStillImageNumber(u8ImageNum+1);
WaitTime_us(10);
}
u16High = CamJpegFileSizeUpper();
u16Low = CamJpegFileSizeLower();
sCamCtrlParam.u32CurImgSize = ((UINT32)u16High <<16|u16Low)*4;
sCamCtrlParam.u32RemainSize =sCamCtrlParam.u32CurImgSize;
psImageInfo->u16ImageHeight = sCamCtrlParam.u16JPEGTargetY;
psImageInfo->u16ImageWidth = sCamCtrlParam.u16JPEGTargetX;
psImageInfo->u32ImageSize = sCamCtrlParam.u32CurImgSize;
return CAM_CTRL_ERR_NONE;
}
CAM_CTRL_ERR_ENUM CamCtrl_UpLoadImage(UINT16 *pDataBuf , UINT32 u32InBufLen,UINT32 *pu32OutBytes)
{
UINT32 u32Offset,u32ReadSize;
*pu32OutBytes =0;
if(eCamCtrlState != CAMCTRL_STATE_CAPTURE_END)
return CAM_CTRL_INVALID_STATE;
if(pDataBuf ==NULL)
return CAM_CTRL_INVALID_PARAMS;
if(sCamCtrlParam.u32RemainSize<=0)
return CAM_CTRL_OPERATION_FAILED;
u32Offset =(sCamCtrlParam.u32CurImgSize-sCamCtrlParam.u32RemainSize)/2;
CamUpperSRAMStartAddress((u32Offset>>16)&0xffff);
CamLowerSRAMStartAddress(u32Offset&0xffff);
if(sCamCtrlParam.eCurPreviewMode ==MOVIE_SHOT)
CamMovieSave();
else
CamStillImageSave();
if(sCamCtrlParam.u32RemainSize<=u32InBufLen)
u32ReadSize= sCamCtrlParam.u32RemainSize;
else
u32ReadSize= u32InBufLen;
CamReadSram(pDataBuf,u32ReadSize);
*pu32OutBytes= u32ReadSize;
sCamCtrlParam.u32RemainSize =sCamCtrlParam.u32RemainSize -u32ReadSize;
CamPreview_Off();
return CAM_CTRL_ERR_NONE;
}
static BOOL CheckJpegWidthHeight(UINT16 *pBuf, UINT32 len ,UINT16* Height, UINT16* Width )
{
UINT32 i;
if (pBuf[0]!=0xd8ff)
return FALSE;
i=0;
do
{
if (pBuf[i]==0xc0ff)
{
*Width = ((pBuf[i+3]&0xff00))+((pBuf[i+4]&0xff));
*Height = ((pBuf[i+2]&0xff00))+((pBuf[i+3]&0xff));
return TRUE;
}
else
i++;
}while (i<len);
return FALSE;
}
CAM_CTRL_ERR_ENUM CamCtrl_DownLoadImage(UINT16 *pu16DataBuf,UINT32 u32Len,UINT32 u32Offset,BOOL bIsMovie)
{
if((eCamCtrlState == CAMCTRL_STATE_UNINITIALIZED)
||(eCamCtrlState == CAMCTRL_STATE_INITIALIZED)
||(eCamCtrlState == CAMCTRL_STATE_ON_DECODE))
return CAM_CTRL_INVALID_STATE;
CamUpperSRAMStartAddress(((u32Offset/2)>>16)&0xffff);
CamLowerSRAMStartAddress((u32Offset/2)&0xffff);
if(bIsMovie == TRUE)
CamCaptureMovieDisplay();
else
CamStillImageDownload();
CamWriteSram(pu16DataBuf,u32Len);
CamPreview_Off();
return CAM_CTRL_ERR_NONE;
}
CAM_CTRL_ERR_ENUM CamCtrl_DisplayPhoto(IMAGE_VIEWBOX_STRUCT sViewWindow,IMAGE_VIEWBOX_STRUCT sLCDWindow)
{
if((eCamCtrlState == CAMCTRL_STATE_UNINITIALIZED)
||(eCamCtrlState == CAMCTRL_STATE_INITIALIZED)
||(eCamCtrlState == CAMCTRL_STATE_ON_DECODE))
return CAM_CTRL_INVALID_STATE;
CamOSDMode(0, 0, 0);
CamUpperSRAMStartAddress(0x0000);
CamLowerSRAMStartAddress(0x0000);
MainLCDDisplayRegion(sLCDWindow.u16Startx,
sLCDWindow.u16Starty,
sLCDWindow.u16Startx+ sLCDWindow.u16Width-1 ,
sLCDWindow.u16Starty+sLCDWindow.u16Height-1);
SetViewWindowSize(sViewWindow.u16Startx,
sViewWindow.u16Starty,
sViewWindow.u16Width,
sViewWindow.u16Height,
sLCDWindow.u16Width ,
sLCDWindow.u16Height);
eCamCtrlState =CAMCTRL_STATE_ON_DECODE;
CamWatchDogTimer(0x4000,ON);
CamInterruptMask(~(CLC346_IMAGE_DECODE_DONE | CLC346_WATCHDOG_FIRE));
DoCameraOperation(CLC346_DO_STILL_DECODE);
return CAM_CTRL_ERR_NONE;
}
CAM_CTRL_ERR_ENUM CamCtrl_StartMoviePlay2(IMAGE_VIEWBOX_STRUCT sViewWindow,IMAGE_VIEWBOX_STRUCT sLCDWindow)
{
if((eCamCtrlState == CAMCTRL_STATE_UNINITIALIZED)
||(eCamCtrlState == CAMCTRL_STATE_INITIALIZED)
||(eCamCtrlState == CAMCTRL_STATE_ON_CAPTURE)
||(eCamCtrlState == CAMCTRL_STATE_ON_DECODE))
return CAM_CTRL_INVALID_STATE;
CamUpperSRAMStartAddress(0x0000);
CamLowerSRAMStartAddress(0x0000);
CamPreview_Off();
MainLCDDisplayRegion(sLCDWindow.u16Startx,
sLCDWindow.u16Starty,
sLCDWindow.u16Startx+ sLCDWindow.u16Width-1 ,
sLCDWindow.u16Starty+sLCDWindow.u16Height-1);
SetViewWindowSize(sViewWindow.u16Startx,
sViewWindow.u16Starty,
sViewWindow.u16Width,
sViewWindow.u16Height,
sLCDWindow.u16Width,
sLCDWindow.u16Height);
CamMovieReplayInterval(0x80f);
eCamCtrlState =CAMCTRL_STATE_ON_DECODE;
CamWatchDogTimer(0xffff,ON);
CamInterruptMask(~(CLC346_MOVIE_DECODE_DONE | CLC346_WATCHDOG_FIRE));
DoCameraOperation(CLC346_DO_MOVIE_DECODE);
return CAM_CTRL_OPERATION_FAILED;
}
CAM_CTRL_ERR_ENUM CamCtrl_StartMoviePlay()
{
UINT16 lcdsx,lcdsy,lcdwidth,lcdheight;
if((eCamCtrlState != CAMCTRL_STATE_CAPTURE_END)
&& (eCamCtrlState != CAMCTRL_STATE_DECODE_END)
)
return CAM_CTRL_INVALID_STATE;
CamUpperSRAMStartAddress(0x0000);
CamLowerSRAMStartAddress(0x0000);
CamPreview_Off();
if((sCamCtrlParam.u16JPEGTargetX<=sCamCtrlParam.u16LCDWinWX)
&&( sCamCtrlParam.u16JPEGTargetY<= sCamCtrlParam.u16LCDWinWY))
{
lcdsx = sCamCtrlParam.u16LCDWinSX + (sCamCtrlParam.u16LCDWinWX-sCamCtrlParam.u16JPEGTargetX)/2 ;
lcdsy = sCamCtrlParam.u16LCDWinSY + (sCamCtrlParam.u16LCDWinWY-sCamCtrlParam.u16JPEGTargetY)/2 ;
lcdwidth = sCamCtrlParam.u16JPEGTargetX;
lcdheight = sCamCtrlParam.u16JPEGTargetY;
}
else
{
lcdsx = sCamCtrlParam.u16LCDWinSX;
lcdsy = sCamCtrlParam.u16LCDWinSY;
lcdwidth = sCamCtrlParam.u16LCDWinWX;
lcdheight =sCamCtrlParam.u16LCDWinWY;
}
MainLCDDisplayRegion(lcdsx ,
lcdsy,
lcdsx+lcdwidth-1,
lcdsy+lcdheight-1);
SetViewWindowSize(0,0,sCamCtrlParam.u16JPEGTargetX,
sCamCtrlParam.u16JPEGTargetY,lcdwidth,lcdheight);
CamMovieReplayInterval(0x80f);
eCamCtrlState =CAMCTRL_STATE_ON_DECODE;
CamWatchDogTimer(0xffff,ON);
CamInterruptMask(~(CLC346_MOVIE_DECODE_DONE | CLC346_WATCHDOG_FIRE));
DoCameraOperation(CLC346_DO_MOVIE_DECODE);
return CAM_CTRL_OPERATION_FAILED;
}
CAM_CTRL_ERR_ENUM CamCtrl_StopMoviePlay()
{
if((eCamCtrlState == CAMCTRL_STATE_UNINITIALIZED)
||(eCamCtrlState == CAMCTRL_STATE_INITIALIZED))
return CAM_CTRL_INVALID_STATE;
CamPreview_Off();
eCamCtrlState = CAMCTRL_STATE_DECODE_END;
return CAM_CTRL_ERR_NONE;
}
CAM_CTRL_ERR_ENUM CamCtrl_UpDateLCDRectangle(UINT16 u16Startx, UINT16 u16Starty,UINT16 u16Endx, UINT16 u16Endy, UINT16*pData)
{
UINT16 u16AddrLow,u16AddrHigh,u16StartxN,u16StartyN,u16WY,u16WX,i;
UINT32 u32OSDAddr,u32StartAddr;
UINT16 *pBuf;
if((eCamCtrlState == CAMCTRL_STATE_UNINITIALIZED)
||(eCamCtrlState == CAMCTRL_STATE_INITIALIZED)
||(eCamCtrlState == CAMCTRL_STATE_ON_CAPTURE)
||(eCamCtrlState == CAMCTRL_STATE_ON_DECODE))
return CAM_CTRL_INVALID_STATE;
if(eCamCtrlState !=CAMCTRL_STATE_ON_PREVIEW)
{
CamLCDLockAddress(TRUE);
CamLCDUpdateRectangle(u16Startx,u16Starty,u16Endx,u16Endy, pData, sCamCtrlParam.u16LCDWidth);
CamLCDLockAddress(FALSE);
}
else // in preview mode ,do not allow update across the client window and non client window at same time
{
if( (u16Startx>=sCamCtrlParam.u16LCDWinSX)
&&(u16Starty>=sCamCtrlParam.u16LCDWinSY)
&&(u16Endx<= sCamCtrlParam.u16LCDWinSX+ sCamCtrlParam.u16LCDWinWX-1)
&&(u16Endy<= sCamCtrlParam.u16LCDWinSY+ sCamCtrlParam.u16LCDWinWY-1)
) // update the client area when preview
{
u16StartxN = u16Startx- sCamCtrlParam.u16LCDWinSX;
u16StartyN = u16Starty- sCamCtrlParam.u16LCDWinSY;
u16WY = u16Endy - u16Starty +1;
u16WX = u16Endx - u16Startx +1;
CamPreview_Off();
u16AddrLow = CamGetLowerOSDAddress();
u16AddrHigh = CamGetUpperOSDAddress();
u32OSDAddr = (u16AddrHigh<<16)| u16AddrLow ;
u32StartAddr = u32OSDAddr + u16StartyN *sCamCtrlParam.u16LCDWinWX + u16StartxN ;
pBuf = pData+ u16Starty*sCamCtrlParam.u16LCDWidth+u16Startx ;
for(i=0;i< u16WY;i++)
{
CamStillImageDownload();
CamLowerSRAMStartAddress(u32StartAddr&0xffff);
CamUpperSRAMStartAddress((u32StartAddr>>16)&0xffff);
CamWriteSram(pBuf,u16WX*2);
u32StartAddr+= sCamCtrlParam.u16LCDWinWX ; // updata to next line , same x pos
pBuf+= sCamCtrlParam.u16LCDWidth; //updata data buf
CamPreview_Off();
}
// CamChromaKey(sCamCtrlParam.sOSDOption.u16ChromaKeyValue);
// CamOSDMode(sCamCtrlParam.sOSDOption.eOSDMode, sCamCtrlParam.sOSDOption.eOSDParameter,0);
CamUpperSRAMStartAddress(0);
CamLowerSRAMStartAddress(0);
// WaitTime_us(1000);
CamPreview_On();
}
else // update the non client area when update
{
CamLCDControlFlag(1,0);
if(!WaitCamOperationDone(0, 1000, CLC346_LCD_FREE,FALSE))
{
CamLCDControlFlag(0,0);
CamPreview_On();
return CAM_CTRL_OPERATION_FAILED;
}
CamLCDLockAddress(TRUE);
CamLCDUpdateRectangle(u16Startx,u16Starty,u16Endx,u16Endy, pData, sCamCtrlParam.u16LCDWidth);
CamLCDControlFlag(0,0);
CamPreview_On();
CamLCDLockAddress(FALSE);
}
}
return CAM_CTRL_ERR_NONE;
}
CAM_CTRL_ERR_ENUM CamCtrl_StopCurOperation()
{
if((eCamCtrlState == CAMCTRL_STATE_UNINITIALIZED)
||(eCamCtrlState == CAMCTRL_STATE_INITIALIZED))
return CAM_CTRL_INVALID_STATE;
CamPreview_Off();
if(eCamCtrlState == CAMCTRL_STATE_ON_PREVIEW)
eCamCtrlState =CAMCTRL_STATE_OFF_PREVIEW;
else if(eCamCtrlState == CAMCTRL_STATE_ON_CAPTURE)
eCamCtrlState =CAMCTRL_STATE_CAPTURE_END;
else if (eCamCtrlState == CAMCTRL_STATE_ON_DECODE)
eCamCtrlState =CAMCTRL_STATE_DECODE_END;
return CAM_CTRL_ERR_NONE;
}
CAM_CTRL_ERR_ENUM CamCtrl_QueryStates(CAM_CTRL_STATE_ENUM *pState)
{
UINT16 event;
if((eCamCtrlState == CAMCTRL_STATE_UNINITIALIZED)
||(eCamCtrlState == CAMCTRL_STATE_INITIALIZED))
return CAM_CTRL_INVALID_STATE;
if(sCamCtrlParam.bIntEnable == FALSE)
{
event = CamCommandStatus();
if(event != 0)
{
CamInterruptMask(0xffff);
CamWatchDogTimer(0,OFF); // disable watch dog
if(event & CLC346_WATCHDOG_FIRE)
eCamCtrlState = CAMCTRL_STATE_ERROR;
if(event & CLC346_IMAGE_CAPTURE_DONE)
eCamCtrlState = CAMCTRL_STATE_CAPTURE_END;
else if(event & CLC346_MULTI_CAPTURE_DONE)
eCamCtrlState = CAMCTRL_STATE_CAPTURE_END;
else if(event & CLC346_MOVIE_CAPTURE_DONE)
eCamCtrlState = CAMCTRL_STATE_CAPTURE_END;
else if (event & CLC346_IMAGE_DECODE_DONE)
eCamCtrlState = CAMCTRL_STATE_DECODE_END;
else if (event & CLC346_MOVIE_DECODE_DONE)
eCamCtrlState = CAMCTRL_STATE_DECODE_END;
else
eCamCtrlState = CAMCTRL_STATE_ERROR;
CamCommandStatus();
}
}
*pState = eCamCtrlState;
return CAM_CTRL_ERR_NONE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -